偏度和峰度不能单独判定正态性,但可快速识别不对称性与尾部厚度;scipy.stats.skew默认无偏估计,bias=true才匹配教材矩定义;kurtosis默认返回超额峰度,≈0表示尾部接近正态。

偏度和峰度不能单独用来判定分布是否正态,但能快速暴露数据的不对称性和尾部厚度——直接用 scipy.stats.skew 和 scipy.stats.kurtosis 计算即可,注意默认参数是“无偏估计”,而多数统计教材用的是“矩定义”版本。
用 scipy.stats.skew 算偏度:结果正负代表方向,绝对值>1 就算明显偏斜
偏度衡量分布左右对称性。正值表示右偏(长尾在右),负值表示左偏(长尾在左)。但数值大小依赖样本量和估计方法:
-
scipy.stats.skew默认使用无偏估计(bias=False),结果会比教科书公式(bias=True)略大,尤其在小样本(n<20)时差异明显 - 若需和教材一致(如《概率论与数理统计》中定义),显式传入
bias=True - 空数组或全相同值会返回
nan,建议先用np.std(x, ddof=0) > 1e-10检查方差是否为零 - 示例:
skew([1,2,2,3,9])返回约1.28,说明存在明显右偏
用 scipy.stats.kurtosis 算峰度:默认返回“超额峰度”,正数≠尖顶,而是比正态更厚尾
峰度常被误解为“尖顶程度”,实际它反映的是尾部重量。scipy 默认计算的是超额峰度(excess kurtosis),即减去了正态分布的峰度值 3:
- 结果 ≈ 0 表示尾部厚度接近正态;>0 表示重尾(异常值更多);<0 表示轻尾
- 不要用
kurtosis(x) == 3判断是否正态——正确写法是abs(kurtosis(x, fisher=True)) (<code>fisher=True是默认值,即超额峰度) - 若想得到原始矩峰度(未减 3),设
fisher=False,此时正态分布理论值为 3 - 小样本下峰度估计极不稳定,n<50 时参考价值有限;n<10 基本不可信
一次性看偏度+峰度:配合直方图和 Q-Q 图才靠谱
单看两个数字容易误判。比如偏度≈0 且峰度≈0,不代表就是正态——均匀分布、双峰分布也可能凑出类似数值:
- 必须画图验证:
plt.hist(x, bins=30, density=True)叠加正态拟合曲线,或用scipy.stats.probplot(x, dist="norm", plot=plt)看 Q-Q 图 - 检验正态性别只依赖偏度/峰度:优先用
scipy.stats.shapiro(小样本)或scipy.stats.normaltest(大样本) - 真实数据中,偏度>0.5 或<−0.5、峰度绝对值>1 就值得警惕,但最终解释要结合业务场景——比如用户停留时长天然右偏,这不是问题,而是事实
偏度和峰度是速查工具,不是诊断报告。它们对离群值极其敏感,一个极端异常值就能让偏度翻倍、峰度暴涨。计算前务必先做简单清洗或 winsorize 处理,否则数字只是在描述噪声。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











