chap3 数据探索 样本数量&质量,不一致,重复数据 特殊符号,特征,特征之间的关联性 3.1 数据质量分析 3.1.1 缺失值 缺失原因: 暂时无法获取,或者获取代价太大; 人为:不重要,忘记,理解错误; 非人为:设备故障 影响: 丢失信息,不确定性增加,建模混乱。 分析: 缺失值属性以及个数,缺失率 处理: 删除、插值处理、不处理 —> 详情见4.1.1 3.1.2异常值 分析 不可忽视 检验(录入错误)不合常理数据 –> 分析原因 à 改进决策 :
- 简单统计量分析;
- 3σ原则,超出3σ的概率 P<=0.03
- 箱形图分析:提供识别异常值的标准(<QL-1.5IQR 或者 >QU+1.5IQR,IQR是四分位间距,QL下四分位数,QU上四分位数)。鲁棒性:有25%的数据可以偏离任意远 而不扰动四分位数,评价标准很客观。
3.1.2 python代码:
#-*- coding: utf-8 -*- import pandas as pd catering_sale = '../data/catering_sale.xls' #餐饮数据 data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列(reade_csv打开csv文件,eread_excel打开xls文件) data.describe() 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() #展示箱线图  |
3.1.3 一致性分析:矛盾性,不相容性 原因:集成,来源不一致,不同的数据源,重复存放的数据 |
3.2 数据特征分析 3.2.1分布分析:分布特征 & 分布类型 定量数据:对称or非对称,频率分布直方图,茎叶图 --> 分析异常数据  定性数据:饼图,条形图 3.2.2 对比分析: 互相联系的指标 --> 合适的标准 --> compare --> 关系是否协调, 绝对数、相对数、结构相对数(某特征的占比、比例相对数)、比较相对数(同一时期不同地方,同一地区不同时期、强度相对数)、计划完成度相对数、动态相对数。 3.2.3 统计量分析: 集中趋势:均值、中位数、众数 离中趋势:方差(标准差),四分位数,极差,变异系数CV=s/Xmean 代码: (注意,statistics的数据类型是dataframe)
data_after=data[(data[u'销量']>500)&(data[u'销量']<5000)] statistics=data_after.describe() statistics.loc['range']=statistics.loc['max']-statistics.loc['min'] statistics.loc['dis']=statistics.loc['75%']-statistics.loc['25%'] statistics.loc['CV']=statistics.loc['std']/statistics.loc['mean'] statistics |
statistics Out[58]: 销量 count 195.000000 mean 2744.595385 std 424.739407 min 865.000000 25% 2460.600000 50% 2655.900000 75% 3023.200000 max 4065.200000 range 3200.200000 dis 562.600000 CV 0.154755 |
3.2.4 周期性分析 变量随着时间变化 --> 周期性趋势 (年度、季度、月度、天、小时) 3.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(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() 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()   |
3.2.6 相关性分析 1. 直接绘制散点图or散点图矩阵 à 观察线性相关 或者 是否存在其他相关性 2. 计算相关系数: 2.1 Pearson相关系数: r=cov(x,y)/(std(x)×std(y)) ,(要求连续变量服从正态分布) 值域[-1,1]: abs(r)<0.3 不存在线性相关; 0.3<abs(r)<0.5 弱线性相关; 0.5<abs(r)<0.8 显著线性相关 0.8<abs(r) 非常显著线性相关 2.2 Spearman 秩相关系数 --> 等级相关系数 (适用于 等级变量 等不服从正态分布的变量,只要两个变量具有严格的单调关系,则是完全Spearman相关)  斯皮尔曼相关系数表明X(独立变量)和Y(依赖变量)的相关方向。如果当X增加时,Y趋向于增加,斯皮尔曼相关系数则为正。如果当X增加时,Y趋向于减少,斯皮尔曼相关系数则为负。斯皮尔曼相关系数为零表明当X增加时Y没有任何趋向性。当X和Y越来越接近完全的单调相关时,斯皮尔曼相关系数会在绝对值上增加。当X和Y完全单调相关时,斯皮尔曼相关系数的绝对值为1。完全的单调递增关系意味着任意两对数据Xi,Yi和Xj,Yj,有Xi−Xj和Yi−Yj总是同号。完全的单调递减关系意味着任意两对数据Xi,Yi和Xj,Yj,有Xi−Xj和Yi−Yj总是异号。 斯皮尔曼相关系数经常被称作"非参数"的。这里有两层含义。首先,当X和Y的关系是由任意单调函数描述的,则它们是完全皮尔逊相关的。与此相应的,皮尔逊相关系数只能给出由线性方程描述的X和Y的相关性。其次,斯皮尔曼不需要先验知识(也就是说,知道其参数)便可以准确获取XandY的采样概率分布。 3. 判定系数 --> 相关系数的平方 --> 越接近1 --> 拟合效果越好
#-*- coding: utf-8 -*- #餐饮销量数据相关性分析 from __future__ import print_function import pandas as pd catering_sale = '../data/catering_sale_all.xls' #餐饮数据,含有其他属性 data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列 data.corr() #相关系数矩阵,即给出了任意两款菜式之间的相关系数 data.corr()[u'百合酱蒸凤爪'] #只显示“百合酱蒸凤爪”与其他菜式的相关系数 data[u'百合酱蒸凤爪'].corr(data[u'翡翠蒸香茜饺']) #计算“百合酱蒸凤爪”与“翡翠蒸香茜饺”的相关系数 |
 |
help(pd.DataFrame.corr) Help on function corr in module pandas.core.frame: corr(self, method='pearson', min_periods=1) Compute pairwise correlation of columns, excluding NA/null values Parameters ---------- method : {'pearson', 'kendall', 'spearman'} * pearson : standard correlation coefficient * kendall : Kendall Tau correlation coefficient * spearman : Spearman rank correlation min_periods : int, optional Minimum number of observations required per pair of columns to have a valid result. Currently only available for pearson and spearman correlation Returns ------- y : DataFrame |
3.3 Python主要数据探索函数 3.3.1 基本统计特征函数(DataFrame or Series)
方法 |
功能 |
库 |
方法 |
功能 |
库 |
D.sum() |
|
Pandas |
D.corr() |
相关系数矩阵 |
Pandas |
D.mean() |
|
Pandas |
D.cov() |
协方差矩阵 |
Pandas |
D.var() |
方差 |
Pandas |
D.skew() |
偏度(三阶矩) |
Pandas |
D.std() |
|
Pandas |
D.kurt() |
峰度(四阶矩) |
Pandas |
D.describe() |
|
Pandas |
|
|
|
3.3.2 拓展统计特征函数(DataFrame or Series)
方法 |
功能 |
库 |
方法 |
功能 |
库 |
cumsum() |
依次给出前1/2/3…n个数的和 |
Pandas |
rolling_sum() |
计算数据样本的总和(按列计算) |
Pandas |
cumprod() |
依次给出前1/2/3…n个数的积 |
Pandas |
rolling_mean() |
。。。 |
Pandas |
cummax() |
。。。 |
Pandas |
rolling_var() |
。。。 |
Pandas |
cummin() |
。。。 |
Pandas |
rolling_std() |
。。。 |
Pandas |
|
|
|
rolling_cov() |
。。。。 |
Pandas |
|
|
|
rolling_skew() |
。。。。 |
Pandas |
|
|
|
rolling_kurt() |
。。。 |
Pandas |
3.3.3 统计作图函数
方法 |
功能 |
库 |
说明 |
plot() |
绘制线性二维图 |
Matlotlib/Pandas |
plt.plot(x,y,S) |
DataFrame.plot(kind=’line/bar(条形)/box/barh/hist(直方图)/kde(密度)/area()/pie(饼图)’) #bar类似是对离散离散特征每个特征 |
Series.plot() |
pie() |
饼图 |
Matlotlib/Pandas |
plt.pie(size); #size是列表,表示扇形各个部分的比例 |
hist() |
二维条形直方图 |
Matlotlib/Pandas |
plt.hist(x,n); #x代表一维数组,n代表组数 |
boxplot() |
箱形图 |
Pandas |
|
plot(logy=True) plot(logx=True) |
y轴对数 |
Pandas |
|
plot(yerr=error) |
误差条形图 |
Pandas |
???不理解 |
Figure 1 bar plot |
Figure 2 hist plot |
Figure 3 sale.boxplot() |
Figure 4 sale.plot(kind='box') |
sale.plot(logy=True) |
|
|
|