贡献度分析
贡献度分析又称帕累托分析,它的原理是帕累托法则又称20/80定律。同样的投入放在不同的地方会产生不同的效益。例如,对一个公司来讲,80%的利润常常来自于20%最畅销的产品,而其他80%的产品只产生了20%的利润。
帕累托图
帕累托图又叫排列图、主次图,是按照发生频率大小顺序绘制的直方图,表示有多少结果是由已确认类型或范畴的原因所造成。它是将出现的质量问题和质量改进项目按照重要程度依次排列而采用的一种图表。可以用来分析质量问题,确定产生质量问题的主要因素。按等级排序的目的是指导如何采取纠正措施:项目班子应首先采取措施纠正造成最多数量缺陷的问题。从概念上说,帕累托图与帕累托法则一脉相承,该法则认为相对来说数量较少的原因往往造成绝大多数的问题或缺陷
排列图用双直角坐标系表示,左边纵坐标表示频数,右边纵坐标表示频率.分析线表示累积频率,横坐标表示影响质量的各项因素,按影响程度的大小(即出现频数多少)从左到右排列,通过对排列图的观察分析可以抓住影响质量的主要因素.
帕累托法则往往称为二八原理,即百分之八十的问题是百分之二十的原因所造成的。帕累托图在项目管理中主要用来找出产生大多数问题的关键原因,用来解决大多数问题。
SPSS帕累托图
catering_dish_profit.xls
菜品ID | 菜品名 | 盈利 |
17148 | A1 | 9173 |
17154 | A2 | 5729 |
109 | A3 | 4811 |
117 | A4 | 3594 |
17151 | A5 | 3195 |
14 | A6 | 3026 |
2868 | A7 | 2378 |
397 | A8 | 1970 |
88 | A9 | 1877 |
426 | A10 | 1782 |
帕累托图就餐饮企业来讲,应用贡献度分析可以重点改善某菜系盈利最高的前80%的菜品,或者重点发展综合影响最高的80%的部门。这种结果可以通过帕累托图直观地呈现出来。上图是海鲜系列的十个菜品A1~A10某个月的盈利额(已按照从大到小排序)。
分析结果
由上图可知,菜品A1~A7共7个菜品,占菜品种类数的70%,总盈利额约占该月盈利额的85%。根据帕累托法则,应该增加对菜品A1~A7的成本投入,减少对菜品A8~A10的投入以获得更高的盈利额。
Python程序
#coding: utf-8
# dish_pareto.py
import matplotlib.pyplot as plt
from numpy import nan as NA
import pandas as pd
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
# 读取数据源
xlsFilename = "catering_dish_profit.xls"
#df = pd.read_excel(xlsFilename, index_col='菜品名')
df = pd.read_excel(xlsFilename)
#---------------------------------------------------------------------
# 绘制帕累托图
#plt.figure()
# 绘制直方图
df1 = df.loc[:,['菜品名', '盈利']]
df1 = df1.sort_values('盈利', ascending = False)
df1 = df1.set_index('菜品名')
df1.plot(kind='bar')
# 绘制线段
# sum()是计算样本的总和;cumsum()是依次给出前1,2,3.。。n个数的和
df3 = 1.0 * df1['盈利'].cumsum() / df1['盈利'].sum()
df3.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)
# 绘制标注
df3 = df3.reset_index(drop=True)
df4 = df3[df3>=0.8][0:1]
pointX = df4.index[0]
pointY = df4[pointX]
plt.annotate(format(pointY, '.2%'), xy = (pointX, pointY), xytext=(pointX*0.9, pointY*0.9), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) #添加注释,即85%处的标记。这里包括了指定箭头样式。
# 设置标签
plt.ylabel('盈利(元)')
plt.ylabel('盈利(比例)')
plt.show()