数据蛙强化课程第二期数据分析

CD网站数据用户行为分析

2019-05-02  本文已影响0人  执小生

本文所用数据链接:
https://pan.baidu.com/s/1fJ5qvNF3GNVgj85WzbEVjA
提取码:133c
  • 本文分析的主要框架:
    1、平台整体消费情况
    2、各月份消费差异分析
    3、用户消费情况分析
    4、用户消费行为分析
    5、用户分层
    6、用户每月活动状态分析
    7、用户回购率、复购率、留存率分析

0数据集观察

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use('ggplot')
plt.rcParams['font.sans-serif']=['SimHei'] 
plt.rcParams['axes.unicode_minus']=False

Column=['user_id','order_dt','order_products','order_amount']
df=pd.read_csv(r'CDNOW_master.txt',encoding='gbk',sep='\s+',names=Column)
df.info()

原始数据共有4个字段,共69659行,数据比较完整没有缺失值,各字段含义比较简单:
df['order_dt']=pd.to_datetime(df.order_dt,format="%Y%m%d")
df['month']=df.order_dt.astype('datetime64[M]')
df.info()

再次通过df.info()查看字段信息,显然已经完成第一步数据清洗工作,接下来便可以对数据进行分析。

01整体消费情况

  • 描述统计分析,观察平台的整体消费规模,用户流量和平均消费能力,从而大致了解平台情况;

02各月份消费差异分析

  • 分析不同月份平台的消费总额、消费产品数、订单数、消费人数和客单价,从而发现月份消费差异;
group_month=df.groupby('month')
fig,axes=plt.subplots(1,4,figsize=(16,4))
axes0,axes1,axes2,axes3=axes.flatten()
# 每月销售金额
group_month.order_amount.agg('sum').plot(marker='o',ax=axes0)
axes0.set_title('每月消费金额')
axes0.set_ylabel('消费金额')
# 每月销售产品数
group_month.order_products.sum().plot(marker='o',ax=axes1)
axes1.set_title('每月销售产品数')
axes1.set_ylabel('销售产品数')
# 每月订单数
group_month.order_products.count().plot(marker='o',ax=axes2)
axes2.set_title('每月订单数')
axes2.set_ylabel('订单数')
group_month.user_id.unique().apply(lambda x:len(x)).plot(marker='o',ax=axes3)
axes3.set_title('每月客户数')
axes3.set_ylabel('客户数')
fig,axes=plt.subplots(2,1,figsize=(10,4))
axes0,axes1=axes.flatten()
# 每月客单价
group_month_pct=group_month.order_amount.sum()/group_month.user_id.unique().apply(lambda x:len(x))
group_month_pct.plot(marker='o',ax=axes0)
axes0.set_title('每月客单价')
axes0.set_ylabel('客单价')
# 每月件单价
group_month_up=group_month.order_amount.sum()/group_month.order_products.sum()
group_month_up.plot(ax=axes1,marker='o')
axes1.set_title('每月件单价')
axes1.set_ylabel('件单价')

03用户消费情况分析:

  • 用户消费情况分析:
    1、用户消费金额、消费次数和购买产品数量的描述统计;、
    2、用户关于消费金额、消费次数和购买产品数量的区间分布;
    3、用户消费金额和购买产品数量的回归分析;
    4、观察是否符合二八法则;
    从而了解用户整体消费水平和能力;
group_user=df.groupby('user_id')
group_user_des=group_user[['order_amount','order_products','order_dt',]].agg({"order_amount":'sum','order_products':'sum','order_dt':'count'}).describe()
group_user_des.rename(columns={'order_dt':'con_freq','order_amount':'con_amount','order_products':'num_of_pur'})
fig,axes=plt.subplots(1,3,figsize=(16,4))
axes0,axes1,axes2=axes.flatten()
# 用户消费金额的分布情况
group_user.sum().query('order_amount<1000').order_amount.plot.hist(bins=20,ax=axes0)
axes0.set_title('用户消费金额的分布情况')
axes0.set_xlabel('消费金额')
axes0.set_ylabel('人数')
# 用户消费次数的分布情况
group_user.sum().query('order_products<100').order_products.plot.hist(bins=20,ax=axes1)
axes1.set_title('用户消费次数的分布情况')
axes1.set_xlabel('消费次数')
axes1.set_ylabel('人数')
# 用户购买产品数量的分布情况
group_user.count().query('order_dt<20').order_dt.plot.hist(bins=20,ax=axes2)
axes2.set_title('用户购买产品数量的分布情况')
axes2.set_xlabel('购买产品数量')
axes2.set_ylabel('人数')
group_user.sum().query('order_amount<4000').plot.scatter(x='order_amount',y='order_products',title='用户消费金额与购买产品数量的散点图',figsize=(6,4))
group_user_cum=group_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum()/x.sum())
group_user_cum.reset_index().order_amount.plot(figsize=(6,4))
plt.title('用户消费金额占比')
plt.xlabel('用户数量')
plt.ylabel('消费金额占比')

04用户消费行为分析

  • 用户消费行为分析:
    1、用户第一次购买、最后一次购买的时间分布;
    2、用户购买周期的描述统计;
    3、用户生命周期的描述统计和分布;
group_user=df.groupby('user_id')
fig,axes=plt.subplots(1,2,figsize=(12,4))
axes0,axes1=axes.flatten()
# 用户第一次购买的时间分布
group_user.order_dt.min().value_counts().plot(ax=axes0)
axes0.set_title('用户第一次购买的时间分布')
axes0.set_ylabel('人数')
# 用户最后一次购买的时间分布
group_user.order_dt.max().value_counts().plot(ax=axes1)
axes1.set_title('用户最后一次购买的时间分布')
axes1.set_ylabel('人数')
group_user_diff=df.sort_values('order_dt').groupby('user_id').apply(lambda x:(x.order_dt-x.order_dt.shift())/np.timedelta64(1,'D'))
group_user_diff.describe()
group_user_lifecycle=group_user.order_dt.apply(lambda x:x.max()-x.min())/np.timedelta64(1,'D')
# 用户生命周期为0天的用户占比
len(group_user_lifecycle[group_user_lifecycle==0])/len(df.user_id.unique())
# 用户生命周期的分布(周期大于0天)
group_user_lifecycle[group_user_lifecycle>0].plot.hist(bins=20,rwidth=0.8)

05用户分层

  • 利用RFM模型对用户进行管理,抓住高价值用户,做好重点运营及维护;
rfm=group_user['order_products','order_amount'].sum()
rfm['R']=-(group_user.order_dt.max()-df.order_dt.max())/np.timedelta64(1,"D")
rfm.rename(columns={'order_products':'F','order_amount':'M'},inplace=True)
rfm=rfm[['R',"F",'M']]
def rfm_choose(x):
    feature=x.apply(lambda x:'1' if x> 0 else '0')
    model=feature.R+feature.F+feature.M
    dic={
        "111":"重要价值客户",
        '101':'重要发展客户',
        "011":"重要维护客户",
        '001':'重要挽留客户',
        '001':'重要挽留客户',
        '110':'一般价值客户',
        '100':'一般发展客户',
        '010':'一般维持客户',
        '000':'一般挽留客户',
    }
    return dic[model]

rfm['label']=rfm.apply(lambda x:x-x.mean()).apply(rfm_choose,axis=1)

fig,axes=plt.subplots(1,3,figsize=(14,4),sharey=True)
axes0,axes1,axes2=axes.flatten()
rfm_per=rfm.groupby('label').M.agg(['count','sum']).apply(lambda x :x/x.sum())
rfm_per['avg']=rfm_per['sum']/rfm_per['count']
# 用户分层人数占比
rfm_per['count'].plot.barh(ax=axes0)
axes0.set_title('用户分层人数占比')
axes0.set_xlabel('人数占比')
# 用户分层消费金额占比
rfm_per['sum'].plot.barh(ax=axes1)
axes1.set_title('用户分层消费金额占比')
axes1.set_xlabel('消费金额占比')

rfm_per['avg'].plot.barh(ax=axes2)
axes2.set_title('用户分层平均消费金额')
axes2.set_xlabel('平均消费金额')

06用户每月活动状态分析

  • 分新增、活跃、流失、回访对用户每月状态进行分析,得出用户活动指标;
pivot_user=df.pivot_table(index='user_id',columns='month',values='order_amount',aggfunc='count').fillna(0)
def status_choose(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)
pivot_user_status=pivot_user.apply(status_choose,axis=1)
pivot_user_status=pivot_user_status.apply(lambda x:x.value_counts()).fillna(0).T.drop('unreg',axis=1)
pivot_user_status.apply(lambda x:x/x.sum(),axis=1).plot.area()
plt.title('每月用户活动状态')
plt.ylabel('用户人数占比')
(pivot_user_status['return']/pivot_user_status['unactive'].shift()).plot()
plt.title('每月回流用户占比')
plt.ylabel('用户占比')

07用户复购率、回购率及留存率指标分析

  • 对用户回购率、复购率、留存率分析;
fig,axes=plt.subplots(1,2,figsize=(12,4))
axes0,axes1=axes.flatten()
# 用户每月复购率
repeated_purchase=pivot_user.applymap(lambda x:1 if x>1 else np.NaN if x==0 else 0)
repeated_purchase.apply(lambda x:x.sum()/x.count()).plot(ax=axes0)
axes0.set_title('用户每月复购率')
axes0.set_ylabel('复购率')

# 用户每月回购率
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])

buy_back=pivot_user.apply(buy_back_choose,axis=1)
buy_back.apply(lambda x:x.sum()/x.count()).plot(ax=axes1)
axes1.set_title('用户每月回购率')
axes1.set_ylabel('回购率')
# 按照用户第一次购买时间划分用户分组,然后给所有订单打上分组标签
df['grouped']=df.groupby('user_id').month.transform(lambda x:x.min())
# 求不同分组的用户在不同月的消费人数,购买的产品数量及消费金额
cohorts=df.groupby(['grouped','month']).agg({'user_id':'nunique','order_products':'sum','order_amount':'sum'})
# 给字段重新命名
cohorts.rename(columns={'user_id':'total_users','order_products':'total_products','order_amount':'total_amount'},inplace=True)
# 求每个群组的用户数
cohorts_size=cohorts.total_users.groupby(level=0).first()
cohorts.reset_index(inplace=True)
def make_period(data):
    data['period']=np.arange(len(data))+1
    return data
cohorts=cohorts.groupby('grouped').apply(make_period)
pivot_cohorts=cohorts.pivot_table(index='period',columns='grouped',values='total_users')
pivot_cohorts.apply(lambda x:x/x.max()).plot()
plt.title('不同群组的留存情况')
plt.ylabel('留存率')
上一篇下一篇

猜你喜欢

热点阅读