CDnow网站用户数据分析

一、项目背景

1.1、背景介绍:

CDNow曾经是一家在线音乐零售平台,后被德国波泰尔斯曼娱乐集团公司出资收购,其资产总价值在最辉煌时曾超过10亿美元。本文主要通过分析CDNow网站的用户整体消费情况和用户行为展开分析,找出高价值用户人群,及用户活跃、流失等情况,为平台指定策略提供数据分析支持和建议。

1.2、数据源介绍

本次分析数据来源CDNow网站的用户在1997年1月1日至1998年6月30日期间内购买CD交易明细。

二、数据处理

2.1 导入模块

import pandas as pd
import numpy as np
from datetime import datetime
from sqlalchemy  import create_engine
import pymysql
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']    # 用来显示中文标签
plt.rcParams['axes.unicode_minus'] = False   # 用来正常显示负号
plt.style.use('seaborn-colorblind')    # 更改设计风格,使用自带形式进行美化
# plt.style.use('ggplot') 

2.2 导入数据

columns=["id","date","num","money"]
data=pd.read_table('CDNOW.txt',sep='\s+',names=columns)
data.head()

2.3 查看数据类型

data.info()
  • 没有缺失值;购买日期是int类型的,需要转换成日期类型;其他数据类型正常。

2.4 更改数据类型

data['date']=pd.to_datetime(data['date'],format='%Y%m%d')   # 字符串类型转时间类型
data['month']=data['date'].values.astype('datetime64[M]')    # 添加月份字段,方便之后的数据分析
data.head()

2.5 描述性统计

data.describe()
  • 观察数据发现: 订单金额和订单量的平均值皆大于中位数,数据整体分布呈右偏状态,说明绝大数据的用户消费金额相对较低。

三、数据分析

3.1 用户总体消费数据分析

plt.figure(figsize=(20,15))
# 每月总销售额趋势图
plt.subplot(421)
data.groupby('month').money.sum().plot(fontsize=15,marker='o')
plt.title('销售额趋势图',fontsize=15)

# 每月总销量趋势图
plt.subplot(422)
data.groupby('month').num.sum().plot(fontsize=15,marker='o')
plt.title('销售量趋势图',fontsize=15)

# 消费次数趋势图
plt.subplot(423)
data.groupby('month').id.count().plot(fontsize=15,marker='o')
plt.title('消费次数趋势图',fontsize=15)

# 消费人数趋势图
plt.subplot(424)
data.groupby('month').id.nunique().plot(fontsize=15,marker='o')
plt.title('消费人数趋势图')

#  用户每月平均消费金额
plt.subplot(425)
(data.groupby('month').money.sum()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('客单价趋势图')

# 件单价
plt.subplot(426)
(data.groupby('month').money.sum()/data.groupby('month').num.sum()).plot(fontsize=15,marker='o')
plt.title('件单价')

# 用户平均消费次数趋势图
plt.subplot(427)
(data.groupby('month').id.count()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('人均消费次数')

plt.subplot(428)
(data.groupby('month').num.sum()/data.groupby('month').id.nunique()).plot(fontsize=15,marker='o')
plt.title('人均消费量')

plt.tight_layout(pad=2)  #用于设置子图见的间距
  • 观察数据发现:

前四个折线图:消费金额、销量、消费次数、用户数的整体趋势基本一致,都是1997年前三个月数据异常高,随后骤降,然后趋于平稳;为什么会出现这种异常现象呢?初步猜测要么是前三个月有异常值,要么就是受营销活动或者其他外部因素的影响,但这里没有更多的数据提供验证素材,所以也无法判断其原因。

用户平消费金额大概为50,前三个月低,后续在[47,5]波动;用户平均消费次数,也是前三个月低,后续上升,并维持在1.35次左右,商品复购率较低;

对于客单价和人均消费次数这两个数据趋势基本一致,相较于销售额等数据,前面三个月数据反而低,后续才慢慢上升,结合两种趋势图来看,在消费次数和金额稳定的情况下,用户复购下降或者用户数下降会导致总体销售额和销量的下降,关于这个问题的验证,稍后在复购率和留存率的分析中再探究。

3.2 用户个体消费数据分析

3.2.1 按用户分组

group_userid=data.groupby('id')  # 按月分组

plt.figure(figsize=(25,5))
plt.subplot(121)
group_userid[['num']].sort_values(by=['num'],ascending=True).reset_index()['num'].plot(fontsize=15)
plt.title('用户订单数量',fontsize=18)
plt.subplot(122)
group_userid[['money']].sort_values(by=['money'],ascending=True).reset_index()['money'].plot(fontsize=15)
plt.title('用户消费金额',fontsize=18)

3.2.2消费金额、订单量、消费次数分布

fig,axes=plt.subplots(1,3,figsize=(16,4))
axes0,axes1,axes2=axes.flatten()
group_userid[['money']].query('money<1000').plot.hist(bins=50,fontsize=15,ax=axes0)
axes0.set_title('消费金额分布图')
axes0.set_xlabel('消费金额')
axes0.set_ylabel('订单人数')

# plt.subplot(132)
group_userid[['num']].query('num<100').plot.hist(bins=30,fontsize=15,ax=axes1)
axes1.set_title('订单量分布图')
axes1.set_xlabel('订单量')
axes1.set_ylabel('订单人数')

# plt.subplot(133)
data.groupby('id').count()[['date']].query('date<20').plot.hist(bins=19,fontsize=15,ax=axes2)
axes2.set_title('消费次数分布图')
axes2.set_xlabel('消费次数')
axes2.set_ylabel('订单人数')
  • 从上图可以看出,用户购买金额普遍偏低,消费频次也是普遍偏低,当然这也符合销售数据的一般规律。

3.2.3 用户累计订单量和用户累计消费金额

plt.figure(figsize=(15,5))
plt.subplot(121)
group_userid[['num']].sort_values(by='num').apply(lambda x:x.cumsum()/x.sum()).reset_index().num.plot(fontsize=15)
plt.title('用户累计订单量占比')
plt.axhline(y=0.8,ls='--',c='blue',lw = 1)
plt.axvline(x=data.id.nunique()*0.8,ls='--',c='green',lw=1)

plt.subplot(122)
group_userid[['money']].sort_values(by='money').apply(lambda x:x.cumsum()/x.sum()).reset_index().money.plot(fontsize=15)
plt.title('用户累计消费金额占比')
plt.axhline(y=0.8,ls='--',lw=1,c='blue')
plt.axvline(x=data.id.nunique()*0.8,ls='--',lw=1,c='green')
  • 20%的客户贡献了超过65%的销售额和销售量,符合二八趋势。

3.3 用户消费周期分析

3.3.1 用户购买周期分析

# 先把每个用户每次购买的时间间隔计算出来,这里用到的方法是shift()
def diff(data):
    d=data.date-data.date.shift(1)
    return d

purchase_period=data.groupby('id').apply(diff)
purchase_period.dt.days
purchase_period.head()
用户消费周期分布
plt.figure(figsize=(15,8))
purchase_period.dt.days.plot.hist(bins=40)
plt.title('用户消费周期分组',fontsize=18)
plt.xlabel('购买周期')
plt.ylabel('人数')
  • 观察图表发现:仍然是长尾形态分布,大部分用户消费周期是很短的;不妨将用户找回点设置为消费后立即赠送优惠券,10天后回访用户体验,30天后提醒优惠券即将到期,60天后发送召回短信。

3.3.2用户生命周期分析

用户收购时间和用户最后一次消费时间
plt.figure(figsize=(15,5))
plt.subplot(121)
data.groupby('id').date.min().value_counts().plot()
plt.title('用户收购时间')

plt.subplot(122)
data.groupby('id').date.max().value_counts().plot()
plt.title('用户最后一次消费时间')
  • 1997年4月之后不在有新增用户,而且大多数用户在前四个月就流失了,因此,也验证了此前提出的与首购的优惠有关的可能性。
仅消费一次用户占总用户的比例
group_userid_date_min_max=data.groupby('id').date.agg(['min','max'])
new_user=(group_userid_date_min_max['min']==group_userid_date_min_max['max']).value_counts()

plt.figure(figsize=(15,5))
new_user.plot.pie(autopct="%.1f%%",
                 shadow= True,
                 explode=[0,0.05],
                 startangle=0,
                 fontsize=15)
plt.legend(["仅消费一次人数","多次消费人数"])
  • 大约一半的用户仅仅消费了一次,很有必要对用户进行定期召回。
用户生命周期分布
# 用户生命周期计算:最后一次减第一次
order_date_min=data.groupby('id').date.min()
order_date_max=data.groupby('id').date.max()
life_cycle = (order_date_max-order_date_min).dt.days
plt.figure(figsize=(15,5))
plt.subplot(121)
life_cycle.plot.hist(bins=30)
plt.title('用户生命周期分布')
plt.xlabel('天数')
plt.ylabel('人数')

plt.subplot(122)
life_cycle=life_cycle.reset_index()
life_cycle.query('date>0').date.plot.hist(bins=50)  # 消费两次及以上的用户
plt.title('用户生命周期分布')
plt.xlabel('天数')
plt.ylabel('人数')
life_cycle[['date']].describe()
life_cycle[['date']].query('date>0').describe()
总体
消费两次以上
  • 一般的用户生命周期为一天。
  • 消费两次及以上的用户生命周期分布呈双峰结构,用户平均生命周期是 276 天,远高于总体的134天;在用户首次消费后引导其进行多次消费,可以有效提高用户生命周期。

3.4 用户分层分析

3.4.1用户价值分层(FRM)


rfm=data.groupby('id').sum()
rfm['r']=(data.date.max()-data.groupby('id').date.max()).dt.days
rfm.columns=['f','m','r']

def level_label(x):
    level=x.apply(lambda x:'1' if x>=0 else '0' )
    label=level['r']+level['f']+level['m']
    dic={
        "111":"重要价值客户",
        '101':'重要发展客户',
        "011":"重要维护客户",
        '001':'重要挽留客户',
        '001':'重要挽留客户',
        '110':'一般价值客户',
        '100':'一般发展客户',
        '010':'一般维持客户',
        '000':'一般挽留客户'   
         }
    return dic[label]

rfm['label']=rfm.apply(lambda x:x-x.mean()).apply(level_label,axis=1)
rfm_rate=rfm_group[['count','sum']].apply(lambda x:x/x.sum())
rfm_rate['avg']=rfm_group['sum']/rfm_group['count']

plt.figure(figsize=(15,5))
plt.subplot(131)
rfm_rate['count'].plot.bar(fontsize=13)
plt.title('用户分层人数占比')

plt.subplot(132)
rfm_rate['sum'].plot.bar(fontsize=13)
plt.title('用户分层消费金额占比')

plt.subplot(133)
rfm_rate['avg'].plot.bar(fontsize=13)
plt.title('用户分层平均消费金额')
  • 从上图可以看出,接近60%的用户属于一般发展客户,这一类客户占比较大,但是仅仅贡献消费金额的17%左右,平均消费金额仅仅0.25万美元,在各类客户当中属于最低水平;第二大用户群是重要维护客户,人数占比接近20%,贡献的销售额达到63%左右,平均消费金额达3.3万元,这一类客户价值极高,对于这一类客户应该做好重点维护,防止用户流失,从而为平台创造更大的收入。

3.4.2 用户活跃程度分层

#将用户消费数据进行数据透视:
data3 = data.pivot_table(index = "id",
                         columns = "month",
                         values = 'date',
                         aggfunc = 'count').fillna(0)

def active_status(x):
    status=[]
    for i in range(len(x)):
        #若本月没有消费
        if x[i] ==0:
            if i!=0:
                if status[i-1]=='unreg':
                    status.append('unreg')
                else :status.append('unactive')
            else :status.append('unreg')
        #若本月消费了    
        elif x[i]!=0:   
            if i!=0:
                if status[i-1]=='unreg':
                    status.append('new')
                elif status[i-1]=='unactive':
                    status.append('return')
                else :status.append('active')
            else :status.append('new')   
    return pd.Series(status,index=x.index)

data3_status=data3.apply(active_status,axis=1)
data3_status=data3_status.apply(lambda x:x.value_counts()).fillna(0).T.drop('unreg',axis=1)

plt.figure(figsize=(8,5))
data3_status.plot()
plt.title('每月用户活动状态人数')
plt.ylabel('人数')

plt.figure(figsize=(8,5))
data3_status.apply(lambda x:x/x.sum(),axis=1).plot.area()
plt.title('每月用户活动状态')
plt.ylabel('用户人数占比')

3.4.3 每月回流用户占比

(data3_status['return']/data3_status['unactive'].shift(1)).plot(marker='o')
plt.title('每月回流用户占比')
plt.ylabel('用户占比')
  • 四月份以后,用户回流率开始显著下降,并且稍有波动。

3.5 复购率、回购率、留存率

复购率:在一个时间窗口里,多次购买的客户数量占总客户的比例
回购率:本时间窗口内购买的客户中,下个时间窗口继续购买的客户比例

3.5.1 复购率

#每个用户在每月的订单数
pivoted_data=data.pivot_table(index='id',
                 columns='month',
                values='date',
                aggfunc='count').fillna(0)
# 消费两次及以上为 1 ,消费1次为 0 ,没有消费为空
pivoted_data_trans=pivoted_data.applymap(lambda x: 1 if x>1 else np.nan if x==0 else 0)
repurchase_rate=(pivoted_data_trans.sum()/pivoted_data_trans.count()).reset_index()
repurchase_rate.columns=['日期','复购率']

plt.figure(figsize=(15,5))
plt.plot(repurchase_rate.日期,repurchase_rate.复购率)
plt.title('复购率',fontsize=18)
  • 复购率稳定在 20% 左右,前三个月因为有大量新用户涌入,而这批用户只购买了一次,所以导致复购率降低

3.5.2 回购率

group_month_user_order=data.pivot_table(index='id',
                                        columns='month',
                                        values='num',
                                       aggfunc='sum').fillna(0)
pivoted_repurchase = group_month_user_order.applymap(lambda x:1 if x>0 else 0)

def buy_back_choose(x):
    mask=x>0
    label=[]
    for i in range(len(x)-1):
        if mask[i] and mask[i+1]:
            label.append(1)
        elif mask[i]:
            label.append(0)
        else:
            label.append(np.NaN)
    return pd.Series(label,index=x.index[:-1])

pivoted_repurchase_return= pivoted_repurchase.apply(buy_back_choose,axis=1)

plt.figure(figsize=(15,5))
pivoted_repurchase_return.apply(lambda x:x.sum()/x.count()).plot()
plt.title('回购率',fontsize=15)
  • 上图可以看出,在初期用户的回购率并不高,1月的回购率只有15%左右,4月份起回购率稳定在30%左右。
    从每月有回购消费的用户数数据可以看出,回购用户数整体有下降趋势。

  • 对回购率的分析,再次说明了对于新用户,在其第一次消费后的三个月内是一段重要的时期,需要营销策略积极引导其再次消费及持续消费。

  • 另外,对于有持续消费的老客,也要适时推出反馈老客户的优惠活动,以加强老客的忠诚度。

  • 只有2.5%的用户在第一次消费的次日至3天内有过消费,3%的用户在3~7天内有过消费。数字并不好看,CD购买确实不是高频消费行为。有20%的用户在第一次消费后的三个月到半年之间有过购买,27%的用户在半年后至1年内有过购买。从运营角度看,CD机营销在服务新用户的同时,应该注重用户忠诚度的培养,放长线掉大鱼,在一定时间内召回用户购买。

四、总结

  • 用户总体消费趋势(每月)方面,前3个月有大量新用户涌入,消费金额、消费订单数、产品购买量均达到高峰,后续每月较为稳定。前3个月消费次数都在10000笔左右,后续月份的平均2500;前3个月产品购买量达到20000甚至以上,后续月份平均7000;前3个月消费人数在8000-10000之间,后续月份平均2000不到。
    用户个体消费方面,小部分用户购买了大量的CD,拉高了平均消费金额。用户消费金额集中在0100元,有大约17000名用户。用户购买量集中在05,有大约16000名用户。50%的用户仅贡献了15%的消费额度,15%的用户贡献了60%的消费额度。大致符合二八法则。
  • 用户个体消费行为方面,首购和最后一次购买的时间,集中在前三个月,说明很多用户购买了一次后就不再进行购买。而且最后一次购买的用户数量也在随时间递增,消费呈现流失上升的状况。
    从整体消费记录来看,有一半的用户,只消费了一次。从每月新用户占比来看,1997年1月新用户占比高达90%以上,后续有所下降,1997年4月到1998年6月维持在81%左右,1998年6月以后无新用户。
    从RFM模型来看,在8种客户中,重要保持客户的消费频次和消费金额最高,人数排在第二位;而一般发展客户消费频次和消费金额排第二位,人数却是最多。
  • 用户生命周期方面,由于只购买一次的用户(生命周期为0天)占了接近一半,排除这部分用户的影响之后,用户平均生命周期276天,中位数302天。
  • 从用户分层情况来看,新用户从第4月份以后没有新增;活跃用户有所下降;回流用户数量趋于稳定,每月1000多。流失/不活跃用户,数量非常多,基本上每月都在20000以上。
    用户购买周期方面,平均购买周期是68天,最小值0天,最大值533天。绝大部分用户的购买周期都低于100天。
  • 复购率和回购率方面,复购率稳定在20%左右,回购率稳定在30%左右,前3个月因为有大量新用户涌入,而这批用户只购买了一次,所以导致复购率和回购率都比较低。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343