CD网站的用户行为分析

用于分析的数据来源于某CD网站的商品销售统计,主要分为网络订单数据和用户信息两部分,包含用户ID,购买日期,购买产品数,购买金额等四项基本数据。

数据来源链接:https://pan.baidu.com/s/15apDL4TQxPkSYcQm_Exngg
提取码:6cbb

分析目的:为平台创造更多利润,合理辨别广告投放人群,对平台商品销售数据进行分析,根据复购率、回购率、高额消费用户等指标以及消费模型得到高价值的用户,从而进行有针对的客户管理和维护。

1、数据准备
2、按月对用户消费趋势进行分析
3、用户的个体消费分析
4、用户消费行为分析

1、数据准备

导入常用数据库,进行基本设置

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline  #可视化图形直接显示在页面中
plt.style.use('ggplot')  #更改设计风格为gglot
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

导入数据

columns=['user_id','order_dt','order_products','order_amount']
df=pd.read_table('C:/Users/Duffy/Desktop/DATA/WEB_CD.txt',names=columns,sep='\s+')  #‘\s+'表示匹配任意空格符

查看表头可知
user_id对应用户ID
order_dt对应购买日期
order_products对应购买产品数
order_amount对应购买金额

df.head()
表头.png

检查数据完备性

df.info()
数据属性.png

可知数据无缺失值,无需对缺失值处理,但order_dt的数据类型是int,为方便数据处理,在这将其转化为datetime格式。

df.order_dt=pd.to_datetime(df.order_dt,format='%Y%m%d')

到这里,数据的导入和预处理就结束了。

1、按月对用户消费趋势进行分析

用户月消费趋势分成以下三部分:

  • 每月的产品购买量
  • 每月消费的总金额
  • 每月的消费人数

将订购日期(order_dt)提取出月份信息,通过数据透视表数据按月分组,分别求出每月的购买量、消费总金额以及消费人数

df['month']=df.order_dt.values.astype('datetime64[M]')
month_grouped=df.pivot_table(index='month',
                             values=['order_products','order_amount','user_id'],
                             aggfunc={'order_products':'sum','order_amount':'sum','user_id':'count'})
按月进行数据透视.png

对每项数据做直方图:

import pylab
%pylab inline
pylab.rcParams['figure.figsize']=(16,20)
fig,axes = plt.subplots(3,1)
axes0,axes1,axes2 = axes.flatten()
axes0.bar(month_grouped.index,month_grouped.order_products,width=20)
axes0.set_title('每月的产品购买量')
axes1.bar(month_grouped.index,month_grouped.order_amount,width=20)
axes1.set_title('每月消费的总金额')
axes2.bar(month_grouped.index,month_grouped.user_id,width=20)
axes2.set_title('每月的消费人数')
直方图.png

通过以上数据可知

  • 销量增长主要集中在前三个月,从第四个月起,产品购买量、消费金额、消费用户数量呈断崖式下跌,之后走向趋于平稳起伏不大。
  • 新用户的购买行为主要集中在前三月,后面的消费主要是由前三月用户的回购行为产生,说明用户忠诚度不高,用户粘性不足。

3、用户的个体消费分析

分为以下三个方面:

  • 用户消费金额、消费次数的描述统计
  • 用户消费金额和消费次数的相关性
  • 用户累计消费金额占比(百分之多少的用户占了百分多少的消费额)

3.1描述统计

按用户id进行数据透视,将透视结果做一个描述统计分析

user_grouped = df.groupby('user_id').agg({'user_id':'count',
                                          'order_products':'sum',
                                          'order_amount':'sum'})
user_grouped.describe()
描述统计.png

用户的平均消费频次约为3次,但最小值、四分位数、中位数均为1,说明大部分用户仅消费一次。
消费金额与产品购买数的平均值与三分之四分位数相等,说明了有少量的用户购买了大量的商品。

3.2消费金额和消费次数的相关性

绘制散点图

grouped_user=df.groupby('user_id')
grouped_user.sum().plot.scatter(x='order_amount',y='order_products')
散点图1.png

可见有部分极值拉大了图形区域,不利于观察
可用query函数去除极值

grouped_user.sum().query('order_amount < 6000').plot.scatter(x='order_amount',y='order_products')
散点图2.png

由图可知消费金额与消费次数呈现较大相关性
说明CD产品单一,单价稳定

3.3用户累计消费金额占比

按用户消费金额从低到高进行升序排列,然后逐个累加,求出每一个累加值的所占百分比

user_cumsum=grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum()/ x.sum())
user_cumsum.reset_index().order_amount.plot()
累计消费金额占比.png

可以得知,50%的客户仅贡献了15%左右的销售额,少量客户贡献了更多的销售额。

4、用户消费行为分析

主要分为以下几个方面分析:

  • 用户首购和用户最后一次消费
  • 新老客户消费比
  • 用户分层(RFM)

4.1

用户首购

grouped_user.min().order_dt.value_counts().plot()
首购.png

由图可知,用户首次消费行为基本上集中在最开始的三个月,1997年4月之后几乎没有新用户产生。

用户最后一次消费

grouped_user.max().order_dt.value_counts().plot()
最后购买.png

由图可知,用户最后一次的购买行为基本集中在前三月,三月之后折线图呈断崖式下跌,说明很多客户仅发生一次购买行为。

4.2新老客户消费比

求出用户购买产品日期的最大值和最小值,若该日期的最大值等于其最小值,说明这个用户只消费了一次。

use_life=grouped_user.order_dt.agg(['min','max'])
(use_life['min']==use_life['max']).value_counts()
微信截图_20190410214803.png

判别条件为True的用户数量为12054,占总数的51.1%,说明这部分客户仅消费过一次。

4.3用户分层

RFM模型是衡量客户价值和客户创利能力的重要工具和手段。通过客户的购买时间、购买金额、购买频率三项指标,来描述该客户的价值状况。

RFM模型分层.jpeg

先对数据做预处理,让每个日期减去最大日期获得间隔天数(该数为负数),当数值越大时,说明日期越近。

df.reset_index(inplace=True)
df['period']=(df.order_dt - df.order_dt.max())/np.timedelta64(1,'D')#计算时间差,并转换为float类型
日期.png

使用数据透视表,求出各用户的最近消费时间(R),消费频次(F),消费总金额(M)。

user_rfm = df.pivot_table(values=['period','order_products','order_amount'],
                          index='user_id',aggfunc={'period':'max',
                                                  'order_products':'count',
                                                    'order_amount':'sum' })
user_rfm = user_rfm.rename(columns = {'order_amount':'M','order_products':'F','period':'R'})
RFM.png

将用户在R、F、M三个维度上,按照高于平均值和低于平均值进行划分,高于平均值则赋值为1,低于平均值则赋值为0,最后根据RFM分层模型给所有用户分层。

def level_label(data):#定义分层函数
    level = data.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


user_rfm['label'] = (user_rfm - user_rfm.mean()).apply(level_label,axis=1)
微信截图_20190410221836.png

对用户分层结果计数:

user_rfm.pivot_table(values=['R','F','M'],
                     index='label',
                     aggfunc={'R':'count','F':'count','M':'count'}).head(10)
计数.png

作饼图

label_count = user_rfm.groupby('label').count()
%pylab.rcParams['figure.figsize']=(15,15)
labels = ['一般价值客户','一般保持客户','一般发展客户','潜在客户','重点保持客户','重点发展客户','重点挽留客户','高价值客户']

plt.pie(label_count['M'],labels=labels,autopct = '%3.1f%%',startangle = 90,radius=2)
饼图.png

从用户分层结果可知,不活跃用户占较大的比重,为57.7%,高价值用户占比第二,19.6%,这是该CD网站的消费主力军,需重点保持。
而重点挽留客户、重点发展客户、重点保持客户占比较低,分别为2.5%,1.1%,1.9%。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343