问题分析
Python数据分析作为现在时兴的技术,有着以下几种优势:
1、面向对象语言。(相对于面向过程的语言拥有可维护性、可读性)
2、强大的标准库,代码量极少。
3、海量第三方模块
在这里我们使用Python数据分析来完成产品贡献度分析的工作,作为柱状图和百分比的分析图表也具有更直观的分析体验。对于数据可视化的应用也有着重要的意义。
贡献度分析也称为帕累托分析,其原理简单来说就是20/80定律,即为80%的利润常常来自于20%的产品,那么为了能够更好的推广产品,加大力度进行投入资金、重点宣传对于企业来说可以带来更大的收入。那么,我们在实际应用中应该如何进行分析、找到这20%的产品并且用图表进行显示就成为了企业更关注的问题。
解决方案
首先我们了解一个公式:
累计贡献率(%)=(累加销售收入/销售总收入)×100%
通过上面的公式,累计贡献率在接近80%的时候,找到该产品在图标中相应的位置进行标注。
(注明:我们说的80/20法则只能说是一个比喻和实用的标准,真正的比例不一定正好是80%:20%,80/20法则表明在多数情况下该关系很可能是不平衡的,并且接近80/20。)
在Python的Matplotlib图表中提供了一个方法:annotate()方法,这种方法常常用于给图标上的数据添加文本标注,并且支持带箭头的划线工具,方便我们在合适的位置添加描述信息。常用的参数如下:
s
:标注文本的内容
xy
:设置箭头尖的坐标(传入一个元组)
xytest
:设置标注内容显示的起始位置(传入一个元组)
arrowprops
:用来设置箭头的样式
facecolor
:设置箭头的颜色
headlength
:箭头头部的长度
headwidth
:箭头头部的宽度
width
:箭头的宽度
下面是代码:
import pandas as pd
import matplotlib.pyplot as plt
aa = 'r./data/data1.xls'
df = pd.DataFrame(pd.read_excel(aa))
# 分组统计排序
# 通过reset_index()函数将groupby()的分组结果重新设置索引
df1 = df.groupby(["图书编号"])[买家实际支付金额].sum().reset_index()
df1 = df1.set_index('图书编号')# 设置索引
df1 = df1[u'买家实际支付金额'].copy()
df2 = df1.sort_values(ascending = False)
# 图表字体为华文细黑,字号10
plt.rc('font', family = 'SimHei', size = 10)
plt.figure('贡献度分析')
df2.plot(kind = 'bar')
plt.ylabel(u'销售收入(元)')
p = 1.0*df2.cumsum() / df2.sum()
print(p)
p.plot(color = 'r', secondary_y = True, style = '-o', linewidth = 0.5)
plt.annotate(format(p[9],'.4%'), xy = (9,p[9]), xytext = (9*0.9, p[9]*0.9),
# 添加标记,并且指定箭头样式
arrowprops = dict(arrowstyle = "->",connectionstyle = "arc3,rad = .1"))
plt.ylabel(u'收入(比例)')
plt.show()