1.项目背景
黑色星期五是美国感恩节后一天,圣诞节前的一次大采购活动,当天一般美国商场会推出大量的打折优惠、促销活动, 由于美国的商场一般以红笔记录赤字,以黑笔记录盈利,而感恩节后的这个星期五人们疯狂的抢购使得商场利润大增,因此被商家们称作黑色星期五。 商家期望通过以这一天开始的圣诞大采购为这一年获得最多的盈利。
2.分析目的
数据来源kaggle,本次分析将围绕产品和用户两大方面展开叙述,为电商平台制定策略提供分析及建议。
3.分析过程
a.数据整理(观察数据集)
b.数据整体分析(销售金额,平均用户消费金额,平均产品单价等)
c.用户画像分析(从年龄,性别,婚姻状况,职业等方面探究最优价值客户类型)
d.城市纬度分析(从不同城市,居住年限等分析城市业绩)
e.产品纬度分析(探究最有价值的产品/产品类别:销售额Top10的产品/产品类别、销量Top10的产品/产品类别)
f.用户价值分析(价值Top10用户清单、用户贡献(百分之多少的用户贡献了百分之多少的销售额))
导入常用包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline
a.导入数据
df = pd.read_csv('BlackFriday.csv')#前面已经使用OS修改了路径,所以这里直接导入文件
查看数据信息
df.head()
df.info()
#查看数据缺失率
(df.shape[0]-df.count())/df.shape[0]
产品类别2的缺失率为31%左右
产品类别3的缺失率为69%左右
b.整体数据分析
小结:
1,产品平均单价在9333美元左右,
2,人均消费85万美元左右,都是大客户
3,总消费金额50亿美元
4,建议提高这些群体客户的粘性度
b,用户纬度分析
1,从年龄角度出发
#不同年龄段消费金额
user_age = df.groupby('Age').agg({'Purchase':'sum'}).reset_index().rename(columns = {'Purchase':'user_age_amount'})
#不同年龄段消费占比
user_age['user_age_prop'] = user_age.apply(lambda x:x[1]/df['Purchase'].sum(),axis=1)
#建立一个函数,循环取出每个年龄段人数
def con(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())
#不同年龄段人数
user_age['user_age_cons'] = user_age.apply(lambda x:con(x),axis=1)
#不同年龄段人数占比
user_age['age_cons_prop'] = user_age.apply(lambda x:x[3]/df['User_ID'].nunique(),axis=1)
#不同年龄段平均消费金额
user_age['user_age_avg'] = user_age.apply(lambda x:x[1]/x[3],axis=1)
user_age
18-45消费人数占总人数70%左右,消费金额占80%左右,其中以26-35占比最大
2,从性别角度出发
user_gender = df.groupby('Gender').agg({'Purchase':'sum'}).reset_index().rename(columns = {'Purchase':'user_gender_amount'})
#不同性别消费金额比例
user_gender['user_gender_prop'] = user_gender.apply(lambda x:x[1]/df['Purchase'].sum(),axis = 1)
#建立函数
def sex(x):
if x[0] == 'M':
return (df.loc[df['Gender'] == 'M'].drop_duplicates(subset = ['User_ID'])['User_ID'].count())
if x[0] == 'F':
return (df.loc[df['Gender'] == 'F'].drop_duplicates(subset = ['User_ID'])['User_ID'].count())
#不同性别人数
user_gender['user_gender_cons'] = user_gender.apply(lambda x:sex(x),axis=1)
#不同性别人数占比
user_gender['gender_cons_prop'] = user_gender.apply(lambda x:x[3]/df.drop_duplicates(subset = ['User_ID'])['User_ID'].count(),axis=1)
#不同性别人均消费金额
user_gender['gende_amount_prop'] = user_gender.apply(lambda x:x[1]/x[3],axis=1)
user_gender
男性人数占比70%,消费金额80%左右,客单价为女性的1.3倍左右,可以根据男性消费特征,做一些高价产品的推销
c,从职业角度分析
#不同职业消费金额
user_option = df.groupby('Occupation').agg({'Purchase':'sum'}).reset_index().rename(columns ={'Purchase':'user_option_amount'})
#不同职业消费比例
user_option['user_option_prop'] = user_option.apply(lambda x:x[1]/df['Purchase'].sum(),axis=1)
#建立函数
def pation(x):
for i in df['Occupation'].unique():
if x[0] == i:
return (df.loc[df['Occupation'] == i].drop_duplicates(subset = ['User_ID'],keep = 'first')['User_ID'].count())
#不同职业的人数
user_option['user_option_cons'] = user_option.apply(pation,axis =1)
#不同职业人数比例
#user_option['user_option_props'] = user_option.apply(lambda x:x[3]/df['User_ID'].nunique(),axis=1)
user_option['user_option_props'] = user_option.apply(lambda x:x[3]/df.drop_duplicates(subset = ['User_ID'],keep = 'first')['User_ID'].count(),axis=1)
#不同职业人均消费金额
user_option['user_option_avg'] = user_option.apply(lambda x:x[1]/x[3],axis=1)
#对结果集进行排序,查看前三职业类别
user_option.sort_values(by = 'user_option_amount',ascending = False)
职业4,0,7消费额排前三,可以重点关注这些对象
d,从婚姻状态分析
#不同婚姻状况消费金额
user_ms = df.groupby('Marital_Status').agg({'Purchase':'sum'}).reset_index().rename(columns ={'Purchase':'user_option_amount'})
#不同婚姻状况消费比例
user_ms['user_ms_prop'] = user_ms.apply(lambda x:x[1]/df['Purchase'].sum(),axis=1)
#建立函数
def marital(x):
if x[0] == 0:
return (df.loc[df['Marital_Status'] == 0].drop_duplicates(subset = ['User_ID'],keep = 'first')['User_ID'].count())
else:
return (df.loc[df['Marital_Status'] == 1].drop_duplicates(subset = ['User_ID'],keep = 'first')['User_ID'].count())
#不同婚姻人数
user_ms['user_ms_cons'] = user_ms.apply(marital,axis =1)
#不同婚姻人数比例
user_ms['user_ms_cprop'] = user_ms.apply(lambda x:x[3]/df['User_ID'].nunique(),axis=1)
#不同婚姻人均消费
user_ms['user_ms_avg'] = user_ms.apply(lambda x:x[1]/x[3],axis=1)
user_ms
未婚 人群,无论消费人数还是消费金额,均在已婚人群之上。
e,综合因素分析
#综合因素考虑
df['gender_ms'] = df[['Gender','Marital_Status']].apply(lambda x:str(x[0])+'-'+str(x[1]),axis=1)
#综合因素下的消费金额
all_statu = df.groupby(['gender_ms','Age']).agg({'Purchase':'sum'}).reset_index().rename(columns = {'Purchase':'all_statu_amount'})
#综合因素消费比例
all_statu['all_statu_props'] = all_statu.apply(lambda x:x[2]/df['Purchase'].sum(),axis=1)
def all_s(x):
for i in df['gender_ms'].drop_duplicates():
for g in df['Age'].drop_duplicates():
if x[0] == i and x[1] == g:
return (df.loc[(df['gender_ms'] == i) & (df['Age'] == g)].drop_duplicates(subset = ['User_ID'],keep='first')['User_ID'].count())
#综合因素人数
all_statu['all_statu_cons'] = all_statu.apply(all_s,axis=1)
#人数比例
all_statu['statu_cons_props'] = all_statu.apply(lambda x:x[4]/df.drop_duplicates(subset = ['User_ID'])['User_ID'].count(),axis=1)
#人均消费
all_statu['all_cons_avg'] = all_statu.apply(lambda x:x[2]/x[4],axis=1)
all_statu.sort_values(by = 'all_statu_amount',ascending = False).head()
26到35这个时间区间中,未婚状态下的男性参与活动的人数的最多的,而到18-35这个地区重未婚男性的销量也拍排到第二位的
26到35这个时间区间中,未婚状态下的男性参与活动的人数的最多的,而到18-35这个地区重未婚男性的销量也拍排到第二位的
3,从城市纬度分析
a,不同城市的业绩
#不同城市消费金额
city_cg = df.groupby('City_Category').agg({'Purchase':'sum'}).reset_index().rename(columns = {'Purchase':'city_cg_amount'})
#不同城市消费占比
city_cg['city_cg_prop'] = city_cg.apply(lambda x:x[1]/df['Purchase'].sum(),axis=1)
#建立一个函数,循环取出每个年龄段人数
def con(x):
for i in df['City_Category'].drop_duplicates():
if x[0] == i:
return (df.loc[df['City_Category'] == i].drop_duplicates(subset= ['User_ID'],keep='first')['User_ID'].count())
#不同城市人数
city_cg['city_cg_cons'] = city_cg.apply(lambda x:con(x),axis=1)
#不同城市人数占比
city_cg['cg_cons_prop'] = city_cg.apply(lambda x:x[3]/df['User_ID'].nunique(),axis=1)
#不同城市平均消费金额
city_cg['city_cg_avg'] = city_cg.apply(lambda x:x[1]/x[3],axis=1)
city_cg
C 城市的参与活动的用户量占总的53%,但是贡献销售额仅仅占了30%,相反B城市是占的总用户量的28%确贡献了40%的销售额,并且AB城市的客单价是分别是C城市的近似2倍。我们大致能够猜测到AB城市的消费水品较高,下次举办活动的时候,可以对AB城市的价格适当提高。C城市可以适当降低价格,通过提高销售量来提高销售额
b,不同居民居住年限分析
#不同居住年龄金额
stay_time = df.groupby('Stay_In_Current_City_Years').agg({'Purchase':'sum'}).reset_index().rename(columns = {'Purchase':'stay_time_amount'})
#不同居住年龄消费占比
stay_time['stay_time_prop'] = stay_time.apply(lambda x:x[1]/df['Purchase'].sum(),axis=1)
#建立一个函数,循环取出每个年龄段人数
def con(x):
for i in df['Stay_In_Current_City_Years'].drop_duplicates():
if x[0] == i:
return (df.loc[df['Stay_In_Current_City_Years'] == i].drop_duplicates(subset= ['User_ID'],keep='first')['User_ID'].count())
#不同居住年龄人数
stay_time['stay_timee_cons'] = stay_time.apply(lambda x:con(x),axis=1)
#不同居住年龄人数占比
stay_time['stay_time_props'] = stay_time.apply(lambda x:x[3]/df.drop_duplicates(subset=['User_ID'],keep='first')['User_ID'].count(),axis=1)
#不同居住年龄平均消费金额
stay_time['stay_time_avgs'] = stay_time.apply(lambda x:x[1]/x[3],axis=1)
stay_time
居住年限为1的为最大消费群体
4,从产品角度出发
a,销售额前十的产品
df10 = df.groupby('Product_ID').agg({'User_ID':'count','Purchase':'sum'}).rename(columns = {'Purchase':'product_amount','User_ID':'User_cons'}).reset_index()
#销售金额为前10的商品
df_ten = df10.sort_values(by = 'product_amount',ascending = False)[['Product_ID','product_amount']].head(10)
df_ten
b,销量前十的产品
#销量为前10 的商品
cons_ten = df10.sort_values(by = 'User_cons',ascending = False)[['Product_ID','User_cons']].head(10)
cons_ten
c,销量跟销售额均在前十的产品
这六种产品均在前十,下一个黑五可以加大库存,防止断货。
d,从产品种类出发
#根据产品种类分析
#不同种类产品销售额
Product_Cate = df.groupby('Product_Category_1').agg({'Purchase':'sum'}).reset_index().rename(columns = {'Purchase':'Product_Cate_amount'})
#不同种类产品销售额比例
Product_Cate['Product_Cate_props'] = Product_Cate.apply(lambda x:x[1]/df['Purchase'].sum(),axis = 1)
Product_Cate.sort_values(by = 'Product_Cate_amount',ascending = False)
5,总结
1、用户的角度
结论汇总: 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)即在在Top10销售额中的产品和在Top10销售量的产品,可利用爆款商品陈列位置为其他产品引流。
后续改进: 1)可以在最受用户欢迎的商品top10的商品和其他一些相关的商品做一些捆绑销售,带动其他商品的销量;在一级商品分类为5、1、8的商品页面推荐一些其他的商品,引导用户去点击购买;
2)具体再分析下销量排名最低的三个商品种类是什么原因造成的,如果商品种类16、11、12是一些已经淘汰过时的商品或者被一些该商品的替代品占领了市场,可以考虑是否要下架,减少相关渠道的广告等;
3.城市角度
结论汇总 1)畅销第一级别类目依次是5、8、1,仓库管理需按畅销商品名单、分类,安排库存,对于消费旺盛B城市提前备货,节省调度;同时监控库存,防止断货。