一、项目介绍:
1.1、公司业务简介:
黑色星期五是美国感恩节后一天,圣诞节前的一次大采购活动,当天一般美国商场会推出大量的打折优惠、促销活动, 由于美国的商场一般以红笔记录赤字,以黑笔记录盈利,而感恩节后的这个星期五人们疯狂的抢购使得商场利润大增,因此被商家们称作黑色星期五。 商家期望通过以这一天开始的圣诞大采购为这一年获得最多的盈利。
1.2、分析背景与目的:
本次的分析数据来自于Kaggle提供的某电商黑色星期五的销售记录, 主要围绕产品和用户两大方面展开叙述,为电商平台制定策略提供分析及建议。
二、数据字典与维度
三、分析思路与流程
3.1导入模块并读取数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df=pd.read_csv('BlackFriday.csv')
3.2数据概况分析
查看数据信息
df.info()
合计537577条数据,Product_Category_2和Product_Category_3虽存在缺失值数据,但并不影响后续的分析,不做特殊处理。
3.3单变量与图表分析
(1)整体消费情况
(2)用户角度分析
性别方面
df_gender_purchase=df.groupby("Gender").agg({"Purchase":"sum"}).reset_index().rename(columns={"Purchase":"Purchase_amount"})
df_gender_purchase["gender_purchase_prop"]=df_gender_purchase.apply(lambda x:x[1]/df["Purchase"].sum(),axis=1)
def Gender_user_count(x):
if x[0]=="F":
return (df.loc[df["Gender"]=="F"].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
if x[0]=="M":
return (df.loc[df["Gender"]=="M"].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
df_gender_purchase["gender_user_count"]=df_gender_purchase.apply(lambda x:Gender_user_count(x),axis=1)
df_gender_purchase["gender_customer_price"]=df_gender_purchase.apply(lambda x:x[1]/x[3],axis=1)
df_gender_purchase["gender_count_prop"]=df_gender_purchase.apply(lambda x:x[3]/df.drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count(),axis=1)
df_gender_purchase
在黑色星期五的活动中,男性是占据了71%的用户,将近是女性的2.5倍;但是贡献了将近76%的销售额,是女生的3.3倍;显然是有更多的男性参与这个活动,并且客单价还是较高于女性, 所以应该针对男性用价格较高的产品来推销
年龄方面
df_age_purchase=df.groupby("Age").agg({"Purchase":"sum"}).reset_index().rename(columns={"Purchase":"Purchase_amount"})
df_age_purchase["Age_purchase_prop"]=df_age_purchase.apply(lambda x:x[1]/df["Purchase"].sum(),axis=1)
def Age_user_count(x):
for i in df["Age"].drop_duplicates():
if x[0]==i:
return (df.loc[df["Age"]==i].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
df_age_purchase["Age_user_count"]=df_age_purchase.apply(lambda x:Age_user_count(x),axis=1)
df_age_purchase["Age_customer_price"]=df_age_purchase.apply(lambda x:x[1]/x[3],axis=1)
df_age_purchase["Age_count_prop"]=df_age_purchase.apply(lambda x:x[3]/df.drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count(),axis=1)
df_age_purchase
消费人数和金额主要集中在18-45这个年龄阶段,几乎贡献了近80%的销售额,其中26-35年龄段,无论消费者人数和消费金额都是最多的,这是应该重点推销商品的用户
婚姻方面
df_Marital_purchase=df.groupby("Marital_Status").agg({"Purchase":"sum"}).reset_index().rename(columns={"Purchase":"Purchase_amount"})
df_Marital_purchase["Marital_purchase_prop"]=df_Marital_purchase.apply(lambda x:x[1]/df["Purchase"].sum(),axis=1)
def Marital_user_count(x):
if x[0]==0:
return (df.loc[df["Marital_Status"]==0].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
if x[0]==1:
return (df.loc[df["Marital_Status"]==1].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
df_Marital_purchase["Marital_user_count"]=df_Marital_purchase.apply(lambda x:Marital_user_count(x),axis=1)
df_Marital_purchase["Marital_customer_price"]=df_Marital_purchase.apply(lambda x:x[1]/x[3],axis=1)
df_Marital_purchase["Marital_count_prop"]=df_Marital_purchase.apply(lambda x:x[3]/df.drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count(),axis=1)
df_Marital_purchase
不结婚的人在销售金额、参与活动数量方面是比已经结婚的高出40%
职业方面
df_Occupation_purchase=df.groupby("Occupation").agg({"Purchase":"sum"}).reset_index().rename(columns={"Purchase":"Purchase_amount"})
df_Occupation_purchase["Occupation_purchase_prop"]=df_Occupation_purchase.apply(lambda x:x[1]/df["Purchase"].sum(),axis=1)
def Occupation_user_count(x):
for i in df["Occupation"].drop_duplicates():
if x[0]==i:
return (df.loc[df["Occupation"]==i].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
df_Occupation_purchase["Occupation_user_count"]=df_Occupation_purchase.apply(lambda x:Occupation_user_count(x),axis=1)
df_Occupation_purchase["Occupation_customer_price"]=df_Occupation_purchase.apply(lambda x:x[1]/x[3],axis=1)
df_Occupation_purchase["Occupation_count_prop"]=df_Occupation_purchase.apply(lambda x:x[3]/df.drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count(),axis=1)
df_Occupation_purchase.sort_values(by="Occupation_user_count",ascending=False)
df_Occupation_purchase.head(10)
4、0、7、1的人数占到了用户总人数的40%,这些职位应该是我们关注的对象
(3)地域角度分析
df_City_Category_purchase["Marital_purchase_prop"]=df_City_Category_purchase.apply(lambda x:x[1]/df["Purchase"].sum(),axis=1)
def City_Category_user_count(x):
if x[0]=="A":
return (df.loc[df["City_Category"]=="A"].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
if x[0]=="B":
return (df.loc[df["City_Category"]=="B"].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
if x[0]=="C":
return (df.loc[df["City_Category"]=="C"].drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count())
df_City_Category_purchase["City_Category_user_count"]=df_City_Category_purchase.apply(lambda x:City_Category_user_count(x),axis=1)
df_City_Category_purchase["City_Category_customer_price"]=df_City_Category_purchase.apply(lambda x:x[1]/x[3],axis=1)
df_City_Category_purchase["City_Category_count_prop"]=df_City_Category_purchase.apply(lambda x:x[3]/df.drop_duplicates(subset=["User_ID"],keep="first")["User_ID"].count(),axis=1)
df_City_Category_purchase
C 城市的参与活动的用户量占总的53%,但是贡献销售额仅仅占了32%,相反B城市是占的总用户量的28%确贡献了41%的销售额,并且AB城市的客单价是分别是C城市的近似2倍。我们大致能够猜测到AB城市的消费水品较高,下次举办活动的时候,可以对AB城市的价格适当提高。C城市可以适当降低价格,通过提高销售量来提高销售额
(4)产品角度分析
销售额Top10产品
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)
df_amount10
销售量Top10产品
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
销量与销售额在Top10中的产品
pd.merge(df_amount10,df_count10,left_on='Product_ID',right_on='Product_ID',how='inner')
计算销售额Top10产品占比
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.head()
四、总结
(1)用户的角度
结论汇总:
年龄在26-35岁,职业编号为"4","0","7","1"的未婚男性消费人群属于高消费人群,是该平台的忠实用户。
后续改进:
1.对高价值用户重点关注,进行更精细化的营销,后续为这些高价值用户提供更多的高价值消费品。
2.针对其他的用户,主要引导用户点击购买,多推荐一些热销的商品。
(2)产品的角度
结论汇总:
1.黑色星期五期间,一级商品分类的5、1、8的销量、销售额都是排在前3,而且最受用户欢迎的商品top10中也有这3类商品,这3类商品贡献了72%的销售额。
2.销量排名最低的三个商品种类是16、11、12,占比都不到0.3%。
3.尽管C城市用户量占总的53%,但是贡献销售额仅仅占了32%,相反B城市是占总用户量的28%却贡献了41%的销售额,且AB城市的客单价是分别是C城市的近似2倍。可见B城市消费水平高,盈利高。
后续改进:
1.可以在最受用户欢迎的商品top10的商品和其他一些相关的商品做一些捆绑销售,带动其他商品的销量;在一级商品分类为5、1、8的商品页面推荐一些其他的商品,引导用户去点击购买。
2.具体再分析下销量排名最低的三个商品种类是什么原因造成的,如果商品种类16、11、12是一些已经淘汰过时的商品或者被一些该商品的替代品占领了市场,可以考虑是否要下架,减少相关渠道的广告等。
3.仓库管理需按畅销商品名单、分类,安排库存,对于消费旺盛B城市需提前备货,节省调度;同时监控库存,防止断货。