どうも、月見(@Suzuka14144156)です。
今回は、Pythonでt検定の方法(ウェルチ、スチューデントの使い分け)を解説します。
例えば、以下のデータがあったとき、両者の標本に有意差があるのか?を調べるために使います。

t検定とは?
- t検定は、統計学において2つの平均値の差を比較するために用いられる検定方法の一つです。
- 特に、母集団の分布が正規分布に従う場合に使用されます。
t検定は、通常、2つの独立した標本の平均値が統計的に有意に異なるかどうかを判断するために使用されます。
例えば、2つの薬の効果を比較するために、それぞれの薬を別々のグループに与えて、その結果の平均値を比較する場合などに利用されます。
t検定の基本的な考え方は、2つの平均値の差が統計的に有意かどうかを判断するために、標本の平均値の差を標準誤差で割ったt値を計算し、そのt値をt分布と比較するというものです。
t検定の使い分けと今回の記事のスコープ
今回は、ユースケースとして最も頻度が高いと思われる、以下の赤枠に絞って解説します。
- ステューデントのt検定
- ウェルチのt検定

Pythonでt検定するための環境の構築
今回は、Jupyte Labを用います。
Juptrer Labのインストール
インストール方法は以下2種類ある。

- どちらでもOKです
ただ、Anacondaをインストールする方が時間がかかるのでお急ぎの方は、「JupyterLabを直接インストール」がオススメ。
Anacondaをインストール
以下の記事を参考にしてください。
Python Anacondaとは?|インストール〜Jupyter Notebookの立ち上げ
JupyterLabを直接インストール
コマンドプロンプトから、以下のコードを入力ください。
pip install jupyterlab
Pandasのインストール
Pandasは二次元のデータ配列を扱うために用いるライブラリです。
コマンドプロンプトから、以下のコードを入力ください。
anacondaをインストールした場合は、自動でインストールされるはずなので、以下のコマンドは不要です。
pip install pandas
Scipyのインストール
Scipyは、95%信頼区間を扱うために用いるライブラリです。
コマンドプロンプトから、以下のコードを入力ください。
pip install scipy
Matplotlibのインストール
Mtplotlibは、グラフに可視化するためのライブラリです。
コマンドプロンプトから、以下のコードを入力ください。
pip install matplotlib
日本語対応するために以下もインストールする。
pip install japanize-matplotlib
sklearnのインストール
sklearnは、アイリスデータを用いるために使用するライブラリです。
コマンドプロンプトから、以下のコードを入力ください。
anacondaをインストールした場合は、自動でインストールされるはずなので、以下のコマンドは不要です。
公式では、以下のコマンドをたたくように指示しています。
pip install -U scikit-learn
Pythonで95%信頼区間を計算する方法
アイリスデータのロード
import pandas as pd
from sklearn.datasets import load_iris
iris=load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris['target']
df

ヒストグラムで可視化
import matplotlib.pyplot as plt
import japanize_matplotlib
target_0 = df[df.target == 0]
target_1 = df[df.target == 1]
plt.hist(target_0['sepal length (cm)'],alpha=0.5,label='target=0')
plt.hist(target_1['sepal length (cm)'],alpha=0.5,label='target=1')
plt.legend()
plt.show()
sepal length (cm)をtarget=0とtarget=1毎にヒストグラムを描きます。

各統計量を確認
target_0['sepal length (cm)'].describe()

target_1['sepal length (cm)'].describe()

95%信頼区間を算出
from scipy import stats
def get_95(df):
a = 0.95 #信頼水準
d = len(df)-1 #自由度
m = df.mean() #標本平均
s = stats.sem(df) #標準誤差
target_95per_section = stats.t.interval(alpha = a, df = d, loc = m, scale =s)
target_95per = (target_95per_section[1] - target_95per_section[0])/2
return target_95per
target_0_95per = get_95(target_0['sepal length (cm)'])
target_1_95per = get_95(target_1['sepal length (cm)'])
yerr = [target_0_95per,target_1_95per]
yerr
以下がtarget_0とtarget_1の95%信頼区間。

95%信頼区間をエラーバーで可視化
x=['target_0','target_1']
bar_y = [target_0['sepal length (cm)'].describe()['mean'],target_1['sepal length (cm)'].describe()['mean']]
plt.bar(x,bar_y,yerr=yerr,capsize=5)
plt.ylabel('sepal length (cm)')
plt.text(x=-0.4,y=6,s='エラーバー:95%信頼区間')
plt.text(x=-0.4,y=5.5,s='n=50')
plt.show()

この結果から、target_0とtarget_1には、有意差がありそう。
なので、t検定をしていきましょう。
シャピロ・ウィルク検定(正規性の確認)
#2つ目の戻り値がp値
p0 = stats.shapiro(target_0['sepal length (cm)'])[1]
p1 = stats.shapiro(target_1['sepal length (cm)'])[1]
print('◆シャピロ・ウィルク検定')
print('-'*20)
print("target_0のp値:",round(p0,3))
if round(p0,3)<0.05:
print('正規分布とは言えない')
else:
print('正規分布である。')
print('-'*20)
print("target_1のp値:",round(p1,3))
if round(p1,3)<0.05:
print('正規分布とは言えない')
else:
print('正規分布である。')
以下が出力結果で、両者正規性が確認されました。

F検定(等分散性の確認)
#F検定
bartlett = stats.bartlett(target_0['sepal length (cm)'],target_1['sepal length (cm)'])
print('◆F検定')
print(bartlett)
if bartlett[1] < 0.05:
print('等分散性とは言えないので、Welchのt検定で検定する。')
else:
print('等分散性とは言えるので、Studentのt検定で検定する。')
以下が出力結果で、等分散性が確認されなかったです。

Welchのt検定
# Welchのt検定
welch_t = stats.ttest_ind(target_0['sepal length (cm)'],target_1['sepal length (cm)'], equal_var=False)
print('◆Welchのt検定')
print(welch_t)
if welch_t[1] < 0.05:
print('有意差あり。')
else:
print('有意差あるとは言えない')
出力結果は、以下です。

p<0.05なので、帰無仮説を棄却できます。
なので、有意差ありと言えます。
Studentのt検定
一応、等分散性があった場合を想定して、Studentのt検定のやり方も解説します。
# Studentのt検定
student_t = stats.ttest_ind(target_0['sepal length (cm)'],target_1['sepal length (cm)'])
print('◆Studentのt検定')
print(student_t)
if student_t [1] < 0.05:
print('有意差あり。')
else:
print('有意差あるとは言えない')

本記事の関連の参考書や講座
基本的なPythonのコード知識を学ぶには、以下の書物がオススメです。
Udemy
Udemyはオンライン講座です。
一度購入すれば、ずっと閲覧できるのでオススメです。

まとめ
今回は、Pythonでt検定の方法(ウェルチ、スチューデントの使い分け)を解説しました。
コメント