阿里云天池金融风控训练营【task2 数据分析】学习笔记

金融风控训练营 Task2 数据分析 学习笔记

本学习笔记为阿里云天池龙珠计划金融风控训练营的学习内容,学习链接为:https://tianchi.aliyun.com/specials/activity/promotion/aicampfr

一、学习知识点概要

文章目录

  • 金融风控训练营 Task2 数据分析 学习笔记
      • 一、学习知识点概要
      • 二、学习内容
        • 1. 目的
        • 2. 内容介绍
        • 3. 代码示例
          • 1. 数据分析及可视化需要的库
          • 2. 具体操作步骤
      • 三、学习问题与解答
      • 四、学习思考与总结

二、学习内容

1. 目的

  1. EDA价值主要在于熟悉了解整个数据集的基本情况(缺失值,异常值),对数据集进行验证是否可以进行接下来的机器学习或者深度学习建模.

  2. 了解变量间的相互关系、变量与预测值之间的存在关系。

  3. 为特征工程做准备

2. 内容介绍

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

3. 代码示例

1. 数据分析及可视化需要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns #基于matplotlib的图形可视化包
import datetime #处理日期和时间
import warnings
warnings.filterwarnings('ignore')

import warnings warnings.filterwarnings('ignore')

部分代码正常运行,但会提示警告,使用警告过滤器进行控制是否输出警告消息(上述代码表示忽略警告消息)

warnings.filterwarnings(action, 
						message='', #包含正则表达式的字符串,警告消息的开始必须匹配,不区分大小写
						category=Warning, #警告类型
						module='', #包含模块名称的正则表达式字符串
						lineno=0, #警告发生的行号,为 0 则匹配所有行号
						append=False) #为真时,在末尾插入

其中action:

处理方式
“error” 将匹配警告转换为异常
“ignore” 忽略匹配的警告
“always” 始终输出匹配的警告
“default” 对于同样的警告只输出第一次出现的警告
“module” 在一个模块中只输出第一次出现的警告
“once” 输出第一次出现的警告,而不考虑它们的位置
2. 具体操作步骤
  1. 读取 pd.read_csv() ,查看表格

    data_train_sample = pd.read_csv("train.csv",nrows=5)  #nrows设置可以读取文件的前几行
    data_train_sample.head()   #xx.head()是读取前五行,如果nrows<5,则只会显示nrows行
    

    如果相对路径载入报错时,使用os.getcwd() 查看当前工作目录

    import os
    os.getcwd()
    

    分块读取

    #设置chunksize参数,来控制每次迭代数据的大小
    i = 0  #控制输出
    chunker = pd.read_csv("train.csv",chunksize=5)
    for item in chunker:
        print(type(item)) #
        print(len(item))
        i+=1
        if i >= 4:   # 由于数据量过大,限制输出4条就跳出循环
            break
    
  2. 总体了解

    1. df.shape 查行列数

    2. df.columns 查看列名

    3. df.info() 粗略查看数据类型

      行数,列数,列索引,列非空值个数,列类型,内存占用

      阿里云天池金融风控训练营【task2 数据分析】学习笔记_第1张图片

      df.describe() 查看基本统计量

      均值,标准差,最大值,最小值,分位数等

    4. df.head(n).append(df.tail(n)) 查看前n行以及后n行

  3. 查看特征缺失值、唯一值等

    1. df.isnull().any().sum() isnull()判断缺失值,isnull().any()判断哪些列存在缺失值,sum()计算个数

    2. df[df.isnull().values==True].head() 只显示存在缺失值的行列,确定缺失值的位置

    3. 查看缺失率大于50%的特征

      have_null_fea_dict = (data_train.isnull().sum()/len(data_train)).to_dict()#to_dict转化为字典类型
      fea_null_moreThanHalf = {
               }
      for key,value in have_null_fea_dict.items():
          if value > 0.5:
              fea_null_moreThanHalf[key] = value  #存进去
      
    4. 根据缺失特征及缺失率绘图

      missing = df.isnull().sum()/len(df) #缺失值占比
      missing = missing[missing > 0]  #筛选大于0的数,没有缺失值的不显示
      missing.sort_values(inplace=True)  #排序,True排序后的数据集替换原来的数据
      missing.plot.bar() #绘图
      
      • 如果nan存在的过多,说明这一列对label的影响几乎不起作用了,可以考虑删掉。如果缺失值很小一般可以选择填充。
      • 横向比较,如果在数据集中,某些样本数据的大部分列都是缺失的且样本足够的情况下可以考虑删除
      • lgb模型可以自动处理缺失值
    5. 唯一值 one_value_fea = [col for col in df.columns if df[col].nunique() <= 1]

      • unique() 返回列的所有唯一值

      • nunique() 返回的是唯一值的个数

  4. 查看特征的数值类型、对象类型

    1. select_dtypes 数值类型

      df.select_dtypes(include=['int32','int64])

      df.select_dtypes(include=['object']).columns #类别为object的列名

      df.select_dtypes(exclude=['object']).columns #除了类别为object的列名

    2. 使用代码逻辑进行过滤数值型类别特征

      eg.

      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)
      
    3. 数值连续性变量分析

      阿里云天池金融风控训练营【task2 数据分析】学习笔记_第2张图片

      • pd.melt 将数据转换为对计算机友好的函数

        参数 含义
        frame 用于处理的数据集
        id_vars [元组,列表或ndarray,可选] 用作标识符变量的列
        value_vars [元组,列表或ndarray,可选] 要取消透视的列。如果未指定,则使用未设置为id_vars的所有列
        var_name [scalar] 用于“变量”列的名称。如果为None,则使用frame.columns.name或’variable’
        value_name [标量,默认为’value’] 用于“ value”列的名称
        col_level [int或string,可选] 如果列是MultiIndex,则使用此级别进行融合
      • seaborn.FacetGrid 画图

        http://seaborn.pydata.org/generated/seaborn.FacetGrid.html#seaborn.FacetGrid

    4. 阿里云天池金融风控训练营【task2 数据分析】学习笔记_第3张图片

      1. plt.figure 在plt中绘制一张图片

        figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

        • num: 图像编号或名称,数字为编号 ,字符串为名称
        • figsize: 指定figure的宽和高,单位为英寸
        • dpi: 指定绘图对象的分辨率
        • facecolor: 背景颜色
        • edgecolor: 边框颜色
        • frameon: 是否显示边框
      2. plt.suptitle 添加总标题

      3. plt.subplot 创建单个子图

        plt.subplot(221)  #分成2x2,占用第一个,即第一行第一列的子图
        plt.subplot(222)  #分成2x2,占用第二个,即第一行第二列的子图
        plt.subplot(212)  #分成2x1,占用第二个,即第二行
        

        plt.subplots 创建多个子图(写一次代码即可)

        fig,axes=plt.subplots(2,2) #2行2列
        ax1=axes[0,0]
        ax2=axes[0,1]
        ax3=axes[1,0]
        ax4=axes[1,1]
         
        #作图1
        ax1.plot(x, x) #后面类似
        

        add_subplot 给figure新增子图

        add_axes 新增子区域

      4. sns.distplot

        #displot参数如下
        sns.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
        
        • hist: 控制是否显示条形图,默认为True

        • kde: 控制是否显示核密度估计图,默认为True

        • rug: 控制是否显示观测的小细条(边际毛毯)默认为false

        • fit: 设定函数图像,与原图进行比较

        • axlabel: 设置x轴的label

        • ax: 图片位置

  5. 变量分布可视化

    1. 单一变量分布可视化

      sns.barplot 柱形图

      plt.figure(figsize=(8, 8))
      sns.barplot(data_train["employmentLength"].value_counts(dropna=False)[:20],
                  data_train["employmentLength"].value_counts(dropna=False).keys()[:20])
      plt.show()
      
    2. 根绝y值不同可视化x某个特征的分布

      • 查看类别型变量在不同y值上的分布
      • 查看连续型变量在不同y值上的分布
    3. 时间格式数据处理及查看

      将其转换为时间格式,再进行画图

  6. 透视图

    pivot = pd.pivot_table(df, index=['grade'], columns=['issueDateDT'], values=['loanAmnt'], aggfunc=np.sum)
    

    完成对复杂数据的分析统计功能,常常伴随降维的效果

    pd.pivot_table pandas提供的数据透视表

    • values : 待聚合的列名

    • index : 行索引列名

    • columns : 列索引列名

    • aggfunc : 聚合统计函数,可以是单个函数,也可以是函数列表,还可以是字典格式,默认聚合函数为均值。

      当该参数传入字典格式时,key为列名,value为聚合函数值,此时values参数无效

    • fill_value : 缺失值填充值,默认为None(透视后可能存在的缺失值,非原表缺失值)

    • margins : 是否加入汇总列,默认为False(Excel透视表中的行小计和列小计)

    • margins_name : 汇总列的列名,与上一个参数配套使用,默认为’All’(margins=False时无效)

    • dropna : 是否丢弃汇总结果中全为NaN的行或列,默认为True

    • observed : 适用于分类变量,一般无需关注

  7. 用pandas_profiling生成数据报告

    import pandas_profiling
    pfr = pandas_profiling.ProfileReport(data_train)
    pfr.to_file("./example.html")
    

三、学习问题与解答

lambda匿名函数

  • lambda x: x * x 相对于

    def f(x):

    ​ return x * x

    冒号前面的x表示函数的参数

四、学习思考与总结

善于使用检索解决问题

以下贴出师兄的原话:

  • Q: 数据探索主要干些什么?
    A: ①找到object特征,后面要转换这个object变量,因为后面的特征衍生和模型object变量不能用;②然后就是特征的缺失值分析和异常值分析;③连续变量的密度分布分析,离散变量的count统计量看看样本的值均不均衡。以及特征和标签交叉分析利用groupby
  • 比如 describe函数 对数据的描述,你可以观察 所有特征的max()和min(),你再看看特征的含义 比如年龄,如果年龄的max是几百 是负多少多少的话 肯定是异常了。
    比如 value_counts函数 特征的取值如果是0和1 ,0的有几十个,1的有几万个。那么 一个特征几乎全是一个值换句话说方差(也可以叫熵)几乎为0对于我预测是没有用的
  • ipy文件里的分析不一定都有用。多想想这个分析对后面有什么帮助,对自己理解数据有什么帮助
  • Q:想问问怎么学数据挖掘的相关算法的?
    A:b站的视频 比如李宏毅和吴恩达的机器学习课程。 西瓜书也可以。 平时可以去看看公众号Datawhale或者博客

你可能感兴趣的:(python,数据分析,大数据)