0 介绍
EDA(Exploratory Data Analysis)全名数据探索性分析,是通过了解数据集,了解变量间的相互关系以及变量与预测值之间的关系,从而帮助我们后期更好地进行特征工程和建立模型,是数据挖掘中十分重要的一步。
所需工具: 数据科学库(panadas、numpy)、可视化库(matplotlib)
EDA数据分析步骤如下:
1)数据总览
2)查看数据缺失和异常
3)查看预测值的分布
4)把特征分成特征、数值特征,然后对这两种特征进行更细致的分析
1 EDA分析步骤结构图
图 1 EDA分析步骤结构图
EDA用来分析查看数据的整体情况,挖掘数据中的重要信息,常用的类库有numpy、panadas、matplotlib等:
numpy:是一个用于进行数值计算和科学计算的 Python 库,它提供了一个高效的多维数组对象 ndarray ,以及许多用于操作数组的函数和方法。numpy 通常用来解决涉及到大量数值运算的问题,例如线性代数、傅里叶变换、随机数生成等。
图 2 numpy基础思维导图
panadas:是一个用于进行数据分析和处理的 Python 库,它提供了两种主要的数据结构:Series 和 DataFrame 。Series 是一种一维的带标签的数组,DataFrame 是一种二维的带标签的表格。Pandas 通常用来解决涉及到数据读取、清洗、转换、合并、分组、聚合、统计、可视化等问题,例如处理 CSV 文件、时间序列数据、关系型数据库等。
图 3 panadas 基础思维导图
Matplotlib: 是一个用于进行数据可视化的 Python 库,它提供了各种绘图函数和方法,以及一个面向对象的绘图接口 pyplot 。Matplotlib 通常用来解决涉及到数据展示和分析的问题,例如绘制折线图、柱状图、散点图、饼图、直方图、箱线图等
2 案例
2.1 数据总览
1、加载数据。代码如下:
# package imports
import gc
import pandas as pd
import numpy as np
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
from sklearn import metrics
from sklearn.model_selection import cross_validate, GridSearchCV
from sklearn.model_selection import train_test_split
# 相关全局设置
pd.set_option('display.max_columns', None)
sns.set()
data_train = pd.read_csv('used_car_train_20200313.csv', sep=' ')
data_testA = pd.read_csv('used_car_testA_20200313.csv', sep=' ')
2、查看数据集整体情况
用pandas的.head()等方法,查看数据的具体形式;用.info()查看数据的类型和数据量;用.describe查看数据极值、均值、方差等统计指标以及在回归等问题中,需要保持量纲一致,方法是对变量进行归一化。
data_train.head()._append(data_train.tail())
data_train.describe()
data_train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150000 entries, 0 to 149999
Data columns (total 31 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 SaleID 150000 non-null int64
1 name 150000 non-null int64
2 regDate 150000 non-null int64
3 model 149999 non-null float64
4 brand 150000 non-null int64
5 bodyType 145494 non-null float64
6 fuelType 141320 non-null float64
7 gearbox 144019 non-null float64
8 power 150000 non-null int64
9 kilometer 150000 non-null float64
10 notRepairedDamage 150000 non-null object
11 regionCode 150000 non-null int64
12 seller 150000 non-null int64
13 offerType 150000 non-null int64
14 creatDate 150000 non-null int64
15 price 150000 non-null int64
16 v_0 150000 non-null float64
17 v_1 150000 non-null float64
18 v_2 150000 non-null float64
19 v_3 150000 non-null float64
20 v_4 150000 non-null float64
21 v_5 150000 non-null float64
22 v_6 150000 non-null float64
23 v_7 150000 non-null float64
24 v_8 150000 non-null float64
25 v_9 150000 non-null float64
26 v_10 150000 non-null float64
27 v_11 150000 non-null float64
28 v_12 150000 non-null float64
29 v_13 150000 non-null float64
30 v_14 150000 non-null float64
dtypes: float64(20), int64(10), object(1)
memory usage: 35.5+ MB
data_testA.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50000 entries, 0 to 49999
Data columns (total 30 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 SaleID 50000 non-null int64
1 name 50000 non-null int64
2 regDate 50000 non-null int64
3 model 50000 non-null float64
4 brand 50000 non-null int64
5 bodyType 48587 non-null float64
6 fuelType 47107 non-null float64
7 gearbox 48090 non-null float64
8 power 50000 non-null int64
9 kilometer 50000 non-null float64
10 notRepairedDamage 50000 non-null object
11 regionCode 50000 non-null int64
12 seller 50000 non-null int64
13 offerType 50000 non-null int64
14 creatDate 50000 non-null int64
15 v_0 50000 non-null float64
16 v_1 50000 non-null float64
17 v_2 50000 non-null float64
18 v_3 50000 non-null float64
19 v_4 50000 non-null float64
20 v_5 50000 non-null float64
21 v_6 50000 non-null float64
22 v_7 50000 non-null float64
23 v_8 50000 non-null float64
24 v_9 50000 non-null float64
25 v_10 50000 non-null float64
26 v_11 50000 non-null float64
27 v_12 50000 non-null float64
28 v_13 50000 non-null float64
29 v_14 50000 non-null float64
dtypes: float64(20), int64(9), object(1)
memory usage: 11.4+ MB
3、查看数据缺失和异常
通过查看数据结合赛题给出的数据信息,我们可以把特征分成三部分,分别是日期特征、类别特征、数值特征。然后看看每一维特征的缺失率、类别个数和异常值(异常值不处理可能会造成过拟合)等信息。代码如下:
#这个区别方式适用于没有数据脱敏。这里因为数据脱敏,比如name应该是类别变量。所以此方法这里不适用,只能手动区分了
numeric_features = data_train.select_dtypes(include=[np.number])
date_cols = ['regDate', 'creatDate']
cate_cols = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionCode', 'seller', 'offerType']
num_cols = ['power', 'kilometer'] + ['v_{}'.format(i) for i in range(15)]
data = pd.concat([data_train, data_testA])cols = date_cols + cate_cols + num_cols
tmp = pd.DataFrame()
tmp['count'] = data[cols].count().value
stmp['missing_rate'] = (data.shape[0] - tmp['count']) / data.shape[0]
tmp['nunique'] = data[cols].nunique().values
tmp.index = cols
tmp
#通过小提琴图图查看异常值,以price为例
sns.violinplot(np.log(data_train['price']))
4、查看预测值的分布
目标变量要尽量符合高斯分布。有很多算法的前提假设是数据符合正态分布,例如线性回归里面最小二乘法的一个前提假设就是数据符合正态分布。下面两个图分布是目标变量转换前,转换后。代码如下:
sns.distplot(data_train['price'])
sns.distplot(np.log(data_train['price']))
2.2 数值型特征分析
如果训练集和测试集分布不一致,就要考虑进行分布转换。还好,我们这里数据分布都很一致,不需要转换。代码如下:
tmp = pd.DataFrame(index = num_cols)
for col in num_cols:
tmp.loc[col, 'train_Skewness'] = data_train[col].skew()
tmp.loc[col, 'test_Skewness'] = data_testA[col].skew()
tmp.loc[col, 'train_Kurtosis'] = data_train[col].kurt()
tmp.loc[col, 'test_Kurtosis'] = data_testA[col].kurt()
tmp
2.3 相关性分析
为后期特征选择做准备。代码如下:
#特征与目标变量之前的相关性分析
correlation = data_train[num_cols+['price']].corr()
correlation['price'].sort_values()
#特征相互之间的关系可视化
sns.pairplot(data_train[num_cols+['price']])
#数据太多,取几个做一个大致分析
2.4 类别特征分析
查看类别个数及其分布情况。
类别倾斜非常严重的可以删掉,比如:seller、offerType
有异常值的要处理,比如:notRepairedDamage
代码如下:
for col in cate_cols:
col
data_train[col].value_counts()
3 结语
EDA数据探索性分析是在拿到全新数据集时,通常采用的一个步骤。可以让大家全面了解下数据集的基本情况,和在训练时可能遇到的问题,为后续的训练和分析做准备。数据探索式分析是一种思想,并没有固定的分析方法。我们拿到数据时,要根据数据集的特点,思考具体需要分析哪些内容。
下面是案例数据下载链接: https://download.csdn.net/download/q774798577/88874729