“Black Friday”销售数据分析

作者: LucasOoo | 来源:发表于2019-04-17 15:05 被阅读15次

    数据来源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城市提前备货,节省调度;同时监控库存,防止断货。

    相关文章

      网友评论

        本文标题:“Black Friday”销售数据分析

        本文链接:https://www.haomeiwen.com/subject/oavbwqtx.html