《数据分析与挖掘实战》总结及代码练习---chap3 数据探索

目录

 chap3 数据探索

3.1 数据质量分析

3.1.1 缺失值

3.1.2异常值 分析

3.1.3 一致性分析:矛盾性,不相容性

3.2 数据特征分析

3.2.1分布分析:分布特征 & 分布类型

3.2.2 对比分析: 互相联系的指标 --> 合适的标准 --> compare --> 关系是否协调,

3.2.3 统计量分析:

3.2.4 周期性分析

3.2.5 贡献度分析:帕累托法则20/80定律

3.2.6 相关性分析

3.3 Python主要数据探索函数

3.3.1 基本统计特征函数(DataFrame or Series)

3.3.2 拓展统计特征函数(DataFrame or Series)

3.3.3 统计作图函数

 


 chap3 数据探索

样本数量&质量,不一致,重复数据 特殊符号,特征,特征之间的关联性

3.1 数据质量分析

3.1.1 缺失值

缺失原因:

暂时无法获取,或者获取代价太大;

人为:不重要,忘记,理解错误;

非人为:设备故障

影响:

丢失信息,不确定性增加,建模混乱。

分析:

缺失值属性以及个数,缺失率

处理:

         删除、插值处理、不处理 —> 详情见4.1.1

3.1.2异常值 分析

不可忽视

检验(录入错误)不合常理数据 –> 分析原因 à 改进决策 :

  1. 简单统计量分析;
  2. 3σ原则,超出3σ的概率 P<=0.03
  3. 箱形图分析:提供识别异常值的标准(<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)

 

 

 


更多精彩内容