数据分析 | 多元线性回归

一、相关关系

相关关系是客观现象存在的一种非确定的相互依存关系,即自变量的每一个取值,因变量由于受随机因素影响,与其所对应的数值是非确定性的。相关分析中的自变量和因变量没有严格的区别,可以互换。

img

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}} ρ=Σ(XiXˉ)2(YiYˉ)2 Σ(XiXˉ)(YiYˉ)
其中:
∣ ρ ∣ ≥ 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.80.5ρ<0.80.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ΣYianΣ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=y1y2yn,X=x11x12x1px21x22x2pxn1xn2xnp
其中, 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=Σ(yXβ)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(β)=(yXβ)(yXβ)=(yyyXββXy+βXXβ)
求偏导:
∂   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(β)=(0XyXy+2XXβ)=0
计算偏回归系数:
β = ( X ′ X ) − 1 X ′ y \beta=(X'X)^{-1}X'y β=(XX)1Xy

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

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ouroboroszzs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值