通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

如何验证数据正态分布python

如何验证数据正态分布python

如何验证数据正态分布python

使用直方图和QQ图、Shapiro-Wilk检验、Kolmogorov-Smirnov检验

在数据分析中,验证数据是否服从正态分布是非常重要的一步。使用直方图和QQ图可以直观地观察数据分布情况;Shapiro-Wilk检验和Kolmogorov-Smirnov检验是两种常用的统计方法来验证数据正态性。详细介绍Shapiro-Wilk检验:Shapiro-Wilk检验是一种用于检验样本是否来自正态分布的统计方法,它的假设检验步骤为:零假设(H0)假设数据服从正态分布,备择假设(H1)假设数据不服从正态分布。当p值大于显著性水平(通常为0.05)时,接受零假设,认为数据服从正态分布。

一、使用直方图和QQ图

直方图和QQ图是两种直观的可视化方法,可以帮助我们初步判断数据是否服从正态分布。

1. 直方图

直方图是一种柱状图,通过展示数据的频率分布,帮助我们观察数据的分布形态。

import matplotlib.pyplot as plt

import numpy as np

生成样本数据

data = np.random.normal(0, 1, 1000)

绘制直方图

plt.hist(data, bins=30, density=True, alpha=0.6, color='g')

绘制正态分布曲线

mu, std = np.mean(data), np.std(data)

xmin, xmax = plt.xlim()

x = np.linspace(xmin, xmax, 100)

p = np.exp(-0.5*((x - mu)/std)2) / (std * np.sqrt(2 * np.pi))

plt.plot(x, p, 'k', linewidth=2)

plt.title('Histogram')

plt.show()

2. QQ图

QQ图(Quantile-Quantile Plot)可以帮助我们判断数据分布是否与正态分布一致。QQ图中的点如果接近一条直线,说明数据大致服从正态分布。

import scipy.stats as stats

绘制QQ图

stats.probplot(data, dist="norm", plot=plt)

plt.title('QQ Plot')

plt.show()

二、Shapiro-Wilk检验

Shapiro-Wilk检验是一种常用的统计检验方法,可以定量地判断数据是否服从正态分布。

from scipy.stats import shapiro

进行Shapiro-Wilk检验

stat, p = shapiro(data)

print('Shapiro-Wilk Test: Statistics=%.3f, p=%.3f' % (stat, p))

判断p值

alpha = 0.05

if p > alpha:

print('Sample looks Gaussian (fail to reject H0)')

else:

print('Sample does not look Gaussian (reject H0)')

三、Kolmogorov-Smirnov检验

Kolmogorov-Smirnov检验是一种非参数检验方法,可以用于检验单个样本与特定分布(如正态分布)的拟合优度。

from scipy.stats import kstest

进行Kolmogorov-Smirnov检验

stat, p = kstest(data, 'norm', args=(np.mean(data), np.std(data)))

print('Kolmogorov-Smirnov Test: Statistics=%.3f, p=%.3f' % (stat, p))

判断p值

alpha = 0.05

if p > alpha:

print('Sample looks Gaussian (fail to reject H0)')

else:

print('Sample does not look Gaussian (reject H0)')

四、Anderson-Darling检验

Anderson-Darling检验是一种改进的Kolmogorov-Smirnov检验,它对尾部的偏差更加敏感。

from scipy.stats import anderson

进行Anderson-Darling检验

result = anderson(data)

print('Anderson-Darling Test: Statistic=%.3f' % (result.statistic))

判断临界值

for i in range(len(result.critical_values)):

sl, cv = result.significance_level[i], result.critical_values[i]

if result.statistic < cv:

print('%.3f: %.3f, data looks normal (fail to reject H0)' % (sl, cv))

else:

print('%.3f: %.3f, data does not look normal (reject H0)' % (sl, cv))

五、D’Agostino’s K-squared Test

D’Agostino’s K-squared Test可以检测数据的偏度和峰度是否与正态分布一致。

from scipy.stats import normaltest

进行D’Agostino’s K-squared Test

stat, p = normaltest(data)

print('D’Agostino’s K-squared Test: Statistics=%.3f, p=%.3f' % (stat, p))

判断p值

alpha = 0.05

if p > alpha:

print('Sample looks Gaussian (fail to reject H0)')

else:

print('Sample does not look Gaussian (reject H0)')

六、使用工具箱(如SciPy和Statsmodels)

使用SciPy和Statsmodels工具箱可以更加方便地进行数据正态分布的验证。

1. SciPy

SciPy提供了多种统计检验方法,可以方便地进行正态分布的验证。

from scipy.stats import shapiro, kstest, normaltest, anderson

Shapiro-Wilk Test

stat, p = shapiro(data)

print('Shapiro-Wilk Test: Statistics=%.3f, p=%.3f' % (stat, p))

Kolmogorov-Smirnov Test

stat, p = kstest(data, 'norm', args=(np.mean(data), np.std(data)))

print('Kolmogorov-Smirnov Test: Statistics=%.3f, p=%.3f' % (stat, p))

D’Agostino’s K-squared Test

stat, p = normaltest(data)

print('D’Agostino’s K-squared Test: Statistics=%.3f, p=%.3f' % (stat, p))

Anderson-Darling Test

result = anderson(data)

print('Anderson-Darling Test: Statistic=%.3f' % (result.statistic))

for i in range(len(result.critical_values)):

sl, cv = result.significance_level[i], result.critical_values[i]

if result.statistic < cv:

print('%.3f: %.3f, data looks normal (fail to reject H0)' % (sl, cv))

else:

print('%.3f: %.3f, data does not look normal (reject H0)' % (sl, cv))

2. Statsmodels

Statsmodels是一个强大的统计建模工具箱,可以方便地进行数据分析和建模。

import statsmodels.api as sm

绘制QQ图

sm.qqplot(data, line='45')

plt.title('QQ Plot')

plt.show()

七、数据预处理和转换

有时数据可能不服从正态分布,但通过适当的预处理和转换,可以使数据接近正态分布。

1. 数据标准化

数据标准化可以将数据转换为均值为0、标准差为1的标准正态分布。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

data_scaled = scaler.fit_transform(data.reshape(-1, 1)).flatten()

绘制QQ图

sm.qqplot(data_scaled, line='45')

plt.title('QQ Plot (Standardized Data)')

plt.show()

2. 数据对数变换

对数变换可以减小数据的偏度,使数据更加接近正态分布。

data_log = np.log(data - np.min(data) + 1)

绘制QQ图

sm.qqplot(data_log, line='45')

plt.title('QQ Plot (Log Transformed Data)')

plt.show()

3. Box-Cox变换

Box-Cox变换是一种常用的数据变换方法,可以将非正态分布的数据转换为接近正态分布。

from scipy.stats import boxcox

data_boxcox, _ = boxcox(data - np.min(data) + 1)

绘制QQ图

sm.qqplot(data_boxcox, line='45')

plt.title('QQ Plot (Box-Cox Transformed Data)')

plt.show()

八、总结

验证数据是否服从正态分布是数据分析中的重要步骤。通过直方图和QQ图,可以直观地观察数据分布情况;通过Shapiro-Wilk检验、Kolmogorov-Smirnov检验、Anderson-Darling检验和D’Agostino’s K-squared Test等统计方法,可以定量地判断数据是否服从正态分布。在实际应用中,结合多种方法进行验证,可以提高判断的准确性。如果数据不服从正态分布,可以通过标准化、对数变换、Box-Cox变换等方法对数据进行预处理和转换,使数据更加接近正态分布。

相关问答FAQs:

如何使用Python进行正态分布的可视化?
可以通过绘制直方图和Q-Q图来可视化数据的正态分布。使用Matplotlib和Seaborn库,可以轻松创建直方图;而使用SciPy库的probplot函数可以生成Q-Q图。这些图形能帮助判断数据是否符合正态分布。

在Python中有哪些统计方法可以检验数据的正态性?
常见的统计检验方法包括Shapiro-Wilk检验和Kolmogorov-Smirnov检验。Shapiro-Wilk检验适用于小样本数据,而Kolmogorov-Smirnov检验则适用于大样本数据。使用SciPy库中的相关函数可以方便地进行这些检验,并获得p值以判断数据是否符合正态分布。

如何处理不符合正态分布的数据?
当数据不符合正态分布时,可以考虑进行数据转换,如对数转换、平方根转换或Box-Cox转换。这些方法可以帮助数据更接近正态分布。此外,也可以考虑使用非参数统计方法来分析数据,因为这些方法对数据分布的假设要求较低。

相关文章