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

  • 1.3 平均への回帰
    • 1.3.1 平均への回帰の例
    • 1.3.2 誤解
    • 1.3.3 平均への回帰を考慮した教育効果 1/2
    • 1.3.4 平均への回帰を考慮した教育効果 2/2
    • 1.3.5 差の標準誤差(Standard Error of Difference)
    • 1.3.6 平均への回帰を考慮する
    • 1.3.7 平均への回帰を考慮した計算
  • 練習問題

1.3 平均への回帰¶

  • 2回の測定が反復して行われた場合に、1回目で平均からかなり離れていた値は2回目の測定で1回目の測定の平均値に近づくという統計的な現象。
  • 今回の内容は以下の論文に基づいています。
    • Koizumi, R., In'nami, Y., Azuma, J., Asano, K., Agawa, T., & Eberl, D. (2015). Assessing L2 proficiency growth: Considering regression to the mean and the standard error of difference. SHIKEN, 19(1), 3-15.

1.3.1 平均への回帰の例¶

  • 3ヶ月間の英語の授業の効果を調べるために、授業前と授業後で同じテストを行うと、1回目のテストでかなり高得点をとった受験者は2回目のテストでも平均よりは高い点数をとるだろうが、1回目に比べると平均値に近い点数をとる傾向にある。
  • 同様に、1回目のテストでかなり低い点数をとった受験者は2回目のテストで平均値に近い点数をとる傾向にあるので、2回目の点数は上がる傾向にある。
  • 以下のグラフはx軸が1回目のテスト、y軸が2回目のテストの得点とする。
  • オレンジの線が平均への回帰と呼ばれる現象である。
  • 青の線が$x = y$を表しているので、1回目のテストの点数が低い人の方が青の線の上にいて、1回目のテストの点数が高い人ほど青い線の下にいる。
  • 言い換えると、1回目の点数が高い人も低い人も2回目のテストでは1回目のテストの平均値に近づいていると言える。
In [1]:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1,10)
y = x
In [2]:
plt.plot(x,y)

y2 = 0.6 * x + 2

plt.scatter(x,y2,color="orange")
plt.plot(x,y2,linestyle="dotted")
Out[2]:
[<matplotlib.lines.Line2D at 0x116a81460>]
No description has been provided for this image
  • 上のグラフのx軸を1回目のテストの点数、y軸を2回目のテストの点数とする。
  • 青い線は$y = x$のグラフである。
  • この線上にデータがあれば1回目と2回目で同じ点数であることを示す。
  • 平均への回帰は、2回のテストの回帰直線が上のグラフのオレンジの線のようになることである。

1.3.2 誤解¶

  • 事前・事後でテストを行って教育改善の度合いを検証しようとする場合、この平均への回帰を考慮しないで判断が下される場合が多い。
  • 「あるテストを行い、下位25%の生徒に補講を行う。2回目のテストで補講を受けた生徒の点数は上昇する傾向があった。なので補講には効果があった。」しかし、これでは平均への回帰が考えられるため、「補講に効果があった」とは判断できない。

1.3.3 平均への回帰を考慮した教育効果 1/2¶

  • 3回のテストを行う: 事前テスト(A)、信頼性テスト(B)、事後テスト(C)
  • AとBのテストで回帰分析を行い、回帰直線の式を得る。
  • この回帰直線の式はテストBにおける練習効果や測定誤差を見るため。
  • テストBの得点は平均への回帰で2回のテストを行った場合何もしなくても得られる点数。 IEDA2_03

1.3.4 平均への回帰を考慮した教育効果 2/2¶

  • テストAとテストBで回帰分析をしたら、テストBの点数 = テストAの点数*0.7+22となった。
  • ある受験者のテストAの点数が50点
  • 平均への回帰があって、何も得ていなければテストCの点数は57 (50*0.7+22) 点。
  • テストCで実際の点数が70点であれば13 (70 - 57点の伸びと言える。
  • でも現実的に3回テストするのは難しい。
In [3]:
import pandas as pd
data = pd.read_csv("../DATA01/IEDA2_01.csv",index_col=0)
data.head()
Out[3]:
X Y Z
S001 50 60 65
S002 51 66 62
S003 66 70 66
S004 78 80 81
S005 90 85 88
In [4]:
import matplotlib.pyplot as plt
%matplotlib inline
In [5]:
plt.scatter(data["X"],data["Y"])
x = np.arange(40,100)
y = x
plt.plot(x,y,color="k",linestyle="dashed")
plt.ylim(40,100)
plt.xlim(40,100)
Out[5]:
(40.0, 100.0)
No description has been provided for this image
In [6]:
from numpy import polyfit
a,b = polyfit(data["X"],data["Y"],1)
print(a,b)
0.6188302770821553 30.757505991329403

1.3.5 差の標準誤差(Standard Error of Difference)¶

  • 差の標準誤差(SED)を考慮して得点を解釈する。
  • $ SED = \sigma_A \sqrt{2 - r_A - r_B} $
    • $\sigma_A$ : テストAの標準偏差
    • $r_A$ : テストAの信頼性係数
    • $r_B$ : テストBの信頼性係数
  • このSEDは68%の信頼区間
  • 95%の場合はこのSEDに1.96をかける。
  • テストAの分散が90、信頼性係数が0.8、テストBの信頼性係数が0.9である。
  • ある受験者のテストAの得点が250点、テストBの得点が330点の場合、SED(95%)を考慮すると、この受験者は得点が上がったと言えるか。
In [7]:
# SED
sed = np.sqrt(90) * np.sqrt(2 - 0.8 - 0.9) * 1.96
sed
Out[7]:
10.184458748504998
  • ここでは、テストの平均点の情報はないが、算出されたSEDを考慮してもこの受験者の得点は上がったと言える。
  • 差の標準誤差を考慮すると、この受験者のテストBでの得点は260(250+10)点なので、70(330 - 260)点上がったと言える。
  • 信頼区間を95%とした差の標準誤差10.18というここで算出した値は、100回テストAとテストBを受験した場合、95回は、テストBのスコアがテストAのスコア-10.18(あるいは+10.18)の間にあるということを示している。

1.3.6 平均への回帰を考慮する¶

  • 平均への回帰を考慮した2回目のテストにおける個人の得点は以下の式で算出できる。
  • 以下の式で算出される点数より2回目のテストの点数が上がっていれば、「点数が上がっている」と主張できる。

$$ Score = \mu_2 + r_{12}(\frac{\sigma_2}{\sigma_1})(X-\mu_1) $$

  • $ \mu_1 $: 1回目のテストの平均点
  • $ \mu_2 $: 2回目のテストの平均点
  • $ \sigma_1 $: 1回目のテストの標準偏差
  • $ \sigma_2 $: 2回目のテストの標準偏差
  • $ r_{12} $: 2つのテストの相関係数
  • $ X $: 1回目のテストの個人の得点

1.3.7 平均への回帰を考慮した計算¶

. 1回目 2回目
平均点 110.3 135.2
相関係数 0.88
標準偏差 21.2 29.3
受験者の得点 85 120
予想される点数 / 104.4

104.4 = 135.2 + 0.88 x (29.3 / 21.2) x (85 - 110.3)

練習問題¶

../DATA01/IEDA2_03.csvを読み込んで、

  1. pretestの点数をX軸、posttestの点数をY軸とした散布図を描きなさい。
  2. 以下の式を用いて、平均への回帰を考慮しても点数が上がった受験者の数を求めなさい。 $$ Score = \mu_2 + r_{12}(\frac{\sigma_2}{\sigma_1})(X-\mu_1) $$
  3. 以下の式を用いてSEDを求め、SEDを用いた場合に点数が上がったと判断できる受験者の数を求めなさい。pretest、posttestともに信頼性係数は0.8とする。 $$ SED = \sigma_A \sqrt{2 - r_A - r_B} $$
In [8]:
import pandas as pd
data = pd.read_csv("../DATA01/IEDA2_03.csv",index_col=0)
data.head()
Out[8]:
pretest posttest
S001 510 585
S002 722 800
S003 513 607
S004 730 800
S005 483 445