[Xiao Mu Xue NLP] 統計的仮説検定のための Python

1 はじめに

1.1 仮説検定の定義

  • 仮説検定とは何ですか?
    統計学における推論統計には 2 つの方法があり、1 つはパラメータ推定、もう 1 つは仮説検定です。

  • パラメータ推定ではサンプル統計を使用してパラメータ全体を推測します。仮説
    検定は特定の仮説に基づいており、サンプル統計はこの仮説が正しいかどうかの検定にも使用されます。

1.2 仮説検証の基本手順

仮説検定は、統計サンプル内の観測値が予想される理論的分布に一致するかどうかを判断するために使用される統計的推論方法です。仮説検定の基本的な手順は次のとおりです。

  • (1) 帰無仮説 (H0) と対立仮説 (H1) を確立する: 帰無仮説 (H0) は、仮説検定を実行したい観測結果の期待される結果です。対立仮説 (H1) は帰無仮説の反対の仮説です。つまり、観察された結果が期待された結果と一致しません。

  • (2) 適切な統計検定方法を選択する: 問題の性質とデータの種類に応じて、適切な統計検定方法を選択します。たとえば、t 検定はサンプル平均値の比較に適しており、カイ 2 乗検定はカテゴリ変数の比較に適しています。

  • (3) データの収集と整理: データの品質と完全性を確保するために、問題に関連するサンプル データを収集して整理します。

  • (4) 統計の計算: 選択した統計検定方法を使用して、適切な統計を計算します。たとえば、t 検定の t 値、カイ二乗検定のカイ二乗値などです。

  • (5) p 値の取得: 計算された統計量と観察されたサンプル データに基づいて p 値 (または有意水準) を計算します。p 値は、特定の観測値が発生する確率を示します。p 値が事前に設定された有意水準 (通常は 0.05) より小さい場合、帰無仮説は棄却されます。

  • (6) 仮説判定: 得られた p 値とあらかじめ設定された有意水準に従って、仮説判定を行います。p
    値が有意水準未満の場合、帰無仮説を棄却し、対立仮説を受け入れ、観察結果が正しいとみなします。期待される結果と一致しません。
    p 値が有意水準以上の場合は、観察された結果が期待された結果と一致しているという帰無仮説を受け入れます。

  • (7) 結果の解釈:仮定と判断の結果に従って、分析結果を説明し、結論を導き出します。

2. テストデータ

  • おもちゃのデータセット
    • load_iris(*[, return_X_y, as_frame]): アイリス データセット (分類) をロードして返します。
    • load_diabetes(*[, return_X_y, as_frame,scaled]): 糖尿病データセットをロードして返します (回帰)。
    • load_digits(*[, n_class, return_X_y, as_frame]): 数字データセット (分類) をロードして返します。
    • load_linnerud(*[, return_X_y, as_frame]): 身体運動用の Linerud データセットをロードして返します。
    • load_wine(*[, return_X_y, as_frame]):ワインデータセット(分類)をロードして返します。
    • load_breast_cancer(*[, return_X_y, as_frame]):ウィスコンシン州の乳がんデータセット (分類) をロードして返します。
  • 現実世界のデータセット
  • 生成されたデータセット
  • 他のデータセットをロードする

2.1 アヤメ (アヤメ植物データセット)

https://scikit-learn.org/stable/datasets/toy_dataset.html#iris-dataset

Iris データ セットはパターン認識研究の分野で最もよく知られているデータ セットであり、多くの論文でこのデータ セットが使用されています。このデータ セットには、合計 150 行のレコードが含まれています。最初の 4 列は、がく片の長さ、がく片の幅、花びらの長さ、花びらの幅などです。アイリスを識別するために使用される 4 つの属性、5 番目の列はアイリスのカテゴリ (セトサ、バーシカラー、バージニカの 3 つのカテゴリを含む) です。つまり、がく片の長さ、がく片の幅、花弁の長さ、および花弁の幅の大きさを決定することによって、アヤメのカテゴリーが識別されます。
ここに画像の説明を挿入

# pip install scikit-learn
from sklearn.datasets import load_iris

iris = load_iris()
data = iris.data
target= iris.target
print(data)
print(target)

ここで、data は学習に必要なデータセット、target はデータセットに対応する教師あり学習に属する分類ラベルです。
ここに画像の説明を挿入

ここに画像の説明を挿入

from sklearn.datasets import load_iris

iris = load_iris()
data = iris.data
target= iris.target
# print(data)
# print(target)
# print('DESCR: ', iris['DESCR'])
print('data_module: ', iris['data_module'])
print('filename: ', iris['filename'])
print('frame: ', iris['frame'])
print('feature_names: ', iris['feature_names'])
print('target_names: ', iris['target_names'])
print('target: ', iris['target'])

ここに画像の説明を挿入

データ データセット内のデータには、次の合計 4 つの属性があります。

'sepal length (cm)', 
'sepal width (cm)', 
'petal length (cm)', 
'petal width (cm)'

3. 正規分布検定

標本データを通じて母集団が正規分布に従うかどうかを判定する検定を正規性検定といいます。正規分布は、t 検定、分散分析、相関分析、線形回帰などの多くの連続データの比較分析の大前提です。これらの分析ではすべて、データが正規分布またはほぼ正規分布に従う必要があります。

統計学では、正規検定は主にデータセットが正規分布に従うかどうかを検定するために使用されます。一般的に使用される t 検定、分散分析、およびその他のパラメーター検定には共通の前提条件があります。つまり、標本データが正規分布に従わない場合、標本データは正規分布に従う必要があります。つまり、標本データは正規分布母集団に由来している必要があります。上記のパラメトリック テストはデータの分析に使用されますが、ノンパラメトリック テスト (カイ二乗テスト、順列テストなど) を使用する必要があります。したがって、データの統計分析を実行する前に、最初のステップとして、データの正規性検定を実行して、データが正規分布母集団に由来する確率を検定し、その後、分析に対応するパラメトリック検定またはノンパラメトリック検定方法を選択します。 。

https://jse.amstat.org/v4n2/datasets.shoemaker.html

3.1 ヒストグラム判定

ヒストグラムを使用して、標本データが正規分布に従うかどうかを事前に判断します。

# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

fig = plt.figure(figsize = (10,6))
ax2 = fig.add_subplot(1,1,1)
iris_data.hist(bins=50,ax = ax2)
iris_data.plot(kind = 'kde', secondary_y=True,ax = ax2)
plt.grid()
plt.show()

ここに画像の説明を挿入

3.2 KS テスト (scipy.stats.kstest)

コルモゴロフ・スミルノフ検定 (KS 検定) は、頻度分布 f(x) を理論上の分布 g(x) または観測値の 2 つの分布と比較する検定方法です。標本データの累積度数分布を特定の理論的分布 (正規分布など) と比較し、両者の差が小さければ、標本分布は特定の分布から取得されたものであると推測されます。

kstest は非常に強力なテスト モジュールです。正規性テストに加えて、scipy.stats 内の他のデータ分布タイプもテストできます。継続的な分布テストにのみ適しています。

帰無仮説: データは正規分布に従う
メソッド: scipy.stats.kstest (rvs, cdf, args = ( ), N = 20, alternative ='two-サイド', mode ='about') パラメーター: rvs - theテストされるデータは
文字列または配列にすることができます。cdf - 設定する必要があるテスト、ここでは Norm、つまり正規性テストに設定されています。代替 - 片側検定を設定します。デフォルトは次のとおりです。両側 戻り値: W - 統計量; p
値 - p 値

# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

# data = pd.read_table(r'D:\normal_test\data.txt', encoding='utf-8',names = ['Temperature'])
# df = pd.DataFrame(data, columns =['Temperature'])

u = iris_data['sepal_length'].mean()  # 计算均值
std = iris_data['sepal_length'].std()  # 计算标准差
# 当p值大于0.05,说明待检验的数据符合为正态分布
result = stats.kstest(iris_data['sepal_length'], 'norm', (u, std))
print(result)

KstestResult(statistic=0.08865361377316228、pvalue=0.17813737848592026、statistic_location=5.1、statistic_sign=1)

出力結果から、p 値は 0.17813737848592026 で、0.05 より大きいため、体温が正規分布に従うという仮定を受け入れることができます。

3.3 シャピロ・ウィルク検定(scipy.stats.shapiro)

Wテスト

方法:scipy.stats.shapiro(x)
参数:x - 待检验数据
返回:W - 统计数;p-value - p值
# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

res = stats.shapiro(iris_data['sepal_length'])
print(res)
res = stats.shapiro(iris_data['sepal_width'])
print(res)
res = stats.shapiro(iris_data['petal_legth'])
print(res)
res = stats.shapiro(iris_data['petal_width'])
print(res)

ここに画像の説明を挿入

3.4 アンダーソン・ダーリング検定(scipy.stats.anderson)

このメソッドは scipy.stats.kstest を改良したもので、正規分布、指数分布、ロジスティック分布、ガンベル分布などの分布テストに使用できます。デフォルトのパラメーターは Norm で、これは正規性テストです。

# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

res = stats.anderson(iris_data['sepal_length'], dist='norm')
print(res)
res = stats.anderson(iris_data['sepal_width'], dist='norm')
print(res)
res = stats.anderson(iris_data['petal_legth'], dist='norm')
print(res)
res = stats.anderson(iris_data['petal_width'], dist='norm')
print(res)

ここに画像の説明を挿入

3.5 D'Agostino と Pearson の検定 (scipy.stats.normaltest)

メソッド: scipy.stats.normaltest (a, axis=0)
normaltest も正規性テスト専用のモジュールであり、原理はデータの歪度と尖度に基づいています。

scipy.stats.normaltest(a, axis=0, nan_policy='propagate')

a: テストするデータ

axis: デフォルトは 0 です。これは 0 軸でテストすることを意味します。つまり、データの各行の正規性をテストするには、axis=None に設定してデータ全体をテストします。

nan_policy: 入力データにnull値があった場合の処理​​方法。デフォルトは「propagate」で null を返します。「raise」に設定するとエラーがスローされ、「omit」に設定すると null 値は計算で無視されます。

# pip install scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from scipy import stats

# 导入IRIS数据集
iris = load_iris()
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])

res = stats.normaltest(iris_data['sepal_length'])
print(res)
res = stats.normaltest(iris_data['sepal_width'])
print(res)
res = stats.normaltest(iris_data['petal_legth'])
print(res)
res = stats.normaltest(iris_data['petal_width'])
print(res)

ここに画像の説明を挿入
注: p 値は有意水準 0.05 より大きく、サンプル データは正規分布に一致するとみなされます)

4. 仮説検証

Python での仮説テストでは通常、scipy または statsmodels パッケージが使用されます。

4.1 z 検定

サンプルデータが大きい場合(サンプルサイズ ≥ \geq≥ 30)、またはサンプルが小さい場合でも、データが正規分布に従うことがわかっていて、全体の分布の分散がわかっている場合は、z 検定を使用する必要があります。Python では、scipy パッケージには z テストがないため、statsmodels パッケージの ztest 関数のみを使用できます。

# pip install scikit-learn
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw

# 导入IRIS数据集
iris = load_iris()
# print(iris.data)
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])
print(iris_data['sepal_width'])

result = sw.ztest(iris_data['sepal_width'], value=1)
print('1: ', result)
result = sw.ztest(iris_data['sepal_width'], value=2)
print('2: ', result)
result = sw.ztest(iris_data['sepal_width'], value=3)
print('3: ', result)
result = sw.ztest(iris_data['sepal_width'], value=4)
print('4: ', result)
result = sw.ztest(iris_data['sepal_width'], value=5)
print('5: ', result)

ここに画像の説明を挿入
条件がサンプルの平均 3 に設定されている場合、ztest の実行結果から、統計値が 1.6110148544749883 で、p 値が 0.10717648482938881 であることがわかります。信頼水準 α = 0.05 の場合、p 値の方が大きいため、 α よりも大きい場合は、帰無仮説を受け入れ、サンプル平均は 3 であると考えます。

# 若要检测该样本均值是否大于 3,即原假设 H0:μ ≥ 3,备选假设为:μ < 3,则我们需要在代码中增加一个参数 alternative=``smaller”
sw.ztest(arr, value=3, alternative="smaller")

# 检测两个样本的均值是否相等,因为两个样本都是大样本,使用 z 检验
sw.ztest(arr, arr2, value=0)

4.2 t 検定

小さなサンプル(サンプルサイズが 30 未満)の場合は、通常、t 検定が使用されます。t 検定の場合、サンプルの特性に応じて、scipy パッケージの ttest_1sample (単一サンプルの t 検定関数)、ttest_ind (2 つの独立したサンプルの t 検定)、および ttest_rel (2 つの一致するサンプルの t 検定) を使用できます。 。ただし、これらの関数は両側 t 検定の p 値を取得します。片側検定の場合は、片側検定の p 値を取得するためにいくつかの変換を実行する必要があります。

# pip install scikit-learn
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from scipy import stats
import statsmodels.stats.weightstats as sw

# 导入IRIS数据集
iris = load_iris()
# print(iris.data)
iris_data=pd.DataFrame(iris.data,columns=['sepal_length','sepal_width','petal_legth','petal_width'])
print(iris_data['sepal_width'])

result = stats.ttest_1samp(iris_data['sepal_width'], 1)
print('1: ', result)
result = stats.ttest_1samp(iris_data['sepal_width'], 2)
print('2: ', result)
result = stats.ttest_1samp(iris_data['sepal_width'], 3)
print('3: ', result)
result = stats.ttest_1samp(iris_data['sepal_width'], 4)
print('4: ', result)
result = stats.ttest_1samp(iris_data['sepal_width'], 5)
print('5: ', result)

ここに画像の説明を挿入
結果から、両側検定の p 値は 0.10929285667458065 であり、信頼水準 0.05 より大きいことがわかります。したがって、帰無仮説が受け入れられ、サンプルの平均値は 3 であると見なされます。 。片側テストの左側では、p値は0.10929285667458065 / 2 = 0.0546446428337290325、および右側テストでは、p値は1-0.109292856747458065 / 2 = 0.9453333371627097です。

# 假设两个样本的方差不同,则独立双样本的 t 检验
st.ttest_ind(a, b, equal_var = False)

# 若两个样本是匹配样本,使用函数 ttest_rel
st.ttest_rel(a, b)

# 结果显示,p 值小于置信度 0.05,拒绝原假设,认为这两个匹配样本的均值不同。

エピローグ

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

おすすめ

転載: blog.csdn.net/hhy321/article/details/132381795