1.内容介绍:
在EDA步骤的主要内容如下(电脑安装pandas_profiling一直出问题,后续再找找原因):
- 数据总体了解:
- 读取数据集并了解数据集大小,原始特征维度;
- 通过info熟悉数据类型;
- 粗略查看数据集中各特征基本统计量;
- 缺失值和唯一值:
- 查看数据缺失值情况
- 查看唯一值特征情况
- 深入数据-查看数据类型
- 类别型数据
- 数值型数据
- 离散数值型数据
- 连续数值型数据
- 数据间相关关系
- 特征和特征之间关系
- 特征和目标变量之间关系
- 用pandas_profiling生成数据报告
2 代码
2.1 导入数据与库
按照常规操作导入数据。
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)
2.2总体了解
# 查看数据集的样本个数和原始特征维度
data_test_a.shape
data_train.columns
data_train.info()
data_train.describe()
data_train.head(3).append(data_train.tail(3))
- 查看数据集中特征缺失值,唯一值等
# 查看缺失值
print(f'There are {data_train.isnull().any().sum()} columns in train dataset with missing values.')
#进一步查看缺失特征中缺失率大于50%的特征,判断这些特征还能不能用
have_null_fea_dict = (data_train.isnull().sum()/len(data_train)).to_dict()
fea_null_moreThanHalf = {}
for key,value in have_null_fea_dict.items():
if value > 0.5:
fea_null_moreThanHalf[key] = value
# nan可视化,方便查看
missing = data_train.isnull().sum()/len(data_train)
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
# 查看训练集测试集中特征属性只有一值的特征,这些对于分析时无效的,可以考虑删掉
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]
one_value_fea
one_value_fea_test
print(f'There are {len(one_value_fea)} columns in train dataset with one unique value.')
print(f'There are {len(one_value_fea_test)} columns in test dataset with one unique value.')
2.3 查看特征的数值类型,对象类型
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))
numerical_fea
category_fea
data_train.grade
'''
划分数值型变量中的连续变量和离散型变量
'''
#过滤数值型类别特征
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
# 数值类别型变量分析
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()#离散型变量,相差悬殊,用不用再分析
# 数值连续型变量分析
#每个数字特征得分布可视化
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")
(后面的我再补补)