小红书营销渠道效果预测分析(Python线性回归)小红书营销渠道效果预测分析(Python线性回归)

分析背景

说到小红书,是目前非常热门的电商平台,和其他电商平台不同,小红书是从社区起家。在小红书社区,用户通过文字、图片、视频笔记的分享,记录了这个时代年轻人的正能量和美好生活。

小红书通过机器学习对海量信息和人进行精准、高效匹配,已累积海量的海外购物数据,分析出最受欢迎的商品及全球购物趋势,并在此基础上把全世界的好东西,以最短的路径、最简洁的方式提供给用户。

本项目协助小红书分析不同的业务决策所带来的销售额变化。

分析目标

根据用户数据以及消费行为数据

  • 使用Python建立线性回归模型
  • 预测用户的消费金额变化
  • 找到对用户消费影响较大的因素

分析流程

数据概况分析(数据行列数量,缺失值分布,数据清洗)– 单变量分析(数字型变量的描述指标、类别型变量(多少分类,各自占比))– 相关和可视化(按类别交叉对比,变量之间的相关性分析,散点图/热力图)– 回归模型(模型建立、模型评估和优化)

一、数据概况分析

1.1 数据概览

先导入数据:

#导入数据
#调包
import pandas as pd
import numpy as np
# 读取数据
xhs=pd.read_csv(r'c:\\Users\\LENOVO\\Desktop\\项目数据\\小红书数据.csv')
xhs.info()

gender\\age\\engaged_last_30 存在空值

gender、engaged_last_30数据类型错误:应该为object类型

数据共29452行

xhs.head()

数据共8列

数据字典如下:

xhs.describe()

可以看出revenue和previous_order_amount的标准差都较大,数据或许有离群值

1.2 数据清洗

# 统计数据空值
xhs.isnull().sum()

#缺失情况
xhs.isna().sum()/xhs.shape[0]

缺失值占比约为40%,不能直接删除缺失值,否则会损失非常多的数据

1.2.1 类别型变量缺失值处理

#gender(类别型变量)
#先把缺失值填充为unknown
xhs['gender']=xhs['gender'].fillna('unknown')
#engaged_last_30(是否参加重要活动)(类别型变量)
#把缺失值填充为unknown
xhs['engaged_last_30']=xhs['engaged_last_30'].fillna('unknown')
xhs.info()

gender和engaged_last_30已变成object类型

1.2.2 数字变量缺失值处理

#处理数字变量缺失值age——均值填补
xhs=xhs.fillna(xhs.mean())#所有空值均值填充
xhs.describe()

均值填充完毕

1.2.3 数字变量离群值处理

离群值:一般地,我们认定超过75%分位数的1.5倍的四分位差的数值为离群值

#revenue离群值计算
diff=xhs.revenue.describe()['75%']-xhs.revenue.describe()['25%']
new_max=xhs.revenue.describe()['75%']+1.5*diff
#previous_order_amount离群值计算
diff1=xhs.previous_order_amount.describe()['75%']-xhs.previous_order_amount.describe()['25%']
new_max1=xhs.previous_order_amount.describe()['75%']+1.5*diff1

revenue离群值:(>=输出的数据)

previous_order_amount离群值:(>=输出的数据)

要去除的离群值行占所有数据行的比例约为13%,较为合理:

(xhs.shape[0]-xhs[np.logical_and(xhs['previous_order_amount']<6286,xhs['revenue']<=1135)].shape[0])/xhs.shape[0]

去除离群值:

xhs=xhs[np.logical_and(xhs['previous_order_amount']<6286,xhs['revenue']<=1135)]
xhs.describe()

二、单变量分析

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

2.1 数字型变量

2.1.1 用户下单金额revenue

sns.distplot(xhs['revenue'])

集中分布在0-200之间

2.1.2 用户以往累积购买金额previous_order_amount

sns.distplot(xhs['previous_order_amount'])

用户以往累积金额为0-100的频数较高

2.1.3 年龄age

sns.distplot(xhs['age'])

xhs['age'].value_counts()

  • 用户年龄分布在14-45岁之间,用户年龄平均值为29.4岁,用户年龄中位数为29.4岁,用户年龄在平均值两侧呈对称分布
  • 绝大部分用户年龄集中在27-32岁之间
  • 10380个用户的年龄为29.419286 岁,29岁或是小红书的默认年龄选项

2.1.4 用户最近一次下单距今的天数days_since_last_order

#查看xhs的列名
xhs.columns

发现'days_since_last_order'前后各有一个空格

#修改列名
xhs.rename(columns={' days_since_last_order ':'days_since_last_order'},inplace=True)
sns.distplot(xhs['days_since_last_order'])

  • 用户最近一次下单距今的天数分布在0-23.7天之间,可见所有的用户在本月内都有下单行为
  • 用户最近一次下单后平均7.7天后会再次下单
  • 用户最近一次下单距今0-1天的频数较高

2.2 类别型变量

2.2.1 生命周期lifecycle

不同生命周期(lifecycle)对应的revenue(销售额)是怎样的

生命周期,分类为A,B,C(分别对应注册后6个月内,1年内,2年内)

xhs.groupby(['lifecycle'])['revenue'].describe()

#不同生命周期计数
xhs['lifecycle'].value_counts(dropna=False).plot(kind='bar')

#不同生命周期的销售额平均值
sns.barplot(x='lifecycle',y='revenue',data=xhs,order=['C','B','A'])

#不同生命周期的销售额总和
sns.barplot(x='lifecycle',y='revenue',data=xhs,order=['C','B','A'],estimator=sum)

  • C(注册后两年)的用户最多
  • C(注册后两年内的)用户销售额平均值最高,为267.5;其次是B(注册后一年内的)用户,销售额平均值为253.7;销售额平均值最低的是A(注册后6个月内的)用户,销售额平均值为245.5.
  • 总销售额大部分由C(注册后两年)的用户创造

2.2.2 性别gender

不同性别(gender)对应的revenue(销售额)是怎样的

xhs.groupby(['gender'])['revenue'].describe()

#不同性别计数
xhs['gender'].value_counts(dropna=False).plot(kind='bar')

#不同性别的销售额平均值
sns.barplot(x='gender',y='revenue',data=xhs)

#不同性别的销售额总和
sns.barplot(x='gender',y='revenue',data=xhs,estimator=sum)

  • 女性顾客远远超过男性顾客数量
  • 女性顾客的销售额平均值和男性顾客的消费额平均值相差不大
  • 总销售额大部分由女性顾客贡献

2.2.3 最近30天在APP上参与重要活动engaged_last_30

最近30天在APP上参与重要活动与否对应的销售额是怎样的

xhs.groupby(['engaged_last_30'])['revenue'].describe()

#计数
xhs['engaged_last_30'].value_counts(dropna=False).plot(kind='bar')

#最近30天在APP上参与重要活动与否对应的销售额平均值
sns.barplot(x='engaged_last_30',y='revenue',data=xhs)

#最近30天在APP上参与重要活动与否对应的销售额总和
sns.barplot(x='engaged_last_30',y='revenue',data=xhs,estimator=sum)

  • 大部分用户30天内未在APP上参加活动
  • 最近30天在APP上参与了活动的用户的销售额平均值更大,为320.3,未参加活动的用户的销售额平均值为252元。
  • 总销售额的大部分由30天内未在APP上参加活动的用户创造

2.2.4 用户过往在第三方APP购买的数量

xhs['3rd_party_stores'].describe()

#用户过往在第三方APP购买的数量计数
xhs['3rd_party_stores'].value_counts().plot(kind='bar')

#用户过往在第三方APP购买的数量对应的销售额平均值
sns.barplot(x='3rd_party_stores',y='revenue',data=xhs)

#用户过往在第三方APP购买的数量对应的销售额总和
sns.barplot(x='3rd_party_stores',y='revenue',data=xhs,estimator=sum)

  • 从未在第三方APP购买过的顾客最多,其次是在第三方APP购买过10次的顾客
  • 从未在第三方APP购买过的顾客的平均销售额最多;在第三方APP进行了1-5次购买的顾客的平均销售额差不多;在第三方APP进行 6-10次购买的顾客的平均销售额差不多,大于在第三方APP进行了1-5次购买的顾客的平均销售额。
  • 总销售额大部分由从未在第三方APP购买过的用户贡献,其次是在第三方APP购买过10次的用户,再次是在第三方APP进行了1-5次购买的顾客,贡献最少的是在第三方APP进行 6-10次购买的顾客。

三、相关和可视化

3.1 类别型变量生成哑变量

xhs.info()

#将gender\\lifecycle\\engaged_last_30\\生成哑变量
xhs2=pd.get_dummies(xhs)
xhs2.info()

3.2 计算revenue和其他变量之间的相关性

sns.heatmap(xhs2.corr(),cmap='YlGnBu')

  • lifecycle_C和days_since_last_order和3rd_party_stores两两正相关
  • gender_0.0和engaged_last_30_0.0正相关
  • revenue和其他任何变量之间的相关性都不明显

# 仅查看所有变量与revenue的相关性,同时根据相关性做降序排列展示
xhs2.corr()[['revenue']].sort_values('revenue',ascending=False)

  • revenue和其他任何变量之间的相关性都不明显
  • 和revenue正相关性最高的是days_since_last_order、previous_order_amount、engaged_last_30_1.0
  • 和revenue负相关性最高的是3rd_party_stores、engaged_last_30_0.0

3.3 变量可视化分析

对于revenue相关性较高的days_since_last_order、previous_order_amount、engaged_last_30_1.0、3rd_party_stores、engaged_last_30_0.0进行相关性可视化分析

# 对days_since_last_order变量进行线性关系可视化分析
sns.regplot('days_since_last_order','revenue',xhs2,scatter_kws={'s':3})

# 对previous_order_amount变量进行线性关系可视化分析
sns.regplot('previous_order_amount','revenue',xhs2,scatter_kws={'s':3})

# 对engaged_last_30_1.0变量进行线性关系可视化分析
sns.regplot('engaged_last_30_1.0','revenue',xhs2,scatter_kws={'s':0.5})

# 对3rd_party_stores变量进行线性关系可视化分析
sns.regplot('3rd_party_stores','revenue',xhs2,scatter_kws={'s':3})

对于revenue相关性较弱的变量进行相关性可视化分析

# 对age变量进行线性关系可视化分析
sns.regplot('age','revenue',xhs2,scatter_kws={'s':3})

# 对lifecycle_C变量进行线性关系可视化分析
sns.regplot('lifecycle_C','revenue',xhs2,scatter_kws={'s':0.01})

四、回归模型

4.1 模型建立

# 调用sklearn中的线性回归工具包
from sklearn.linear_model import LinearRegression
# LinearRegression()设置模型为线性回归
model=LinearRegression()
# 设定自变量和因变量
y=xhs2['revenue']
x=xhs2[['previous_order_amount','engaged_last_30_1.0','days_since_last_order']]
model.fit(x,y)
#查看自变量系数
model.coef_

# 查看截距
model.intercept_

4.2 模型评估

score=model.score(x,y)#x和y打分
score

predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

  • rmse=260.5
  • mae=205

MAE(Mean Absolute Error)

  • 绝对平均误差,是绝对误差的平均值
  • 把每个数据点的预测值和真实值相见,将所有数据点加总求平均
  • 可以更好地反映预测值误差的实际情况

RMSE(Root Mean Square Error)

  • 均方根误差,将每个数据点的误差取平方后开方
  • RMSE比起MAE放大了误差,对误差的惩罚更重
  • 常用来作为机器学习模型预测结果衡量的标准

# 查看标准的模型输出表
from statsmodels.formula.api import ols
model=ols('y~x',xhs2).fit()
print(model.summary())

  • R-squared 仅为0.031
  • Prob为0

该回归基本无意义

4.3 模型优化

优化思路1:分组后转换为哑变量

将days_since_last_order分组

bins1=[0,12,24]#创建分组
labels1=['<12','>=12']
xhs2['days_since_last_order_new']=pd.cut(xhs2['days_since_last_order'],bins1,right=False,labels=labels1)
xhs2.groupby(['days_since_last_order_new'])['revenue'].describe()

days_since_last_order<12和days_since_last_order>=12的销售额平均值存在明显区别,分布为245和317

# 仅查看所有变量与revenue的相关性,同时根据相关性做降序排列展示
xhs2.corr()[['revenue']].sort_values('revenue',ascending=False)

days_since_last_order_new_>=12和revenue相关性较高,为0.116

将days_since_last_order_new_>=12纳入自变量:

# LinearRegression()设置模型为线性回归
model=LinearRegression()
# 设定自变量和因变量
y=xhs2['revenue']
x=xhs2[['previous_order_amount','engaged_last_30_1.0','days_since_last_order','days_since_last_order_new_>=12']]
model.fit(x,y)
score=model.score(x,y)#x和y打分
score

predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

添加了'days_since_last_order_new_>=12'自变量,score: 0.030-0.031

将age分组

bins2=[14,20,29,30,35,40,45]#创建分组
labels2=['<20','<29','<30','<35','<40','<45']
xhs2['age_new']=pd.cut(xhs2['age'],bins2,right=False,labels=labels2)
xhs2.groupby(['age_new'])['revenue'].describe()#查看age_new中age的分布

xhs2=pd.get_dummies(xhs2)
# 仅查看所有变量与revenue的相关性,同时根据相关性做降序排列展示
xhs2.corr()[['revenue']].sort_values('revenue',ascending=False)

将age_new_<30纳入自变量:

# 调用sklearn中的线性回归工具包
from sklearn.linear_model import LinearRegression
# LinearRegression()设置模型为线性回归
model=LinearRegression()
# 设定自变量和因变量
y=xhs2['revenue']
x=xhs2[['previous_order_amount','engaged_last_30_1.0','days_since_last_order','age_new_<30']]
model.fit(x,y)
score=model.score(x,y)#x和y打分
score

predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

添加了'age_new_<30'自变量,score:0.03-0.031

previous_order_amount分组

bins3=[0,1000,2000,3000,4000,5000,7000]#创建分组
labels3=['<1000','<2000','<3000','<4000','<5000','<7000']
xhs2['previous_order_amount_new']=pd.cut(xhs2['previous_order_amount'],bins3,right=False,labels=labels3)
xhs2.groupby(['previous_order_amount_new'])['revenue'].describe()

xhs2=pd.get_dummies(xhs2)
# 仅查看所有变量与revenue的相关性,同时根据相关性做降序排列展示
xhs2.corr()[['revenue']].sort_values('revenue',ascending=False)

将previous_order_amount_new_<1000纳入自变量

# 调用sklearn中的线性回归工具包
from sklearn.linear_model import LinearRegression
# LinearRegression()设置模型为线性回归
model=LinearRegression()
# 设定自变量和因变量
y=xhs2['revenue']
x=xhs2[['previous_order_amount','engaged_last_30_1.0','days_since_last_order','previous_order_amount_new_<1000']]
model.fit(x,y)
score=model.score(x,y)#x和y打分
score

predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

基本没什么效果

3rd_party_stores分组

#只要有过在在第三方APP购买就记为1
xhs2['3rd_party_stores_new1']=xhs2['3rd_party_stores'].map(lambda x:1 if x>0 else 0)
sns.barplot(x='3rd_party_stores_new1',y='revenue',data=xhs2)

在第三方APP购买过与否对应的销售额均值相差较大

# 调用sklearn中的线性回归工具包
from sklearn.linear_model import LinearRegression
# LinearRegression()设置模型为线性回归
model=LinearRegression()
# 设定自变量和因变量
y=xhs2['revenue']
x=xhs2[['previous_order_amount','engaged_last_30_1.0','days_since_last_order','3rd_party_stores_new']]
model.fit(x,y)
score=model.score(x,y)#x和y打分
score

predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

优化效果较好

优化思路2:新增自变量

新自变量lifecycle_C

# 调用sklearn中的线性回归工具包
from sklearn.linear_model import LinearRegression
# LinearRegression()设置模型为线性回归
model=LinearRegression()
# 设定自变量和因变量
y=xhs2['revenue']
x=xhs2[['previous_order_amount','engaged_last_30_1.0','days_since_last_order','lifecycle_C']]
model.fit(x,y)
score=model.score(x,y)#x和y打分
score

predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

4.4 最终方案

# LinearRegression()设置模型为线性回归
model=LinearRegression()
# 设定自变量和因变量
y=xhs2['revenue']
x=xhs2[['previous_order_amount','engaged_last_30_1.0','days_since_last_order','3rd_party_stores_new1','lifecycle_C','age_new_<30']]
model.fit(x,y)
score=model.score(x,y)#x和y打分
score

#查看自变量系数
model.coef_

# 查看截距
model.intercept_

predictions=model.predict(x)#计算y预测值
error=predictions-y#计算误差
rmse=(error**2).mean()**.5#计算rmse
mae=abs(error).mean()#计算mae
print(rmse)
print(mae)

五、业务建议

5.1 用户分析:

  • 用户下单金额集中分布在0-200之间
  • 用户以往累积购买金额为0-100的频数较高
  • 用户年龄分布在14-45岁之间,绝大部分用户年龄集中在27-32岁之间
  • 10380个用户的年龄为29.419286 岁,29岁或是小红书的默认年龄选项
  • 用户最近一次下单距今的天数分布在0-23.7天之间,可见所有的用户在本月内都有下单行为
  • 用户最近一次下单后平均7.7天后会再次下单
  • 用户最近一次下单距今0-1天的频数较高
  • C(注册后两年)的用户最多
  • 女性顾客远远超过男性顾客数量
  • 大部分用户30天内未在APP上参加活动
  • 从未在第三方APP购买过的顾客最多,其次是在第三方APP购买过10次的顾客

5.2 提高销售额变量分析——高价值用户

  • C(注册后两年内的)用户销售额平均值最高,为267.5;其次是B(注册后一年内的)用户,销售额平均值为253.7;销售额平均值最低的是A(注册后6个月内的)用户,销售额平均值为245.5.,总销售额大部分由C(注册后两年)的用户创造
  • 女性顾客的销售额平均值和男性顾客的消费额平均值相差不大,总销售额大部分由女性顾客贡献
  • 最近30天在APP上参与了活动的用户的销售额平均值更大,为320.3,未参加活动的用户的销售额平均值为252元,总销售额的大部分由30天内未在APP上参加活动的用户创造
  • 从未在第三方APP购买过的顾客的平均销售额最多;在第三方APP进行了1-5次购买的顾客的平均销售额差不多;在第三方APP进行 6-10次购买的顾客的平均销售额差不多,大于在第三方APP进行了1-5次购买的顾客的平均销售额。总销售额大部分由从未在第三方APP购买过的用户贡献,其次是在第三方APP购买过10次的用户,再次是在第三方APP进行了1-5次购买的顾客,贡献最少的是在第三方APP进行 6-10次购买的顾客。
  • lifecycle_C和days_since_last_order和3rd_party_stores两两正相关,gender_0.0和engaged_last_30_0.0正相关,revenue和其他任何变量之间的相关性都不明显

结论:

  • 重点留意注册后两年用户的留存情况
  • 活动、广告、营销重点针对女性用户
  • 鼓励用户在APP上参加活动,特别是女性用户
  • 针对从未在第三方APP进行过购买活动的用户进行额外推送、广告、营销、优惠券推送等,其次是在第三方APP进行购买活动大于等于10次的用户

5.3 销售额模型预测分析

预测销售额=0.019*previous_order_amount+57.688*engaged_last_30_1.0+5.952*days_since_last_order-76.037*3rd_party_stores_new1+23.922*lifecycle_C+19.077*age_new_<30+190.867

模型解读:

业务解读:

  • 每提升1元的用户以往累积购买金额,可以得到0.019元的销售额回报
  • 用户用户在最近30天内参加过活动比起不参加活动,销售额提升了57.688元
  • 用户最近一次下单距今的天数每提升1天,则可以实现5.952元的销售回报
  • 用户过往在第三方APP未购买过比起购买过,销售额提升了76.037元
  • 用户在两年前注册比起不在两年前注册,销售额提升了23.922元
  • 用户年龄介于29-30岁之间比起其他年龄,销售额提升了19.077
  • 不断收集数据和添加新变量能提升对整体营销资源投入的把握

(注:该数据线性回归效果较差,仅为练习线性回归步骤用)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
相关推荐