公众号:尤而小屋 编辑:Peter 作者:Peter
大家好,我是Peter~
在机器学习和数据分析中,验证数据是否符合特定分布(如正态分布)是一个关键步骤,因为它直接影响统计方法和机器学习模型的选择。
许多统计检验(如t检验、ANOVA)和机器学习算法(如线性回归、高斯朴素贝叶斯)都基于数据服从正态分布的假设:如果这一假设不成立,模型的性能可能会受到影响,此时我们需要对数据进行转换(如对数变换或标准化)或选择更适合的非参数方法。
Q-Q图(Quantile-Quantile Plot)正是为解决这一问题而设计的强大可视化工具。它通过将数据的分位数与理论分布的分位数进行对比,直观地展示数据分布与目标分布(如正态分布)之间的差异。这种可视化不仅帮助我们快速判断数据是否满足分布假设,还能为数据转换或模型选择提供重要依据,从而确保分析结果的准确性和可靠性。
数据分布描述了数据在不同取值上的频率或概率。它展示了数据在各个区间或类别中的分布情况,是统计和概率学中的核心概念。
分位数是将数据按大小排序后,分成若干等份的点。常见的分位数包括中位数、十分位数和百分位数等。
分位数有几个重要特性:
QQ图(Quantile-Quantile Plot,又称之为分位图)是一种用于比较两个概率分布是否相似的图形工具。它通过对比两个分布的分位数来判断它们是否一致,常用于检验数据是否服从某一理论分布(如正态分布)。
两个数据集的比较:
# 生成两个数据集
np.random.seed(42)
data1 = np.random.normal(loc=0, scale=1, size=100)
data2 = np.random.normal(loc=0.5, scale=1.2, size=100)
# 绘制QQ图比较两个数据集
stats.probplot(data1, dist="norm", plot=plt)
stats.probplot(data2, dist="norm", plot=plt)
plt.title('QQ Plot: Comparing Two Datasets')
plt.legend(['Data 1', 'Data 2'])
plt.show()
三个数据集的比较:
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
# 生成多组数据
np.random.seed(42)
data1 = np.random.normal(loc=0, scale=1, size=100)
data2 = np.random.normal(loc=1, scale=1.5, size=100)
data3 = np.random.normal(loc=-1, scale=0.8, size=100)
# 绘制多组QQ图
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for i, data in enumerate([data1, data2, data3]):
stats.probplot(data, dist="norm", plot=axes[i])
axes[i].set_title(f'Dataset {i+1}')
plt.tight_layout()
plt.show()
1、指数分布
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
# 设置支持中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 设置图像标题字体
plt.rcParams['axes.unicode_minus'] = False
# 生成示例数据(假设为正态分布)
np.random.seed(42)
data = np.random.normal(loc=0, scale=1, size=1000)
# 绘制QQ图
plt.figure(figsize=(8, 6))
stats.probplot(data, dist="norm", plot=plt)
plt.title('QQ Plot - 检查数据是否服从正态分布')
plt.show()
2、均匀分布
# 生成均匀分布样本数据
data = np.random.uniform(low=0, high=1, size=100)
# 绘制QQ图
stats.probplot(data, dist="uniform", plot=plt)
plt.title('Uniform QQ Plot')
plt.show()
3、指数分布
# 生成指数分布样本数据
data = np.random.exponential(scale=1, size=100)
# 绘制QQ图
stats.probplot(data, dist="expon", plot=plt)
plt.title('Exponential QQ Plot')
plt.show()
# 生成自定义分布样本数据
data = np.random.beta(a=2, b=5, size=100)
# 绘制QQ图
stats.probplot(data, dist="beta", sparams=(2, 5), plot=plt)
plt.title('Beta QQ Plot')
plt.show()
# 生成示例数据(假设为右偏分布)
np.random.seed(42)
data = np.random.exponential(scale=2, size=1000)
# 绘制原始数据的QQ图
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
stats.probplot(data, dist="norm", plot=plt)
plt.title('QQ Plot - 原始数据')
# 对数据进行对数变换
transformed_data = np.log1p(data)
# 绘制变换后的QQ图
plt.subplot(1, 2, 2)
stats.probplot(transformed_data, dist="norm", plot=plt)
plt.title('QQ Plot - 对数变换后数据')
plt.show()
import statsmodels.api as sm
import scipy.stats as stats
# 生成示例数据
np.random.seed(42)
X = np.random.normal(size=1000)
y = 2 * X + np.random.normal(size=1000)
# 拟合线性回归模型
X = sm.add_constant(X) # 添加截距项
model = sm.OLS(y, X).fit()
# 获取残差!!!
residuals = model.resid
# 绘制残差的QQ图
plt.figure(figsize=(8, 6))
stats.probplot(residuals, dist="norm", plot=plt)
plt.title('QQ Plot - 线性回归残差')
plt.show()
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
import seaborn as sns
# 生成数据
np.random.seed(42)
data = np.random.normal(loc=0, scale=1, size=100)
# 绘制KDE图
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
sns.kdeplot(data, shade=True, color='blue')
plt.title('Kernel Density Estimation (KDE)')
# 绘制QQ图
plt.subplot(1, 2, 2)
stats.probplot(data, dist="norm", plot=plt)
plt.title('QQ Plot')
plt.tight_layout()
plt.show()
1、Understanding QQ Plots:https://library.virginia.edu/data/articles/understanding-q-q-plots
2、understand QQ plots:https://medium.com/@adarshmanojsingh/understand-q-q-plot-298d47da234e
3、kaggle QQ-plot: https://www.kaggle.com/code/gadaadhaarigeek/q-q-plot
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有