某网站用户的消费趋势及行为分析

2019-05-14  本文已影响0人  Runningbetter

该数据来源于某网站的消费记录,现针对该数据对用户的消费趋势及消费行为进行分析。
链接:https://pan.baidu.com/s/17I7JN579RZS6zvsJCWHOug 提取码:ydqa

主要内容:

1、导入第三方库及数据、观察数据、修改数据类型
2、用户消费的趋势分析

3、用户个体消费分析

4、用户消费行为分析

5、复购率和回购率分析

1、导入第三方库及数据、观察数据、修改数据类型

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
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(r'C:\Users\f\Desktop\shujufenxi\CDNOW_master.txt',names=columns,sep='\s+')
df.head()
image.png

其中各个字段的含义如下:
•user_id:用户id
•order_dt:每笔订单生成的日期
•order_products:每笔订单中所包含的商品数
•order_amount:每笔订单的消费总额

df.describe()
image.png
df.info()
各字段的数据类型.png
df['order_dt']=pd.to_datetime(df.order_dt,format='%Y%m%d')
df['month']=df.order_dt.values.astype('datetime64[M]')
df.head()
image.png
df.info()
image.png

2、用户消费的趋势分析

每月的消费总金额及其变化趋势

思路:设置图标格式>>对月份进行分组>>对每个月的消费金额求和>>制图

plt.style.use('ggplot')
df.groupby('month')['order_amount'].sum().plot()
image.png
每月的消费次数及其变化趋势

思路:对月份进行分组>>求得每个月进行消费的用户总数>>制图

df.groupby('month').user_id.count().plot()
image.png
每月的消费人数

思路:对月份进行分组>>运用匿名函数对用户id去重并计算个数>>制图

df.groupby('month').user_id.apply(lambda x:len(x.drop_duplicates())).plot.pie(autopct='%.2f%%')
image.png
每月用户平均消费金额的趋势
df.pivot_table(index='month',
              values=['order_products','order_amount','user_id'],
              aggfunc={'order_products':'sum',
                      'order_amount':'sum',
                      'user_id':'count'}).head()
image.png

思路:对‘月份’及‘用户id’进行分组求和>>去掉表中的索引打平>>再按月份进行分组>>对每月的消费金额求平均>>制图

df.groupby(['month','user_id']).sum().reset_index().groupby('month')['order_amount'].mean().plot()
image.png
每月用户平均消费次数的趋势

思路:对‘月份’和‘用户id’进行分组计数>>去除索引打平并将其命名为‘user_c’的表>>在‘user_c’表中添加一列‘count’,让这一列的值等于‘order_products’列的值>>在‘user_c’表中对月份进行分组并对‘count’求平均值>>制图

user_c=df.groupby(['month','user_id']).count().reset_index()
user_c['count']=user_c['order_products']
user_c.loc[:,['month','user_id','count']].groupby('month')['count'].mean().plot()
image.png

3、用户个体消费分析

用户消费金额、消费次数的描述统计

思路:对用户id进行分组求和

df.groupby('user_id').sum().describe()
image.png
用户消费金额的分布图

思路:对用户id进行分组求和>>对‘order_amount’列中小于1100的值进行制图

df.groupby('user_id').sum().query('order_amount<1100').order_amount.plot.hist(bins=25)
image.png
用户消费的商品数的分布图

思路:对用户id进行分组求和>>对‘order_products’列中小于60的值进行制图

df.groupby('user_id').sum().query('order_products < 60').order_products.plot.hist(bins=35)
image.png
用户消费金额和商品数的散点图

思路:对用户id进行分组>>以‘order_amount’为x轴,以‘order_products’为y轴>>制图

df.groupby('user_id').sum().plot.scatter(x='order_amount',y='order_products')
image.png
df.groupby('user_id').sum().query('order_amount <4000').plot.scatter(x='order_amount',y='order_products')
image.png

4、用户消费行为分析

用户第一次消费及最后一次消费

思路:以用户id进行分组>>求出每个用户第一次消费的时间>>制图

df.groupby('user_id').order_dt.min().value_counts().plot()
image.png

思路:以用户id进行分组>>求出每个用户最后一次消费的时间>>制图

df.groupby('user_id').max().order_dt.value_counts().plot()
image.png
用户购买周期

1)多少客户仅消费了一次
思路:对用户id进行分组>>分别求得用户购买商品第一次和最后一次的消费时间>>求出两次时间都为同一天的用户的总数

user_life=df.groupby('user_id').order_dt.agg(['min','max'])
(user_life.loc[:,'min']==user_life.loc[:,'max']).value_counts()
image.png
(user_life['max']-user_life['min']).describe()
image.png
((user_life['max']-user_life['min'])/np.timedelta64(1,'D')).hist(bins=20)
image.png
#除去只消费一天的用户数
user_life['a0']=(user_life['max']-user_life['min'])/np.timedelta64(1,'D')
user_life.loc[user_life['a0']>0]['a0'].hist(bins=20)
image.png
用户分层

1)RFM

rfm=df.pivot_table(index='user_id',
                  values=['order_products','order_amount','order_dt'],
                  aggfunc={'order_dt':'max',
                           'order_amount':'sum',
                           'order_products':'sum'})
rfm['R']=-(rfm.order_dt-rfm.order_dt.max())/np.timedelta64(1,'D')
rfm.rename(columns={'order_products':'F','order_amount':'M'},inplace=True)
def rfm_func(x):
    level1=x.apply(lambda x:'1' if x>= 0 else '0')
    lable=level1.R+level1.F+level1.M
    d={'111':'重要价值客户',
       '011':'重要保持客户',
       '101':'重要挽留客户',
       '001':'重要发展客户',
       '110':'一般价值客户',
       '010':'一般保持客户',
       '100':'一般挽留客户',
       '000':'一般发展客户'}
    result=d[lable]
    return result
rfm['lable']=rfm[['R','F','M']].apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
rfm.head()
image.png
rfm.groupby('lable').sum()
image.png
rfm.reset_index().groupby('lable')['user_id'].count().plot.pie(autopct='%.2f%%')
image.png

2)新客户、活跃客户、不活跃客户、回流客户

pivoted_counts=df.pivot_table(index='user_id',
                              columns='month',
                              values='order_dt',
                              aggfunc='count').fillna(0)
df_purchase=pivoted_counts.applymap(lambda x: 1 if x>0 else 0)
def active_status(data):
    status=[]
    for i in range(18):
        #若本月没有消费
        if data[i] ==0:
            if len(status) > 0:
                if status[i-1] == '未注册':
                    status.append('未注册')
                else:
                    status.append('不活跃')
            else:
                status.append('未注册')
        #若本月有消费
        else:
            if len(status) ==0:
                status.append('新客户')
            else:
                if status[i-1] == '不活跃':
                    status.append('回流')
                elif status[i-1] == '未注册':
                    status.append('新客户')
                else:
                    status.append('活跃')
    data.iloc[0:]=status
    return data
purchase_stats=df_purchase.apply(active_status,axis=1)
purchase_stats.tail()
image.png
purchase_stats_ct=purchase_stats.replace('unreg',np.NaN).apply(lambda x:pd.value_counts(x))
purchase_stats_ct.T.fillna(0).head()
image.png
purchase_stats_ct.T.fillna(0).plot.area()
image.png

5、复购率和回购率分析

1)复购率
purchase_r=pivoted_counts.applymap(lambda x: 1 if x>1 else np.NaN if x==0 else 0)
(purchase_r.sum()/purchase_r.count()).plot(figsize=(10,4))
image.png
2)回购率
def purchase_back(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)
    data.iloc[0:]=status
    return data
purchase_b=df_purchase.apply(purchase_back,axis=1)
(purchase_b.sum()/purchase_b.count()).plot(figsize=(10,4))
image.png
上一篇下一篇

猜你喜欢

热点阅读