欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

小红书销售额预测模型-线性回归

程序员文章站 2022-05-16 22:37:59
...

数据:
数据链接
提取码: j4cd
仅作为自己学习数据分析的过程记录

1.指标解释

revenue :用户的下单购买金额
3rd_party_stores: 用户过往在app中从第三方商家购买的数量,0表示购买的自营产品
gender:男1 女0 空缺unkown
age :年龄 空缺unkown
engaged_last_30:最近30天在app上有参与重点活动
lifecycle :生命周期A:注册6个月内
B:一年内
C:两年内
days_since_last_order 最近一次下单距今的天数(小于1表示当天有下单)
previous_order_amount 累计的用户购买金额

2.数据概述

2.1 前期准备工作——导入数据和相关包

import pandas as pd #导入pandas
import numpy as np  
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
from statsmodels.formula.api import ols #导入经典线性模型包
from sklearn.linear_model import LinearRegression
#导入文件
red=pd.read_csv('week2.redbook.csv')

2.2 数据描述

red.info()

小红书销售额预测模型-线性回归
结果显示共有29452行数据,其中gender、age、engaged_last_30三列有缺失值,需要对其进行数据处理
或者用下列代码统计缺失值个数

red.isnull().sum()

小红书销售额预测模型-线性回归
离散程度描述

red.describe()

小红书销售额预测模型-线性回归 性别一列竟然有75%的消费用户是男性,age一列中年龄最大的有99
2.3 缺失值处理
对于连续变量,可以用均值、中位数或者根据其他数据模型填充;
对于类别变量,则可以把变量拆解为哑变量,再删除重复或没有意义的变量
将age选择按中位数填充
将性别的缺失值先标记为unknown,再变为哑变量
将engaged缺失值替换为unknown,再变为哑变量

red['age']=red['age'].fillna(red['age'].median())#将age的缺失值用中位数填充
red['gender']=red['gender'].fillna('Unknown')#用unknown填充性别缺失值
red['engaged_last_30']=red['engaged_last_30'].fillna('unknown')
red1=pd.get_dummies(red)#生成哑变量,python会将类别变量转换为哑变量
red1.head()#查看前五行

小红书销售额预测模型-线性回归

3.数据可视化

sns.lineplot(x='age',y='revenue',data=red)

小红书销售额预测模型-线性回归
可以看到在销售额在20~30岁之间最高,30岁以后销售额变得平稳一些。

sns.regplot('previous_order_amount','revenue',red)#线性关系可视化
sns.regplot('age','revenue',red)#年龄与销售额的线性关系

小红书销售额预测模型-线性回归小红书销售额预测模型-线性回归
从上图看年龄、累计金额似乎不存在线性关系,但是仔细观察发现有些销售额太高导致关系无法显示,对销售额分区间看看销售额主要集中在哪。

#将销售额分区间
bins=[0,100,1000,1200,1500,2000,5000,10000,20000,30000]
red1['revenue_level']=pd.cut(red1.revenue,bins,right=False)
red1.groupby('revenue_level').revenue.describe()

小红书销售额预测模型-线性回归从数据结果上看,消费额在5000以上的数据就很少了,筛选出销售额在5000以下的数据,再次做出图形。此时可以看到累计销售额与最近一次销售额之间存在正相关关系。

小红书销售额预测模型-线性回归

4.模型构建

4.1 变量间相关关系

red1.corr()[['revenue']].sort_values('revenue',ascending=False)#只选择revenue一列与其他变量的相关关系,并且降序排列

小红书销售额预测模型-线性回归
各变量与销售额的相关系都比较弱,相关关系最强的是previous_order_amount,其他变量与销售额几乎不存在相关性,选取前两个变量做热力图

q=['revenue','previous_order_amount','engaged_last_30_1.0']
sns.heatmap(red1[q].corr())

小红书销售额预测模型-线性回归4.2一元线性回归
只选择累计销售额作为自变量,因变量为销售额
第一种方法

from sklearn.linear_model import LinearRegression
model=LinearRegression()
y=red2['revenue']
x=red2[['previous_order_amount']]
model.fit(x,y)#模型拟合
model.coef_#查看系数估计值

array([0.04417161])

model.intercept_#查看截距项

274.03151661580154

#模型评分
score=model1.score(x,y)
#计算y的预测值
predictions=model.predict(x)
#计算误差
error=predictions-y
#计算rmse(均方误差)
rmse=(error**2).mean()**0.5
#计算mae(平均绝对误差)
mae=abs(error).mean()
print(rmse)
print(mae)

487.72743388034957
329.7626459083234
第二种方法

from statsmodels.formula.api import ols#可得到标准线性回归结果
model=ols('y~x',red2).fit()
print(model.summary())

小红书销售额预测模型-线性回归p值都显著,但是R方只有0.044,说明该模型只能解释4.4%的销售额变化,模型拟合效果不佳,考虑增加多个变量
4.3 多元线性回归

y=red2['revenue']
x=red2[['previous_order_amount','engaged_last_30_1.0','gender_Unknown']]
model1=ols('y~x',red2).fit()
print(model1.summary())

小红书销售额预测模型-线性回归R方提升到0.046,但依然很小,但是误差减小了很多
125.40455810995363
101.91106384530995

from sklearn.linear_model import LinearRegression
model=LinearRegression()
y=red3['revenue']
x=red3[['previous_order_amount','engaged_last_30_1.0','gender_Unknown']]
model.fit(x,y)
#模型评分
score=model.score(x,y)
#计算y的预测值
predictions=model.predict(x)
#计算误差
error=predictions-y
#计算rmse
rmse=(error**2).mean()**0.5
#计算mae
mae=abs(error).mean()
print(rmse)
print(mae)

还可考虑用AIC、BIC准则选择出最佳模型。

相关标签: 数据分析 python