• 【毕业设计】健身房会员用户消费行为分析 - python 大数据



    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    前10行数据展示

    在这里插入图片描述

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

    在这里插入图片描述

    分析:

    • 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)
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

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

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

    在这里插入图片描述

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

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    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('人数')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

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

    在这里插入图片描述

    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('用户数')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    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会自动调整子图参数,使之填充整个图像区域
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    在这里插入图片描述

    4 最后

  • 相关阅读:
    论文阅读--深度学习基础文献
    springMvc24-Eclipse设置代码自动提示
    Codeforces Round #813 (Div. 2)
    C语言指针的详细概念
    游戏合作伙伴专题:BreederDAO 与 MonkeyLeague 的合作拉开序幕
    华为OD刷题C卷 - 每日刷题 7(字符串分隔(二)、欢乐的周末)
    【C++】手撕string(string的模拟实现)
    业内人士真心话:只会测试没有前途的,我慌了......
    DNS域名解析
    Hanoi塔问题
  • 原文地址:https://blog.csdn.net/caxiou/article/details/127844417