【人工知能、まずはここから】ゼロからわかる単回帰分析|AI講座 第03回

挨拶&はじめに

こんにちは、kinocodeです。
人工知能の前回の動画はご覧いただけたでしょうか。
前回のレッスンでは、「そもそも人工知能とは何か?」「ディープラーニング、深層学習は、機械学習の一種で、機械学習は人工知能の一種である」といったような用語の関係性や、実際の活用事例など、人工知能についての周辺知識についてご紹介しました。
このレッスンでは、実際に人工知能、機械学習の開発を行っていくにあたって必要な知識やその手法についてご紹介していきます。
人工知能の講座の一番最初の動画でもお伝えしましたが、1つの人工知能の手法に対して4本の動画を作成する予定です。
(1)数学がわからない方であっても概念を理解できる説明。意気込みもこめて「ゼロからわかる理論編」と名付けます。
(2)数学・統計学を使って概念の説明。数式を使って理解編。
(3)Excelを使って概念を説明。エクセルで学ぶ人工知能編。
(4)Pythonによる実装方法。Python実装編。
といった流れになります。
ただし、エクセルで学ぶ人工知能については、逆に解説がわかりにくくなる場合はスキップすることがあると思います。
それでは、今回は単回帰分析について説明をします。
つまり、単回帰分析の「ゼロからわかる理論編」です。
この「ゼロからわかる理論編」では、数学や統計学はさておき、機械学習でどんなことをしているのか?
そのレッスンで出てくる用語はどういう意味なのか?といったことを説明していきます。
レッスン全体を通してわかりやすさを大切にしているので、厳密さに欠ける部分があります。
とはいえ、詳しくは、数式を使って理解編にて説明しますので、詳しく知りたい方はそちらもあわせてご覧ください。
では、まず、回帰分析とはなんなのか?
そして、なぜ単回帰分析から始めるのか?そういったところから説明していきましょう。
それでは、レッスンスタートです。

単回帰分析とは

単回帰は、統計学の回帰分析と呼ばれる手法の一つです。
では、回帰とはなんでしょうか?
辞書を引くと、「ひとまわりしてもとにもどること。繰り返すこと。」などと書かれています。
回帰の日本語の意味としては、そのような意味です。
ですが、統計学での回帰は、少し違ったニュアンスの言葉になります。
誤解を恐れずにいうと、統計学での「回帰」は、ほぼ「予測」という意味に置き換えてもらってよいでしょう。
したがって、回帰分析といえば、予測分析と読み替えてしまってよいです。
予測分析の具体例として、身長から体重を予測する。
逆に身長から体重を予測する。
レストランの座席数から売上を予測する。
駅からの距離でマンション価格を予測する。
といった例があります。
なお、単回帰の単は一つという意味で、予測に使用するデータの種類が1つということを指しています。
予測に使用するデータの種類が2つ以上のものを重回帰といいます。
予測に使用するデータの種類とは、マンション価格でいうと、駅からの距離だけではなく、部屋の広さ、階数、築年数などのことです。
このうち、マンション価格を、駅からの距離、つまり1種類だけで、予測しようとするものを単回帰。
逆に、マンション価格を駅からの距離、部屋の広さなど、2つ以上のデータの種類で予測しようとするものを重回帰といいます。

なぜ単回帰分析からはじめるのか?

この単回帰分析は、データ分析では基本的な分析手法です。
ソフトバンクの孫正義さんは「回帰分析をしない人の話は一切聞かない」ともおっしゃっていたようです。
そして、この単回帰分析は、機械学習と密接な関係がある最適化の基礎的な手法でもあります。
では、最適化とはなんでしょうか。
最適化とは、限られた条件の中で何かの値を最大にしたり最小にすることです。
身近な例でいうと、会社の売上を最大にすることや、スーパーの袋に野菜詰め放題で、どれだけ野菜を袋につめられるかということです。
単回帰分析では、機械学習でもっとも基本的と言ってもいい最小二乗法という最適化手法が使われいます。
そのため最初の議題としてご紹介することにしました。

予測に使用するデータ

基本的に、回帰分析は量的データの予測に使用されます。
では、量的データとは何でしょうか。
データは、基本的に量的データと質的データに分類されます。
量的データとは、身長や体重のように各データの大きさが比較できるデータをいいます。
逆に、質的データとは、男性や女性のように各データの大きさが比較できないデータのことです。
この量的データと質的データを予測する問題のことをそれぞれ、回帰問題、分類問題といったりします。
回帰問題の具体例としては、身長から体重を予測する。
逆に身長から体重を予測する。
駅からの距離でマンション価格を予測するなどがあります。
分類問題の具体例としては、花びらの形状や大きさから花の種類を分類する。
顔写真から、男性か女性を見分けるなどがあります。

回帰分析で使用する用語紹介

それでは、回帰分析で使用する用語について説明したいと思います。
ここでは、マンション価格の予測を例に説明します。
マンション価格の予測するには、駅からの距離、部屋の広さ、部屋の数などのことがあれば予測できそうですよね。
この予測に使うデータのことを説明変数といいます。
逆に、予測したいデータは、マンション価格です。この予測したいデータのことを被説明変数といいます。
被説明変数の別名として、従属変数、内生変数、目的変数、結果変数といったりもします。
また、説明変数の別名として、独立変数、外生変数、予測変数といったりもします。

単回帰分析とは何か?図を使って説明

それでは、図を使って単回帰の手法について説明していきます。
次のグラフを見てください。

#乱数Xに対してρの相関を持つ乱数Zを作成する。
#乱数Zは以下式より作成できる。
# Z=ρ * X + (1 - ρ ** 2) ** 0.5 * Y 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score

#独立な乱数X,Yを作成する。この際、平均X=平均Y、Var[X]=Var[Y]を満たすようにする。
#以下のパターンにより、散布図が変化する。
#①X:一様乱数、Y:一様乱数
#②X:一様乱数、Y:正規乱数 (この際、正規乱数の分散をXに揃えるようにする。)
#③X:正規乱数、Y:正規乱数

#決定係数を指定する。
R2 = 0.8

#決定係数から相関係数を指定する。
ρ= R2 ** (1/2)
#相関係数を直接指定する。
#ρ= 0.7

#発生させる乱数の個数を設定する
num = int(300)
#パターン②X:一様乱数、Y:正規乱数の場合を作成する。

#X:一様乱数、Y:正規乱数を作成。
#Yの分散をXに揃えるために計算が入っている。

X = np.random.rand(num) - 0.5
Y = np.random.randn(num) * (1 / 12) ** 0.5

#Zを求める。
Z =ρ * X + (1 - ρ**2) ** 0.5 * Y

#Zの分散とXとZの相関係数を求める。
#分散を算出(不偏分散ではない) ddof=0:分散、ddof=0:不偏分散
Z_var = np.var(Z, ddof=1)
#相関係数を算出
XZ_ρ = np.corrcoef(X, Z)

print('分散:', Z_var)
print('相関係数:', XZ_ρ[0,1])

#発生させた乱数を回帰分析にかけ、回帰直線を導き出す。
#Zは、X(横軸の値)に対する真値(y_true)(Xの値の条件の時に測定されたYの値と考える。)
y_true =  Z

#予測値(y_pred)は、乱数Z = fx(X) から導き出された値。
#a,bを回帰分析により求める。
a, b = np.polyfit(X, Z, 1)

#回帰式より、予測値を導く。y_pred = a * X + b
start = int(num - num * 1.5)
end = int(num * 0.5)

y_pred = []
for i in range(start, end, 1):
    y_pred.append(a * X[i + end] + b )

print('決定係数:', r2_score(y_true, y_pred))

#グラフを出力、保存する。
r2 = ('{:.2f}'.format(r2_score(y_true, y_pred)))
glf_name = 'p2_決定係数:' + str(r2) + '.png'

plt.figure(figsize=(3, 3), dpi=200)
#plt.title(r2)
plt.scatter(X, Z, s =1)
#plt.plot(X, y_pred, color = 'blue')
plt.savefig(glf_name)

このグラフには、横軸に0.7という値はありません。
しかし、もし仮に横軸に0.7があった場合、縦軸の値はいくつになると予測できるでしょうか。
また、横軸が0.25付近の縦軸の値になりそうな点はたくさんあります。
横軸が0.25の縦軸の値を1つ決めるとすれば、どれぐらいの値が適切でしょうか。
つまり、どのようにすれば、0.7や0.25の値が予測できるでしょうか。
例えば、この点の集まりの中心を通る直線を引けば予測できると思いませんか。
それでは、引いてみましょう。
次のグラフをご覧ください。

plt.figure(figsize=(3, 3), dpi=200)
#plt.xlim(-1, 1)
#plt.ylim(-1, 1)
plt.scatter(X, Z, s =1)
plt.plot(X, y_pred, color = 'blue')
plt.savefig(glf_name)

点の集まりの中心を通る、直線を引いてみました。
この直線の値を読み取れば、横軸0.25の時の縦軸の値は、0.2ぐらい。
また、直線を辿って行けば、横軸が0.7の時は、縦軸は、0.6ぐらいになりそうです。
このように、点の集まりに対して直線を引いて横軸の値から、縦軸の値を予測するのが、単回帰分析なのです。

最小二乗法

ですが、ここで問題になることがあります。
先ほどの方法で引いた直線は、私のなんとなく点の集まりの中心を通ってそうな直線です。
この方法では、直線を引く人によって直線の位置がずれるため、人によって予測する値がずれてしまいます。
この人によって予測する直線がずれる問題を解決してくれる手法が最小二乗法です。
最小二乗法は平たく言えば、数式で中心を通る直線決める手法です。
最小二乗法で引いた直線を回帰直線といいます。
もちろん、何を持って点の集まりの中心を定義するかによりますが、最小二乗法は広く使用される手法であり、点の集まりの中心の定義として代表的なものです。

ちなみに、最小二乗法は、最小自乗法と呼ばれることもあるので、覚えておきましょう。
では、最小二乗法はどのようにして、点の中心を定義しているのでしょうか。
式的な説明は次の数式を使って理解編で解説しますが、ここではグラフで説明したいと思います。
次のグラフをみてください。

#最小二乗法説明用の図
from matplotlib import pyplot as plt

xdata = list(range(10))
ydata = [_*2 for _ in xdata]

plt.plot(xdata, ydata, 'b')

plt.axvline(x=2, ymin=0.25, ymax=0.7)
plt.axvline(x=5, ymin=0.1, ymax=0.55)
plt.axvline(x=8, ymin=0.7, ymax=0.85)
plt.scatter(2,13)
plt.scatter(5,1)
plt.scatter(8,13)

plt.show()

では、「点の集まりの中心を通る直線」とはどういう意味でしょうか?
点の集まりと言われても、どの点たちの集まりでしょうか?
最小二乗法での、点の集まりの中心を通る直線という意味は、「直線から引いた各点までの垂線の距離の合計が最も短い直線」という意味です。
表示しているグラフでこの意味を説明します。
このグラフの場合、各点の数は、3つなので、垂線の数も3本になります。
垂線とは、グラフの場合、表示されている、直線から点まで伸びている縦線のことです。
この、3本の縦線のを足し合わせた長さが最小になるように計算する方法が最小二乗法で、それの通りに引いた直線のことを回帰直線といいます。

エンディング

人工知能レッスン3「最適化手法、最小二乗法と単回帰」の「数学不要。ゼロからわかる理論編」お疲れ様でした。
次は、数式も使用しながら、詳細に説明していきます。
それでは次のレッスンでお会いしましょう。