当面对一个新项目中首次拿到的业务数据时,对这些数据中的信息没有足够的经验,不知道该用何种方法进行分析、探索规律、挖掘线索时,探索性数据分析(EDA)就会非常有效。
全文内容较长,图片,建议收藏后边阅读边手敲代码进行练习
什么是探索性数据分析(EDA)
探索性数据分析(Exploratory Data Analysis,以下简称EDA)
是指对初次获取的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。
探索性数据分析(EDA)在数据化审计过程中是经常遇到的工作。特别是当面对一个新项目中首次拿到的业务数据时,对这些数据中的信息没有足够的经验,不知道该用何种方法进行分析、探索规律、挖掘线索时,探索性数据分析就会非常有效。
探索性数据分析(EDA)的用途
美国国家标准与技术研究院(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 代码所在的文件夹。
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 为鸢尾花分类。
1# 查看数据中各字段的取值分布情况
2# 可以查看数值型字段的平均值、方差、最大最小值等
3df.describe()
1# 预览数据记录
2# 随机抽取5条记录进行预览
3df.sample(5)
4# 预览前5条记录
5df.head(5)
6# 预览后5条记录
7df.tail(5)
随机抽取5条记录进行预览结果
3.基础数据整理
在进行数据分析时,为了避免后续掉坑里,需要进行如下处理:
- 判断哪些字段存在空值
- 判断空值是否对后续分析有重要影响
- 对存在空值的记录按照什么规则补足数据
- 或者删除存在空值的记录不参与后续分析
1# 判断哪些列的字段存在空值
2# 本数据集不存在空值
3df.isnull().any()
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()
从图中可见,花萼宽度( SepalWidth )的数据分布相对异常。
1# 花萼宽度(SepalWidth)的数据分布相对异常
2# 重点查看花萼宽度(SepalWidth)的数据
3df.boxplot(column='SepalWidth', by='Name', figsize=(6,5), rot=45)
从图中可见,花萼宽度( SepalWidth )的异常数据主要在 virginica 这一类中。
直方图(Histogram)
又称质量分布图,是一种统计报告图,是数值数据分布的精确图形表示,表示一个连续变量(定量变量)的概率分布的估计。由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。
1# 用直方图展现数据中的数值变量分布情况
2# pandas自带的函数会自动显示类型为float、int字段的直方图
3df.hist(figsize=(8,8),xlabelsize=8,ylabelsize=8, bins=50)
散点图矩阵(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)
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')]