当面对一个新项目中首次拿到的业务数据时,对这些数据中的信息没有足够的经验,不知道该用何种方法进行分析、探索规律、挖掘线索时,探索性数据分析(EDA)就会非常有效。

全文内容较长,图片,建议收藏后边阅读边手敲代码进行练习

什么是探索性数据分析(EDA)

探索性数据分析(Exploratory Data Analysis,以下简称EDA)

是指对初次获取的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。

探索性数据分析(EDA)在数据化审计过程中是经常遇到的工作。特别是当面对一个新项目中首次拿到的业务数据时,对这些数据中的信息没有足够的经验,不知道该用何种方法进行分析、探索规律、挖掘线索时,探索性数据分析就会非常有效。

探索性数据分析(EDA)的用途

Python 取table的一行 python取第一行的数据_字段

美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)提出探索性数据分析(EDA)主要有如下功能:

  • 尽可能洞察数据基本属性
  • 发现潜在的数据结构
  • 提取重要的变量
  • 异常检测和处理异常值
  • 检验统计假设
  • 建立初步模型
  • 决定最优模型因子的设定

如何进行EDA

在数据化审计过程中进行 EDA ,一般有两种途径,一是使用带有交互界面 GUI 的软件,通过“托拉拽”等可视化操作实现。另一种是使用数据分析语言如 R、Python 等通过代码实现。

第一种方法,很多专业的数据分析软件都提供了 EDA 教程,比如  SPSS:https://www.ibm.com/support/knowledgecenter/en/SSLVMB_23.0.0/spss/tutorials/explore_table.html 。SAS:http://support.sas.com/documentation/cdl/en/imlsug/62558/HTML/default/viewer.htm#uggettingstarted.htm

第二种方法, Python 的 pandas 库强大的分析和可视化展现功能基本就满足了 EDA 。网上相关的教程比较多,如 https://github.com/swaathi/eda 。本文也Python环境下如何进行EDA为例。

Python 进行EDA的相关资源

1.示例数据

本文以著名的 Iris Data Set(鸢尾属植物数据集)为例。在 pandas 安装后,会自带这个经典数据集,文件路径为 pandas/tests/data/iris.csv。

数据集的内容如下:

Python 取table的一行 python取第一行的数据_数据分析_02

考虑到操作的便利性,建议将这个文件拷贝到 python 代码所在的文件夹。

CSV文件

扩展名为CSV的文件实际上是一个文本文件,可以用记事本打开。这个文件的第一行一般为字段名称,字段名用英文逗号分隔。其余的行为数据记录行,字段间也用逗号分隔。

2.数据分析环境

本文分析所使用的环境具体如下:(python数据分析环境搭建见文末)

软件或环境

说明

Win10 64位

系统环境

Python 2.7

数据分析语言平台

pandas 0.20.3

数据读取和处理

3.学习资源

  • pandas 官网手册:https://pandas.pydata.org/pandas-docs/stable/pandas.pdf
  • pandas 中文网:https://www.pypandas.cn/docs/

利用pandas库进行EDA

EDA 的过程一般包括数据读取、数据概览、字段分析、图表展现、统计分析、因子选择、模型测试等等。

可以按住屏幕,左右滑动查看代码

0.初始化环境

1# 加载相关的Python库
2# pandas库 用于读取和处理数据
3import pandas as pd
4# matplotlib库 用于显示可视化图形显示
5import matplotlib.pyplot as plt
6# 如果是在jupyter notebook中运行 请添加语句 %matplotlib inline

1.读取数据

1# 读取数据 将读取后的数据存放到df变量中
2#(可以理解为存放到内存中的一个地方,随时可以用)
3df = pd.read_csv('iris.csv', encoding='gb2312')

2.数据概览

1# 查看数据结构
2# 可以查看数据的字段名称、字段类型、记录数等
3df.info()

可见原始数据有5个字段:前四个为鸢尾花的属性、最后一个 Name 为鸢尾花分类。

Python 取table的一行 python取第一行的数据_pandas取第一行数据_03

1# 查看数据中各字段的取值分布情况
2# 可以查看数值型字段的平均值、方差、最大最小值等
3df.describe()

Python 取table的一行 python取第一行的数据_Python 取table的一行_04

1# 预览数据记录
2# 随机抽取5条记录进行预览
3df.sample(5)
4# 预览前5条记录
5df.head(5)
6# 预览后5条记录
7df.tail(5)

随机抽取5条记录进行预览结果

Python 取table的一行 python取第一行的数据_字段_05

3.基础数据整理

在进行数据分析时,为了避免后续掉坑里,需要进行如下处理:

  • 判断哪些字段存在空值
  • 判断空值是否对后续分析有重要影响
  • 对存在空值的记录按照什么规则补足数据
  • 或者删除存在空值的记录不参与后续分析
1# 判断哪些列的字段存在空值
2# 本数据集不存在空值
3df.isnull().any()

Python 取table的一行 python取第一行的数据_Python 取table的一行_06

1# 只显示存在缺失值的行列,确定缺失值的位置
 2df[df.isnull().values==True]
 3
 4# 删除缺失数据
 5# axis默认为行: axis中0表示行,1表示的列
 6df = df.dropna(axis=0) 
 7
 8# 取一定的值对缺失数据进行填充
 9# pad/ffill 用前一个非缺失值去填充该缺失值
10# backfill/bfill  # 用下一个非缺失值填充该缺失值
11df = df.fillna(method='bfill',axis=0, inplace=True)
12
13# 用线性插值方法对缺失数据进行填充
14df = df.interpolate(method='linear', limit_direction='forward', axis=0)

4.可视化展现

可视化是EDA中重要的展现方法,可以比较直观地展现数据的特征、异常以及变量关系。

pandas 库自带了很多可视化功能函数,可以用箱体图、直方图等对数据进行展现。

具体可pandas 0.18.1 documentation 第23章 《VISUALIZATION》。

箱体图 Boxplot

是一种表示数据分布的方法,一个基本的箱体图从上到下分别表示最大值,上四分位,均值,下四分位,最小值。有的箱体图中还会加入异常值等。箱体图的作用:(1)直观明了地识别数据中的异常值 (2)判断数据的偏态和尾重 (3)比较不同批次的数据形状

1# 用箱体图查看数值型字段
2df.plot.box()

Python 取table的一行 python取第一行的数据_pandas取第一行数据_07

从图中可见,花萼宽度( SepalWidth )的数据分布相对异常。

1# 花萼宽度(SepalWidth)的数据分布相对异常
2# 重点查看花萼宽度(SepalWidth)的数据
3df.boxplot(column='SepalWidth', by='Name', figsize=(6,5), rot=45)

Python 取table的一行 python取第一行的数据_pandas取第一行数据_08

从图中可见,花萼宽度( SepalWidth )的异常数据主要在 virginica 这一类中。

直方图(Histogram)

又称质量分布图,是一种统计报告图,是数值数据分布的精确图形表示,表示一个连续变量(定量变量)的概率分布的估计。由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。

1# 用直方图展现数据中的数值变量分布情况
2# pandas自带的函数会自动显示类型为float、int字段的直方图
3df.hist(figsize=(8,8),xlabelsize=8,ylabelsize=8, bins=50)

Python 取table的一行 python取第一行的数据_pandas取第一行数据_09

散点图矩阵(Scatter Plot Matrix)

又叫 Scagnostic, 是一种常用的高维度数据可视化技术。它将高维度的数据每两个变量组成一个散点图,再将他们按照一定的顺序组成散点图矩阵。这种可视化方式,能够将高维度数据中所有的变量两两之间的关系展示出来。

1# 加载pandas的绘图工具scatter_matrix
2from pandas.tools.plotting import scatter_matrix
3# 三种不同的花用不同的颜色 表示
4# 首先定义花种类和颜色的对应关系
5colors_palette = {'Iris-setosa': 'red', 'Iris-versicolor': 'yellow', 'Iris-virginica':'blue'}
6# 对每条记录 根据花的种类确定颜色
7colors = [colors_palette.get(c) for c in list(df['Name'])]
8# 绘制Scatter Plot Matrix 
9scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal='kde',c=colors)

Python 取table的一行 python取第一行的数据_字段_10

5.因子选择

1# 使用sklearn库的随机森林分类模型判断影响鸢尾花分类四个属性的重要性
 2# 四个属性:花瓣长度、花瓣宽度、花萼长度、花萼宽度
 3
 4# 导入sklearn库的随机森林分类模型RandomForestClassifier
 5from sklearn.ensemble import RandomForestClassifier
 6# 提取四个属性的值X、鸢尾花分类Y、属性名称 为模型准备数据和标签
 7X = df.iloc[:,0:4]
 8Y = df.iloc[:,-1]
 9names = df.columns.values
10# 初始化随机森林模型
11clf = RandomForestClassifier()
12# 应用模型
13clf.fit(X, Y)
14# 结果输出 按照重要性得分排序
15print u"属性重要性排序:"
16print sorted(zip(map(lambda x: round(x, 4), clf.feature_importances_), names), reverse=True)

属性重要性排序如下:

[(0.6459, u'PetalWidth'), (0.1692, u'SepalLength'), (0.1501, u'PetalLength'), (0.0347, u'SepalWidth')]