黑色星期五是美国感恩节后一天,圣诞节前的一次大采购活动,当天一般美国商场会推出大量的打折优惠、促销活动。商家期望通过以这一天开始的圣诞大采购为这一年获得最多的盈利。
本次的分析数据来自于Kaggle提供的某电商黑色星期五的销售记录, 将围绕产品和用户两大方面展开叙述,为电商平台制定策略提供分析及建议。
分析主要框架:
- import matplotlib.pyplot as plt
- import numpy as np
- import pandas as pd
-
- # print 显示不全问题
- np.set_printoptions(threshold=np.inf)
- pd.set_option('display.width', 300) # 设置字符显示宽度
- pd.set_option('display.max_rows', None) # 设置显示最大行
- pd.set_option('display.max_rows', 10) # 设置显示最大行
- pd.set_option('display.max_columns', None) # 设置显示最大列,None为显示所有列
-
- plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
- plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
- # ==数据集内容==
- # User_ID:用户ID
- # Product_ID:产品ID
- # Gender:性别
- # Age:年龄
- # Occupation:职业
- # City_Category:城市(A,B,C)
- # Stay_In_Current_City_Years:居住时长
- # Marital_Status:婚姻状况
- # Product_Category_1:产品类别1,是一级分类
- # Product_Category_2:产品类别2,是二级分类
- # Product_Category_3:产品类别3,是三级分类
- # Purchase:金额(美元)
- """
- """
- # 数据集导入
- df = pd.read_csv("BlackFriday.csv")
- # 数据初步了解
- print(df.head())
- df.info()
- # 通过查看数据,发现Product_Category_2与Product_Category_3缺失数据较多。
- # Product_Category_2:缺失31%的数据
- # Product_Category_3:缺失69%的数据
- # 查看数据缺失情况
- # print((df.shape[0]-df.count(axis=0))/df.shape[0])
-
- """
- 2、整体消费情况
- """
- df['Purchase'].sum()
- # (1)销售额: 总的消费金额是50亿美元
- df['Product_ID'].count()
- # (2)销量: 总的销量是537577件
- df['Purchase'].sum() / df['Product_ID'].count()
- # (3)单件产品平均销售额: 平均每件商品的单件是9333美元
- df['Product_ID'].drop_duplicates(keep='first').count()
- # (4)商品种类统计: 总共有3623件不同的商品参加黑五活动
- df['User_ID'].drop_duplicates(keep='first').count()
- # (5)消费人数统计: 总共有5891位用户参加黑五活动
- df['Purchase'].sum() / df['User_ID'].drop_duplicates(keep='first').count()
- # (6)客单价: 平均客单价为851751美元
- """
- 小结:
- 从销售记录来看,参加黑五活动的大客户居多,平均客单价高达85万美元,累计贡献50亿美元的销售额。
- 对于电商行业,抓住忠实用户并促进他们消费,可以带来巨大的利润。
- """
-
- """
- 3、用户画像分析
- """
-
- # (1)性别因素: 不同性别的消费金额,消费数量及平均消费额情况
- # 对性别分类,求个性别消费金额【1】及各性别人数【2】
- df_gender_purchase = df.groupby("Gender").agg({"Purchase": "sum", "User_ID": pd.Series.nunique}).reset_index().rename(
- columns={"Purchase": "Purchase_amount", "User_ID": "gender_user_count"})
- # 计算各性别的消费金额占比【3】
- df_gender_purchase["gender_purchase_prop"] = df_gender_purchase.apply(lambda x: x[1] / df["Purchase"].sum(), axis=1)
- # 金额/人数,男女性别分别人均消费【4】
- df_gender_purchase["gender_customer_price"] = df_gender_purchase.apply(lambda x: x[1] / x[2], axis=1)
- # 男女人数/总人数求得男女人数的占比【5】
- df_gender_purchase["gender_count_prop"] = df_gender_purchase.apply(lambda x: x[2] / df["User_ID"].nunique(), axis=1)
- # 不同性别的用户占比
- df_gender_purchase["gender_count_prop5"] = df_gender_purchase.apply(
- lambda x: x[2] / df.drop_duplicates(subset=["User_ID"], keep="first")["User_ID"].count(), axis=1)
- print(df_gender_purchase)
-
- # 在黑色星期五的活动中,男性是占据了71%的用户,贡献了将近76%的销售额,且客单价还是较高于女性,可重点针对男性进行推销
- # 绘制性别占比饼状图
- plt.figure(figsize=(15, 10))
- plt.pie(df_gender_purchase.gender_user_count, labels=['女性', '男性'], colors=['#FF69B4', '#87CEFA'], autopct='%1.1f%%',
- explode=[0.05, 0.01])
- # 标题
- plt.title('不同性别用户数占比')
- # plt.show()
-
- """
- 上述可以发现,黑五活动中:
- 男性用户量明显高于女性,占比达71%,女性仅28%,男性为女性的2.5倍;
- 男性用户的销售额占比76%,为女性23%的3.3倍;
- 男性客单价也高于女性,为女性的1.3倍
- 由此可见黑五活动很可能是针对男性为主要销售对象
- """
-
- """
- 3)不同职业的消费金额,消费数量及平均消费额情况
- """
- # 对职业分组,求不同职业的消费总额,以及人数【1】【2】
- df_Occupation_purchase = df.groupby("Occupation").agg(
- {"Purchase": "sum", "User_ID": pd.Series.nunique}).reset_index().rename(
- columns={"Purchase": "Purchase_amount", "User_ID": "Occupation_user_count"})
- # 职业别消费总额 / 销售总额,求得各职业的消费额占比【3】
- df_Occupation_purchase["Occupation_purchase_prop"] = df_Occupation_purchase.apply(lambda x: x[1] / df["Purchase"].sum(),
- axis=1)
- # 职业消费总额 / 职业消费人数,求得职业人均消费【4】
- df_Occupation_purchase["Occupation_customer_price"] = df_Occupation_purchase.apply(lambda x: x[1] / x[2], axis=1)
- # 职业的消费人数 / 总消费人数,求得职业消费人数占比
- df_Occupation_purchase["Occupation_count_prop"] = df_Occupation_purchase.apply(lambda x: x[2] / df["User_ID"].nunique(),
- axis=1)
- # 根据职业消费人数进行倒序排列
- df_Occupation_purchase.sort_values(by="Occupation_user_count", ascending=False, inplace=True)
- print(df_Occupation_purchase)
- """
- 销量前20%的职业为“4”,“0”,“7”,“1”,这四类职业贡献了约45%的销量及销售额。这些职业是后续重点关注的对象
- """
- # 绘制不同岗位与用户数量条形图
- plt.figure(figsize=(15, 10))
- plt.barh(list(df_Occupation_purchase['Occupation']), df_Occupation_purchase['Occupation_user_count'], color='#87CEFA')
- plt.yticks(df_Occupation_purchase['Occupation'])
- # 横纵坐标标签
- plt.xlabel('用户数量')
- plt.ylabel('岗位类别')
- # plt.show()
-
- """
- 4)不同婚姻状态的消费金额,消费数量及平均消费额情况
- """
- # 对结婚情况分类,求个状态的消费金额【1】及个状态人数【2】
- df_Marital_purchase = df.groupby("Marital_Status").agg(
- {"Purchase": "sum", "User_ID": pd.Series.nunique}).reset_index().rename(
- columns={"Purchase": "Purchase_amount", "User_ID": "Marital_user_count"})
- # 用个状态消费金额 / 总消费金额,求得个状态的消费占比【3】
- df_Marital_purchase["Marital_purchase_prop"] = df_Marital_purchase.apply(lambda x: x[1] / df["Purchase"].sum(), axis=1)
- # 各状态消费金额/个状态人数,求得各状态人均消费情况【4】
- df_Marital_purchase["Marital_customer_price"] = df_Marital_purchase.apply(lambda x: x[1] / x[2], axis=1)
- # 各状态人数 / 总人数,求得个状态人数占比【5】
- df_Marital_purchase["Marital_count_prop"] = df_Marital_purchase.apply(lambda x: x[2] / df["User_ID"].nunique(), axis=1)
- print(df_Marital_purchase)
- # ?未结婚的人贡献销售额及销量均比结婚后的人贡献的高约20%
-
-
- """
- 3. 产品销售情况分析
- """
- # 1)销售额Top10的产品情况、
- # 根据产品分组,求各产品被购买的次数,销售总额,同时根据销售总额降序排列,选取Top10,只选取"Product_ID","Purchase_amount"两列,
- df_amount10 = df.groupby("Product_ID").agg({"User_ID": "count", "Purchase": "sum"}).rename(
- columns={"Purchase": "Purchase_amount", "User_ID": "User_count"}).reset_index().sort_values(by=["Purchase_amount"],
- ascending=False)[
- ["Product_ID", "Purchase_amount"]].head(10)
- print(df_amount10)
-
- # 2)销量Top10的产品情况
- # 根据产品分组,求各产品被购买的次数,销售总额,同时根据销售总额降序排列,选取Top10,只选取"Product_ID","User_count"两列,
- df_count10 = df.groupby("Product_ID").agg({"User_ID": "count", "Purchase": "sum"}).rename(
- columns={"Purchase": "Purchase_amount", "User_ID": "User_count"}).reset_index().sort_values(by=["User_count"],
- ascending=False)[
- ["Product_ID", "User_count"]].head(10)
- df_count10
-
- # 3)销售量&销售额均在Top10的产品情况
- # 将销量Top10余销售总额Top10内连接,进而获取销量与销售额都在Top10的产品
- pd.merge(df_amount10, df_count10, left_on="Product_ID", right_on="Product_ID", how="inner")
-
- # 4) 销售额在Last10的产品情 况
- df_amount_last10 = df.groupby("Product_ID").agg({"User_ID": "count", "Purchase": "sum"}).rename(
- columns={"Purchase": "Purchase_amount", "User_ID": "User_count"}).reset_index().sort_values(by=["Purchase_amount"],
- ascending=False)[
- ["Product_ID", "Purchase_amount"]].tail(10)
- df_amount_last10["Purchase_amount_Prop"] = df_amount_last10.apply(lambda x: x[1] / df["Purchase"].sum(), axis=1)
- df_amount_last10
-
- # 5)产品一级子类销售情况
- # 根据产品类别一级分类进行分组,求得各产品的购买数量以及销售总额,并根据Purchase_amount排序,取Top10,只选取"Product_Category_1"子类,与"Purchase_amount"子类总销售金额列
- df_amount = df.groupby("Product_Category_1").agg({"User_ID": "count", "Purchase": "sum"}).rename(
- columns={"Purchase": "Purchase_amount", "User_ID": "User_count"}).reset_index().sort_values(by=["Purchase_amount"],
- ascending=False)[
- ["Product_Category_1", "Purchase_amount"]]
- # 一级分类的销售总额 / 所有产品的销售总额,求得各一级分类的销售额占比
- df_amount["Category_Prop"] = df_amount.apply(lambda x: x[1] / df["Purchase"].sum(), axis=1)
- df_amount
-
- # 6、最大贡献用户价值分析 (1)用户名单Top10
- # 以User_ID分组,计算消费金额,降序排列
- df_amount_user = df.groupby('User_ID').agg({'Purchase': 'sum'}).rename(
- columns={'Purchase': 'Purchase_amount'}).reset_index().sort_values(by=['Purchase_amount'], ascending=False)[
- ['User_ID', 'Purchase_amount']]
- # 计算不同User_ID的消费额占比
- df_amount_user['User_purchase_prop'] = df_amount_user.apply(lambda x: x[1] / df['Purchase'].sum(), axis=1)
- df_amount_user.head(10)
1、用户的角度
结论:职业代号为4、0、7,年龄在26-35岁的未婚男性属于高消费人群,是该电商平台的忠实用户。
建议:
2、产品的角度
3、城市的角度