相関係数使われる一例

[`An Introduction to Statistical Learning`](http://www-bcf.usc.edu/~gareth/ISL/data.html)の第三章に相関係数を使う一例があったので，まとめます．
広告の投資（TV, Radio, Newspaper）と売上（Sales）関連性を示すデータ・セットを使っています．

CSVファイルをimportして，最初の５行を表示します．

```py3
%matplotlib inline
import pandas as pd
import statsmodels.formula.api as smf
import seaborn as sns
import matplotlib.pyplot as plt

advertising = pd.read_csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv", usecols=[1,2,3,4])
advertising.head()
```

<img width="233" alt="Screen Shot 2017-08-08 at 17.01.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/54698/a1c9ad95-26d8-43f8-5ef9-479642b737d3.png">

このデータセットは200行あって，カラムは4つです．

```py3
advertising.shape

#結果
#(200, 4)
```

まずTV,Radio,NewspaperそれぞれSalesとの関連性をグラフで見てみます． それぞれのグラフのx軸は違うことに注意必要です．

TV ~ Sales

```py3
plt.scatter(advertising.TV , advertising.Sales,  alpha=0.7)
plt.xlabel("TV")
plt.ylabel("Sales")
plt.show()
```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/54698/6a8ff5c7-6e4b-a098-6f4c-fdf37464d76b.png)


Radio ~ Sales

```py3
plt.scatter(advertising.Radio , advertising.Sales,  alpha=0.7)
plt.xlabel("Radio")
plt.ylabel("Sales")
plt.show()
```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/54698/d0d62c4d-e35b-a3f8-eadc-39b88aee780e.png)


Newspaper ~ Sales

```py3
plt.scatter(advertising.Newspaper , advertising.Sales,  alpha=0.7)
plt.xlabel("Newspaper")
plt.ylabel("Sales")
plt.show()
```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/54698/67535c83-28d1-3795-0f87-6fc8eba8bd7c.png)


上の図を参考に仮にTV， Radio， NewspaperそれぞれSalesと線形回帰の関係もっているとします．グラフをプロットしてみます．

TV ~ Sales

```py3
sns.regplot(advertising.TV, advertising.Sales, ci=None, scatter_kws={'color':'g', 'alpha':0.7})
plt.xlabel("TV")
plt.ylabel("Sales")
plt.show()
```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/54698/bc2fa4f9-9105-eeee-87b7-13376c1be254.png)

Radio ~ Sales

```py3
sns.regplot(advertising.Radio, advertising.Sales, ci=None, scatter_kws={'color':'g', 'alpha':0.7})
plt.xlabel("Radio")
plt.ylabel("Sales")
plt.show()
```

![download-1.png](https://qiita-image-store.s3.amazonaws.com/0/54698/40fee30f-9d89-45f5-4e5b-2209d086b166.png)


Newspaper ~ Sales

```py3
sns.regplot(advertising.Newspaper, advertising.Sales, ci=None, scatter_kws={'color':'g', 'alpha':0.7})
plt.xlabel("Newspaper")
plt.ylabel("Sales")
plt.show()
```

![download.png](https://qiita-image-store.s3.amazonaws.com/0/54698/4d327000-ea4f-dc9b-c96b-6d973d6deb4f.png)


なんとなく TV〜Sales 回帰直線の傾きが大きいで， Newspaper〜Sales 回帰直線の傾きが小さいです．


TV ~ Sales回帰直線の傾き（coefficient）とｙ切片(intercept)をscikit learnのLinearRegressionで求めてみる．

```py3
from sklearn.linear_model import LinearRegression

reg = LinearRegression()

X = advertising.TV.values.reshape(-1,1)
y = advertising.Sales

reg.fit(X,y)

print("intercept: ", reg.intercept_)
print("coefficient: ", reg.coef_)
```
結果：

```
intercept:  7.03259354913
coefficient:  [ 0.04753664]
```

Radio ~ Sales回帰直線の傾き（coefficient）とｙ切片(intercept)をscikit learnのLinearRegressionで求めてみる．

```py3
from sklearn.linear_model import LinearRegression

reg = LinearRegression()

X = advertising.Radio.values.reshape(-1,1)
y = advertising.Sales

reg.fit(X,y)

print("intercept: ", reg.intercept_)
print("coefficient: ", reg.coef_)
```

結果：

```
intercept:  9.31163809516
coefficient:  [ 0.20249578]
```

Newspaper ~ Sales回帰直線の傾き（coefficient）とｙ切片(intercept)をscikit learnのLinearRegressionで求めてみる．

```py3
from sklearn.linear_model import LinearRegression

reg = LinearRegression()

X = advertising.Newspaper.values.reshape(-1,1)
y = advertising.Sales

reg.fit(X,y)

print("intercept: ", reg.intercept_)
print("coefficient: ", reg.coef_)
```
結果：

```
intercept:  12.3514070693
coefficient:  [ 0.0546931]
```

Newspaper ~ Sales回帰直線の傾き（coefficient）に注目すると， `0.0546931`になっています．
つまりNewspaperへの広告投資はSalesへ貢献無視できない． でもホントそうなのかは検証してみたいです．


さっきTV,Radio,Newspaperそれぞれ単回帰をscikit learn検証しました．今回多重回帰で検証してみます．

```py3
from sklearn.linear_model import LinearRegression

reg = LinearRegression()

X = advertising[['TV', 'Radio', 'Newspaper']].as_matrix()
y = advertising.Sales

reg.fit(X,y)

print("intercept: ", reg.intercept_)
print("coefficient: ", reg.coef_)
```
結果：

```
intercept:  2.93888936946
coefficient:  [ 0.04576465  0.18853002 -0.00103749]
```

TV,Radioのcoefficientの部分さっき単回帰で検証した結果あんまり変わっていないです．

ここで興味深いのは Newspaperの coefficientは `-0.00103749`になりました．つまりNewspaperへの広告投資はSalseへの影響はないと？ 実際はそうです．


４つの変数の相関関係を見てみます． NewspaperとSalesの相関係数は一番小さいです．さらに NewspaperとRadioの相関係数`０．３５４１０４`は大きめです．Radioへの広告投資は多くなると，Newspaperへの広告投資も増えます． RadioとSalesの相関係数大きいです． **つまりNewspaper〜Sales単回帰で求めたcoefficient `0.0546931`実はRadioの恩恵を受けて,関連性あるように見えただけです．**

単回帰は他の要素の影響を無視しているので，出てきた結論は一部間違いがあることがわかりました．

```py3
corr = advertising.corr()

plt.figure(figsize=(10,5))

sns.heatmap(corr, 
            xticklabels=corr.columns.values,
            yticklabels=corr.columns.values,
            vmax=1,
            square=True,
            annot=True
           )
sns.plt.title('Heatmap of Correlation Matrix')
corr
```

<img width="371" alt="Screen Shot 2017-08-08 at 18.57.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/54698/72b77022-d0aa-b6b6-ee9e-9b7c3dcca30a.png">


さっきのinterceptとcoefficient見づらいなら，したの方法で求めることもできます． 下の２個目の表のNewspaperのp値0.860は非常に大きい値で， Newspaper〜Salesの間に関連性がないことの裏付けになります．

```
est = smf.ols('Sales ~ TV + Radio + Newspaper', advertising).fit()
est.summary()
```

<img width="401" alt="Screen Shot 2017-08-08 at 19.07.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/54698/3bb5a732-4311-f65c-2ae6-59be7a4e1815.png">