一、相关关系
相关关系是客观现象存在的一种非确定的相互依存关系,即自变量的每一个取值,因变量由于受随机因素影响,与其所对应的数值是非确定性的。相关分析中的自变量和因变量没有严格的区别,可以互换。
01 相关分析
相关系数计算公式:
ρ
=
Σ
(
X
i
−
X
ˉ
)
(
Y
i
−
Y
ˉ
)
Σ
(
X
i
−
X
ˉ
)
2
(
Y
i
−
Y
ˉ
)
2
\rho = \frac{\Sigma(X_i-\bar X)(Y_i-\bar Y)}{\sqrt{\Sigma(X_i-\bar X)^2(Y_i-\bar Y)^2}}
ρ=Σ(Xi−Xˉ)2(Yi−Yˉ)2Σ(Xi−Xˉ)(Yi−Yˉ)
其中:
∣
ρ
∣
≥
0.8
,
高
度
相
关
0.5
≤
∣
ρ
∣
<
0.8
,
中
度
相
关
0.3
≤
∣
ρ
∣
<
0.5
,
弱
相
关
∣
ρ
∣
<
0.3
,
几
乎
不
相
关
|\rho|\geq 0.8 ,高度相关\\ 0.5\leq|\rho|<0.8,中度相关\\ 0.3\leq|\rho|<0.5,弱相关\\ |\rho|<0.3,几乎不相关
∣ρ∣≥0.8,高度相关0.5≤∣ρ∣<0.8,中度相关0.3≤∣ρ∣<0.5,弱相关∣ρ∣<0.3,几乎不相关
注意:不相关的意思是不存在线性关系!
相关系数代码实现:
income = pd.read_csv(r'Salary_Data.csv', engine='python')
income.Salary.corr(income.YearExperience)
获得Salary与YearExperience之间的相关系数。
Profit.drop('State', axis=1).corrwith(Profit['Profit'])
去除Profit数据集中的State分类型变量,然后获取Profit变量与其他变量之间的相关系数。
二、一元线性回归模型
01 简介
一元线性回归分析预测法,是根据自变量x和因变量Y的相关关系,建立x与Y的线性回归方程进行预测的方法。由于市场现象一般是受多种因素的影响,而并不是仅仅受一个因素的影响。所以应用一元线性回归分析预测法,必须对影响市场现象的多种因素做全面分析。只有当诸多的影响因素中,确实存在一个对因变量影响作用明显高于其他因素的变量,才能将它作为自变量,应用一元相关回归分析市场预测法进行预测 。
一元线性回归分析法的预测模型为:
Y
t
=
a
x
t
+
b
Y_t = ax_t+b
Yt=axt+b
式中,x**t代表t期自变量的值;
Y t Y_t Yt代表t期因变量的值;
a、b代表一元线性回归方程的参数。
a、b参数由下列公式求得(用代表):
b = Σ Y i n − a Σ x i n ; b=\frac{\Sigma Y_i}{n}-a\frac{\Sigma x_i}{n}; b=nΣYi−anΣxi;
a = n Σ x i Y i − Σ x i Σ Y i n Σ x i 2 − ( Σ x i ) 2 a=\frac{n\Sigma x_iY_i-\Sigma x_i\Sigma Y_i}{n\Sigma x_i^2-(\Sigma x_i)^2} a=nΣxi2−(Σxi)2nΣxiYi−ΣxiΣYi
02 代码实现
导入第三方库:import statsmodel.api as sm
sm.ols(formula, data, subset=None, drop_cols=None)
- formula:以字符串的形式指定线性回归模型的公式,如’y~x’就表示简单线性回归模型
- data:指定建模的数据集
- subset:通过bool类型的数组对象,获取data的子集用于建模
- drop_cols:指定需要从data中删除的变量
import pandas as pd
import statsmodels.api as sm
income = pd.read_csv(r'Salary_Data.csv', engine='python')
# 利用收入数据集,构建回归函数
fit = sm.formula.ols('Salary ~ YearsExperience', data = income).fit()
# 返回模型的参数值
fit.params
得到结果:
Intercept 25792.200199
YearsExperience 9449.962321
dtype: float64
即结果为:Salary = 25792.200199 + 9449.962321YearsExperience
三、多元线性回归模型
对于一元线性回归来说,其反映的是单个自变量对因变量的影响,而当自变量不只一个时,则需要将一元线性回归模型扩展到多元线性回归模型。
y
=
{
y
1
y
2
⋮
y
n
,
X
=
{
x
11
x
12
⋯
x
1
p
x
21
x
22
⋯
x
2
p
⋮
x
n
1
x
n
2
⋯
x
n
p
y=\begin{cases}y_1\\y_2\\\vdots\\y_n\end{cases},\,X=\begin{cases}x_{11}\,\,x_{12}\,\,\cdots\,\,x_{1p}\\x_{21}\,\,x_{22}\,\,\cdots\,\,x_{2p}\\\,\,\,\vdots\\x_{n1}\,\,x_{n2}\,\,\cdots\,\,x_{np}\end{cases}
y=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧y1y2⋮yn,X=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x11x12⋯x1px21x22⋯x2p⋮xn1xn2⋯xnp
其中,
x
i
j
x_{ij}
xij表示第i行第j列的变量值,多元线性回归模型即为因变量y 与自变量X的线性组合,即:
y
=
β
0
+
β
1
x
1
+
β
2
x
2
+
⋯
+
β
p
x
p
+
ϵ
y\,=\,\beta_0+\beta_1x_1+\beta_2x_2+\cdots+\beta_px_p+\epsilon
y=β0+β1x1+β2x2+⋯+βpxp+ϵ
化为矩阵形式即为:
y
=
X
β
+
ϵ
y\,=\,X\beta\,+\,\epsilon
y=Xβ+ϵ
01 模型参数求解
构造目标函数:
J
(
β
)
=
Σ
ϵ
2
=
Σ
(
y
−
X
β
)
2
J(\beta)=\Sigma\epsilon^2=\Sigma(y-X\beta)^2
J(β)=Σϵ2=Σ(y−Xβ)2
展开平方项:
J
(
β
)
=
(
y
−
X
β
)
′
(
y
−
X
β
)
=
(
y
y
′
−
y
′
X
β
−
β
′
X
′
y
+
β
′
X
′
X
β
)
J(\beta)=(y-X\beta)'(y-X\beta)=(yy'-y'X\beta-\beta'X'y+\beta 'X'X\beta)
J(β)=(y−Xβ)′(y−Xβ)=(yy′−y′Xβ−β′X′y+β′X′Xβ)
求偏导:
∂
J
(
β
)
∂
β
=
(
0
−
X
′
y
−
X
′
y
+
2
X
X
′
β
)
=
0
\frac{\partial\,J(\beta)}{\partial\beta}=(0-X'y-X'y+2XX'\beta)=0
∂β∂J(β)=(0−X′y−X′y+2XX′β)=0
计算偏回归系数:
β
=
(
X
′
X
)
−
1
X
′
y
\beta=(X'X)^{-1}X'y
β=(X′X)−1X′y
02 代码实现
# 多元线性回归模型的预测
from sklearn import model_selection
# 导入数据
Profit = pd.read_excel(r'Predict to Profit.xlsx')
# 将数据区分为训练集和测试集
train,test = model_selection.train_test_split(Profit, test_size = 0.2, random_state = 1234)
# 根据train数据集建模
model = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+C(State)', data = train).fit()
print('模型的偏回归系数分别为:\n', model.params)
# 删除test数据集中的Profit变量,用剩下的自变量进行预测
test_X = test.drop(labels = 'Profit', axis = 1)
pred = model.predict(exog = test_X)
print('对比预测值与实际值的差异:\n', pd.DataFrame({'Prediction':pred,'Real':test.Profit}))
结果为:
模型的偏回归系数分别为:
Intercept 58581.516503
C(State)[T.Florida] 927.394424
C(State)[T.New York] -513.468310
RD_Spend 0.803487
Administration -0.057792
Marketing_Spend 0.013779
dtype: float64
对比预测值与实际值的差异:
Prediction Real
8 150621.345801 152211.77
48 55513.218079 35673.41
14 150369.022458 132602.65
42 74057.015562 71498.49
29 103413.378282 101004.64
44 67844.850378 65200.33
4 173454.059691 166187.94
31 99580.888894 97483.56
13 128147.138396 134307.35
18 130693.433835 124266.90
注意:State为离散分类型变量,需要前加C。对于分类变量,由于其不是数值无法直接计算,需要:
如果分类变量只有两个水平(例如性别,男和女),我们只需要定义一个虚拟变量就可以了,用0表示男,用1表示女。当一个分类变量超过两个水平时,我们必须在定义虚拟变量和解释虚拟变量两方面谨慎从事。重点是要牢记:在多元回归分析中,如果一个分类变量有k个水平,那么需要在多元回归分析中定义k-1个虚拟变量。
当然,在分类变量多于两个水平时,也可以人为的丢弃,如下:
# 生成由State变量衍生出的哑变量
dummies = pd.get_dummies(Profit.State)
# 将哑变量与原始数据集水平合并
Profit_New = pd.concat([Profit,dummies], axis = 1)
# 删除State和Califonia变量(因为State变量已经被分解为哑变量,New York变量需要作为参照组)
Profit_New.drop(labels = ['State','New York'], axis = 1, inplace = True)
# 拆分数据集Profit_New
train,test = model_selection.train_test_split(Profit_New, test_size = 0.2, random_state = 1234)
# 建模
model2 = sm.formula.ols('Profit~RD_Spend+Administration+Marketing_Spend+Florida+California', data=train).fit()
print("模型的偏回归系数分别为:\n", model2.params)
结果为:
模型的偏回归系数分别为:
Intercept 58068.048193
RD_Spend 0.803487
Administration -0.057792
Marketing_Spend 0.013779
Florida 1440.862734
California 513.468310
dtype: float64
Profit = 0.803487RD_Spend - 0.057792Administration + 0.013779Marketing_Spend + 1140.862734Florida + 513.468310Califonia