小红书营销渠道效果预测分析
分析背景说到小红书,是目前非常热门的电商平台,和其他电商平台不同,小红书是从社区起家。在小红书社区,用户通过文字、图片、视频笔记的分享,记录了这个时代年轻人的正能量和美好生活。小红书通过机器学习对海量信息和人进行精准、高效匹配,已累积海量的海外购物数据,分析出最受欢迎的商品及全球购物趋势,并在此基础上把全世界的好东西,以最短的路径、最简洁的方式提供给用户。本项目协助小红书分析不同的业务决策所带来的销售额变化。分析目标根据用户数据以及消费行为数据使用Python建立线性回归模型预测用户的消费金额变化找到对用户消费影响较大的因素分析流程数据概况分析(数据行列数量,缺失值分布,数据清洗)--单变量分析(数字型变量的描述指标、类别型变量(多少分类,各自占比))--相关和可视化(按类别交叉对比,变量之间的相关性分析,散点图/热力图)--回归模型(模型建立、模型评估和优化)一、数据概况分析1.1数据概览先导入数据:#导入数据#调包importpandasaspdimportnumpyasnp#读取数据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(类别型变量)#先把缺失值填充为unknownxhs['gender']=xhs['gender'].fillna('unknown')#engaged_last_30(是否参加重要活动)(类别型变量)#把缺失值填充为unknownxhs['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*diff1revenue离群值:(>=输出的数据)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()二、单变量分析importmatplotlib.pyplotaspltimportseabornassns%matplotlibinline2.1数字型变量2.1.1用户下单金额revenuesns.distplot(xhs['revenue'])集中分布在0-200之间2.1.2用户以往累积购买金额previous_order_amountsns.distplot(xhs['previous_order_amount'])用户以往累积金额为0-100的频数较高2.1.3年龄agesns.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.03.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中的线性回归工具包fromsklearn.linear_modelimportLinearRegression#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打分scorepredictions=model.predict(x)#计算y预测值error=predictions-y#计算误差rmse=(error**2).mean()**.5#计算rmsemae=abs(error).mean()#计算maeprint(rmse)print(mae)rmse=260.5mae=205MAE(MeanAbsoluteError)绝对平均误差,是绝对误差的平均值把每个数据点的预测值和真实值相见,将所有数据点加总求平均可以更好地反映预测值误差的实际情况RMSE(RootMeanSquareError)均方根误差,将每个数据点的误差取平方后开方RMSE比起MAE放大了误差,对误差的惩罚更重常用来作为机器学习模型预测结果衡量的标准#查看标准的模型输出表fromstatsmodels.formula.apiimportolsmodel=ols('y~x',xhs2).fit()print(model.summary())R-squared仅为0.031Prob为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打分scorepredictions=model.predict(x)#计算y预测值error=predictions-y#计算误差rmse=(error**2).mean()**.5#计算rmsemae=abs(error).mean()#计算maeprint(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中的线性回归工具包fromsklearn.linear_modelimportLinearRegression#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打分scorepredictions=model.predict(x)#计算y预测值error=