【勉強メモ01】機械学習の予測モデルを構築しよう(線形回帰モデル)

#はじめに
今回記事作成者の機械学習の勉強＆メモのために記事を作成しています
間違いなどありましたらコメントにてご指摘いただけると幸いです。

#今回使用するデータセット
https://www.kaggle.com/harlfoxem/housesalesprediction

# Pythonの準備
Pythonの準備をします。

Google ColaboratoryはGoogleアカウントがあれば無料で使えますのでお勧めです。

https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja

ちなみに記事作成者は
AnacondaのJupyter Notebookを使用しています。

https://www.anaconda.com/products/individual

どちらも無料で使えます。

#データ分析の流れ

①　データ分析の目的を明確にする

②　データの読み込み
まず分析するためのデータを読み込む

③　データの理解
どのようなデータがあるのか
項目の理解、欠損値の確認、分布の確認（可視化）を行い理解を深める

④　特徴量の設計
y = aX + b (a,bは変数）
何を特徴量(X)、目的変数(y)にするか
分析できるように特徴量を作成していく
例えば
満足度をA-Eの5段階で作成しているとする
これはカテゴリー変数のため、そのまま分析をかけるとエラーになってしまう。
なのでカテゴリー変数を分析できる形にするために0,1表現にする。

⑤　モデルの構築
目的に合わせてモデルを作成していく
（今回は線形回帰のモデルを勉強をしていく）

⑥　モデルの性能評価
モデルが良いか悪いかを判断していく
モデルの性能評価ではMSE, RMSEなどが良く利用される

# ①　データ分析の目的を明確にする。
今回の目的は
「住宅情報から価格を予測するモデルを作る」
とします。

# ②　データの読み込み

##ライブラリーを読み込みます

```Python
#グラフ作成に必要なライブラリー
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
# numpyのライブラリー
import numpy as np
# pandasのライブラリー
import pandas as pd

matplotlib.style.use('ggplot')

```
import ~~ as A
とすると「~~」を適用させたいときに
「A」に置き換えることができます。


##最大表示数の変更方法

Pythonでデータセットを表示する際に、表示列が省略されることがあります。
そこで下記内容を実行すると、最大表示数を変更することができます。

```Python

#現在の最大表示列数の出力 
pd.get_option("display.max_columns")
#最大表示列数の指定（ここでは50列を指定） 
pd.set_option('display.max_columns',50)

```

##データセットを読み込む

```Python
#(データのあるフォルダー名/ファイル名)でデータを呼び出す
# これはCSVファイルを呼び出している
dataset = pd.read_csv('data/kc_house_data.csv')

# エクセルファイルを呼び出すときは下記コードで行える
dataset = pd.read_excel('data/kc_house_data.xlsx')

```

#③　データの理解

##データの行数、列数の確認
```Python
#データの行数、列数を確認できる
dataset.shape

```

##データの中身を確認

```Python
#データの中身を確認
#数字を入れるとその数字分の行数が出力される
#今回の場合、3行出力される
dataset.head(3)
```

#スライシング（欲しいデータを抽出)
見たい部分のデータを抽出する方法

```Python
#2~10行のデータのみを出力する
dataset[2:10]

# priceが1000以下の物件を出力
dataset[dataset["price"]<=1000]

```


##要約統計量の確認
データ数、平均、標準偏差、最大、75,50,25%,最小の
要約統計量を確認する方法は、下記コードになる。

```Python
#要約統計量を出力する
dataset.describe()

```

## データを可視化する

###ヒストグラム作成（棒グラフ）

```Python
#価格のヒストグラムの作成
#dataset →　読み込んだデータセット
#["price"] →　"price"の部分については、グラフにしたい項目を入れる
#hist() →　ヒストグラム作成
dataset["price"].hist()

#下記方法でも作成可能
dataset.price.hist()
```

### 散布図の作成

```Python
#散布図の作成
dataset.plot(kind = "scatter", x = "sqft_living",y = "price")
#kind = "scatter" →　散布図を指定
# x = ,y= でX軸とy軸の設定をする

```

###　グループごとに集計して棒グラフを作成
カテゴリー変数をキーにし、priceの平均を集計し、それを棒グラフにする

```Python
#Group Byで集計して棒グラフで作成をする。

price_by_condition = dataset.groupby("condition").aggregate({"price":np.mean}).reset_index() 
price_by_condition.plot.bar(x = "condition")

#reset_index() →　インデックスを連番に振りなおし

```

###　欠損値の確認

```Python
#pd.isnull(dataset["列名"]で欠損値があるか確認できる
#下記の場合、priceに欠損値があるか確認している、。
pd.isnull(dataset["price"])
```

```Python
#効率的ではないが、各列ごとにチェックをする方法
col_names = dataset.columns
for col_name in col_names:
# Tureを1 Falseを0に変換し、欠損値の個数の合計を出す
    missing_num = sum(pd.isnull(dataset[col_name]))
    print(col_name, ";# of missing record:", missing_num)

```

### カラム間の演算方法

```Python
# カラム間で演算し、出力する方法
dataset["sqft_footage_of_each_floor"] = dataset["sqft_living"] / dataset["floors"]

#必要なデータのみを表示する
dataset.iloc[0:5][["id","sqft_living","floors","sqft_footage_of_each_floor"]]


```

### カラムに関数を適用する

dateから年、日付を取り出すことができる。
20141013T000000
↓
2014/10/13/T000000

####関数作成
```Python
#年を取り出すための関数作成
def date_str2year(x):
    #最初の4文字を取り出せば、年　になる
    return int(x[:4])

#月を取り出すための関数作成
def date_str2month(x):
    #5-6文字目を取り出せば、月　になる
    return int(x[4:6])

```

####データセットに追加
```Python

#年のデータをデータセットに追加する
dataset["date_year"] = dataset["date"].apply(date_str2year)

#月のデータをデータセットに追加する
dataset["date_month"] = dataset["date"].apply(date_str2month)

#必要なデータのみを表示する
dataset.iloc[0:5][["id","date","date_year","date_month"]]

```

###ダミー変数の作成
カテゴリー変数を0,1に変換する

```Python
#カテゴリ変数を0,1のダミー変数に変換する
dataset = pd.get_dummies(data = dataset, columns = ["view"])

```

###特徴量の作成

```Python
#特徴量の作成
dataset["sqft_licing_div_sqft_living15"] = dataset["sqft_living"]/(dataset["sqft_living15"]+0.001)
dataset.head()
```


#⑤　モデルの構築
目的に合わせてモデルを作成していく
（今回は線形回帰のモデルを勉強をしていく）

##ライブラリーなどの呼び出し

```Python
#Scikit Learnを用いた線形回帰モデルの構築
#ライブラリーなど呼び出し
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
```

##ターゲット変数と特徴量を指定

```Python
# ターゲット変数と特徴量を指定する
#目的変数の設定
target_col = "price"
#特徴量として検討しないものを選択する
exclude_cols = ["price","id","date"]
#特徴量として検討しないものを取り除き、説明変数として設定する
feature_cols = [col for col in dataset.columns if col not in exclude_cols]

```

##モデルに当てはめるための準備を進めていく
特徴量をX、ターゲット変数をyに格納する

```Python
#特徴量をX、ターゲット変数をyに格納する
y = dataset[target_col]
X = dataset[feature_cols]

```

##学習データ、テストデータを分割する

予測モデル作成し、うまく予測できているか確認できるようにするために、学習データとテストデータを分割して行う
よくあるのは
学習データ : 70%, テストデータ30%に分割する方法

```Python
#学習データを70%、テストデータを30%に分割をする
X_train, X_test, y_train,y_test = \
 train_test_split(X,y,test_size = 0.3, random_state = 1234)

#shapeで行数、列数を確認する。
print(X.shape)
print(y.shape)
print(X_test.shape)
```

##線形回帰モデルの構築

```Python
#線形回帰モデル作成
lm = LinearRegression()

#fit関数を使って学習
lm.fit(X_train, y_train)

#predict関数(予測関数)を使って、予測
y_pred = lm.predict(X_test)
print("予測結果")
print(y_pred)

#性能評価算出
lm_mse = mean_squared_error(y_test, y_pred)
print("y_test")
print(y_test)
print("LinerRegression RMSE:", np.sqrt(lm_mse))
#RMSEはいいか悪いかは一概にも言えない
#　±出てきた数字　分ずれてしまうが、そのずれ幅は許容できるかは確認する必要がある。

#回帰係数算出
coef_pd = pd.DataFrame(lm.coef_,columns = ["coef"], index = feature_cols)
coef_pd

```

#参考資料

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15576681%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  >Pythonによるあたらしいデータ分析の教科書 [ 寺田 学 ]</a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15576681%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/2132e914.2fe6209c.2132e915.6ace3022/?me_id=1213310&item_id=19251192&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F8341%2F9784798158341.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15697205%2F&link_type=text&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJ0ZXh0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  >見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑 [ 秋庭 伸也 ]</a>

<a href="https://hb.afl.rakuten.co.jp/ichiba/2132e914.2fe6209c.2132e915.6ace3022/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Fbook%2F15697205%2F&link_type=pict&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0Iiwic2l6ZSI6IjI0MHgyNDAiLCJuYW0iOjEsIm5hbXAiOiJyaWdodCIsImNvbSI6MSwiY29tcCI6ImRvd24iLCJwcmljZSI6MCwiYm9yIjoxLCJjb2wiOjEsImJidG4iOjEsInByb2QiOjAsImFtcCI6ZmFsc2V9" target="_blank" rel="nofollow sponsored noopener" style="word-wrap:break-word;"  ><img src="https://hbb.afl.rakuten.co.jp/hgb/2132e914.2fe6209c.2132e915.6ace3022/?me_id=1213310&item_id=19382494&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Fbook%2Fcabinet%2F5654%2F9784798155654.jpg%3F_ex%3D240x240&s=240x240&t=pict" border="0" style="margin:2px" alt="" title=""></a>