第 16 课 - 描述性统计:均值、方差与分位数
学习目标
完成本课学习后,你将能够:
- 理解并计算数据的均值,衡量数据的集中趋势。
- 理解并计算数据的方差与标准差,衡量数据的离散程度。
- 理解分位数(四分位数、百分位数)的概念,并能解释其在数据分析中的意义。
- 使用 Python(NumPy/Pandas)高效地计算这些描述性统计量。
- 通过统计指标初步解读和描述一组数据的基本特征。
核心概念
在进入复杂的机器学习模型之前,我们首先要学会“倾听”数据的声音。描述性统计就是我们与数据进行初步对话的工具,它通过几个关键的数字(统计量)来概括数据的整体面貌。
1. 均值 (Mean) - 数据的“平衡点”
均值就是我们平常说的“平均数”。它告诉我们一组数据的中心位置在哪里。
- 通俗理解:想象一下,你有一堆大小不一的苹果,你想知道它们的平均重量。把所有苹果的重量加起来,再除以苹果的个数,得到的就是均值。如果把数据放在一个跷跷板上,均值就是那个能让跷跷板平衡的支点。
- 公式:对于数据集 $X = [x_1, x_2, ..., x_n]$,均值 $\mu = \frac{1}{n}\sum_{i=1}^{n}x_i$。
- 注意:均值对异常值(特别大或特别小的值)非常敏感。一个极端值可能会大大拉动均值。
2. 方差 (Variance) 与 标准差 (Standard Deviation) - 数据的“波动程度”
知道了数据的中心,我们还想知道数据分布得有多“开”,是紧密聚集在均值周围,还是四散分布。
- 通俗理解:方差和标准差都是衡量数据离散程度或波动性的指标。
- 方差:计算每个数据点与均值之差的平方,再求这些平方值的平均。平方是为了消除正负影响并放大较大偏差。方差越大,数据越分散。
- 标准差:是方差的平方根。它的优势在于单位与原始数据相同,更容易解释。例如,身高数据的单位是厘米,其标准差的单位也是厘米。
- 公式:
- 方差 $\sigma^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i - \mu)^2$ (总体方差)
- 标准差 $\sigma = \sqrt{\sigma^2}$
- 重要提示:在机器学习和统计中,当处理样本(而非整个总体)时,我们常用无偏估计,即除以
n-1而非n来计算方差和标准差。NumPy和Pandas的函数默认行为有所不同,需要留意。
3. 分位数 (Quantiles) - 数据的“分布地图”
分位数将数据按大小顺序排列后,划分为若干等份的点。
- 通俗理解:分位数能告诉你“排在某个百分比位置的数据值是多少”。
- 四分位数:最常用,将数据分为四等份。
- 第一四分位数 (Q1, 25th percentile):有25%的数据小于或等于这个值。
- 中位数 (Q2, 50th percentile):有50%的数据小于或等于这个值。它是数据的另一个“中心”点,对异常值不敏感。
- 第三四分位数 (Q3, 75th percentile):有75%的数据小于或等于这个值。
- 百分位数:将数据分为100等份。中位数就是第50百分位数。
- 四分位数:最常用,将数据分为四等份。
- 应用:结合Q1和Q3,我们可以计算四分位距 (IQR = Q3 - Q1),这是衡量数据中间50%部分离散程度的重要指标,常用于检测异常值。
代码示例
我们将使用 NumPy 和 Pandas 进行计算。
import numpy as np
import pandas as pd
# 创建一个模拟的班级考试成绩数据集
scores = np.array([85, 92, 78, 65, 95, 100, 72, 88, 55, 76, 82, 91, 68, 80, 99])
print("原始成绩数据:", scores)
print("-" * 40)
# 1. 计算均值 (Mean)
mean_score = np.mean(scores)
print(f"平均成绩 (均值): {mean_score:.2f}")
# 2. 计算方差 (Variance) 和 标准差 (Standard Deviation)
# 注意:np.var 和 np.std 默认计算的是总体方差/标准差 (除以 n)
# 如果要计算样本方差/标准差 (除以 n-1),需要设置 ddof=1
variance_population = np.var(scores)
std_population = np.std(scores)
print(f"总体方差: {variance_population:.2f}")
print(f"总体标准差: {std_population:.2f}")
variance_sample = np.var(scores, ddof=1)
std_sample = np.std(scores, ddof=1)
print(f"样本方差 (无偏估计): {variance_sample:.2f}")
print(f"样本标准差 (无偏估计): {std_sample:.2f}")
# 3. 计算分位数 (Quartiles, Percentiles)
# 使用 np.percentile 可以计算任意百分位数
q1 = np.percentile(scores, 25)
median = np.percentile(scores, 50) # 等同于 np.median(scores)
q3 = np.percentile(scores, 75)
iqr = q3 - q1
print(f"\n第一四分位数 (Q1, 25%): {q1}")
print(f"中位数 (Q2, 50%): {median}")
print(f"第三四分位数 (Q3, 75%): {q3}")
print(f"四分位距 (IQR): {iqr}")
# 更直观的百分位数示例
p90 = np.percentile(scores, 90)
print(f"第90百分位数 (P90): {p90}")
print(f"解释: 有90%的成绩低于或等于 {p90}")
# 使用 Pandas 进行快速概览 (describe 函数集合了上述多个指标)
print("\n--- 使用 Pandas describe() 快速查看统计摘要 ---")
scores_series = pd.Series(scores, name="Score")
print(scores_series.describe())
# 可视化辅助理解 (需要 matplotlib)
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 4))
plt.boxplot(scores, vert=False)
plt.title("考试成绩箱线图 (Boxplot)")
plt.xlabel("分数")
plt.yticks([1], ["成绩"])
plt.axvline(mean_score, color='r', linestyle='--', label=f'均值: {mean_score:.2f}')
plt.axvline(median, color='g', linestyle='-', label=f'中位数: {median}')
plt.legend()
plt.show()
预期输出:
原始成绩数据: [ 85 92 78 65 95 100 72 88 55 76 82 91 68 80 99]
----------------------------------------
平均成绩 (均值): 82.20
总体方差: 148.56
总体标准差: 12.19
样本方差 (无偏估计): 159.17
样本标准差 (无偏估计): 12.62
第一四分位数 (Q1, 25%): 72.0
中位数 (Q2, 50%): 82.0
第三四分位数 (Q3, 75%): 92.0
四分位距 (IQR): 20.0
第90百分位数 (P90): 95.8
解释: 有90%的成绩低于或等于 95.8
--- 使用 Pandas describe() 快速查看统计摘要 ---
count 15.000000
mean 82.200000
std 12.616392
min 55.000000
25% 72.000000
50% 82.000000
75% 92.000000
max 100.000000
Name: Score, dtype: float64
(图表将显示一个箱线图,红色虚线为均值,绿色实线为中位数)
实践练习
练习 1:基础计算
给定一个房屋面积数据集(单位:平方米):[120, 85, 150, 95, 110, 130, 180, 70, 105]。
- 计算其均值、标准差(使用样本标准差)。
- 计算中位数和四分位距(IQR)。
- 根据计算结果,简要描述这个数据集的特征。
练习 2:解读统计摘要
你使用 Pandas 的 describe() 函数对一组股票日收益率数据得到了以下输出:
count 100.000000
mean 0.001500
std 0.023400
min -0.055000
25% -0.012500
50% 0.002000
75% 0.016250
max 0.061000
请回答:
- 这100天的平均日收益率是多少?收益率的标准差是多少?
- 收益率的中位数与均值有何不同?这可能说明了什么?(提示:考虑分布的对称性)
- 假设“异常波动”定义为收益率小于 Q1 - 1.5IQR 或大于 Q3 + 1.5IQR。请计算这个异常范围的下限和上限。
练习 3:综合分析
比较两组学生的编程作业完成时间(单位:分钟):
A组:[30, 45, 35, 40, 50, 25, 45, 38]
B组:[50, 55, 60, 45, 70, 40, 48, 62]
- 分别计算两组的均值和中位数。
- 分别计算两组的标准差(样本标准差)。
- 哪一组的数据更集中(波动更小)?哪一组的整体完成时间更长?请用统计量作为证据。
常见错误
-
混淆总体与样本的方差/标准差:
- 错误:对一个数据样本直接使用
np.var(data)得到总体方差。 - 正确:在统计推断中,我们通常处理的是样本,应使用无偏估计。在
NumPy中使用ddof=1(np.var(data, ddof=1)),在Pandas中.std()和.var()默认就是计算无偏估计的样本标准差和方差。
- 错误:对一个数据样本直接使用
-
误读分位数:
- 错误:“75%的分位数是90”意味着75%的数据是90。
- 正确:“第75百分位数是90”意味着有75%的数据点小于或等于90。这是一个位置,不是某个数据点出现的频率。
-
忽视异常值对均值的影响:
- 错误:用平均收入衡量一个典型居民的收入水平。
- 正确:如果数据中有个别亿万富翁,他们会极大地拉高均值。此时,中位数是衡量“典型”水平更稳健的指标。
-
孤立看待统计量:
- 错误:只看均值,就说“数据很集中”。
- 正确:必须结合离散程度(如标准差、IQR)来判断。均值相同,标准差可以天差地别。
小结
- 均值描述了数据的集中趋势,是数据的算术中心,但对异常值敏感。
- 方差和标准差描述了数据的离散程度,即数据围绕均值的波动大小。标准差的单位与原始数据一致,解释更直观。
- 分位数(尤其是四分位数)描绘了数据的分布形状,中位数是另一个衡量中心位置的稳健指标,IQR可以有效地衡量数据主体的离散程度。
- 在实践中,利用
NumPy和Pandas的函数可以快速计算这些指标,describe()方法是一个非常有用的快速概览工具。 - 描述性统计是数据分析和机器学习的第一步,它帮助我们理解数据的基本性质,为后续的数据清洗、特征工程和模型选择提供关键依据。
练习编辑器
rust
Loading...