議案・賛否データ

対象: 衆議院 / 参議院(記名投票)

👀 ざっくり言うと

国会に提出される法案・予算案などの議案と、その採決結果を公式サイトから自動収集しています。 参議院の記名投票については議員個人ごとの賛否を記録し、衆議院および会派単位の賛否も記録します。 同じ会派の多数派から逸脱した「造反投票」も自動で検出されます。

🔄 データの流れ

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.pyGitHub公開のgian.jsonから議案名・提出者・採決日などのメタデータを取り込み
投票結果のDB投入scripts/import_sangiin_votes_to_db.py案件名でProposalを検索して紐付け、Bronze層のextracted_proposal_judgesに投入
会派賛否の集計と造反検出scripts/match_proposal_group_judges.pyBronze層の個人賛否を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_judgesBronze層。スクレイピング直後の個人賛否(追記専用)
proposal_judgesGold層。議員個人の賛否(記名投票のみ)
proposal_parliamentary_group_judges会派単位の賛否(多数派判定結果)

dbtモデル(Data Vault層)

モデル役割
hub_proposalProposal のハブ
sat_proposalProposal の属性サテライト
link_proposal_judge議案 ↔ 政治家賛否 のリンク
sat_proposal_judge個人賛否の属性サテライト
link_proposal_submitter議案 ↔ 提出者 のリンク
sat_proposal_submitter提出者の属性サテライト

BigQuery公開テーブル

テーブルデータセット
proposalssagebase
proposal_submitterssagebase
proposal_deliberationssagebase
proposal_judgessagebase
proposal_parliamentary_group_judgessagebase