寫在前面
這是小李在簡書寫的第一篇文章,先介紹一下自己:
今年22歲,目前是一個上海金融科技民工,從大二開始接觸Python,可以熟練使用pandas處理數(shù)據(jù),以及用seaborn簡單做圖,sklearn也會一點點?,F(xiàn)在利用業(yè)余時間加強(qiáng)學(xué)習(xí)一下數(shù)據(jù)分析能力,在這里記錄一下自己學(xué)習(xí)的收獲、反思等。
雖然接觸python時間不短,但是非科班出身(專業(yè)金融輔修計算機(jī))所以編碼上有可能會存在一些“低級錯誤”,希望大家伙可以不吝賜教,非常歡迎交流分享。(目前的興趣點在數(shù)據(jù)分析以及機(jī)器學(xué)習(xí)上)。
就這樣,正文開始~
一、 數(shù)據(jù)獲取
這次使用的數(shù)據(jù)是從美國統(tǒng)計局下載的聯(lián)邦醫(yī)療補(bǔ)貼數(shù)據(jù),這里就不放鏈接了。名字是“Medicaid_Financial_Management_Data.CSV”。
本來是想用這個數(shù)據(jù)做機(jī)器學(xué)習(xí)的,結(jié)果發(fā)現(xiàn)沒啥好學(xué)習(xí)的,就索性學(xué)習(xí)了一下數(shù)據(jù)可視化。
二、 工具準(zhǔn)備
之前分析數(shù)據(jù)(一般是股票數(shù)據(jù)、財務(wù)數(shù)據(jù)之類的)我比較喜歡用Jupyter Notebook,因為它的交互界面還有Markdown實在太好用了,甚至在寫完之后直接生成HTML就能當(dāng)附件交作業(yè)。但是我聽說Pycharm比較適合機(jī)器學(xué)習(xí),所以現(xiàn)在開始嘗試著使用Pycharm,此次分析使用的是開源免費(fèi)版本的PyCharm Community Edition x64。
這次會用到兩個庫:pandas以及pyecharts。
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Map, Page
三、 分析開始
讀取數(shù)據(jù)

通過觀察數(shù)據(jù),發(fā)現(xiàn)此數(shù)據(jù)集的空值表達(dá)形式為空即"",所以在讀取時將空值轉(zhuǎn)化為NAN,否則在后續(xù)dropna時會失效。
f = pd.read_csv('./Medicaid_Financial_Management_Data.csv', na_values="")
df = pd.DataFrame(f)
清洗數(shù)據(jù)
數(shù)據(jù)集是2016年,經(jīng)過檢驗year列沒有2016以外的數(shù)據(jù),所以直接丟掉。
# df = df[df['Year'] == 2016]
df.drop('Year', axis=1, inplace=True)
按照州名以及項目名聚合一下
group = df.groupby(['State', 'Program']).mean()
# 確定group中每個state下只有[Administration, Medical Assistance Program]兩行
# program = df[['Program']].groupby(['Program']).count()
# print(program)
汗,我可能太依賴于Jupyter的一行代碼一行輸出的模式了,Pycharm沒法及時查看代碼運(yùn)行效果讓我有些難受(也可能是我還沒發(fā)現(xiàn)怎么用。。。)用print調(diào)試太痛苦了。
通過篩選發(fā)現(xiàn)需要將數(shù)據(jù)分為Administration和Medical Assistance Program,可以用循環(huán)分離兩行,此次目的分析醫(yī)療補(bǔ)助項目,故管理項目可丟棄。現(xiàn)在計算聯(lián)邦醫(yī)療補(bǔ)助占聯(lián)邦份額比例。
for index, row in group.iterrows():
if index[1] == 'Administration':
group.drop(index, inplace=True)
else:
continue
group['%medicaid Federal'] = group['Federal Share Medicaid'] / group['Federal Share']
group = group[['%medicaid Federal', 'Federal Share']]
group.reset_index(inplace=True)
group.set_index('State', inplace=True)
group.drop('Program', axis=1, inplace=True)
'''
group = (group[['%medicaid Federal', 'Federal Share']]
.reset_index(inplace=True)
.set_index('State', inplace=True)
.drop('Program', axis=1, inplace=True))
'''
這里我本來想用鏈?zhǔn)浇Y(jié)構(gòu)的,不知道為什么老是報錯?!癗onetype do not have reset_index attribute.” 之后再改進(jìn)吧。
Pyecharts可視化
數(shù)據(jù)集生成
將數(shù)據(jù)分為聯(lián)邦份額以及醫(yī)療補(bǔ)貼占比:
data_med = []
data_share = []
for index, row in group.iterrows():
data_med.append([index, row[0]])
data_share.append([index, row[1]])
地圖函數(shù)
如果想要同時顯示的圖屬于同一類圖而且底圖尺度一樣時,Pyecharts默認(rèn)會繪制到一副底圖上,雖然在有些場景不錯但此次我想要的是一個同行雙顯圖,庫自帶的Page類可以使多幅圖在同一頁面顯示,而DraggablePageLayout屬性可以讓畫布可以被調(diào)整,相當(dāng)人性化了。
def medmap_america() -> Map:
c = (
Map()
.add('%聯(lián)邦醫(yī)療補(bǔ)助', data_med, maptype='美國', zoom=1)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="醫(yī)療補(bǔ)貼地圖"),
visualmap_opts=opts.VisualMapOpts(max_=max(x[1] for x in data_med), min_=min(x[1] for x in data_med),
split_number=7, is_calculable=True),
)
)
d = (
Map()
.add('聯(lián)邦份額', data_share, maptype='美國', zoom=1)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
.set_global_opts(
title_opts=opts.TitleOpts(title="聯(lián)邦份額地圖"),
visualmap_opts=opts.VisualMapOpts(max_=max(x[1] for x in data_share), min_=min(x[1] for x in data_share),
split_number=7, is_calculable=True),
)
)
page = (
Page(layout=Page.DraggablePageLayout)
.add(c)
.add(d)
)
return page
d_map = medmap_america()
d_map.render("./med_america.html")
Pyecharts最后輸出的成果是HTML,如果接入前端然后加載頁面內(nèi)HTML用作BI系統(tǒng)的數(shù)據(jù)可視化展示應(yīng)該還是蠻炫酷的吧。

四、 分析以及反思
- 從圖表中可以看出美國的醫(yī)療補(bǔ)貼力度比較大,除了寥寥三四個州之外其余州的醫(yī)療補(bǔ)貼100%由政府出資,但出資比例高并不代表著醫(yī)療補(bǔ)貼水平高,因為出資規(guī)模差異非常大。
- 右圖為聯(lián)邦出資規(guī)模最多的加利福尼亞州有934,323,159美元最低的州只有286,579美元,其間是3位數(shù)的差距(感覺有些辛酸,好大的貧富差距)不過這里還需要人口數(shù)據(jù)作為佐證不然有些以偏概全了。這個數(shù)據(jù)集是2016年的數(shù)據(jù),最新情況還不得而知,但在2016年加利福尼亞州的財政支出已遠(yuǎn)超紐約我只能說加利福尼亞州牛逼,畢竟坐擁硅谷以及舊金山灣區(qū),經(jīng)濟(jì)科技發(fā)展沒的說。
- 整個分析從準(zhǔn)備到調(diào)試到最終輸出大概耗時3天(的空余時間),是一個小項目吧。還是簡單分析一下得失:
- 收獲:學(xué)習(xí)了新的可視化利器Pyecharts,感覺有中文document真的有點爽。
- 不足之處:
- 雖然看樣子分析了不少,但是除了California Yes之外似乎并沒有得出什么有用的結(jié)論。日后還是得在數(shù)據(jù)獲取、數(shù)據(jù)模型、評估算法上下些功夫。
- 數(shù)據(jù)處理過程有些不夠流暢,出了挺多Bug,蠻遺憾的。