如何为PySpark样本分布绘制钟形曲线并叠加到matplotlib直方图上
问题解答
1. 是否需要对数据做变换处理
分两种场景判断:
- 若你只是要叠加正态分布参考钟形线,用来对比当前数据分布和正态分布的差异,无需做任何变换,直接基于原始数据的均值、标准差生成正态曲线即可,无论原始数据是否符合正态分布都可以绘制这条参考线。
- 若你需要让处理后的数据本身满足正态分布再做后续分析,则需要根据数据的偏态特征选择对应变换方式,比如右偏数据可使用对数变换、Box-Cox变换等。
2. 直方图叠加钟形曲线的实现方案
在原有代码基础上新增正态分布拟合逻辑即可,需注意对齐直方图的Y轴刻度,完整可运行代码如下:
from pyspark.sql import DataFrame import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm dfPy = sqlContext.table("df") # 避免用pd作为变量名,防止和pandas库命名冲突 pd_df = dfPy.toPandas() # 绘制原始直方图,接收返回的坐标轴对象 ax = pd_df[['col4']].plot( kind='hist', bins=[0,10,20,30,40,50,60,70,80,90,100], rwidth=0.8 ) # 拟合原始数据的均值和标准差 mu, sigma = norm.fit(pd_df['col4']) # 生成钟形曲线的X轴连续取值 x = np.linspace(pd_df['col4'].min(), pd_df['col4'].max(), 100) # 计算正态分布概率密度,乘以总样本量和组距(此处bins间隔为10)对齐直方图计数刻度 y = norm.pdf(x, mu, sigma) * len(pd_df['col4']) * 10 # 叠加绘制钟形曲线 ax.plot(x, y, 'r-', linewidth=2, label=f'正态拟合曲线:均值={mu:.2f}, 标准差={sigma:.2f}') ax.legend() plt.show()
如果希望绘制密度模式的直方图,只需将plot方法的density参数设为True,同时计算y时去掉* len(pd_df['col4']) * 10的部分即可,此时Y轴为密度值。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

