《利用python進行資料分析》讀書筆記之案例二:全美嬰兒姓名
阿新 • • 發佈:2019-01-25
這份資料包含了從1880到2010年間的嬰兒名字頻率資料,其資料形式是多個txt檔案,且用逗號分隔,可以用pandas.read_csv將其載入到DataFrame中,並且用pandas.concat將所有資料都組裝到一個DataFrame。
years=range(1880,2011) pieces=[] columns=['name','sex','births'] for year in years: path='yob%d.txt'%year frame=pd.read_csv(path,names=columns) frame['year']=year pieces.append(frame) names=pd.concat(pieces,ignore_index=True)
total_births=names.pivot_table('births',index='year',columns='sex',aggfunc=sum)
def add_prop(group):
births=group.births.astype(float)
group['prop']=births/births.sum()
return group
names=names.groupby(['year','sex']).apply(add_prop)
在執行這樣的分組處理時,一般都會做一些有效性檢查,比如驗證所有分組的prop的總和是否為1
結果為:Truenp.allcolse(names.groupby(['year','sex']).prop.sum(),1)
(1)需要取出該資料的一個子集:每對sex/year組合的前1000個名字:
def get_top1000(group):
return group.sort_values(by='births',ascending=False)[:1000]
grouped=names.groupby(['year','sex'])
top1000=grouped.apply(get_top1000)
(2)分析命名的趨勢:
先是生成一張按year和name統計的總出生人數透視表:
total_births=top1000.pivot_table('births',index='year',columns='sex',aggfunc=sum)
用DataFrame的plot方法繪製幾個名字的曲線圖:
subset=total_births[['John','Harry','Marry','Marilyn']]
subset.plot(subplots=True,figsize=(12,10),grid=False)
plt.show()
從這張圖中可以看出這兩個之前比較流行的名字隨著時間的流逝已經風光不再了,所以我們需要來評估命名多樣的增長。
計算最流行的1000個名字所佔的比例,按year和sex進行聚合並繪圖:
table=top1000.pivot_table('prop',index='year',columns='sex',aggfunc=sum)
table.plot(yticks=np.linspace(0,1.2,13),xticks=range(1880,2020,10))
plt.show()
表明前1000項的名字比例在下降,名字的多樣性在增加。