這篇文章用pandas
對全球的人口數據作個簡單分析。我收集全球各國1960-2019年人口數據,包含男女和不一樣年齡段,共6個文件。web
pop_total.csv: 各國每一年總人口 pop_female.csv:各國每一年女性人口 pop_male.csv: 各國每一年男性人口 pop_0_14.csv: 各國每一年0-14歲人口 pop_15_64.csv: 各國每一年15-64歲人口 pop_65up.csv:各國每一年65歲以上人口 複製代碼
先用pandas
讀取文件數據echarts
import pandas as pd
pop_total = pd.read_csv('./data/pop_total.csv', skiprows=4) pop_total.info() 複製代碼
pop_total.csv
文件存放各國每一年總人口數據,格式以下編輯器
pop_total.head(2)
複製代碼
一樣的方式,咱們讀取剩下的5個文件,對應的DataFrame
分別是pop_female
、pop_male
、pop_0_14
、pop_15_64
、pop_65up
。flex
爲了直觀觀察全球人口分佈,咱們用pyecharts
繪製2019年全球人口分佈地圖spa
from pyecharts import options as opts
from pyecharts.charts import Timeline, Map pop_total_2019 = pop_total[['Country Name', '2019']] # 修改俄羅斯的英文名以便pyecharts能識別 pop_total_2019.loc[200, 'Country Name'] = 'Russia' pop_world_map = ( Map() .add("2019年", pop_total_2019.values, "world", is_map_symbol_show=False) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts(title="全球人口"), visualmap_opts=opts.VisualMapOpts(max_=100000000), # 超過1億人口顏色最深(紅色) ) ) pop_world_map.render_notebook() 複製代碼
由於咱們有50年的數據,因此咱們還能夠繪製一個全球人口分佈變化的動圖,相似以前寫的全球疫情變化趨勢圖。由於代碼跟上面相似,這裏就不貼,源碼包裏能找到。3d
上面的圖裏咱們只能定性的看到人口分佈,下面咱們定量地看看2019年全球人口top10的國家。code
# 2019年人口top10的國家
pop_total_2019_ordered = pop_total_2019.sort_values(by="2019" , ascending=False) pop_total_2019_ordered.head() 複製代碼
排序後發現Country Name
這列不僅是單個國家,還包括了地區概念,這並非咱們想要的。記得以前作疫情地圖的時候有一份國家中英文對應關係的名單,拿到這裏用一下。cdn
from countries_ch_to_en import countries_dict
pop_top10 = pop_total_2019_ordered[pop_total_2019_ordered['Country Name']\ .isin(countries_dict.keys())][:10] pop_top10 複製代碼
這樣看起來就正常了,用seaborn
將其繪製出來blog
import seaborn as sns
sns.barplot(y=pop_top10['Country Name'], x=pop_top10['2019']) 複製代碼
能夠看到,中國人口仍然位居全球第一,緊隨其後的是印度,三哥也是拼了。令我驚訝的是巴基斯坦那麼小的國土,人口超2億,全球排第五,真是方方面面都要跟三哥死磕。排序
看完人口絕對值的排行,咱們再來看看從2000年值2019年近20年時間各國人口增加率
pop_tmp = pop_total[pop_total['Country Name']\
.isin(pop_top10['Country Name'])][['Country Name', '2000', '2019']] pop_tmp['growth(%)'] = (pop_tmp['2019'] / pop_tmp['2000'] - 1) * 100 pop_tmp.sort_values(by="growth(%)" , ascending=False) 複製代碼
能夠看到,中國雖然人口基數比較大,但近20年人口增加率確比較低,增長最快的top3分別是尼日利亞、巴基斯坦和印度。
看完總人口數據後,咱們再看看性別分佈,仍是以2019年爲例
columns = ['Country Name', '2019']
# 抽數據,關聯 pop_sex_2019 = pop_total[columns].merge(pop_male[columns], on = 'Country Name') # 列名重命名 pop_sex_2019.rename(columns={'2019_x': 'total', '2019_y': 'male'}, inplace=True) # 篩選出國家 pop_sex_2019 = pop_sex_2019[pop_sex_2019['Country Name'].isin(countries_dict.keys())] # 計算女性人口 pop_sex_2019['female'] = pop_sex_2019['total'] - pop_sex_2019['male'] # 女性佔比與男性佔比的差值 pop_sex_2019['diff'] = (pop_sex_2019['female'] - pop_sex_2019['male']) / pop_sex_2019['total'] * 100 # 男性人口占比高於女性的 top15 sex_diff_top15 = pop_sex_2019.sort_values(by='diff')[0:15] sns.barplot(y=sex_diff_top15['Country Name'], x=sex_diff_top15['diff']) 複製代碼
第一名是卡塔爾,男性人口比女性高50%,我們中國男女比例也是失衡的,男性人口占比比女性高2%。
再來看看女性佔比比男性高的國家
sex_diff_top15 = pop_sex_2019.sort_values(by='diff', ascending=False)[0:15]
sns.barplot(y=sex_diff_top15['Country Name'], x=sex_diff_top15['diff']) 複製代碼
這個相差的幅度明顯沒那麼大,top1也就差了8%,而且這些國家都不是人口大國。那咱們來看看人口超過1億的國家有哪些是女性佔比超過男性
pop_sex_2019[pop_sex_2019['total'] > 100000000].sort_values(by='diff', ascending=False)[0:5]
複製代碼
能夠看到日本、墨西哥、巴西和美國這四我的口大國女性佔比超過了男性。
性別也瞭解的差很少了,咱們再來看看年齡分佈。由於我比較關注各國年輕人羣的佔比,因此咱們先對各國0-14歲人口占比進行排序。
pop_0_14_2019 = pop_total[columns].merge(pop_0_14[columns], on = 'Country Name')
pop_0_14_2019.rename(columns={'2019_x': 'total', '2019_y': '0_14'}, inplace=True) pop_0_14_2019['0_14_r(%)'] = pop_0_14_2019['0_14'] / pop_0_14_2019['total'] * 100 # 咱們仍然只看大於1億人的國家 pop_0_14_top = pop_0_14_2019[pop_0_14_2019['Country Name'].isin(countries_dict.keys())][pop_0_14_2019['total'] > 100000000]\ .sort_values(by='0_14_r(%)', ascending=False)[:15] sns.barplot(y=pop_0_14_top['Country Name'], x=pop_0_14_top['0_14_r(%)']) 複製代碼
能夠看到菲律賓、孟加拉國、印尼和印度等東南亞國家0-14歲人口占比遠超中國,甚至美國也比咱們要高。咱們只有17%,這也是近幾年世界工廠在往東南亞遷移的緣由。
最後,咱們再看看中國從1960年至2019年中國各年齡段人口占比的變化趨勢
# 篩選咱們須要的列
pop_0_14_ch = pop_0_14[pop_0_14['Country Name'] == 'China'].drop(['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code',\ 'Unnamed: 64'], axis=1) #列(年份)轉行 pop_0_14_ch_unstack = pop_0_14_ch.unstack() # 從新構造DateFrame pop_0_14_ch = pd.DataFrame(pop_0_14_ch_unstack.values, \ index=[x[0] for x in pop_0_14_ch_unstack.index.values], columns=['0_14']) pop_0_14_ch.head() 複製代碼
一樣的方式,處理一下其餘兩個年齡段
# 15-64歲
pop_15_64_ch = pop_15_64[pop_15_64['Country Name'] == 'China'].drop(['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code',\ 'Unnamed: 64'], axis=1) pop_15_64_ch_unstack = pop_15_64_ch.unstack() pop_15_64_ch = pd.DataFrame(pop_15_64_ch_unstack.values,\ index=[x[0] for x in pop_15_64_ch_unstack.index.values], columns=['15_64']) # 65歲以上 pop_65up_ch = pop_65up[pop_65up['Country Name'] == 'China'].drop(['Country Name', 'Country Code', 'Indicator Name', 'Indicator Code',\ 'Unnamed: 64'], axis=1) pop_65up_ch_unstack = pop_65up_ch.unstack() pop_65up_ch = pd.DataFrame(pop_65up_ch_unstack.values, \ index=[x[0] for x in pop_65up_ch_unstack.index.values], columns=['65up']) 複製代碼
將各年齡人口按照年份關聯起來,而後計算總人口以及各年齡段人口占比
pop_age_level = pop_0_14_ch.merge(pop_15_64_ch.merge(pop_65up_ch, left_index=True, right_index=True), left_index=True, right_index=True)
pop_age_level['total'] = pop_age_level['0_14'] + pop_age_level['15_64'] + pop_age_level['65up'] pop_age_level['0_14(%)'] = pop_age_level['0_14'] / pop_age_level['total'] * 100 pop_age_level['15_64(%)'] = pop_age_level['15_64'] / pop_age_level['total'] * 100 pop_age_level['65up(%)'] = pop_age_level['65up'] / pop_age_level['total'] * 100 pop_age_level.head() 複製代碼
最後咱們來畫一個堆疊柱狀圖展現
pop_age_level['year'] = pop_age_level.index
pop_age_level.plot.bar(x='year', y=['0_14(%)', '15_64(%)', '65up(%)'], stacked=True, figsize=(15,8), fontsize=10, rot=60) 複製代碼
能夠放大後看看,藍色的是0-14歲人口,六七十年代,中國0-14歲人口占比40%多,算是挺高的了,隨着80年代實行計劃生育,0-14歲人口開始降低,一直降到如今的17%,少的有點可憐了。如今國家放開二胎,也是但願將來咱們能有更多的年輕人,這樣才能加強咱們的國際競爭力。
個人分析就到這裏了,有興趣的朋友能夠自行探索,數據和源碼已經打包,公衆號回覆關鍵字人口便可。
歡迎公衆號 「渡碼」,輸出別地兒看不到的乾貨。