一直对各种检验稀里糊涂的,借着Python把一些常用的数据分析或者论文建模使用的检验方法总结一哈。

正态分布 Normal distribution

我导师说得好,大家都喜欢的男孩子叫正太,大家都喜欢的图像也叫正态。

首先导入:

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import pandas as pd

正态分布相关数据构造

生成正态分布随机数 np.random.normal(loc=0.0, scale=1.0, size=None)

  1. loc为生成正态分布的均值
  2. scale为生成正态分布的标准差
  3. size为生成正态分布随机数的数量
Norm = np.random.normal(size=10)
print(Norm)

# [ 0.79297992  0.11486076  0.59150981 -0.48018112 -0.49646006  0.30028252
#  -0.44232973  0.92398375 -0.21909139  3.15716074]

生成正态分布随机数的密度值 pdf()

norm_pdf = stats.norm.pdf(Norm)
print(norm_pdf)
# [0.39507864 0.39891275 0.34705588 0.34324403 0.30508555 0.34804571
#  0.35405806 0.36189068 0.20743041 0.1305287 ]

生成正态分布随机数的累计密度值 cdf()

norm_cdf = stats.norm.cdf(Norm)
print(norm_cdf)
# [0.55547757 0.49514605 0.29878981 0.29170626 0.23195405 0.30067458
#  0.31256909 0.32941451 0.12637477 0.93251756]

获取累计密度值为0.05的分位数 ppf(0.05, 均值,标准差)
(正态分布应用——VaR)

q = stats.norm.ppf(0.05, Norm.mean(), Norm.var() ** 0.5)
print(q)
# -1.3951102225418839  即95%的概率损失不会超过-1.3951102225418839

正态分布相关图像绘制

正态分布概率密度函数图像绘制

norm_bins = np.linspace(-5, 5, num=200)
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 0, 1), label='N(0,1)', color='r')
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 0, 0.5 ** 0.5), label='N(0,0.5)', color='yellow')
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 0, 2 ** 0.5), label='N(0,2)', color='blue')
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 2, 1), label='N(2,1)', color='green')
plt.legend()
plt.show()

在这里插入图片描述

正态分布累计概率密度函数图像绘制

norm_bins = np.linspace(-5, 5, num=200)
plt.plot(norm_bins, stats.norm.pdf(norm_bins, 0, 1), label='N(0,1)概率密度函数', color='r')
plt.plot(norm_bins, stats.norm.cdf(norm_bins, 0, 1), label='N(0,1)累计概率密度函数', color='b')
plt.legend()
plt.show()

在这里插入图片描述

正态分布检验

直方图初略判断

x = np.arange(-5, 5, 0.01)


def normal_distirbution(x):
    return (np.e) ** (-x ** 2 / 2) / (2 * np.pi) ** 0.5


samples = np.random.normal(size=100000)

plt.hist(samples, bins=100, density=True, label='数据')
plt.plot(x, normal_distirbution(x), label='正态分布线')
plt.legend()
plt.show()

在这里插入图片描述

Shapiro-Wilk test检验

适用于样本量<50的样本数据。

testData = np.random.normal(2, 1, 30)
contrastData = np.random.random(30)

# 利用Shapiro-Wilk test检验其是否服从正态分布

testDataSW = stats.shapiro(testData)
contrastDataSW = stats.shapiro(contrastData)
print('testData的结果为{},contrastData的结果为{}'.format(testDataSW, contrastDataSW))
# testData的结果为ShapiroResult(statistic=0.9613666534423828, pvalue=0.33556127548217773),
# contrastData的结果为ShapiroResult(statistic=0.9475071430206299, pvalue=0.14491666853427887)

# 统计量越接近1就越表明数据和正态分布拟合得越好,如果P值>显著性水平,接受原假设,则判断样本的总体服从正态分布

kstest 检验

testData = np.random.randn(50)
print('testData的结果为{}'.format(stats.kstest(testData, 'norm')))
# testData的结果为KstestResult(statistic=0.05008991574251498, pvalue=0.9989955175362586)

# 统计量越接近0就越表明数据和标准正态分布拟合的越好,如果P值>显著性水平,接受原假设,则判断样本的总体服从正态分布

normaltest 检验

testData = np.random.randn(50)
print('testData的结果为{}'.format(stats.normaltest(testData)))
# testData的结果为NormaltestResult(statistic=3.3668911251714606, pvalue=0.185732917877838)

# 如果P值>显著性水平,接受原假设,则判断样本的总体服从正态分布

Anderson-Darling 检验

该检验可以应用于不同分布的检验:‘norm’, ‘expon’, ‘gumbel’, ‘extreme1’ , ‘logistic’

testData = np.random.randn(50)
print('testData的结果为{}'.format(stats.anderson(testData)))
# testData的结果为AndersonResult(statistic=0.1963449673478479,
#                            critical_values=array([0.538, 0.613, 0.736, 0.858, 1.021]),
#                            significance_level=array([15., 10., 5., 2.5, 1.]))


# 如果输出的统计量值statistic < critical_values,则表示在相应的显著性水平下,接受原假设,即认为样本数据符合正态分布(给定的其他分布)。

对数正态分布

我理解的对数正态分布就是正态分布的一种变型啦。

X~Lognormnal(μ, σ2) [即Y=lnX 服从正态分布]

log_bins = np.linspace(0, 10, num=200)
plt.plot(log_bins, stats.lognorm.pdf(log_bins, 1, 0, 1))
plt.show()
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐