本章節(jié)以及后續(xù)章節(jié)的源碼,當然也可以從我的github下載捷绑,在源碼中我自己加了一些中文注釋。
???美國社會保障總署(SSA)提供了一份從1880年到現(xiàn)在的嬰兒名字頻率數(shù)據(jù)氢妈。你可以用這個數(shù)據(jù)集做很多事粹污,例如:
????????計算指定名字(可以是你自己的,也可以是別人的)的年度比例允懂。
????????計算某個名字的相對排名厕怜。
????????計算各年度最流行的名字,以及增長或減少最快的名字蕾总。
????????分析名字趨勢:元音、輔音琅捏、長度生百、總體多樣性、拼寫變化柄延、首尾字母等蚀浆。
????????分析外源性趨勢:圣經(jīng)中的名字、名人搜吧、人口結構變化等市俊。
????????美國社會保障總署將該數(shù)據(jù)庫按年度制成了多個數(shù)據(jù)文件,其中給出了每個性別/名字組合的出生總數(shù)滤奈。這些文件的原始檔案可以在這里獲劝诿痢:http://www.ssa.gov/oact/babynames/limits.html。
????????下載"National data"文件names.zip蜒程,解壓后的目錄中含有一組文件(如yob1880.txt)绅你。
一、對所有嬰兒姓名的預處理
????????1昭躺、文件是一個非常標準的以逗號隔開的格式忌锯,所以可以用pandas.read_csv將其加載到DataFrame中
????????這些文件中僅含有當年出現(xiàn)超過5次的名字。為了簡單起見领炫,我們可以用births列的sex分組小計表示該年度的births總計:
????????由于該數(shù)據(jù)集按年度被分隔成了多個文件偶垮,所以第一件事情就是要將所有數(shù)據(jù)都組裝到一個DataFrame里面,并加上一個year字段帝洪。使用pandas.concat即可達到這個目的:
????????pieces是許多個DataFrame的集合:
????????每一個DataFrame的數(shù)據(jù)如下:
????????這里需要注意幾件事情似舵。第一,concat默認是按行將多個DataFrame組合到一起的碟狞;第二啄枕,必須指定ignore_index=True,因為我們不希望保留read_csv所返回的原始行號∽逦郑現(xiàn)在我們得到了一個非常大的DataFrame频祝,它含有全部的名字數(shù)據(jù)泌参。有了這些數(shù)據(jù)之后,我們就可以利用groupby或pivot_table在year和sex級別上對其進行聚合了
????????2常空、以年為索引沽一,性別為列,出生數(shù)為值漓糙。統(tǒng)計每年的男女出生總數(shù)
????????3铣缠、插入一個prop列,用于存放指定名字的嬰兒數(shù)相對于總出生數(shù)的比例昆禽。prop值為0.02表示每100名嬰兒中有2名取了當前這個名字蝗蛙。因此我們先按year和sex分組,然后再將新列加到各個分組上:
????????4醉鳖、在執(zhí)行這樣的分組處理時捡硅,一般都應該做一些有效性檢查,比如驗證所有分組的prop的總和是否為1盗棵。
????????5壮韭、取出該數(shù)據(jù)的一個子集:每對sex/year組合的前1000個名字
????????這樣也可以:
二、分析命名趨勢
????????有了完整的數(shù)據(jù)集和剛才生成的top1000數(shù)據(jù)集纹因,我們就可以開始分析各種命名趨勢了喷屋。首先將前1000個名字分為男女兩個部分:
1、生成一張按year和name統(tǒng)計總出生數(shù)透視表
2瞭恰、用DataFrame的plot方法繪制幾個名字的曲線圖
結論:從圖中可以看出屯曹,這幾個名字在美國人民的心目中已經(jīng)風光不再了。
三寄疏、評估命名多樣性的增長
????????1是牢、一種解釋是父母愿意給小孩起常見的名字越來越少。這個假設可以從數(shù)據(jù)中得到驗證陕截。一個辦法是計算最流行的1000個名字所占的比例驳棱,我按year和sex進行聚合并繪圖。
????????結論:從圖中可以看出农曲,名字的多樣性確實出現(xiàn)了增長(前1000項的比例降低)社搅。
????????2、另一個驗證辦法是計算占總出生人數(shù)前50%的不同名字的數(shù)量乳规,這個數(shù)字不太好計算形葬。我們只考慮2010年男孩的名字:
????????在對prop降序排列之后,我們想知道前面多少個名字的人數(shù)加起來才夠50%暮的。雖然編寫一個for循環(huán)確實也能達到目的笙以,但NumPy有一種更聰明的矢量方式。先計算prop的累計和cumsum冻辩,然后再通過searchsorted方法找出0.5應該被插入在哪個位置才能保證不破壞順序:
????????由于數(shù)組索引是從0開始的猖腕,因此我們要給這個結果加1拆祈,即最終結果為117。拿1900年的數(shù)據(jù)來做個比較倘感,這個數(shù)字要小得多:
????????3放坏、現(xiàn)在就可以對所有year/sex組合執(zhí)行這個計算了。按這兩個字段進行groupby處理老玛,然后用一個函數(shù)計算各分組的這個值:
????????結論:從圖中可以看出淤年,女孩名字的多樣性總是比男孩的高,而且還在變得越來越高蜡豹。
四麸粮、最后一個字母的變革
? ? ? ?1、 近百年來镜廉,男孩名字在最后一個字母上的分布發(fā)生了顯著的變化豹休。為了了解具體的情況,我首先將全部出生數(shù)據(jù)在年度桨吊、性別以及末字母上進行了聚合:
選出具有一定代表性的三年:
????????2、接下來我們需要按總出生數(shù)對該表進行規(guī)范化處理凤巨,以便計算出各性別各末字母占總出生人數(shù)的比例:
????????3视乐、有了這個字母比例數(shù)據(jù)之后,就可以生成一張各年度各性別的條形圖了
? ? ? ?結論: 可以看出敢茁,從20世紀60年代開始佑淀,以字母"n"結尾的男孩名字出現(xiàn)了顯著的增長。
????????4彰檬、回到之前創(chuàng)建的那個完整表伸刃,按年度和性別對其進行規(guī)范化處理,并在男孩名字中選取幾個字母逢倍,最后進行轉置以便將各個列做成一個時間序列:
????????5捧颅、有了這個時間序列的DataFrame之后,就可以通過其plot方法繪制出一張趨勢圖
五较雕、變成女孩名字的男孩名字(以及相反的情況)
????????另一個有趣的趨勢是碉哑,早年流行于男孩的名字近年來“變性了”,例如Lesley或Leslie亮蒋】鄣洌回到top1000數(shù)據(jù)集,找出其中以"lesl"開頭的一組名字:
????????利用這個結果過濾掉其他的名字慎玖,并按名字分組計算出生數(shù)以查看相對頻率
????????然后利用這個結果過濾其他的名字贮尖,并按名字分組計算出生數(shù)以查看相對頻率:
????????按性別和年度進行聚合,并按年度進行規(guī)范化處理:
快速學習:
數(shù)據(jù)分析案例--1880-2010年間全美嬰兒姓名的處理
數(shù)據(jù)分析案例--MovieLens 1M數(shù)據(jù)集
數(shù)據(jù)分析案例--USA.gov數(shù)據(jù)