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

事前準備

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

  • ipython
  • pandas
  • numpy
  • matplotlib

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

調査の概要|厚生労働省

所得に関するデータはページの下段にExcel形式で公開してあります。以下にリンク先を記載します。人類は皆Excelが大好きです。

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

PythonではPandasを使ってExcelファイルを直接読み込むことができます。素のPythonを使っても良いですが、iPythonの方が補完が聞いて楽です。

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

とても便利!。


スポンサード リンク