都道府県の犯罪認知件数は何が関係しているか調べる。



*プログラミング・統計学習者です。
間違えている箇所もあると思いますので、申し訳ございませんがご指摘していただきますと大変助かります。*

[前回の方法](https://qiita.com/moco_gram/items/3a695d727ee04ec4e066)

を用いて今回は都道府県の犯罪認知件数は何が関係しているか調べてみます。

よく言われているように外国人が増えると犯罪が増える。
という俗説は本当なのか調べます。個人的には欺瞞だと思います。

2016年の人口推計データと犯罪統計データの一式を統計局からダウンロードします。

```python
# 2016年の人口推計
df_target = df[(df['STAT_NAME_val'] == '人口推計') &
               df['SURVEY_DATE'].str.startswith('2016')]
e_stat_utils.save_data_multi(p_id, df_target['id'].values, dir_path,
                             [df_target['GOV_ORG_code'].values,
                              df_target['id'].values,
                              df_target['TITLE_val'].values,
                              df_target['SURVEY_DATE'].values])
 # 2016年の犯罪統計                           
df_target = df[(df['STAT_NAME_val'] == '犯罪統計') &
               df['SURVEY_DATE'].str.startswith('2016')]
e_stat_utils.save_data_multi(p_id, df_target['id'].values, dir_path,
                             [df_target['GOV_ORG_code'].values,
                              df_target['id'].values,
                              df_target['TITLE_val'].values,
                              df_target['SURVEY_DATE'].values])
```

何故2016年かというと、統計局が現時点で出している最新の犯罪統計が2016年であるためです。
まずは2016年の認知件数等を見ていきます。

```python
def show_columns(dfl, num=10):
    for i in dfl.columns:
        print('----------------')
        print(i)
        print(dfl[i].nunique(), 'ユニーク')
        print(dfl[i].unique()[:num])
```

上記コードにてカラムに含まれる各ユニークをみたところ、結構いらない情報が含まれていたため、2016年の47都道府県、認知件数でソート済みのデータに整形します。

```python
title = '00130_0003195002_nan_第３表　刑法犯総数　都道府県別　認知・検挙件数・検挙人員.csv'
df_crim = pd.read_csv(dir_path + title)
#objをflaot変換しさらに数値以外を0に変換
df_crim["value"] = pd.to_numeric(df_crim["value"], errors='coerce').fillna(0)
#2016年、47都道府県以外落として降順ソート
df_crim = df_crim[(df_crim['時間軸(年次)'] == '2016年')].sort_values('value', ascending=False)
drop_list = ['全国', '21大都市計', '札幌市', '仙台市', '千葉市', '東京都特別区部', '横浜市', '川崎市', '名古屋市', '京都市', '大阪市', '神戸市', '広島市', '北九州市','福岡市', '札幌方面', '函館方面', '旭川方面', '釧路方面', '北見方面', '東北管区','さいたま市', '静岡市', '堺市', '新潟市', '浜松市', '岡山市', '相模原市', '熊本市','中部管区', '近畿管区', '中国管区', '四国管区', '関東管区', '関東管区', '九州管区']

for i in drop_list:
    df_crim = df_crim[(df_crim['管区警察局'] != i)]
```

プロットしてみます。

```python
g = sns.catplot(x='管区警察局', y='value', hue='認知・検挙件数・検挙人員', data=df_crim,  col='認知・検挙件数・検挙人員',
                estimator=np.mean,sharex=False, sharey=False)
#`sharex=False`はしなくてもよいです。見やすさのため。
g.fig.set_figwidth(30)
g.fig.set_figheight(20)
g.savefig(title + '.png')
```

![00130_0003195002_nan_第３表　刑法犯総数　都道府県別　認知・検挙件数・検挙人員.csv.png](https://qiita-image-store.s3.amazonaws.com/0/302092/cad053e7-346e-09ae-cfc2-4e191c039c45.png)


東京都がやはり認知件数が多いですね。ついで大阪です。認知は多いものの検挙率は高くないようです。

続いて人口を見ていきます。

```python
title = '00200_0003171324_参考表　都道府県，男女別人口の計算表－総人口，日本人人口_201610.csv'
df_pop = pd.read_csv(dir_path + title)
show_columns(df_pop)
df_pop["value"] = pd.to_numeric(df_pop["value"], errors='coerce').fillna(0)
df_pop = df_pop[(df_pop['時間軸（年間）'] == '平成28年10月1日現在')]
drop_list = ['全国']
for i in drop_list:
    df_pop = df_pop[(df_pop['全国・都道府県'] != i)]

g = sns.catplot(x='全国・都道府県', y='value', hue='人口', data=df_pop, estimator=np.mean, ci=None, n_boot=1000,)

```
人口推計もいらない値があったためいくつか落としています。
![00200_0003171324_参考表　都道府県，男女別人口の計算表－総人口，日本人人口_201610.csv_cat.png](https://qiita-image-store.s3.amazonaws.com/0/302092/039a0f84-1615-e8d6-34e2-b3fbfde5798c.png)

さて、統計局のデータは列ではなく行の途中からデータが区分けされているので、
47都道府県ごとに人口統計の種類のデータを作成していきます。また犯罪統計は認知件数のみにします。

```python
df_pop_total = df_pop[(df_pop['人口'] == '総人口') & (df_pop['男女別'] == '男女計')]
df_pop_J = df_pop[(df_pop['人口'] == '日本人人口') & (df_pop['男女別'] == '男女計')]
df_pop_M = df_pop[(df_pop['人口'] == '総人口') & (df_pop['男女別'] == '男')]
df_pop_W = df_pop[(df_pop['人口'] == '総人口') & (df_pop['男女別'] == '女')]
df_crim = df_crim[(df_crim['時間軸(年次)'] == '2016年') & (df_crim['認知・検挙件数・検挙人員'] == '認知件数')]
df_crim = df_crim.rename(columns={'管区警察局': '47都道府県', 'value': 'v犯罪認知件数'})
df_pop_total = df_pop_total.rename(columns={'全国・都道府県': '47都道府県', 'value': 'v総人口'})
df_pop_J = df_pop_J.rename(columns={'全国・都道府県': '47都道府県', 'value': 'v日本人人口'})
df_pop_M = df_pop_M.rename(columns={'全国・都道府県': '47都道府県', 'value': 'v男性人口'})
df_pop_W = df_pop_W.rename(columns={'全国・都道府県': '47都道府県', 'value': 'v女性人口'})

# マージしていきます。
dflist = [df_pop_J, df_pop_M, df_pop_W]

df_marge = pd.merge(df_crim, df_pop_total, on='47都道府県')
for i in dflist:
    df_marge = pd.merge(df_marge, i, on='47都道府県')
#外国人人口のデータがないため、総人口から日本人人口をマイナス。その他必要そうなデータを作成追加
df_marge['v外国人人口'] = df_marge['v総人口'] - df_marge['v日本人人口']
df_marge['v総人口に対する男性比%'] = df_marge['v男性人口'] / df_marge['v総人口']
df_marge['v総人口に対する外国人人口比%'] = df_marge['v外国人人口'] / df_marge['v総人口'] 
df_marge['v総人口に対する日本人人口比%'] = df_marge['v日本人人口'] / df_marge['v総人口'] 
df_marge['v総人口に対する日本人人口比%test'] = 1 - df_marge['v総人口に対する外国人人口比%'] 

```

ざっと相関関係を見てみます。

```python
g = sns.jointplot('v総人口', 'v犯罪認知件数', data=df_marge, kind="scatter")
g.savefig('1.png')
sns.pairplot(df_marge, kind="reg", vars=['v日本人人口', 'v外国人人口', 'v男性人口', 'v女性人口', 'v犯罪認知件数']).savefig('2.png')
```
![1.png](https://qiita-image-store.s3.amazonaws.com/0/302092/dc5ae3e1-393c-c1c4-d051-2d950ffd62a7.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/302092/3dd36605-5839-a92e-c3bb-0c42b1939770.png)


ここで本題です。重回帰分析で見ていくため今回は`statsmodels`を使用しました。

```python
import statsmodels.formula.api as smf
# 説明変数
X = df_marge[['v日本人人口', 'v外国人人口']]
X = sm.add_constant(X)
# 目的変数
Y = np.array(df_marge['v犯罪認知件数'])
model = smf.OLS(Y, X)
result = model.fit()
print(result.summary())

'''
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.929
Model:                            OLS   Adj. R-squared:                  0.926
Method:                 Least Squares   F-statistic:                     288.7
Date:                Sat, 02 Mar 2019   Prob (F-statistic):           5.02e-26
Time:                        13:42:31   Log-Likelihood:                -487.02
No. Observations:                  47   AIC:                             980.0
Df Residuals:                      44   BIC:                             985.6
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const      -4835.7615   1979.253     -2.443      0.019   -8824.683    -846.840
v日本人人口         0.0087      0.001      7.362      0.000       0.006       0.011
v外国人人口         0.0708      0.044      1.593      0.118      -0.019       0.160
==============================================================================
Omnibus:                       48.872   Durbin-Watson:                   2.349
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              553.626
Skew:                           2.083   Prob(JB):                    6.05e-121
Kurtosis:                      19.290   Cond. No.                     6.44e+06
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 6.44e+06. This might indicate that there are
strong multicollinearity or other numerical problems.
'''
```
P値が両方共1%を下回っています。結果では予想に反して日本人人口より外国人人口が増えるとかなり微小ですが犯罪が増える結果となりました。しかし、犯罪はそもそも人口がないと起きないため、あまり意味のない統計かもしれません。
マルチコのワーニングも出ています。