zoukankan      html  css  js  c++  java
  • 5-python数据分析-用户对于购买商品的行为分析

    加载数据

    数据来源阿里天池:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649

    数据信息:

    数据量级达到一亿,考虑到电脑性能问题,故随机抽样其中的100万左右数据作为本次分析的原始数据.

    import numpy as np
    import pandas as pd
    import time
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    behavior = pd.read_csv('./电商用户行为案例数据/UserBehaviorSample.csv', engine='python')
    # 删除没用的'Unnamed: 0'列
    behavior.drop(labels='Unnamed: 0',axis=1, inplace=True)
    # 设置列索引
    behavior.columns = ['user_id','item_id','category_id','behavior_type','timestamp']
    

    查看是否存在重复的行数据

    behavior.duplicated(keep='first').sum()
    0

    无重复数据

    查看列中是否存在缺失数据

    behavior.isnull().any(axis=0)
    
    user_id          False
    item_id          False
    category_id      False
    behavior_type    False
    timestamp        False
    dtype: bool

    无缺失数据

    将时间戳转换为时间序列类型

      time.strftime("%Y-%m-%d", time.localtime(1511572885))

    # 方式一   因为数据有异常时间导致无法转化我们用第二种
    def change_time(s):
        return time.strftime("%Y-%m-%d", time.localtime(s))
    behavior['timestamp'] = behavior['timestamp'].apply(change_time)
    
    # 方式二
    behavior['timestamp'] = pd.to_datetime(behavior['timestamp'],unit='s')
    behavior['timestamp'] = behavior['timestamp'].astype('datetime64[D]')
     

    添加一列为月份

    behavior['month'] = behavior['timestamp'].dt.month 
     

    查看数据的时间范围,如有异常值将其删除

      只保留2017-11-25到2017-12-3的数据

    # 通过数据最大值和最小值确定数据范围,发现有异常数据
    behavior['timestamp'].min(),behavior['timestamp'].max()
    (Timestamp('1920-10-09 00:00:00'), Timestamp('2025-10-24 00:00:00'))
    
    # 通过条件限定取出指定区间的数据并赋值给原数据,去掉异常数据
    behavior = behavior.loc[(behavior['timestamp'] > '2017-11-24') & (behavior['timestamp'] < '2017-12-4')]

    对所有用户的不同购买行为进行数量统计且求得不同购买行为的百分比,以柱状图进行展示

    # 对用户行为分组,分别求出去重后的用户四种行为数
    a = behavior.groupby(by='behavior_type')['user_id'].nunique()
    behavior_type
    buy      19667
    cart     50941
    fav      26115
    pv      489981
    Name: user_id, dtype: int64
    
    # 对用户行为分组,求去重后用户行为总数
    b = behavior.groupby(by='behavior_type')['user_id'].nunique().sum()
    586704
    
    # 求出各行为所占百分比
    s_persent = a / b * 100
    behavior_type
    buy      3.352116
    cart     8.682572
    fav      4.451137
    pv      83.514174
    Name: user_id, dtype: float64
    
    # 绘制柱状图
    plt.bar(s_persent.index, s_persent.values)
     

    发现用户点击量占据83.51%,而购买量仅占所有数据的3.35%,,用户从浏览到购买的转化率只有4.01%,那是什么原因导致的转化率低呢?

    分析出每个用户对商品的不同行为

    # 采用one-hot编码,将用户行为变如下格式
    one_hot_df = pd.get_dummies(behavior['behavior_type'])
    
    # 通过级联将原数据中的user_id和item_id列与one-hot合并,得到用户商品行为表
    user_item_behavior_df = pd.concat((behavior[['user_id','item_id']], one_hot_df), axis=1)
     

    分析出每个用户对商品的不同行为次数的汇总

    # 获取各个用户的行为和
    pv_sum = user_item_behavior_df.groupby('user_id')['pv'].sum()
    buy_sum = user_item_behavior_df.groupby('user_id')['buy'].sum()
    cart_sum = user_item_behavior_df.groupby('user_id')['cart'].sum()
    fav_sum = user_item_behavior_df.groupby('user_id')['fav'].sum()
    
    # 汇总,这里需要将表转置,否者很难看
    user_behavior_total = DataFrame(data=[pv_sum,buy_sum,cart_sum,fav_sum]).T
     

    通过用户对商品的不同行为次数的汇总表求得各个行为的总数

    # 点击量:所有用户的总点击量
    user_behavior_total['pv'].sum()  
    885741
    
    # 点击-购买:用户点击后无加购和收藏的情况下直接参与购买的行为统计
    user_behavior_total.query('pv > 0 & buy > 0 & cart == 0 & fav == 0').shape[0]
    9854
    
    # 点击-加购:点击后,无收藏情况下的加购行为
    user_behavior_total.query('pv > 0 & buy == 0 & cart > 0 & fav == 0').shape[0]
    30268
    
    # 点击-加购-购买:点击后无收藏情况下的加购和购买行为
    user_behavior_total.query('pv > 0 & buy > 0 & cart > 0 & fav == 0').shape[0]
    927
    
    # 点击-收藏:点击后,无加购情况下的收藏行为
    user_behavior_total.query('pv > 0 & buy == 0 & cart == 0 & fav > 0').shape[0]
    15959
    
    # 点击-收藏-购买:点击后,无加购情况下的收藏和购买行为
    user_behavior_total.query('pv > 0 & buy > 0 & cart == 0 & fav > 0').shape[0]
    405
    
    # 点击-收藏-加购:点击后的收藏和加购行为
    user_behavior_total.query('pv > 0 & buy == 0 & cart > 0 & fav > 0').shape[0]
    1006
    
    # 点击-收藏-加购-购买:点击后的收藏架构和购买的行为
    user_behavior_total.query('pv > 0 & buy > 0 & cart > 0 & fav > 0').shape[0]
    41
    
    # 点击-流失:点击后无购买无加购无收藏的行为
    user_behavior_total.query('pv > 0 & buy == 0 & cart == 0 & fav == 0').shape[0]
    431521
    • 直接购买转化率:点击--购买 / 点击量
    • 加购购买转换率:点击--加购+购买 / 点击--加购
    • 收藏购买转换率:点击--收藏--购买 / 点击--收藏
    • 加购收藏购买转换率:点击--加购+收藏--购买 / 点击--加购+收藏
    • 流失率:点击--流失 / 点击量

    直接购买转化率低于加购和收藏等行为之后的综合转换率,因此需要从产品交互界面、营销机制等方面让用户去多加购,多收藏。

    转化率低的原因分析

    • 提出假设:推荐机制不合理,给用户推荐的都是不喜欢的商品,造成转化率低
      • 这里可以通过分析高浏览量商品与高购买量商品之间是否存在高度重合,如果是的,那就说明推荐的商品是用户喜欢,假设就不成立,如果不是则证明假设成立。

     分析出点击量前10的商品

    # user_item_behavior_df.groupby(by='item_id')['pv'].sum().sort_values().tail(10)
    pv_sum_item_10 = user_item_behavior_df.groupby(by='item_id')['pv'].sum().sort_values(ascending=False)[:10]
    pv_sum_item_10
    
    item_id
    812879     285.0
    3845720    245.0
    138964     211.0
    2032668    195.0
    2338453    193.0
    1591862    191.0
    59883      176.0
    1535294    176.0
    3031354    172.0
    3371523    171.0
    Name: pv, dtype: float64

    购买量前10的商品

    buy_sum_item_10 = user_item_behavior_df.groupby(by='item_id')['buy'].sum().sort_values(ascending=False)[:10]
    buy_sum_item_10
    
    item_id
    3031354    9
    3189426    9
    2560262    9
    3122135    8
    5062984    8
    3964583    8
    4011044    7
    222342     7
    740947     7
    1397311    7
    Name: buy, dtype: uint8

    查看点击量高且购买量也高的商品类别个数

    # append级联俩表,求索引重复存在的就是点击量高且购买量也高的商品
    pv_sum_item_10.append(buy_sum_item_10).index.value_counts()
    
    3031354    2
    1397311    1
    3189426    1
    4011044    1
    2560262    1
    3964583    1
    5062984    1
    222342     1
    59883      1
    812879     1
    740947     1
    1535294    1
    138964     1
    2338453    1
    1591862    1
    3122135    1
    3845720    1
    2032668    1
    3371523    1
    Name: item_id, dtype: int64

    计算点击量前10的商品的购买量

    pv_10_buy_list = []
    for index in pv_sum_item_10.index:
        pv_buy_sum = user_item_behavior_df.loc[user_item_behavior_df['item_id']==index]['buy'].sum()
        dic = {
            'item_id': index,
            'pv_buy_sum': pv_buy_sum,
        }
        pv_10_buy_list.append(dic)
    
    [{'item_id': 812879, 'pv_buy_sum': 2},
     {'item_id': 3845720, 'pv_buy_sum': 2},
     {'item_id': 138964, 'pv_buy_sum': 0},
     {'item_id': 2032668, 'pv_buy_sum': 2},
     {'item_id': 2338453, 'pv_buy_sum': 1},
     {'item_id': 1591862, 'pv_buy_sum': 0},
     {'item_id': 59883, 'pv_buy_sum': 0},
     {'item_id': 1535294, 'pv_buy_sum': 5},
     {'item_id': 3031354, 'pv_buy_sum': 9},
     {'item_id': 3371523, 'pv_buy_sum': 0}]

    计算购买量前10的点击量

    buy_10_pv_list = []
    for index in buy_sum_item_10.index:
        buy_pv_sum = user_item_behavior_df.loc[user_item_behavior_df['item_id']==index]['pv'].sum()
        dic = {
            'item_id': index,
            'buy_pv_sum': buy_pv_sum,
        }
        buy_10_pv_list.append(dic)
    
    [{'item_id': 3031354, 'buy_pv_sum': 172},
     {'item_id': 3189426, 'buy_pv_sum': 40},
     {'item_id': 2560262, 'buy_pv_sum': 86},
     {'item_id': 3122135, 'buy_pv_sum': 27},
     {'item_id': 5062984, 'buy_pv_sum': 37},
     {'item_id': 3964583, 'buy_pv_sum': 62},
     {'item_id': 4011044, 'buy_pv_sum': 13},
     {'item_id': 222342, 'buy_pv_sum': 30},
     {'item_id': 740947, 'buy_pv_sum': 66},
     {'item_id': 1397311, 'buy_pv_sum': 9}]

    总结:可以看出点击量高的购买量不一定高,推荐的商品顾客并不喜欢购买,由于高浏览量并没有带来购买,所以转化率低。

  • 相关阅读:
    LeetCode 453 Minimum Moves to Equal Array Elements
    LeetCode 112 Path Sum
    LeetCode 437 Path Sum III
    LeetCode 263 Ugly Number
    Solutions and Summay for Linked List Naive and Easy Questions
    AWS–Sysops notes
    Linked List
    All About Linked List
    datatable fix error–Invalid JSON response
    [转]反编译c#的相关问题
  • 原文地址:https://www.cnblogs.com/wgwg/p/13332549.html
Copyright © 2011-2022 走看看