经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
用Python全面分析某化妆品企业销售情况,可视化图显示数据
来源:cnblogs  作者:松鼠爱吃饼干  时间:2021/2/18 15:43:18  对本文有异议

前言

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

以下文章来源于杰哥的IT之旅

作者:Cherich_sun

 

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

业务分析流程

1、 场景(诊断现状)

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

2、需求拆解

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

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

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

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

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

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

3、代码实现

获取数据(excel)

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

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

 

 

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

 

 

 

数据清洗和加工

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

 

 

数据可视化

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

 

 

 

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

 

 

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

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

 

 

 

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

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

 

 

 

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

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

 

 

 

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

  1. area_names = list(total_data.商品小类.unique())
  2. groups_priv= total_data.groupby(['所在省份','商品小类'])
  3. results = {}
  4. for 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. results= {key_data:list(values_data.values()) for key_data,values_data in results.items()}
  14. def survey2(results, category_names):
  15. labels = list(results.keys())
  16. data = np.array(list(results.values()))
  17. data_cum = data.cumsum(axis=1)
  18. category_colors = plt.get_cmap('RdYlGn')(
  19. np.linspace(0.15, 0.85, data.shape[1]))
  20. fig, ax = plt.subplots(figsize=(25,20))
  21. ax.invert_yaxis()
  22. ax.xaxis.set_visible(False)
  23. ax.set_xlim(0, np.sum(data, axis=1).max())
  24. for i, (colname, color) in enumerate(zip(category_names, category_colors)):
  25. widths = data[:, i]
  26. starts = data_cum[:, i] - widths
  27. ax.barh(labels, widths, left=starts, height=0.5,
  28. label=colname, color=color)
  29. xcenters = starts + widths / 2
  30. ax.legend(ncol=len(category_names), bbox_to_anchor=(0, 1),
  31. loc='lower left', fontsize='small')
  32. return fig, ax
  33. survey2(results, area_names)
  34. plt.show()

 

 

 

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

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

 

 

 

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

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

 

 

 

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

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

 

 

 

  1. total_data['时间标签'] = total_data['订单日期'].astype(str).str[:7]
  2. total_data = total_data[total_data['时间标签']!='2050-06']
  3. total_data['时间标签'].value_counts().sort_index()
  4. total_data = total_data.sort_values(by='时间标签')
  5. month_lst = total_data['时间标签'].unique()
  6. final=pd.DataFrame()
  7. final
  8. #引入时间标签
  9. for 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. if i==0:
  17. new_target_users = target_month.groupby('客户编码')['金额'].sum().reset_index()
  18. else:
  19. #如果不是,找到之前的历史订单
  20. history = total_data.loc[total_data['时间标签'].isin(month_lst[:i]),:]
  21. #筛选出未在历史订单出现过的新增客户
  22. new_target_users = target_users.loc[target_users['客户编码'].isin(history['客户编码']) == False,:]
  23. #当月新增客户数放在第一个值中
  24. count[0] = len(new_target_users)
  25. #以月为单位,循环遍历,计算留存情况
  26. for j,ct in zip(range(i + 1,len(month_lst)),range(1,len(month_lst))):
  27. #下一个月的订单
  28. next_month = total_data.loc[total_data['时间标签'] == month_lst[j],:]
  29. next_users = next_month.groupby('客户编码')['金额'].sum().reset_index()
  30. #计算在该月仍然留存的客户数量
  31. isin = new_target_users['客户编码'].isin(next_users['客户编码']).sum()
  32. count[ct] = isin
  33. #格式转置
  34. result = pd.DataFrame({month_lst[i]:count}).T
  35. #合并
  36. final = pd.concat([final,result])
  37. final.columns = ['当月新增','+1月','+2月','+3月','+4月','+5月','+6月','+7月','+8月']
  38. result = final.divide(final['当月新增'],axis=0).iloc[:]
  39. result['当月新增'] = final['当月新增']
  40. result.round(2)

 

 

 

同期群分析

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

结论与建议

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

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

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

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

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

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

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

原文链接:http://www.cnblogs.com/hhh188764/p/14381868.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号