统计学基础 - MACHINE-LEARNING教程

统计学基础

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

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

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


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

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

  • 数据理解 :统计学帮助我们描述数据的基本特征(比如平均身高、收入分布),这是数据清洗和探索的第一步。
  • 规律挖掘 :它提供了从数据中推断出普遍规律(模型)的方法,并告诉我们这个规律有多可靠。
  • 预测与评估 :统计学理论支撑着我们如何用模型进行预测,以及如何客观地评估一个模型的好坏(是瞎猜还是真懂?)。
  • 不确定性量化 :现实世界充满噪音,统计学让我们能够度量预测中的不确定性(例如,"我有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 绘制箱线图来识别异常值importmatplotlib.pyplotaspltimportseabornassnsimportnumpyasnp# 员工薪资数据,包含一个异常值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)# 标注出异常值对应的点fori,(name,salary)inenumerate(zip(employee_names,salaries)):ifsalary>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 和著名的 pandas seaborn 库,对一个真实数据集进行简单的描述性和探索性统计分析。

示例代码
importpandasaspdimportseabornassnsimportmatplotlib.pyplotaspltimportnumpyasnp# 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')forindex,rowinbill_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: 吸烟者和非吸烟者的平均账单没有差异)。