异常值分析:
- 简单统计量分析:用最大值和最小值来判断这个变量的取值是否超过了合理的范围。
- 3σ原则:数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
- 箱型图分析:异常值通常被定义为小于QL-1.5IQR或大于QU+1.5IQR的值。
QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小;
QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大。
IQR称为四分位数间距,是上四分位数QU与下四分位数QL之差,期间包含了全部观察值的一半。
箱线图:
import pandas as pd
catering_sale = '../data/catering_sale.xls' #餐饮数据
data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列,在中文前面加u就表明这是一个unicode对象,这个字会以unicode格式存在于内存中
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure() #建立图像
p = data.boxplot(return_type='dict') #画箱线图,直接使用DataFrame的方法
x = p['fliers'][0].get_xdata() # 'flies'即为异常值的标签
y = p['fliers'][0].get_ydata()
y.sort() #从小到大排序,该方法直接改变原对象
#用annotate添加注释
#其中有些相近的点,注解会出现重叠,难以看清,需要一些技巧来控制。
#以下参数都是经过调试的,需要具体问题具体调试。
for i in range(len(x)):
if i>0:
plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.05 -0.8/(y[i]-y[i-1]),y[i]))
else:
plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.08,y[i]))
plt.show() #展示箱线图
输出:
图中七个值均为异常值,最后确定过滤规则为:日销量在400以下5000以上的为异常数据。
大于1.5IQR小于3IQR称为离散值
大于3IQR称为极端值
统计量分析:常从集中趋势和离中趋势两个方面进行分析
集中趋势度量:
- 均值
- 中位数
- 众数
离中趋势度量:
- 极差:最大值-最小值
- 标准差
- 变异系数:度量标准差相对于均值的离中趋势,常用来比较两个或多个具有不同单位或不同波动幅度的数据集的离中趋势
- 四分位数间距:上四分位数-下四分位数
# from __future__ import print_function 源代码有,但是注释掉程序也没有报错
import pandas as pd
catering_sale = '../data/catering_sale.xls' #餐饮数据
data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列
data = data[(data[u'销量'] > 400)&(data[u'销量'] < 5000)] #过滤异常数据
statistics = data.describe() #保存基本统计量
statistics.loc['range'] = statistics.loc['max']-statistics.loc['min'] #极差
statistics.loc['var'] = statistics.loc['std']/statistics.loc['mean'] #变异系数
statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%'] #四分位数间距
print(statistics)
对于一维数组,describe()会返回一系列参数,count,mean,std,min,25%,50%,75%,max
如上statistics定义了一个max,那么loc就根据这个max来索引对应的行
贡献度分析:原理是帕累托法则,又称20/80定律。
数据如图:
菜品盈利帕累托图代码:
from __future__ import print_function
import pandas as pd
#初始化参数
dish_profit = '../data/catering_dish_profit.xls' #餐饮菜品盈利数据
data = pd.read_excel(dish_profit, index_col = u'菜品名') #指定菜品名为索引列
data = data[u'盈利'].copy() #返回一个字典的浅拷贝。浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用
data.sort_values(ascending = False)#源代码是data_sort(ascending = False) 报错
import matplotlib.pyplot as plt #导入图像库
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure()#建立一个画图窗口
data.plot(kind='bar') #柱状图
plt.ylabel(u'盈利(元)') #y轴标签
p = 1.0*data.cumsum()/data.sum()
p.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)
plt.annotate(format(p[6], '.4%'), xy = (6, p[6]), xytext=(6*0.9, p[6]*0.9), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) #添加注释,即85%处的标记。这里包括了指定箭头样式
plt.ylabel(u'盈利(比例)')
plt.show()
输出:
统计作图函数:
import numpy as np
x = np.linspace(0.2*np.pi,50)
y = np.sin(x)
plt.plot(x, y, 'np--')
plt.show()
import matplotlib.pyplot as plt
labels = 'Frogs','Hogs','Dogs','Logs'
sizes = [15, 30, 45, 10]
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
explode = (0, 0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(1000)
plt.hist(x, 10)
plt.show()