議案・賛否データ
対象: 衆議院 / 参議院(記名投票)
👀 ざっくり言うと
国会に提出される法案・予算案などの議案と、その採決結果を公式サイトから自動収集しています。 参議院の記名投票については議員個人ごとの賛否を記録し、衆議院および会派単位の賛否も記録します。 同じ会派の多数派から逸脱した「造反投票」も自動で検出されます。
🔄 データの流れ
graph TD
A["参議院公式サイト
記名投票ページ"]:::source
B["SmartNews SMRI
議案データセット(gian.json)"]:::source
M["管理画面からの手動入力
Streamlit 議案管理"]:::source
P1["投票リンク収集
回次ごとに記名投票一覧ページを取得"]:::process
P2["投票結果パース
議員別の賛否をHTMLから抽出しJSON保存"]:::process
P3["議案メタデータ取り込み
議案名・提出者・採決日をDBに投入"]:::process
P4["議案マッチング
投票結果の案件名でProposalを特定"]:::process
P5["個人賛否投入
Bronze層に追記"]:::process
P6["Gold層への確定
政治家IDに紐付けて確定値を反映"]:::process
P7["会派賛否集計
個人賛否から会派多数派を判定・造反を検出"]:::process
P8["議案の手動登録・編集
議案作成・賛否確定・提出者マッチング"]:::process
T_PROP["proposals
テーブル(議案)"]:::table
T_SUB["proposal_submitters
テーブル(議案提出者)"]:::table
T_DEL["proposal_deliberations
テーブル(議案審議)"]:::table
T_EXT["extracted_proposal_judges
テーブル(抽出議案賛否 / Bronze層)"]:::table
T_PJ["proposal_judges
テーブル(議案賛否)"]:::table
T_PGJ["proposal_parliamentary_group_judges
テーブル(会派議案賛否)"]:::table
V["dbt Data Vault層
hub / sat / link モデル"]:::process
H["BigQuery公開
sagebase スキーマ"]:::public
A --> P1
P1 --> P2
B --> P3
P3 --> T_PROP
P3 --> T_SUB
P3 --> T_DEL
P2 --> P4
P3 --> P4
P4 --> P5
P5 --> T_EXT
P5 --> P6
P6 --> T_PJ
P6 --> P7
P7 --> T_PGJ
M --> P8
P8 --> T_PROP
P8 --> T_SUB
P8 --> T_PJ
P8 --> T_PGJ
T_PROP --> V
T_SUB --> V
T_DEL --> V
T_EXT --> V
T_PJ --> V
T_PGJ --> V
V --> H
classDef source fill:#ffffff,stroke:#1a1a1a,stroke-width:2.5px,color:#1a1a1a
classDef process fill:#ffffff,stroke:#737373,stroke-width:1px,color:#1a1a1a
classDef table fill:#ffffff,stroke:#1a1a1a,stroke-width:1.5px,stroke-dasharray: 6 3,color:#1a1a1a
classDef public fill:#1a1a1a,stroke:#1a1a1a,stroke-width:2.5px,color:#ffffff
元データ
加工
DB
公開
📂 技術的な詳細(開発者向け)
スクレイパー・インポーター
| データソース | スクリプト | 主要ロジック |
|---|---|---|
| 参議院公式(記名投票) https://www.sangiin.go.jp/ | scripts/scrape_sangiin_votes.py | 回次142〜221の記名投票一覧ページから投票リンクを取得し、各ページをパースして議員別賛否をJSON保存 |
| SmartNews SMRI(議案データ) https://github.com/smartnews-smri/house-of-councillors | scripts/import_sangiin_gian.py | GitHub公開のgian.jsonから議案名・提出者・採決日などのメタデータを取り込み |
| 投票結果のDB投入 | scripts/import_sangiin_votes_to_db.py | 案件名でProposalを検索して紐付け、Bronze層のextracted_proposal_judgesに投入 |
| 会派賛否の集計と造反検出 | scripts/match_proposal_group_judges.py | Bronze層の個人賛否をparliamentary_groupsと突合し、多数派を会派賛否として登録。多数派と異なる個人投票にis_defectionを立てる |
| 管理画面からの手動入力(Streamlit) | src/interfaces/web/streamlit/views/proposals/tabs/{proposal_new_form, proposal_edit_form, final_judges_tab, roll_call_override_tab, submitter_matching_tab}.py | 議案の新規登録・編集、Bronze層からGold層への個人賛否の最終確定、記名投票結果のオーバーライド、提出者の手動マッチングを提供 |
DBテーブル(PostgreSQL)
| テーブル | 説明 |
|---|---|
proposals | 議案の基本情報(議案名・大分類・小分類・採決日) |
proposal_submitters | 議案の提出者(政治家・会派・内閣) |
proposal_deliberations | 議案の審議履歴 |
extracted_proposal_judges | Bronze層。スクレイピング直後の個人賛否(追記専用) |
proposal_judges | Gold層。議員個人の賛否(記名投票のみ) |
proposal_parliamentary_group_judges | 会派単位の賛否(多数派判定結果) |
dbtモデル(Data Vault層)
| モデル | 役割 |
|---|---|
hub_proposal | Proposal のハブ |
sat_proposal | Proposal の属性サテライト |
link_proposal_judge | 議案 ↔ 政治家賛否 のリンク |
sat_proposal_judge | 個人賛否の属性サテライト |
link_proposal_submitter | 議案 ↔ 提出者 のリンク |
sat_proposal_submitter | 提出者の属性サテライト |
BigQuery公開テーブル
| テーブル | データセット |
|---|---|
proposals | sagebase |
proposal_submitters | sagebase |
proposal_deliberations | sagebase |
proposal_judges | sagebase |
proposal_parliamentary_group_judges | sagebase |