“Black Friday”销售数据分析
2019-04-17 本文已影响15人
LucasOoo
数据来源Kaggle上关于黑五期间销售数据,网址如下:https://www.kaggle.com/mehdidag/black-friday/version/1
阅读路线:
0、数据准备
1、整体消费情况分析
2、用户画像:最优价值的用户类型:性别、年龄、职业、婚姻
3、城市业绩分析(城市分布 、居住年限分布)
4、产品分析:产品销售额Top 10产品、产品销售额Top10, 产品类别
5、最大贡献用户价值分析
6、总结及建议
0、数据准备
导入所需数据库:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
import seaborn as sns
导入数据,并检查数据的完整性:
blackfri = pd.read_csv('BlackFriday.csv')
blackfri.info()
image.png
原始数据中共有12个字段,每个字段共537577行,字段解释如下:
- 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: 消费金额(美元)
产品类别2中存在31%的数据确实率,产品类别3中有69%的数据缺失率。对产品类别中的缺失值采用填补‘0’值的方法消除缺失值:
blackfri = blackfri.fillna(0)
查看数据有无重复项:
blackfri.duplicated().value_counts()
image.png
537577个字段行无重复项,数据状态良好,处理好后的表格信息如下所示:
image.png
1、整体消费情况分析
# 消费总额
blackfri['Purchase'].sum()
# 订单总数
blackfri['Product_ID'].count()
# 用户购买分析
blackfri_user = blackfri.groupby('User_ID').agg({'Purchase':'sum','User_ID':"count"})
blackfri_user.describe()
从以上输出信息得出:
- 1、参与购买用户数为5891人,总订单数量达到了537577个,总消费金额达到了超过50亿美元;
- 2、最大一笔订单的消费额达到了23961美元,最小订单的消费额也有185美元;
- 3、该网站消费人数有5891人,人均消费水平为851751美元,最高消费金额达到了10536780美元
2、用户画像分析(探究最优价值的用户类型:性别、年龄、职业、婚姻)
2.1 不同性别用户消费情况
计算不同性别的订单数、人数、消费总量、人均消费并可视化:
#计算不同性别的下单数,订单数以User_ID计数
blackfri_gender = blackfri_gender_group.agg({'User_ID':'count'}).rename(columns={'User_ID':'order_count'})
#计算用户各性别的人数,对User_ID去重后计数
blackfri_gender['Gender_count']=blackfri.drop_duplicates('User_ID').groupby('Gender')['User_ID'].count()
#按性别分组后对Purchase求和即为不同性别的消费金额
blackfri_gender['Purchase_amount'] = blackfri_gender_group.agg({'Purchase':'sum'})
#将本表的消费总金额除以各性别总人数即为人均消费
blackfri_gender['Purchase_mean'] = blackfri_gender['Purchase_amount']/blackfri_gender['Gender_count']
不同性别用户消费情况
- order_count:订单总数
- Gender_count:人数
- Purchase_amount :消费总量
- Purchase_mean:消费均值
对上表做饼状图:
import pylab
%pylab inline
pylab.rcParams['figure.figsize'] = (8,8)
fig,axes = plt.subplots(2,2)
axes0,axes1,axes2,axes3 = axes.flatten()
axes0.pie(blackfri_gender['order_count'],
explode=(0.1,0),
autopct='%3.1f%%',
labels=['Female','Male'],
startangle=90)
axes0.set_title('男女订单量占比')
axes1.pie(blackfri_gender['Gender_count'],
explode=(0.1,0),
autopct='%3.1f%%',
labels=['Female','Male'],
startangle=90)
axes1.set_title('男女消费人数占比')
axes2.pie(blackfri_gender['Purchase_amount'],
explode=(0.1,0),
autopct='%3.1f%%',
labels=['Female','Male'],
startangle=90)
axes2.set_title('男女消费总量占比')
axes3.pie(blackfri_gender['Purchase_mean'],
explode=(0.1,0),
autopct='%3.1f%%',
labels=['Female','Male'],
startangle=90)
axes3.set_title('男女消费平均值对比')
image.png
通过以上结果发现:
- 男性是黑五购买的主力军,71.7%的人数占比,是女性的2.53倍,且消费了76.8%的消费总量,是女性的3.31倍;
- 男性人均消费为911963美元,高于女性人均消费699054美元;
- 男性用户是主要消费群体,可针对男性推销更多的消费品。
2.2 不同年龄分布的消费情况分析
计算不同年龄分布的订单数、人数、消费总量、人均下单数、人均消费并可视化:
#对消费人群按年龄段分组
blackfri_age_group = blackfri.groupby('Age')
#计算各年龄段下单数
blackfri_age = blackfri_age_group['User_ID'].agg({'User_ID':'count'}).rename(columns={'User_ID':'Order_count'})
#计算各年龄段消费人数
blackfri_age['Age_count'] = blackfri.drop_duplicates('User_ID').groupby('Age')['User_ID'].count()
#计算各年龄段人均下单数
blackfri_age['order_mean'] = blackfri_age['Order_count']/blackfri_age['Age_count']
#计算各年龄段消费总量
blackfri_age['Purchase_amount'] = blackfri_age_group['Purchase'].sum()
#计算各年龄段人均消费金额
blackfri_age['Purchase_mean'] = blackfri_age['Purchase_amount']/blackfri_age['Age_count']
不同年龄分布的消费情况
对各年龄段下单数、消费人数、消费总额作饼状图:
各年龄段消费情况分布
结论分析:
- 26-35年龄段的消费者人数占比最高,为34.8%,并贡献了39.9%的消费总量;
- 26-35年龄段的消费者平均购买金额和下单数也最高,人均消费达到了974061美元;
- 18-45年龄段的消费者占比为72.7%,消费总量占比为78%, 是消费的主要群体,营销方案可针对这一年龄段的群体开展。
2.3 不同婚姻状态的消费情况分析
分别计算不同婚姻状态下消费人数、消费总量、人均消费情况
#计算不同婚姻状态的消费人数
blackfri_Marital = blackfri.drop_duplicates('User_ID').groupby('Marital_Status').agg({'User_ID':'count'}).rename(columns={'User_ID':'Marital_count'})
#计算不同婚姻状态的消费总量
blackfri_Marital['Purchase_amount']=blackfri.groupby('Marital_Status')['Purchase'].sum()
#计算不同婚姻状态的人均消费
blackfri_Marital['Purchase_mean'] = blackfri_Marital['Purchase_amount']/ blackfri_Marital['Marital_count']
同婚姻状态的消费情况
根据上表情况对不同婚姻状态的人数占比和消费占比作饼状图:
pylab.rcParams['figure.figsize']=(8.5,4)
fig,axes = plt.subplots(1,2)
axes0,axes1 = axes.flatten()
axes0.pie(blackfri_Marital['Marital_count'],
labels = ['未婚','已婚'],
autopct='%3.1f%%',
startangle=90)
axes0.set_title('不同婚姻状态的人数占比')
axes1.pie(blackfri_Marital['Purchase_amount'],
labels = ['未婚','已婚'],
autopct='%3.1f%%',
startangle=90)
axes1.set_title('不同婚姻状态的消费占比')
不同婚姻状态的消费情况
- 未婚消费人数和消费总量比已婚人数高出40%,未婚人士是消费的主力军。
2.4 合并性别、婚姻等字段分析不同年龄人群的消费情况
#合并性别和婚姻状态字段,用于分类
blackfri['Gender_Maritalstatus'] = blackfri[['Gender','Marital_Status']].apply(lambda x:str(x[0])+'_'+str(x[1]),axis = 1)
#计算不同性别和婚姻状态的各年龄段的人数
blackfri_GMA = blackfri.drop_duplicates('User_ID').groupby(['Age','Gender_Maritalstatus']).agg({'User_ID':'count'}).rename(columns={'User_ID':'User_count'})
#计算不同性别和婚姻状态的各年龄段消费总量
blackfri_GMA['Purchase_amount'] = blackfri.groupby(['Age','Gender_Maritalstatus'])['Purchase'].sum()
##计算不同性别和婚姻状态的各年龄段消费均值
blackfri_GMA['Purchase_mean'] = blackfri_GMA['Purchase_amount']/blackfri_GMA['User_count']
blackfri_GMA.reset_index(inplace=True)
sns.barplot(x='Age',y='User_count',hue='Gender_Maritalstatus',data=blackfri_GMA)
plt.title('不同性别和婚姻状态下各年龄段人数分布')
不同性别和婚姻状态下各年龄段人数分布
sns.barplot(x='Age',y='Purchase_amount',hue='Gender_Maritalstatus',data=blackfri_GMA)
plt.title('不同性别和婚姻状态下各年龄段消费总量分布')
不同性别和婚姻状态下各年龄段消费总量分布
结论分析:
- 26-35年龄段的未婚男性消费人数和消费总量都达到了最大值;
- 18-25年龄段的未婚男性、26-35年龄段的已婚男性也是消费的主力,消费人数和消费金额占据前三;
- 在18-45年龄段,未婚人士的消费能力要强于已婚人士;但是在46-55+年龄段,已婚人士的消费力要高于未婚人士,这是由于随着年龄增大,已婚人数逐渐升高的原因。
2.5 不同职业用户的消费情况分析
计算不同职业消费的人数、总额、人均消费,并计算他们的占比:
#计算不同职业的消费人数
blackfri_occupation = blackfri.drop_duplicates('User_ID').groupby('Occupation').agg({'User_ID':'count'}).rename(columns={'User_ID':'User_count'})
#计算不同职业的消费人数占比
blackfri_occupation['User_rate'] = blackfri_occupation['User_count']/blackfri_occupation['User_count'].sum()
#计算不同职业的消费总额
blackfri_occupation['Purchase_amount'] = blackfri.groupby('Occupation')['Purchase'].sum()
#计算不同职业的消费总额占比
blackfri_occupation['Purchase_amount_rate'] = blackfri_occupation['Purchase_amount']/blackfri_occupation['Purchase_amount'].sum()
#计算不同职业的人均消费
blackfri_occupation['Purchase_mean'] = blackfri_occupation['Purchase_amount']/blackfri_occupation['User_count']
blackfri_occupation.reset_index(inplace=True)
#按消费总量从大到小排序
blackfri_occupation.sort_values('Purchase_amount',ascending=False,inplace=True)
blackfri_occupation
结果如下图所示:
不同职业用户的消费情况
对不同职业消费人数比率作柱状图:
sns.barplot(x='Occupation',y='User_rate',color='b',
order = blackfri_occupation.sort_values('User_rate',ascending=False).Occupation,
data=blackfri_occupation)
plt.title('不同职业消费人数比率柱状图')
不同职业消费人数比率柱状图
对不同职业消费总额比率作柱状图:
sns.barplot(x='Occupation',y='Purchase_amount_rate',color='b',
order = blackfri_occupation.sort_values('Purchase_amount',ascending=False).Occupation,
data=blackfri_occupation)
plt.title('不同职业消费总量比率柱状图')
不同职业消费总量比率柱状图
- 职业0,4,7职业总人数占35%,消费总量达36%,这几个职业是消费主要人群,需重点关注。
3、城市业绩分析
针对不同城市的人数、消费总额、人均消费情况进行统计:
#计算不同城市的消费人数
blackfri_city = blackfri.drop_duplicates('User_ID').groupby('City_Category').agg({'User_ID':'count'}).rename(columns={'User_ID':'User_count'})
#计算不同城市的消费人数占比
blackfri_city['User_rate'] = blackfri_city['User_count']/blackfri_city['User_count'].sum()
#计算不同城市的消费总额
blackfri_city['Purchase_amount'] = blackfri.groupby('City_Category')['Purchase'].sum()
#计算不同城市的消费总额占比
blackfri_city['Purchase_amount_rate'] = blackfri_city['Purchase_amount']/blackfri_city['Purchase_amount'].sum()
#计算不同城市的人均消费
blackfri_city['Purchase_mean'] = blackfri_city['Purchase_amount']/blackfri_city['User_count']
blackfri_city.reset_index(inplace=True)
blackfri_city
城市业绩分析
作饼状图分析:
pylab.rcParams['figure.figsize']=(10.7,5)
fig,axes = plt.subplots(1,2)
axes0,axes1 = axes.flatten()
axes0.pie(blackfri_city['User_rate'],
labels = blackfri_city['City_Category'],
autopct='%3.1f%%',
startangle=90)
axes0.set_title('各城市人数占比')
axes1.pie(blackfri_city['Purchase_amount_rate'],
labels = blackfri_city['City_Category'],
autopct='%3.1f%%',
startangle=90)
axes1.set_title('各城市消费总额占比')
城市业绩分析
- C城市人口占比最高为53.3%,但是总消费额度却只占了32.6%,人均消费水平是三个城市最低;
- A城市人口占比最低,但是人均消费水平最高;
- B城市以28.9%的人口占比,贡献了41.5%的消费额度,人均消费仅次于A城市;
- A、B城市的人均消费水平是C城市的两倍,消费潜力大。
4、产品分析
4.1 销量排名前十的商品编号:
blackfri.groupby('Product_ID').agg({'Product_ID':'count'}).sort_values(by='Product_ID',ascending=False).head(10)
销量top10的产品
4.2 销售额排名前十的商品编号:
blackfri.groupby('Product_ID').agg({'Purchase':'sum'}).sort_values(by='Purchase',ascending=False).head(10)
销售额top10产品
4.3 受青睐产品类别:
因为产品的一级分类不可空,二、三级分类可以空值,所以以产品的一级分类来分析销售情况:
#计算不同产品类别的消费金额
blackfri_Category1 = blackfri.groupby('Product_Category_1').agg({'Purchase':'sum'})\
.rename(columns = {'Purchase':'Purchase_amount'})
#计算不同品类货物的消费占比
blackfri_Category1['Category1_rate']=blackfri_Category1.apply(lambda x:x/x.sum())
blackfri_Category1.sort_values('Purchase_amount',ascending=False)
image.png
作柱状图:
blackfri_Category1.sort_values('Purchase_amount')['Category1_rate'].plot.barh(width=0.8)
各品类消费总额占比分布
- 产品类别1的1、5、8产品受消费者青睐,贡献了约72%的销售额。
5、总结
5.1、用户角度:
结论汇总:
- 年龄在26-35岁,职业编号为“4”,“0”,“7”的未婚男性为高消费人群,也是该平台的忠实用户;
改进措施:
- 对高价值用户重点关注,通过精细化营销为高价值客户提高更多高价值消费品;
- 对普通用户,可多推荐热销产品引导购买;
5.2、商品角度:
结论汇总:
- 一级产品分类的1、5、8的销售量和销售额均排前三,且贡献了72%的消费额度;而排名靠后的13、12、17的品类值贡献了不到0.3%的消费额度;
改进措施:
- 针对销量较低的产品类别,可以通过top10的销售量和销售额的产品为其进行引流或者捆绑销售,提高销售量;
- 对于销量排名靠后的商品,可分析是什么原因造成的,是否已经过时或者被其他商品所替代,可以考虑下架并减少相关渠道广告的投入;
5.3、城市角度
结论汇总:
- A、B城市的消费者数量较少,但人均消费水平较高,消费潜力大。
改进措施:
- 仓库管理需按畅销商品名单、分类,安排库存,对于消费旺盛B城市提前备货,节省调度;同时监控库存,防止断货。