因果でも相関でもない分析「性質」

注意　今までで一番駄記事かもしれません
因果推論では質的変数を使って介入別の目的となる変数の平均値を使って効果測定をします。
相関では二変数間の関係性の分析だったり見かけ上の相関を考察する疑似相関があります。
と、今回はそれらとも違う、それでいて因果推論や相関よりエビデンスレベルが高いわけではない、しかし無意味ではない分析として「性質」の分析をしてみようと思います。

内容としては、クラス別に重回帰分析を行い、その係数から目的変数において傾向がどう違うかを解釈するという内容とデータ構造そのものの違いを解釈するといった内容です。
# コーディング
## ライブラリのインポート
```Python3
import statsmodels.api as sm
import pandas as pd
import numpy as np
```
## データの読み込み
ここでは初めから標準化されている糖尿病データセットを使います。
```Python3
df = pd.read_csv("diabetes.csv")
df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/ffd44a5f-47c4-70d8-d01d-5f32464c39a0.png)

## 多重共線性の確認
VIFを計算して10を超える項目を探し後に削除します。
```Python3
y = df["y"]
x = df.drop("y", axis=1)
vif = np.diag(np.linalg.inv(x.corr().values))
df_vif = pd.DataFrame(vif)
df_vif.columns = ["VIF"]
df_vif.index = x.columns
df_vif.sort_values("VIF", ascending=False)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/eef88ec1-94d6-0d6e-4f62-eba27ef58068.png)

この結果から「s1」「s2」「s3」「s5」は削除します。

```Python3
df = df.drop(["s1", "s2", "s3", "s5"], axis=1)
```

## クラス別データを作る
ここでは男女によってデータに違いがあるかを考察します。
### クラスの値を見る
標準化されているのでちゃんと値を確認します。
```Python3
list(set(df["sex"].values))
```
```
[0.050680119, -0.044641637]
```
この値を基にクラス分けします。
### クラス分け
```Python3
df1 = df[df["sex"]==0.050680119]
df0 = df[df["sex"]==-0.044641637]
```
これによって男女を分ける事ができました。

## 説明変数と目的変数を分ける
注意点として性別で分けているので「sex」も排除します。
```Python3
x1 = df1.drop(["y", "sex"], axis=1)
x0 = df0.drop(["y", "sex"], axis=1)
y1 = df1["y"]
y0 = df0["y"]
```

## クラス1と思われるデータの重回帰分析
```Python3
model1 = sm.OLS(y1, x1).fit()
model1.summary()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/7a01d0d6-b905-19e4-94c1-428aa13a8fdc.png)



R2は低いですが、今回は係数が見たいので・・・

## クラス0と思われるデータの重回帰分析
```Python3
model0 = sm.OLS(y0, x0).fit()
model0.summary()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/4bec4a05-7e32-44c4-14f5-2c83cb7200de.png)

## 比較
ではここまで出た係数を比較します。
```Python3
coef = []
for i in range(len(model0.params)):
    coef.append([x0.columns[i], model0.params[i], model1.params[i], abs(model0.params[i]-model1.params[i])])
df_coef = pd.DataFrame(coef)
df_coef.columns = ["coef_name", "class0", "class1", "diff"]
df_coef.sort_values("diff", ascending=False)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/3a078d7c-e6e5-4274-8043-78700da51125.png)

この結果から考えると糖尿病の進行に対して男女では特に年齢やs4とBMIに違いがある事が分かります。

## 各変数の男女差
### 図示
では実際変数はどんな違いがあるかを見てみます。
```Python3
for col in x1.columns:
    plt.boxplot([x1[col], x0[col]], labels=[col+"1", col+"0"], positions=[0, 1])
    plt.plot([0, 1], [x1[col].mean(), x0[col].mean()], marker="x")
    plt.show()
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/1960bb22-c653-bcc4-2cab-576e6217ee3e.png)
![Untitled-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/785055cf-b6d1-3203-fefa-9e409a04ff2d.png)
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/a0ee287b-5cd1-9b59-17b2-aad0c0e94ef5.png)

![Untitled-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/8de6be7c-4c57-0372-afc9-e3420313b7bb.png)
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/014d592f-91a4-1c24-d892-365c4f6d6c7b.png)
### 要約統計量
次に具体的な値を見てみます。
```Python3
dcb = pd.concat([x1.describe(), x0.describe()], axis=1)
dcb
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/9eeb90e4-2217-505a-e4ff-25c728cdd77a.png)
標準化しているというのもあると思いますが、違いは小さいです。しかし確実に違うところもあります。
元のデータだとどうなっているか気になる所です。
ただ全体的にクラス1の方が平均値が高い傾向にあるようです。

# まとめ
というあまり意味が感じられない分析手法でした(こういうのは試してみないとわからない)。
因果より相関より弱いとのことですが、ただ確かに性質が違えばデータへの見方が変わるのでそこは一応記憶の片隅に置いておこう。
ただこれ、yの値にもよるから難しい(あくまで目的変数に与える影響なので)、確かにエビデンスレベルが低いのも納得。
でも機械学習をする上では効果があるかもしれません。