F検定で等分散かどうか確認して等分散であれば、Studentのt検定で、等分散でなければWelchのt検定。
| 項目 | スチューデントのt検定 | ウェルチのt検定 |
| 前提 | 分散が等しいこと | 分散が等しくなくても良い |
| t値の式 | t = (x̄1 – x̄2) / sqrt(sp^2*(1/n1 + 1/n2)) | t = (x̄1 – x̄2) / sqrt(s1^2/n1 + s2^2/n2) |
| 自由度 | n1 + n2 – 2 | |
| 長所 | 分散が等しい場合、検出力が高い | 分散の違いに強く、現実Dataでの適用性が高い |
| 短所 | 等分散を仮定する点が弱点 | |
| 適用例 | 分散がほぼ同じと考えられるDataなど | 分散が異なる可能性がある品質データなど |
対応のあるt検定と3種類。
でも、対応のないt検定はF検定も行わず、ウェルチのt検定をやればよいらしい。
等分散でもウェルチのt検定は問題ないから。スチューデントのt検定の方が検出力が高いとしても等分散でなければ誤った結果になってしまう。
当然等分散であることを前提とした、机上の練習でなければウェルチのt検定で。
スチューデントのt検定
scipy.stats.ttest_ind(equal_var=True)を使用
from scipy import stats
# サンプルデータ(例)
group1 = [18, 20, 22, 19, 21]
group2 = [14, 16, 15, 17, 13]
# Studentのt検定を実行
result = stats.ttest_ind(group1, group2, equal_var=True)
print(f"t統計量: {result.statistic:.4f}, p値: {result.pvalue:.4f}")
ウェルチのt検定
scipy.stats.ttest_ind(equal_var=False)を使用
from scipy import stats
group1 = [18, 20, 22, 19, 21]
group2 = [10, 25, 15, 30, 12] # ばらつきが大きいデータ
# Welchのt検定を実行
result = stats.ttest_ind(group1, group2, equal_var=False)
print(f"t統計量: {result.statistic:.4f}, p値: {result.pvalue:.4f}")
対応のあるt検定
scipy.stats.ttest_rel()を使用
from scipy import stats
# 同じ対象者の測定前と測定後
before = [70, 65, 80, 75, 68]
after = [68, 62, 75, 72, 65]
# 対応のあるt検定を実行
result = stats.ttest_rel(before, after)
print(f"t統計量: {result.statistic:.4f}, p値: {result.pvalue:.4f}")
t統計量
効果量との比較
t統計量とは
・役割:偶然ではなく、本当に意味のある差があるかを判定する。
・特徴:サンプルサイズ(データの数)が大きくなると、実際の差が小さくても値が大きくなりやすい。
・p値との関係:t統計量をもとに「p値」が計算され、p値が低い(例: 0.05未満)と「差がある(有意)」と判断されます。
効果量とは
・役割:データの単位に頼らない、標準化された「差の実質的な大きさ」を表す。
・特徴:サンプルサイズに影響されにくいため、本当の効果の強さがわかる。
・t検定での指標:2群の平均値の差を見るt検定では、主にコーエンのd(Cohen’s d)が使われます。
t統計量 = 効果量 × サンプルサイズの補正
コーエンのd
2グループの平均の差って標準偏差と比べた時どのくらいの割合?ってこと。
dの基準:0.2だと小、0.5だと中、0.8だと大と。
コーエンのdは分布の重なりと解釈をすることも可能。
0.2だと重なりが82.7%、0.5だと重なりが67.0%、0.8だと重なりが52.6%。
重なっている部分が多いと違いが少ない。
def cohens_d(x1, x2):
n1 = len(x1)
n2 = len(x2)
x1_mean = x1.mean()
x2_mean = x2.mean()
s1 = x1.std()
s2 = x2.std()
s = np.sqrt((n1*np.square(s1)+n2*np.square(s2))/(n1+n2))
d = np.abs(x1_mean-x2_mean)/s
return d
