统计学基础

在学习各种炫酷的算法之前,我们需要先打好一个至关重要的基础——统计学

我们可以把统计学想象成机器学习的语言工具箱,没有它,机器学习模型就像没有地图的探险家,无法理解数据、做出预测或评估自己的表现。

本文将为你系统性地介绍机器学习中必备的统计学核心概念,用通俗的语言和生动的例子,帮助你构建坚实的理论基础。


为什么机器学习需要统计学?

核心原因:机器学习本质上是从数据中学习规律,并用这个规律对未知情况进行预测决策。而统计学,正是研究如何收集、分析、解释和呈现数据的科学。

  • 数据理解:统计学帮助我们描述数据的基本特征(比如平均身高、收入分布),这是数据清洗和探索的第一步。
  • 规律挖掘:它提供了从数据中推断出普遍规律(模型)的方法,并告诉我们这个规律有多可靠。
  • 预测与评估:统计学理论支撑着我们如何用模型进行预测,以及如何客观地评估一个模型的好坏(是瞎猜还是真懂?)。
  • 不确定性量化:现实世界充满噪音,统计学让我们能够度量预测中的不确定性(例如,"我有95%的把握认为明天会下雨")。

简单来说,统计学是机器学习的理论基石,让智能从玄学变为科学。


核心概念一:描述性统计

描述性统计就像给数据拍快照和体检报告,用几个关键指标来概括数据集的全貌。这是任何数据分析项目的起点。

1. 集中趋势:数据围绕哪里聚集?

这组指标告诉我们数据的中心或典型值在哪里。

指标 解释(比喻) 计算公式(简述) 特点与用途
均值 所有数据的算术平均值。
好比"平均工资"。
总和 / 数据个数 最常用,但对极端值(如亿万富翁)非常敏感,容易"被平均"。
中位数 将数据从小到大排序后,正中间的那个值。
好比"工资中位数"。
排序后取中间位置的值 稳健,不受极端值影响,能更好地反映普通情况。
众数 数据中出现次数最多的值。
好比店里最畅销的鞋码。
出现频率最高的值 适用于分类数据,或寻找最普遍的类别。

示例:一个部门5名员工的月薪(单位:千元)为:[30, 35, 40, 45, 200](老板也在其中)。

  • 均值 = (30+35+40+45+200)/5 = 70。这个值因为老板的200而虚高,不能代表员工收入。
  • 中位数 = 排序后的第三个数 40。这个值更能代表该部门"典型"员工的收入。
  • 众数 = 所有值只出现一次,所以没有众数

2. 离散程度:数据有多分散?

光知道中心不够,我们还需要知道数据是紧密围绕中心,还是散落四处。离散程度衡量数据的波动性或多样性。

指标 解释(比喻) 计算公式(简述) 特点与用途
方差 每个数据点与均值距离的平方的平均值。 Σ(每个值 - 均值)² / (n-1) 衡量总体离散程度,单位是原单位的平方。
标准差 方差的正平方根
好比"平均波动幅度"。
√方差 最常用,单位与原数据一致,直观反映波动大小。值越大,数据越分散。
极差 最大值与最小值的差。
"工资跨度"。
最大值 - 最小值 计算简单,但只由两个极端值决定,容易受异常值影响。

接上例:计算员工薪资的标准差(均值用40估算更合理)。

  1. 计算方差:[(30-40)² + (35-40)² + (40-40)² + (45-40)² + (200-40)²] / 4 ≈ 5875
  2. 标准差 = √5875 ≈ 76.65。这个巨大的标准差(76.65)远大于均值(40),强烈提示数据中存在极端异常值(老板的200),需要进一步分析。

3. 数据分布与可视化

数字指标是抽象的,图表能让我们直观"看到"数据。

  • 直方图:展示数据在不同区间(桶)内的频率分布。可以看出数据是单峰还是多峰,是否对称。
  • 箱线图:用一个"箱子"和"触须"展示数据的最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)、最大值,是识别异常值的利器。

实例

# Python 示例:使用 matplotlib 和 seaborn 绘制箱线图来识别异常值
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

# 员工薪资数据,包含一个异常值
salaries = np.array([30, 35, 40, 45, 200])
employee_names = ['Alice', 'Bob', 'Charlie', 'Diana', 'Boss']

plt.figure(figsize=(8, 5))
# 创建箱线图
sns.boxplot(y=salaries)
plt.title('Department Salary Distribution (Boxplot)')
plt.ylabel('Salary (k)')
plt.grid(axis='y', linestyle='--', alpha=0.7)

# 标注出异常值对应的点
for i, (name, salary) in enumerate(zip(employee_names, salaries)):
    if salary > 45 + 1.5 * (45-35): # 简单异常值判断规则
        plt.annotate(f'{name}: {salary}', xy=(0, salary), xytext=(0.2, salary),
                     arrowprops=dict(facecolor='red', shrink=0.05))
plt.show()

代码解释

  • sns.boxplot() 绘制箱线图。箱体从 Q1 到 Q3,中间线是中位数。
  • 箱线图的"触须"通常延伸到 1.5 倍四分位距(IQR = Q3 - Q1)以内的最远数据点,之外的点被视为异常值并用点单独标出。图中 200 这个点被清晰地识别为异常值。

核心概念二:概率与分布

如果说描述性统计是看历史,那么概率就是预测未来。它量化了某件事情发生的可能性

1. 基本概率

  • 概率 P(A):事件 A 发生的可能性,范围在 0(不可能)到 1(必然)之间。
  • 条件概率 P(A|B):在事件 B 已经发生的条件下,事件 A 发生的概率。这是理解很多机器学习算法(如朴素贝叶斯)的关键。
    • 公式:P(A|B) = P(A 且 B) / P(B)

2. 概率分布

描述一个随机变量取各种可能值的概率规律。机器学习中最重要的是:

  • 正态分布(高斯分布)
    • 形状:著名的"钟形曲线",左右对称。
    • 参数:由**均值(μ)**决定中心位置,**标准差(σ)**决定曲线的"胖瘦"(分散程度)。
    • 重要性:自然界和社会科学中大量现象都近似服从正态分布(如身高、测量误差)。中心极限定理指出,多个独立随机变量之和趋向于正态分布,这使其成为统计推断的基石。
    • 68-95-99.7 法则:数据落在均值±1σ、±2σ、±3σ范围内的概率分别约为68%、95%、99.7%。


核心概念三:推断性统计

这是统计学的"升级版",目标是从样本数据推断总体的性质。机器学习中,我们总在用有限的数据(样本)训练模型,希望它能在无限的真实世界(总体)中表现良好。

1. 中心极限定理

核心思想:无论总体是什么分布,当我们从总体中抽取大量独立的随机样本,并计算每个样本的均值,这些样本均值的分布会趋近于一个正态分布

对机器学习的意义:这为我们利用正态分布的性质来对模型参数(如均值)进行假设检验和构建置信区间提供了理论依据。即使我们不知道总体的真实分布,也能对基于样本得到的估计值进行可靠性分析。

2. 假设检验

用于判断一个关于总体的假设(如"新药无效")是否被样本数据所支持。

  • 零假设(H0):通常表示"没有效果"、"没有差异"(默认立场)。
  • 备择假设(H1):我们希望证实的假设(如"新药有效")。
  • P 值:在零假设成立的前提下,观察到当前样本数据(或更极端数据)的概率。
    • 如何判断:如果 P 值很小(通常 < 0.05),意味着在 H0 下当前情况极难发生,于是我们有足够证据拒绝 H0,接受 H1。
  • 显著性水平(α):判断 P 值是否"足够小"的阈值,常设为 0.05。

机器学习中的应用:用于特征选择,判断某个特征与目标变量之间是否存在统计上显著的相关性,而非偶然关联。

3. 相关性与因果性

这是数据分析中最容易混淆,也最重要的概念之一。

  • 相关性:衡量两个变量同时变化的趋势。常用**相关系数(-1 到 1)**表示。
    • 1:完全正相关(同增同减)。
    • -1:完全负相关(一增一减)。
    • 0:无线性相关。
  • 因果性:指一个变量(因)的变化直接导致另一个变量(果)的变化。

关键区别相关性不等于因果性!

  • 经典谬误:夏天冰淇淋销量和溺水人数高度正相关。但这并不意味着吃冰淇淋导致溺水。其共同原因(混杂变量)天气炎热
  • 对机器学习的启示:机器学习模型(尤其是预测模型)善于发现相关性,但无法自行确定因果性。将模型发现的强相关关系误认为是因果关系,是实践中常见的错误。建立因果模型需要更严谨的实验设计(如随机对照试验)或特殊的因果推断方法。

实践练习:用 Python 进行基础统计分析

让我们用 Python 和著名的 pandasseaborn 库,对一个真实数据集进行简单的描述性和探索性统计分析。

实例

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# 1. 加载数据集(这里使用 seaborn 自带的'tips'小费数据集)
df = sns.load_dataset('tips')
print("数据集前5行:")
print(df.head())
print(f"\n数据集形状:{df.shape}") # 查看行数和列数
print("\n基本信息:")
print(df.info())
print("\n描述性统计:")
print(df.describe())

# 2. 探索数值型变量:总账单(total_bill)和小费(tip)
print(f"\n总账单的均值:{df['total_bill'].mean():.2f}")
print(f"总账单的中位数:{df['total_bill'].median():.2f}")
print(f"总账单的标准差:{df['total_bill'].std():.2f}")
print(f"小费与总账单的相关系数:{df['tip'].corr(df['total_bill']):.3f}")

# 3. 可视化
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 3.1 总账单的直方图与密度估计
sns.histplot(df['total_bill'], kde=True, ax=axes[0, 0])
axes[0, 0].set_title('Distribution of Total Bill')
axes[0, 0].axvline(df['total_bill'].mean(), color='red', linestyle='--', label=f'Mean: {df["total_bill"].mean():.1f}')
axes[0, 0].axvline(df['total_bill'].median(), color='green', linestyle='--', label=f'Median: {df["total_bill"].median():.1f}')
axes[0, 0].legend()

# 3.2 小费与总账单的散点图(看相关性)
sns.scatterplot(data=df, x='total_bill', y='tip', hue='time', ax=axes[0, 1])
axes[0, 1].set_title('Tip vs Total Bill (Colored by Meal Time)')

# 3.3 按性别分组的小费箱线图(比较组间差异)
sns.boxplot(data=df, x='sex', y='tip', ax=axes[1, 0])
axes[1, 0].set_title('Tip Amount by Gender')

# 3.4 吸烟与否的账单均值柱状图
bill_by_smoker = df.groupby('smoker')['total_bill'].mean().reset_index()
sns.barplot(data=bill_by_smoker, x='smoker', y='total_bill', ax=axes[1, 1])
axes[1, 1].set_title('Average Total Bill by Smoking Status')
for index, row in bill_by_smoker.iterrows():
    axes[1, 1].text(index, row['total_bill']+0.5, f"{row['total_bill']:.1f}", ha='center')

plt.tight_layout()
plt.show()

练习任务

运行代码:在你的 Python 环境中运行上述代码,观察输出和图表。

解读结果

  • 从描述性统计表中,你能说出总账单的大致范围和中位数吗?
  • 小费和总账单是正相关还是负相关?从散点图中能看出来吗?
  • 从箱线图看,男性和女性给的小费中位数有显著差异吗?

提出假设:基于"吸烟与否的账单均值"柱状图,你能提出一个可以用于假设检验的零假设吗?(例如:H0: 吸烟者和非吸烟者的平均账单没有差异)。