文章目录

  • 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行数据展示

Python如何设计会员等级 python不同会员消费买单_用户消费行为分析

pd.set_option('display.float_format', lambda x: '%.2f' % x)
df.describe()

Python如何设计会员等级 python不同会员消费买单_python_02

分析:

  • 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)

Python如何设计会员等级 python不同会员消费买单_python_03

3.2 数据分析-月度总趋势分析

df.groupby('month').order_amount.sum().plot()
plt.xlabel('月份')
plt.ylabel('消费金额(元)')
plt.title('不同月份的用户消费金额',fontsize=20)

Python如何设计会员等级 python不同会员消费买单_数据分析_04

df.groupby('month').order_products.sum().plot()
plt.xlabel('月份')
plt.ylabel('商品个数')
plt.title('不同月份的产品购买量',fontsize=20)

Python如何设计会员等级 python不同会员消费买单_数据分析_05

Python如何设计会员等级 python不同会员消费买单_Python如何设计会员等级_06


Python如何设计会员等级 python不同会员消费买单_python_07

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)

Python如何设计会员等级 python不同会员消费买单_大数据_08

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('人数')

Python如何设计会员等级 python不同会员消费买单_大数据_09

df.groupby('user_id').month.min().value_counts().plot()
plt.title('第一次消费会员数和时间拆线图')
plt.xlabel('首购时间')
plt.ylabel('会员数')

Python如何设计会员等级 python不同会员消费买单_Python如何设计会员等级_10

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('用户数')

Python如何设计会员等级 python不同会员消费买单_python_11

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()

Python如何设计会员等级 python不同会员消费买单_数据分析_12


Python如何设计会员等级 python不同会员消费买单_用户消费行为分析_13

Python如何设计会员等级 python不同会员消费买单_用户消费行为分析_14

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会自动调整子图参数,使之填充整个图像区域

Python如何设计会员等级 python不同会员消费买单_Python如何设计会员等级_15

4 最后