利用 Python 分析了某化妆品企业的销售情况,我得出的结论是?

【导语】本篇文章是关于某化妆品企业的销售分析。从分析思路思路开始带大家一步步的用python进行分析,找出问题,并提出解决方案的整个流程。

需求:希望全面了解此某妆品企业的销售情况,帮助企业运营领导层了解企业整体销售运营情况及商品销售情况,为该企业的营销策略提供相对应的建议和销售策略。

业务分析流程

1、 场景(诊断现状)

对象:用户;销售
关注点:找到影响销售的增长因素
目标:发现问题&提出解决方案

2、需求拆解

分析销售趋势,找到影响企业营收增长的商品或区域

按月份销售趋势图(整体)
商品销售额对比(一级、二级,找出最低、最高)
区域销售额对比(下钻:区、省,找出最低、最高)

探索不同商品的销售状况,为企业的商品销售,提出策略建议

不同月份的各个产品的销售额占比情况
产品相关分析

分析用户特征、购买频率、留存率等

购买频率分布
复购率(重复购买用户数量(两天都有购买过算重复)/用户数量)
同期群分析(按月)

3、代码实现

获取数据(excel)

为某化妆品企业 2019 年 1 月-2019 年 9 月每日订单详情数据和企业的商品信息数据,包括两个数据表,销售订单表和商品信息表。其中销售订单表为每个订单的情况明细,一个订单对应一次销售、一个订单可包含多个商品。

1import pandas as pd 2import matplotlib.pyplot as plt 3import matplotlib as mpl 4mpl.rcParams['font.family'] = 'SimHei' 5import numpy as np 6import warnings 7warnings.filterwarnings("ignore") 8data = pd.read_excel('C:/Users/cherich/Desktop/日化.xlsx',encoding='gbk') 9data.head() 10

1data_info = pd.read_excel('C:/Users/cherich/Desktop/日化.xlsx',encoding='gbk',sheet_name='商品信息表') 2data_info 3

数据清洗和加工

1data = data.dropna() 2# 订购数量结尾有字符'个' 3 4data['订购数量'] = data['订购数量'].apply(lambda x:str(x)[:-1] if str(x)[-1] == '个' else x) 5data['订购数量'] = data['订购数量'].astype(int) 6 7# 订购数量结尾有字符'元' 8data['订购单价'] = data['订购单价'].apply(lambda x:str(x)[:-1] if str(x)[-1] == '元' else x) 9data['订购单价'] = data['订购单价'].astype(int) 10# 日期里有特殊字符 2019#3#11 11def proess_date(df): 12    pos = str(df).find('#') 13    if pos!= -1: 14        df = str(df).split('#') 15        return df[0]+'-'+df[1]+'-'+df[2] 16    else: 17        return df 18 19# res = proess_date(df ='2019#3#11') 20data['订单日期'] = data['订单日期'].apply(proess_date) 21data['订单日期'] = data['订单日期'].apply(lambda x:str(x).replace('年','-').replace('月','-') if '年' in str(x) else x ) 22data['订单日期'] = pd.to_datetime(data['订单日期'])  23#data.info() 24 25data = data[data.duplicated()==False] 26data['所在省份'].nunique() 27data['月份'] = data['订单日期'].apply(lambda x:str(x).split('-')[1]) 28data 29

数据可视化

1# 两张表数据合并 2total_data = pd.merge(data,data_info,on='商品编号',how='left') 3total_data

1groups = data.groupby('月份') 2= [each[0] for each in groups] 3= [each[1].金额.sum() for each in groups] 4= [each[1].金额.count() for each in groups] 5money_mean = data.金额.sum()/9 6order_mean = data.金额.count()/9 7 8plt.figure(figsize=(18, 10), dpi=80) 9plt.subplot(221) 10plt.plot(x, y,linewidth=2) 11plt.axvspan('07', '08', color='#EE7621', alpha=0.3) 12plt.axhline(money_mean, color='#EE7621', linestyle='--',linewidth=1) 13plt.title("每月销售额趋势图",color='#4A708B',fontsize=24) 14plt.ylabel("金额/(亿)",fontsize=16) 15 16plt.subplot(222) 17plt.plot(x, z, linewidth=2, color = '#EE7621') 18plt.axvline('07', color='#4A708B', linestyle='--',linewidth=1) 19plt.axhline(order_mean, color='#4A708B', linestyle='--',linewidth=1) 20plt.title("每月订单量趋势图",color='#4A708B',fontsize=24) 21plt.ylabel("订单/(单)",fontsize=16) 22plt.show() 23

图表说明:从整体来看,销售额和订单量从4月开始大幅度上升,均高于均值;8月份开始呈下降趋势,处于均值水平。

1groups_category= total_data.groupby(['月份','商品大类']) 2category1 = [] 3category2 = [] 4for i,in groups_category: 5#     print(i,j.月份.count()) 6    if i[1]=='彩妆': 7        category1.append(j.金额.sum()) 8    else: 9        category2.append(j.金额.sum()) 10labels = x 11xticks = np.arange(len(labels)) 12width = 0.5 13= np.arange(len(labels)) 14fig, ax = plt.subplots(figsize=(18,8)) 15rects1 = ax.bar(- width/2, category1,width, label='彩妆',color='#FFEC8B') 16rects2 = ax.bar(+ width/2, category2, width, label='护肤品',color='#4A708B') 17 18 19ax.set_ylabel('销售额/(亿)') 20ax.set_title('每月护肤品和彩妆的销售额对比图(大类)') 21ax.set_xticks(xticks) 22ax.set_xticklabels(labels) 23ax.legend() 24 25plt.show() 26

图表说明:护肤品需求满足大多数人,明显高于彩妆。并且5月—8月是护肤品需求旺季。相比彩妆的变化不明显。

1groups_categorys= total_data.groupby('商品小类') 2= [each[0] for each in groups_categorys] 3= [each[1].金额.sum() for each in groups_categorys] 4 5fig = plt.figure(figsize=(18,8),dpi=80) 6plt.title('各个品类的销售额对比图',color='#4A708B',fontsize=24) 7plt.ylabel('销售额(元)',fontsize=15) 8colors = ['#6699cc','#4A708B','#CDCD00','#DAA520','#EE7621','#FFEC8B','#CDCD00','#4A708B','#6699cc','#DAA520','#4A708B','#FFEC8B'] 9for i, group_name in enumerate(groups_categorys): 10    lin1 =plt.bar(group_name[0], group_name[1].金额.sum(),width=0.8,color=colors[i]) 11    for rect in lin1: 12        height = rect.get_height() 13        plt.text(rect.get_x()+rect.get_width()/2, height+1, int(height),ha="center", 14                 fontsize=12) 15 16plt.xticks(fontsize=15) 17plt.grid() 18plt.show() 19

图表说明:面膜的销售额第一,其次是面霜、爽肤水。销售额最低的是蜜粉,眼影。

1total_data = total_data.dropna() 2total_data['所在区域'] = total_data['所在区域'].apply(lambda x:str(x).replace('男区','南区').replace('西 区','西区')) 3groups_area= total_data.groupby(['所在区域','商品小类']) 4results = {}  5for i,j  in groups_area:  6    money = int(j.金额.sum()) 7    if i[0] in results.keys(): 8        results[i[0]][i[1]] = money      9    else: 10        results[i[0]] = {}    11        for cate in category_names: 12            results[i[0]][cate] = 0 13        results[i[0]]['口红'] = money 14 15results= {key_data:list(values_data.values()) for key_data,values_data in results.items()} 16 17def survey1(results, category_names): 18    labels = list(results.keys()) 19    data = np.array(list(results.values())) 20 21    data_cum = data.cumsum(axis=1) 22    category_colors = plt.get_cmap('RdYlGn')( 23        np.linspace(0.15, 0.85, data.shape[1])) 24    fig, ax = plt.subplots(figsize=(25,8)) 25    ax.invert_yaxis() 26    ax.xaxis.set_visible(False) 27    ax.set_xlim(0, np.sum(data, axis=1).max()) 28 29    for i, (colname, color) in enumerate(zip(category_names, category_colors)): 30        widths = data[:, i] 31        starts = data_cum[:, i] - widths 32        ax.barh(labels, widths, left=starts, height=0.5, 33                label=colname, color=color) 34        xcenters = starts + widths / 2 35 36        r, g, b, _ = color 37        text_color = 'white' if r * g * b < 0.5 else 'darkgrey' 38        for y, (x, c) in enumerate(zip(xcenters, widths)): 39            ax.text(x, y, str(int(c)), ha='center', va='center',color=text_color) 40    ax.legend(ncol=len(category_names), bbox_to_anchor=(0, 1), 41              loc='lower left', fontsize='small') 42 43    return fig, ax 44survey1(results, category_names) 45plt.show() 46

图表说明:东部地区占市场份额的35%左右,份额最低的是西部地区。

1area_names = list(total_data.商品小类.unique()) 2groups_priv= total_data.groupby(['所在省份','商品小类']) 3results = {}  4for i,j  in groups_priv:  5    money = int(j.金额.sum()) 6    if i[0] in results.keys(): 7        results[i[0]][i[1]] = money      8    else: 9        results[i[0]] = {}    10        for cate in category_names: 11            results[i[0]][cate] = 0 12        results[i[0]]['口红'] = money 13 14results= {key_data:list(values_data.values()) for key_data,values_data in results.items()} 15 16def survey2(results, category_names): 17    labels = list(results.keys()) 18    data = np.array(list(results.values())) 19 20    data_cum = data.cumsum(axis=1) 21    category_colors = plt.get_cmap('RdYlGn')( 22        np.linspace(0.15, 0.85, data.shape[1])) 23    fig, ax = plt.subplots(figsize=(25,20)) 24    ax.invert_yaxis() 25    ax.xaxis.set_visible(False) 26    ax.set_xlim(0, np.sum(data, axis=1).max()) 27 28    for i, (colname, color) in enumerate(zip(category_names, category_colors)): 29        widths = data[:, i] 30        starts = data_cum[:, i] - widths 31        ax.barh(labels, widths, left=starts, height=0.5, 32                label=colname, color=color) 33        xcenters = starts + widths / 2 34 35    ax.legend(ncol=len(category_names), bbox_to_anchor=(0, 1), 36              loc='lower left', fontsize='small') 37 38    return fig, ax 39survey2(results, area_names) 40plt.show() 41

图表说明:江苏销售额第一,其次是广东省;销售额最低的是宁夏、内蒙、海南

1import numpy as np 2import matplotlib.pyplot as plt 3category_names = list(total_data.商品小类.unique()) 4groups_small_category= total_data.groupby(['月份','商品小类']) 5results = {}  6for i,j  in groups_small_category:  7    money = int(j.金额.sum()) 8    if i[0] in results.keys(): 9        results[i[0]][i[1]] = money      10    else: 11        results[i[0]] = {}    12        for cate in category_names: 13            results[i[0]][cate] = 0 14        results[i[0]]['口红'] = money 15 16results= {key_data:list(values_data.values()) for key_data,values_data in results.items()} 17def survey(results, category_names): 18    labels = list(results.keys()) 19    data = np.array(list(results.values())) 20 21    data_cum = data.cumsum(axis=1) 22    category_colors = plt.get_cmap('RdYlGn')( 23        np.linspace(0.15, 0.85, data.shape[1])) 24 25    fig, ax = plt.subplots(figsize=(25,8)) 26    ax.invert_yaxis() 27    ax.xaxis.set_visible(False) 28    ax.set_xlim(0, np.sum(data, axis=1).max()) 29 30    for i, (colname, color) in enumerate(zip(category_names, category_colors)): 31        widths = data[:, i] 32        starts = data_cum[:, i] - widths 33        ax.barh(labels, widths, left=starts, height=0.5, 34                label=colname, color=color) 35        xcenters = starts + widths / 2 36 37#         r, g, b, _ = color 38#         text_color = 'white' if r * g * b < 0.5 else 'darkgrey' 39#         for y, (x, c) in enumerate(zip(xcenters, widths)): 40#             ax.text(x, y, str(int(c)), ha='center', va='center') 41    ax.legend(ncol=len(category_names), bbox_to_anchor=(0, 1), 42              loc='lower left', fontsize='small') 43 44    return fig, ax 45survey(results, category_names) 46 47plt.show() 48

图表说明:眼霜、爽肤水、面膜:4,5,6,7,8月份需求量最大;粉底、防晒霜、隔离霜、睫毛膏、蜜粉1,2,3月份需求量最大。

1data_user_buy=total_data.groupby('客户编码')['订单编码'].count() 2data_user_buy 3plt.figure(figsize=(10,4),dpi=80) 4plt.hist(data_user_buy,color='#FFEC8B') 5 6plt.title('用户购买次数分布',fontsize=16) 7plt.xlabel('购买次数') 8plt.ylabel('用户数') 9plt.show() 10

图表说明:大部分用户购买次数在10次-35次之间,极少部分用户购买次数80次以上

1date_rebuy=total_data.groupby('客户编码')['订单日期'].apply(lambda x:len(x.unique())).rename('rebuy_count') 2date_rebuy 3print('复购率:',round(date_rebuy[date_rebuy>=2].count()/date_rebuy.count(),4)) 4

1total_data['时间标签'] = total_data['订单日期'].astype(str).str[:7] 2total_data = total_data[total_data['时间标签']!='2050-06'] 3total_data['时间标签'].value_counts().sort_index() 4total_data = total_data.sort_values(by='时间标签') 5month_lst = total_data['时间标签'].unique() 6final=pd.DataFrame() 7final 8#引入时间标签 9for i in range(len(month_lst)-1): 10    #构造和月份一样长的列表,方便后续格式统一 11    count = [0] * len(month_lst) 12    #筛选出当月订单,并按客户昵称分组 13    target_month = total_data.loc[total_data['时间标签']==month_lst[i],:] 14    target_users = target_month.groupby('客户编码')['金额'].sum().reset_index() 15 16    #如果是第一个月份,则跳过(因为不需要和历史数据验证是否为新增客户) 17    if i==0: 18        new_target_users = target_month.groupby('客户编码')['金额'].sum().reset_index() 19    else: 20        #如果不是,找到之前的历史订单 21        history = total_data.loc[total_data['时间标签'].isin(month_lst[:i]),:] 22        #筛选出未在历史订单出现过的新增客户 23        new_target_users = target_users.loc[target_users['客户编码'].isin(history['客户编码']) == False,:] 24 25    #当月新增客户数放在第一个值中 26    count[0] = len(new_target_users) 27 28    #以月为单位,循环遍历,计算留存情况 29    for j,ct in zip(range(+ 1,len(month_lst)),range(1,len(month_lst))): 30        #下一个月的订单 31        next_month = total_data.loc[total_data['时间标签'] == month_lst[j],:] 32        next_users = next_month.groupby('客户编码')['金额'].sum().reset_index() 33        #计算在该月仍然留存的客户数量 34        isin = new_target_users['客户编码'].isin(next_users['客户编码']).sum() 35        count[ct] = isin 36 37    #格式转置 38    result = pd.DataFrame({month_lst[i]:count}).T 39 40    #合并 41    final = pd.concat([final,result]) 42 43final.columns = ['当月新增','+1月','+2月','+3月','+4月','+5月','+6月','+7月','+8月'] 44result = final.divide(final['当月新增'],axis=0).iloc[:] 45result['当月新增'] = final['当月新增'] 46result.round(2) 47

同期群分析

图表说明:由新增用户情况看,新用户逐月明显减少;留存率在1月-5月平均在50%,6月-8月留存率上升明显。

结论与建议

1、从销售额趋势来看,整体是上升趋势,但是从8月份销售额突然下降,可能因为到淡季,需进一步确认原因;

2、商品销售额,用户对护肤品具有强烈的需求,尤其是面膜,爽肤水、面霜、眼霜。较低需求的是蜜粉。可以把高需求产品,组合成礼盒等套装活动;

3、商品销售建议:眼霜、爽肤水、面膜:4,5,6,7,8月需求最大;粉底、防晒霜、隔离霜、睫毛膏、蜜粉1,2,3月需求最大。以上说明用户购买特定产品具有周期性;

4、从地域来看,东部地区是消费的主力军,其中江苏省、广东省、浙江省的销售额最大。可以增大市场投放量;也可以考虑在该地区建仓,节省物流等成本;

5、用户:重点维护购买次数在10次-35次之间的用户群体;

6、留存率在99%,证明用户对产品有一定的依赖性;

7、从同期群分析来看,新用户明显减少,应考虑拉新,增加平台新用户(主播带货等);

-------------------********************************** End **********-------------**-----********-**********************************

往期精彩文章推荐:

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/nbIKGAIyww_pW01tW34aHg,如有侵权,请联系删除。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

双十一预售活动分析

2022年双十一促销活动已经开始,大家应该都提前开始关注今年双十一活动的时间表了吧?2022年10月24日晚8:00天猫双11预售时间,第一波销售时间10月31日晚8:0,第二波销售时间11月10日晚8:00;天猫双11的优惠力度是跨店每满30050

java中比较两个时间的差值

项目背景1.某篇文稿的发布时间是publishDate,例如:2020072118:00:41。2.现要求判断该篇文稿的发布时间是否在近30天之内。publicstaticlongdayDiff(DatecurrentDate,DatepublishDate){LongcurrentTimecurrentDat

用户画像有什么用?怎样用?6个场景案例给你讲明白

导读:企业的精细化运营、数据驱动都是基于大数据分析来进行的。在大数据分析中,对用户行为进行分析挖掘又是一个重要的方向,通过对用户行为进行分析,企业可以了解用户从哪里来,进入平台后进行了哪些操作,什么情况下进行了下单付款,用户的留存、分布情况是怎样的等。在这些数据的指导下可以不断优化产品设计、运营模式从而促进转化率的提高和营收的增长。基于用户行为分

R数据分析及可视化的一个简单例子

需求分析葡萄牙某银行拟根据现有客户资料建立预测模型,以配合其数据库营销策略,营销方式为电话直销,销售产品为某金融产品(termdeposit),数据分析的目标为通过预测模型识别对该金融产品有较高购买意愿的用户群。数据形式:从数据库中导出的excel文件数据内容: bankclientdata:  1age(nume