Python 数据分析入门:多元线性回归——多个因素如何一起预测结果(附完整可视化案例)

很多初学者在学完一元线性回归之后,都会遇到一个很自然的问题:

现实中的预测问题,往往不是一个因素决定结果,而是多个因素共同作用。
这种情况下,应该怎么建模?

例如:

  • 学生总评成绩,不只是由作业成绩决定
  • 房价,不只是由面积决定
  • 销售额,也不只是由广告投入决定

这时候,只用一个自变量建立模型,往往不能完整反映实际情况。更合理的做法是:

把多个因素同时纳入模型,分析它们对结果的共同影响。

这就是多元线性回归要解决的问题。

回归分析是一种预测性的建模技术,研究的是因变量(目标)和自变量(预测器)之间的关系,通常用于预测分析、时间序列模型以及发现变量之间的因果关系 [1]。根据因变量和自变量的个数,回归分析可以分为一元回归分析、多元回归分析、逻辑回归分析和其他回归分析;线性回归是其中最基本的方法 [1]。

本文围绕“多个因素如何一起预测结果”这一主题,介绍:

  • 什么是多元线性回归
  • 它和一元线性回归有什么区别
  • 什么情况下适合使用多元线性回归
  • 如何用 Python 建立一个多元线性回归模型
  • 如何通过图表对模型结果进行可视化分析

摘要

多元线性回归是回归分析中的重要形式,适用于多个自变量共同影响一个因变量的场景。回归分析本质上是一种预测性的建模技术,用于研究因变量与自变量之间的关系,并服务于预测分析、时间序列建模以及变量关系研究 [1]。本文以“学生总评成绩预测”为案例,介绍多元线性回归的基本思想、适用场景与建模流程,并结合 Python 给出包含相关性热力图、真实值与预测值对比图、误差图和回归系数图的完整可视化示例。


一、为什么要学习多元线性回归?

一元线性回归适合“一个自变量预测一个因变量”的场景。
例如:

  • 用学习时长预测考试成绩
  • 用房屋面积预测房价

但在很多真实问题中,结果并不是由单一因素决定的。
例如在学生成绩分析中,总评成绩往往同时受到:

  • 作业成绩
  • 考勤情况
  • 课堂表现
  • 实验成绩

等多个因素影响。

如果只选取其中一个变量进行预测,虽然模型可以建立,但信息往往不够完整,预测能力和解释能力都会受到限制。

因此,当一个结果明显受到多个因素共同作用时,就更适合使用多元线性回归。


二、什么是多元线性回归?

回归分析是一种通过对数据进行分析实现预测的方法 [1]。根据自变量和因变量个数的不同,可以分为一元回归分析和多元回归分析 [1]。

所谓多元线性回归,可以理解为:

当一个因变量同时受到多个自变量影响时,利用线性关系建立预测模型的方法。

它的特点是:

  • 因变量只有一个
  • 自变量有多个
  • 这些自变量共同作用于结果

例如:

场景 自变量 因变量
学生成绩预测 作业成绩、考勤、课堂表现、实验成绩 总评成绩
房价预测 面积、楼层、房龄、地段评分 房价
销售预测 广告投入、促销次数、门店数量 销售额

所以,多元线性回归本质上就是:

多个因素一起预测一个连续值结果。


三、多元线性回归和一元线性回归有什么区别?

一元线性回归和多元线性回归都属于线性回归,它们的核心思想是一致的,都是通过建立线性关系来进行预测。不同之处主要在于自变量的数量。

一元线性回归

  • 只有 1 个自变量
  • 更适合单因素问题

多元线性回归

  • 有多个自变量
  • 更适合多因素共同影响结果的问题

简单来说:

  • 一元线性回归是“一个因素看结果”
  • 多元线性回归是“多个因素一起看结果”

由于现实中的很多问题都具有多因素特征,因此多元线性回归往往比一元线性回归更接近实际应用场景。


四、多元线性回归适用于什么场景?

多元线性回归适合以下类型的问题:

1. 一个结果受到多个因素影响

例如:

  • 学生总评受平时成绩、考勤、课堂表现共同影响
  • 房价受面积、楼层、地段等因素共同影响
  • 销售额受广告投入、节假日活动、价格调整等因素共同影响

2. 既想预测结果,又想分析影响因素

除了预测结果,很多场景还希望进一步分析:

  • 哪个因素影响更大
  • 哪个因素影响更稳定
  • 多个因素合在一起时,模型整体效果如何

这些都属于多元线性回归的典型应用。


五、回归分析的一般过程

回归分析的一般过程包括以下几个步骤 [1]:

  1. 收集一组包含因变量和自变量的数据
  2. 根据因变量和自变量之间的关系,初步设定回归模型
  3. 求解合理的回归系数
  4. 进行相关性检验,确定相关系数
  5. 利用模型对因变量作出预测或解释,并计算预测值的置信区间

多元线性回归同样遵循这一过程:

  • 先准备多变量数据
  • 再建立线性模型
  • 然后进行预测和效果分析

六、案例:用多个学习指标预测学生总评成绩

下面通过一个完整案例,演示多元线性回归的建模与可视化分析过程。

案例背景

已知某班学生的以下数据:

  • 作业成绩
  • 考勤成绩
  • 课堂表现
  • 实验成绩

现在希望根据这些指标,共同预测学生的总评成绩。

这是一个典型的多元线性回归问题:

  • 自变量:多个学习表现指标
  • 因变量:总评成绩

下面的代码将输出多种图表,包括:

  • 相关性热力图
  • 真实值与预测值散点图
  • 测试集真实值与预测值对比图
  • 预测误差柱状图
  • 回归系数柱状图
  • 模型评价指标柱状图

七、Python 实战代码:完整可视化版本

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

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# =========================
# 1. 设置中文字体
# =========================
font_path = "simfang.ttf"   # 请确认路径下有该字体文件
font_prop = font_manager.FontProperties(fname=font_path)
plt.rcParams["font.family"] = font_prop.get_name()
plt.rcParams["axes.unicode_minus"] = False

# =========================
# 2. 构造示例数据
# =========================
data = pd.DataFrame({
    '作业成绩': [80, 85, 78, 90, 88, 76, 95, 89, 84, 91, 87, 79],
    '考勤成绩': [90, 92, 85, 96, 94, 80, 98, 93, 89, 97, 91, 84],
    '课堂表现': [85, 88, 80, 92, 90, 78, 96, 91, 86, 94, 89, 82],
    '实验成绩': [82, 86, 79, 91, 89, 75, 97, 90, 85, 93, 88, 80],
    '总评成绩': [84, 88, 80, 93, 90, 77, 97, 91, 86, 95, 89, 81]
})

# =========================
# 3. 划分自变量和因变量
# =========================
X = data[['作业成绩', '考勤成绩', '课堂表现', '实验成绩']]
y = data['总评成绩']

# =========================
# 4. 划分训练集和测试集
# =========================
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

# =========================
# 5. 创建并训练模型
# =========================
model = LinearRegression()
model.fit(X_train, y_train)

# =========================
# 6. 预测
# =========================
y_pred = model.predict(X_test)

# =========================
# 7. 模型评价指标
# =========================
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print("回归系数:")
for feature, coef in zip(X.columns, model.coef_):
    print(f"{feature}: {coef:.4f}")

print("截距:", round(model.intercept_, 4))
print("测试集真实值:", list(y_test))
print("测试集预测值:", [round(v, 2) for v in y_pred])

print("MAE:", round(mae, 4))
print("MSE:", round(mse, 4))
print("RMSE:", round(rmse, 4))
print("R²:", round(r2, 4))

# =========================
# 8. 图1:相关性热力图
# =========================
plt.figure(figsize=(8, 6))
sns.heatmap(data.corr(), annot=True, cmap='Blues', fmt=".2f")
plt.title("各变量相关性热力图")
plt.show()

# =========================
# 9. 图2:真实值 vs 预测值散点图
# =========================
plt.figure(figsize=(7, 5))
plt.scatter(y_test, y_pred, color='blue', s=80)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', linewidth=2)
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.title("测试集真实值与预测值散点图")
plt.grid(alpha=0.3)
plt.show()

# =========================
# 10. 图3:测试集真实值与预测值对比图
# =========================
plt.figure(figsize=(8, 5))
x_index = np.arange(len(y_test))
plt.plot(x_index, y_test.values, marker='o', linewidth=2, label='真实值')
plt.plot(x_index, y_pred, marker='s', linewidth=2, label='预测值')
plt.xticks(x_index, [f"样本{i+1}" for i in range(len(y_test))])
plt.xlabel("测试样本")
plt.ylabel("总评成绩")
plt.title("测试集真实值与预测值对比")
plt.legend()
plt.grid(alpha=0.3)
plt.show()

# =========================
# 11. 图4:预测误差柱状图
# =========================
errors = y_test.values - y_pred

plt.figure(figsize=(8, 5))
bars = plt.bar([f"样本{i+1}" for i in range(len(errors))], errors, color='#55A868')
plt.axhline(0, color='red', linestyle='--')
plt.xlabel("测试样本")
plt.ylabel("误差(真实值-预测值)")
plt.title("测试集预测误差柱状图")
plt.grid(axis='y', alpha=0.3)

for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height,
             f"{height:.2f}", ha='center',
             va='bottom' if height >= 0 else 'top')
plt.show()

# =========================
# 12. 图5:回归系数柱状图
# =========================
plt.figure(figsize=(8, 5))
coef_series = pd.Series(model.coef_, index=X.columns)
bars = plt.bar(coef_series.index, coef_series.values, color='#4C72B0')
plt.xlabel("自变量")
plt.ylabel("回归系数")
plt.title("各自变量回归系数对比")
plt.grid(axis='y', alpha=0.3)

for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height,
             f"{height:.2f}", ha='center',
             va='bottom' if height >= 0 else 'top')
plt.show()

# =========================
# 13. 图6:模型评价指标柱状图
# =========================
metric_names = ['MAE', 'MSE', 'RMSE', 'R²']
metric_values = [mae, mse, rmse, r2]

plt.figure(figsize=(8, 5))
bars = plt.bar(metric_names, metric_values,
               color=['#4C72B0', '#55A868', '#C44E52', '#8172B2'])
plt.title("模型评价指标可视化")
plt.ylabel("指标值")
plt.grid(axis='y', alpha=0.3)

for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, height,
             f"{height:.3f}", ha='center', va='bottom')
plt.show()

八、代码结果怎么看?

1. 相关性热力图

热力图可以直接展示各变量之间的相关程度。
这一步有助于观察:

  • 哪些变量与总评成绩关系更明显
  • 哪些自变量之间可能存在较强相关性

在这里插入图片描述

2. 真实值与预测值散点图

这张图中:

  • 横轴是真实值
  • 纵轴是预测值

如果散点大多靠近对角线,说明模型预测效果较好;如果偏离较远,说明模型误差较大。

在这里插入图片描述

3. 测试集真实值与预测值对比图

这张图可以逐个样本比较真实值与预测值,更容易观察:

  • 哪些样本预测得更准确
  • 哪些样本存在明显偏差

在这里插入图片描述

4. 预测误差柱状图

误差柱状图展示的是真实值减去预测值:

  • 柱子高于 0,说明模型低估了真实值
  • 柱子低于 0,说明模型高估了真实值

在这里插入图片描述

5. 回归系数柱状图

回归系数图可以直观展示不同自变量对结果的影响方向和相对大小。
系数越大,通常说明该变量对总评成绩的影响越明显。

在这里插入图片描述

6. 模型评价指标柱状图

代码中给出了 4 个常见指标:

  • MAE
  • MSE
  • RMSE

一般来说:

  • MAE、MSE、RMSE 越小越好
  • R² 越大越好

在这里插入图片描述


九、学习多元线性回归时常见的误区

1. 认为自变量越多越好

不是。
变量过多可能带来冗余信息,反而影响模型分析效果。

2. 只关注预测结果,不分析变量作用

多元线性回归的价值不仅在于预测,还在于分析多个因素对结果的共同影响。

3. 只输出指标,不做图形分析

仅看数字往往不够直观,图表更有助于理解模型表现和变量关系。

4. 把“模型跑通”当成“模型解释清楚”

模型运行成功只是第一步,更重要的是解释:

  • 为什么这样建模
  • 哪些变量更重要
  • 模型效果如何
  • 误差表现怎样

十、总结

多元线性回归是回归分析中的重要内容,适用于多个自变量共同影响一个因变量的场景。回归分析的一般过程包括数据收集、模型设定、回归系数求解、相关性检验以及利用模型进行预测或解释 [1]。因此,多元线性回归不仅是“多放几个变量”,而是一个完整的数据分析与预测过程。

通过本文的案例,可以建立以下几个基本认识:

  • 多元线性回归适合多因素共同影响结果的问题
  • 它比一元线性回归更接近真实应用场景
  • 建模之后不仅要看预测值,还要结合图表分析模型效果
  • 回归系数、预测误差和评价指标都是结果分析的重要部分

从入门角度看,可以把多元线性回归概括为一句话:

当一个结果受到多个因素共同影响时,用线性模型把这些因素整合起来进行预测和分析。


写在最后

如果这篇文章对你有帮助,欢迎点赞、收藏、评论支持一下。

你在学习多元线性回归时,最容易卡住的是哪一部分?

  • 不知道怎么选自变量
  • 看不懂回归系数
  • 不清楚图表该怎么画
  • 还是模型能跑但不会解释结果

欢迎在评论区交流。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐