• Black Friday案例分析


    一、背景介绍:

    黑色星期五是美国感恩节后一天,圣诞节前的一次大采购活动,当天一般美国商场会推出大量的打折优惠、促销活动。商家期望通过以这一天开始的圣诞大采购为这一年获得最多的盈利。

    二、分析目的:

    本次的分析数据来自于Kaggle提供的某电商黑色星期五的销售记录, 将围绕产品和用户两大方面展开叙述,为电商平台制定策略提供分析及建议。

    三、分析过程:

    三、主要分析框架

    分析主要框架:

    • 准备工作(观察数据集)
    • 整体消费情况(销售额、销量、消费人数、客单价等)
    • 用户画像分析(探究最有价值的用户类型:从性别、年龄、婚姻、职业四个角度分析)
    • 城市业绩分析(城市分布 、居住年限分布)
    • 产品分析(探究最有价值的产品/产品类别:销售额Top10的产品/产品类别、销量Top10的产品/产品类别)
    • 最大贡献用户价值分析(价值Top10用户清单,二八法则验证)

     

    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. import pandas as pd
    4. # print 显示不全问题
    5. np.set_printoptions(threshold=np.inf)
    6. pd.set_option('display.width', 300) # 设置字符显示宽度
    7. pd.set_option('display.max_rows', None) # 设置显示最大行
    8. pd.set_option('display.max_rows', 10) # 设置显示最大行
    9. pd.set_option('display.max_columns', None) # 设置显示最大列,None为显示所有列
    10. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    11. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
    12. # ==数据集内容==
    13. # User_ID:用户ID
    14. # Product_ID:产品ID
    15. # Gender:性别
    16. # Age:年龄
    17. # Occupation:职业
    18. # City_Category:城市(A,B,C)
    19. # Stay_In_Current_City_Years:居住时长
    20. # Marital_Status:婚姻状况
    21. # Product_Category_1:产品类别1,是一级分类
    22. # Product_Category_2:产品类别2,是二级分类
    23. # Product_Category_3:产品类别3,是三级分类
    24. # Purchase:金额(美元)
    25. """
    26. """
    27. # 数据集导入
    28. df = pd.read_csv("BlackFriday.csv")
    29. # 数据初步了解
    30. print(df.head())
    31. df.info()
    32. # 通过查看数据,发现Product_Category_2与Product_Category_3缺失数据较多。
    33. # Product_Category_2:缺失31%的数据
    34. # Product_Category_3:缺失69%的数据
    35. # 查看数据缺失情况
    36. # print((df.shape[0]-df.count(axis=0))/df.shape[0])
    37. """
    38. 2、整体消费情况
    39. """
    40. df['Purchase'].sum()
    41. # (1)销售额: 总的消费金额是50亿美元
    42. df['Product_ID'].count()
    43. # (2)销量: 总的销量是537577件
    44. df['Purchase'].sum() / df['Product_ID'].count()
    45. # (3)单件产品平均销售额: 平均每件商品的单件是9333美元
    46. df['Product_ID'].drop_duplicates(keep='first').count()
    47. # (4)商品种类统计: 总共有3623件不同的商品参加黑五活动
    48. df['User_ID'].drop_duplicates(keep='first').count()
    49. # (5)消费人数统计: 总共有5891位用户参加黑五活动
    50. df['Purchase'].sum() / df['User_ID'].drop_duplicates(keep='first').count()
    51. # (6)客单价: 平均客单价为851751美元
    52. """
    53. 小结:
    54. 从销售记录来看,参加黑五活动的大客户居多,平均客单价高达85万美元,累计贡献50亿美元的销售额。
    55. 对于电商行业,抓住忠实用户并促进他们消费,可以带来巨大的利润。
    56. """
    57. """
    58. 3、用户画像分析
    59. """
    60. # (1)性别因素: 不同性别的消费金额,消费数量及平均消费额情况
    61. # 对性别分类,求个性别消费金额【1】及各性别人数【2】
    62. df_gender_purchase = df.groupby("Gender").agg({"Purchase": "sum", "User_ID": pd.Series.nunique}).reset_index().rename(
    63. columns={"Purchase": "Purchase_amount", "User_ID": "gender_user_count"})
    64. # 计算各性别的消费金额占比【3】
    65. df_gender_purchase["gender_purchase_prop"] = df_gender_purchase.apply(lambda x: x[1] / df["Purchase"].sum(), axis=1)
    66. # 金额/人数,男女性别分别人均消费【4】
    67. df_gender_purchase["gender_customer_price"] = df_gender_purchase.apply(lambda x: x[1] / x[2], axis=1)
    68. # 男女人数/总人数求得男女人数的占比【5】
    69. df_gender_purchase["gender_count_prop"] = df_gender_purchase.apply(lambda x: x[2] / df["User_ID"].nunique(), axis=1)
    70. # 不同性别的用户占比
    71. df_gender_purchase["gender_count_prop5"] = df_gender_purchase.apply(
    72. lambda x: x[2] / df.drop_duplicates(subset=["User_ID"], keep="first")["User_ID"].count(), axis=1)
    73. print(df_gender_purchase)
    74. # 在黑色星期五的活动中,男性是占据了71%的用户,贡献了将近76%的销售额,且客单价还是较高于女性,可重点针对男性进行推销
    75. # 绘制性别占比饼状图
    76. plt.figure(figsize=(15, 10))
    77. plt.pie(df_gender_purchase.gender_user_count, labels=['女性', '男性'], colors=['#FF69B4', '#87CEFA'], autopct='%1.1f%%',
    78. explode=[0.05, 0.01])
    79. # 标题
    80. plt.title('不同性别用户数占比')
    81. # plt.show()
    82. """
    83. 上述可以发现,黑五活动中:
    84. 男性用户量明显高于女性,占比达71%,女性仅28%,男性为女性的2.5倍;
    85. 男性用户的销售额占比76%,为女性23%的3.3倍;
    86. 男性客单价也高于女性,为女性的1.3倍
    87. 由此可见黑五活动很可能是针对男性为主要销售对象
    88. """
    89. """
    90. 3)不同职业的消费金额,消费数量及平均消费额情况
    91. """
    92. # 对职业分组,求不同职业的消费总额,以及人数【1】【2】
    93. df_Occupation_purchase = df.groupby("Occupation").agg(
    94. {"Purchase": "sum", "User_ID": pd.Series.nunique}).reset_index().rename(
    95. columns={"Purchase": "Purchase_amount", "User_ID": "Occupation_user_count"})
    96. # 职业别消费总额 / 销售总额,求得各职业的消费额占比【3】
    97. df_Occupation_purchase["Occupation_purchase_prop"] = df_Occupation_purchase.apply(lambda x: x[1] / df["Purchase"].sum(),
    98. axis=1)
    99. # 职业消费总额 / 职业消费人数,求得职业人均消费【4】
    100. df_Occupation_purchase["Occupation_customer_price"] = df_Occupation_purchase.apply(lambda x: x[1] / x[2], axis=1)
    101. # 职业的消费人数 / 总消费人数,求得职业消费人数占比
    102. df_Occupation_purchase["Occupation_count_prop"] = df_Occupation_purchase.apply(lambda x: x[2] / df["User_ID"].nunique(),
    103. axis=1)
    104. # 根据职业消费人数进行倒序排列
    105. df_Occupation_purchase.sort_values(by="Occupation_user_count", ascending=False, inplace=True)
    106. print(df_Occupation_purchase)
    107. """
    108. 销量前20%的职业为“4”,“0”,“7”,“1”,这四类职业贡献了约45%的销量及销售额。这些职业是后续重点关注的对象
    109. """
    110. # 绘制不同岗位与用户数量条形图
    111. plt.figure(figsize=(15, 10))
    112. plt.barh(list(df_Occupation_purchase['Occupation']), df_Occupation_purchase['Occupation_user_count'], color='#87CEFA')
    113. plt.yticks(df_Occupation_purchase['Occupation'])
    114. # 横纵坐标标签
    115. plt.xlabel('用户数量')
    116. plt.ylabel('岗位类别')
    117. # plt.show()
    118. """
    119. 4)不同婚姻状态的消费金额,消费数量及平均消费额情况
    120. """
    121. # 对结婚情况分类,求个状态的消费金额【1】及个状态人数【2】
    122. df_Marital_purchase = df.groupby("Marital_Status").agg(
    123. {"Purchase": "sum", "User_ID": pd.Series.nunique}).reset_index().rename(
    124. columns={"Purchase": "Purchase_amount", "User_ID": "Marital_user_count"})
    125. # 用个状态消费金额 / 总消费金额,求得个状态的消费占比【3】
    126. df_Marital_purchase["Marital_purchase_prop"] = df_Marital_purchase.apply(lambda x: x[1] / df["Purchase"].sum(), axis=1)
    127. # 各状态消费金额/个状态人数,求得各状态人均消费情况【4】
    128. df_Marital_purchase["Marital_customer_price"] = df_Marital_purchase.apply(lambda x: x[1] / x[2], axis=1)
    129. # 各状态人数 / 总人数,求得个状态人数占比【5】
    130. df_Marital_purchase["Marital_count_prop"] = df_Marital_purchase.apply(lambda x: x[2] / df["User_ID"].nunique(), axis=1)
    131. print(df_Marital_purchase)
    132. # ?未结婚的人贡献销售额及销量均比结婚后的人贡献的高约20%
    133. """
    134. 3. 产品销售情况分析
    135. """
    136. # 1)销售额Top10的产品情况、
    137. # 根据产品分组,求各产品被购买的次数,销售总额,同时根据销售总额降序排列,选取Top10,只选取"Product_ID","Purchase_amount"两列,
    138. df_amount10 = df.groupby("Product_ID").agg({"User_ID": "count", "Purchase": "sum"}).rename(
    139. columns={"Purchase": "Purchase_amount", "User_ID": "User_count"}).reset_index().sort_values(by=["Purchase_amount"],
    140. ascending=False)[
    141. ["Product_ID", "Purchase_amount"]].head(10)
    142. print(df_amount10)
    143. # 2)销量Top10的产品情况
    144. # 根据产品分组,求各产品被购买的次数,销售总额,同时根据销售总额降序排列,选取Top10,只选取"Product_ID","User_count"两列,
    145. df_count10 = df.groupby("Product_ID").agg({"User_ID": "count", "Purchase": "sum"}).rename(
    146. columns={"Purchase": "Purchase_amount", "User_ID": "User_count"}).reset_index().sort_values(by=["User_count"],
    147. ascending=False)[
    148. ["Product_ID", "User_count"]].head(10)
    149. df_count10
    150. # 3)销售量&销售额均在Top10的产品情况
    151. # 将销量Top10余销售总额Top10内连接,进而获取销量与销售额都在Top10的产品
    152. pd.merge(df_amount10, df_count10, left_on="Product_ID", right_on="Product_ID", how="inner")
    153. # 4) 销售额在Last10的产品情 况
    154. df_amount_last10 = df.groupby("Product_ID").agg({"User_ID": "count", "Purchase": "sum"}).rename(
    155. columns={"Purchase": "Purchase_amount", "User_ID": "User_count"}).reset_index().sort_values(by=["Purchase_amount"],
    156. ascending=False)[
    157. ["Product_ID", "Purchase_amount"]].tail(10)
    158. df_amount_last10["Purchase_amount_Prop"] = df_amount_last10.apply(lambda x: x[1] / df["Purchase"].sum(), axis=1)
    159. df_amount_last10
    160. # 5)产品一级子类销售情况
    161. # 根据产品类别一级分类进行分组,求得各产品的购买数量以及销售总额,并根据Purchase_amount排序,取Top10,只选取"Product_Category_1"子类,与"Purchase_amount"子类总销售金额列
    162. df_amount = df.groupby("Product_Category_1").agg({"User_ID": "count", "Purchase": "sum"}).rename(
    163. columns={"Purchase": "Purchase_amount", "User_ID": "User_count"}).reset_index().sort_values(by=["Purchase_amount"],
    164. ascending=False)[
    165. ["Product_Category_1", "Purchase_amount"]]
    166. # 一级分类的销售总额 / 所有产品的销售总额,求得各一级分类的销售额占比
    167. df_amount["Category_Prop"] = df_amount.apply(lambda x: x[1] / df["Purchase"].sum(), axis=1)
    168. df_amount
    169. # 6、最大贡献用户价值分析 (1)用户名单Top10
    170. # 以User_ID分组,计算消费金额,降序排列
    171. df_amount_user = df.groupby('User_ID').agg({'Purchase': 'sum'}).rename(
    172. columns={'Purchase': 'Purchase_amount'}).reset_index().sort_values(by=['Purchase_amount'], ascending=False)[
    173. ['User_ID', 'Purchase_amount']]
    174. # 计算不同User_ID的消费额占比
    175. df_amount_user['User_purchase_prop'] = df_amount_user.apply(lambda x: x[1] / df['Purchase'].sum(), axis=1)
    176. df_amount_user.head(10)

    结论与建议:

    1、用户的角度
    结论:职业代号为4、0、7,年龄在26-35岁的未婚男性属于高消费人群,是该电商平台的忠实用户。
    建议:

    • 重点关注高价值用户,进行更精细化的营销,后续为这些高价值用户提供更多的高价值消费品;
    • 针对其他用户,可以多推荐一些热销的爆款产品,引导用户点击购买。
       

    2、产品的角度

    • 结论:
    • 黑五活动期间,产品类别(一级分类)为1、5、8的产品,销量和销售额都是top3,这3类产品总销量达到75%,贡献了73%的销售额;
    • 销售额排名末三位的产品类别为17、12、13,累计贡献的销售额不到0.3%;
    • 销量排名末三位的产品类别14、17、19,总销量仅占0.4%左右。
      建议:
    • 对于销售额top10的产品和销售量top10的产品,可利用爆款产品陈列位置为其他产品引流,比如与其他产品做捆绑销售,带动其他产品的销量。最受用户欢迎的产品类别是1、5、8,在这些产品的页面推荐一些其他产品,引导用户去点击购买;
    • 还要具体分析下产品类别14、17、19在销量排行榜上位居末三位的原因,如果它们是一些已经淘汰过时的产品,又或者是被替代品占领了市场,可以考虑是否要下架,减少相关渠道的广告等。

    3、城市的角度

    • 结论:B城市贡献的销售额最高,而C城市的消费人数最多。
      建议:
    • 最受欢迎的产品类别是1、5、8,仓库管理需按照畅销产品的分类、名单安排库存,对于消费旺盛的B城市提前备货,节省调度;同时监控库存,防止断货。
    • 对于C城市,可以开展更大力度的折扣活动,提升销量以增加销售额。


     

  • 相关阅读:
    C++ 逻辑运算符
    【Linux初阶】认识冯诺依曼结构
    Java游戏服务器开发之概念扫盲
    一不小心晋级“CCF国际AIOps挑战赛”决赛?
    Spring MVC统一异常处理的3种方式(附带实例)
    JDK动态代理实现原理以及手写实现JDK动态代理
    《golang设计模式》第二部分·结构型模式-06-享元模式(Flyweight)
    Binary Number Encoding and Arithmetic
    加速迈入云原生时代,国产数据库行业要变天
    tiup cluster template
  • 原文地址:https://blog.csdn.net/qq_22473611/article/details/126334276