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