Python での F 検定
このチュートリアルでは、F 統計、F 分布、および Python を使用してデータに対して F 検定を実行する方法について説明します。
F 統計量は、2つの母集団の平均が大幅に異なるかどうかを判断するための ANOVA テストまたは回帰分析の後に得られる数値です。 これは、T 検定の T 統計量に匹敵します。T 検定を実行すると、単一の変数が統計的に有意であるかどうかがわかりますが、F 検定では、一連の変数が統計的に有意であるかどうかがわかります。
統計的に有意とはどういう意味ですか?
実質的な結果が得られた場合、それらの結果を得たのはおそらく偶然ではありません。 検定結果が統計的に有意でない場合は、効果がないため破棄する必要があり、帰無仮説を棄却することはできません。
F 統計量と P 値
全体的な結果が有意かどうかを判断するときは、F 統計量と p 値を考慮する必要があります。
なぜ? 有意な結果は、すべての変数も有意であることを必ずしも意味しません。 簡単に言えば、統計には、すべての変数の複合効果を比較することが含まれます。
ANOVA の F 値
ANOVA 検定は、分散ベースの平均差を評価して、2つ以上のカテゴリ グループ間に統計的に重要な差があるかどうかを確認する統計分析の方法です。
ANOVA は、独立変数を 2つ以上のグループに分割します。これは、もう 1つの重要な要素です。 たとえば、1つまたは複数のグループが従属変数に影響を与えると予測される場合がありますが、別のグループは対照群として使用され、影響があると予測されない場合があります。
ある意味では、ANOVA では、F 値は、2つの統計または母集団の平均の分散が有意に異なるかどうかという質問に答えるのに役立つツールのように機能します。 P 値は、帰無仮説が真である場合に、観察された結果と少なくとも同じくらい極端な結果が得られる可能性であり、ANOVA 検定の F 値によって同様に決定されます。
f比として知られる検定統計量は、次のように計算できます。
Python を使用して次のテストを実行するには、Python で SciPy
モジュールを使用できます。
SciPy は、最適化、統合、補間、固有値問題、代数方程式、微分方程式、統計など、多くの問題タイプのアルゴリズムを提供します。
scipy
をインストールするには、次のコマンドを実行します。
pip install scipy
scipy.stats
モジュールで次のクラスを使用できます。 scipy
の stats
クラスには、統計操作を実行するために必要なすべての関数とクラスが含まれています。
>>> from scipy.stats import f
<span style="color: blue;">scipy.stats.f</span>
には CDF (累積分布関数) メソッドがあります。 p値を使用すると、特定の統計に対して計算できます。
したがって、特定のアルファ レベルの NULL 仮説を拒否するか受け入れるかを決定できます。
以下の例を考えてみましょう。
モジュールのインポートと変数の作成。
from scipy.stats import f
import numpy as np
a = np.array([1, 2, 1, 2, 1, 2, 1, 2, 1, 2])
b = np.array([1, 3, -1, 2, 1, 5, -1, 6, -1, 2])
alpha = 0.05 # you can set to level.
F 値を計算する式は Var(X)/Var(Y)
です。
# calculating F value.
F = a.var() / b.var()
F は分布であるため、次のようになります。
df1 = len(a) - 1
df2 = len(b) - 1
scipy.stats.f
クラスには、指定された統計の p 値と臨界値を計算するために使用できる関数が含まれています。
# Fetching p-value.
p_value = f.cdf(F, df1, df2)
p_value > alpha
上記のコードから、F 統計を使用して計算された p 値を取得できます。 a
の分散が b
の分散に等しいという NULL 仮説を棄却します。
注: F 検定は、与えられた統計の非正規性に非常に敏感です。
提供されたデータが正規性を反映していることに確信が持てないとします。 F 検定のより堅牢な代替手段は、Bartlett の検定または Levene の検定です。
Scipy は、これらのテストを実行する機能も提供します。
バートレットの検定:
>>> from scipy.stats import bartlett
>>> x = [8.88, 9.12, 9.04, 8.98, 9.00, 9.08, 9.01, 8.85, 9.06, 8.99]
>>> y = [8.88, 8.95, 9.29, 9.44, 9.15, 9.58, 8.36, 9.18, 8.67, 9.05]
>>> z = [8.95, 9.12, 8.95, 8.85, 9.03, 8.84, 9.07, 8.98, 8.86, 8.98]
>>> stat, p = bartlett(x, y, z)
>>> p
1.1254782518834628e-05
p 値は非常に小さいです。 与えられた母集団は等分散ではないと言えます。
これは偏差値の違いによるものです。
>>> [np.var(x, ddof=1) for x in [x, y, z]]
[0.007054444444444413, 0.13073888888888888, 0.008890000000000002]
レヴィーンのテスト:
>>> from scipy.stats import levene
>>> x = [8.88, 9.12, 9.04, 8.98, 9.00, 9.08, 9.01, 8.85, 9.06, 8.99]
>>> y = [8.88, 8.95, 9.29, 9.44, 9.15, 9.58, 8.36, 9.18, 8.67, 9.05]
>>> z = [8.95, 9.12, 8.95, 8.85, 9.03, 8.84, 9.07, 8.98, 8.86, 8.98]
>>> stat, p = levene(x, y, z)
>>> p
0.002431505967249681
p 値は非常に小さいです。 与えられた母集団は等分散ではないと言えます。
>>> [np.var(x, ddof=1) for x in [x, y, z]]
[0.007054444444444413, 0.13073888888888888, 0.008890000000000002]