本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
以下文章來源于天池大資料科研平臺,作者簡說Python
前言
本文通過Pandas分析了美國選民2020.7.22-2020.8.20期間的75w+條捐贈資料,分析揭秘美國選民對總統候選人的喜好,主要帶領讀者利用Python進行資料分析以及資料可視化,包含資料集的處理、資料探索與清晰、資料分析、資料可視化四部分,利用pandas、matplotlib、wordcloud等第三方庫帶大家玩轉資料分析~
專案地址:
https://tianchi.aliyun.com/competition/entrance/531837/introduction
資料集來源介紹
「所有候選人資訊(weball20.txt)」
該檔案為每個候選人提供一份記錄,并顯示候選人的資訊、總收入、從授權委員會收到的轉賬、付款總額、給授權委員會的轉賬、庫存現金總額、貸款和債務以及其他財務匯總資訊,
資料欄位描述詳細:https://www.fec.gov/campaign-finance-data/all-candidates-file-description/
關鍵欄位說明
- CAND_ID 候選人ID
- CAND_NAME 候選人姓名
- CAND_PTY_AFFILIATION 候選人黨派
資料來源:https://www.fec.gov/files/bulk-downloads/2020/weball20.zip
「候選人委員會鏈接資訊(ccl.txt)」
該檔案顯示候選人的身份證號碼、候選人的選舉年份、聯邦選舉委員會選舉年份、委員會識別號、委員會型別、委員會名稱和鏈接標識號,
資訊描述詳細:https://www.fec.gov/campaign-finance-data/candidate-committee-linkage-file-description/
關鍵欄位說明
- CAND_ID 候選人ID
- CAND_ELECTION_YR 候選人選舉年份
- CMTE_ID 委員會ID
資料來源:https://www.fec.gov/files/bulk-downloads/2020/ccl20.zip
「個人捐款檔案資訊(itcont_2020_20200722_20200820.txt)」
【注意】由于檔案較大,本資料集只包含2020.7.22-2020.8.20的相關資料,如果需要更全資料可以通過資料來源中的地址下載,
該檔案包含有關收到捐款的委員會、披露捐款的報告、提供捐款的個人、捐款日期、金額和有關捐款的其他資訊,
資訊描述詳細:https://www.fec.gov/campaign-finance-data/contributions-individuals-file-description/
關鍵欄位說明
- CMTE_ID 委員會ID
- NAME 捐款人姓名
- CITY 捐款人所在市
- State 捐款人所在州
- EMPLOYER 捐款人雇主/公司
- OCCUPATION 捐款人職業
資料來源:https://www.fec.gov/files/bulk-downloads/2020/indiv20.zip
需要提前安裝的包
# 安裝詞云處理包wordcloud
pip install wordcloud
# 資料可視化包matplotlib
pip install matplotlib
# 資料處理包pandas
pip install pandas
需要提前下載好資料集
「方法一:」 本文相關資料集國內下載地址如下,訪問后即可直接下載到本地:
https://tianchi.aliyun.com/dataset/dataDetail?dataId=79412
然后在本地復現本文案例代碼;
「方法二:」 你也可以直接 訪問下方鏈接 報名參與相關學習賽:
https://tianchi.aliyun.com/competition/entrance/531837/introduction
然后Fork賽事論壇的baseline到你的天池實驗室,并點擊編輯按鈕就可以成功跳轉到DSW在線編程環境了,你可以直接在哪里進行編程和資料集下載,更加方便,本案例資料集2020_US_President_political_contributions
資料處理
進行資料處理前,我們需要知道我們最終想要的資料是什么樣的,因為我們是想分析候選人與捐贈人之間的關系,所以我們想要一張資料表中有捐贈人與候選人一一對應的關系,所以需要將目前的三張資料表進行一一關聯,匯總到需要的資料,
將委員會和候選人一一對應,通過CAND_ID關聯兩個表
由于候選人和委員會的聯系表中無候選人姓名,只有候選人ID(CAND_ID),所以需要通過CAND_ID從候選人表中獲取到候選人姓名,最終得到候選人與委員會聯系表ccl,
# 匯入相關處理包
import pandas as pd
# 讀取候選人資訊,由于原始資料沒有表頭,需要添加表頭
candidates = pd.read_csv("weball20.txt", sep = '|',names=['CAND_ID','CAND_NAME','CAND_ICI','PTY_CD','CAND_PTY_AFFILIATION','TTL_RECEIPTS',
'TRANS_FROM_AUTH','TTL_DISB','TRANS_TO_AUTH','COH_BOP','COH_COP','CAND_CONTRIB',
'CAND_LOANS','OTHER_LOANS','CAND_LOAN_REPAY','OTHER_LOAN_REPAY','DEBTS_OWED_BY',
'TTL_INDIV_CONTRIB','CAND_OFFICE_ST','CAND_OFFICE_DISTRICT','SPEC_ELECTION','PRIM_ELECTION','RUN_ELECTION'
,'GEN_ELECTION','GEN_ELECTION_PRECENT','OTHER_POL_CMTE_CONTRIB','POL_PTY_CONTRIB',
'CVG_END_DT','INDIV_REFUNDS','CMTE_REFUNDS'])
# 讀取候選人和委員會的聯系資訊
ccl = pd.read_csv("ccl.txt", sep = '|',names=['CAND_ID','CAND_ELECTION_YR','FEC_ELECTION_YR','CMTE_ID','CMTE_TP','CMTE_DSGN','LINKAGE_ID'])
# 關聯兩個表資料
ccl = pd.merge(ccl,candidates)
# 提取出所需要的列
ccl = pd.DataFrame(ccl, columns=[ 'CMTE_ID','CAND_ID', 'CAND_NAME','CAND_PTY_AFFILIATION'])
資料欄位說明:
- CMTE_ID:委員會ID
- CAND_ID:候選人ID
- CAND_NAME:候選人姓名
- CAND_PTY_AFFILIATION:候選人黨派
# 查看目前ccl資料前10行
ccl.head(10)
2.2 將候選人和捐贈人一一對應,通過CMTE_ID關聯兩個表
通過CMTE_ID將目前處理好的候選人和委員會關系表與人捐款檔案表進行關聯,得到候選人與捐贈人一一對應聯系表cil,
python基礎 爬蟲、資料分析
# 讀取個人捐贈資料,由于原始資料沒有表頭,需要添加表頭
# 提示:讀取本檔案大概需要5-10s
itcont = pd.read_csv('itcont_2020_20200722_20200820.txt', sep='|',names=['CMTE_ID','AMNDT_IND','RPT_TP','TRANSACTION_PGI',
'IMAGE_NUM','TRANSACTION_TP','ENTITY_TP','NAME','CITY',
'STATE','ZIP_CODE','EMPLOYER','OCCUPATION','TRANSACTION_DT',
'TRANSACTION_AMT','OTHER_ID','TRAN_ID','FILE_NUM','MEMO_CD',
'MEMO_TEXT','SUB_ID'])
/opt/conda/lib/python3.6/site-packages/IPython/core/interactiveshell.py:3058: DtypeWarning: Columns (10,15,16,18) have mixed types. Specify dtype option on import or set low_memory=False.
interactivity=interactivity, compiler=compiler, result=result)
# 將候選人與委員會關系表ccl和個人捐贈資料表itcont合并,通過 CMTE_ID
c_itcont = pd.merge(ccl,itcont)
# 提取需要的資料列
c_itcont = pd.DataFrame(c_itcont, columns=[ 'CAND_NAME','NAME', 'STATE','EMPLOYER','OCCUPATION',
'TRANSACTION_AMT', 'TRANSACTION_DT','CAND_PTY_AFFILIATION'])
「資料說明」
- CAND_NAME – 接受捐贈的候選人姓名
- NAME – 捐贈人姓名
- STATE – 捐贈人所在州
- EMPLOYER – 捐贈人所在公司
- OCCUPATION – 捐贈人職業
- TRANSACTION_AMT – 捐贈數額(美元)
- TRANSACTION_DT – 收到捐款的日期
- CAND_PTY_AFFILIATION – 候選人黨派
# 查看目前資料前10行
c_itcont.head(10)
資料探索與清洗
經過資料處理部分,我們獲得了可用的資料集,現在我們可以利用呼叫shape屬性查看資料的規模,呼叫info函式查看資料資訊,呼叫describe函式查看資料分布,
# 查看資料規模 多少行 多少列
c_itcont.shape
(756205, 8)
# 查看整體資料資訊,包括每個欄位的名稱、非空數量、欄位的資料型別
c_itcont.info()
通過上面的探索我們知道目前資料集的一些基本情況,目前資料總共有756205行,8列,總占用記憶體51.9+MB,STATE、EMPLOYER、OCCUPATION有缺失值,另外日期列目前為int64型別,需要進行轉換為str型別,
#空值處理,統一填充 NOT PROVIDED
c_itcont['STATE'].fillna('NOT PROVIDED',inplace=True)
c_itcont['EMPLOYER'].fillna('NOT PROVIDED',inplace=True)
c_itcont['OCCUPATION'].fillna('NOT PROVIDED',inplace=True)
# 對日期TRANSACTION_DT列進行處理
c_itcont['TRANSACTION_DT'] = c_itcont['TRANSACTION_DT'] .astype(str)
# 將日期格式改為年月日 7242020
c_itcont['TRANSACTION_DT'] = [i[3:7]+i[0]+i[1:3] for i in c_itcont['TRANSACTION_DT'] ]
# 再次查看資料資訊
c_itcont.info()
# 查看資料前3行
c_itcont.head(3)
# 查看資料表中資料型別的列的資料分布情況
c_itcont.describe()
# 查看單列的資料發布情況
c_itcont['CAND_NAME'].describe()
4、資料分析
# 計算每個黨派的所獲得的捐款總額,然后排序,取前十位
c_itcont.groupby("CAND_PTY_AFFILIATION").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
# 計算每個總統候選人所獲得的捐款總額,然后排序,取前十位
c_itcont.groupby("CAND_NAME").sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
獲得捐贈最多的黨派有DEM(民主黨)、REP(共和黨),分別對應BIDEN, JOSEPH R JR(拜登)和TRUMP, DONALD J.(特朗普),從我們目前分析的2020.7.22-2020.8.20這一個月的資料來看,在選民的捐贈資料中拜登代表的民主黨完勝特朗普代表的共和黨,由于完整資料量過大,所以沒有對所有資料進行匯總分析,因此也不能確定11月大選公布結果就一定是拜登當選
# 查看不同職業的人捐款的總額,然后排序,取前十位
c_itcont.groupby('OCCUPATION').sum().sort_values("TRANSACTION_AMT",ascending=False).head(10)
# 查看每個職業捐款人的數量
c_itcont['OCCUPATION'].value_counts().head(10)
從捐款人的職業這個角度分析,我們會發現NOT EMPLOYED(自由職業)的總捐贈額是最多,通過查看每個職業捐贈的人數來看,我們就會發現是因為NOT EMPLOYED(自由職業)人數多的原因,另外退休人員捐款人數也特別多,所以捐款總數對應的也多,其他比如像:律師、創始人、醫生、顧問、教授、主管這些高薪人才雖然捐款總人數少,但是捐款總金額也占據了很大比例,
# 每個州獲捐款的總額,然后排序,取前五位
c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending=False).head(5)
# 查看每個州捐款人的數量
c_itcont['STATE'].value_counts().head(5)
最后查看每個州的捐款總金額,我們會發現CA(加利福利亞)、NY(紐約)、FL(弗羅里達)這幾個州的捐款是最多的,在捐款人數上也是在Top端,另一方面也凸顯出這些州的經濟水平發達,大家也可以通過資料查看下上面列舉的高端職業在各州的分布情況,進行進一步的分析探索,
資料可視化
首先匯入相關Python庫
# 匯入matplotlib中的pyplot
import matplotlib.pyplot as plt
# 為了使matplotlib圖形能夠行內顯示
%matplotlib inline
# 匯入詞云庫
from wordcloud import WordCloud,ImageColorGenerator
按州總捐款數和總捐款人數柱狀圖
# 各州總捐款數可視化
st_amt = c_itcont.groupby('STATE').sum().sort_values("TRANSACTION_AMT",ascending=False)[:10]
st_amt=pd.DataFrame(st_amt, columns=['TRANSACTION_AMT'])
st_amt.plot(kind='bar')
<AxesSubplot:xlabel='STATE'>
各州捐款總人數可視化
# 各州捐款總人數可視化,取前10個州的資料
st_amt = c_itcont.groupby('STATE').size().sort_values(ascending=False).head(10)
st_amt.plot(kind='bar')
<AxesSubplot:xlabel='STATE'>
熱門候選人拜登在各州的獲得的捐贈占比
# 從所有資料中取出支持拜登的資料
biden = c_itcont[c_itcont['CAND_NAME']=='BIDEN, JOSEPH R JR']
# 統計各州對拜登的捐款總數
biden_state = biden.groupby('STATE').sum().sort_values("TRANSACTION_AMT", ascending=False).head(10)
# 餅圖可視化各州捐款資料占比
biden_state.plot.pie(figsize=(10, 10),autopct='%0.2f%%',subplots=True)
array([<AxesSubplot:ylabel='TRANSACTION_AMT'>], dtype=object)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/202420.html
標籤:其他
