Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

附录:一元线性回归的简单应用

某公司计划研究销售人员数量对于新产品销售额的影响。

从其下属多家公司中随机抽取10个子公司,这10个子公司当你新产品销售额和销售人员数量统计数据在路径"数据/销售人员和销售量.csv"。

请试用一元线性回归方法研究人员数量对新产品销售额的计量关系。

import pandas as pd
data = pd.read_csv("datasets/销售人员和销售量.csv")
data
Loading...

1. 对变量作相关性分析

这里使用相关系数作相关分析,调用scipy.stats.pearsonr皮尔逊相关系数计算方法:

相关系数r检验y和x两个变量之间的线性相关的显著程度,其算式为

r=(xixˉ)(yiyˉ)(xixˉ)2(yiyˉ)r = \frac{\sum{(x_i-\bar{x})(y_i-\bar{y})}}{\sqrt{\sum{(x_i-\bar{x})^2\sum{(y_i-\bar{y})}}}}

数学上可以证明:r在[-1, 1]范围,有:

  • r>0时,y与x有一定的正线性相关,越接近1正的相关性越大

  • r<0时,y与x有一定的负线性相关,越接近-1负的相关性越大

import scipy.stats as stats
x = data["销售人员数量/人"]
y = data["新产品销售额/万元"]
r = stats.pearsonr(x, y)[0]
r
0.969906207108702

观察相关系数的值为0.97,说明两者的存在很强的正相关关系,我们下面使用回归分析来计量两者的统计关系。

2. 使用statsmodels作一元线性回归

import statsmodels.api as sm
data['Intercept'] = 1.
y = data["新产品销售额/万元"]
x = data[['Intercept', "销售人员数量/人"]]
model = sm.OLS(y, x)
result = model.fit()
result.summary2(alpha=0.05)
/Users/hans/opt/anaconda3/lib/python3.9/site-packages/scipy/stats/stats.py:1541: UserWarning: kurtosistest only valid for n>=20 ... continuing anyway, n=10
  warnings.warn("kurtosistest only valid for n>=20 ... continuing "
Loading...
print("斜率: %.2f" %12.23)
print("截距: %.2f" %176.30)
print("拟合优度R-squared: %.2f" % 0.958)
print("斜率估计量的标准误差: %.2f" % 1.086)
print("截距估计量的标准误差: %.2f" % 27.327)
斜率: 12.23
截距: 176.30
拟合优度R-squared: 0.96
斜率估计量的标准误差: 1.09
截距估计量的标准误差: 27.33

模型的回归方程是

新产品销售额/万元=12.23×销售人员数量/+176.3新产品销售额/万元 = 12.23 \times 销售人员数量/人 + 176.3

根据方程能够得到以下结论:销售人员数量每增加1人,平均会带来12.23万元新产品销售额的增加。

3. 绘制回归图

x = data["销售人员数量/人"]
y = data["新产品销售额/万元"]

import matplotlib.pyplot as plt
plt.figure(figsize=(6,3))
plt.scatter(x, y, label='original data')
plt.plot(x,  12.23*x+176.3, label='fitted line', color='orange')
plt.title('Simple Regression')
plt.legend()
plt.show()
<Figure size 600x300 with 1 Axes>