Task02:数据的探索性分析(EDA)
赛题:零基础入门数据挖掘 - 二手车交易价格预测
地址:https://tianchi.aliyun.com/competition/entrance/231784/information
参考资料
探索性数据分析
数据处理之二——数据探索性分析(EDA)
探索性数据分析(EDA)
1 EDA目标
探索性数据分析(Exploratory Data Analysis,EDA)是指对已有数据在尽量少的先验假设下通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。常用的手段包括定量分析和可视化技术。
EDA常用的一些常见问题:
- 数据的典型值是多少(均值,中位数等)?
- 典型值的不确定性是什么?
- 一组数据的良好分布拟合是什么?
- 数据的分位数是多少?
- 一个工程上的修改是否有作用?
- 一个因子是否有影响?
- 最重要的因素是什么?
- 来自不同实验室的测量结果是否相等?
- 将响应变量与一组因子变量相关联的最佳函数是什么?
- 什么是最好的因子设置?
- 我们可以将时间相关数据中的信号与噪声分离吗?
- 我们可以从多变量数据中提取任何结构吗?
- 数据是否有离群值?
通过EDA可以实现:
- 得到数据的直观表现
- 发现潜在的结构
- 提取重要的变量
- 处理异常值
- 检验统计假设
- 建立初步模型
- 决定最优因子的设置
2 代码示例
2.1 载入各种数据科学以及可视化库:
- pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
- NumPy是使用Python进行科学计算的基础包, 代表 “Numeric Python”。它是一个由多维数组对象和用于处理数组的例程集合组成的库,多用在大型,多维数组上执行数值运算。
- Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。直方图,功率谱,条形图,错误图,散点图等。pyplot是Matplotlib 软件包中子包,提供了一个类似MATLAB的绘图框架。
- Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。
- missingno库提供了一个灵活易用的可视化工具来观察数据缺失情况,是基于matplotlib的,接受pandas数据源
#导入warnings包,忽略警告语句
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno
2.2载入数据:
- read_csv读文件方式,默认是以逗号“,”作为分割符;若是以其它分隔符,比如制表符“/t”,则需要显示的指定分隔符。如:pd.read_csv(filename,sep=’/t’)
#载入数据集和测试集
#这里的sep=‘ ’指的是将分隔符设为空格
Train_data = pd.read_csv('used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv('used_car_testA_20200313.csv', sep=' ')
- 简略观察数据(要养成看数据集的head()以及shape的习惯)
#简略观察数据(head()+shape)
#head():观察前五行数据; tail():观察后五行数据
Train_data.head().append(Train_data.tail())
Train_data.shape
下面是查看测试集的head()以及shape,结果略。
Test_data.head().append(Test_data.tail())
Test_data.shape
2.3数据总览:
- describe中有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值 看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下。
- 格式:describe( percentiles=None, include=None, exclude=None)
- 注:include=‘all’,代表对所有列进行统计,如果不加这个参数,则只对数值列进行统计
- info通过info来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常
#通过describe()来熟悉数据的相关统计量
Train_data.describe()
这里试了下用include='all’这个参数,得知describe()统计出的列是不一样的,会将所有类型的列都进行统计,包括object类型。如没有,则只对数值列进行统计。
# include='all',代表对所有列进行统计,如果不加这个参数,则只对数值列进行统计(notRepairedDamage列是object类型)
Test_data.describe(include='all')
#通过info()来熟悉数据类型
Train_data.info()
Test_data.info()
结果略。
2.4判断数据缺失和异常
- .isnull().sum()将列中为空的个数统计出来,即,计算缺省值
#看每列的存在nan情况
#使用isnull()函数得到true或者false
Train_data.isnull().sum()
Test_data.isnull().sum()
Test_data.isnull().sum()
- 接下来对含有nan的信息进行可视化
- 这里使用了sort_value函数来进行排序,默认为升序排序;设置inplace=True用排序后的数据集替换原来的数据,默认False是不替换
- 直观的了解哪些列存在 “nan”的主要目的在于看 nan存在的个数是否真的很大,如果很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,但如果nan存在的过多、可以考虑删掉
# nan可视化
missing = Train_data.isnull().sum()
missing = missing[missing>0]
missing.sort_values(inplace=True)
missing.plot.bar()
- 可视化缺省值
# 可视化看下缺省值
msno.matrix(Train_data.sample(250)) # sample(250)表示抽取表格中250个样本
上图是代码运行后得到的结果,白线越多,代表缺失值越多
msno.bar(Train_data.sample(1000))
利用条形图可以更直观的看出每个变量缺失的比例和数量情况。
msno.matrix(Test_data.sample(250))
我们可以一目了然的看到每个变量的缺失情况:测试集的缺省和训练集的差不多情况, 可视化有三列有缺省,fuelType缺省得最多, 参考缺失值可视化处理–missingno
msno.bar(Test_data.sample(1000))
- 异常值检测
Train_data.info()
还记得前面的describe()统计信息时,由于notRepairedDamage列是object类型,所以没有统计进去。所以,当发现有object类型的字段时,应该单独拿出来看一下其取值情况,以防存在数值脏乱情况,应该对数据保持一种怀疑的态度,以防人为标注的时候出现的错误等。数据的检查与修正还是挺重要的, 可参考数据竞赛修炼笔记之工业化工生产预测
# 看看object这个字段的取值情况
Train_data['notRepairedDamage'].value_counts()
可以看出里面有个’-’,这个也代表着缺失。因为很多模型对nan有直接的处理, 这里我们可以先不做处理,先替换为nan,所以字符串类型的要小心缺失的,格式不规范的情况大有