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

# はじめに

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

# 肩慣らし

## データの取得

データを取得して分散などを出してみる。まずは[e-Statの国民生活基礎統計](https://www.e-stat.go.jp/stat-search/files?page=1&toukei=00450061)からよさげなデータを見繕う。
今回は`21 都道府県（第227表～第259表）`の`250 65歳以上の者のいる世帯数，世帯構造・都道府県－21大都市（再掲）別`を選んだ。
[65歳以上の者のいる世帯数，世帯構造・都道府県－21大都市（再掲）別](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00450061&tstat=000001141126&cycle=7&tclass1=000001141127&tclass2=000001141134&stat_infid=000031955294&tclass3val=0)
早速ダウンロードして開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/e9274734-9454-dad9-d793-c0a215b3d059.png)


<font color="dark_pink">はい、いつもの奴</font>

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/84a0db13-1cce-3d45-f1ee-c3a58c60026e.png)

<font color="dark_pink">UTF-8でも提供してほしい</font>

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/71c445dc-0d9a-9711-b42c-ffad09e28405.png)

表にするとこんな感じ

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

## データの整形

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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/78b0067a-1b71-ce08-28d7-8957d0f98f7e.png)

<font color='dark_pink'>こんな感じ</font>

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

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

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

まずは平均

```shell
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。
平均が出たら次は分散

```shell
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。当たり前だがかなりばらつく。
分散が出たら標準偏差

```shell
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 |
| 標準化した値 | 偏差 / 標準偏差 |

```shell
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/a932686c-7db5-a1dd-acc6-2cad8acf0816.png)
<font color="dark_pink">九州では福岡が偏差値トップ。佐賀がワースト(世帯数)</font>

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

```shell
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/37c4fc04-db91-790c-7867-081500b8c5b0.png)
<font color="dark_pink">大都市かけ離れすぎ問題</font>

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

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

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

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

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

## 散布図で確かめる

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/c20746f0-3d71-3cb6-b048-0d3b8ff8b64a.png)

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

## 共分散で確かめる

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

| 項目 | 説明 |
| :----- | :----- |
| 共分散 | y偏差 * x偏差の合計をデータ数で割ったやつ |

```shell
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標準偏差) |

```shell
echo '相関係数'
homeCountStdDiv=530
singleHomeCountStgDiv=181
echo "" | \
  awk -v YSTDDIV=${homeCountStdDiv} -v XSTDDIV=${singleHomeCountStgDiv} '{ printf("%s\n", 94798 / (YSTDDIV * XSTDDIV)); }'
```

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

# ふりかえり

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