2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

はじめに

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

肩慣らし

データの取得

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

image.png

はい、いつもの奴

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

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

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

image.png

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

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

image.png

表にするとこんな感じ

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

image.png

こんな感じ

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

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

項目 説明
平均 算術平均。全部足して項目数で割ったやつ
偏差 値から平均を差っ引いた奴
分散 偏差の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 );}'

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

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

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"); 
      }
    }' 

image.png
大都市かけ離れすぎ問題

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

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

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

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

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

散布図で確かめる

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

image.png

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

共分散で確かめる

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

項目 説明
共分散 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!!高い!これには俺も大満足。
世帯数を増やしたいなら単独世帯数を増やせばいい(当たり前)。

ふりかえり

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?