1元配置分析とは、分散分析の一分析手法で、水準の種類が1種類の時に使う検定方法です。
例えば、複数のクラス間でテストの点数の平均に差がある時などに使うことができます。
ここでは、クラスが水準となります。
具体例
では、複数のクラス間でテストの点数の平均に差があるかどうかを見てみようと思います。
pythonで実装してみる
先程あげたよなクラス間のテストの平均に差があるかを1元配置分析を使って検定(もどき)してみようと思います。
今回はA, B, C, Dという4つのクラスがあり、各クラスは30人の生徒がいるとします。
まず今回使うモジュール群をimportします。
import pandas as pd
import numpy as np
from scipy import stats as st
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()
%matplotlib inline
クラス間で平均が異なる場合
まずはクラス間で点数の平均が異なる場合について実験してみます。
では、各クラスの点数のデータを作ってみます。
# データを作る
A = np.random.normal(loc=30, scale=10, size=30)
B = np.random.normal(loc=50, scale=10, size=30)
C = np.random.normal(loc=60, scale=10, size=30)
D = np.random.normal(loc=65, scale=10, size=30)
df = pd.DataFrame({'A':A, 'B':B, 'C':C, 'D':D})
df.head()
各クラスがどのような点数の分布かを見てみます。
ax_list=df.hist()
ax_list[0][0].set_xlim((0,100))
ax_list[0][1].set_xlim((0,100))
ax_list[1][0].set_xlim((0,100))
ax_list[1][1].set_xlim((0,100))
では、検定に必要なF値とP値を出力してみます。f_onewayメソッドを使うことで、F値とP値を出力します。
f, p = st.f_oneway(df["A"],df["B"],df["C"],df["D"])
print("F=%f, P=%f"%(f,p))
#=> F=919.132190, p-value = 0.000000
有意水準によりますが、有意水準を5%などにした場合、P値がp<0.05 なので、仮説を棄却できます。つまり平均に差があると言えます。
平均に差がない場合
同様に平均に差がない場合についても見てみます。
# 次に平均が近いデータを作って検定してみる
A = np.random.normal(loc=50, scale=10, size=30)
B = np.random.normal(loc=50, scale=10, size=30)
C = np.random.normal(loc=50, scale=10, size=30)
D = np.random.normal(loc=50, scale=10, size=30)
df = pd.DataFrame({'A':A, 'B':B, 'C':C, 'D':D})
ax_list=df.hist()
ax_list[0][0].set_xlim((0,100))
ax_list[0][1].set_xlim((0,100))
ax_list[1][0].set_xlim((0,100))
ax_list[1][1].set_xlim((0,100))
同様にF値などの統計量を出力します。
# p値>0.05なため帰無仮説を棄却できない、言い換えると平均値はかなり近い値になっているとわかる
f, p = st.f_oneway(df["A"],df["B"],df["C"],df["D"])
print("F=%f, P=%f"%(f,p))
#=>F=0.160291, P= 0.922841
参考文献
http://www.aoni.waseda.jp/abek/document/anova.html