Pythonで2群間の差を検定する方法

スポンサーリンク
Python
ゼロ知識の初心者がデータサイエンスを完全無料で学習する方法5選
データサイエンスの知識や技術、またはPythonについて学びたい。でも「大学に行くほど本気度がない」、「スクールに行くほどお金がない」、なんせ「時間がない」という方も多いはずです。というよりほとんどの方がそうだと思います(当然わたし...
Rを使ってデータサイエンスが学べる書籍
データサイエンスといえはPythonですが、Rでもできます。 Rは統計学に特化したプログラミング言語ですが、さまざまなデータ分析ができます。Rを使って、統計学だけでなく、データサイエンスを学びたい初心者におススメな書籍を紹介します...

今回は、Pythonを使った統計手法として、2群間の差の検定をする方法をコードとともに見ていきましょう。
統計学はRを使うことが多くなりますが、簡単な統計手法であれば、Pythonでも十分できます。
Pythonの環境設定はAnacondaをインストールし、Jupyter Labを使って解析していきます。

【2021年最新】M1 mac でanacondaをインストールする方法

【2021年最新】WindowsでAnacondaをインストールする方法

必要なライブラリをインポート

import pandas as pd
import matplotlib.pyplot as plt
plt.style.use("ggplot")
%matplotlib inline

アイリスデータを読み込む

データはアイリスデータセットを使っていきましょう。

from sklearn.datasets import load_iris
iris=load_iris()
df_iris = pd.DataFrame(iris.data, columns=iris.feature_names)
df_iris['species']=iris.target
df_iris

アイリスの種類別の「sepal length (cm)」を使って検定してみましょう。

sepal_len_0 = df_iris[df_iris["species"]==0]["sepal length (cm)"]
sepal_len_1 = df_iris[df_iris["species"]==1]["sepal length (cm)"]

アイリスの「species」が0の「sepal length (cm)」を「sepal_len_0」
アイリスの「species」が1の「sepal length (cm)」を「sepal_len_1」
という2群を用意します。

各群の平均値と標準偏差を確認してみましょう。

print("sepal_len_0の平均値:",round(sepal_len_0.mean(),3))
print("sepal_len_0の標準偏差:",round(sepal_len_0.std(),3))
print("sepal_len_1の平均値:",round(sepal_len_1.mean(),3))
print("sepal_len_1の標準偏差:",round(sepal_len_1.std(),3))
print("2群の平均の差:",round(abs(sepal_len_0.mean()-sepal_len_1.mean()),3))

出力:
sepal_len_0の平均値: 5.006
sepal_len_0の標準偏差: 0.352
sepal_len_1の平均値: 5.936
sepal_len_1の標準偏差: 0.516
2群の平均の差: 0.93

正規性の確認

2群間の比較を行う場合、正規性を確認する必要があります。その方法がさまざまですが、今回はヒストグラム、QQプロット、シャピロウィルク検定を紹介します。

正規性の確認は必要ない、といわれることがありますが、正規性の確認は必要です。
正規性の確認が必要ないとする理由は、中心極限定理が成り立つからとなっています。しかし、中心極限定理が成り立つには、十分な数の母集団、十分な数の標本です。

では、十分な数とは? また、十分な数でないならやはり正規性の確認は必要? この疑問に答えられない限り、正規性の確認は必要です。そしてその疑問に答えるのは無理です。

中心極限定理は、母集団が正規性に従っていなくても、標本は正規性に従うということです。しかし実際に標本の正規性を確認して、正規性に従っていなければパラメトリック(連続変数でデータが正規性)な検定はするべきではないですね。なぜなら、tテストをはじめ、パラメトリック検定では平均値と標準偏差(分散)を使うからです、標本の分布がべき分布や二峰性なら、平均値や標準偏差は意味がないです。なので、パラメトリック検定では間違った結果になる可能性があります。

医学系の論文では、正規性の確認やドットプロットを確認するようになっています。
実際、横浜市立大学の中和抗体の研究では、ドットプロットでブラフ化していましたね。

Rapid detection of neutralizing antibodies to SARS-CoV-2 variants in post-vaccination sera
The uncontrolled spread of the COVID-19 pandemic has led to the emergence of different SARS-CoV-2 variants across the globe. The ongoing global vaccination stra...

初心者が注意すべき平均値の罠

【Python初心者が知らない】ドットプロットでデータを可視化する簡単な方法

ヒストグラム

plt.hist(sepal_len_0,bins=10)
plt.show()
plt.hist(sepal_len_1,bins=10)
plt.show()

【Python初心者】簡単なヒストグラムの描き方

QQプロット

QQプロットはデータが正規分布に従っていれば、右上がりにプロットされます。データが正規分布に従っていなけでば、歪んだプロットになります。

では確認してみましょう。

from scipy import stats

stats.probplot(sepal_len_0, plot=plt)
plt.show()
stats.probplot(sepal_len_1, plot=plt)
plt.show()

どちらも正規分布に従っていると考えて問題なさそうですね。

シャピロウィルク検定

シャピロウィルク検定は、データが正規分布に従っていることを棄却することを目的としています。

なので、P値が小さければ(0.05未満)、正規分布に従っていない可能性が高いと判断されます。また、P値が大きければ(0.05以上)、正規分布に従っていると判断されます。

まあ、検定なので、データ数に影響を受けるため参考程度にしておきます。私は参考にもしないですが、コードの勉強にもなるかもしれないので、載せておきます。

import scipy.stats as st

p0 = st.shapiro(sepal_len_0)[1]
p1 = st.shapiro(sepal_len_1)[1]

print("sepal_len_0のp値:",round(p0,3))
print("sepal_len_1のp値:",round(p1,3))

出力:
sepal_len_0のp値: 0.46
sepal_len_1のp値: 0.465

どちらも0.05以上なので、正規分布に従っていると判断できますね。

2群間の差の検定

今まで、正規分布の確認からは、ウェルチのt検定を選ぶべきだと考えられます。

しかし、今回は2群間の差の検定のコードを紹介することなので、よく用いられる検定方法のコードを提示します。

対応のないt検定(等分散)

# studentのt検定
stats.ttest_ind(sepal_len_0,sepal_len_1)

出力:
Ttest_indResult(statistic=-10.52098626754911, pvalue=8.985235037487077e-18)

「pvalue=」がP値のことです。

e-18とは、小数点の位置が18個左にずれる、という意味です。なので、0.05未満ですね。

対応のないt検定(等分散ではない)

# Welchのt検定
stats.ttest_ind(sepal_len_0,sepal_len_1, equal_var=False)

出力:
Ttest_indResult(statistic=-10.52098626754911, pvalue=3.746742613983842e-17)

対応のあるt検定

# 対応のあるt検定
stats.ttest_rel(sepal_len_0,sepal_len_1)

出力:
Ttest_relResult(statistic=-10.14589947574733, pvalue=1.2419145491292336e-13)

マン・ホイットニーU検定

このマン・ホイットニー検定と次のウィルコクソンの符合順位和検定はパラメトリック検定です。すなわち、データが正規分布に従っていない、またはデータが順序尺度であることが前提条件になっています。

とはいえ、厳密には正規分布に従っているデータで、パラメトリく検定をしても間違いではありません。

# Mann-WhitneyのU検定
stats.mannwhitneyu(sepal_len_0,sepal_len_1,alternative="two-sided")

出力:
MannwhitneyuResult(statistic=168.5, pvalue=8.34582714594069e-14)

ウィルコクソンの符号順位和検定

# Wilcoxonの符号順位和検定
stats.wilcoxon(sepal_len_0,sepal_len_1)

出力:
WilcoxonResult(statistic=19.0, pvalue=3.479904217643913e-09)

【初心者用】Pythonでできる統計手法|重回帰分析



これだけは知っておきたい推定統計で注意すべきポイント
記述統計:手元にあるデータの性質を表す(知ることができる情報) 推定統計:手元にあるデータを含めた母集団の情報を推定する(知りたい情報) たとえば 商品Aと商品Bでは、商品Aのほうが...
【おすすめ】Pythonの独学で必要な書籍
わたしは、底辺サラリーマンで、Pyhton学習歴は半年、R(フリーの統計解析ソフト)学習歴半年、学習方法は独学です。 ここでの独学とは、体系的な学習カリキュラムがなく、強制力がない学習方法のことを指します。...
【初心者】Rと統計学をいっぺんに学ぶ最初の5冊
Rとはオープンソースの統計解析用のプログラミング言語です。 誰でも無料で使えます。統計解析にはSPSSやSASなどが有名ですが、いずれも有料です。大学や研究機関でないと使えないですね。個人でも統計解析できた方が、職場に依存せずにス...

コメント

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