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"メソッドを加えるとシート名が取れます。実際に呼び出すとこんな感じ。
脱線しますが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 昭和60年 1985 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 昭和60年 1985 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='各世帯ごとの所得)
とても便利!。