数据挖掘组队学习-金融风控0基础入门-Task2

目的

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

学习目标

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

内容

  • 数据总体了解:
    1. 读取数据集并了解数据集大小,原始特征维度;
    2. 通过info熟悉数据类型;
    3. 粗略查看数据集中各特征基本统计量;

  • 缺失值和唯一值:
    1. 查看数据缺失值情况
    2. 查看唯一值特征情况

  • 深入数据-查看数据类型
    1. 查看特征的数值类型有哪些,对象类型有哪些
    2. 划分数值型变量中的连续变量和离散型变量
    3. 数值类别型变量分析
    4. 数值连续型变量分析

  • 数据间相关关系

    1. 特征和特征之间关系
    2. 特征和目标变量之间关系
  • 用pandas_profiling生成数据报告

一、数据总体了解

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns


url = 'D:\天池数据\金融贷款数据\\'
train = pd.read_csv(url + 'train.csv')
testA = pd.read_csv(url + 'testA.csv')

# 1.1 读取数据集并了解数据集大小,原始特征维度;
print('Train data shape:',train.shape)  # (80000,47)
print(train.head())
print('TestA data shape:',testA.shape)  # (20000,48)
print(testA.head())
print(train.columns)

# 1.2 通过info熟悉数据类型;
print(train.info())

# 1.3 粗略查看数据集中各特征基本统计量;
print(train.describe()) # 8 rows × 42 columns
# 展示前三行及后三行数据
print(train.head(3).append(train.tail(3))) # 6 rows X 47 columns

二、缺失值和唯一值

# 2.1 查看数据集中特征缺失值
columnsMssing = train.isnull().any().sum()
print(f'There are {columnsMssing} columns in train dataset with missing values.')
# 上面得到训练集有22列特征有缺失值,进一步查看缺失特征中缺失率大于50%的特征
columnsMssing_fea_dict1 = train.isnull().sum() / len(train)
columnsMssing_fea_dict2 = columnsMssing_fea_dict1.to_dict()

col_null_moreThanhalf = {}
for key,value in columnsMssing_fea_dict2.items():
    if value > 0.5:
        col_null_moreThanhalf[key] = value

print(columnsMssing_fea_dict1) # 每个columns缺失值比例
print(columnsMssing_fea_dict2)
print(col_null_moreThanhalf)   # 每个columns缺失值比例大于50%统计

# 具体的查看缺失特征及缺失率
# nan可视化
print('***********************')
missing = columnsMssing_fea_dict1
missing = missing[missing > 0]
print(missing)
missing.sort_values(inplace=True) # 排序 -> 从小到大
print(missing)
missing.plot.bar()
# plt.show()
# 纵向了解哪些列存在 “nan”, 并可以把nan的个数打印
# 横向比较,在数据集中,某些样本数据的大部分列都是缺失的且样本足够的情况下可以考虑删除

三、深入数据-查看数据类型

# 3.1 查看特征的数值类型有哪些,对象类型有哪些
#类别型特征有时具有非数值关系,有时也具有数值关系。比如‘grade’中的等级A,B,C等,
# 是否只是单纯的分类,还是A优于其他要结合业务判断。
print('*********************   3.1    **************************')
numerical = list(train.select_dtypes(exclude=['object']).columns)
print(numerical)
category_fea = list(filter(lambda x:x not in numerical,list(train.columns)))
print(category_fea)
print(train.grade)
# 数值型变量分析,数值型肯定是包括连续型变量和离散型变量的

# 3.2 划分数值型变量中的连续变量和离散型变量
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(train,numerical)
print(numerical_serial_fea)
print(numerical_noserial_fea)

# 3.3 数值类别型变量分析
train['term'].value_counts() # 离散型变量
print(train['term'].value_counts())
train['homeOwnership'].value_counts() # 离散型变量
train['verificationStatus'].value_counts()#离散型变量
train['initialListStatus'].value_counts()#离散型变量
train['applicationType'].value_counts()#离散型变量
train['policyCode'].value_counts()#离散型变量,无用,全部一个值
train['n11'].value_counts()#离散型变量,相差悬殊,用不用再分析
train['n12'].value_counts()#离散型变量,相差悬殊,用不用再分析

# 3.4 数值连续型变量分析
#每个数字特征得分布可视化
f = pd.melt(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')
plt.show()

四、数据间相关关系

# 4.1 查看某一个数值型变量的分布,查看变量是否符合正态分布,如果
# 不符合正太分布的变量可以log化后再观察下是否符合正态分布。
# 4.2 如果想统一处理一批数据变标准化 必须把这些之前已经正态化的数据提出
# 4.3 正态化的原因:一些情况下正态非正态可以让模型更快的收敛,一些模型要
# 求数据正态(eg. GMM、KNN),保证数据不要过偏态即可,过于偏态可能会影响模型预测结果。

plt.figure(figsize=(16,12))
plt.suptitle('Transaction Values Distribution',fontsize = 22)
plt.subplot(221)
sub_plot_1 = sns.distplot(train['loanaAmnt'])
sub_plot_1.set_title('loanAmnt Distribuition',fontsize = 18)
sub_plot_1.set_xlabel('')
sub_plot_1.set_ylabel('Probability',fontsize=15)

plt.subplot(222)
sub_plot_2 = sns.distplot(np.log(train['loanAmnt']))
sub_plot_2.set_title("loanAmnt (Log) Distribuition", fontsize=18)
sub_plot_2.set_xlabel("")
sub_plot_2.set_ylabel("Probability", fontsize=15)
plt.show()

# 4.4 非数值类别型变量分析
print(category_fea)
print(train['grade'].value_counts())
train['subGrade'].value_counts()
train['employmentLength'].value_counts()
train['issueDate'].value_counts()
train['earliesCreditLine'].value_counts()
train['isDefault'].value_counts()

#
#       总结
#       1.用value_counts()等函数看了特征属性的分布,但是图表是概括原始信息最便捷的方式。
#       2.数无形时少直觉。
#       3.同一份数据集,在不同的尺度刻画上显示出来的图形反映的规律是不一样的。python将数据转化成图表,但结论是否正确需要由你保证。
#
#

# 4.5 单一变量分布可视化
plt.figure(figsize=(8, 8))
sns.barplot(train["employmentLength"].value_counts(dropna=False)[:20],
             train["employmentLength"].value_counts(dropna=False).keys()[:20])
plt.show()

# 4.6 根绝y值不同可视化x某个特征的分布
# 4.6.1 首先查看类别型变量在不同y值上的分布
train_loan_fr = data_train.loc[train['isDefault'] == 1]
train_loan_nofr = data_train.loc[train['isDefault'] == 0]

# 4.6.2 其次查看连续型变量在不同y值上的分布
fig, ((ax1, ax2)) = plt.subplots(1, 2, figsize=(15, 6))
data_train.loc[data_train['isDefault'] == 1] \
    ['loanAmnt'].apply(np.log) \
    .plot(kind='hist',
          bins=100,
          title='Log Loan Amt - Fraud',
          color='r',
          xlim=(-3, 10),
         ax= ax1)
data_train.loc[data_train['isDefault'] == 0] \
    ['loanAmnt'].apply(np.log) \
    .plot(kind='hist',
          bins=100,
          title='Log Loan Amt - Not Fraud',
          color='b',
          xlim=(-3, 10),
         ax=ax2)

# 4.6.3
total = len(data_train)
total_amt = data_train.groupby(['isDefault'])['loanAmnt'].sum().sum()
plt.figure(figsize=(12, 5))
plt.subplot(121)  ##1代表行,2代表列,所以一共有2个图,1代表此时绘制第一个图。
plot_tr = sns.countplot(x='isDefault', data=data_train)  data_train‘isDefault’这个特征每种类别的数量**
plot_tr.set_title("Fraud Loan Distribution \n 0: good user | 1: bad user", fontsize=14)
plot_tr.set_xlabel("Is fraud by count", fontsize=16)
plot_tr.set_ylabel('Count', fontsize=16)
for p in plot_tr.patches:
    height = p.get_height()
     plot_tr.text(p.get_x() + p.get_width() / 2.,
                 height + 3,
                '{:1.2f}%'.format(height / total * 100),
                 ha="center", fontsize=15)

percent_amt = (data_train.groupby(['isDefault'])['loanAmnt'].sum())
percent_amt = percent_amt.reset_index()
plt.subplot(122)
plot_tr_2 = sns.barplot(x='isDefault', y='loanAmnt', dodge=True, data=percent_amt)
plot_tr_2.set_title("Total Amount in loanAmnt  \n 0: good user | 1: bad user", fontsize=14)
plot_tr_2.set_xlabel("Is fraud by percent", fontsize=16)
plot_tr_2.set_ylabel('Total Loan Amount Scalar', fontsize=16
for p in plot_tr_2.patches:
     height = p.get_height()
     plot_tr_2.text(p.get_x() + p.get_width() / 2.,
                    height + 3,
                    '{:1.2f}%'.format(height / total_amt * 100),
                    ha="center", fontsize=15)

# 4.7 时间格式数据处理及查看
#转化成时间格式  issueDateDT特征表示数据日期离数据集中日期最早的日期(2007-06-01)的天数
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');
#train 和 test issueDateDT 日期有重叠 所以使用基于时间的分割进行验证是不明智的

# #透视图 索引可以有多个,“columns(列)”是可选的,聚合函数aggfunc最后是被应用到了变量“values”中你所列举的项目上。
pivot = pd.pivot_table(data_train, index=['grade'], columns=['issueDateDT'], values=['loanAmnt'], aggfunc=np.sum)

五、用pandas_profiling生成数据报告

# 5. 用pandas_profiling生成数据报告
import pandas_profiling
pfr = pandas_profiling.ProfileReport(data_train)
pfr.to_file("./example.html")

总结

这个阶段的主要工作还是借助于各个简单的统计量来对数据整体的了解,分析各个类型变量相互之间的关系,以及用合适的图形可视化出来直观观察。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值