数据探索
1.数据质量分析
1.1 缺失值分析:删除delete、插补和不处理。
1.2 异常值分析:简单统计变量、3sigma原则、箱型图分析(与上、下四分位数和四分位数间距有关,在识别异常值方面有一定的优越性)
import pandas as pd
original_data='data/data.xlsx'#原始数据
data=pd.read_excel(original_data,index_col=u'订购日期')#读取数据
data.describe()#交互性,不需print
#-*- coding: utf-8 -*- #画箱线图
import matplotlib.pyplot as plt #画图函数
plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False#用来正常显示负号
plt.figure()
p=data.boxplot()#画箱线图,直接使用dataframe的方法
p=data.boxplot(return_type='dict') #没有指定p的类型,则会导致不能获取指定的下标
x=p['fliers'][0].get_xdata()
y=p['fliers'][0].get_ydata()
y.sort()
for i in range(len(x)): #用annotate添加注释
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()
1.3 不一致分析
2. 数据特征分析
2.1 分布分析
(1)定量数据的分布分析:频率分布表、频率分布直方图
(2)定性数据的分布分析:饼图、条形图
2.2 对比分析:指标间的横纵向比较、时间序列的比较分析(绝对、相对数比较)
2.3 统计量分析:集中趋势和离中趋势
(1)集中趋势度量:均值(或截断均值:去掉最大、最小值之后的均值)、中位数、众数
(2)离中趋势度量:极差(=极大值-极小值)、标准差、变异系数、四分位数间距(=上四分位数Qu-下四分位数Ql)
from __future__ import print_function
import pandas as pd
catering_sale='data/data.xlsx'
data=pd.read_excel(catering_sale,index_col=u'订购日期')#读取数据
data=data[(data[u'成本']>10000)&data[u'成本']<60000]#过滤异常数据
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)
2.4 周期性分析 :时序图
2.5 贡献度分析:帕累托法则(20/80定律)
#-*- coding: utf-8 -*-
#菜品盈利数据 帕累托图
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)#默认升序,此为降序,值排序
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'盈利(元)')
p = 1.0*data.cumsum()/data.sum()#cumsum:返回给定axis上的累计和
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()
Error: ‘Series’ object has no attribute ‘sort’
解决:将 data.sort(ascending = False)#默认升序,此为降序,值排序
改为data.sort_values(ascending = False)#默认升序,此为降序,值排序
2.6 相关性分析
(1)直接绘制散点图
(2)绘制散点图矩阵:考察多个变量的相关关系
(3)计算相关系数:
Pearson相关系数:用于分析两个连续变量间的关系(要求连续变量的取值服从正态分布)
Spearman秩相关系数(或等级相关系数):一个变量的相同取值必须有相同的秩次
判定系数:相关系数的平方
3 Python主要数据探索函数
Pandas:数据分析
Matplotlib:数据可视化
3.1 基本统计特征函数:sum、mean、var、std、corr、cov、skew/kurt、describe
3.2 拓展特征统计函数:
cumsum(依次给出前1、2、…、n个数的和)、cumprod(积)、cummax、cummin
计算数据样本的各项指标:rolling_sum()、rolling_mean()、rolling_var()、rolling_std()、rolling_corr()、rolling_cov()、rolling_skew(偏度或三阶矩)、rolling_kurt(峰度或四阶矩)
有些函数是作为DataFrame或Series对象的方法而出现的,如D.cumsum;
而有些函数是属于某一库(如pandas)的函数,如pd.rolling_mean(D,k),每k列计算一次均值,滚动计算。
3.3 统计作图函数
plot():绘制线性二维图、折线图
pie():绘制饼形图
hist():绘制二维条形直方图,可显示数据的分配情形
boxplot():绘制样本数据的箱型图
plot(logy=True):绘制y轴的对数图形
plot(yerr=error):绘制误差条形图
作图前一般加入以下代码:
import matplotlib.pyplot as plt #导入作图库
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure(figsize=(7,5))#创建图像区域,指定比例
plt.show()#显示作图结果
饼图:
import matplotlib.pyplot as plt
labels=‘Frogs’,‘Hogs’,‘Dpgs’,‘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 numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x=np.random.randn(1000)#1000个服从正态分布的随机数
D=pd.DataFrame([x,x+1]).T#构造两列的DatFrame
D.plot(kind='box')#调用Series内置的作图方法画图,用kind参数指定箱型图box
plt.show()
误差条形图:
import matplotlib.pyplot as plt #导入图像库
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
import numpy as np
import pandas as pd
error=np.random.randn(10)#定义误差列
y=pd.Series(np.sin(np.arange(10)))#均值数据列
y.plot(yerr=error)#绘制误差图
plt.show()
数据预处理:数据清洗、数据集成、数据变换和数据规约。
1 数据清洗:删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值等。
1.1 缺失值处理:删除记录、数据插补和不处理。
(未完待续。。。)