Python 中的 F-Test

本文介绍了F统计量在方差分析中的作用,用于判断不同总体间均值的显著差异。通过Python的SciPy库,我们可以执行F检验和ANOVA来计算F值和P值,从而决定是否拒绝原假设。文中还提到了当对数据正态性有疑虑时,可以使用Bartlett检验或Levene检验作为替代方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本篇文章介绍 F 统计、F 分布以及如何使用 Python 对数据执行 F-Test 测试。

F 统计量是在方差分析检验或回归分析后获得的数字,以确定两个总体的平均值是否存在显着差异。 它类似于 T 检验的 T 统计量,执行 T 检验会告诉您单个变量是否具有统计显着性,而 F 检验会告诉您一组变量是否具有统计显着性。

统计显着性意味着什么?

如果你有一个实质性的结果,那么你得到这些结果可能不是巧合。 如果您的检验结果在统计上不显着,则必须丢弃它们,因为它们无效,并且您不能拒绝原假设。


F 统计量和 P 值

在确定总体结果是否显着时,您必须考虑 F 统计量和 p 值。

为什么? 结果显着并不一定意味着您的所有变量也都显着。 简而言之,统计涉及比较所有变量的综合影响。


方差(ANOVA) 分析中的 F 值

方差分析检验是一种统计分析方法,用于评估基于方差的均值差异,以查看两个或多个分类组之间是否存在统计上重要的差异。

ANOVA 将自变量分成两组或更多组,这是另一个重要的组成部分。 例如,一个或多个组可能被预测会影响因变量,而另一组可能被用作控制组并且预计不会产生影响。

在某种程度上,在方差分析中,F 值就像一种工具,有助于回答两个统计量或总体的均值之间的方差是否显着不同的问题。 P 值是获得至少与观察到的结果一样极端的结果的可能性,假定零假设为真,同样由方差分析中的 F 值确定。

称为 f 比率的测试统计量可以计算如下:

要使用 Python 执行以下测试,我们可以使用 Python 中的 SciPy 模块。

SciPy 为许多问题类型提供算法,包括优化、积分、插值、特征值问题、代数方程、微分方程、统计等等。

要安装 scipy,请运行以下命令:

pip install scipy

我们可以在 scipy.stats 模块中使用以下类。 scipy 中的 stats 类包含执行统计操作所需的所有函数和类。

>>> from scipy.stats import f

scipy.stats.f 有一个 CDF(累积分布函数)方法。 可以针对给定的统计信息计算使用 p 值。

因此,您可以确定是拒绝还是接受给定 alpha 水平的 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.
The formula to calculate the F value is Var(X)/Var(Y).

# calculating F value.
F = a.var()/b.var()
Since F is a distribution:

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值; 我们将拒绝 NULL 假设,即 a 的方差等于 b 的方差。

假设您对所提供的反映正态性的数据没有信心。 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]

Levene 的测试:

>>> 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]
### 如何在 Python 中使用 scikit-learn 库进行机器学习 #### 安装 scikit-learn 为了能够在 Python 环境中使用 scikit-learn,首先需要确保该库已正确安装。可以通过以下命令完成安装: ```bash pip install scikit-learn ``` 如果环境中尚未安装 NumPy 和 SciPy 这两个依赖项,则 pip 将自动为其安装必要的版本[^4]。 --- #### 数据准备 scikit-learn 的核心功能围绕于数据集的操作展开。通常情况下,数据会被划分为特征矩阵 `X` 和目标向量 `y`。例如,在分类任务中,`X` 表示样本的属性集合,而 `y` 则表示对应的类别标签。 以下是创建简单数据集的一个例子: ```python from sklearn.datasets import make_classification # 创建一个具有 100 条记录、20 个特征和 3 类别的合成数据集 X, y = make_classification(n_samples=100, n_features=20, n_classes=3, random_state=42) print(f"Feature Matrix Shape: {X.shape}") print(f"Target Vector Shape: {y.shape}") ``` 此代码片段展示了如何利用 `make_classification` 函数生成用于测试目的的人工数据集[^2]。 --- #### 模型选择与训练 scikit-learn 提供了大量的监督学习和无监督学习算法。下面以逻辑回归为例展示模型的选择与训练过程: ```python from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 将数据拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 初始化并拟合逻辑回归模型 model = LogisticRegression(max_iter=1000) model.fit(X_train, y_train) # 使用测试集预测结果 predictions = model.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, predictions) print(f"Model Accuracy: {accuracy:.2f}") ``` 上述代码实现了从数据分割到模型训练再到性能评估的一系列操作[^1]。 --- #### 模型保存与加载 当开发完成后,可能希望将已经训练好的模型持久化存储以便后续重复调用。这可通过 `joblib` 或者标准库中的 `pickle` 实现: ```python import joblib # 保存模型至文件 joblib.dump(model, 'logistic_regression_model.joblib') # 加载模型自文件 loaded_model = joblib.load('logistic_regression_model.joblib') ``` 这里推荐优先选用 `joblib` 而不是 `pickle`,因为前者对于大数组有更优的支持效率[^3]。 --- #### 总结 综上所述,scikit-learn 是一款强大且易用的工具包,适用于多种类型的机器学习项目。无论是初学者还是资深工程师都能从中受益匪浅。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迹忆客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值