新闻中心
用户消费订单数据分析(用户消费订单数据分析报告)
一、读取数据、查看数据结构
利用pandas 导入数据,查看数据结构:
import pandas as pd columns=[用户ID,购买日期,订单数,订单金额] df=pd.read_table(D:\Downloads\CDNOW.txt,names=columns,sep=\s+)


数据一共包含用户ID、购买日期、订单数和订单金额四项内容。均值与中位数相差不大,无异常值。
二、分析数据、提出业务指标
利用Xmind画思维导图,对数据进行分层分析,提出业务指标。

三、数据清洗、构建业务指标并可视化
df[购买日期]=pd.to_datet df[月份]=df.购买日期.values.astype(datetime64[M])#增加月份列
1.月消费额、月消费次数、月销量、月消费人数分布图
plt.rcParams[font.sans-serif]=[SimHei] #用来正常显示中文标签 plt.rcParams[axes.unicode_minus]=False plt.figure(figsize=(20,15)) plt.subplot(221) df.groupby(月份)[订单金额].sum().plot() plt.xlabel(月份) plt.title(总销售额) plt.subplot(222) df.groupby(月份)[购买日期].count().plot() plt.xlabel(月份) plt.title(消费次数) plt.subplot(223) df.groupby(月份)[订单数].sum().plot() plt.xlabel(月份) plt.title(销量) plt.subplot(224) df.groupby(月份)[用户ID].apply(lambda x:len(x.unique())).plot() plt.xlabel(月份) plt.title(消费人数)
销售额、销量、消费次数与消费人数四个指标均在前三个月较高,第四个月剧烈下降,后呈缓慢下降趋势,需要重点关注第四个月是什么导致指标下降,并采取相关措施。
2.订单数与订单金额关系图
group_user=df.groupby(用户ID).sum() group_user.query(订单金额<4000).plot.scatter(x=订单金额,y=订单数) plt.xlabel(订单金额) plt.ylabel(订单数) group_user.query(订单金额<800)[订单金额].plot.hist(bins=20)

订单数与销售额呈线性相关关系,且用户订单数额小的销售额较大,说明有很多优质客户,购买量小,但购买单价较高。
3.用户消费周期图
order_diff=df.groupby(用户ID).apply(lambda x:x[购买日期]-x[购买日期].shift()) df.groupby(用户ID)[订单数].sum() plt.figure(figsize=(15,5)) plt.hist((order_diff/np.timedelta64(1,D)).dropna(),bins=50) plt.xlabel(消费周期) plt.ylabel(频数) plt.title(用户消费周期分布图)
用户消费周期较短,存在大量一次性购买客户。
4.用户第一次购买及最后一次购买日期分布图
grouped_user=df.groupby(用户ID) #用户第一次购买日期 grouped_user.min().购买日期.value_counts().plot() #用户最后一次购买日期 grouped_user.max().购买日期.value_counts().plot()

用户第一次购买和最后一次购买都集中在1997年03月份之前的三个月。这也表明多数客户只购买一次产品就没有回购。
5.用户生命周期图
user_life=grouped_user.购买日期.agg([min,max]) #用户生命周期图 ((user_life[max]-user_life[min])/np.timedelta64(1,D)).hist(bins=15) #数据类型为timedelta时间,无法直接做出直方图,先换算为数值 #换算的方式直接除timedelta函数即可,np.timedelta64(1, ‘D’),D表示天,1表示1天,作为单位使用的。 #因为max-min已经表示为天了,两者相除就是周期

6.RFM模型
#对用户进行分层分析 rfm=df.pivot_table(index=用户ID,values=[订单金额,购买日期,订单数], aggfunc={订单金额:sum,购买日期:max,订单数:sum}) rfm[R]=(rfm[购买日期].max()-rfm[购买日期])/np.timedelta64(1,D) rfm.rename(columns={订单金额 :M,订单数:F},inplace=True) #构建rfm模型公式 def get_rfm(x): level=x.apply(lambda x:1 if x>=0 else 0) label=level[R]+level[F]+level[M] d={111:重要价值客户, 011:重要保持客户, 101:重要挽留客户, 001:重要发展客户, 110:一般价值客户, 010:一般保持客户, 100:一般挽留客户, 000:一般发展客户} result=d[label] return result rfm[label]=rfm[[R,F,M]].apply(lambda x:(x-x.mean())/x.std()).apply(get_rfm,axis=1)

7.复购率
#每个用户在每月的订单数 pivoted_df=df.pivot_table(index=用户ID,columns=月份,values=购买日期,aggfunc=count).fillna(0) #转换:消费2次以上记为1,消费1次记为0,消费0次记为NAN #applymap针对dataframe所有数据 pivoted_df_transf=pivoted_df.applymap(lambda x:1 if x>1 else np.nan if x==0 else 0) df_duplicate=pd.DataFrame(pivoted_df_transf.sum()/pivoted_df_transf.count()).reset_index() df_duplicate.columns = [Date, DuplicatedRate] df_duplicate[Date]=df_duplicate.Date.astype(str).apply(lambda x:x[:-3]) plt.figure(figsize=(5, 2)) df_duplicate.plot(marker=*) plt.xticks(range(len(df_duplicate.Date)),df_duplicate.Date,rotation=45) plt.grid(color=g,linestyle=solid,alpha=0.5) plt.xlabel(时间) plt.ylabel(复购率) plt.title(复购率变化)
复购率在0.2-0.22范围波动,需要采取措施提高复购率。
8.回购率
#回购率 #每个用户每个月平均消费金额 pivoted_money=df.pivot_table(index=用户ID,columns=月份,values=订单金额,aggfunc=mean).fillna(0) pivoted_money.columns=df.月份.sort_values().astype(str).unique() #有消费的记为1,无消费的记为0 pivoted_purchase=pivoted_money.applymap(lambda x: 1 if x>0 else 0) pivoted_purchase.head() #如果本月进行消费,下月也进行消费,则记为1;如果下月没有消费,则记为0,若本月没有记为消费,则记为nan def purchase_return(data): status=[] for i in range(17): if data[i]==1: if data[i+1]==1: status.append(1) if data[i+1]==0: status.append(0) else: status.append(np.nan) status.append(np.nan) return pd.Series(status,index=pivoted_money.columns) pivoted_purchase_return=pivoted_purchase.apply(purchase_return,axis=1) df_purchase=(pivoted_purchase_return.sum()/pivoted_purchase_return.count()).reset_index() df_purchase.columns=[Date,PurchaseRate] df_purchase[Date]=df_purchase.Date.astype(str).apply(lambda x:x[:-3]) plt.figure(figsize=(12,8)) plt.plot(df_purchase.Date,df_purchase.PurchaseRate,marker=*) plt.xticks(range(len(df_purchase.Date)),df_purchase.Date,rotation=45) plt.grid(color=b,linestyle=solid,alpha=0.5) plt.xlabel(时间) plt.ylabel(回购率) plt.title(回购率变化)
回购率在0.25-0.35之间波动,相对较低,还可以采取措施提高。
四、结论与建议
从时间维度,查找第四个月销量骤然下滑的原因,并采取相应措施弥补。
从用户维度,少数用户购买量少,但购买金额较大,可以作为公司重点培养客户对象,培养成公司忠诚客户。
从产品维度,回购率与复购率都较低,需要考虑产品是否符合大众需求,可以进行市场调查,根据用户需求改进产品性能;另外可以采取挽留措施,对回购客户赠送优惠等方式,提高回购率与复购率。
注:本文数据类型较少,分析得不够全面,如有错漏,欢迎指出!