読者です 読者をやめる 読者になる 読者になる

初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

スポンサーリンク

Python Pandasをさわってみる(5)



Pandasっぽい(?)操作をもっとしてみよう。

前回の記事で、生データのCSVをDataFrameに読み込んで列を追加とかしてみた。

osa030.hatenablog.com

もう少し、色々としてみよう。

動作環境

環境

OS Windows 8.1(64bit)
Python 2.7.9(32bit)
Pandas 0.16.2

対象データ

政府が公開している統計データEXCELファイルを変換したCSVファイル。フォーマットは以下。

year 西暦
prefecture 都道府県名
young 0-14歳の人口
adult 15-64歳の人口
elder 65歳以上の人口

詳細は、以下の記事を参照

osa030.hatenablog.com

以下は全部「ipython」での実行。Pandasの詳細は以下を参考にした。

pandas: powerful Python data analysis toolkit — pandas 0.16.2 documentation

復習

In [1]: import pandas as pd
In [2]: df = pd.read_csv("./1970-2014.csv",na_values='-')
In [3]: df['total'] = df.young + df.adult + df.elder
In [4]: df['aging'] = (df.elder / df.total * 100).round(2)

高齢化率でソートしてみる

1970年のデータ

  • 高齢化率が低い県TOP5
In [5]: df[df.year == 1970].sort(columns='aging').head(5)
Out[5]:
     year     prefecture  young  adult  elder  total  aging
390  1970        神奈川県      1302   3915    256   5473   4.68
300  1970         埼玉県      1003   2665    199   3867   5.15
780  1970         大阪府      1821   5406    394   7621   5.17
360  1970         東京都      2401   8417    591  11409   5.18
660  1970         愛知県      1310   3769    308   5387   5.72
  • 高齢化率が高い県TOP5
In [6]: df[df.year == 1970].sort(columns='aging',ascending=False).head(5)
Out[6]:
      year   prefecture  young  adult  elder  total  aging
1140  1970        高知県      172    525     90    787  11.44
930   1970        島根県      178    508     87    773  11.25
1350  1970       鹿児島県      469   1086    174   1729  10.06
900   1970        鳥取県      132    380     57    569  10.02
960   1970        岡山県      385   1156    166   1707   9.72

2014年のデータ

  • 高齢化率が低い県TOP5
In [7]: df[df.year == 2014].sort(columns='aging').head(5)
Out[7]:
      year     prefecture  young  adult  elder  total  aging
2114  2014         沖縄県       249    903    270   1422  18.99
2080  2014         東京都      1517   8862   3011  13390  22.49
2090  2014         愛知県      1041   4686   1728   7455  23.18
2081  2014        神奈川県      1161   5820   2115   9096  23.25
2092  2014         滋賀県       207    877    332   1416  23.45
  • 高齢化率が高い県TOP5
In [8]: df[df.year == 2014].sort(columns='aging',ascending=False).head(5)
Out[8]:
      year prefecture  young  adult  elder  total  aging
2072  2014        秋田県    112    587    339   1038  32.66
2106  2014        高知県     86    414    237    737  32.16
2099  2014        島根県     88    387    221    696  31.75
2102  2014        山口県    174    793    441   1408  31.32
2097  2014       和歌山県    119    556    296    971  30.48

それっぽいことやった気がする。

都道府県別の値から全国の値を求める

無効な年度のデータを除外する

In [1]: import pandas as pd
In [2]: df = pd.read_csv("./1970-2014.csv",na_values='-')
  • 無効なデータを確認する
In [3]: df[pd.isnull(df).any(axis=1)]
Out[3]:
      year prefecture  young  adult  elder
1380  1970        沖縄県    NaN    NaN    NaN
1381  1971        沖縄県    NaN    NaN    NaN
  • 無効なデータが含まれている年度のデータを除外したDataFrameオブジェクトを生成
In [4]: df = df[~df.year.isin([1970,1971])]

年度別の総人口を算出してみる

  • 総人口列を追加して年度別に集計
In [5]: df['total'] = df.young + df.adult + df.elder
In [6]: df2 = df.groupby(df.year).sum()

df2はDataFrameオブジェクトではなく、GroupByオブジェクトとなる。扱いは大体同じだけどメソッドとかメソッドパラメータが違う。

  • 年度別の総人口の確認
In [7]: df2.head(5)
Out[7]:
       year  young  adult  elder   total
year
1972  92684  25972  73484   7877  107333
1973  92731  26448  74104   8159  108711
1974  92778  26851  74744   8459  110054
1975  92825  27229  75836   8869  111934
1976  92872  27494  76393   9202  113089

実は、この値はCSV変換前のEXCELデータに記載されている全国値と違うのだけれど、各都道府県別の値の合計値としては正しい。

年度別の全国の高齢化率を算出してみる

  • 高齢化率の列追加
In [10]: df2['aging'] = (df2.elder / df2.total * 100).round(2)
  • 年度別の高齢化率の確認
In [11]: df2.head(5)
Out[11]:
       year  young  adult  elder   total  aging
year
1972  92684  25972  73484   7877  107333   7.34
1973  92731  26448  74104   8159  108711   7.51
1974  92778  26851  74744   8459  110054   7.69
1975  92825  27229  75836   8869  111934   7.92
1976  92872  27494  76393   9202  113089   8.14

おお、それっぽい。

グラフ化してみる

年度別の全国の年齢(三区分)の推移

グラフを生成する為のインポートを追加する。

  • インポート
In [1]: import pandas as pd
In [2]: import matplotlib.pyplot as plt
In [3]: import matplotlib
In [4]: matplotlib.style.use('ggplot')

最後の2行はグラフのスタイルを変えたいのでやっているのでなくてもグラフはできる。

  • CSVからDataFrameに読出後、対象外年度データを削除して年度別に集計したGroupByオブジェクトを生成
In [5]: df = pd.read_csv("./1970-2014.csv",na_values='-')
In [6]: df = df[~df.year.isin([1970,1971])]
In [7]: df2 = df.groupby(df.year).sum()
  • グラフ生成
In [8]: df2.plot(kind='bar', stacked=True)
Out[8]: <matplotlib.axes._subplots.AxesSubplot at 0x5ecf610>

In [9]: plt.savefig('1972-2014-population.png')

f:id:osa030:20150624212047p:plain

こうやって可視化すると、総人口が頭打ちになっており人口内の割合のうち、65歳の高齢者が増加して14歳以下の若者が減っているのがよくわかるね。

年度別の全国の高齢化率の推移

  • 高齢化率算出~グラフ生成
In [10]: plt.clf() # グラフのクリア
In [11]: df2['agingrate'] = (df2.elder / df2.sum(axis=1) * 100).round(2)
In [12]: df2.plot(y='agingrate')
Out[12]: <matplotlib.axes._subplots.AxesSubplot at 0x6188670>

In [13]: plt.savefig('1972-2014-agingrate.png')

プロットするときに"agingrate"のみY軸に指定するのがコツ。

f:id:osa030:20150624212058p:plain

高齢化率だけみると更にやばい状況がよくわかる。

単年度の都道府県の年齢区分別円グラフ

DataFrameから直接円グラフを書く方法がわからなかったので、抽出したDataFrameからSeriesオブジェクトを生成している。

  • 1972年の埼玉県のデータを抽出
In [14]: plt.clf() # グラフのクリア
In [15]: df3 = df[(df.year == 1972) & (df.prefecture == '埼玉県')].ix[:,2:]
In [16]: df3
Out[16]:
     young  adult  elder
302   1141   2910    217
  • 抽出したDataFrameを用いてSeriesオブジェクトを生成し円グラフ化
In [17]: s1 = pd.Series(df3.values[0], index=df3.columns.tolist(),name='1972-Saitama')
In [18]: s1.plot(kind='pie',autopct='%.2f',figsize=(6,6),startangle=90)
Out[18]: <matplotlib.axes._subplots.AxesSubplot at 0x6298990>

In [19]: plt.savefig('1972-saitama.png')

f:id:osa030:20150624212114p:plain

  • 2014年の埼玉県のデータを抽出
In [20]: plt.clf() # グラフのクリア
In [21]: df4 = df[(df.year == 2014) & (df.prefecture == '埼玉県')].ix[:,2:]
In [22]: df4
Out[22]:
      young  adult  elder
2078    929   4573   1737
  • 抽出したDataFrameを用いてSeriesオブジェクトを生成し円グラフ化
In [23]: s2 = pd.Series(df4.values[0], index=df4.columns.tolist(),name='2014-Saitama')
In [24]: s2.plot(kind='pie',autopct='%.2f',figsize=(6,6),startangle=90)
Out[24]: <matplotlib.axes._subplots.AxesSubplot at 0x5f77050>

In [25]: plt.savefig('2014-saitama.png')

f:id:osa030:20150624212126p:plain

  • 左「1972年」右「2014年」

f:id:osa030:20150624211926j:plainf:id:osa030:20150624211936j:plain

軸の固定がうまく言ってないので比較して見難いけど、並べてみると若年層の減った分がそのまま高齢者層に移ったように見えますな。

どうなる埼玉、いや日本

たのしいインフォグラフィック入門

たのしいインフォグラフィック入門

スポンサーリンク