import pymysql
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
连接SQL数据库
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模型
- R: 最近一次消费
- F: 消费频率
- M: 消费金额
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()