数据蛙强化课程第二期数据分析

“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行,字段解释如下:

产品类别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()

从以上输出信息得出:

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']
不同性别用户消费情况

对上表做饼状图:

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

通过以上结果发现:

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']

不同年龄分布的消费情况

对各年龄段下单数、消费人数、消费总额作饼状图:


各年龄段消费情况分布

结论分析:

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('不同婚姻状态的消费占比')
不同婚姻状态的消费情况

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('不同性别和婚姻状态下各年龄段消费总量分布')
不同性别和婚姻状态下各年龄段消费总量分布

结论分析:

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('不同职业消费总量比率柱状图')
不同职业消费总量比率柱状图

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('各城市消费总额占比')
城市业绩分析

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)
各品类消费总额占比分布

5、总结

5.1、用户角度:

结论汇总:

改进措施:

5.2、商品角度:

结论汇总:

改进措施:

5.3、城市角度

结论汇总:

改进措施:

上一篇下一篇

猜你喜欢

热点阅读