EDA(Exploratory Data Analysis)数据探索式分析

本文介绍了如何利用Python库如pandas、numpy和matplotlib进行ExploratoryDataAnalysis(EDA),包括数据总览、缺失值检查、异常值检测、预测值分布分析、数值特征和类别特征探索,以及相关性和可视化。通过实际案例展示了如何对汽车销售数据进行预处理和分析,为后续建模提供准备。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值