描述性统计的目标不是立刻训练模型,而是先回答几个更基础的问题:数据通常落在哪里、波动有多大、是否存在异常值,以及两个变量是否一起变化。均值、标准差和相关系数看似简单,但如果忽略分布形状、样本定义或缺失值,它们也很容易制造误导。
中心位置不能只看均值
均值适合描述相对对称、没有明显极端值的数据。中位数对异常值不那么敏感,因此在收入、响应时间、订单金额等偏态数据中通常更有解释力。
假设六次接口响应时间为 98、102、105、107、110、900 毫秒。均值会被 900 毫秒明显拉高,而中位数仍能代表大多数请求的典型水平。这并不意味着应该删除 900;它可能正是需要排查的超时请求。
常见的中心位置指标包括:
- 均值:所有数值之和除以数量,容易受极端值影响。
- 中位数:排序后位于中间的位置,适合偏态数据。
- 众数:出现次数最多的值,分类数据也可以使用。
离散程度决定“平均值”有多可信
两个数据集可以拥有相同均值,却呈现完全不同的稳定性。极差能快速展示首尾跨度,但只依赖最小值和最大值;方差和标准差利用全部观测值;四分位距则聚焦中间 50% 的数据,对异常值更稳健。
使用标准差时要明确数据身份。Python statistics.stdev() 计算样本标准差,分母使用 n - 1;statistics.pstdev() 计算总体标准差,分母使用 n。如果手中的记录只是更大总体的一部分,通常应使用样本标准差。
四分位距可以写成:
IQR = Q3 - Q1
常用的异常值筛查边界是 Q1 - 1.5 × IQR 和 Q3 + 1.5 × IQR。这是一条诊断规则,不是自动删除数据的理由。
相关性需要和图形一起看
相关系数描述两个变量线性共同变化的方向和强度。它通常位于 -1 到 1 之间:接近 1 表示较强的正线性关系,接近 -1 表示较强的负线性关系,接近 0 只表示线性关系较弱。
这里有三条重要边界:
- 相关不等于因果,第三个变量可能同时影响两者。
- 接近零的相关系数不代表没有关系,数据可能呈曲线关系。
- 单个异常值可能显著改变相关系数。
因此,计算相关矩阵之后还应查看散点图;检查单变量分布时,则可以结合直方图和箱线图。
一次完成摘要、异常值筛查和绘图
下面是一段可直接运行的小型分析脚本。它使用内嵌数据,不依赖外部文件。运行前安装 pandas 和 matplotlib:
python -m pip install pandas matplotlib
将以下内容保存为 describe_data.py,然后执行 python describe_data.py:
import matplotlib.pyplot as plt
import pandas as pd
data = {
"study_hours": [1, 2, 2, 3, 4, 5, 6, 7, 8, 9],
"score": [52, 55, 58, 61, 67, 72, 78, 84, 89, 96],
"response_ms": [98, 102, 105, 107, 110, 115, 118, 125, 140, 900],
}
df = pd.DataFrame(data)
# count、mean、std、分位数和极值
print("Descriptive summary:")
print(df.describe().round(2))
print("\nMedian:")
print(df.median())
print("\nPearson correlation:")
print(df.corr(numeric_only=True).round(3))
q1 = df["response_ms"].quantile(0.25)
q3 = df["response_ms"].quantile(0.75)
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
outliers = df.loc[~df["response_ms"].between(lower, upper)]
print(f"\nResponse-time IQR bounds: {lower:.2f} to {upper:.2f}")
print("Potential outliers:")
print(outliers)
fig, axes = plt.subplots(1, 3, figsize=(13, 4))
df["response_ms"].plot.hist(bins=8, ax=axes[0], title="Response time")
df.boxplot(column="response_ms", ax=axes[1])
df.plot.scatter(
x="study_hours",
y="score",
ax=axes[2],
title="Study hours vs score",
)
fig.tight_layout()
fig.savefig("statistics_overview.png", dpi=150)
print("\nSaved chart to statistics_overview.png")
describe() 会集中输出计数、均值、样本标准差、四分位数与极值。脚本还单独计算中位数、Pearson 相关矩阵和 IQR 边界,并将三种图保存到 statistics_overview.png。实际项目中,可以把内嵌字典替换为 pd.read_csv("data.csv")。
把统计摘要变成检查清单
面对新数据集时,可以按下面的顺序工作:
- 检查行数、字段类型、缺失值和重复记录。
- 同时比较均值与中位数,判断分布是否可能偏斜。
- 使用标准差和 IQR 衡量波动,不只报告最小值与最大值。
- 查看直方图和箱线图,确认摘要数字没有掩盖分布结构。
- 计算相关性后绘制散点图,并避免因果推断。
- 记录样本范围、单位和异常值处理方式,让结果可以复核。
描述性统计不是分析流程中的装饰步骤。它能在建模或业务决策之前暴露单位错误、极端值、数据偏斜和不合理假设。最可靠的做法,是让汇总数字、原始记录和图形相互验证。