探索性数据分析(EDA)

392 阅读2分钟

目的

  • EDA价值主要在于熟悉了解整个数据集的基本情况(缺失值,异常值),对数据集进行验证是否可以进行接 下来的机器学习或者深度学习建模.
  • 了解变量间的相互关系、变量与预测值之间的存在关系。
  • 为特征工程做准备

学习目标

  • 学习如何对数据集整体概况进行分析,包括数据集的基本情况(缺失值,异常值)
  • 学习了解变量间的相互关系、变量与预测值之间的存在关系

内容介绍

  • 数据总体了解:
    • 读取数据集并了解数据集大小,原始特征维度;
    • 通过info熟悉数据类型;
    • 粗略查看数据集中各特征基本统计量;
  • 缺失值和唯一值:
    • 查看数据缺失值情况
    • 查看唯一值特征情况
  • 深入数据-查看数据类型
    • 类别型数据
    • 数值型数据
      • 离散数值型数据
      • 连续数值型数据
  • 数据间相关关系
    • 特征和特征之间关系
    • 特征和目标变量之间关系
  • 用pandas_profiling生成数据报告

代码示例

导入数据分析及可视化过程需要的库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
import warnings
warnings.filterwarnings('ignore')

读取文件

data_train = pd.read_csv('train.csv')
data_test_a = pd.read_csv('./testA.csv')
data_train_sample = pd.read_csv('./train.csv',nrows=5)
# 设置chunksize参数,来控制每次迭代数据的大小
chunker = pd.read_csv("train.csv",chunksize=5)
for item in chunker:
    print(type(item))
    print(len(item))

总体了解

查看数据集的样本个数和原始特征维度

data_test_a.shape
data_train.shape
data_train.columns
data_train.info()
data_train.describe()
data_train.head(3).append(data_train.tail(3))

查看数据集中特征缺失值,唯一值等

1.查看缺失值

print(f'There are {data_train.isnull().any().sum()} colunns in train dataset with missing values.')

2.查看具体特征缺失及缺失率

# nan可视化
missing = data_train.isnull().sum()/len(data_train)
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()

💡了解存在哪些“nan”,并将nan的个数打印,主要的目的在于nan存在的个数是否真的很大,如果很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,但如果nan存在的过多、可以考虑删掉

3.查看训练测试集中特征属性只有一值的特征

one_value_fea = [col for col in data_train.columns if data_train[col].nunique()<=1]
one_value_fea

one_value_fea_test = [col for col in data_test_a.columns if data_test_a[col].nunique()<=1]
one_value_fea_test

print(f'There are {len(one_value_fea)} columns in train dataset with ont unique value.')

print(f'There are {len(one_value_fea_test)} columns in test dataset with one unique value.')

查看啊特征的数值有哪些,对象类型有哪些

  • 特征一般都是由类别型特征和数值型特征组成
  • 类别型特征有时具有非数值关系,有时也具有数值关系。比如‘grade’中的等级A,B,C等,是否只是单纯的 分类,还是A优于其他要结合业务判断。
  • 数值型特征本是可以直接入模的,但往往风控人员要对其做分箱,转化为WOE编码进而做标准评分卡等操作。从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)
numerical_fea

category_fea = list(filter(lambda x:x not in numerical_fea,list(data_train.columns)))
category_fea

data_train.grade

数值型变量分析,包括连续型变量和离散型变量 1.划分数值型变量中的连续变量和分类变量

# 划分数值型变量中的连续变量和分类变量
# 过滤数值型类别特征
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)
numerical_serial_fea

numerical_noserial_fea

2.数值类别变量分析

data_train['term'].value_counts()
data_train['homeOwnership'].value_counts()
data_train['verificationStatus'].value_counts()
data_train['initialListStatus'].value_counts()
data_train['applicationType'].value_counts()
data_train['policyCode'].value_counts()
data_train['n11'].value_counts()
data_train['n12'].value_counts()

参考资料:DataWhale社区组队学习