• 会员消费行为分析


    会员消费行为分析

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

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

     

     

  • 相关阅读:
    派生类的构造函数
    继承和派生
    自增自减运算符的重载(强制类型转换运算符重载)
    流插入和流提取运算符的重载
    动态数组类的设计
    函数的返回值
    赋值运算符的重载
    运算符重载
    常量对象函数引用和参数传递
    理解ASP.NET MVC的路由系统
  • 原文地址:https://www.cnblogs.com/cxiaolong/p/15377634.html
Copyright © 2020-2023  润新知