zoukankan      html  css  js  c++  java
  • 会员消费行为分析

    会员消费行为分析

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

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

     

     

  • 相关阅读:
    Leetcode 15 3Sum
    Leetcode 383 Ransom Note
    用i个点组成高度为不超过j的二叉树的数量。
    配对问题 小于10 1.3.5
    字符矩阵的旋转 镜面对称 1.2.2
    字符串统计 连续的某个字符的数量 1.1.4
    USACO twofive 没理解
    1002 All Roads Lead to Rome
    USACO 5.5.1 求矩形并的周长
    USACO 5.5.2 字符串的最小表示法
  • 原文地址:https://www.cnblogs.com/cxiaolong/p/15377634.html
Copyright © 2011-2022 走看看