1. 程式人生 > >Python資料分析之全球人口資料

Python資料分析之全球人口資料

這篇文章用pandas對全球的人口資料做個簡單分析。我收集全球各國1960-2019年人口資料,包含男女和不同年齡段,共6個檔案。

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讀取檔案資料

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_femalepop_malepop_0_14pop_15_64pop_65up

為了直觀觀察全球人口分佈,我們用pyecharts繪製2019年全球人口分佈地圖

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年的資料,所以我們還可以繪製一個全球人口分佈變化的動圖,類似之前寫的全球疫情變化趨勢圖。因為程式碼跟上面類似,這裡就不貼,原始碼包裡能找到。

上面的圖裡我們只能定性的看到人口分佈,下面我們定量地看看2019年全球人口top10的國家。

# 2019年人口top10的國家
pop_total_2019_ordered = pop_total_2019.sort_values(by="2019" , ascending=False)
pop_total_2019_ordered.head()

排序後發現Country Name這列不只是單個國家,還包括了地區概念,這並不是我們想要的。記得之前做疫情地圖的時候有一份國家中英文對應關係的名單,拿到這裡用一下。

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將其繪製出來

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%,少的有點可憐了。現在國家放開二胎,也是希望未來我們能有更多的年輕人,這樣才能增強我們的國際競爭力。

我的分析就到這裡了,有興趣的朋友可以自行探索,資料和原始碼已經打包,公眾號回覆關鍵字人口即可。

歡迎公眾號 **「渡碼」**,輸出別地兒看不到的乾貨。

相關推薦

Python資料分析全球人口資料

這篇文章用pandas對全球的人口資料做個簡單分析。我收集全球各國1960-2019年人口資料,包含男女和不同年齡段,共6個檔案。 pop_total.csv: 各國每年總人口 pop_female.csv:各國每年女性人口 pop_male.csv: 各國每年男性人口 pop_0_14.csv: 各國每年0

Python資料分析pandas基本資料結構:Series、DataFrame

1引言 本文總結Pandas中兩種常用的資料型別: (1)Series是一種一維的帶標籤陣列物件。 (2)DataFrame,二維,Series容器 2 Series陣列 2.1 Series陣列構成 Series陣列物件由兩部分構成: 值(value):一維陣列的各元素值,是一個ndarr

「機器學習」Python資料分析Numpy進階

請點選此處輸入圖片描述 進階 廣播法則(rule) 廣播法則能使通用函式有意義地處理不具有相同形狀的輸入。 廣播第一法則是,如果所有的輸入陣列維度不都相同,一個“1”將被重複地新增在維度較小的陣列上直至所有的陣列擁有一樣的維度。 廣播第二法則確定長度為1的陣列沿著特

「機器學習」Python資料分析Numpy

請點選此處輸入圖片描述 NumPy的主要物件是同種元素的多維陣列。這是一個所有的元素都是一種型別、通過一個正整數元組索引的元素表格(通常是元素是數字)。在NumPy中維度(dimensions)叫做軸(axes),軸的個數叫做秩(rank)。 例如,在3D空間一個點的座標[1,

Python資料分析讀取檔案 python 程式語言

Python的資料分析,大部分的教程都是想講numpy,再講Dataframe,再講讀取檔案。但我看書的時候,前面二章看的實在頭暈,所以,我們還是通過讀取檔案來開始我們的Python資料分析吧。 讀取CSV 讀取csv通過read_csv讀取python程式語言學習QQ群 5152672

python資料分析numpy

(1)在numpy中呼叫numpy.lookfor('keyword')檢視numpy中的所有關鍵字及函式; (2)numpy中的操作物件是array(矩陣),且array中的資料都為相同型別; (3)用numpy.genfromtxt()函式讀.txt檔案; (4)生成矩陣:用numpy.arange

利用Python進行資料分析第七章 記錄2 資料規整化:清理、轉換、合併、重塑

索引上的合併 DataFrame中傳入引數left_index=True或者right_index=True(或者兩個都傳入),表示DataFrame的index(索引)被用作兩個DataFrame連線的連線鍵,如下: dataframe1 = DataFrame({'key':

利用Python進行資料分析第七章記錄 資料規整化:清理、轉換、合併、重塑

合併資料集: pandas物件中的資料可以通過一些內建的方式進行合併: pandas.merge可根據一個或多個鍵將不同DataFrame中的行連線起來。SQL或其它關係型資料庫的使用者對此應該會比較熟悉,因為它實現的就是資料庫的連線操作。 pandas.concat可以沿著一條軸將多個

Python Pandas 做資料分析玩轉 Excel 報表分析

Python Pandas 是大資料分析的基礎,這裡將分享和Excel報表相關的分析技巧,都是工作中的實戰內容。 本場 Chat 主要內容: Excel、CSV 資料的讀、寫、儲存; DataFrame 的 Index、Columns 相關操作; loc、iloc、XS 和 Mul

Python資料分析numpy的使用

在完成了自己的一個小目標後,想繼續往資料探勘和資料分析的方向前進,接下來會陸陸續續的完成學習筆記,方便日後的回顧。在之前的部落格裡有一篇關於numpy的使用:https://blog.csdn.net/totoro1745/article/details/79243465,這裡是進行相關

python資料分析你不知道的bra

  曾經,我把目光放在你身體上四分位的地方,發現了世界的美好。。。 之後,山水流轉,時光荏苒,不再從前。。。 此一文,獻給過往。 先上張圖:好奇怪,為什麼是這麼個比例[皺眉] 這篇文章分為兩個部分,python爬蟲和資料分析。爬取京東bra一些資料,並進行分析

資料分析Python資料匯入

'''資料匯入''' import pandas as pda i=pda.read_csv('E:/programCode/jd.csv',encoding='gb18030') i.describe() #按照某一列進行排序 i.sort_values(by='238')#2

Python資料分析pandas資料視覺化 python

Python資料視覺化常用的是matplotlib庫,matplotlib是底層庫,今天學了pandas的資料視覺化,相對於matplotlib庫來說,簡單許多。 折線圖 %matplotlib inline import numpy as np import

Python資料分析numpy包

numpy使用示例 前言 示例程式碼 參考資料 前言 numpy,全稱numeric python,是一個由多維陣列物件和用於處理陣列的例程集合組成的庫,是python資料分析中最基礎

Python資料分析路| 入門起航篇

資料分析準備工作 1.資料分析工具 工欲善其事,必先利其器,網上有很多關於資料分析的文章,相信大家一定聽過R語言和Python之爭,而且各有千秋,R語言在學術界更流行,但是在做專案上面我個人比較喜歡Python,Python更通用,更簡潔,文件也很多,而且有大量的庫特別是Google,Fac

【MOOC】Python資料分析與展示-北京理工大學-【第〇周】資料分析前奏

課程內容導學 主題思想 與一組資料相關的那些事兒: 如何理解一組資料表達的含義 有損地提取資料特徵 內容組織 全課程包括: • 8個內容單元,共12個單元 • 全課程總長4周,每週3個單元 • 每週包含一個實戰型例項 程式

python資料分析matplotlib繪圖

matplotlib繪圖 Series和DataFrame都有一個用於生成各類圖表的plot方法。預設情況下,它們所生成的是線形圖 %matplotlib inline 是IPython 中的一個魔法函式。 以下命令都是在瀏覽器中輸入。 cmd命令視窗輸

Python資料分析pandas入門

一、pandas庫簡介 pandas是一個專門用於資料分析的開源Python庫,目前很多使用Python分析資料的專業人員都將pandas作為基礎工具來使用。pandas是以Numpy作為基礎來設計開發的,Numpy是大量Python資料科學計算庫的基礎,pandas以此為基礎,在計算方面具有很高的效能

【MOOC】Python資料分析與展示-北京理工大學-【第一週】資料分析表示

單元一:NumPy庫入門 1.1 資料的維度 維度:一組資料的組織形式 一維資料 一維資料由對等關係的有序或無序資料構成,採用線性方式組織,對應列表、陣列和集合等概念 如:3.1413, 3.1398, 3.1404, 3.1401, 3.13

python 資料分析 用pandas和seaborn繪圖

matplotlib是一個相對底層的工具。pandas自身有內建的視覺化工具。另一個庫seaborn則是用來做一些統計圖形。 匯入seaborn會改變matlotlib預設的顏色和繪圖樣式,提高可讀性和美感。即使不適用seaborn的API,也可以利用seabo