回帰分析とは?単回帰と重回帰に関して解説!

はじめに

この章では、Jupyter Notebookで実行するのをオススメ致します。
Jupyter Notebookの使い方はこちらをご確認ください。

また、この章ではscikit-learn 1.9系を利用します。
scikit-learnの最新バージョンが2系の場合動作しないコードがありますので、
エラーが起きる場合は、バージョンを1.9(v0.19.1やv0.19.2)に下げて実行してください。

回帰分析とは

回帰分析とは、データ間の関係性を一定の数式・公式でどれくらい説明できるかを調べる分析手法です。
ここで、出てくる用語として、目的変数と説明変数があります。
目的変数はゴールとなる予測したいデータのことです。
説明変数は予測したいデータの要因となるデータのことです。
実際に計算式としては、単回帰式をy=ax+bのように表すことが出来て、yが目的変数、xが説明変数となります。
ちなみに、aは回帰係数と呼ばれるものです。

単回帰と重回帰の違い

単回帰分析(線形)は、1つの数値からゴールとなる1つの数値を説明する分析です。
例えば、テレビCMから獲得契約件など、1つの数値からゴールとなる1つの数値を説明するのが、単回帰分析です。
そして、重回帰分析は、テレビCMや販促物、雑誌など複数の数値からゴールとなる1つの数値(獲得契約件)を説明するのが重回帰分析になります。
重回帰分析は様々なデータ分析で使うことが出来ます。

単回帰

単回帰とは、教師あり学習の一種で目的変数が実数値の手法です。
ピザの例で考えてみましょう。
もし、あなたが「ピザの直径」から「ピザの値段」を予測したいとき、予測に使うもの(ピザの直径)を説明変数予測するもの(ピザの値段)を目的変数といいます。
用語の復習ですが、目的変数はゴールとなる予測したいデータのことで、説明変数は予測したいデータの要因となるデータのことでした。
ピザの値段のように予測したいもの、すなわち目的変数が100,200などの実数値の学習を回帰と呼びます。

単回帰の実装例

簡単な回帰をピザの例を使って実装してみましょう。
ピザの直径と価格のデータが下の表のように5個あるとします。

No. 直径(cm) 値段(円)
1 12 700
2 16 900
3 20 1300
4 28 1750
5 36 1800

今回はピザの直径を使って、値段を予測します。
では、始めにデータを入力します。

x = [[12],[16],[20],[28],[36]]
y = [[700],[900],[1300],[1750],[1800]]

次にこのデータがどのようになっているのか、回帰をする必要があるかなどmatplotlibをつかって可視化してみましょう。

import matplotlib.pyplot as plt

 # テキストエディタで実行する場合はこの行をコメントアウト(コメント化)してください。
%matplotlib inline

plt.figure()
plt.title('Relation between diameter and price') #タイトル
plt.xlabel('diameter') #軸ラベル
plt.ylabel('price') #軸ラベル
plt.scatter(x,y) #散布図の作成
plt.axis([0, 50, 0, 2500]) #表の最小値、最大値
plt.grid(True) #grid線
plt.show()

上記のプログラムを実行すると図が出力されます。

この図をみると直径と値段には正の相関があるようにみえます。
このように、データをplotすることで回帰を行う必要があるか分かります。
では、次にscikit-learnを使って回帰を行なってみましょう。
まず、はじめにモデルを構築します。

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x,y)

1行目で今回使う回帰のパッケージをimportします。
2行目では、使うモデル(回帰)を指定します。
3行目でxとyのデータを使って学習させます。
これで、回帰のモデルの完成です。
では、大きさが25cmのピザの値段はいくらになるでしょう。
このモデルをつかって予測してみましょう。

import numpy as np
price = model.predict(np.array([25]).reshape(-1, 1)) # Google Colabなどでskleran.0.20系ご利用の方
# price = model.predict(25) # scikit-learnバージョン0.1.9系
# もしくは下記の形式です。
# price = model.predict([[25]])
print('25 cm pizza should cost: $%s'%price[0][0])

predictを使うことによって値段を予測できます。
上のプログラムを実行すると
25 cm pizza should cost: 1416.91810345円
と表示され予測できていることが分かります。

ここまでのプログラム(Jupyter Notebookファイル)です。

このように機械学習で予測をするには次の3つの手順によって行えます。

1) モデルの指定
model = LinearRegression()
2) 学習
model.fit(x,y)
3) 予測
price = model.predict(25)

この手順は回帰以外のどの機械学習手法でも変わりません。

評価方法 決定係数(寄与率)

では、これは良い学習ができているのでしょうか?
良い学習ができているか確認するためには、評価が必要です。
回帰の評価方法として決定係数(または寄与率とも呼びます/r-squared)というものがあります。
決定係数(寄与率)とは、説明変数が目的変数をどのくらい説明できるかを表す値で高ければ高いほど良いとされます。
決定係数(寄与率)はscoreによって出力されます。
新たにテストデータを作成して、寄与率を計算してみましょう。

# テストデータを作成
x_test = [[16],[18],[22],[32],[24]]
y_test = [[1100],[850],[1500],[1800],[1100]]

score = model.score(x_test, y_test)
print("r-squared:",score)

model.scoreによってそのモデルの寄与率を計算できます。
上記のプログラムを実行すると、
r-squared: 0.662005292942
と出力されています。
寄与率が0.66と高くはないですが、ある程度のモデルが作れているといえます。
評価指標について知りたい方は「評価指標」のテキストを参考にしてください。

重回帰

先程の単回帰より、良いモデルを作るにはどうしたら良いでしょうか?
ピザの例で考えると、
ピザの値段を決めているのは大きさだけではありません。
トッピングの数、パンの生地、種類など様々な要因が値段を決めています。
なので、値段に関わる要因を説明変数と増やせば増やすほど、値段を正確に予測することができます。
このように、説明変数を2つ以上で行う回帰のことを重回帰といいます。
(先程は説明変数が1つだったので単回帰といいます。)
実際に計算としては、
重回帰式をY=b1X1+b2X2+b3X3+b4X4+b5X5+‥‥+b0
のように表すことができ、b1,b2,‥を偏回帰係数といいます。

重回帰の実装例

では、重回帰を実装してみましょう。
先程のデータにトッピングの数を追加します。

No. 直径(cm) トッピングの数 値段(円)
1 12 2 700
2 16 1 900
3 20 0 1300
4 28 2 1750
5 36 0 1800

テストデータの方にも追加し、学習してみましょう。

from sklearn.linear_model import LinearRegression
x = [[12,2],[16,1],[20,0],[28,2],[36,0]]
y = [[700],[900],[1300],[1750],[1800]]

model = LinearRegression()
model.fit(x,y)

x_test = [[16,2],[18,0],[22,2],[32,2],[24,0]]
y_test = [[1100],[850],[1500],[1800],[1100]]

# prices = model.predict([[16, 2], [18, 0], [22, 2], [32, 2], [24, 0]])
prices = model.predict(x_test) # 上のコメントと同じ

for i, price in enumerate(prices):
    print('Predicted:%s, Target:%s'%(price,y_test[i]))

score = model.score(x_test,y_test)
print("r-squared:",score)

学習のやり方は先程とまったく同様です。

prices = model.predict(x_test)

で一気に5つのデータの予測を行なっています。
プログラムを実行すると、以下の結果が出力されます。

Predicted:[ 1006.25], Target:[1100]
Predicted:[ 1028.125], Target:[850]
Predicted:[ 1309.375], Target:[1500]
Predicted:[ 1814.58333333], Target:[1800]
Predicted:[ 1331.25], Target:[1100]
r-squared: 0.770167773132

予測した値と実際の値を比べると、近い数値となっています。
また、寄与率は0.77と上がり単回帰より良いモデルを作ることができました。

作成したプログラム

# 学習データ
x = [[12],[16],[20],[28],[36]]
y = [[700],[900],[1300],[1750],[1800]]


import matplotlib.pyplot as plt
plt.figure()
plt.title('Relation between diameter and price') #タイトル
plt.xlabel('diameter') #軸ラベル
plt.ylabel('price') #軸ラベル
plt.scatter(x,y) #散布図の作成
plt.axis([0, 50, 0, 2500]) #表の最小値、最大値
plt.grid(True) #grid線
plt.show()


from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x,y)

import numpy as np
price = model.predict(np.array([25]).reshape(-1, 1)) # Google Colabなどでskleran.0.20系ご利用の方
# price = model.predict(25) # scikit-learnバージョン0.1.9系
print('25 cm pizza should cost: $%s'%price[0][0])


x_test = [[16],[18],[22],[32],[24]]
y_test = [[1100],[850],[1500],[1800],[1100]]

score = model.score(x_test,y_test)
print("r-squared:",score)



from sklearn.linear_model import LinearRegression
x = [[12,2],[16,1],[20,0],[28,2],[36,0]]
y = [[700],[900],[1300],[1750],[1800]]

model = LinearRegression()
model.fit(x,y)

x_test = [[16,2],[18,0],[22,2],[32,2],[24,0]]
y_test = [[1100],[850],[1500],[1800],[1100]]

prices = model.predict(x_test)
for i, price in enumerate(prices):
    print('Predicted:%s, Target:%s'%(price,y_test[i]))

score = model.score(x_test,y_test)
print("r-squared:",score)

まとめ

この章では回帰について学習しました。
説明変数が1つのときは単回帰、複数のときは重回帰と呼ばれます。
また、評価指標として寄与率を説明しました。

わからないことを気軽に質問できる環境で学ぼう!

Pythonプログラミングや機械学習、データ分析を一人で学んでいると、どこかでわからないことが出てきます。

わからないことを1人で解決しようとしてもなかなか解決できず、時間だけが過ぎてしまった。。という経験はありませんでしょうか。

「Google先生に聞けば(自分でGoogleで調べれば)解決できるはずだ」「もう少し考えればきっと解決できるはずだ」といった具合に、終わりの見えない泥沼に陥ってしまいます。

このようなときこそ、自分よりスキルのある人に質問ができれば、余計な時間を浪費しなくて済むようになります。

AI Academy Bootcampの「オンデマンド動画+チャットサポートプラン」は6ヶ月、機械学習エンジニアやデータサイエンティストからチャットにて受講期間中、質問し放題です。

6ヶ月間質問し放題で、受講料も35,000円(税込)とお手軽にご受講頂けます。
(1日の受講費用換算で、なんと194円でご受講頂けます。)

是非、いつでも質問し放題の環境で効率の良いAI学習を始めてみてください。

AI Academy Bootcamp

1 COMMENT

コメントを残す