You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python计算并绘制线性回归的预测区间与置信区间

在线性回归模型中同时绘制预测区间与置信区间

你已经通过statsmodels实现了预测区间的绘制,要同时添加置信区间非常简单——get_prediction()返回的结果中,summary_frame()已经包含了置信区间的上下限数据,只需要新增一段绘制置信区间的代码即可。

修改后的完整代码

import statsmodels.api as sm
import statsmodels.formula.api as smf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 数据集
data = {
    'X': [55641, 55681, 55637, 55825, 55772, 55890, 56068, 56299, 56825, 57205, 
          57562, 57850, 57975, 57992, 58240, 58414, 58561, 59066, 58596, 58631, 
          58758, 59037],
    'Y': [21886, 21934, 21699, 21901, 21812, 21714, 21932, 22086, 22265, 22551, 
          22736, 22301, 22518, 22580, 22618, 22890, 23112, 23315, 22865, 22788, 
          22949, 23149]
}

df = pd.DataFrame(data)

# 拟合OLS模型
model = smf.ols(formula='Y ~ X', data=df)
results = model.fit()

print(results.summary())

# 获取预测结果(包含置信区间与预测区间)
predictions = results.get_prediction(df)
prediction_summary_frame = predictions.summary_frame(alpha=0.05)

# 绘制散点图(原始数据)
plt.scatter(df['X'], df['Y'], color='black', label='原始数据')

# 绘制回归线
plt.plot(df['X'], results.fittedvalues, color='#58C9F4', label='回归线')

# 绘制置信区间(均值的置信区间)
plt.fill_between(df['X'], prediction_summary_frame['mean_ci_lower'], prediction_summary_frame['mean_ci_upper'], 
                 color='#A6E3E9', alpha=0.3, label='95% 置信区间')

# 绘制预测区间(单个观测值的预测区间)
plt.fill_between(df['X'], prediction_summary_frame['obs_ci_lower'], prediction_summary_frame['obs_ci_upper'], 
                 color='grey', alpha=0.2, label='95% 预测区间')

plt.xlabel('X')
plt.ylabel('Y')
plt.title('线性回归:同时显示置信区间与预测区间')
plt.legend()
plt.show()

关键说明

  • prediction_summary_frame中,mean_ci_lower和mean_ci_upper对应95%置信区间的上下限,反映的是回归线整体的估计精度;
  • obs_ci_lower和obs_ci_upper对应95%预测区间的上下限,反映的是单个新观测值的预测范围;
  • 通过调整color和alpha参数,可以让两个区间的层次更清晰,置信区间通常比预测区间更窄。

内容的提问来源于stack exchange,提问作者user25524331

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:41:14