「仮説検定 – パラメトリックな手法」について学ぶ(統計学 / 推定統計学 / 仮説検定)

2023年6月17日

この記事では、統計学を初めて学ぶ筆者が、「推定統計学」における「仮説検定 – パラメトリックな手法」について学んだ内容について記載しています。

学習には、Wikipediaの「t検定」、「ウェルチのt検定」、「F検定」、「Z検定」、「シャピロ–ウィルク検定」の記事を参考にし、Pythonのプログラミングにも触れ、理解を深めました。

プログラミングには、機械学習ライブラリのscikit-learnを使用しました。

この記事は、他の人が参考にできるよう、わかりやすく書くことを心がけました。

t検定

t検定は、2つの標本(例えば、ある薬を服用するグループと服用しないグループ)の平均に有意な違いがあるかどうかを判断するための統計的手法です。t検定は、標本が正規分布に従っていると仮定し、その前提の下で、標本の平均値の差が偶然に生じる確率を計算します。この計算には、t分布というものが使われます。t分布は、標本サイズや自由度によって形が変わりますが、平均や標準偏差には依存しません。t検定を使うことで、帰無仮説(2つの標本の平均に差がない)を棄却するかどうかを判断できます。t検定は、統計的仮説検定の一種であり、帰無仮説の下でt分布に従う検定統計量を用いて行われます。

t検定(ティーけんてい)とは、帰無仮説が正しいと仮定した場合に、統計量がt分布に従うことを利用する統計学的検定法の総称である。母集団が正規分布に従うと仮定するパラメトリック検定法であり、t分布が直接、もとの平均や標準偏差にはよらない(ただし自由度による)ことを利用している。2組の標本について平均に有意差があるかどうかの検定などに用いられる。統計的仮説検定の一つ。日本工業規格では、「検定統計量が,帰無仮説の下でt分布に従うことを仮定して行う統計的検定。」と定義している。

t検定

ウェルチのt検定

ウェルチのt検定は、2つの異なる母集団から得られた2つの標本が、等しい平均値を持っているかどうかを比較するために使用される統計的手法です。通常のt検定は、2つの標本が正規分布に従い、分散が等しい場合に適用されますが、ウェルチのt検定は、分散が異なる場合にも使用できます。

例えば、ある薬剤の効果を調べるために、治療群と対照群の2つの標本を比較したいとします。この場合、治療群と対照群で分散が異なる可能性があります。ウェルチのt検定を使用することで、2つの標本が異なる分散を持っていても、正確な結果を得ることができます。

ウェルチのt検定は、通常のt検定と同様に、帰無仮説(2つの母集団は等しい平均値を持つ)と対立仮説(2つの母集団は等しい平均値を持たない)を設定します。そして、標本平均、標本サイズ、標本分散などの情報を使用して、t値とp値を計算します。p値が有意水準以下であれば、帰無仮説は棄却され、対立仮説が採択されます。

ウェルチのt検定は、分散が等しい場合のt検定よりも信頼性が高いため、実験や調査においてより広く使用されています。

統計学において、ウェルチのt検定(ウェルチのtけんてい、英: Welch’s t test)は、2標本の位置の検定であり、2つの母集団が等しい平均を持つという仮説を検定するために用いられる。ウェルチ=アスピン検定(Welch-Aspin Test)とも呼ばれる。スチューデントのt検定の改良型であり、非等分散を持つ可能性のある2つの標本に用いることが意図されている。ウェルチのt検定は、ベーレンス=フィッシャー問題の近似解である。

ウェルチのt検定

Pythonプログラミング

「ウェルチのt検定」をイメージしやすいようPythonでのプログラミングについても学びます。

プログラム

治療群と対照群の2つの標本についてウェルチのt検定を行います。検定を行う前に、まずデータの分散が等しいかどうかを調べるために、Leveneの等分散性の検定を行っています。

この例において、帰無仮説は「治療群と対照群の平均値に差がない」となります。対立仮説は「治療群と対照群の平均値に差がある」となります。

統計的な有意差が見られた場合、帰無仮説が棄却され、対立仮説が採用されます。これは、治療群と対照群の平均値に統計的に有意な差があるということを示しています。

import scipy.stats as stats

# 治療群のデータ
treatment = [4, 1, 20, 6, 16, 5, 4, 6, 7, 10]

# 対照群のデータ
control = [2, 3, 4, 3, 5, 4, 2, 3, 4, 3]

# Leveneの等分散性の検定
statistic, p_value = stats.levene(treatment, control)

# 結果を表示する
print("統計量: ", statistic)
print("p値: ", p_value)

if p_value > 0.05:
    print("データの分散は等しいとみなせます")
else:
    print("データの分散は等しくないとみなせます")

# ウェルチのt検定
statistic, p_value = stats.ttest_ind(treatment, control, equal_var=False)

# 結果を表示する
print("統計量: ", statistic)
print("p値: ", p_value)
if p_value < 0.05:
    print("統計的に有意な差があります")
else:
    print("統計的に有意な差がありません")

実行結果

Leveneの等分散性の検定の結果、p値は0.045であり、有意水準5%で帰無仮説「2つの標本の分散が等しい」を棄却できるため、分散は等しくないとみなせます。 ウェルチのt検定の結果、p値は0.035であり、有意水準5%で帰無仮説「2つの標本の平均値が等しい」を棄却できるため、統計的に有意な差があると判定されます。

統計量:  4.631155778894473
p値:  0.04521674815387035
データの分散は等しくないとみなせます
統計量:  2.443339099697963
p値:  0.035912991809089266
統計的に有意な差があります

プログラムの説明

import scipy.stats as stats

scipyパッケージのstatsモジュールをインポートします。

# 治療群のデータ
treatment = [4, 1, 20, 6, 16, 5, 4, 6, 7, 10]

# 対照群のデータ
control = [2, 3, 4, 3, 5, 4, 2, 3, 4, 3]

治療群のデータをリスト形式で定義します。

対照群のデータをリスト形式で定義します。

# Leveneの等分散性の検定
statistic, p_value = stats.levene(treatment, control)

stats.levene()を用いて、Leveneの等分散性の検定を行います。この関数は、等分散性が仮定される2つのサンプルを比較し、2つのサンプルが等分散であるかどうかを判断します。この関数は、統計量とp値を返します。

# 結果を表示する
print("統計量: ", statistic)
print("p値: ", p_value)

if p_value > 0.05:
    print("データの分散は等しいとみなせます")
else:
    print("データの分散は等しくないとみなせます")

統計量とp値を表示します。p値が0.05より大きければ、データの分散は等しいとみなせるというメッセージを表示します。そうでなければ、データの分散は等しくないとみなせるというメッセージを表示します。

# ウェルチのt検定
statistic, p_value = stats.ttest_ind(treatment, control, equal_var=False)

stats.ttest_ind()を用いて、ウェルチのt検定を行います。この関数は、2つの独立したサンプルについて、平均値に有意な差があるかどうかを判断します。equal_var=Falseを指定することで、等分散性を仮定しないt検定が実行されます。

# 結果を表示する
print("統計量: ", statistic)
print("p値: ", p_value)
if p_value < 0.05:
    print("統計的に有意な差があります")
else:
    print("統計的に有意な差がありません")

統計量とp値を表示します。p値が0.05より小さい場合、統計的に有意な差があるというメッセージを表示します。そうでない場合、統計的に有意な差がないというメッセージを表示します。

F検定

F検定は、帰無仮説が正しい場合に、統計量がF分布に従うことを利用して、標本データから母集団のパラメータについて検定を行う方法です。

F検定には、いくつかの種類があります。一つ目は、正規分布に従う2つの群の「標準偏差が等しい」という帰無仮説の検定で、この場合はt検定の前段階の「等分散性検定」として用いられます。しかし、このような前段階での等分散性検定の利用は正しくないという指摘もあるため注意が必要です。

二つ目は、正規分布に従う複数の群(標準偏差は等しいと仮定する)で、「平均が等しい」(つまり同じ母集団に由来する)という帰無仮説の検定で、分散分析に用いられます。

F検定は、一般に統計量Fという2つの群の標準偏差の比であり、両群とも正規分布に従う場合にはFはF分布に従うという性質を利用します。具体的には、標本データから計算されたF値が、あらかじめ設定した有意水準よりも小さいかどうかを検定することで、帰無仮説の棄却または採用を判断します。

例えば、ある薬剤の効果を調べるために、治療群と対照群の2つの群を比較する場合には、F検定を用いて、両群の平均値の差が統計的に有意かどうかを検定することができます。

F検定(エフけんてい、英: F test)とは、帰無仮説が正しければ統計量がF分布に従うような統計学的検定の総称である。この名称は、ロナルド・A・フィッシャーに敬意を表してジョージ・W・スネデカー(英語版)によって命名された。フィッシャーは1920年代に分散比による統計を最初に開発した。

F検定には次のようなものがある:

  1. 正規分布に従う2つの群の「標準偏差が等しい」という帰無仮説の検定。これはt検定の前段階の「等分散性検定」として用いられる。ただし、このような前段階での等分散性検定の利用は正しくないという指摘も見られる。
  2. 正規分布に従う複数の群(標準偏差は等しいと仮定する)で、「平均が等しい」(つまり同じ母集団に由来する)という帰無仮説の検定。この方法は分散分析に用いられる。
    一般に統計量Fとは、2つの群の標準偏差の比であって、両群とも正規分布に従う場合にはFはF分布に従う。これを用い、Fの計算値が片側有意水準内に入るかどうかを検定するのがF検定である。
    日本工業規格では、「検定統計量が,帰無仮説の下でF分布に従うことを仮定して行う統計的検定。」と定義している。
F検定

Pythonプログラミング

「F検定」をイメージしやすいようPythonでのプログラミングについても学びます。

プログラム

治療群と対照群のF検定を行います。正規分布に従うかの検定には、Shapiro-Wilk検定を使用し、F検定にはSciPyライブラリのf_oneway関数を使用しています。

この例において、帰無仮説は「治療群と対照群の平均値に差がない」となります。対立仮説は「治療群と対照群の平均値に差がある」となります。

統計的な有意差が見られた場合、帰無仮説が棄却され、対立仮説が採用されます。これは、治療群と対照群の平均値に統計的に有意な差があるということを示しています。

import numpy as np
from scipy.stats import shapiro, f_oneway

# 治療群と対照群のデータ
treatment = np.array([1.23, 1.45, 1.77, 1.55, 1.32, 1.67, 1.87, 1.54, 1.76, 1.67,
                      1.87, 1.43, 1.56, 1.76, 1.78, 1.99, 1.68, 1.78, 1.66, 1.58])
control = np.array([1.15, 1.33, 1.45, 1.22, 1.13, 1.36, 1.54, 1.24, 1.46, 1.57,
                    1.27, 1.33, 1.49, 1.41, 1.55, 1.21, 1.25, 1.38, 1.35, 1.28])

# 正規分布に従うかの検定
_, treatment_p = shapiro(treatment)
_, control_p = shapiro(control)

if treatment_p > 0.05 and control_p > 0.05:
    print("両群は正規分布に従います")
else:
    print("両群は正規分布に従わない可能性があります")

# F検定
f_value, p_value = f_oneway(treatment, control)

print("F-value:", f_value)
print("p-value:", p_value)

# 有意差があるかの判定
if p_value < 0.05:
    print("統計的に有意な差があります")
else:
    print("統計的に有意な差がありません")

実行結果

シャピロ–ウィルク検定の結果、両群は正規分布とみなせます。 F検定の結果、p値は0.0000013であり、有意水準5%で帰無仮説「2つの標本の平均値が等しい」を棄却できるため、統計的に有意な差があると判定されます。

両群は正規分布に従います
F-value: 32.81415406830678
p-value: 1.342822282939716e-06
統計的に有意な差があります

プログラムの説明

import numpy as np
from scipy.stats import shapiro, f_oneway

numpyパッケージをnpという名前でインポートします。

scipyパッケージの中からshapiro関数とf_oneway関数をインポートします。

# 治療群と対照群のデータ
treatment = np.array([1.23, 1.45, 1.77, 1.55, 1.32, 1.67, 1.87, 1.54, 1.76, 1.67,
                      1.87, 1.43, 1.56, 1.76, 1.78, 1.99, 1.68, 1.78, 1.66, 1.58])
control = np.array([1.15, 1.33, 1.45, 1.22, 1.13, 1.36, 1.54, 1.24, 1.46, 1.57,
                    1.27, 1.33, 1.49, 1.41, 1.55, 1.21, 1.25, 1.38, 1.35, 1.28])

治療群のデータを配列として定義します。

対照群のデータを配列として定義します。

# 正規分布に従うかの検定
_, treatment_p = shapiro(treatment)
_, control_p = shapiro(control)

shapiro関数を使って、治療群が正規分布に従うかどうかを検定し、結果の統計量とp値を取得する。_は、統計量を無視するための変数です。

shapiro関数を使って、対照群が正規分布に従うかどうかを検定し、結果の統計量とp値を取得する。_は、統計量を無視するための変数です。

if treatment_p > 0.05 and control_p > 0.05:
    print("両群は正規分布に従います")
else:
    print("両群は正規分布に従わない可能性があります")

治療群と対照群が正規分布に従うかどうかを判断し、どちらも正規分布に従う場合はメッセージを表示します。

治療群と対照群のどちらかが正規分布に従わない場合はメッセージを表示します。

# F検定
f_value, p_value = f_oneway(treatment, control)

F検定を行い、結果をf_value(統計量)とp_value(p値)に代入します。

print("F-value:", f_value)
print("p-value:", p_value)

# 有意差があるかの判定
if p_value < 0.05:
    print("統計的に有意な差があります")
else:
    print("統計的に有意な差がありません")

統計量を表示します。

p値を表示します。

p値が0.05より小さい場合、つまり有意水準が5%である場合、有意な差があると判断しメッセージを表示します。。

上記の条件に当てはまらない場合、つまりp値が0.05以上の場合、有意な差がないと判断しメッセージを表示します。

Z検定

Z検定は、標本の平均と母集団の平均が統計学的に有意に異なるかどうかを検定する方法で、母集団が正規分布に従うという仮定を前提としています。また、標本は母集団から単純ランダム標本として抽出され、母集団の平均と標準偏差が既知である必要があります。

例えば、ある製品の重量に関して、製造ライン1と製造ライン2で製造された製品の平均重量に差があるかどうかを検定する場合を考えます。ここで、製造ライン1の平均重量がμ1で、標準偏差がσ1であるとし、製造ライン2の平均重量がμ2で、標準偏差がσ2であるとします。この場合、Z検定を行うためには、以下のような手順を踏みます。

  1. 両方の標本が正規分布に従うことを確認します。
  2. 製造ライン1と製造ライン2の標本を取ります。標本サイズが小さい場合は、中心極限定理を使用して正規分布に近似させます。
  3. 標本平均の差を計算し、差が統計的に有意であるかどうかを判断します。この際、有意水準を決定し、p値を計算して、有意水準とp値を比較します。

しかし、母集団の標準偏差が未知である場合、Z検定を行うことはできません。その場合には、t検定を使用します。t検定はZ検定と同じように平均値の差を検定する方法ですが、t分布を使用することで、標本サイズが小さくても正確な結果を得ることができます。例えば、ある新薬の有効性を検証するために、投与群と対照群の平均値の差を検定する場合には、t検定が使用されます。

Z検定(Zけんてい)は、正規分布を用いる統計学的検定法で、標本の平均と母集団の平均とが統計学的にみて有意に異なるかどうかを検定する方法である。
Z検定を用いるにはいくつかの条件に適合しなければならない。最も重要なのは、Z検定は母集団の平均と標準偏差(母数)を用いるものであるから、これらがわかっていなければならない、ということである。標本は母集団から抽出された単純ランダム標本でなければならない。また母集団は正規分布に従うことがわかっていなければならない。ただし母集団が正規分布に従うかどうか判然としない場合でも、用いる標本のサイズが十分大きければ(一般に30から40以上ならば)よい。
Z検定は、標準テスト(全国の生徒に同じテストを行い、各学校の成績がその中でどのレベルにあるかを調べる)など、母集団が完全にわかっている場合に用いられる。しかし母集団の正しい標準偏差σを知るというのは一般には現実的でない。
母数を正確に知るのが不可能な場合には、スチューデントのt検定(t分布を用いるので母数を扱う必要がない)を用いるのが現実的である。

Z検定

Pythonプログラミング

「Z検定」をイメージしやすいようPythonでのプログラミングについても学びます。

プログラム

製造ライン1と製造ライン2の製品の平均重量に差があるかどうかを検定するためにZ検定を行います。

帰無仮説は「製造ライン1と製造ライン2の平均重量に差がない(μ1 = μ2)」とし、対立仮説は「製造ライン1と製造ライン2の平均重量に差がある(μ1 ≠ μ2)」と設定します。

それぞれのラインの重量データから平均値(mean)と標準偏差(std)を求め、標準誤差(se)を計算します。

そしてZスコアを計算するために、製造ライン1と製造ライン2の平均値の差を標準誤差で割ります。

その後、両側検定のp値を計算するために、Zスコアを用いて正規分布の累積分布関数(norm.cdf)を求めます。両側検定では、対立仮説による差異を両側で考慮するため、p値は左側の領域と右側の領域の両方を考慮して2倍する必要があります。

最後に、計算した統計量(Zスコア)とp値を表示します。また、有意水準(alpha)と比較して、統計的に有意な差があるかどうかを判定します。p値が有意水準より小さい場合、帰無仮説は棄却され、統計的に有意な差があると結論付けられます。

import numpy as np
from scipy.stats import norm

# 製造ライン1の重量データ
line1_weights = np.array([10.2, 9.8, 10.5, 11.0, 10.3, 10.9, 10.6, 10.2, 10.7, 10.4])

# 製造ライン2の重量データ
line2_weights = np.array([10.1, 9.9, 10.3, 11.1, 10.2, 10.8, 10.5, 10.3, 10.8, 10.6])

# 平均と標準偏差
mean1 = np.mean(line1_weights)
std1 = np.std(line1_weights)
mean2 = np.mean(line2_weights)
std2 = np.std(line2_weights)

# 標準誤差
se = np.sqrt((std1**2 / len(line1_weights)) + (std2**2 / len(line2_weights)))

# Zスコア計算
z_score = (mean1 - mean2) / se

# 両側検定のp値
p_value = 2 * (1 - norm.cdf(abs(z_score)))

# 結果を表示する
print("統計量(Zスコア): ", z_score)
print("p値: ", p_value)

# 有意水準を設定
alpha = 0.05

# p値と有意水準を比較し、統計的に有意な差があるか判定
if p_value < alpha:
    print("統計的に有意な差があります")
else:
    print("統計的に有意な差がありません")

実行結果

p値が0.9999999999999816となり、有意水準0.05より大きいため「製造ライン1と製造ライン2の平均重量に差がない(μ1 = μ2)」と結論付けられます」

統計量(Zスコア):  2.2990215750370508e-14
p値:  0.9999999999999816
統計的に有意な差がありません

プログラムの説明

import numpy as np
from scipy.stats import norm

NumPyライブラリをインポートし、npという名前で使用できるようにします。NumPyは、数値計算を効率的に行うためのパッケージです。

SciPyの統計モジュールからnormという関数をインポートします。この関数は、正規分布の累積分布関数を計算するために使用されます。

# 製造ライン1の重量データ
line1_weights = np.array([10.2, 9.8, 10.5, 11.0, 10.3, 10.9, 10.6, 10.2, 10.7, 10.4])

# 製造ライン2の重量データ
line2_weights = np.array([10.1, 9.9, 10.3, 11.1, 10.2, 10.8, 10.5, 10.3, 10.8, 10.6])

製造ライン1の重量データをNumPyの配列として定義します。重量データは、10.2、9.8、10.5などの数字で構成されています。

製造ライン2の重量データをNumPyの配列として定義します。こちらも製造ライン1と同様に数字で構成されています。

# 平均と標準偏差
mean1 = np.mean(line1_weights)
std1 = np.std(line1_weights)
mean2 = np.mean(line2_weights)
std2 = np.std(line2_weights)

製造ライン1の重量データの平均値を計算し、mean1という変数に代入します。

製造ライン1の重量データの標準偏差を計算し、std1という変数に代入します。標準偏差は、データのばらつきの尺度です。

製造ライン2の重量データの平均値を計算し、mean2という変数に代入します。

製造ライン2の重量データの標準偏差を計算し、std2という変数に代入します。

# 標準誤差
se = np.sqrt((std1**2 / len(line1_weights)) + (std2**2 / len(line2_weights)))

標準誤差を計算します。標準誤差は、各ラインの標準偏差をデータ数の平方根で割り、それらの二乗の和を平方根で計算して得られます。

# Zスコア計算
z_score = (mean1 - mean2) / se

Zスコアを計算します。Zスコアは、製造ライン1と製造ライン2の平均値の差を標準誤差で割った値です。Zスコアは、2つのグループの平均値の差が標準誤差の何倍離れているかを示す指標です。

# 両側検定のp値
p_value = 2 * (1 - norm.cdf(abs(z_score)))

両側検定のp値を計算します。p値は、Zスコアの絶対値を正規分布の累積分布関数(norm.cdf)に代入し、1からその値を引いて2倍することで求められます。p値は、2つのグループの平均値の差が統計的に偶然ではなく有意な差である確率を表します。

# 結果を表示する
print("統計量(Zスコア): ", z_score)
print("p値: ", p_value)

# 有意水準を設定
alpha = 0.05

Zスコアの値を表示します。これは、製造ライン1と製造ライン2の重量データの平均値の差が標準誤差の何倍離れているかを示します。

p値の値を表示します。これは、2つのグループの平均値の差が偶然ではなく有意な差である確率を表します。

有意水準を0.05に設定します。有意水準は、統計的な差を判断するための基準です。通常、0.05がよく使用されます。

# p値と有意水準を比較し、統計的に有意な差があるか判定
if p_value < alpha:
    print("統計的に有意な差があります")
else:
    print("統計的に有意な差がありません")

p値と有意水準を比較して、統計的に有意な差があるかどうかを判定します。p値が有意水準よりも小さい場合、統計的に有意な差があると判断されます。

統計的に有意な差がある場合、統計的に有意な差がありますと表示します。つまり、製造ライン1と製造ライン2の重量データには統計的に有意な差があるという結論です。

統計的に有意な差がない場合、統計的に有意な差がありませんと表示します。つまり、製造ライン1と製造ライン2の重量データには統計的に有意な差がないという結論です。

シャピロ–ウィルク検定

シャピロ-ウィルク検定は、あるデータが正規分布に従っているかどうかを検定する統計的方法です。正規分布とは、平均値を中心に左右対称の釣り鐘型をした分布であり、多くの場合は自然現象や社会現象において現れる分布です。

この検定では、帰無仮説として「標本データが正規分布に従う」という前提を立て、その仮説が棄却できるかどうかを検定します。具体的には、標本データの順序を並べ替えた際の順位と、正規分布に従う場合の期待値の順位を比較します。この比較により、標本データが正規分布に近いかどうかを判断します。

例えば、身長のデータがあるとします。身長が正規分布に従っているかどうかを知りたい場合、シャピロ-ウィルク検定を用いることができます。この場合、帰無仮説は「身長データが正規分布に従う」とし、検定を行います。もしp値が0.05以下であれば、帰無仮説は棄却され、身長データが正規分布に従っていないと結論付けられます。

シャピロ-ウィルク検定は、正規分布に従うデータの分布を検定するためによく用いられます。また、正規分布に従わない場合にも、この検定を用いることができますが、その場合は検定結果に注意する必要があります。

シャピロ–ウィルク検定(シャピロ–ウィルクけんてい、英語: Shapiro–Wilk test)とは、 統計学において、標本 x1, …, xn が正規分布に従う母集団からサンプリングされたものであるという帰無仮説を検定する検定である。この検定方法は、サミュエル・シャピロとマーティン・ウィルクが1965年に発表した。

シャピロ–ウィルク検定

Pythonプログラミング

「シャピロ-ウィルク検定」をイメージしやすいようPythonでのプログラミングについても学びます。

プログラム

シャピロ–ウィルク検定を用いて身長データが正規分布に従うかどうかを検定し、結果を表示します。

帰無仮説は「身長データが正規分布に従う」とし、対立仮説は「身長データが正規分布に従わない」と設定します。

p値は帰無仮説の有意性を示す値であり、有意水準(alpha)と比較することで、統計的に有意な差があるかどうかを判定します。もしp値が有意水準未満(p値 < alpha)であれば、「身長データは正規分布に従わないと結論付けられます」と表示されます。

import numpy as np
from scipy.stats import shapiro

#身長データ
heights = np.array([165, 172, 158, 182, 169, 175, 168, 176, 162, 180])

#シャピロ–ウィルク検定
statistic, p_value = shapiro(heights)

#結果を表示する
print("統計量: ", statistic)
print("p値: ", p_value)

#有意水準を設定
alpha = 0.05

#p値と有意水準を比較し、正規分布に従うか判定
if p_value < alpha:
    print("身長データは正規分布に従わないと結論付けられます")
else:
    print("身長データは正規分布に従うと結論付けられます")

実行結果

p値が0.9550189971923828となり、有意水準0.05より大きいため「身長データが正規分布に従う」と結論付けられます」

統計量:  0.978233814239502
p値:  0.9550189971923828
身長データは正規分布に従うと結論付けられます

プログラムの説明

import numpy as np
from scipy.stats import shapiro

numpyライブラリをnpという別名でインポートします。
scipy.statsモジュールからshapiro関数をインポートします。

#身長データ
heights = np.array([165, 172, 158, 182, 169, 175, 168, 176, 162, 180])

身長データをheightsという名前のnumpy配列として定義します。

#シャピロ–ウィルク検定
statistic, p_value = shapiro(heights)

shapiro関数を使ってシャピロ–ウィルク検定を実行し、統計量とp値を返します。statisticとp_valueにそれぞれ代入されます。

#結果を表示する
print("統計量: ", statistic)
print("p値: ", p_value)

結果を表示します。統計量:とその値、p値:とその値を表示します。

#有意水準を設定
alpha = 0.05

#p値と有意水準を比較し、正規分布に従うか判定
if p_value < alpha:
    print("身長データは正規分布に従わないと結論付けられます")
else:
    print("身長データは正規分布に従うと結論付けられます")

有意水準を0.05として設定します。

p値と有意水準を比較し、身長データが正規分布に従うかどうかを判定します。

p値が有意水準未満であれば、「身長データは正規分布に従わないと結論付けられます」と表示します。

そうでなければ、「身長データは正規分布に従うと結論付けられます」と表示します。