【python】利用python进行17种统计假设检验
原文在语雀上 https://www.yuque.com/alipayqgthu1irbf/sharkfin/enrznihttps://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实现测试。 学习了感谢分享 好资源,谢谢楼主 满满的看不懂,但凡看不懂的,都是好东西~ 如果能说明具体使用场景就更棒了 xuanmuluck 发表于 2021-4-27 14:51
如果能说明具体使用场景就更棒了
是的,很有必要。 我是人 发表于 2021-4-28 09:25
是的,很有必要。
自我感觉,也不一定对哈,总觉得spss里会用到各种假设验证,置信度等内容,但是利用python做数据分析时,用的反而不多,像kaggle这样的题目中也是很少,是因为场景的原因吗,还是有其他原因,数据分析到底应该怎么做呢? xuanmuluck 发表于 2021-4-28 10:22
自我感觉,也不一定对哈,总觉得spss里会用到各种假设验证,置信度等内容,但是利用python做数据分析时, ...
确实,我在知乎提过一个类似的问题,详见
https://www.zhihu.com/question/430381268/answer/1656456261
归根到底还是python在统计方面的包不完备。
页:
[1]