会员消费行为分析

会员消费行为分析

项目描述:本项目是线下门店数据,来自于知名全国连锁健身俱乐部的会员数据。我将会带你根据用户个体行为,对复购率、回购率、用户分层、回流用户、活跃用户、用户生命周期等多维度指标进行深入分析

import pymysql
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
db_info = {
    'host':'192.168.1.80',
    'user':'admin',
    'password':'123',
    'database':'management_systems',  # 这里说明我要连接哪个库
    'charset':'utf8'
}
conn = pymysql.connect(**db_info)
cursor = conn.cursor()
sql = 'select * from customer'
data = pd.read_sql(sql,conn)
data.head()

 

## 索引重新设置
data = data.set_index('id')
data.head()

## 修改列名
data.columns = ['用户id','订单时间','订单数量','订单金额']
data.head()

 

data.describe()

 

data.info()

 

# 修改字段属性
data['订单时间'] = data['订单时间'].astype('datetime64')
data['订单数量'] = data['订单数量'].astype('int')
data['订单金额'] = data['订单金额'].astype('int')
data.info()

 

data.head()

 

data.describe()

 

user_group = data.groupby('用户id').sum()
user_group.head()

 

user_group.describe()

 

data['月份'] = data['订单时间'].dt.month
data.head()

 

font = {
    "family":"SimHei",
    "size":20
}
plt.rc('font',**font)
plt.figure(figsize=(20,5))
plt.plot(data.groupby('月份')['订单金额'].sum())
plt.xlabel('月份')
plt.ylabel('消费金额')
plt.title('不同月份的用户消费金额')

 

d = data.groupby('月份')['订单数量'].sum()
plt.figure(figsize=(20,5))
plt.plot(d)
plt.xlabel('月份')
plt.ylabel('商品个数')
plt.title('不同月份的商品购买量')

 

plt.figure(figsize=(20,5))
data.groupby('月份')['用户id'].count().plot()
plt.xlabel('月份')
plt.ylabel('消费次数')
plt.title('不同月份的消费次数')

 

plt.figure(figsize=(20,5))
data.groupby('月份')['用户id'].nunique().plot()
plt.xlabel('月份')
plt.ylabel('消费人数')
plt.title('不同月份的消费人数')

 

 个体行为分析

data.groupby('用户id').sum().head()

 

plt.figure(figsize=(20,5))
user_consume = data.groupby('用户id').sum()
plt.scatter(user_consume['订单数量'], user_consume['订单金额'])
plt.xlabel('购买产品个数')
plt.ylabel('消费金额')
plt.title('用户消费金额和购买产品个数的关系')

 

consume_products = user_consume['订单数量']
consume_amount = user_consume['订单金额']

fig = plt.figure(figsize=(20,5))
fig.add_subplot(1,2,1)
plt.hist(consume_products)
plt.title('用户购买数量分布')
plt.xlabel('购买数量')
plt.ylabel('人数')


fig.add_subplot(1,2,2)
plt.hist(consume_amount)
plt.title('用户购买金额分布')
plt.xlabel('购买金额')
plt.ylabel('人数')

 

# 计算首月消费
data.groupby('用户id')['月份'].min().value_counts()

 

plt.figure(figsize=(20,5))
d = data.groupby('用户id')['月份'].min().value_counts()
d.sort_index(inplace=True)
plt.plot(d)
plt.title('第一次消费人数和时间')
plt.xlabel('第一次消费时间')
plt.ylabel('人数')

 

复购和回购

## 统计用户消费次数
pivoted_counts = data.pivot_table(index='用户id', columns='月份',values='订单时间',aggfunc='count').fillna(0)
pivoted_counts

 

pivoted_counts.transf = pivoted_counts.applymap(lambda x: 1 if x > 1 else np.NaN if x ==0 else 0)
pivoted_counts.transf.head()

 

# 每月复购率
plt.figure(figsize=(20,5))
month_counts_reorder_rate = pivoted_counts.transf.sum()/pivoted_counts.transf.count()
plt.plot(month_counts_reorder_rate)
plt.title('每月用户复购率')
plt.xlabel('月份')
plt.ylabel('百分比')

 

a,b = plt.subplots(figsize=(20,5))
b.plot(pivoted_counts.transf.count())
b.plot(pivoted_counts.transf.sum())
legends = ['消费人数','二次消费以上的人数']
b.legend(legends)

plt.title('每月消费和二次消费用户数')
plt.xlabel('月份')
plt.ylabel('用户数')

 

RFM

user_rfm = data.pivot_table(index='用户id'
                           ,values=['订单时间','订单数量','订单金额']
                           ,aggfunc={'订单时间':'max', '订单数量':'count', '订单金额':'sum'})
user_rfm.head()

 

# R:最近一次消费我们假设计算时间为2021-1-1
user_rfm['最近一次消费'] = (pd.to_datetime('2021-01-01 00:00:00')-user_rfm['订单时间'])/np.timedelta64(1,'D')
user_rfm['最近一次消费']

user_rfm = user_rfm.rename(columns={'最近一次消费':"R", '订单数量':"F", '订单金额':"M"})
user_rfm.head()

 

def rfm_func(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

user_rfm['label'] = user_rfm[['R',"F",'M']].apply( lambda x:x-x.mean()).apply(rfm_func,axis=1)
user_rfm.head(10)

 

user_rfm.groupby('label').count()

 

plt.figure(figsize=(20,10))
plt.pie(user_rfm.groupby('label').count()['F']
       ,labels=['一般保持客户','一般发展客户','潜在客户','重点保持客户','重点发展用户','重点挽留客户','高价值客户']
       ,autopct='%.2f%%'
       ,explode=(0,0,0,0.1,0.3,0.3,0.5))
plt.title('用户分层占比')
plt.show()

 

 

posted @ 2021-10-07 23:27  Dragon、  阅读(392)  评论(0编辑  收藏  举报