DS4-OLS模型建立
DS4-OLS模型建立
引言
想象一下,你是一位健身教练,想要帮助客户制定合理的体重目标。当你看到一位身高165cm的女性时,你会如何建议她的理想体重?或者,你是一位服装设计师,需要根据客户的身高来估算衣服尺寸。这些问题都可以通过线性回归分析来解决!
本文将以女性身高与体重的关系为例,深入浅出地讲解Python中statsmodels库的OLS(普通最小二乘法)线性回归,让你不仅学会代码,更能理解背后的统计学原理。
一、什么是OLS?——找一条"最佳拟合线"
1.1 OLS的定义
**OLS(Ordinary Least Squares,普通最小二乘法)**是统计学中最经典的线性回归方法。它的核心思想可以用一句话概括:
找一条直线,让所有数据点到这条直线的垂直距离的平方和最小。
1.2 生动的比喻
想象你在玩飞镖游戏:
- 每个飞镖代表一个数据点(比如一位女性的身高-体重数据)
- 你要在墙上画一条直线
- OLS的目标就是找到这样一条线:所有飞镖到这条线的垂直距离的平方和最小
这就像是在说:“我要找一条最公平的线,让所有人的’误差’加起来最小!”
1.3 数学表达式
OLS的数学模型是:
y = Xβ + ε
其中:
- y:因变量(dependent variable)——我们要预测的东西,比如体重
- X:自变量(independent variable)——用来预测的东西,比如身高
- β:回归系数——表示X对y的影响程度
- ε:误差项——模型无法解释的部分
在我们的例子中,模型可以写成:
体重 = β₀ + β₁ × 身高 + ε
二、实战案例:女性身高与体重的关系
2.1 数据介绍
我们有一份包含15位女性身高和体重的数据:
| 编号 | 身高(height) | 体重(weight) |
|---|---|---|
| 1 | 58 | 115 |
| 2 | 59 | 117 |
| 3 | 60 | 120 |
| … | … | … |
| 15 | 72 | 164 |
业务理解:通过建立线性回归模型,实现根据身高预测体重的目的。
2.2 数据可视化
首先,让我们看看数据的分布:
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
frame = pd.read_csv("women.csv")
# 绘制散点图
plt.scatter(frame['height'], frame['weight'])
plt.xlabel("身高")
plt.ylabel("体重")
plt.title("女性身高与体重散点图")
plt.show()
观察:数据点呈现出明显的线性趋势——身高越高,体重越重。这正是线性回归大展身手的时候!
2.3 建立OLS模型
import statsmodels.api as sm
# 准备数据
X = frame['height'] # 自变量:身高
y = frame['weight'] # 因变量:体重
# 添加常数项(截距)
X_add = sm.add_constant(X)
# 创建OLS模型
model = sm.OLS(y, X_add)
# 拟合模型
results = model.fit()
# 查看结果摘要
print(results.summary())
2.4 结果解读
OLS Regression Results
==============================================================================
Dep. Variable: weight R-squared: 0.991
Model: OLS Adj. R-squared: 0.990
Method: Least Squares F-statistic: 1433.
Date: Tue, 05 May 2026 Prob (F-statistic): 1.09e-14
Time: 11:17:52 Log-Likelihood: -26.541
No. Observations: 15 AIC: 57.08
Df Residuals: 13 BIC: 58.50
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -87.5167 5.937 -14.741 0.000 -100.343 -74.691
height 3.4500 0.091 37.855 0.000 3.253 3.647
==============================================================================
关键指标解读:
1. 回归系数(coef)
const = -87.5167:截距项。当身高为0时,体重为-87.5(这在现实中没有意义,只是数学上的截距)height = 3.4500:每增加1单位身高,体重增加3.45单位
实际意义:如果一个女性身高从160cm增加到161cm,预计体重会增加约3.45磅。
2. R-squared = 0.991
- 表示模型解释了99.1%的数据变异
- **极高的拟合度!**说明身高几乎可以完美预测体重
3. P值(P>|t|)
- 两个系数的P值都是0.000(< 0.05)
- 说明身高对体重的影响是统计显著的
三、总结与建议
3.1 核心知识点回顾
| 概念 | 说明 | 应用场景 |
|---|---|---|
| OLS | 普通最小二乘法,最小化误差平方和 | 建立线性关系模型 |
| R-squared | 模型解释力,越接近1越好 | 评估模型拟合度 |
| F检验 | 检验模型整体显著性 | 判断模型是否有用 |
| Durbin-Watson | 检验残差自相关 | 诊断模型问题 |
| Jarque-Bera | 检验残差正态性 | 验证模型假设 |
来自菜鸟编程
3.2 完整代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.stats.stattools import durbin_watson, jarque_bera
# 1. 读取数据
df = pd.read_csv('women.csv')
# 2. 数据可视化
plt.scatter(df['height'], df['weight'])
plt.xlabel('身高')
plt.ylabel('体重')
plt.show()
# 3. 建立线性回归模型
X = sm.add_constant(df['height'])
y = df['weight']
model = sm.OLS(y, X)
results = model.fit()
# 4. 查看结果
print(results.summary())
# 5. 模型诊断
print(f"F检验P值: {results.f_pvalue}")
print(f"Durbin-Watson: {durbin_watson(results.resid)}")
jb_stat, jb_pvalue, skew, kurt = jarque_bera(results.resid)
print(f"Jarque-Bera P值: {jb_pvalue}")
# 6. 预测
new_height = 65
prediction = results.predict([1, new_height])
print(f"身高{new_height}英寸的预测体重: {prediction[0]:.2f}磅")
结语
线性回归就像是一把瑞士军刀——简单、实用、适用范围广。通过本文的学习,你不仅掌握了statsmodels中OLS的使用方法,更理解了背后的统计学原理。
记住:好的模型不仅要拟合得好,还要经得起检验!
希望这篇文章能帮助你在数据分析的道路上走得更远。祝你一天都开心
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)