小红书销售额预测模型-线性回归
数据:
数据链接
提取码: 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准则选择出最佳模型。