1880-2014年間全美嬰兒姓名分析

針對全美嬰兒姓名數據進行一些分析

1880-2014年間全美嬰兒姓名數據來源於kaggle,利用這個數據我們可以進行一些有趣的分析,比如分析這些年中叫西蒙的嬰兒數量的變化,國家嬰兒數據如下:
國家嬰兒數據
有五個特徵,分別爲ID、姓名、年份、性別和數量。以下爲州數據state_names:
州嬰兒數據
我們可以看到有六個特徵,相比national來說,增加了州一項。

下面開始正式進入數據分析,我使用的是jupyter notebook(也可以使用spyder等IDE,但是注意怎樣實現即時交互):

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from collections import Counter
data=pd.read_csv('./NationalNames.csv')
data.head()

結果輸出:
這裏寫圖片描述

data.info()

輸出數據類型(這裏隱藏結果顯示)
將名字和數量進行統計,並放在一個字典中:

#將名字和相應的數量進行統計,存在一個字典中
names_dict=dict()
for index,row in data.iterrows():
    if row['Name'] not in names_dict:
        names_dict[row['Name']]=row['Count']
    else:
        names_dict[row['Name']]+=row['Count']
name='Mary'
print('%s->%i' %(name,names_dict.get(name)))
name='Minnie'
print('%s->%i' %(name,names_dict.get(name)))

統計最流行的10個名字和最不流行的10個名字:

#利用counter計數器你的most_common函數進行統計
#返回最常用的10個名字以及相應計數
top_10=Counter(names_dict).most_common(10)
print('全美最流行的10個嬰兒名字:')
for pair in top_10:
    print('姓名:%s->數量:%i' %(pair[0],pair[1]))
#返回最不常用的10個名字,在這裏我們直接取top_10裏最後10個數就好了
print('全美最不流行的10個嬰兒名字:')
for pair in Counter(names_dict).most_common()[:-10:-1]:
    print('姓名:%s->數量:%i' %(pair[0],pair[1]))

計算名字的平均長度:

#名字的平均長度
def average_length_data_transform():
    '''
    統計每年男性、女性姓名的平均長度'''
    #按行遍歷數據
    years=[]
    #女性姓名
    female_average_length=[]
    female_average_name_length=dict()
    #男性名字
    male_average_length=[]
    male_average_name_length=dict()
    for index,row in data.iterrows():
        if row['Gender']=='F':#女性
            curr_year=row['Year']
            curr_name_length=len(row['Name'])
            if curr_year not in female_average_name_length:
                female_average_name_length[curr_year]=[curr_name_length,1]
            else:
                female_average_name_length[curr_year][0]+=curr_name_length
                female_average_name_length[curr_year][1]+=1
        else:#男性
            curr_year=row['Year']
            curr_name_length=len(row['Name'])
            if curr_year not in male_average_name_length:
                male_average_name_length[curr_year]=[curr_name_length,1]
            else:
                male_average_name_length[curr_year][0]+=curr_name_length
                male_average_name_length[curr_year][1]+=1
    for key,value in female_average_name_length.items():
        years.append(key)
        female_average_length.append(float(value[0])/value[1])
    for key,value in male_average_name_length.items():
        years.append(key)
        male_average_length.append(float(value[0])/value[1])
    return (female_average_length,female_average_name_length,male_average_length,male_average_name_length)

注意上面定義的是一個函數,因此使用的時候需要調用

#處理時間較長
female_average_length,female_average_name_length,male_average_length,male_average_name_length=average_length_data_transform()
for year in range(1880,1891):
    print('年份:%i,總長:%i,個數:%i' %(year,female_average_name_length.get(year)[0],female_average_name_length.get(year)[1]))

#輸出平均長度
print(female_average_length[:10])

可視化輸出:

years=range(1880,2015)
f,ax=plt.subplots(figsize=(10,6))
ax.set_xlim([1880,2014])
plt.plot(years,female_average_length,label='Average length of female names',color='r')
plt.plot(years,male_average_length,label='Average length of male names',color='b')
ax.set_ylabel('Length of name')
ax.set_xlabel('Year')
ax.set_title('Average length of names')
legend=plt.legend(loc='best',frameon=True,borderpad=1,borderaxespad=1)
plt.show()

average length of names

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章