「t検定」について学ぶ(統計学 / 推定統計学 / 仮説検定 / パラメトリック)
この記事では、統計学を初めて学ぶ筆者が、「推定統計学」における「仮説検定」の手法である「t検定」について学んだ内容について記載しています。
学習には、Wikipediaの「t検定」の記事を参考にし、Pythonのプログラミングにも触れ、理解を深めました。
プログラミングには、機械学習ライブラリのscikit-learnを使用しました。
この記事は、他の人が参考にできるよう、わかりやすく書くことを心がけました。
t検定
t検定は、2つの標本(例えば、ある薬を服用するグループと服用しないグループ)の平均に有意な違いがあるかどうかを判断するための統計的手法です。t検定は、標本が正規分布に従っていると仮定し、その前提の下で、標本の平均値の差が偶然に生じる確率を計算します。この計算には、t分布というものが使われます。t分布は、標本サイズや自由度によって形が変わりますが、平均や標準偏差には依存しません。t検定を使うことで、帰無仮説(2つの標本の平均に差がない)を棄却するかどうかを判断できます。t検定は、統計的仮説検定の一種であり、帰無仮説の下でt分布に従う検定統計量を用いて行われます。
t検定(ティーけんてい)とは、帰無仮説が正しいと仮定した場合に、統計量がt分布に従うことを利用する統計学的検定法の総称である。母集団が正規分布に従うと仮定するパラメトリック検定法であり、t分布が直接、もとの平均や標準偏差にはよらない(ただし自由度による)ことを利用している。2組の標本について平均に有意差があるかどうかの検定などに用いられる。統計的仮説検定の一つ。日本工業規格では、「検定統計量が,帰無仮説の下でt分布に従うことを仮定して行う統計的検定。」と定義している。
t検定
種類
t検定には、以下のような種類があります。
2つの母集団が正規分布に従い、平均が等しいかどうかの検定。
- 対になった標本を用いる場合:例えば、同じ人に前後2回調査を行った場合、その2回の平均値に差があるかどうかを検定する場合です。
- 2つの独立した標本を用いる場合で、等分散性を仮定できる場合:例えば、男性グループと女性グループの平均値が等しいかどうかを検定する場合です。
- 2つの独立した標本を用いる場合で、等分散性を仮定できない(異分散)場合:例えば、男性グループと女性グループの標準偏差が異なる場合、異分散のt検定を用いて平均値の差を検定する場合です。
正規分布に従う母集団の平均が、特定の値に等しいかどうかを検定する場合:例えば、あるテストの平均点が50点であるかどうかを検定する場合です。
回帰直線の勾配が0と有意に異なるかどうかを検定する場合:例えば、ある商品の広告費と売上の関係を調べ、その関係が有意にあるかどうかを検定する場合です。
t検定は大きく次のように分けられる。
2つの母集団がいずれも正規分布に従うと仮定したうえでの、平均が等しいかどうかの検定。
- 標本が対になっている、つまり1組の標本のメンバー各々と、もう1組の特定のメンバーとの間に特別な関係がある場合(例えば、同じ人に前後2回調査する場合、夫と妻とで比較する場合など)。
- 標本が独立で、比較する2つの群の分散が等しいと仮定できる場合(等分散性の仮定)。
- 標本が独立で、等分散性が仮定できない(異分散)場合。これは正確にはウェルチのt検定と呼ばれる。
正規分布に従う母集団の平均が、特定の値に等しいかどうかの検定。
回帰直線の勾配が0と有意に異なるかどうかの検定。
方法
一群のt検定
一群のt検定は、ある母集団の平均値μが特定の値μ0と等しいかどうかを検証するために使用されます。例えば、ある製品の製造工程を改善し、その製品の重さが平均的に1kgであると主張する場合を考えてみます。
以下に、ある母集団の平均値が特定の値と等しいかどうかを検証するt検定の手順を具体的に記載します。
- 帰無仮説と対立仮説を設定する。
- 帰無仮説(H0): 母集団の平均値μは特定の値μ0と等しい。
- 対立仮説(H1): 母集団の平均値μは特定の値μ0と等しくない。
- 標本を取得し、標本平均(x̄)を計算する。
- 検定統計量(t値)の計算
- t値 = (x̄ – μ0) / (s / √(n))
- ここで、sは標本の標準偏差、nは標本の大きさです。
- 有意水準(α)と自由度(df)の設定
- 有意水準(α)は一般的には、0.05や0.01が使われることが多いです。
- 自由度(df)は、n-1です。
- t分布表の利用
- t分布表を使って、有意水準(α)と自由度(df)に対応するt値の棄却域を求めます。
- p値の計算
- p値は、t分布表を使って求めたt値の棄却域と、実際に求めたt値の差によって求めます。
- 片側検定の場合、p値は、分布表の片側の確率として求めます。両側検定の場合は、分布表の両側の確率を合計した値をp値として求めます。
- 帰無仮説の棄却または採択
- p値が有意水準(α)より小さい場合、帰無仮説を棄却し、対立仮説を採択します。
- p値が有意水準(α)より大きい場合、帰無仮説を採択します。
母集団の平均値μが特定の値である μ0と等しいかどうかの帰無仮説を検定する際に使用する。
は標本平均でありsは 標本の標準偏差である。標本サイズはnであり、t検定における自由度はn − 1である。
帰無仮説の棄却と採択
p値は、帰無仮説の下で、検定統計量が観測された値以上の極端な値が得られる確率を示します。つまり、p値が小さいほど、検定統計量が観測された値が偶然ではなく、帰無仮説が間違っている可能性が高くなります。一般的に、有意水準は5%(0.05)が使用されます。つまり、p値が0.05未満の場合は、検定統計量が偶然ではなく、帰無仮説が間違っている可能性が高く、帰無仮説を棄却して、対立仮説を採用することができます。逆に、p値が0.05以上の場合は、検定統計量が偶然の誤差である可能性が高く、帰無仮説を採択することができます。このため、p値と有意水準を比較して、帰無仮説を棄却するか採択するかを決定します。
両側検定と片側検定
t検定における両側検定と片側検定の違いは、帰無仮説の棄却領域をどのように設定するかにあります。
両側検定は、帰無仮説の棄却領域が分布の両側にある検定です。つまり、標本平均が母平均よりも大幅に大きいか小さいか、どちらか一方であれば、帰無仮説を棄却します。例えば、ある飲料水の平均カロリーが100kcalであると主張されている場合、両側検定を用いると、カロリーが100kcalよりも大幅に高い場合や低い場合に帰無仮説を棄却します。
一方、片側検定は、帰無仮説の棄却領域が分布の片側にある検定です。つまり、標本平均が母平均よりも大幅に大きいか小さいか、どちらか一方のみであれば、帰無仮説を棄却します。例えば、ある薬品の平均投与量が10mgであると主張されている場合、片側検定を用いて、薬品の平均投与量が10mgよりも少ない場合のみに帰無仮説を棄却します。
両側検定を選ぶ場合は、検定結果の向きに関係なく、平均値が目標値から大きく外れることが問題である場合に使用されます。一方、片側検定を選ぶ場合は、検定結果が特定の方向に偏っていることが問題である場合に使用されます。
例えば、ある薬品の平均効果が5日間であると主張されている場合、実際には効果が5日以上必要である場合に問題が生じます。この場合、片側検定を用いて、薬品の平均効果が5日以上であることを確認します。
一般的に、両側検定は調査結果が予想外の方向に偏っている可能性がある場合、片側検定はあらかじめ予想された方向に偏っていることが明らかな場合に使用されます。
Pythonプログラミング
「一群のt検定」をイメージしやすいようPythonでのプログラミングについても学びます。
プログラム
一群のt検定を使用して製品の重さデータの平均値がある特定の値(ここではμ0=1.0)と統計的に有意な差があるかどうかを判定します。
import numpy as np
from scipy import stats
# 製品の重さのデータ(20件)
data = [0.95, 1.02, 1.10, 1.05, 1.01, 0.98, 1.03, 1.07, 0.99, 1.04,
1.08, 1.02, 1.01, 1.03, 0.97, 1.00, 1.06, 1.04, 1.03, 1.01]
# 母集団の平均値の仮説 μ0
mu0 = 1.0
# 一群のt検定を実行
t_statistic, p_value = stats.ttest_1samp(data, mu0)
# 結果の出力
print("統計量 (t-statistic):", t_statistic)
print("p値 (p-value):", p_value)
# 統計的に有意な差があるかの判定
alpha = 0.05 # 有意水準 (通常は0.05)
if p_value < alpha:
print("統計的に有意な差があります。")
else:
print("統計的に有意な差はありません。")
実行結果
統計量は2.9452441028940823であり、p値は0.008308582401004586です。p値が有意水準0.05よりも小さいため、「統計的に有意な差があります。」と結果が表示されます。つまり、製品の重さのデータの平均値がμ0=1.0と異なることが統計的に証明されます。
統計量 (t-statistic): 2.9452441028940823
p値 (p-value): 0.008308582401004586
統計的に有意な差があります。
プログラムの説明
import numpy as np
from scipy import stats
NumPyライブラリとSciPyの統計モジュールをインポートします。
# 製品の重さのデータ(20件)
data = [0.95, 1.02, 1.10, 1.05, 1.01, 0.98, 1.03, 1.07, 0.99, 1.04,
1.08, 1.02, 1.01, 1.03, 0.97, 1.00, 1.06, 1.04, 1.03, 1.01]
製品の重さのデータをリストとして定義します。データは20件あります。
# 母集団の平均値の仮説 μ0
mu0 = 1.0
# 一群のt検定を実行
t_statistic, p_value = stats.ttest_1samp(data, mu0)
母集団の平均値の仮説をμ0=1.0として設定します。ここでは、母集団の平均値が1.0であるという仮説を検定します。
stats.ttest_1samp(data, mu0)
を使用して、一群のt検定を実行します。data
はデータの配列であり、mu0
は仮説の平均値です。t検定の結果として、t統計量とp値が返されます。
# 結果の出力
print("統計量 (t-statistic):", t_statistic)
print("p値 (p-value):", p_value)
# 統計的に有意な差があるかの判定
alpha = 0.05 # 有意水準 (通常は0.05)
if p_value < alpha:
print("統計的に有意な差があります。")
else:
print("統計的に有意な差はありません。")
統計量 (t-statistic)とp値 (p-value)を表示します。
有意水準を0.05に設定します。有意水準は、統計的な差を判断するための基準です。通常は0.05がよく使用されます。
p値と有意水準を比較して、統計的に有意な差があるかどうかを判定します。
最後に、統計的に有意な差の有無を出力します。
回帰分析の係数
回帰分析は、説明変数と目的変数の関係を分析する統計手法の一つです。回帰分析のモデルでは、既存の説明変数xと目的変数yの間の関係を式で表し、その式のパラメータであるαとβを求めることで、xが与えられたときのyの値を予測することができます。 回帰分析では、βがある特定の値β0と等しいかどうかをテストすることができます。この場合、帰無仮説は「β = β0」となります。帰無仮説が正しい場合、回帰分析の結果は偶然の誤差によるものであり、β0との間に有意な差があるとは言えません。逆に、帰無仮説が誤っている場合、β0と異なる値が推定されます。
回帰分析における仮説検定の手順は以下の通りです。
- 帰無仮説と対立仮説を設定する。
- 帰無仮説:回帰係数がある特定の値 β0 と等しい(H0: β = β0)
- 対立仮説:回帰係数が β0 と異なる(H1: β ≠ β0)
- 標本を取得し、標本平均を計算する。
- データから説明変数と目的変数のペアを n 個取得する。
- 取得したデータから回帰分析を行い、回帰係数 β̂ とその標準誤差 SE(β̂) を求める。
- 検定統計量(t値)の計算
- t値 = (β̂ – β0) / SE(β̂)
- 有意水準と自由度の設定
- 有意水準(α)を設定する。一般的には、α=0.05やα=0.01が使われる。
- 自由度(df)を求める。df = n – k – 1(n:サンプルサイズ、k:説明変数の数)
- t分布表の利用
- t分布表を使用して、t値と自由度から、両側検定の場合は片側のp値を求める。
- 片側検定の場合は、t値と自由度から片側のp値を求める。
- p値の計算
- 求めたp値を有意水準と比較し、帰無仮説を棄却するか採択するかを決定する。
- 有意水準よりも p値が小さい場合、帰無仮説を棄却する(p < α)。
- 有意水準よりも p値が大きい場合、帰無仮説を採択する(p ≥ α)。
- 帰無仮説の棄却または採択
- 帰無仮説を棄却する場合は、「回帰係数は β0 と異なる」と結論づける。
- 帰無仮説を採択する場合は、「回帰係数は β0 と等しい」と結論づける。
次のような回帰分析のモデルを考える。
xi, i = 1, …, nは既存の説明変数であり、αとβは未知の係数である。そしてεiは独立に同一の正規分布に従った期待値0で未知の分散σ2であるランダムな誤差とする。Yi, i = 1, …, nは観測値である。この際、βがある特定の値β0と等しいかどうかをテストしたい (多くの場合β0は 0である。何故なら、βが0であればxとyに相関性が無いと言う事になり、0以外の値であればxとyは相関しているということになる)。
すると
帰無仮説が正しければ、この数値(t値という)は自由度がn − 2のt分布に従う。
すると は
Pythonプログラミング
「回帰係数のt検定」をイメージしやすいようPythonでのプログラミングについても学びます。
プログラム
線形回帰分析を実行し、特定の値に対して回帰係数のt検定を行います。
import numpy as np
import statsmodels.api as sm
from scipy import stats
# 説明変数 x
x = [1, 2, 3, 4, 5]
# 目的変数 y
y = [2, 4, 5, 6, 8]
# 定数項を追加した説明変数行列
X = sm.add_constant(x)
# 線形回帰モデルの作成
model = sm.OLS(y, X)
# 回帰分析の実行
results = model.fit()
# βの特定の値 β0
beta0 = 2.0
# t検定
t_value = (results.params[1] - beta0) / results.bse[1]
p_value = 2 * (1 - stats.t.cdf(abs(t_value), results.df_resid))
# 結果の出力
print("統計量 (t-statistic):", t_value)
print("p値 (p-value):", p_value)
# 統計的に有意な差があるかの判定
alpha = 0.05 # 有意水準 (通常は0.05)
if p_value < alpha:
print("統計的に有意な差があります。")
else:
print("統計的に有意な差はありません。")
実行結果
結果の出力によれば、統計量(t-statistic)は-5.19615242270663、p値(p-value)は0.013846832988859026であり、p値が有意水準(alpha)以下のため、「統計的に有意な差があります」と判定されています。
つまり、この回帰分析では、目的変数 y
と説明変数 x
の間に統計的に有意な関係があることが示されています。
統計量 (t-statistic): -5.19615242270663
p値 (p-value): 0.013846832988859026
統計的に有意な差があります。
プログラムの説明
import numpy as np
import statsmodels.api as sm
from scipy import stats
必要なライブラリをインポートします。
numpy
は数値計算のためのライブラリです。statsmodels.api
は統計モデリングのためのAPIを提供するライブラリです。scipy.stats
は科学計算や統計関連の機能を提供するライブラリです。
# 説明変数 x
x = [1, 2, 3, 4, 5]
# 目的変数 y
y = [2, 4, 5, 6, 8]
説明変数 x を定義します。ここでは、1から5までの値をリストとして指定しています。
目的変数 y を定義します。ここでは、2から8までの値をリストとして指定しています。
# 定数項を追加した説明変数行列
X = sm.add_constant(x)
# 線形回帰モデルの作成
model = sm.OLS(y, X)
# 回帰分析の実行
results = model.fit()
定数項を追加した説明変数行列 X
を作成します。sm.add_constant
関数を使用して、説明変数 x
に定数項の1を追加します。
sm.OLS
を使用して、線形回帰モデルを作成します。y
を目的変数、X
を説明変数として指定します。
model.fit()
を呼び出して回帰分析を実行し、結果を取得します。
# βの特定の値 β0
beta0 = 2.0
# t検定
t_value = (results.params[1] - beta0) / results.bse[1]
p_value = 2 * (1 - stats.t.cdf(abs(t_value), results.df_resid))
特定の値 beta0
を設定します。この値は、回帰係数と比較するために使用されます。
t検定の統計量 t_value
を計算します。回帰係数と beta0
の差を、標準誤差で割った値です。
p値を計算します。stats.t.cdf
関数を使用して、統計量 t_value
を自由度 results.df_resid
でのt分布の累積分布関数に代入し、1から引いて2倍した値です。
# 結果の出力
print("統計量 (t-statistic):", t_value)
print("p値 (p-value):", p_value)
# 統計的に有意な差があるかの判定
alpha = 0.05 # 有意水準 (通常は0.05)
if p_value < alpha:
print("統計的に有意な差があります。")
else:
print("統計的に有意な差はありません。")
統計量とp値を出力します。
有意水準 alpha
を設定し、p値と比較して統計的に有意な差があるかどうかを判定します。
最後に、統計的に有意な差の有無を出力します。
独立二群の平均値の差の検定
独立二群の平均値の差の検定は、2つの母集団からそれぞれ標本を抽出して、その標本から求めた平均値の差が偶然に生じたものではないかどうかを検証する統計的手法です。
例えば、ある薬剤を投与したグループとプラセボを投与したグループの平均的な効果に差があるかどうかを調べたいとします。この場合、薬剤を投与したグループを一つ目の母集団、プラセボを投与したグループを二つ目の母集団として、それぞれから標本を抽出して、その標本から得られた平均値の差が統計的に有意なものであるかどうかを検定します。
以下は、独立二群の平均値の差の検定の手順です。
- 帰無仮説と対立仮説を設定する。
- 帰無仮説: μ1 – μ2 = 0
- 対立仮説: μ1 – μ2 ≠ 0 (両側検定) μ1 – μ2 > 0 または μ1 – μ2 < 0 (片側検定)
- 標本を取得し、標本平均を計算する。
- それぞれの標本から標本平均 x̄1, x̄2 を計算する。
- 検定統計量(t値)の計算
- 検定統計量 t = (x̄1 – x̄2) / (s_p * √(1/n1 + 1/n2))
- ここで、s_p^2 = ((n1-1)*s1^2 + (n2-1)*s2^2) / (n1 + n2 – 2)
- s1, s2 はそれぞれの標本の不偏分散、n1, n2 はそれぞれの標本の大きさを表す。
- 有意水準と自由度の設定
- 有意水準 α を設定する(例えば、α=0.05やα=0.01など)。
- 自由度 df を計算する。
- df = n1 + n2 – 2
- t分布表の利用
- 計算した t 値と自由度 df から、t分布表を用いて p 値を求める。
- p値の計算
- t分布表から求めた片側検定の場合のp値を、両側検定の場合は p = 2 * P(T > |t|) と計算する。
- ここで、Tはt分布、|t|はtの絶対値を表す。
- 帰無仮説の棄却または採択
- p 値が有意水準 α より小さい場合、帰無仮説を棄却する。
- p 値が有意水準 α より大きい場合、帰無仮説を採択する。
一つ目の母集団の平均値μ1が2つ目の母集団の平均値μ2と等しいかどうかの帰無仮説を検定する際に使用する。言い換えるとμ1-μ2=0かどうかの帰無仮説を検定する。
t検定を始める前に
実務的なデータ分析では、t検定を行う前に、母集団が正規分布に従うかどうかを検定することがあります。これは、t検定を行う前提条件として、標本のデータが正規分布に従っていることが望ましいためです。正規性検定には、コルモゴロフ-スミルノフ検定やシャピロ-ウィルク検定などがあります。
たとえば、ある病院で医師が処方した薬剤の効果を調べるために、薬剤を投与する前と後で患者の体重を測定したデータがあるとします。この場合、検定の前提条件である正規性が満たされているかどうかを調べるため、シャピロ-ウィルク検定を実施します。シャピロ-ウィルク検定では、標本データが正規分布に従うかどうかを検定します。もしp値が有意水準(一般的には0.05や0.01など)よりも大きい場合、帰無仮説「標本データは正規分布に従う」を採択します。正規性が満たされない場合、t検定を実施することはできません。
また、t検定では等分散性が仮定されていますが、実際のデータでは等分散性が満たされていないことがあります。その場合、F検定などによって等分散性を検定し、その結果を踏まえてスチューデントのt検定またはウェルチのt検定を行うことができます。ただし、このように検定を複数行うことで、誤った結論を導く可能性があるため、推奨されません。そのため、等分散性について考慮する必要のないウェルチのt検定を用いることが推奨されます。ウェルチのt検定は等分散性について頑健なので、事前に等分散性の検定を行う必要はありません。
実務的なデータ分析では、母集団が様々な前提を満たしているかどうかを調べるため、以下のような検定をt検定の前段階に行う場合がある。母集団が正規分布に従うかどうかは、コルモゴロフ-スミルノフ検定やシャピロ-ウィルク検定などの正規性検定によって判断することもできる。なお、F検定等により等分散性を検定し、その結果を踏まえてスチューデントのt検定またはウェルチのt検定を行う二段階の検定方法は、検定の多重性の問題が生じるため推奨されない。等分散性について考慮する必要のないウェルチのt検定を用いればよい(ウェルチのt検定は等分散性について頑健なので、事前に等分散性の検定を行う必要はない)。
等分散性
等分散性とは、2つ以上の母集団の分散が等しいかどうかを示す統計用語です。等分散性がある場合、母集団の分散は同じであると考えられます。例えば、ある工場で生産された2つの製品の重量が等分散である場合、2つの製品の重量のばらつきは同じであると考えられます。
等分散性が仮定されている場合、スチューデントのt検定が適用されます。しかし、等分散性がない場合、ウェルチのt検定がより適切です。
等分散性を検定する方法はいくつかありますが、最も一般的な方法は、F検定です。この検定では、2つの母集団の分散比を検定します。F検定は、分散比の結果をF分布表に基づいて評価し、p値を算出します。p値が有意水準よりも小さい場合、等分散性の仮定を棄却します。
例えば、ある市で住民の年収を調べたい場合、男性と女性で年収が等分散であるかどうかを検定する必要があります。男性の年収の分散をs1^2、女性の年収の分散をs2^2とすると、F検定ではs1^2/s2^2を計算し、F分布表を用いてp値を算出します。p値が有意水準よりも小さい場合、等分散性の仮定を棄却し、ウェルチのt検定を使用します。
Pythonプログラミング
「独立二群の平均値の差のt検定」をイメージしやすいようPythonでのプログラミングについても学びます。
プログラム
2つのグループ間の独立二群の平均値の差のt検定を行います。
import numpy as np
from scipy import stats
# グループ1のデータ
group1 = [10, 12, 14, 16, 18]
# グループ2のデータ
group2 = [8, 11, 13, 15, 17]
# t検定
t_statistic, p_value = stats.ttest_ind(group1, group2)
# 結果の出力
print("統計量 (t-statistic):", t_statistic)
print("p値 (p-value):", p_value)
# 統計的に有意な差があるかの判定
alpha = 0.05 # 有意水準 (通常は0.05)
if p_value < alpha:
print("統計的に有意な差があります。")
else:
print("統計的に有意な差はありません。")
実行結果
有意水準 (alpha
) と比較して、統計的に有意な差があるかどうかを判定します。このプログラムでは、有意水準を0.05としています。もしp値が有意水準以下の場合、統計的に有意な差があると判断されます。結果の出力によれば、統計的に有意な差はないと判定されています。
統計量 (t-statistic): 0.5694947974514991
p値 (p-value): 0.5846522205119927
統計的に有意な差はありません
プログラムの説明
import numpy as np
from scipy import stats
numpy
ライブラリと scipy
ライブラリから必要なモジュールをインポートします。
# グループ1のデータ
group1 = [10, 12, 14, 16, 18]
# グループ2のデータ
group2 = [8, 11, 13, 15, 17]
2つのグループのデータをリストで定義します。group1
にはグループ1のデータが、group2
にはグループ2のデータが格納されています。
# t検定
t_statistic, p_value = stats.ttest_ind(group1, group2)
stats.ttest_ind()
関数を使用して、2つのグループの平均値の差のt検定を実行します。この関数は、2つの独立した標本を引数として受け取り、t統計量とp値を返します。t_statistic
には統計量 (t-statistic)、p_value
にはp値 (p-value) が格納されます。
# 結果の出力
print("統計量 (t-statistic):", t_statistic)
print("p値 (p-value):", p_value)
# 統計的に有意な差があるかの判定
alpha = 0.05 # 有意水準 (通常は0.05)
if p_value < alpha:
print("統計的に有意な差があります。")
else:
print("統計的に有意な差はありません。")
結果を出力します。統計量とp値が表示されます。
最後に、統計的に有意な差があるかどうかを判定します。有意水準 (通常は0.05) を alpha
に設定し、p値と比較します。p値が有意水準以下の場合、統計的に有意な差があると判断されます。結果に応じて、該当するメッセージが表示されます。
関連二組の差の平均値のt検定
関連二組の差の平均値のt検定では、同じ対象について2回の測定を行った場合に、その差が偶然に生じたものではないかどうかを検証する統計的手法です。例えば、ある薬剤の効果を調べるために、薬剤を投与する前と後で患者の血圧を測定し、その差について検定する場合などに利用されます。
- 帰無仮説と対立仮説を設定する。
- 帰無仮説(H0): 差の母集団平均は特定の値 μ0 と等しい。
- 対立仮説(H1): 差の母集団平均は μ0 と異なる。
- 標本を取得し、標本平均を計算する。
- 同じ対象について2回の測定を行い、それぞれの差(di = Xi – Yi)を求める。
- 差の標本平均を計算し、それを X¯D とする。
- 検定統計量(t値)の計算
- 検定統計量 t0 を下記式で算出する。 t = (X¯D – μ0)/(sD/√n)
- X¯D: 差の標本平均
- μ0: 帰無仮説で設定した差の母集団平均
- sD: 差の標本標準偏差
- n: 対のデータ数
- 有意水準と自由度の設定
- 有意水準を決定し、両側検定か片側検定かを決める。
- 自由度 ν は対のデータ数 n -1 となる。
- t分布表の利用
- 自由度 ν と有意水準 α から、t分布表における両側または片側検定の臨界値を求める。
- p値の計算
- t値と自由度 ν から、p値を算出する。両側検定の場合は、求めたp値を2倍する。
- 帰無仮説の棄却または採択
- 求めたp値が有意水準 α より小さい場合、帰無仮説を棄却し、対立仮説を採択する。そうでない場合は、帰無仮説を採択する。
- また、求めたt値が臨界値よりも大きい場合、帰無仮説を棄却し、対立仮説を採択する。
n 対のデータがあるとし、対応する2変数をXi とYi 、両者の差をdi = Xi – Yi とする(i = 1, 2, … , n)。di の平均をとする。差の母集団の平均値μdが特定の値である μ0と等しいかどうかの帰無仮説を検定する際に使用する。
検定統計量 t0 を
により算出する。t分布の自由度はν = n -1となる。
Pythonプログラミング
「関連二組の差の平均値のt検定」をイメージしやすいようPythonでのプログラミングについても学びます。
プログラム
投与前と投与後のデータを比較して、関連二組の差の平均値のt検定を行います。
import numpy as np
from scipy import stats
# データの設定
before = [130, 135, 140, 138, 132] # 投与前のデータ
after = [125, 130, 137, 135, 128] # 投与後のデータ
# 差の計算
diff = np.subtract(after, before)
# t検定
t_statistic, p_value = stats.ttest_1samp(diff, 0)
# 結果の出力
print("統計量 (t-statistic):", t_statistic)
print("p値 (p-value):", p_value)
# 統計的に有意な差があるかの判定
alpha = 0.05 # 有意水準 (通常は0.05)
if p_value < alpha:
print("統計的に有意な差があります。")
else:
print("統計的に有意な差はありません。")
実行結果
統計量(t-statistic)の値は0.5694947974514991であり、p値(p-value)の値は0.5846522205119927です。有意水準0.05と比較すると、p値が大きいため、統計的に有意な差はないと判断されます。つまり、投与前と投与後のデータの差は、偶然によるものである可能性が高いと結論づけられます。
統計量 (t-statistic): 0.5694947974514991
p値 (p-value): 0.5846522205119927
統計的に有意な差はありません。
プログラムの説明
import numpy as np
from scipy import stats
numpy
とscipy
のライブラリをインポートします。
# データの設定
before = [130, 135, 140, 138, 132] # 投与前のデータ
after = [125, 130, 137, 135, 128] # 投与後のデータ
before
とafter
という2つのリストに投与前と投与後のデータを設定します。
# 差の計算
diff = np.subtract(after, before)
# t検定
t_statistic, p_value = stats.ttest_1samp(diff, 0)
np.subtract()
関数を使って、投与前と投与後のデータの差分を計算し、diff
というリストに格納します。
stats.ttest_1samp()
関数を使用して、diff
データに対して単一の標本のt検定を実行し、t統計量とp値を計算します。ここでは、diff
データを0と比較しています。
# 結果の出力
print("統計量 (t-statistic):", t_statistic)
print("p値 (p-value):", p_value)
# 統計的に有意な差があるかの判定
alpha = 0.05 # 有意水準 (通常は0.05)
if p_value < alpha:
print("統計的に有意な差があります。")
else:
print("統計的に有意な差はありません。")
print()
関数を使用して、計算されたt統計量とp値を出力します。
有意水準をalpha
という変数に設定します(通常は0.05)。
if
文を使って、p値が有意水準より小さいかどうかを判定し、統計的に有意な差の有無を出力します。
t検定の代替手段
t検定は、母集団が正規分布であるという前提が必要ですが、実際のデータ分析では、母集団の分布がどのような形をしているか分からない場合があります。この場合、t検定の代替手段として、大標本の場合にはZ検定があります。
Z検定は、標本平均が母集団平均とどの程度異なるかを確認する方法で、t検定と同様に、標本平均と母集団平均の差を標準誤差で割った値を求め、それを標準正規分布に照らし合わせて確率を計算します。
しかし、Z検定を適用するには、母集団の分布が正規分布に近似している必要があります。また、標本サイズが大きければ大きいほど、Z検定の結果が正確になります。
例えば、ある街の住民の平均年齢が35歳だと仮定します。この街の10人の住民の年齢を調査し、平均が37歳、標準偏差が5歳であったとします。この場合、標本サイズが小さいため、正規分布に近似しているとは限りません。そのため、t検定を適用することが適切です。
一方、同じ街の1000人の住民の年齢を調査した場合、標本サイズが大きくなるため、正規分布に近似している可能性が高くなります。その場合、Z検定を適用することができます。
ノンパラメトリック手法
ノンパラメトリック手法は、データが正規分布に従わない場合や標本サイズが小さい場合でも使える統計分析の手法です。パラメトリック手法(t検定やZ検定など)は、データが正規分布に従っているという前提がありますが、実際のデータが正規分布に従わない場合、t検定などは使えないことがあります。ノンパラメトリック手法は、データの分布についてあまり仮定を置かず、ランキング、中央値、分布などを用いて統計分析を行います。
例えば、2つのグループのデータを比較する場合を考えてみましょう。データが正規分布に従っている場合は、t検定を使うことができます。しかし、データが正規分布に従わない場合や標本サイズが小さい場合は、ノンパラメトリック手法を使う必要があります。例えば、ウィルコクソンの符号順位検定を使って、2つのグループの中央値の差を比較することができます。この場合、データが正規分布に従っているかどうかは関係ありません。
ただし、ノンパラメトリック手法はパラメトリック手法に比べて効率が悪く、検出力が低い場合があります。また、データの性質によっては必要な標本数が多くなる場合があります。ですが、データの性質が分からない場合や、正規分布に従わないデータの場合には、ノンパラメトリック手法を使うことが有用です。
ディスカッション
コメント一覧
まだ、コメントがありません