国民生活基礎統計のデータを使って統計っぽい事をする


はじめに

gaccoの「社会人のためのデータサイエンス」を受講している。すごく丁寧で分かりやすいので、おススメ。
ただ、動画見て勉強した気になってる気配が出てきたので、何かしらアウトプットする。
折角なので第2週までの成果を出したい。

肩慣らし

データの取得

データを取得して分散などを出してみる。まずはe-Statの国民生活基礎統計からよさげなデータを見繕う。
今回は21 都道府県(第227表~第259表)250 65歳以上の者のいる世帯数,世帯構造・都道府県-21大都市(再掲)別を選んだ。
65歳以上の者のいる世帯数,世帯構造・都道府県-21大都市(再掲)別
早速ダウンロードして開く

はい、いつもの奴

どうも文字コードがSJISっぽいのでvimで変換する。vimで開いて、

:e ++encoding=sjis
:set fenc=utf8

で保存して再度開くと文字化けがなおる。

UTF-8でも提供してほしい

CSVヘッダーがファンキーな理由は多分Excelごっこ大人の事情だ。
スペースで位置を合わせると何となくわかると思う

表にするとこんな感じ

column no column name
1 都道府県 21大都市
2 総数
3 単独世帯 - 総数
4 単独世帯 - 男性
5 単独世帯 - 女性
6 核家族世帯 - 総数
7 核家族世帯 - 夫婦のみ
8 核家族世帯 - 夫婦と子のみ
9 核家族世帯 - ひとり親と未婚の子のみ
10 三世代世帯
11 その他世代

データの整形

全部の項目は使わないので、データを絞る。都道府県だけに絞ってヘッダも削除する

cat h1250.csv  | sed '1,7d' | head -n 47

更に、項目も世帯総数と単独世帯の総数に絞る

cat h1250.csv  | sed '1,7d' | head -n 47 | awk -F, '{ printf("%s %s %s\n", $1, $2, $3); }' > stat_data.csv

こんな感じ

よくある統計量を出してみる

出すのは平均・分散・標準偏差。おさらい的に書くと、

項目 説明
平均 算術平均。全部足して項目数で割ったやつ
偏差 値から平均を差っ引いた奴
分散 偏差の2乗を全部足して項目数で割ったやつ
標準偏差 分散の平方根

まずは平均

datafile="stat_data.csv"

cat ${datafile} | \
  awk 'BEGIN{a=0;sum1=0;sum2=1;} {a++;sum1 += $2; sum2 += $3} END{printf("%s, %s\n", (sum1/a), (sum2/a));}'

世帯数の平均は544。単独世帯数の平均は156。
平均が出たら次は分散

datafile="stat_data.csv"
homeCountAvg=544
cat ${datafile} | \
  awk -v AVG=${homeCountAvg} 'BEGIN{sum=0} {sum += (($2 - AVG) ** 2)} END{printf("%s\n", sum / 47);}'
singleHomeCountAvg=156
cat ${datafile} | \
  awk -v AVG=${singleHomeCountAvg} 'BEGIN{sum=0} {sum += (($3 - AVG) ** 2)} END{printf("%s\n", sum / 47);}'

世帯数の分散は280,951。単独世帯数の分散は32,847。当たり前だがかなりばらつく。
分散が出たら標準偏差

datafile="stat_data.csv"
homeCountAvg=544
cat ${datafile} | \
  awk -v AVG=${homeCountAvg} 'BEGIN{sum=0} {sum += (($2 - AVG) ** 2)} END{printf("%s\n", sqrt(sum / 47));}'
singleHomeCountAvg=156
cat ${datafile} | \
  awk -v AVG=${singleHomeCountAvg} 'BEGIN{sum=0} {sum += (($3 - AVG) ** 2)} END{printf("%s\n", sqrt(sum / 47));}

世帯数の標準偏差は530。単独世帯数の標準偏差は181。
ついでに偏差値も出してみる。

項目 説明
偏差値 標準化した値 * 10 + 50
標準化した値 偏差 / 標準偏差
echo "世帯数の偏差値"
homeCountAvg=544
homeCountStdDiv=530
cat ${datafile} | \
  awk -v AVG=${homeCountAvg} -v STDDIV=${homeCountStdDiv} \
  '{printf("%s\t%s\n", $1, ($2 - AVG) / STDDIV * 10 + 50 );}'

echo "単独世帯数の偏差値"
singleHomeCountAvg=156
singleHomeCountStgDiv=181
cat ${datafile} | \
  awk -v AVG=${homeCountAvg} -v STDDIV=${homeCountStdDiv} \
  '{printf("%s\t%s\n", $1, ($3 - AVG) / STDDIV * 10 + 50 );}'


九州では福岡が偏差値トップ。佐賀がワースト(世帯数)

最後に無理くりヒストグラムを書いてみる

datafile="stat_data.csv"
echo "世帯数のヒストグラム"
cat ${datafile} | \
  awk '{print int($2/50)}' | \
  awk '{sums[$1] += 1} 
    END{
      for(key in sums) { 
        printf("%s - \t: ", (key * 50)); 
        for(i = 0; i < sums[key]; i++) { printf("+"); } 
        printf("\n"); 
      }
    }' 


echo "単独世帯数のヒストグラム"
cat ${datafile} | \
  awk '{print int($2/50)}' | \
  awk '{sums[$1] += 1} 
    END{
      for(key in sums) { 
        printf("%s - \t: ", (key * 50)); 
        for(i = 0; i < sums[key]; i++) { printf("+"); } 
        printf("\n"); 
      }
    }' 


大都市かけ離れすぎ問題

総世帯と単独世帯の関係を考える

軽く生まれ故郷の偏差値を確認したところで、世帯数と単独世帯数の関係を考えてみる。
大学の偉い先生たちから学んだことを生かす時だ。

まずは世帯数と単独世帯数に対して仮説を立てる。

単独世帯数が増えると世帯数も増える

何言ってんだコイツとか思わないで欲しい。考えるのが面倒だった。折角データがあるのだから色んな角度から仮説が正しい事を確認したい。

散布図で確かめる

まずはお手本通り散布図を書いてみる。流石にシェルでは厳しいのでGoogle Drive。

確かに右肩上がりの関係。単独世帯数が増えれば増えるほど世帯数が上がる。
ただし、これでは納得できない。数字で右肩上がりを確かめたい。

共分散で確かめる

右肩上がりを簡単に調べる方法と言えば共分散。共分散を計算してプラスなら右肩上がりだ。

項目 説明
共分散 y偏差 * x偏差の合計をデータ数で割ったやつ
echo "共分散"
datafile="stat_data.csv"
homeCountAvg=544
singleHomeCountAvg=156
cat ${datafile} | \
  awk -v YAVG=${homeCountAvg} -v XAVG=${singleHomeCountAvg} \
  'BEGIN{sum=0} {sum += ($2 - YAVG) * ($3 - XAVG)} END {print sum / 47}'

共分散は94789。確かに右肩上がり。ただこれだけでは、ともに右肩上がりと言うだけだ。

相関係数で確かめる

いい加減疲れてきたので最後にする。大学の偉い人が「相関係数はいいぞ」って言ってたから相関係数を出す。
と言うか散布図的に直線っぽいし、外れ値もそんなにない。相関係数が有用と判断した。

項目 説明
相関係数 共分散 / (y標準偏差 * x標準偏差)
echo '相関係数'
homeCountStdDiv=530
singleHomeCountStgDiv=181
echo "" | \
  awk -v YSTDDIV=${homeCountStdDiv} -v XSTDDIV=${singleHomeCountStgDiv} '{ printf("%s\n", 94798 / (YSTDDIV * XSTDDIV)); }'

相関係数は驚異の0.9882!!高い!これには俺も大満足。
世帯数を増やしたいなら単独世帯数を増やせばいい(当たり前)。

ふりかえり

どことなく間違ってる気もするけど、気にしない勇気は大事にしたいなと思った。