我是人 发表于 2021-3-3 10:49

【python】利用python进行17种统计假设检验

原文在语雀上 https://www.yuque.com/alipayqgthu1irbf/sharkfin/enrzni


https://machinelearningmastery.com/statistical-hypothesis-tests-in-python-cheat-sheet/

#### 应用机器学习中需要的17种统计假设检验的快速参考指南,并提供Python中的示例代码。

虽然有数百种统计假设检验可以使用,但只有一小部分子集可能需要在机器学习项目中使用。

在这篇文章中,你将看到一个机器学习项目中最流行的统计假说检验的手册,其中有使用Python API的例子。

- 每一个统计检验的表述方式都是一致的,包括。

- 检验的名称
- 检验的内容。
- 检验的关键假设。
- 测试结果如何解释。
- 使用测试的Python API。

注意,当涉及到数据的预期分布或样本大小等假设时,如果违反了某个假设,某个测试的结果很可能会优雅地退化,而不是立即变得不可用。

一般来说,数据样本需要具有领域的代表性,并且足够大,以暴露其分布进行分析。

在某些情况下,可以对数据进行修正以满足假设,例如通过去除离群值将近似正态分布修正为正态分布,或者当样本具有不同的方差时,在统计测试中使用对自由度的修正,这是两个例子。

最后,对于一个给定的关注点,如正态性,可能有多种检验方法。我们无法通过统计学得到问题的明确答案;相反,我们得到的是概率性的答案。因此,我们可以通过考虑问题的不同方式,对同一问题得出不同的答案。因此,我们对数据的一些问题可能需要进行多种不同的检验。

## 目录

1. 1. 本教程分为5个部分,它们是:。

      1. 正态性检验
         1. 夏皮罗-威尔克检验
         2. D'Agostino's K^2检验
         3. 安德森-达林检验
      2. 相关性检验
         1. 皮尔逊相关系数
         2. 斯皮尔曼秩相关
         3. Kendall's Rank Correlation
         4. 卡方检验
      3. 平稳性检验
         1. Augmented Dickey-Fuller
         2. Kwiatkowski-Phillips-Schmidt-Shin案
      4. 参数统计假设检验
         1. 学生T检验
         2. 配对学生T检验
         3. 方差分析检验(ANOVA)
         4. 重复计量方差分析检验
      5. 非参数统计假设检验
         1. Mann-Whitney U检验
         2. Wilcoxon Signed-Rank检验
         3. Kruskal-Wallis H检验
         4. 弗里德曼检验

## 1. 正态性检验 Normality Tests

本节列出了可以用来检查数据是否具有高斯分布的统计测试。

### 夏皮罗-威尔克测试 Shapiro-Wilk Test

- 假设

- 每个样本中的观测值都是独立和相同分布的(iid)。

解释

- H0:样本具有高斯分布。
- H1:样本不具有高斯分布。

Python代码

```python
# Example of the Shapiro-Wilk Normality Test
from scipy.stats import shapiro
data =
stat, p = shapiro(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably Gaussian')
else:
        print('Probably not Gaussian')
```

更多资料

- (https://machinelearningmastery.com/a-gentle-introduction-to-normality-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.shapiro.html)
- (https://en.wikipedia.org/wiki/Shapiro–Wilk_test)

### D'Agostino's K^2检验 D’Agostino’s K^2 Test

- 测试数据样本是否具有高斯分布。

假设

- 每个样本中的观测值都是独立和相同分布的(iid)。

解释

- H0:样本具有高斯分布。
- H1:样本不具有高斯分布。

Python Code

```python
# Example of the D'Agostino's K^2 Normality Test
from scipy.stats import normaltest
data =
stat, p = normaltest(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably Gaussian')
else:
        print('Probably not Gaussian')
```

More Information

- (https://machinelearningmastery.com/a-gentle-introduction-to-normality-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.normaltest.html)
- (https://en.wikipedia.org/wiki/D'Agostino's_K-squared_test)

### 安德森-达林检验 Anderson-Darling Test

- 测试数据样本是否具有高斯分布。

假设

- 每个样本中的观测值都是独立和相同分布的(iid)。

解释

- H0:样本具有高斯分布。
- H1:样本不具有高斯分布。

Python Code

```python
# Example of the Anderson-Darling Normality Test
from scipy.stats import anderson
data =
result = anderson(data)
print('stat=%.3f' % (result.statistic))
for i in range(len(result.critical_values)):
        sl, cv = result.significance_level, result.critical_values
        if result.statistic < cv:
                print('Probably Gaussian at the %.1f%% level' % (sl))
        else:
                print('Probably not Gaussian at the %.1f%% level' % (sl))
```

More Information

- (https://machinelearningmastery.com/a-gentle-introduction-to-normality-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.anderson.html)
- (https://en.wikipedia.org/wiki/Anderson–Darling_test)

## 2. 相关性检验 Correlation Tests

This section lists statistical tests that you can use to check if two samples are related.

### 皮尔逊相关系数 Pearson’s Correlation Coefficient

- 检验两个样本是否有线性关系。

假设

- 每个样本中的观测值都是独立和相同分布的(iid)。
- 每个样本中的观测值都是正态分布。
- 每个样本中的观测值具有相同的方差。

解释

- H0:两个样本是独立的。
- H1:样本之间有 dependency。

Python Code

```python
# Example of the Pearson's Correlation test
from scipy.stats import pearsonr
data1 =
data2 =
stat, p = pearsonr(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably independent')
else:
        print('Probably dependent')
```

More Information

- (https://machinelearningmastery.com/how-to-use-correlation-to-understand-the-relationship-between-variables/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html)
- (https://en.wikipedia.org/wiki/Pearson_correlation_coefficient)

### 斯皮尔曼秩相关 Spearman’s Rank Correlation

- 检验两个样本是否有单调关系(monotonic relationship)。

假设

- 每个样本中的观测值都是独立的、同分布的(iid)。
- 每个样本中的观测值可以进行排序。

解释

- H0:两个样本是独立的。
- H1:样本之间有dependency。

Python Code

```python
# Example of the Spearman's Rank Correlation Test
from scipy.stats import spearmanr
data1 =
data2 =
stat, p = spearmanr(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably independent')
else:
        print('Probably dependent')
```

More Information

- (https://machinelearningmastery.com/how-to-calculate-nonparametric-rank-correlation-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.spearmanr.html)
- (https://en.wikipedia.org/wiki/Spearman's_rank_correlation_coefficient)

### Kendall’s Rank Correlation

- 检验两个样本是否有单调关系(monotonic relationship)。

假设

- 每个样本中的观测值都是独立的、同分布的(iid)。
- 每个样本中的观测值可以进行排序。

解释

- H0:两个样本是独立的。
- H1:样本之间有dependency。

Python Code

```python
# Example of the Kendall's Rank Correlation Test
from scipy.stats import kendalltau
data1 =
data2 =
stat, p = kendalltau(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably independent')
else:
        print('Probably dependent')
```

More Information

- (https://machinelearningmastery.com/how-to-calculate-nonparametric-rank-correlation-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kendalltau.html)
- (https://en.wikipedia.org/wiki/Kendall_rank_correlation_coefficient)

### 卡方检验 Chi-Squared Test

- 检验两个分类变量是否相关或独立。

假设

- Observations used in the calculation of the contingency table are independent.
- 应急表的每个单元格中有25个以上的例子。


解释

- H0:两个样本是独立的。
- H1:样本之间有dependency。

Python Code

```python
# Example of the Chi-Squared Test
from scipy.stats import chi2_contingency
table = [,]
stat, p, dof, expected = chi2_contingency(table)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably independent')
else:
        print('Probably dependent')
```

More Information

- (https://machinelearningmastery.com/chi-squared-test-for-machine-learning/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html)
- (https://en.wikipedia.org/wiki/Chi-squared_test)

## 3. 平稳性检验 Stationary Tests

This section lists statistical tests that you can use to check if a time series is stationary or not.

### Augmented Dickey-Fuller Unit Root Test

- 检验一个时间序列是否有单位根,例如是否有趋势或更普遍的自回归。

假设

- 观察中是时间上的有序。

解释

- H0:存在一个单位根(序列是非平稳的)。
- H1:不存在单位根(数列是静止的)。

Python Code

```python
# Example of the Augmented Dickey-Fuller unit root test
from statsmodels.tsa.stattools import adfuller
data =
stat, p, lags, obs, crit, t = adfuller(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably not Stationary')
else:
        print('Probably Stationary')
```

More Information

- (https://machinelearningmastery.com/time-series-data-stationary-python/)
- (https://www.statsmodels.org/dev/generated/statsmodels.tsa.stattools.adfuller.html).
- (https://en.wikipedia.org/wiki/Augmented_Dickey–Fuller_test).

### Kwiatkowski-Phillips-Schmidt-Shin

- 检验一个时间序列是否是趋势平稳的。

假设

- 观察中是时间上的有序。

解释

- H0:时间序列不是趋势稳定的。
- H1:时间序列是趋势稳定的。

Python Code

```python
# Example of the Kwiatkowski-Phillips-Schmidt-Shin test
from statsmodels.tsa.stattools import kpss
data =
stat, p, lags, crit = kpss(data)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably not Stationary')
else:
        print('Probably Stationary')
```

More Information

- (https://www.statsmodels.org/stable/generated/statsmodels.tsa.stattools.kpss.html#statsmodels.tsa.stattools.kpss).
- (https://en.wikipedia.org/wiki/KPSS_test).

## 4. 参数统计假设检验 Parametric Statistical Hypothesis Tests

本节列出了您可以用来比较数据样本的统计测试。

### 学生T检验 Student’s t-test

- 检验两个独立样本的均值是否有显著差异。

假设

- 每个样本中的观测值都是独立和相同分布的(iid)。
- 每个样本中的观测值都是正态分布。
- 每个样本中的观测值具有相同的方差。

解释

- H0:样本的均值相等。
- H1:样本的均值不相等。

Python Code

```python
# Example of the Student's t-test
from scipy.stats import ttest_ind
data1 =
data2 =
stat, p = ttest_ind(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably the same distribution')
else:
        print('Probably different distributions')
```

More Information

- (https://machinelearningmastery.com/parametric-statistical-significance-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html)
- (https://en.wikipedia.org/wiki/Student's_t-test)

### 配对学生T检验 Paired Student’s t-test

- 检验两个配对样本的均值是否有显著差异。

假设

- 每个样本中的观测值都是独立和相同分布的(iid)。
- 每个样本中的观测值都是正态分布。
- 每个样本中的观测值具有相同的方差。
- 每个样本中的观测值都是成对的。

解释

- H0:样本的均值相等。
- H1:样本的均值不相等。

Python Code

```python
# Example of the Paired Student's t-test
from scipy.stats import ttest_rel
data1 =
data2 =
stat, p = ttest_rel(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably the same distribution')
else:
        print('Probably different distributions')
```

More Information

- (https://machinelearningmastery.com/parametric-statistical-significance-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_rel.html)
- (https://en.wikipedia.org/wiki/Student's_t-test)

### 方差分析检验(ANOVA) Analysis of Variance Test (ANOVA)

- 检验两个或多个独立样本的均值是否有显著差异。

假设

- 每个样本中的观测值都是独立和相同分布的(iid)。
- 每个样本中的观测值都是正态分布。
- 每个样本中的观测值具有相同的方差。

解释

- H0:样本的均值相等。
- H1:一个或多个样本的均值不相等。

Python Code

```python
# Example of the Analysis of Variance Test
from scipy.stats import f_oneway
data1 =
data2 =
data3 = [-0.208, 0.696, 0.928, -1.148, -0.213, 0.229, 0.137, 0.269, -0.870, -1.204]
stat, p = f_oneway(data1, data2, data3)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably the same distribution')
else:
        print('Probably different distributions')
```

More Information

- (https://machinelearningmastery.com/parametric-statistical-significance-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.f_oneway.html)
- (https://en.wikipedia.org/wiki/Analysis_of_variance)

### 重复计量方差分析检验 Repeated Measures ANOVA Test

检验两个或多个配对样本的均值是否有显著差异。

假设

- 每个样本中的观测值都是独立和相同分布的(iid)。
- 每个样本中的观测值都是正态分布。
- 每个样本中的观测值具有相同的方差。
- 每个样本中的观测值都是成对的。

解释

- H0:样本的均值相等。
- H1: 一个或多个样本的均值不相等。

目前无法在python中实现

More Information

- (https://machinelearningmastery.com/parametric-statistical-significance-tests-in-python/)
- (https://en.wikipedia.org/wiki/Analysis_of_variance)

## 5. 非参数统计假设检验 Nonparametric Statistical Hypothesis Tests

### Mann-Whitney U Test

- 检验两个独立样本的分布是否相等。

假设

- 每个样本中的观测值都是独立的、同分布的(iid)。
- 每个样本中的观测值可以进行排序。

解释

- H0:两个样本的分布相等。
- H1:两个样本的分布不相等。

Python Code

```python
# Example of the Mann-Whitney U Test
from scipy.stats import mannwhitneyu
data1 =
data2 =
stat, p = mannwhitneyu(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably the same distribution')
else:
        print('Probably different distributions')
```

More Information

- (https://machinelearningmastery.com/nonparametric-statistical-significance-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html)
- (https://en.wikipedia.org/wiki/Mann–Whitney_U_test)

### Wilcoxon Signed-Rank Test

- 检验两个成对样本的分布是否相等。

假设

- 每个样本中的观测值都是独立的、同分布的(iid)。
- 每个样本中的观测值可以进行排序。
- 每个样本中的观测值都是成对的。

解释

- H0:两个样本的分布相等。
- H1:两个样本的分布不相等。

Python Code

```python
# Example of the Wilcoxon Signed-Rank Test
from scipy.stats import wilcoxon
data1 =
data2 =
stat, p = wilcoxon(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably the same distribution')
else:
        print('Probably different distributions')
```

More Information

- (https://machinelearningmastery.com/nonparametric-statistical-significance-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.wilcoxon.html)
- (https://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test)

### Kruskal-Wallis H Test

- 检验两个或多个独立样本的分布是否相等。

假设

- 每个样本中的观测值都是独立的、同分布的(iid)。
- 每个样本中的观测值可以进行排序。

解释

- H0:所有样本的分布都相等。
- H1:一个或多个样本的分布不相等。

Python Code

```python
# Example of the Kruskal-Wallis H Test
from scipy.stats import kruskal
data1 =
data2 =
stat, p = kruskal(data1, data2)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably the same distribution')
else:
        print('Probably different distributions')
```

More Information

- (https://machinelearningmastery.com/nonparametric-statistical-significance-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kruskal.html)
- (https://en.wikipedia.org/wiki/Kruskal–Wallis_one-way_analysis_of_variance)

### Friedman Test

- 检验两个或多个成对样本的分布是否相等。

假设

- 每个样本中的观测值都是独立的、同分布的(iid)。
- 每个样本中的观测值可以进行排序。
- 每个样本中的观测值都是成对的。

解释

- H0:所有样本的分布都相等。
- H1:一个或多个样本的分布不相等。

Python Code

```python
# Example of the Friedman Test
from scipy.stats import friedmanchisquare
data1 =
data2 =
data3 = [-0.208, 0.696, 0.928, -1.148, -0.213, 0.229, 0.137, 0.269, -0.870, -1.204]
stat, p = friedmanchisquare(data1, data2, data3)
print('stat=%.3f, p=%.3f' % (stat, p))
if p > 0.05:
        print('Probably the same distribution')
else:
        print('Probably different distributions')
```

More Information

- (https://machinelearningmastery.com/nonparametric-statistical-significance-tests-in-python/)
- (https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kruskal.html)
- (https://en.wikipedia.org/wiki/Friedman_test)

## 更多资料

如果你想深入了解这个话题,本节提供更多资料。

- (https://machinelearningmastery.com/a-gentle-introduction-to-normality-tests-in-python/)
- (https://machinelearningmastery.com/how-to-use-correlation-to-understand-the-relationship-between-variables/)
- (https://machinelearningmastery.com/parametric-statistical-significance-tests-in-python/)
- (https://machinelearningmastery.com/statistical-hypothesis-tests/)

## 总结

在本教程中,你发现了机器学习项目中可能需要用到的关键统计假设检验。

具体来说,您学到了

- 在不同情况下使用的测试类型,如正态性检查、变量之间的关系和样本之间的差异。
- 每个测试的关键假设以及如何解释测试结果。
- 如何使用Python API实现测试。

bestwars 发表于 2021-3-3 11:10

学习了感谢分享

garfieldlong 发表于 2021-3-3 11:12

好资源,谢谢楼主

DevenVan 发表于 2021-3-3 14:52

满满的看不懂,但凡看不懂的,都是好东西~

xuanmuluck 发表于 2021-4-27 14:51

如果能说明具体使用场景就更棒了

我是人 发表于 2021-4-28 09:25

xuanmuluck 发表于 2021-4-27 14:51
如果能说明具体使用场景就更棒了

是的,很有必要。

xuanmuluck 发表于 2021-4-28 10:22

我是人 发表于 2021-4-28 09:25
是的,很有必要。

自我感觉,也不一定对哈,总觉得spss里会用到各种假设验证,置信度等内容,但是利用python做数据分析时,用的反而不多,像kaggle这样的题目中也是很少,是因为场景的原因吗,还是有其他原因,数据分析到底应该怎么做呢?

我是人 发表于 2021-4-29 23:27

xuanmuluck 发表于 2021-4-28 10:22
自我感觉,也不一定对哈,总觉得spss里会用到各种假设验证,置信度等内容,但是利用python做数据分析时, ...

确实,我在知乎提过一个类似的问题,详见
https://www.zhihu.com/question/430381268/answer/1656456261
归根到底还是python在统计方面的包不完备。
页: [1]
查看完整版本: 【python】利用python进行17种统计假设检验