文章目录
-
- 1. EDA概述
- 2. 目的
- 3. 内容
-
-
- 1. 数据总体了解
- 2. 查看特征的缺失值,唯一值
- 3. 查看特征的数值类型有哪些,对象类型有哪些
- 4. 查看时间格式数据
- 5. 透视图
-
- 4. 总结
1. EDA概述
EDA (Exploratory Data Analysis),也就是对数据进行探索性的分析,从而为之后的数据预处理和特征工程提供必要的结论。
主要的步骤有:
- 理解问题;
- 读取数据;
- 数据预预处理(处理成易于分析的格式)
- 初步探索;
- 多变量探索;
- 数据预处理;
- 建立假设,并检验。
2. 目的
1.EDA的价值主要在于熟悉了解整个数据集的基本情况(缺失值,异常值),对数据集进行验证是否可以进行接下来的机器学习或者深度学习建模。
2.了解变量间的相互关系、变量与预测值之间的存在关系。
3.为特征工程做准备
在分析数据的过程中,还必须要弄清楚的以下数据相关的问题:
数据量是否充分,是否有外部数据可以进行补充;
训练集和测试集的数据分布是否有差异;
3. 内容
首先导入数据分析过程常用的一些库:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import warnings# 忽略警告
warnings.filterwarnings('ignore')
1. 数据总体了解
a. 读取数据集并了解数据集大小,原始特征维度;
b. 通过info熟悉数据类型;
c. 粗略查看数据集中各特征基本统计量;
# 读取数据
data_train = pd.read_csv(r'data\train.csv')
data_test = pd.read_csv(r'data\testA.csv')
# 查看训练集数据
print('查看训练集:')
# 数据维度
print(data_train.shape)
# 数据类型
print(data_train.info())
# 数据基本信息
print(data_train.describe())
# 查看测试集数据
print('查看测试集:')
# 数据维度
print(data_test.shape)
# 数据类型
print(data_test.info())
# 数据基本信息
print(data_test.describe())
2. 查看特征的缺失值,唯一值
- 查看缺失值
# 不同特征的缺失值数量
fea_mis= data_train.isnull().sum()
print(fes_mis)
# 可视化存在缺失值的特征
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
了解哪些列存在 “nan”, 并可以把nan的个数打印,主要的目的在于 nan存在的个数是否真的很大,如果很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,但如果nan存在的过多、可以考虑删掉。
缺失值填充的方案有很多,一般根据需求来进行选择,常用的填充方法有固定值填充,平均数填充等。
- 查看只有唯一值的特征
# 训练集
one_value_fea = [col for col in data_train.columns if data_train[col].nunique() <= 1]
# 测试集
one_value_fea_test = [col for col in data_test_a.columns if data_test_a[col].nunique() <= 1]
特征只有唯一值时,一般不具备分析意义,可以选择删除。
3. 查看特征的数值类型有哪些,对象类型有哪些
- 查看特征的类型,如类别型特征和对象型特征
# 查看数值型特征
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)
# 查看类别型特征,这里有两种方法,一种是直接利用select_dtypes方法获取,另一种是根据已经得知的数值型特征对所有特征进行过滤
# 方法一 select_dtypes方法
category_fea = list(data_train.select_dtypes(include=['object']).columns)
# 方法二 过滤法
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))
- 数值型变量包括连续型和离散型,需要进一步分析
#过滤数值型类别特征
def get_numerical_serial_fea(data,feas): numerical_serial_fea = [] numerical_noserial_fea = [] for fea in feas: temp = data[fea].nunique() if temp <= 10: numerical_noserial_fea.append(fea) continue numerical_serial_fea.append(fea) return numerical_serial_fea,numerical_noserial_fea
numerical_serial_fea,numerical_noserial_fea = get_numerical_serial_fea(data_train,numerical_fea)
(1) 连续型变量
对于连续型变量,一般需要通过可视化查看特征的变量是否符合正泰分布,如果不符合可以log化之后再观察是否符合正态分布。
如果想统一处理一批数据变标准化, 必须把这些之前已经正态化的数据提出。
# 每个数字特征得分布可视化
f = pd.melt(data_train, value_vars=numerical_serial_fea)
g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False)
g = g.map(sns.distplot, "value")
(2) 离散型变量
对于离散型变量,也需要了解其变量分布情况,观察其分布是否相差悬殊,如果相差悬殊可以考虑整合变量减少差距。如果存在只有唯一值的特征,一般直接删除。
# 用循环遍历查看离散型数据的分布情况
for fea in numerical_noserial_fea:fea_values = data_train[fea].value_counts()print(fea_values)
4. 查看时间格式数据
#转化成时间格式
# 训练集
data_train['issueDate'] = pd.to_datetime(data_train['issueDate'],format='%Y-%m-%d')
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
data_train['issueDateDT'] = data_train['issueDate'].apply(lambda x: x-startdate).dt.days
# 测试集
data_test_a['issueDate'] = pd.to_datetime(data_train['issueDate'],format='%Y-%m-%d')
startdate = datetime.datetime.strptime('2007-06-01', '%Y-%m-%d')
data_test_a['issueDateDT'] = data_test_a['issueDate'].apply(lambda x: x-startdate).dt.days
# 可视化
plt.hist(data_train['issueDateDT'], label='train');
plt.hist(data_test_a['issueDateDT'], label='test');
plt.legend();
plt.title('Distribution of issueDateDT dates');
5. 透视图
数据透视表是一种交互式的表,可以自由选择多个字段的不同组合,用于快速汇总、分析大量数据中字段与字段之间的关联关系。使用数据透视表可以按照数据表格的不同字段从多个角度进行透视,并建立交叉表格,用以查看数据表格不同层面的汇总信息、分析结果以及摘要数据。
数据透视表主要的用途是用来以更加友好和清晰的方式来查看大量的表格数据。
- 对数值数据快速分类汇总,按分类和子分类查看数据信息。
- 展开或折叠所关注的数据,快速查看摘要数据的明细信息。
- 建立交叉表格(将行移动到列或将列移动到行),以查看数据的不同汇总。
- 快速的计算数值数据的汇总信息、差异等。
#透视图 索引可以有多个,“columns(列)”是可选的,聚合函数aggfunc最后是被应用到了变量“values”中你所 列举的项目上。
pivot = pd.pivot_table(data_train, index=['grade'], columns=['issueDateDT'], values= ['loanAmnt'], aggfunc=np.sum)
4. 总结
数据探索性分析是我们初步了解数据,熟悉数据为特征工程做准备的阶段,甚至很多时候EDA阶段提取出来的特征可以直接当作规则来用。可见EDA的重要性,这个阶段的主要工作还是借助于各个简单的统计量来对数据整体的了解,分析各个类型变量相互之间的关系,以及用合适的图形可视化出来直观观察。