“Black Friday”销售数据分析

数据来源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城市提前备货,节省调度;同时监控库存,防止断货。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342