Python

【Python】t検定の方法(ウェルチ、スチューデントの使い分け)

Python

どうも、月見(@Suzuka14144156)です。

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

例えば、以下のデータがあったとき、両者の標本に有意差があるのか?を調べるために使います。

t検定とは?

  • t検定は、統計学において2つの平均値の差を比較するために用いられる検定方法の一つです。
  • 特に、母集団の分布が正規分布に従う場合に使用されます

t検定は、通常、2つの独立した標本の平均値が統計的に有意に異なるかどうかを判断するために使用されます。

例えば、2つの薬の効果を比較するために、それぞれの薬を別々のグループに与えて、その結果の平均値を比較する場合などに利用されます。

t検定の基本的な考え方は、2つの平均値の差が統計的に有意かどうかを判断するために、標本の平均値の差を標準誤差で割ったt値を計算し、そのt値をt分布と比較するというものです。

t検定の使い分けと今回の記事のスコープ

今回は、ユースケースとして最も頻度が高いと思われる、以下の赤枠に絞って解説します。

  • ステューデントのt検定
  • ウェルチのt検定

Pythonでt検定するための環境の構築

今回は、Jupyte Labを用います。

Juptrer Labのインストール

インストール方法は以下2種類ある。

  1. Anacondaをインストール
  2. JupyterLabを直接インストール
月見
月見
  • どちらでもOKです

ただ、Anacondaをインストールする方が時間がかかるのでお急ぎの方は、「JupyterLabを直接インストール」がオススメ。

Anacondaをインストール

以下の記事を参考にしてください。

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()
  • df[df.target == 0]を用いることで、target=0のみの行を抽出することができる

sepal length (cm)をtarget=0とtarget=1毎にヒストグラムを描きます。

各統計量を確認

target_0['sepal length (cm)'].describe()
target_1['sepal length (cm)'].describe()
  • 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検定で確認する必要がある

なので、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はオンライン講座です。

一度購入すれば、ずっと閲覧できるのでオススメです。

【世界で8万人が受講:Python for Finance】Pythonを使って学ぶ現代ファイナンス理論と実践
ポートフォリオ理論、コーポレートファイナンス、資本資産評価モデル(CAPM)、デリバティブの値決め、モンテカルロシミュレーションといった内容を中心に、Pwcなどで活躍した講師が理論と実践に基づき解説します。

まとめ

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

コメント

タイトルとURLをコピーしました