该用 plt.hist() 诊断分布形态(如双峰、偏斜、离群值),用 df.describe() 快速核对缺失值、量纲和数量级;二者互补而非互斥。

什么时候该用 plt.hist() 而不是 df.describe()
直方图和摘要统计解决的是完全不同的问题:plt.hist() 展示数据分布形状(有没有双峰、偏斜、离群值聚集),df.describe() 只给数字快照(均值、四分位数等)。如果你在查“为什么模型预测偏差大”,先画直方图;如果只是确认“这列数值范围是不是合理”,describe() 更快。
常见错误现象:用 describe() 发现 std 很大,就认为数据“很分散”,但没意识到可能是长尾+少量极端值——这种结构只有直方图能一眼看出来。
- 连续型变量诊断分布形态 → 优先
plt.hist() - 快速核对缺失值、量纲、数量级 →
df.describe() - 想同时看分布 + 统计数字 → 先跑
plt.hist(),再补一行df[col].describe(),别混成一个动作
plt.hist() 的 bins 参数怎么设才不误导人
bins 不是调参,是表达意图。默认 10 个桶在大多数真实数据上都会抹平细节或制造假峰。
使用场景:金融交易金额、用户停留时长这类右偏数据,用等宽分箱(默认)会把大量低值挤在一个桶里,高值区域全是空桶或噪声。
立即学习“Python免费学习笔记(深入)”;
websenB2B是一套经过完善设计的B2B行业网站程序,是windows nt系列环境下最佳的B2B行业网产站解决方案。精心设计的架构与功能机制,适合从个人到企业各方面应用的要求,为您提供一个安全、稳定、高效、易用而快捷的行业网站商务系统。分普及版和商业版等不同版本。一、网胜B2B电子商务系统SP6.2蓝色风格普及版本升级功能说明:1、邮件群发功能:可以选择某一级别的会员,并放入支持html
- 先试
bins='auto'(实际是'fd'规则),它会按数据密度动态调整,比固定数字靠谱得多 - 要和业务对齐时,改用
np.arange()手动设边界,比如用户年龄按np.arange(0, 101, 5)分 5 岁一段 - 绝对不要用
bins=100硬凑——样本少于 200 行时,每个桶平均不到 2 个点,直方图失去意义
直方图 vs 密度图:density=True 的真实作用
density=True 不是“让图形更平滑”,而是把纵轴从「频数」换成「概率密度」。这意味着所有柱子面积加起来等于 1,才能和 scipy.stats.norm.pdf() 这类理论曲线叠在一起比。
容易踩的坑:开了 density=True 却还去读纵轴数字说“这个区间有 0.3 个样本”——这是错的,0.3 是密度值,不是计数,不能直接解释为比例。
- 单纯看分布形状 → 关掉
density(默认False),纵轴是整数,好理解 - 要叠加正态拟合线、做 KS 检验 → 必须开
density=True - 想看占比?用
weights参数更直接:weights=np.ones(len(data)) / len(data),此时纵轴就是比例
Summary 输出里 count 和 mean 对不上怎么办
df.describe() 默认忽略 NaN,但不同列缺失模式可能不同。如果 count 明显小于行数,而你又没检查过缺失位置,mean 就可能被局部缺失带偏。
典型现象:某列 count=998,但 mean 却比中位数高一倍——大概率是那 2 个缺失值刚好在数据最大端,删掉后剩下全是小值,均值被拉低了?不,是反的:删掉两个极大值后,均值反而变小了?不对——等等,先看缺失是不是集中在高值区。
- 永远配着
df[col].isna().sum()一起看describe(),别只扫一眼count - 如果缺失非随机(比如用户收入在 >100 万时系统不采集),
describe()的mean就不可信,得换median或插补 -
describe(include='all')会暴露对象列的unique和top,但对数值列没帮助,别滥用









