• 淘宝母婴购物数据分析


    一、数据集概述

    ​ 今天我们来看一个来着阿里云天池的数据集:淘宝母婴购物数据,有两个csv文件:

    mum_baby.csv

    mum_baby_trade_history.csv

    1、mum_baby.csv

    它包含了953个孩子的生日和性别信息,这些信息是由淘宝或天猫的消费者提供的。

    描述
    user_id用户 ID (Bigint).
    birthdayChildren’s birthday (e.g. 20130423).
    genderChildren’s gender (“0” 女, “1” 男, “2” 未知).
    2、mum_baby_trade_history.csv

    该表包含29971条淘宝用户的历史交易信息。

    描述
    ID (Bigint).
    user_id用户ID (Bigint).
    auction_id购买行为编号ID (Bigint).
    cat_idCategory ID (Bigint). 类别ID
    cat1Root category ID (Bigint). 根类别ID
    propertyProperty of the corresponding item (String). 对应项的属性
    buy_mountPurchase quantity (Bigint). 采购量
    dayTimestamp.
    3、分析方向

    1.什么商品类别销量最佳?

    2.用户为之购买商品的婴儿年龄、性别分布?

    3.销量与月份关系?

    4.用户复购情况?

    二、数据预处理

    以时间段较长的奶粉为例.

    对配方奶粉的分段,主要是根据国际食品法典委员会制定的cac来进行划分。

    婴幼儿奶粉现在大范围上基本分为一段、二段、三段,部分婴幼儿奶粉可能会分为四段、五段。

    奶粉分段及适用年龄:

    ​ 第1段婴幼儿奶粉适合0~6个月的宝宝;

    ​ 第2段婴幼儿奶粉适合6~12个月的宝宝;

    ​ 第3段婴幼儿奶粉适合1周岁~3周岁的宝宝;

    ​ 第4段奶粉适合3周岁~7周岁的孩子。

    7周岁最多为365*7=2555天,那么对于天数大于2560天的天数视为无效数据,删除行。

    import pandas as pd
    
    mum_baby = pd.read_csv('.\data\mum_baby.csv')
    trade_history = pd.read_csv('.\data\mum_baby_trade_history.csv')
    
    # 计算订单产生时小孩的天数
    # 匹配mum_baby中user_id对应的trade_history的user_id
    tample = mum_baby.merge(trade_history, how="left", on='user_id').fillna(0)
    
    tample['birthday'] = pd.to_datetime(tample['birthday'].astype(str))
    tample['day'] = pd.to_datetime(tample['day'].astype(str))
    age_days = tample['day'] - tample['birthday'] 
    tample.loc[:, 'age_days'] = age_days  # 计算订单产生时小孩的天数
    print(tample.age_days)
    # 把age_days 只保留数字部分 
    j = 0
    for i in age_days:
        tample.loc[j, 'age_days'] = i.days
        # tample['age_days'][j] = i.days   警告:SettingWithCopyWarning:  A value is trying to be set on a copy of a slice from a DataFrame
        j += 1
    # age_days为object类型  要改为int类型  不然describe无法统计年龄天数的最值
    tample.age_days = pd.DataFrame(tample.age_days, dtype=int)
    
    # tample.describe().to_excel(r'.\result\describe.xlsx')  
    # 对于age的天数负数以及最大天数为10326天、购买数量最大值达到160天,可以做处理,也可以认为是正常数据不做处理
    tample[tample['age_days'] > 2560].sort_values('age_days').to_excel(r'.\data\age_days_gt7year.xlsx')
    tample[tample['age_days'] < 0].sort_values('age_days').to_excel(r'.\data\age_days_lt0year.xlsx')
    
    # print(tample[tample['age_days'] < 0].describe())
    # 一般认为怀孕了再准备母婴用品会比较常见 这里 我们就以-300天以上为正常  去掉低于-300天的购买数据
    # print(tample[tample['age_days'] > 2560]) #一共24行
    # print(tample[tample['age_days'] < 0]) #143行
    # print(tample[tample['age_days'] > 2560].index)
    tample.drop(tample[tample['age_days'] > 2560].index, inplace=True)  # 删除大于2560天的行 在原始对象上修改
    tample.drop(tample[tample['age_days'] < -300].index, inplace=True)  # 删除低于-300天的行
    # 查看购买数量   七七八八的加起来50以内还算正常   达到160偏差有点不一般  还是删了吧
    # tample.sort_values('buy_mount', ascending=False).to_csv(r'.\data\new_trade_history.csv')
    tample.drop(tample[tample['buy_mount'] > 50].index, inplace=True)
    print(tample.describe())
    tample.to_csv(r'.\data\new_trade_history.csv')
    
    • 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

    三、数据可视化

    0、导入包和数据
    import pandas as pd
    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    
    trade_history = pd.read_csv(r'.\data\new_trade_history.csv')
    mum_baby_trade_history = pd.read_csv(r'.\data\mum_baby_trade_history.csv')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1、消费者行为分析
    print(mum_baby_trade_history.groupby('cat1').sum())  # 查看根类别cat1 #[6 rows x 7 columns]
    result1 = pd.pivot_table(mum_baby_trade_history, index='cat1', values='buy_mount', aggfunc=np.sum)
    plt.figure(figsize=(7, 5))
    plt.bar(x=['28', '38', '50008168', '50014815', '50022520', '122650008'],
            height=result1['buy_mount'])
    plt.title("cat1类别销量")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    请添加图片描述

    ​ 由图可知,商品编号为28的销量最高,而50014815次之,而122650008的销量最低,应对此现状提高或减少生产量或者加大宣传力度。

    2、不同性别用户的销售情况
    data = pd.pivot_table(trade_history, index='gender', values='buy_mount', aggfunc=np.sum)
    print(data)
    plt.figure(figsize=(5, 5))
    plt.pie(['718', '544', '43'],
            labels=['女', '男', '未知'],
            colors=['r', 'b', 'g'],
            autopct='%.2f%%')
    plt.title("性别与购买数量的销售关系")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    请添加图片描述

    ​ 由图可知,婴幼儿为女孩的销售量较女孩更大一些,而未出生购买商品的用户占比很小,所以应该加大用户家婴幼儿是女孩的推广力度以及产品制造。

    3、不同性别购买商品种类的关系
    data = pd.pivot_table(trade_history, index='cat1',
                             columns='gender',
                             values='buy_mount',
                             aggfunc=np.sum)
    plt.figure(figsize=(12, 5))
    plt.subplot(221)
    plt.bar(x=['28', '38', '50008168', '50014815', '50022520', '122650008'],
            height=data[0], color='r')
    plt.subplot(222)
    plt.bar(x=['28', '38', '50008168', '50014815', '50022520', '122650008'],
            height=data[1], color='b')
    plt.subplot(223)
    plt.bar(x=['28', '38', '50008168', '50014815', '50022520', '122650008'],
            height=data[2], color='g')
    plt.xlabel("商品种类")
    plt.ylabel("销售数量")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    请添加图片描述

    4、销量与月份关系
    mum_baby_trade_history["day"] = mum_baby_trade_history['day'].apply(lambda x:datetime.datetime.strptime(str(x),"%Y%m%d"))
    mum_baby_trade_history['Month'] = mum_baby_trade_history.day.astype('datetime64[M]')  # 设置成月份形式
    print(mum_baby_trade_history)
    data_month = mum_baby_trade_history.groupby('Month', as_index=False)  # 按月份分类
    data_month.buy_mount.sum()  # 按月份汇总
    df = data_month.buy_mount.sum()  # 新建汇总列表
    plt.figure(figsize=(20, 5))
    plt.plot(df["Month"], df["buy_mount"])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    请添加图片描述

    	分析波峰:在每年的10到11月份左右会有一个大波峰,每年的5月以及9月左右会有一个小波峰,在这段时间销量较同期会有一个明显的涨幅
    
    • 1

    推测1:节日因素,在5月有劳动节,母亲节;9月有中秋节;而是10月到11月左右有国庆节、万圣节、立冬、感恩节等节日,平台在这些节日可能绘有促销打折,这时随着价格降低需求量会增加,同时销售量也会增加。
    推测2:双十一打折力度高,淘宝双十一是从2009年开始便存在的大型购物促销狂欢日,而又伴随着即将到来的春节假期,顾客可能进行囤货,结合两个因素导致需求量大幅上升,所以在11月前会出现一个大型的销量波峰。
    结论:在5月与9月以及11月需要加大供货量,保证供需平衡。

    分析波谷:每年的1月左右会出现一个明显的销量波谷,说明这段时间的销量较同期低。
    推测:1月份正值春节,店铺休息,而开着的店铺肯定会抬高物价,而用户在11月进行囤货所以导致1月份的需求量减小,出现销量波谷。
    结论:1月销量惨淡,需要考虑减少进货量的问题,适当降低物价拓宽销售渠道加大宣传力度。

    5.用户复购率分析
    data_du = mum_baby_trade_history[mum_baby_trade_history.duplicated('user_id')]  # 查看复购数据
    print(data_du.info())
    
    • 1
    • 2
    
    Int64Index: 27 entries, 6527 to 29192
    Data columns (total 7 columns):
     #   Column      Non-Null Count  Dtype 
    ---  ------      --------------  ----- 
     0   user_id     27 non-null     int64 
     1   auction_id  27 non-null     int64 
     2   cat_id      27 non-null     int64 
     3   cat1        27 non-null     int64 
     4   property    25 non-null     object
     5   buy_mount   27 non-null     int64 
     6   day         27 non-null     int64 
    dtypes: int64(6), object(1)
    memory usage: 1.7+ KB
    None
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    sale_fu = pd.pivot_table(data_du,index='cat1',values='buy_mount',aggfunc=np.sum)
    print(sale_fu)
    
    • 1
    • 2
              buy_mount
    cat1               
    28                8
    38                4
    50008168         19
    50014815          2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    plt.figure(figsize=(5,5))
    plt.bar(x=['50014815','38','28','50008168'],
            height=['2','4','8','19'])
    ax = plt.gca()
    ax.set_xlabel("商品分类")
    ax.set_ylabel("销量")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    请添加图片描述

    ​ 共29971条订单记录而复购率仅为0.09%,用户粘性差,可能由于多种原因共同导致,其中可能包括产品质量差,客服服务态度差,售后保障差等多种原因。商家必须要仔细查找更多原因来保证后续提高销售质量,提高用户的复购率。
    height=[‘2’,‘4’,‘8’,‘19’])
    ax = plt.gca()
    ax.set_xlabel(“商品分类”)
    ax.set_ylabel(“销量”)
    plt.show()

    
    [外链图片转存中...(img-q6KNOYAN-1661584155935)]
    
    
    
    ​		共29971条订单记录而复购率仅为0.09%,用户粘性差,可能由于多种原因共同导致,其中可能包括产品质量差,客服服务态度差,售后保障差等多种原因。商家必须要仔细查找更多原因来保证后续提高销售质量,提高用户的复购率。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    PHP接口自动化测试框架实现
    Python课程设计之俄罗斯方块
    QT+OSG/osgEarth编译之四十:blend2d+Qt编译(一套代码、一套框架,跨平台编译,版本:blend2d-beta18)
    数说故事×北拓资本:AI技术与数据产业的未来展望
    freertos定时器任务运行流程()
    Java项目:台球室计费管理系统(java+SSM+JSP+HTML+JavaScript+mysql)
    关于这半年,我在干些什么,有一些想和你分享的话题
    什么是简单网络管理协议(SNMP)
    C++——类和对象(了解面向过程和面向对象、初步认识类和对象、类大小的计算、this指针)
    Job 和 DaemonSet
  • 原文地址:https://blog.csdn.net/c_lanxiaofang/article/details/126558342