pythonでエクセルデータを加工して人口ピラミッドを作りました。
jupyternotebookを使用して、エクセルをDataFrameとして読み込み加工してグラフを作成しました。
人口ピラミッドはよくあるグラフなので、探せば手に入れることは容易ですが、自分で作ることで改めて人口分布のすごさに気づきました。
グラフを自作するメリット:深く気づくことができる
人口のことなど、はっきり言って深く考えたことはなかったのですが、今回グラフを作ってみて再認識したことは20代、30代の人口の少なさでした。日本ヤバいのでは?と思ってしまいました。
今後、人口問題についても勉強していく気になったのですが、やはり自分でデータから目に見えるものを作ることは大切だと思いました。
以下コードです。(素人コードですがお許しくださいね。)
政府の統計データを読み込みます。 データは総務省統計局(http://www.stat.go.jp/data/jinsui/2016np/)の 第1表(http://www.stat.go.jp/data/jinsui/2016np/zuhyou/05k28-1.xls)を使用
import pandas as pd import matplotlib.pyplot as plt df = pd.read_excel(r"C:\Users\ken_2\Desktop\collected_data\jp_population_generation.xls") df.head(15)
読み込むと欠損値が多く、またインデックスがマルチインデックスであったりと扱いづらかったので加工しました。
df1 = df.dropna() df1.columns = [0,'年齢','男女','男','女',5,6,7,8,9]
インデックスが2重リストになっていて、0歳~49歳の人口が取り出せないので、reset_index()で新たにインデックスを指定し、columnsにも新たに値を指定しました。
df2 = df1.reset_index() df2.columns = ['年齢','男女','男','女',5,6,7,8,0,'年齢'.'男女','男','女',5,6,7,8,9]
年齢の部分をインデックスに再指定し、コラムの男女・男・女以外は不要なので削除します。
del df2[~] #~に消したいコラムを入れます。
コラムを再定義し、データを0歳~49歳、50歳~99歳に分けます。
df2.columns =['年齢A','男女A','男A','女A','年齢B','男女B','男B','女B'] df3 = df2.drop([,'年齢B','男女B','男B','女B'],axis=1) df4 = df2.drop(['年齢A','男女A','男A','女A'],axis=1) df3.loc[0,'年齢A'] = '0' df4.loc[0,'年齢B'] = '50'
次は、グラフを作成します。今回はサブプロットx4で表記しました。
fig = plt.figure(figsize=(15,17)) ax1 = fig.add_subplot(222)#男50~100 ax2 = fig.add_subplot(224)#男1~49 ax3 = fig.add_subplot(221)#女50~100 ax4 = fig.add_subplot(223)#女1~49 #subplotの間隔を調整する plt.subplots_adjust(wspace=0.1, hsapce=0.05) ax1.barh(df4['年齢B'],df4['男B'],color='blue', label='男性') ax2.barh(df3['年齢A'],df3['男A'],color='blue') ax3.barh(df4['年齢B'],df4['女B'],color='red', label='女性') ax4.barh(df3['年齢A'],df3['女A'],color='red') #y軸中心にx軸を反転させる ax3.invert_xaxis() ax4.invert_xaxis() ax1.legend() ax3.legend() plt.show()

上手な方法ではありませんが出来ました。元のエクセルデータを加工すれば簡単ですが、今回は面倒ですがデータフレームにて加工を行いました。
2017年のデータですが、グラフを見てみると65~70歳と40~45歳ぐらいで人口のピークがあります。でもその後のピークがありません。冒頭でも書きましたが、10代、20代は特に少ないと感じてしまいます。
僕が今まで人口に関する本で読んだことがあるのは、速水融さんの歴史人口学関係です。歴史的に人口の考察がされていて非常に面白い本です。
![]() |
価格:1,274円 |
![]() |
【中古】 歴史人口学の世界 /速水融(著者) 【中古】afb 価格:822円 |

