文章目录
- 1 简介
- 2 数据集
- 3 数据处理
- 3.1 数据类型转换
- 3.2 数据分析-月度总趋势分析
- 3.3 数据分析-用户个体行为分析
- 3.4 回购率分析
- 3.5 数据分析-用户行为中层分析
- 3.5.1 RFM分层
- 4 最后
1 简介
🔥 Hi,大家好,这里是丹成学长的毕设系列文章!
🔥 对毕设有任何疑问都可以问学长哦!
这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是
🚩 大数据分析:健身平台会员用户消费行为分析
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:4分
- 工作量:4分
- 创新点:3分
🧿 选题指导, 项目分享:
https://gitee.com/yaa-dc/BJH/blob/master/gg/cc/README.md
2 数据集
数据集来源于某健身房2019年3月至2020年2月会员消费购买行为,数据集一共包含四个字段:用户ID,购买日期,购买数量和购买金额。属于非常典型的消费行为数据集。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt#导入库及所需的包
from datetime import datetime
plt.rc('font', family='SimHei', size=18)# 显示中文标签
plt.style.use ('ggplot')#设定绘图风格
df=pd.read_excel(r"D:\PycharmProjects\data\cuscapi.xls", order_dt=['date'])# 数据加载
df.head(10)
前10行数据展示
pd.set_option('display.float_format', lambda x: '%.2f' % x)
df.describe()
分析:
- 1.会员用户平均每笔订单购买1.5个商品,标准差为在0.9,波性较小 。中位数在1个商品,75分位数在2个产品,说明绝大订单的购买量都不多。
- 2.平均每笔订单消费金额为22.9元,标准差约为95,中位数在20,平均数大于中位数。大多数会员消费金额集中在小额,小部分用户贡献大额消费,符合消费类数据的二八分布。
- 3.一般而言,消费类数据的分布都是长尾分布。
3 数据处理
3.1 数据类型转换
#提取月份
df['order_dt']=df['order_dt'].dt.date
df['month']=df['order_dt'].astype('datetime64[M]')
df.head(10)
3.2 数据分析-月度总趋势分析
df.groupby('month').order_amount.sum().plot()
plt.xlabel('月份')
plt.ylabel('消费金额(元)')
plt.title('不同月份的用户消费金额',fontsize=20)
df.groupby('month').order_products.sum().plot()
plt.xlabel('月份')
plt.ylabel('商品个数')
plt.title('不同月份的产品购买量',fontsize=20)
3.3 数据分析-用户个体行为分析
user_consume=df.groupby('user_id').sum()
plt.scatter(user_consume['order_products'], user_consume['order_amount'] )
plt.xlabel('消费产品个数')
plt.ylabel('消费金额')
plt.title('用户消费金额与产品个数的关系散点图',fontsize=20)
consume_products = user_consume['order_products']
consume_amount= user_consume['order_amount']
fig= plt.figure(figsize=(10.,6))
fig.add_subplot(1,2,1)
consume_products.hist(bins=10 )
plt.title('用户购买数量分布直方图')
plt.xlabel('购买数量')
plt.ylabel('人数')
fig.add_subplot(1,2,2)
consume_amount.hist(bins=10)
plt.title('用户购买金额分布直方图')
plt.xlabel('购买金额')
plt.ylabel('人数')
df.groupby('user_id').month.min().value_counts().plot()
plt.title('第一次消费会员数和时间拆线图')
plt.xlabel('首购时间')
plt.ylabel('会员数')
a,b=plt.subplots(figsize=(10,6))
b.plot(pivoted_counts.transf.count())
b.plot(pivoted_counts.transf.sum())
legends=['消费人数','二次消费以上用户人数']
b.legend(legends)
plt.title('每月消费和二次消费以上用户人数')
plt.xlabel('时间(月)')
plt.ylabel('用户数')
3.4 回购率分析
#回购率是某一个时间窗口内消费的用户,在下一个时间窗口仍旧消费的占比。比如1月消费用户1000,他们中有300个2月依然消费,回购率是30%。
pivoted_amount=df.pivot_table(index='user_id',columns='month',values='order_amount',aggfunc='mean').fillna(0)
columns_month=df.month.dt.date.sort_values().unique()
pivoted_amount.columns=columns_month
pivoted_amount.head()
3.5 数据分析-用户行为中层分析
3.5.1 RFM分层
user_rfm=df.pivot_table(index='user_id',values=['order_dt','order_products','order_amount'],aggfunc={'order_dt':'max','order_products':'count','order_amount':'sum'})
user_rfm.head()
user_rfm['period']=(user_rfm.order_dt.max()-user_rfm.order_dt)/np.timedelta64(1,'D')
user_rfm=user_rfm.rename(columns={'period':'R','order_products':'F','order_amount':'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()
from matplotlib import font_manager as fm #字体管理器
from matplotlib import cm#
proptease = fm.FontProperties()
proptease.set_size('medium')
labelindex =user_rfm.groupby('label').count().index
labelvalues =user_rfm.groupby('label')['M'].count().tolist()
s = pd.Series(labelvalues, index=labelindex )
labels = s.index
sizes = s.values
explode = (0,0,0,0,0.1,0.1,0.2) # only "explode" the 1st slice
fig, axes = plt.subplots(1,2,figsize=(10,6))
ax1,ax2 = axes.ravel()#结合ravel()函数列出所有子图
colors = cm.rainbow(np.arange(len(sizes))/len(sizes))# # 随机生成颜色
# patches:饼片。texts:分类标签的文本列表。autotexts:百分比部分的文本列表
patches, texts, autotexts = ax1.pie(sizes, labels=labels, autopct='%1.0f%%',explode=explode,
shadow=False, startangle=170, colors=colors, labeldistance=1.2,pctdistance=1.05, radius=0.4)
ax1.axis('equal')#将饼图显示为正圆形
plt.setp(texts, fontproperties=proptease)
# 设置百分比文本样式
for i in autotexts:
i.set_size('large')
ax1.set_title('用户分层结构饼状图', loc='center')
ax2.axis('off')#关闭所有坐标轴线、刻度标记和标签
ax2.legend(patches, labels, loc='center left',fontsize=10)
plt.tight_layout()#tight_layout会自动调整子图参数,使之填充整个图像区域
4 最后