ひと目でわかるscikit-learn(サイキットラーン)を使用した回帰分析

#はじめに
こんな方にオススメ。
・回帰分析とはなんぞや
・回帰分析の種類と用途が整理できてない
・簡単に動かせるソースちょうだい

#回帰分析とは
相関関係や因果関係があると思われる2つの変数のうち、一方の変数から将来的な値を予測するための予測式（回帰直線）を求めるための手法。
具体的なイメージは下記ソースを参照。


#回帰分析の種類と用途  
|種類|目的変数|説明変数|目的変数値|用途|具体例|
|---|---|---|---|---|---|
|単回帰分析|1|1|-|予測値算出|月曜日の日照時間を推論 -> 7時間|
|重回帰分析|1|2以上|-|予測値算出|月曜日の日照時間を推論 -> 7時間|
|ロジスティック回帰分析|1|2以上|2値(0 or 1)|検証値となりえる確率を算出|月曜日が晴れの確率 -> 50%|

#環境
Anaconda 3.7
Jupyter Notebook

#ソース	
##単回帰分析
``` py
from sklearn.datasets import load_boston
import pandas as pd

boston = load_boston() # データセットの読み込み
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)
boston_df['PRICE']=boston.target
boston_df.head()
y='PRICE' # 目的変数
x='RM'#説明変数
df = boston_df[[x,y]].corr()
# かなり強い相関(0.7～1)
# やや強い相関(0.4～0.7)
# 弱い相関(0.2～0.4)
# ほとんど相関なし(0.0～0.2)
df
```

##重回帰分析
単回帰分析とは、説明変数の数が違うため、
説明変数は正規化(0,1)を行っている。(単位を揃えるイメージ)
尚、モデル保存、ロード処理についても必須ではないが追記してある。  

``` py	
import pandas as pd 
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import pickle

dataset = load_boston()#データセット読み込み

data_x = pd.DataFrame(dataset.data,columns=dataset.feature_names)#説明変数
data_y = pd.DataFrame(dataset.target)#目的変数

#　クロスバリデーション法を使用
# 学習データ(train_)とテストデータ(test_)を作成
train_x,test_x,train_y,test_y = train_test_split(data_x,data_y)

#正規化インスタンス
mscaler = MinMaxScaler()
#訓練データの説明変数を正規化
mscaler.fit(train_x)#読み込み
train_x_mmsc=mscaler.transform(train_x)#正規化
mscaler.fit(train_y)#読み込み
train_y_mmsc=mscaler.transform(train_y)#正規化
#テストデータの説明変数を正規化
mscaler.fit(test_x)
test_x_mmsc=mscaler.transform(test_x)
mscaler.fit(test_y)
test_y_mmsc=mscaler.transform(test_y)

#モデルインスタンス
model=LinearRegression()
model.fit(train_x_mmsc, train_y_mmsc)#予測モデル構築
print("[決定係数(データの精度)]\n",model.score(test_x_mmsc,test_y_mmsc))#決定係数の表示(0.5(50%)以上の精度が目安)

# モデルを保存
filename = 'multiple_regression_analysis.sav'
pickle.dump(model, open(filename, 'wb'))
# 保存したモデルをロード
load_model = pickle.load(open(filename, 'rb'))

# 偏回帰係数算出
coefficie=pd.DataFrame(dataset.feature_names, columns=['colum_name'])
coefficie['coefficient'] = pd.DataFrame(load_model.coef_.T)
print("[偏回帰係数(目的変数に対する相関度)]\n",coefficie)

# 実際の住宅価格
re_test_y = mscaler.inverse_transform(test_y_mmsc)#正規化から逆変換
act_df=pd.DataFrame(re_test_y)
act_df.columns=['actual']
act_df.reset_index(drop=True, inplace=True)#indexリセット

# 学習結果からの予想住宅価格
test_x_mmsc_df=pd.DataFrame(test_x_mmsc)
test_x_predict=mscaler.inverse_transform(load_model.predict(test_x_mmsc_df))#予測値結果を正規化から逆変換
fc_df=pd.DataFrame(test_x_predict)
act_df['forecast']=fc_df #列追加
act_df.head() # 先頭5行表示
```

##ロジスティック回帰分析
``` py
import sklearn
import pandas as pd
from sklearn import datasets
from sklearn import linear_model
from sklearn.model_selection import train_test_split

# irisのデータを用意
iris = datasets.load_iris()
# 説明変数
data_x = iris.data
# 目的変数(アヤメの3品種(Setosa, Versicolour, Virginica))
data_y = iris.target

# 訓練、テストデータ取得
train_x,test_x,train_y,test_y = train_test_split(data_x,data_y)

# ロジスティック回帰の識別器を用意
clf = linear_model.LogisticRegression()

# 識別器を学習させる
clf.fit(train_x, train_y)

# テストデータで識別結果(正解率)を確認
print(clf.score(test_x, test_y))
```
#GitHub
上記実行済のipynbファイルは以下をプルして下さい。
https://github.com/bossjerom/python/tree/master/scikit-learn