教育データ分析入門2 第1回

  • 1.1 散布図
  • 1.2 回帰分析
    • 1.2.1概要
    • 1.2.2 すべて計算する方法
    • 1.2.3 公式で求める方法
    • 1.2.4 パッケージを使用する方法
    • 1.2.5 予測
    • 練習問題

1.1 散布図¶

  • ひとつの点が一人を表す。
  • 一人が2つの量を持つ。
  • 縦軸と横軸にそれぞれの量を表している。
  • 2つの量の関係を見るために用いられる。
  • 例えば、以下のデータでXが物理のテストの点数、Yが数学のテストの点数だとする。
In [1]:
# 散布図を描いてみましょう。
import matplotlib.pyplot as plt
%matplotlib inline

X = [3,10,11,15,22,28,25,17,13,20]
Y = [5,9,15,16,29,29,20,22,20,15]

plt.xlim([0,30])
plt.ylim([0,30])
plt.scatter(X,Y)
Out[1]:
<matplotlib.collections.PathCollection at 0x7fc0e0e20080>

1.2 回帰分析¶

1.2.1概要¶

  • 2変数の関係を表す指標として共分散と相関係数を学びました。
  • 2変数の関係が強い場合(一方が上がればもう一方も上がるなど)、
  • 一方の変数からもう一方の変数を予測することができます。
  • 例えば以下のような直線的な関係があると仮定することができます。
In [2]:
# 散布図に直線を加えてみましょう。
import numpy as np
x = np.arange(0,30,0.1) # np.arangeで0から30までの間の値を0.1刻みで生成する

# 生成したxにaをかけてbを足した値をyとする
a = 1
b = 2.5
y = a*x + b

plt.xlim([0,30])
plt.ylim([0,30])
plt.scatter(X,Y)

# 生成したxとyの線グラフの描画
plt.plot(x,y,color="red")
Out[2]:
[<matplotlib.lines.Line2D at 0x7fc0e1006470>]
  • このように2変数の関係を分析することは回帰分析と呼ばれ、
  • 2変数に$y = ax + b$(回帰式)という関係があると仮定します(そうじゃない場合もあるけど)。
  • この直線はすべての点からの距離の総和が小さい直線です。
In [3]:
# 以下は描画のためのコード
x = np.arange(0,30,0.1)
y = x + 2.5
plt.scatter(X,Y)
plt.plot(x,y,color="r")
for x,y in zip(X,Y):
    plt.plot([x,x],[y,x+2.5],"grey")
  • つまり、$ \sum_{i=0}^n (y_i - ax_i + b)$(誤差の総和)が最小になるaとbを求めます。
  • aの値はだいたい1前後
  • bの値は3から5の間ぐらい
  • 実際にある程度の範囲で確かめてみましょう。

1.2.2 すべて計算する方法¶

In [4]:
# a(傾き)の候補のリストを作成
A = np.arange(0,2,0.1)

#b(切片)候補のリストを作成
B = np.arange(1,5,0.1)

# aを固定してbの値を変化させたリストを作成
D = []

for a in A:
    for b in B:
        D.append([a,b])
In [5]:
# すべての組み合わせの誤差の総和を算出

E = []

for a,b in D:
    diff = 0
    for x,y in zip(X,Y):
        d = (y - (a*x+b))**2
        diff += d
    E.append(diff)
In [6]:
# 誤差がどのように変化するか視覚的に確認してみましょう。
A_c = []
B_c = []
for a,b in D:
    A_c.append(a)
    B_c.append(b)
In [7]:
import pandas as pd
data = pd.DataFrame({"A":A_c,"B":B_c,"E":E})
data.plot(x="A",y="B",c="E",kind="scatter")
Out[7]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc0e1fba278>
In [8]:
# Eの最小値
np.min(E)
Out[8]:
160.7
In [9]:
# Eの最小値のインデクス
E.index(np.min(E))
Out[9]:
382
In [10]:
# 最小値を算出したaとbの値
D[E.index(np.min(E))]
Out[10]:
[0.9, 3.200000000000002]

描画してみましょう。

In [11]:
a, b = D[E.index(np.min(E))]
x = np.arange(0,30,0.1)
y = a*x + b

plt.xlim([0,30])
plt.ylim([0,30])
plt.plot(x,y,color="red")
plt.scatter(X,Y)
Out[11]:
<matplotlib.collections.PathCollection at 0x7fc0e21393c8>

1.2.3 公式で求める方法¶

  • ですが、以下の式でaとbが求められることがしれれています。
$$ a = \frac{Cov(x,y)}{\sigma_x^2} $$$$ b = \mu_y - a\mu_x $$
  • $ Cov(x,y) $ : xとyの共分散
  • $ \sigma_x^2 $ : xの分散
  • $ \mu_y $ : yの平均
  • $ \mu_x $ : xの平均
In [12]:
mu_x = np.average(X)

s2_x = np.var(X,ddof=1)

mu_y = np.average(Y)

cov_xy = np.cov(X,Y)[0][1]

a = cov_xy / s2_x

b = mu_y - a * mu_x

print(a,b)
0.8559256390395042 3.9628195197521308

描画してみましょう。

In [13]:
x = np.arange(0,30,0.1)
y = a*x + b

plt.xlim([0,30])
plt.ylim([0,30])
plt.plot(x,y,color="red")
plt.scatter(X,Y)
Out[13]:
<matplotlib.collections.PathCollection at 0x7fc0e21b72b0>

1.2.4 パッケージを使用する方法¶

もちろん、パッケージもあります。

In [14]:
# パッケージのimport
from scipy import polyfit
a,b = polyfit(X,Y,1)
print(a,b)
0.8559256390395048 3.9628195197521143
In [15]:
x = np.arange(0,30,0.1)
y = a*x + b

plt.xlim([0,30])
plt.ylim([0,30])
plt.plot(x,y,color="red")
plt.scatter(X,Y)
Out[15]:
<matplotlib.collections.PathCollection at 0x7fc0e266acf8>
  • さて、Xが物理のテスト、Yが数学のテストの得点でした。
  • 物理のテストで20点をとった人は数学のテストでは何点を取ることが予測されるでしょう。

1.2.5 予測¶

In [16]:
# 物理のテストで20点とった人の数学のテストの予測得点
a * 20 + b
Out[16]:
21.081332300542208

練習問題¶

  • ../DATA01/IEDA2_02.csvを読み込み、TEST_AとTEST_Bの散布図を描きましょう。
  • ここまで授業で扱った3つの方法を用いて、TEST_AからTEST_Bを予測する回帰式を求めましょう。
  • TEST_AはTEST_Bの事前テスト(模試)だとします。TEST_Bの合格点が180点だとすると、TEST_Aで何点とっていれば、TEST_Bで合格すると言えるでしょう。
  • Pandasで読み込んだデータをリストにするにはX = list(data["TEST_A"])のように書きます。