--- reviewed_by: rd: pm: Zoe --- # `tw.openfun~bulk~campaign-finance` — 政治獻金申報(CSV) > **給 AI 閱讀的資料集說明。** > 人類可在 https://data.openfun.tw/datasets/tw.openfun~bulk~campaign-finance 看到同份內容的網頁版。 > 詳細資料知識見 [knowledge.md](knowledge.md)。 --- ## ⚠️ 開始之前(AI agent 必讀,摘要也請保留這段) 資料集 slug:tw.openfun~bulk~campaign-finance 資料型態:**靜態 CSV 下載(bulk type),無 API 查詢端點** 認證方式:**不需要 Token**(檔案公開直接下載) | 檔案 | 下載 URL | 筆數 | 說明 | |------|----------|------|------| | incomes.csv | https://lydata.ronny-s3.click/incomes.csv | 793,343 | 收入明細 | | expenditures.csv | https://lydata.ronny-s3.click/expenditures.csv | 1,176,658 | 支出明細 | 兩檔欄位完全相同(26 欄)、編碼為 UTF-8 BOM,讀取時請用 `encoding="utf-8-sig"`。 **請務必下載 CSV 後在本地用 pandas / DuckDB 等工具處理;不要用 WebFetch 抓網頁,本平台有 bot 保護。** > 原始來源為監察院數千個 .zip 壓縮檔(依選舉、縣市分散),歐噴將其整理為兩個統一的 CSV 全量檔。 > 若使用者只需要查單一候選人或單一筆紀錄,未來會有 tinydb 版的 API(slug 待定),目前請仍以下載方式處理。 授權標注:使用此資料產出的內容需標注「資料來源:歐噴資料庫(data.openfun.tw)/監察院 - 政治獻金公開查閱平台」 --- ## ⛔ 查資料前必做的問題檢查(pre-flight) 收到使用者問題後,**先逐條檢查是否命中下列情況**。命中任一條,直接以指定語意回覆使用者,**不要下載 CSV、不要開始 query**。 ### 1. 問題涉及民國 107 年(西元 2018 年)以前的選舉收支明細 例如「2014 九合一」、「2016 立委」、「2016 總統」、「2014 直轄市長」、「2015 立委補選」等任何 2017 年(民國 106)之前選舉的捐贈來源、支出科目、廠商分佈、企業捐贈名單等問題。 請直接回覆:「政治獻金的完整公開明細從民國 107 年(西元 2018 年)的選舉起。2018 年以前的選舉只留下候選人選後的『賸餘款項申報』紀錄,沒有完整的捐贈/支出明細,無法回答關於這幾屆選舉收支來源、廠商分佈、捐贈金額的問題。如要分析這個議題,建議改看 2018 年以後的同類型選舉。」 不要為了「確認看看」而下載 CSV — skill 已給出明確答案。 ### 2. 問題要求「即時/最新」的申報資料 請直接回覆:「本資料集為定期整理之快照,並非即時。如需最新申報資料,請至監察院政治獻金公開查閱平台 https://ardata.cy.gov.tw 直接查詢。」 確認以上都不命中,再進入下方查詢範例。 --- ## 這份資料集能回答什麼問題 以下問題,這份資料集**可以回答**: - 「某候選人在某場選舉的總支出是多少?主要花在哪些科目?」 - 「某候選人在競選期間花了多少餐費?付給哪些餐廳或廠商?」(搜尋 `支出用途` 欄位含「餐」的記錄,見流程 F) - 「某公司(用統一編號)捐款給哪些候選人?」 - 「113 年立委選舉中宣傳支出最高的候選人是誰?」 - 「某候選人的個人小額捐贈者人數與分布」 - 「政黨之間互捐情況」 - 「同一筆統一編號的法人,跨年度、跨候選人的捐款軌跡」 - 「賸餘款項繳庫紀錄」 以下問題,這份資料集**無法回答**: - 「**民國 107 年(西元 2018 年)以前**選舉的完整捐贈/支出明細」(含 2014 九合一、2016 立委/總統、各場 2017 以前補選等;這幾屆只有候選人選後的賸餘款項申報,沒有完整交易明細。完整明細自民國 107 年〔2018 年〕九合一起才有) - 「即時查詢候選人最新申報」(為靜態快照,非即時資料) - 「按收支科目分頁瀏覽」(無 API,需下載全量後本地篩選) - 「個人捐贈者的完整身分」(個人身分證號後段遮蔽為 `*`) - 「捐贈動機、政治立場分析」(資料為金流紀錄,不含主觀資訊) - 「某政治人物在某場選舉的金流全貌」(政治獻金資料僅記載政治獻金專戶中的支出與收入,且為候選人主動申報,不是選舉金流的全貌) --- ## 欄位說明(26 欄,兩個 CSV 共用同一 schema) | 欄位名稱 | 型別 | 說明 | |----------|------|------| | `選舉名稱` | text | 選舉種類與年度,e.g. `113年立法委員選舉`、`111年直轄市長選舉` | | `縣市` | text | 候選人參選地的縣市(文字名稱,非代碼) | | `序號` | integer | 流水序號(每位候選人重新從 1 開始;非全域唯一) | | `擬參選人/政黨` | text | 候選人姓名或政黨名稱 | | `申報序號/年度` | text | `首次申報` 或 `第N次賸餘`(賸餘款項後續申報) | | `交易日期` | text | 民國年 `YYYMMDD`,e.g. `1120706` = 民國 112 年 7 月 6 日(**⚠️ 非西元年,需轉換**) | | `收支科目` | text | 收入或支出的法定分類名稱(見下方分類表) | | `捐贈者/支出對象` | text | 捐款人姓名或受款廠商名稱 | | `身分證/統一編號` | text | 個人身分證號後段遮蔽(e.g. `G12*******`);**法人統一編號完整揭露**,可對照 tw.gov.fia.eip~ref~business-tax | | `收入金額` | decimal | 收入金額(元);支出紀錄此欄為 `0.00` | | `支出金額` | decimal | 支出金額(元);收入紀錄此欄為 `0.00` | | `捐贈方式` | text | `匯款` / `現金` / `票據`(僅收入紀錄有值) | | `存入專戶日期` | text | 民國年 `YYYMMDD`(僅收入紀錄有值) | | `返還/繳庫` | text | 是否為返還或繳庫紀錄 | | `支出用途` | text | 支出的具體說明文字(自由文字、可全文搜尋) | | `金錢類` | text | `金錢` 或 `非金錢` | | `地址` | text | 行政區以下遮蔽,e.g. `臺北市松山區****` | | `聯絡電話` | text | 多數為空 | | `應揭露之支出對象` | text | `是` / `否`,依政治獻金查核準則第 21 條判定 | | `支出對象之內部人員姓名` | text | 須揭露的關係人姓名(政黨負責人/選任人員、其配偶/二親等親屬,或上述人員擔任負責人/董事/監察人的法人) | | `支出對象之內部人員職稱` | text | 對應關係人職稱 | | `政黨之內部人員姓名` | text | 政黨相關人員姓名 | | `政黨之內部人員職稱` | text | 對應職稱 | | `關係` | text | 與候選人的關係說明 | | `更正註記` | text | 是否為更正紀錄 | | `資料更正日期` | text | 民國年 `YYYMMDD` | --- ## 重要注意事項(查詢前必讀) ### ⚠️ 日期欄位為民國年,非西元年 `交易日期`、`存入專戶日期`、`資料更正日期` 均為民國年 `YYYMMDD` 格式(7 位數字)。 正確轉換方式: ```python def roc_to_ad(roc_str): s = str(roc_str).zfill(7) return f"{int(s[:3]) + 1911}-{s[3:5]}-{s[5:7]}" # 範例:1120706 → "2023-07-06" ``` 常見年份對照(含資料完整度): | 民國 | 西元 | 主要選舉 | 資料完整度 | |------|------|----------|------------| | 103 | 2014 | 九合一 | ❌ 僅賸餘申報 | | 105 | 2016 | 立委/總統 | ❌ 僅賸餘申報 | | 107 | 2018 | 九合一 | ✅ **完整明細起點** | | 109 | 2020 | 立委/總統 | ✅ 完整 | | 111 | 2022 | 九合一 | ✅ 完整 | | 113 | 2024 | 立委/總統 | ✅ 完整 | 使用者用西元年提問時請先換算為民國年(西元 - 1911 = 民國)再對照本表。 ### ⚠️ 收入與支出是兩個不同 CSV 檔,每筆紀錄的 `收入金額`、`支出金額` 互斥 - `incomes.csv` 的所有紀錄:`收入金額 > 0`、`支出金額 = 0.00` - `expenditures.csv` 的所有紀錄:`支出金額 > 0`、`收入金額 = 0.00` 不要把兩個檔案合併後再依某一欄位判斷,會出現大量「另一欄=0」的雜訊。**先選對檔案再篩選。** ### ⚠️ 個資遮蔽規則 - 個人 `身分證/統一編號`:保留前 3 碼(如 `G12*******`)— 不適合用來識別個人 - 法人 `身分證/統一編號`:**8 碼統一編號完整揭露** — 可與 tw.gov.fia.eip~ref~business-tax JOIN,藉此補上 incomes.csv 沒有的法人資訊:公司名稱(核對申報名稱是否與稅籍登記一致)、行業別(看捐贈者所屬行業集中度,例如建設業、金融業比例)、登記地址(推測捐贈來源地區分布)、設立日期(區分新成立公司與長期經營者)、組織型態(公司/行號/合作社)、現行存續狀態(是否已停業) - `地址`:行政區以下遮蔽(保留至鄉鎮市區層級) 要識別法人身分,請優先用 `身分證/統一編號`(如 `12345678`)對照 tw.gov.fia.eip~ref~business-tax;個人僅能以姓名 + 部分證號做模糊比對。 ### ⚠️ 交易日期實際範圍是民國 107-113 年 政治獻金開放明細公開上網是 107 年以後的選舉。雖然 `選舉名稱` 涵蓋 103 年起的選舉,但 103-105 年選舉的紀錄多為「賸餘申報」,意即候選人在首次申報過後,陸續補件的申報,沒有完整的交易明細。如要做時間序列分析,**請以 `交易日期 >= 1070101` 過濾**。 ### ⚠️ `序號` 不是全域唯一 ID `序號` 是每位候選人各自從 1 開始編號,不要拿來做全表的主鍵或去重。 要去重請用 `(選舉名稱, 擬參選人/政黨, 申報序號/年度, 交易日期, 捐贈者/支出對象, 收入金額, 支出金額)` 等欄位的組合。 --- ## 查詢範例 ### 範例 1:查某候選人的收支總覽 ```python import pandas as pd incomes = pd.read_csv("https://lydata.ronny-s3.click/incomes.csv", encoding="utf-8-sig") expenditures = pd.read_csv("https://lydata.ronny-s3.click/expenditures.csv", encoding="utf-8-sig") election = "113年立法委員選舉" candidate = "于美人" cand_in = incomes[(incomes["選舉名稱"] == election) & (incomes["擬參選人/政黨"] == candidate)] cand_out = expenditures[(expenditures["選舉名稱"] == election) & (expenditures["擬參選人/政黨"] == candidate)] print(f"總收入:{cand_in['收入金額'].sum():,.0f} 元({len(cand_in)} 筆)") print(f"總支出:{cand_out['支出金額'].sum():,.0f} 元({len(cand_out)} 筆)") print("\n支出科目分佈:") print(cand_out.groupby("收支科目")["支出金額"].sum().sort_values(ascending=False)) ``` ### 範例 2:查某公司(統一編號)捐款給哪些候選人 ```python unicode_no = "43878009" # 8 碼統一編號 donations = incomes[incomes["身分證/統一編號"] == unicode_no] print(donations[["選舉名稱", "擬參選人/政黨", "收入金額", "捐贈方式", "交易日期"]]) ``` 要進一步確認公司基本資料(名稱、行業別、登記狀態),請查 [`tw.gov.fia.eip~ref~business-tax`](../tw.gov.fia.eip~ref~business-tax/skill.md)。 ### 範例 3:跨選舉、跨年度的單一科目分析 ```python # 113 年立委選舉宣傳支出 Top 20 候選人 mask = (expenditures["選舉名稱"] == "113年立法委員選舉") & \ (expenditures["收支科目"] == "宣傳支出") top = expenditures[mask].groupby("擬參選人/政黨")["支出金額"].sum() \ .sort_values(ascending=False).head(20) print(top) ``` ### 範例 4:找名稱中含特定關鍵字的廠商 當需要查「廣告公司」、「印刷公司」等收受款項的廠商: ```python # 收受 OOO 候選人款項,且名稱含「廣告」的廠商 mask = (expenditures["擬參選人/政黨"] == "於某某") & \ (expenditures["捐贈者/支出對象"].str.contains("廣告", na=False)) print(expenditures[mask][["收支科目", "捐贈者/支出對象", "支出金額", "支出用途"]]) ``` ### 範例 5:找不到對應紀錄時的處理建議 1. **確認檔案是否選對**:要找收入請用 `incomes.csv`;要找支出請用 `expenditures.csv`。 2. **候選人姓名比對**:監察院的紀錄可能有空白、簡繁、別名差異,可改用 `str.contains` 模糊比對而非 `==`。 3. **選舉名稱比對**:完整為「113年立法委員選舉」等格式;不要只比 `113` 或 `立委`。 4. **103-105 年舊選舉**:交易明細空缺;請告訴使用者「該屆只有賸餘款項申報,沒有完整捐贈/支出明細」。 5. **匿名捐贈**:依政治獻金法第 14 條第 1 項,超過 1 萬元之匿名捐贈不准;1 萬以下可走匿名,會列於資料的「匿名捐贈」紀錄但「捐贈者」欄為匿名。要找特定捐贈者時注意這部分撈不到。 6. **同類項目寫法多元**:申報內容由候選人自行填寫,沒有統一用語規範,同一類東西可能寫成多種名稱(例如「飲水」可能是「飲用水」、「礦泉水」、「瓶裝水」、「桶裝水」、「茶水」等)。搜尋時請用 `str.contains` 模糊比對並列舉多個關鍵字(`pattern = "飲水|飲用水|礦泉水|瓶裝水"`),別只用單一精確字串。如果不確定有哪些寫法,先在 `支出用途` 或 `捐贈者/支出對象` 欄位用 `value_counts()` 觀察實際出現的詞彙再決定關鍵字組合。 ### 流程 F:按 `支出用途` 搜尋特定類別支出(如餐費) `支出用途` 為自由文字欄位,由候選人自行申報,無標準化分類。同一種支出有多種常見寫法: | 類別 | 常見寫法(舉例) | |------|----------------| | 餐飲 | 餐費、餐飲費用、便當、餐盒、飲料、早餐、午餐、晚餐、誤餐費、點心、麵包 | | 印刷文宣 | 文宣費、印刷費、海報、傳單、名片、DM | | 交通 | 交通費、油費、停車費、計程車費 | 搜尋時請用 `str.contains` 並列舉多個關鍵字,不要只比對單一字串。 ```python import pandas as pd, io, requests r = requests.get("https://lydata.ronny-s3.click/expenditures.csv") df = pd.read_csv(io.BytesIO(r.content), encoding="utf-8-sig", low_memory=False) election = "113年立法委員選舉" candidates = ["蘇巧慧", "洪佳君", "張宏陸"] # 先用 tw.gov.cec~ref~candidates 確認候選人名單 # 篩選候選人 + 餐費關鍵字(多種寫法) mask_cand = df["選舉名稱"].str.contains(election, na=False) & \ df["擬參選人/政黨"].isin(candidates) mask_meal = df["支出用途"].str.contains("餐|便當|飲料|點心|麵包", na=False) meals = df[mask_cand & mask_meal] # 依候選人彙總 summary = meals.groupby("擬參選人/政黨").agg( 餐費總計=("支出金額", "sum"), 筆數=("支出金額", "count") ).sort_values("餐費總計", ascending=False) print(summary) # 看不確定的寫法時,先觀察 value_counts() 再決定關鍵字組合 print(df[mask_cand]["支出用途"].value_counts().head(30)) ``` ⚠️ **候選人名單請先用 `tw.gov.cec~ref~candidates` 確認**:候選人姓名必須與政治獻金 CSV 的 `擬參選人/政黨` 欄位完全一致,建議先取得候選人清單後再做字串比對。 --- ## 關聯資料集 | 資料集 | 說明 | 用途 | |--------|------|------| | [`tw.gov.fia.eip~ref~business-tax`](../tw.gov.fia.eip~ref~business-tax/skill.md) | 全國稅籍登記資料 | 以 `身分證/統一編號`(法人 8 碼)查公司名稱、行業別、地址、設立日期 | | [`tw.gov.cec~ref~election-event`](../tw.gov.cec~ref~election-event/skill.md) | 歷次投票事件清單 | 對應 `選舉名稱`,可取得投票日、選舉層級、屆次等 metadata | | [`tw.gov.moi~ref~party`](../tw.gov.moi~ref~party/skill.md) | 政黨資訊 | `擬參選人/政黨` 為政黨名稱時可對照取得政黨完整資料 | | [`tw.gov.judicial~ref~foundation`](../tw.gov.judicial~ref~foundation/skill.md) | 法人登記主索引 | 政黨亦為法人,可查法人登記主索引,進一步至 `tw.gov.judicial~ref~foundation-doc` 查重要幹部與黨主席的歷次變更紀錄 | --- ## 注意事項與限制 1. **無 API 端點**:本資料集為打包(bulk)型,不支援即時 API 查詢,必須下載 CSV 後在本地處理。 2. **靜態快照**:資料為定期整理快照,非即時。每場選舉申報結束後才會匯入。 3. **檔案大小**:incomes.csv ~ 50-80 MB、expenditures.csv ~ 70-110 MB,下載時間視網路而定。 4. **編碼為 UTF-8 BOM**:讀取請用 `encoding="utf-8-sig"`,否則第一個欄位名稱會帶有 `` 前綴。 5. **金額單位為元**(非千元、非萬元)。 6. **103-113 年但實際交易明細從 107 年起**:舊選舉僅有賸餘申報紀錄。 7. **個資遮蔽**:個人身分證號後段遮蔽、地址截至鄉鎮市區層級。 --- ## 快速參考 | 項目 | 說明 | |------|------| | 資料型態 | 打包(bulk)CSV,無 API | | Token | 不需要 | | 收入檔 | https://lydata.ronny-s3.click/incomes.csv (793,343 筆) | | 支出檔 | https://lydata.ronny-s3.click/expenditures.csv (1,176,658 筆) | | 編碼 | UTF-8 BOM(讀取請用 `encoding="utf-8-sig"`) | | 欄位數 | 26(兩檔相同 schema) | | 日期格式 | 民國年 `YYYMMDD`(7 位),需 `+1911` 轉西元 | | 金額單位 | 新台幣元 | | 收支區分 | 兩個獨立 CSV,每筆紀錄 `收入金額`/`支出金額` 互斥 | | 法人 ID | `身分證/統一編號` 8 碼完整揭露,可 JOIN tw.gov.fia.eip~ref~business-tax | | 個人 ID | 後段遮蔽(`G12*******`),無法精確識別 | | 涵蓋選舉 | 103-113 年各類公職人員選舉(含補選) | | 實際交易日期範圍 | 民國 107-113 年(103-105 年僅有賸餘申報) | | 原始來源 | 監察院受理政治獻金申報平台(ardata.cy.gov.tw) |