admin 管理员组

文章数量: 887006

项目:线性回归分析商店销售收入

一、摘要

​ 本文主要以商场会计统计的“销售数据”为例,对其进行数据预览与预处理,然后利用线性回归分析的流程与方法,使用Python3软件与SPSS25.0软件分析超市销售收入与各变量之间的关系,并以此份数据为依据使用线性回归建立预测模型,然后利用线性回归相关理论知识,对模型进行优化与检验调整。

​ 分析过程思维导图:

​ 文章最后将指出过程中存在的一些问题与个人思考的优化方式。

​ 附录部分将附上数据集链接与Python部分的代码。

​ 文章分析数据基于kaggle数据网站上的“美国商店销售数据集”,使用的数据分析软件主要为Python 3与SPSS 25.0,参考书籍主要为《应用回归分析(第五版)》———中国人民大学出版社。

二、实例分析与建模预测

1.分析目标:

​ 本文数据分析目标主要有两个。

​ 第一,利用会计统计数据建模预测各变量对Sales(销售收入)的影响;

​ 第二,对比实践几种回归方法,感受线性回归模型的建立优化与检验过程。

2.数据预览:
(1)变量标签:
变量标签
AreaCode商店编号
State商店所在州
Market所在方位
MarketSize规模大小
Profit净利润
*Margin毛利润=Sales-GOGS=Profit+TotalExpenses
Sales销售收入
GOGS销售成本
TotalExpenses销售产品的总费用
Marketing营销费用
Inventory销售时刻的库存价值
BudgetProfit预算净利润
BudgetCOGS预算销售成本
BudgetMargin预算毛利润
BudgetSales预算销售收入
ProductId产品编号
Date日期
ProductType产品类型
Product产品名称
Type产品种类

*注:此处简单介绍毛利润Margin与净利润Profit的区别,毛利润一般指销售收入与销售成本的差额,而净利润则指代销售收入在减去毛利润后,同时减去税费等各种杂费后的额度。

(2)数据预处理:
a.实际意义:

​ 首先ProductId为产品编号,与产品名称效用重合,故删除ProductId。

​ 考虑到Margin=Sales-GOGS=Profit+TotalExpenses的线性关系,删除Margin和Profit。

​ Date变量为日期,对Sales预测缺少实际有效信息,删除。

​ 最后,因为BudgetMargin=BudgetSales-BudgetGOGS的等量关系,同时考虑到我们预测Sales,故删除特征中的BudgetSales(预算销售收入)。

b.检查缺失值:

​ 经检查不存在缺失值。

c.描述性统计:

​ 数值型:

Area CodeSalesCOGSTotal ExpensesMarketingInventoryBudget ProfitBudget COGSBudget Margin
count4248.0000004248.0000004248.0000004248.0000004248.0000004248.0000004248.0000004248.0000004248.000000
mean582.278013192.98752484.43314554.06355931.185028749.38135660.91337174.830508100.819209
std221.140310151.13312767.24976932.35259827.023264661.03189679.54612366.23814592.602725
min203.00000017.0000000.00000010.0000000.000000-3534.000000-320.0000000.000000-210.000000
25%417.000000100.00000043.00000033.00000013.000000432.00000020.00000030.00000050.000000
50%573.000000138.00000060.00000046.00000022.000000619.00000040.00000050.00000070.000000
75%772.000000230.000000100.00000065.00000039.000000910.50000080.00000090.000000130.000000
max985.000000912.000000364.000000190.000000156.0000008252.000000560.000000450.000000690.000000

​ 观察发现,此处库存价值Inventory存在负数,经过网上资料查询,此变量仅在会计人员出现失误时,会被计算为负数,为异常情况,我们假设不存在这样的特殊人为失误,故将Inventory的负数部分全部转换为0.

​ 分类型:

StateMarketMarket SizeProduct TypeProductType
count424842484248424842484248
unique20424132
topUtahWestSmall MarketEspressoColumbianRegular
freq2881344254411764802400
d.查看数据间person相关性与散点图:

在将分类变量重新编码(按字母先后顺序)后,得到相关性矩阵热图如下:

​ 一方面比较各个变量与sales的相关性,我们发现Market、Product Type、Product、Type四个变量与Sales变量相关性较低。另一方面观察各变量间关系,由于中间存在大片绿色部分,所以其他变量间或多或少存在线性相关性,于是可能有多重共线性问题的存在。

​ 散点图:

​ 通过散点图,同样能发现诸多分类变量如Market、Product、Product Type、Type等均相对于Sales分布均匀,没有特别明显的正负相关关系。

e.前进法、后退法与步进法筛选变量:

​ 前进法:

​ 后退法:

​ 步进法:

​ 设置 a e n t r y = 0.05 , a r e m o v a l = 0.1 a_{entry}=0.05,a_{removal}=0.1 aentry​=0.05,aremoval​=0.1,得到变量表:

​ 综合上述三种方法,均选择删除了Budget Profit(预算净利润)与Area Code(地区编号)。

​ 综合上述可视化图像和三种变量筛选方法,并考虑到变量的实际意义,我们删除Area Code、Budget Profit、Product Type。最后本次建模选取的特征有:

变量标签
State商店所在州
Market所在方位
MarketSize规模大小
GOGS销售成本
TotalExpenses销售产品的总费用
Marketing营销费用
Inventory销售时刻的库存价值
BudgetCOGS预算销售成本
BudgetMargin预算毛利润
Product产品名称
Type产品种类
3.建模分析与优化检验:
(1)普通最小二乘法回归:

​ 调整后R方为0.986,说明线性拟合度很高。

​ 方差分析中显著性为0,表明回归方程显著。

​ 普通最小二乘法得到回归方程。

​ 首先考察系数的显著性,在0.05​的置信度下,所有变量的系数均显著

​ 接下来考察与实际经济意义是否符合,其中COGS(销售成本)标准化系数为0.874>0​,而BudgetCOGS(预算销售成本)标准化系数为-0.402<0,两个同性质变量却对Sales影响不同,也就是说,营业人在预算准备投入更多销售成本后,销售收入却会变低,这是违反直觉的。

​ 最后由方差因子分析,存在四个变量的VIF>10。同时由共线性诊断:

条件指标最后为30.732,显然大于10,说明存在较强的多重共线性。

​ 考虑到存在多重共线性与模型的简化,本文使用“岭回归法”和“PCA主成分回归法”尝试减轻多重共线性的影响并对模型作出合适的简化。

(2)多重共线性处理:
a.Ridge岭回归:

​ 利用Python绘制岭迹图:

​ 通过观察岭迹图,我们首先选取岭参数为 exp ⁡ ( 6 ) \exp(6) exp(6),其次观察发现变量Product、Type、State均在0附近,对变量Sales的影响较小,将他们剔除后再次进行岭回归。得到输出结果:

Market : 1.9517236594813392
Market Size : -2.7622294182487788
COGS : 52.202977804203684
Total Expenses : 6.817442648939644
Marketing : 8.86483801142167
Inventory : -3.712837264493617
Budget COGS : 16.429106772703364
Budget Margin : 66.96984433107806
截距:192.70699037254082
均方误差: 1277.4518794910975
y的均值: 199.72647427854454
训练集得分: 0.9541736486545781
验证集得分: 0.9447228813564216

​ 此时模型的拟合能力虽然降低,但调整后R方依然有0.95,线性拟合度依然很高,并且COGS和Budget COGS的系数得到了统一。

b.PCA主成分回归分析:

​ 首先检验是否合适进行PCA降维:

​ 得到显著性为0,说明原数据适合PCA降维。

​ 考察方差解释信息量:

​ 使选取的变量解释85%以上的方差信息量,于是选取前6个变量做线性回归分析:

​ 调整后R方比较于最小二乘法降低,但线性拟合能力依然很高。

​ 系数显著性均为0,与Sales显著相关。结合得分矩阵:

​ 最后利用python计算得到各项标准化系数:

State : 0.0792
Market : 0.0836
MarketSize : -0.3002
COGS : 0.3619
TotalExpenses : 0.3146
Marketing : 0.2956
Inventory : -0.3003
BudgetCOGS : 0.4295
BudgetMargin : 0.7783
Product : 0.0369
Type : -0.0517

​ 此时系数被集中于COGS(销售成本)、BudgetCOGS(预算销售成本)和BudgetMargin(预算毛利润),说明Sales(销售收入)与营业人实际销售过程中的COGS(销售成本)、包括预算准备中的BudgetCOGS(预算销售成本)和BudgetMargin(预算毛利润)在数值上有很大关联。并且此时COGS与BudgetCOGS的系数也均以同时为正,两者系数得到了统一,符合经济实际。

(3)模型自相关性和异方差性检验:
a.自相关性:

​ 在对维数进行合适处理后,这里我们选择PCA主成分分析筛选的6个特征(分别命名为 x 1 , x 2 , x 3 , x 4 , x 5 , x 6 x_1,x_2,x_3,x_4,x_5,x_6 x1​,x2​,x3​,x4​,x5​,x6​),继续考察检验所建立的模型是否有违背线性回归的基本假设,首先我们考察模型是否存在自相关性,查看残差滞后图:

我们可以发现残差间存在显然的正相关性。

​ 同时,使用DW检验残差是否具有自相关性:

DW=0.573,于是 ρ ^ = 1 − D W / 2 = 0.7135 \hat \rho=1-DW/2=0.7135 ρ^​=1−DW/2=0.7135,说明残差间存在高度自相关性。这里首先使用BOX-COX变换来尝试消除自相关性。

​ BOX-COX变换:

​ 利用Python计算得 λ ≈ − 0.12 \lambda \approx -0.12 λ≈−0.12,在SPSS中代入公式 y ( λ ) = y λ − 1 λ y^{(\lambda)}=\frac{y^\lambda-1}{\lambda} y(λ)=λyλ−1​变换得新因变量 y λ y^{\lambda} yλ,对其回归得:

此时的DW值依然不理想,我们查看残差滞后图:

残差间仍然存在较为显著的正相关性。故在本例中,BOX-COX变换并不能有效的消除自相关性,接下来考虑到 ρ ^ \hat \rho ρ^​约为0.7135,与1较为接近,故尝试使用一阶差分法消除自相关性:

​ 一阶差分法:

​ 利用一阶差分法对变量做如下变换:
y c = y t − y t − 1 x i c = x i ( t ) − x i ( t − 1 ) \begin{align} y_c&=y_{t}-y_{t-1} \\ x_{ic}&=x_{i(t)}-x_{i(t-1)} \end{align} yc​xic​​=yt​−yt−1​=xi(t)​−xi(t−1)​​​
利用变换变量回归得残差滞后图:

由残差散点图,我们可以初步判断自相关性得到了消除,下面考察DW值:

此时DW值为2.388,计算可得 ρ ^ ≈ − 0.194 \hat \rho \approx -0.194 ρ^​≈−0.194,可以基本认为自相关性得到了消除,得到系数矩阵:

此时仅有常量的显著性很高,说明常数显著为0,通过得分矩阵计算出此时各变量标准化系数为:

State : -0.0105
Market : -0.0144
MarketSize : -0.1928
COGS : 0.1760
TotalExpenses : 0.1442
Marketing : 0.1375
Inventory : -0.1393
BudgetCOGS : 0.2100
BudgetMargin : 0.3781
Product : 0.0185
Type : -0.0025
b.异方差性:

​ 继续利用消除自相关性后的自变量组( V 1 , V 2 , V 3 , V 4 , V 5 , V 6 V_1,V_2,V_3,V_4,V_5,V_6 V1​,V2​,V3​,V4​,V5​,V6​)来考察模型是否还存在异方差性,计算残差绝对值,并导出6个变量与残差绝对值的spearman相关系数矩阵得:

​ 在0.05的置信度下,发现 x 1 , x 2 , x 4 x_1,x_2,x_4 x1​,x2​,x4​与残差绝对值相关性的显著性p值为0,两者显著相关,故存在异方差性。这里采用加权最小二乘回归方法来尝试消除异方差性。

​ 加权最小二乘回归:

​ 因为 x 1 x_1 x1​与残差绝对值的相关系数最高,故选择 x 1 x_1 x1​构造权函数。得到结果:

权重幂值选为m=0.5,故权函数为:
ω i = 1 x i 0.5 \omega_i=\frac{1}{x_i^{0.5}} ωi​=xi0.5​1​
得到回归方程:

得到调整后R方为0.817,模型线性拟合能力依然较高。

查看回归系数,此时回归系数的标准误都比较低,并且都十分显著,计算其标准化系数得:

State : 0.0043
Market : -0.0269
MarketSize : -0.2454
COGS : 0.1546
TotalExpenses : 0.1161
Marketing : 0.1052
Inventory : -0.2151
BudgetCOGS : 0.1939
BudgetMargin : 0.4175
Product : 0.0447
Type : 0.0724

​ 到此,线性回归分析的建立、优化与检验均已完成,从分析过程中,可以体会到不同方法的不同作用,与部分方法,例如普通最小二乘法、BOX-COX变换等的局限性,再走完线性分析的完整流程后,也可以显然感受到不同回归方法的特点,例如虽然Ridge岭回归法与PCA主成分回归的调整后R方相较于普通最小二乘法的均变低,但两种方法有舍也you得,两种方法的回归系数更加符合实际,更具参考意义。所以我们可以初步认为分析目标二达成,下面我们总结以上分析结果。

4.分析总结:

​ 1.根据标准化系数的关系,我们首先可以总结出各变量对Sales(销售收入)的影响大小。我们按照对Sales的预测影响程度,即系数的绝对值大小,将变量由大到小排序为:BudgetMargin(预算毛利润)、MarketSize(市场大小)、Inventory(库存价值)、BudgetCOGS(预算销售成本)、COGS(销售成本)、TotalExpense(销售总成本)、Marketing(营销费用)、Type(产品种类)、Product(产品名称)、Market(所在方位)、State(所在州)。

​ 2.下面我们逐个分析各变量对Sales的影响:

​ State:由于State变量的系数过低,故其对Sales的影响可以几乎忽略不计。

​ Market:为市场所在方位Central-0,East-1、South-2、West-3,因为其系数为负数,故中部和东部的市场销售收入会略高,而南部和西部的市场销售收入可能会较低。

​ MarketSize:市场大小Major-0、Small-1,因为其系数为负数,故市场越大,销售收入会显著更高。

​ COGS 、TotalExpenses、Marketing 、BudgetCOGS: 均与销售收入正相关,它们都代表营业方在投入更多成本后,能获得更多收入。

​ Inventory:为销售时刻的库存价值,与Sales呈现负相关,说明商品的销售时刻库存价值越低,销售收入越高。

​ BudgetMargin:预算毛利润与销售收入呈现显著正相关,这可能得益于BudgetMargin的会计意义,其数值本身的计算就与销售收入在实际中有较大的正相关关系。

​ Product、Type:两者的系数均与Sales正相关,因Product的字母编码个数较多,本文不再呈现,其按字母顺序排序后,越靠后,在此模型中便越能给Sales带来更高的收益,例如日常类用品中的摩卡咖啡,就拥有比较好的销售收入。

​ 至此,分析目标一基本完成。

三、问题与优化方向

1.分类变量处理

​ 文章分析过程中的首要问题是分类变量的处理,分类变量的处理方式为按字符重新编码,这样编码的方式可能会使得数据的一些信息丢失而没得到充分发挥,使得数据信息的挖掘效果极差,导致本文数据案例分析中,几乎所有分类变量对Sales的计算几乎都是影响极小的,这显然不合常理。针对此问题,主要思考有两个解决方式:

​ (1)对分类变量做聚类分析将其划分为区间后再次进行编码,例如地区相关的State变量,完全可以在对应地图方位的同时,利用K-Means等的聚类方法,对其划分区间,然后再编码以提高此类数据信息的挖掘度。

​ (2)不使用线性回归而尝试使用其他模型预测方法,例如非线性回归、划分Sales后使用分类方法等。

2.权特征中存在负值

​ 此问题主要体现在处理异方差性问题时,选择 x 1 x_1 x1​构造权函数过程中, x 1 x_1 x1​中存在一部分样本为负值,导致在利用极大似然法估计最佳幂数的过程中,使得这部分特征全被舍去,对模型的建立会产生一定影响。针对该问题,可以考虑采用其他方法来消除异方差性,例如BOX-COX变换等,但每个方法的效果都有待具体实验。

3.专业知识不足

​ 在分析过程中,由于作者个人的经济相关知识不足,对其中一些存在方法缺乏专业视角与专业解释,例如对于特征的初步筛选和Inventory(库存价值)的负数部分的处理方式等,是在网上搜寻资料后的个人总结,缺乏专业性。同时,对于例如BudgetMargin与Sales相关关系的理解,本文最后的系数解释也并不专业,缺少相关会计知识,不理解两个变量的内部公式关系。针对该问题,只能要求个人在平时拓宽和加深有关知识的学习了解,当然也可以寻找相关专业的专业人员做咨询了解。

四、附录

1.数据链接:

​ [US Stores Sales | Kaggle]:

2.Python代码:
# In[2]:import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#导入数据
dt=pd.read_csv('C:/Users/86151/Desktop/线性回归/sales.csv')# In[3]:#目标:根据销售数据建模预测Sales(销售收入)
#ProductId为产品编号,与产品名称效用重合,删除ProductId
#考虑到Margin=Sales-GOGS=Profit+TotalExpenses的关系,删除Margin和Profit
#删除日期Date
sales=dt.drop(['ProductId','Margin','Profit','Date','Budget Sales'],axis=1)# In[4]:#查看数据类型
sales.dtypes# In[5]:#检查缺失值
sales.isnull().sum()# In[6]:#数值变量描述性统计
sales.describe()
#观察发现Sales、BudgetSales变量存在较大偏差,0.75分位数和最大值差距过大
#库存Inventory存在负值,不合常理# In[7]:#将Inventory为负的值变为0
sales['Inventory'] = sales['Inventory'].apply(lambda x: x if x >= 0 else 0)
sales.describe()# In[8]:# 分类变量描述统计
sales.describe(include=['object'])# In[9]:#分类变量处理
from sklearn.preprocessing import LabelEncoder
cat_df = sales.select_dtypes(include = ['object'])
for col in cat_df.columns:print(f"{col}: \n{cat_df[col].unique()}\n")#给字符分类变量编码
from sklearn.preprocessing import LabelEncoderobject_cols = [col for col in cat_df.columns]
label_encoder = LabelEncoder()
for col in object_cols:sales[col] = label_encoder.fit_transform(sales[col])
sales.head()# In[10]:#查看数值变量间person相关性#绘制相关性矩阵及热图
import seaborn as sns
from matplotlib import pyplot as pltcorrmat = sales.corr() #相关矩阵提取
top_corr_features = corrmat.indexplt.figure(figsize=(20,20))
g=sns.heatmap(sales[top_corr_features].corr(),annot=True,cmap="RdYlGn")
#我们可以发现变量间或多或少存在线性相关性,于是考虑利用SPSS进行多重共线性检验,经检验存在多重共线性。
sales.to_csv('sales_1.csv',index=0)# In[11]:#绘制各变量与sales的散点图
yz=sales['Sales']
xz=sales.drop(['Sales'],axis=1)
x=np.array(xz).T
plt.rcParams['font.sans-serif']='SimHei' 
plt.rcParams['axes.unicode_minus']=False
#创建画布
fig=plt.figure(figsize=(10,15),dpi=80)
for i in range(len(xz.columns)):fig.add_subplot(5,3,i+1)plt.xlabel(xz.columns[i])plt.scatter(x[i],yz,marker='o')# In[12]:#删除变量
sales=sales.drop(['Area Code','Budget Profit','Product Type'],axis=1)# In[13]:#拆分因变量自变量
y=sales['Sales']
X=sales.drop(['Sales'],axis=1)
#拆分训练集和测试集
from sklearn.model_selection import train_test_split
#设置随机数种子为20
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25,random_state=20)
#将训练集切分为训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X_train,y_train,test_size = 0.25,random_state = 20)# In[14]:#拼接因变量自变量
X_y=pd.concat([X,y],axis=1)
#保存这组变量
X_y.to_csv('sales3.csv',index=0)#标准化
from sklearn.preprocessing import StandardScalerss=StandardScaler()
ss.fit(X_train)
StandardScaler(copy=True,with_mean=True,with_std=True)
X_train_s=ss.transform(X_train)
X_val_s=ss.transform(X_val)
X_test_s=ss.transform(X_test)# In[15]:#导入模型
from sklearn.linear_model import LinearRegression
lr=LinearRegression().fit(X_train_s,y_train)y_pred = lr.predict(X_val_s)
y_pred_train=lr.predict(X_train_s)
#打印系数和截距
for i in range(len(lr.coef_)):print(X_train.columns[i],":",lr.coef_[i])
print(lr.intercept_)#查看均方误差与得分
from sklearn.metrics import mean_squared_error as MSE
mse = MSE(y_pred,y_val)
print('均方误差:',mse)
print('y的均值:',y_val.mean())#得分(即调整后R方)
print('训练集得分:',lr.score(X_train_s,y_train))
print('验证集得分:',lr.score(X_val_s,y_val))# In[18]:#下面我们处理多重共线性:
#法一:岭回归#导入岭回归
from sklearn.linear_model import Ridge
#画岭迹图
def ridge_traj(X_train, y_train, ntest):n = X_train.shape[1]ws = np.zeros((ntest,n))for i in range(ntest):ridge=Ridge(alpha=np.exp(i-10)).fit(X_train_s,y_train)ws[i,:] = ridge.coef_.Treturn ws
# 绘制岭轨迹
ntest=30
ws = ridge_traj(X_train, y_train, ntest)
fig = plt.figure(figsize=(10,10))
ax = fig.add_subplot(111)plt.rcParams['font.sans-serif']='SimHei' #设置字体为SimHei
plt.rcParams['axes.unicode_minus']=False #解决负号“-”显示异常
plt.title('岭迹')
ax.plot([i-10 for i in range(ntest)], ws)
plt.legend(X_train.columns)
plt.xlabel("ln(alpha)")
plt.ylabel("回归系数")
plt.show()
#使用岭回归对数据进行拟合,选取alpha参数为exp(6)
ridge=Ridge(alpha=np.exp(6)).fit(X_train_s,y_train)y_pred = ridge.predict(X_val_s)
#打印系数和截距
for i in range(len(ridge.coef_)):print(X_train.columns[i],":",ridge.coef_[i])
print("截距:",ridge.intercept_)mse = MSE(y_pred,y_val)
print('均方误差:',mse)
print('y的均值:',y_val.mean())#得分(即调整后R方)
print('训练集得分:',ridge.score(X_train_s,y_train))
print('验证集得分:',ridge.score(X_val_s,y_val))# In[17]:#根据岭迹,变量'Type','State','Area Code'振动趋向0,将其剔除
X_ridge_train=pd.DataFrame(X_train_s,columns=sales.drop('Sales',axis=1).columns).drop(['Type','State','Product'],axis=1)
X_ridge_val=pd.DataFrame(X_val_s,columns=sales.drop('Sales',axis=1).columns).drop(['Type','State','Product'],axis=1)
#再次岭回归:#使用岭回归对数据进行拟合,alpha参数为exp(6)
ridge=Ridge(alpha=np.exp(6)).fit(X_ridge_train,y_train)y_pred = ridge.predict(X_ridge_val)
#打印系数和截距
for i in range(len(ridge.coef_)):print(X_ridge_train.columns[i],":",ridge.coef_[i])
print(ridge.intercept_)mse = MSE(y_pred,y_val)
print('均方误差:',mse)
print('y的均值:',y_val.mean())#得分(即调整后R方)
print('训练集得分:',ridge.score(X_ridge_train,y_train))
print('验证集得分:',ridge.score(X_ridge_val,y_val))#主成分系数还原
# In[1]:import pandas as pd
import numpy as np
dt=pd.read_csv('C:/Users/86151/Desktop/线性回归/PCAscore.csv')# In[2]:coef=np.array(dt['coef'])
coef# In[3]:X=dt.drop(['coef'],axis=1)# In[4]:score=np.array(X)# In[5]:n,m=np.shape(score)# In[6]:c=np.zeros(m)
c# In[7]:for i in range(m):for j in range(n):c[i]=c[i]+score[j,i]*coef[j]
for i in range(len(c)):print(X.columns[i],":",'{:.4f}'.format(c[i]))# In[1]:import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#导入数据
dt=pd.read_excel('C:/Users/86151/Desktop/线性回归/PCA.xls')# In[2]:X=dt.drop(['Sales'],axis=1)
y=dt['Sales']# In[3]:#BOX-COX
from scipy.stats import boxcox 
y_lambda, lambda0 = boxcox(y, lmbda=None, alpha=None)
lambda0# In[4]:from sklearn.linear_model import LinearRegression
lr=LinearRegression().fit(X,y)
lr_lambda=LinearRegression().fit(X,y)# In[5]:y_pred=lr.predict(X)
y_pred_lambda=lr_lambda.predict(X)
resid=y-y_pred
resid_lambda=y_lambda-y_pred_lambda# In[6]:resid_lambda=pd.DataFrame(resid_lambda)# In[7]:#自相关分析部分:
from pandas.plotting import lag_plot
lag_plot(resid, lag=1)
plt.show()
lag_plot(resid_lambda,lag=1)
plt.show()# In[8]:#计算差分
#y
y_c=np.zeros(len(y)-1)
for i in range(len(y_c)):y_c[i]=y[i+1]-y[i]
#X
n,m=np.shape(X)
x_c=np.zeros([n-1,m])
X_c=np.array(X)
for j in range(m):for i in range(n-1):x_c[i,j]=X_c[i+1,j]-X_c[i,j]#差分模型预测
lr_c=LinearRegression().fit(x_c,y_c)
y_pred_c=lr_c.predict(x_c)
resid_c=y_c-y_pred_c
resid_c=pd.DataFrame(resid_c)
lag_plot(resid_c, lag=1)
plt.show()from statsmodels.stats.stattools import durbin_watson
print(f'D-W检验值为{durbin_watson(resid_c)}')# In[9]:y_c=y_c[:,np.newaxis]
X_y_c=pd.DataFrame(np.concatenate((x_c, y_c),axis=1))
X_y_c.to_csv("X_y_c.csv",index=0)

本文标签: 项目线性回归分析商店销售收入