Python 线性回归与相关系数:相关都是一,为什么斜率相差十倍
一个指标与另一个指标完全沿直线变化,相关系数等于一;把纵轴单位放大十倍后,相关系数仍是一,但回归斜率却变成十倍。若把这两个结果都叫作“相关程度”,报表就容易把单位变化误读成关系变强。Python标准库可以用很短的程序,把方向与紧密程度、单位增量及截距假设分别算清楚。
本文在Linux、Python 3.12.14中使用固定样本实跑。官方文档核验于2026年10月3日;在线文档显示的补丁版本可能不同于这里记录的实际解释器。程序不访问真实业务数据,也不连接远程服务。
AI模型生成的原创概念图:抽象对照上升趋势、不同斜率和是否穿过原点;图中点位不是本例数据的定量绘图;用于解释程序模型,不是软件截图、测试截图或实拍照片,精确行为以程序和实际输出为准。
完整程序与实际输出
将下面程序保存为tech16.py,执行python tech16.py。预期出现的异常已在例子里处理;退出码为零才表示本次演示正常完成。
from statistics import correlation, linear_regression, StatisticsError
x = [1, 2, 3, 4]
y = [5, 8, 11, 14]
y_scaled = [value * 10 for value in y]
for label, values in (("original", y), ("scaled", y_scaled)):
slope, intercept = linear_regression(x, values)
print(label, f"r={correlation(x, values):.6f}",
f"slope={slope:.6f}", f"intercept={intercept:.6f}")
slope, intercept = linear_regression(x, y, proportional=True)
print("through_zero", f"slope={slope:.6f}", f"intercept={intercept:.6f}")
print("at_zero", f"ordinary={linear_regression(x, y).intercept:.6f}",
f"proportional={intercept:.6f}")
try:
correlation([1, 1, 1], [2, 3, 4])
except StatisticsError as error:
print("constant_x=", type(error).__name__)本次实际标准输出:
original r=1.000000 slope=3.000000 intercept=2.000000 scaled r=1.000000 slope=30.000000 intercept=20.000000 through_zero slope=3.666667 intercept=0.000000 at_zero ordinary=2.000000 proportional=0.000000 constant_x= StatisticsError
先用一条能手算的直线校验结果
输入x为1、2、3、4,对应y为5、8、11、14。每当x增加一,y就增加三;把这条关系向零处延长,y应为二,所以普通回归得到斜率三、截距二。程序同时算出相关系数一,表示这个固定样本的线性关系完全沿同一正方向展开。先选可手算的数据,有助于排除字段对错或单位混用。
第二组把每个y乘十,变成50、80、110、140。点的先后关系没有改变,偏离直线的程度也没有增加,但单位增量从三变成三十,截距从二变成二十。实际输出正好显示r保持1.000000而slope变为30.000000。因此跨图比较斜率之前,必须先确认两条轴的单位和缩放方式一致。
相关系数回答的不是每增加一单位会怎样
相关系数适合描述两列数值线性关系的方向与强弱,本身没有原始业务单位;回归斜率则带有“纵轴单位除以横轴单位”的解释。把温度单位、金额单位或测量尺度改掉,可能改变斜率,却不一定改变线性相关程度。报告里应该分别写出指标名与单位,不要只保留一个未经解释的数字。
即使本例相关系数恰好为一,也不能从这四组人为设置的数字推出任何因果结论。实际数据还需要检查抽样方式、共同驱动因素、异常值和时间顺序。相关结果是对输入样本的描述,不会自动证明一个变量的变化导致另一个变量变化,也不会给出未来预测必然准确的保证。
强制经过原点会改变拟合问题本身
proportional=True把截距固定为零。本次斜率因此从三变为约3.666667,并非普通结果只把二改成零那么简单。为了在必须穿过原点的限制下减小总体残差,斜率会重新调整。两种拟合解答的是两个不同约束问题,不能把强制过原点当成仅影响显示的格式选项。
从样本可以直接算出比例模型的斜率:各组x乘y之和为110,x平方之和为30,商为11/3。普通模型在x为零时预测二,比例模型则预测零。例子把这两个零点预测并列打印,帮助读者看到开关添加的实质假设;选择哪个模型应根据测量机制与数据背景,而不是哪个数字看起来更整齐。
输入检查与误差检查应当一起做
最后用常量x测试相关函数,捕获StatisticsError。所有横坐标都一样时,无法按普通方式描述两列的线性共同变化,不能把失败随意替换成相关系数零。零意味着某种计算得到的线性关系结果,而输入退化意味着该计算没有满足前提;报表上应该保留这种区别。
真实数据先确认成对记录没有错位、两列长度一致、样本数量足够,且缺失值与非有限值有明确处理政策。拟合完成后再查看残差,而不是只看相关系数。示例输出统一保留六位小数只是展示规则,内部计算仍是浮点值;验证接近结果时应使用适当容差。若业务需要区间估计、稳健回归或复杂诊断,应采用对应统计流程,不能让一个标准库函数承担全部分析责任。
验证记录与参考资料
本次完整程序退出码为0,标准错误为空。六位小数只是展示规则;这些人为样本验证计算与约束差异,不提供因果解释或未来预测保证。


