Scipy 有意性検定

有意性検定(significance test)とは、事前に母集団(確率変数)のパラメータまたは母集団分布の形式について仮説を立て、その後サンプル情報を用いてこの仮説(対立仮説)が妥当かどうかを判断する、すなわち母集団の真の状況と元の仮説の間に有意な差異があるかどうかを判断する方法です。言い換えれば、有意性検定は、サンプルと我々が母集団に対して立てた仮説との間の差異が、単なる偶然の変動によるものなのか、それとも我々が立てた仮説と母集団の真の状況との間の不一致によって引き起こされたものなのかを判断します。有意性検定は、我々が母集団に対して立てた仮説を検定するものであり、その原理は「小確率事象の実際上の不可能性の原理」に基づいて仮説を受け入れるか否定するかを行います。

有意性検定は、実験処理群と対照群、または2つの異なる処理の効果の間に差があるかどうか、およびその差が有意であるかどうかを判断するための方法です。

SciPy は、Scipy の有意性検定の機能を実行するための scipy.stats モジュールを提供しています。

統計的仮説

統計的仮説とは、1つ以上の確率変数の未知の分布に関する仮説です。確率変数の分布形式が既知であり、分布の中の1つまたはいくつかの未知のパラメータのみに関する統計的仮説をパラメトリック仮説と呼びます。統計的仮説を検定するプロセスを仮説検定と呼び、パラメトリック仮説を判定する検定をパラメトリック検定と呼びます。

帰無仮説

帰無仮説(null hypothesis)は、統計学の用語で、原仮説とも呼ばれ、統計的検定を行う際に事前に立てる仮説を指します。帰無仮説が成立する場合、関連する統計量は既知の何らかの確率分布に従うはずです。

統計量の計算値が棄却域に入った場合、小確率事象が発生したことが分かり、原仮説を棄却すべきです。

通常、検定すべき仮説を H0 と表記し、原仮説(または帰無仮説)(null hypothesis)と呼びます。H0 と対立する仮説を H1 と表記し、対立仮説(alternative hypothesis)と呼びます。

  • 原仮説が真であるときに原仮説を棄却する決定を下すことを第一種の過誤と呼び、その発生確率は通常α;
  • 原仮説が真でないときに原仮説を棄却しない決定を下すことを第二種の過誤と呼び、その発生確率は通常β
  • α+β は必ずしも 1 に等しいとは限りません。

通常は第一種の過誤を犯す最大確率のみを制限しα、第二種の過誤を犯す確率は考慮しません。βこのような仮説検定は有意性検定とも呼ばれ、確率αを有意水準と呼びます。

最も一般的に使用されるα値は 0.01、0.05、0.10 などです。一般的に、研究の問題に応じて、真の仮説を棄却した場合の損失が大きい場合は、この種の過誤を減らすためにα値を小さめに設定し、逆にα値を大きめに設定します。

対立仮説

対立仮説(alternative hypothesis)は統計学の基本概念の1つであり、原仮説を成立させない母集団分布に関するすべての命題を含みます。対立仮説は、対抗仮説、代替仮説とも呼ばれます。

対立仮説は帰無仮説の代わりにすることができます。

例えば、学生の評価に関して、次のようにします:

「学生は平均より劣っている」—— 帰無仮説として

「学生は平均より優れている」—— 対立仮説として。

片側検定

片側検定(one-sided test)は片尾検定、片側検定とも呼ばれます。仮説検定において、検定統計量の密度曲線と軸で囲まれた面積の片側の尾部面積を用いて棄却域を構成して検定を行う方法を片側検定と呼びます。

仮説が値の片側のみを検定する場合、それは「片尾テスト」と呼ばれます。

例:

帰無仮説に対して:

“均值等于 k”

対立仮説は次のようにできます:

“平均值小于 k”
或
“平均值大于 k”

両側検定

両側検定(two-sided test)は、両尾検定、両側検定とも呼ばれます。仮説検定において、検定統計量の密度曲線とx軸で囲まれた面積の左右両側の尾部面積を用いて棄却域を構成して検定を行う方法です。

仮説が値の両側を検定する場合です。

例:

帰無仮説に対して:

“均值等于 k”

対立仮説は次のようにできます:

“均值不等于k”

この場合、平均値が k より小さいか大きいか、両側をチェックする必要があります。

アルファ値

アルファ値は有意水準です。

有意水準は、母集団パラメータが特定の区間内に存在すると推定する際に、誤りを犯す可能性のある確率であり、αで表されます。

帰無仮説を棄却するために、データがどの程度極端に近づく必要があるかを示します。

通常は 0.01、0.05、または 0.1 とします。

P 値

P 値は、データが実際にどの程度極端に近いかを示します。

P 値とアルファ値(alpha)を比較して、統計的有意水準を決定します。

p 値 <= alpha の場合、帰無仮説を棄却し、データは統計的に有意であると判断します。それ以外の場合は帰無仮説を採択します。

T 検定(T-Test)

T 検定は、2つの変数の平均値の間に有意な差が存在するかどうかを判断し、それらが同じ分布に属するかどうかを判定するために使用されます。

これは両尾テストです。

関数 ttest_ind() は同じサイズの2つのサンプルを受け取り、t 統計量と p 値のタプルを生成します。

指定された値 v1 と v2 が同じ分布から得られたものかどうかを調べます:

例

import numpy as np
from scipy.stats import ttest_ind

v1 = np.random.normal(size=100)
v2 = np.random.normal(size=100)

res = ttest_ind(v1, v2)

print(res)

出力結果は次のとおりです:

Ttest_indResult(statistic=0.40833510339674095, pvalue=0.68346891833752133)

p 値のみを返したい場合は、pvalue 属性を使用します:

例

import numpy as np
from scipy.stats import ttest_ind

v1 = np.random.normal(size=100)
v2 = np.random.normal(size=100)

res = ttest_ind(v1, v2).pvalue

print(res)

出力結果は次のとおりです:

0.68346891833752133

KS 検定

KS 検定は、指定された値が分布に適合するかどうかを確認するために使用されます。

この関数は2つのパラメータを受け取ります。検定する値と CDF です。

CDF は累積分布関数(Cumulative Distribution Function)であり、分布関数とも呼ばれます。

CDF は文字列の場合も、確率を返す呼び出し可能な関数の場合もあります。

片尾または両尾のテストとして使用できます。

デフォルトでは両尾テストです。パラメータ alternative に、two-sided、less、greater のいずれかの文字列を渡すことができます。

指定された値が正規分布に適合するかどうかを調べます:

例

import numpy as np
from scipy.stats import kstest

v = np.random.normal(size=100)

res = kstest(v, 'norm')

print(res)

出力結果は次のとおりです:

KstestResult(statistic=0.047798701221956841, pvalue=0.97630967161777515)

データ統計の説明

describe() 関数を使用すると、配列の情報を確認でき、以下の値が含まれます:

  1. nobs -- 観測数
  2. minmax -- 最小値と最大値
  3. mean -- 算術平均
  4. variance -- 分散
  5. skewness -- 歪度
  6. kurtosis -- 尖度

配列内の統計記述情報を表示します:

例

import numpy as np
from scipy.stats import describe

v = np.random.normal(size=100)
res = describe(v)

print(res)

出力結果は次のとおりです:

DescribeResult(
    nobs=100,
    minmax=(-2.0991855456740121, 2.1304142707414964),
    mean=0.11503747689121079,
    variance=0.99418092655064605,
    skewness=0.013953400984243667,
    kurtosis=-0.671060517912661
  )

正規性検定(歪度と尖度)

観測データを用いて母集団が正規分布に従うかどうかを判断する検定を正規性検定と呼び、これは統計的判定において重要な特別な適合度仮説検定です。

正規性検定は歪度と尖度に基づきます。

normaltest() 関数は帰無仮説の p 値を返します:

“x 来自正态分布”

歪度

データの対称性の尺度です。

正規分布の場合、それは 0 です。

負の場合は、データが左に歪んでいることを意味します。

正の場合は、データが右に歪んでいることを意味します。

尖度

データが正規分布に対して重い尾部を持つか軽い尾部を持つかを示す尺度です。

正の尖度は重い尾部を意味します。

負の尖度は軽い尾部を意味します。

配列内の値の歪度と尖度を調べます:

例

import numpy as np
from scipy.stats import skew, kurtosis

v = np.random.normal(size=100)

print(skew(v))
print(kurtosis(v))

出力結果は次のとおりです:

 0.11168446328610283
  -0.1879320563260931

データが正規分布から得られたものかどうかを調べます:

例

import numpy as np
from scipy.stats import normaltest

v = np.random.normal(size=100)

print(normaltest(v))

出力結果は次のとおりです:

NormaltestResult(statistic=4.4783745697002848, pvalue=0.10654505998635538)
その他の拡張