《数据分析与挖掘实战》总结及代码练习---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. 箱形图分析:提供识别异常值的标准(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() #展示箱线图

《数据分析与挖掘实战》总结及代码练习---chap3 数据探索_第1张图片

 

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()

《数据分析与挖掘实战》总结及代码练习---chap3 数据探索_第2张图片《数据分析与挖掘实战》总结及代码练习---chap3 数据探索_第3张图片

 

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

0.5线性相关

0.8线性相关

2.2 Spearman 秩相关系数  --> 等级相关系数 (适用于 等级变量 等不服从正态分布的变量,只要两个变量具有严格的单调关系,则是完全Spearman相关)

《数据分析与挖掘实战》总结及代码练习---chap3 数据探索_第4张图片

 

斯皮尔曼相关系数表明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'翡翠蒸香茜饺']) #计算“百合酱蒸凤爪”与“翡翠蒸香茜饺”的相关系数

 

《数据分析与挖掘实战》总结及代码练习---chap3 数据探索_第5张图片

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)

 

 

 

你可能感兴趣的:(Python数据分析,Python,Data,Analysis)