Pythonで厚生労働省が公開する世帯所得データを解析する

事前準備

作業内容は表題の通り。環境はPython3を基本にして以下を使用する。事前にライブラリのインストールが必要。

  • ipython
  • pandas
  • numpy
  • matplotlib

元データは厚生労働省が公開している”平成25年 国民生活基礎調査の概況”を利用。

調査の概要|厚生労働省

所得に関するデータはページの下段にExcel形式で公開してある。直リンク先は以下参照。

http://www.mhlw.go.jp/toukei/saikin/hw/k-tyosa/k-tyosa13/xls/10.xls

PythonではPandasを使ってExcelファイルを読み込むことができる。MacOSならコンソール、WindowsならターミナルかPowerShell ISEを使ってipythonを起動。ダウンロードしたファイルを作業環境に移動させて起動させると捗る。

matplotlibを使いたいので、ipython起動時にpylabオプションを付ける。

ipython --pylab

pylabオプションでipythonを読み込めば、matplotlibのGUIをバックエンドで起動した状態で作業が出来る。

ただ、GUI関連のライブラリが足りないことでエラーが起きるかもしれない。これはエラーメッセージから必要なライブラリを読み取って、別途pipで落としてくる。TkとかPyQtとかヤバそう。

Excelファイルの読み込み

まずは必要なライブラリをインポート。

import pandas as pd
import numpy as np

pandas を使ってデータを読みこもう。

Mhlw_syotoku_excel = pd.ExcelFile('syotoku.xls')

ファイルの容量によって読み込みまでに時間がかかる。最近のPCで上記のファイルだと数秒といったところ。

ご存知の通り、Excelファイルはシートが別々に存在して、困ったことにシート名は担当者の意思に依存する。何枚あるかもわかんない。読み出したファイルからExcelのシートを確認してみよう。

Mhlw_syotoku_excel.sheet_names

読み込んだ変数に"sheet_names"メソッドを加えるとシート名が取れる。実際に呼び出すとこんな感じ。

f:id:kazutaka83:20150221132754p:plain

脱線するけどExcelの空白シートを残してる人はなんだかなーという感じがするので、無駄なシートは削除しとくと良い。 Excelの設定で起動時のシート数を制御できるので、新入社員の皆さんは1枚にしとくと良いです。

ExcelファイルをPythonで呼び出す

データを解析するためにExcelの各シートを行列の形に読み込む。

Mhlw_syotoku_sheet1 = Mhlw_syotoku_excel.parse('Ⅱ -図13データ')

これでシート名"Ⅱ -図13データ"を変数に格納することができた。こんなやり方は微妙すぎるので、せっかくだからこっちで書こう。

Mhlw_syotoku_sheet1 = Mhlw_syotoku_excel.parse(Mhlw_syotoku_excel.sheet_names[2])

sheet_namesはリストのような形式なので、引数を与えることで格納された文字列を返すことが出来る。便利。

じゃあこれで解析できるようになるかというと微妙。呼び出してみると変なNaNデータがたくさんある。

Mhlw_syotoku_sheet1
13データ 1世帯当たり平均所得金額の年次推移  Unnamed: 1 Unnamed: 2 Unnamed: 3 Unnamed: 4
NaN                       NaN         NaN        NaN        NaN        NaN
NaN                       NaN         NaN        全世帯      高齢者世帯    児童のいる世帯
NaN                     昭和601985      493.3      210.6      539.8
NaN                       61           86      505.6      235.4      557.2
NaN                       62           87      513.2      233.5      562.6
NaN                       63           88      545.3      244.4      603.5
NaN                      平成元年          89      566.7      248.3      626.4
NaN                        2           90      596.6      263.9      670.4
NaN                        3           91      628.8      273.7      710.6
NaN                        4           92      647.8        296      727.5
NaN                        5           93      657.5      292.8      745.6
NaN                        6           94      664.2        305      758.6
NaN                        7           95      659.6      316.9      737.2
NaN                        8           96      661.2        316      781.6
NaN                        9           97      657.7      323.1      767.1
NaN                       10           98      655.2      335.5      747.4
NaN                       11           99        626      328.9      721.4
NaN                       12         2000      616.9      319.5      725.8
NaN                       13            1        602      304.6      727.2
NaN                       14            2      589.3      304.6      702.7
NaN                       15            3      579.7      290.9      702.6
NaN                       16            4      580.4      296.1      714.9
NaN                       17            5      563.8      301.9        718
NaN                       18            6      566.8      306.3      701.2
NaN                       19            7      556.2      298.9      691.4
NaN                       20            8      547.5        297      688.5
NaN                       21            9      549.6      307.9      697.3
NaN                       NaN         NaN        NaN        NaN        NaN
NaN  注:平成6年の数値は、兵庫県を除いたものである。         NaN        NaN        NaN        NaN

元のデータを見たらわかるのだけど、上の方の行に無駄なものもある。左の列も無駄。下も、、無駄か。

データを成形する

pandasで必要ない行と列を消そう。行を上から消す場合には"skiprows"、下から消す場合は"skip_footer"を使う。

Mhlw_syotoku_sheet1 = Mhlw_syotoku_excel.parse(Mhlw_syotoku_excel.sheet_names[2]),skiprows=2

これで先頭の3行が消える。末尾も消したい場合には以下。

Mhlw_syotoku_sheet1 = Mhlw_syotoku_excel.parse(Mhlw_syotoku_excel.sheet_names[2]),skiprows=2,skip_footer=2

下のコマンドで表を成形するとこんな感じ。

    Unnamed: 0 Unnamed: 1  Unnamed: 2    全世帯  高齢者世帯  児童のいる世帯
0          NaN      昭和601985  493.3  210.6    539.8
1          NaN        61           86  505.6  235.4    557.2
2          NaN        62           87  513.2  233.5    562.6
3          NaN        63           88  545.3  244.4    603.5
4          NaN       平成元年          89  566.7  248.3    626.4
5          NaN         2           90  596.6  263.9    670.4
6          NaN         3           91  628.8  273.7    710.6
7          NaN         4           92  647.8  296.0    727.5
8          NaN         5           93  657.5  292.8    745.6
9          NaN         6           94  664.2  305.0    758.6
10         NaN         7           95  659.6  316.9    737.2
11         NaN         8           96  661.2  316.0    781.6
12         NaN         9           97  657.7  323.1    767.1
13         NaN        10           98  655.2  335.5    747.4
14         NaN        11           99  626.0  328.9    721.4
15         NaN        12         2000  616.9  319.5    725.8
16         NaN        13            1  602.0  304.6    727.2
17         NaN        14            2  589.3  304.6    702.7
18         NaN        15            3  579.7  290.9    702.6
19         NaN        16            4  580.4  296.1    714.9
20         NaN        17            5  563.8  301.9    718.0
21         NaN        18            6  566.8  306.3    701.2
22         NaN        19            7  556.2  298.9    691.4
23         NaN        20            8  547.5  297.0    688.5
24         NaN        21            9  549.6  307.9    697.3

行列のように考えて表を呼び出せる。全世帯の所得を見たいのであればこういう風に。

In [29]: Mhlw_syotoku_sheet1['全世帯']
Out[29]: 
0     493.3
1     505.6
2     513.2
3     545.3
4     566.7
5     596.6
6     628.8
7     647.8
8     657.5
9     664.2
10    659.6
11    661.2
12    657.7
13    655.2
14    626.0
15    616.9
16    602.0
17    589.3
18    579.7
19    580.4
20    563.8
21    566.8
22    556.2
23    547.5
24    549.6
Name: 全世帯, dtype: float64

世帯別所得のグラフ化

格納されている"全世帯"、"高齢者世帯"、"児童のいる世帯"の折れ線グラフを作ってみる。pandasで作成した行列の複数の特定要素を取り出すには以下のコマンドを叩く。

Mhlw_syotoku_sheet1[['全世帯','高齢者世帯','児童のいる世帯']]

ipythonの起動時にpylabを読み込んでるので、plotメソッドを呼ぶことでグラフが起動する。

Mhlw_syotoku_sheet1[['全世帯','高齢者世帯','児童のいる世帯']].plot(title='各世帯ごとの所得)

f:id:kazutaka83:20150221143754p:plain

とても便利!。


スポンサード リンク