菜鸟的数据挖掘实战(二)-数据的探索性分析EDA

  • 学习框架:零基础入门数据挖掘-菜鸟的学习路径
  • 这是一个菜鸟的数据挖掘实战记录,目的是快速入门数据挖掘,少走弯路。内容上,由于自己的确是菜得不行,所以在跟随入门级比赛:二手车价格预测进行实战中,会重点叙述学习方法和思路,并补充其他学习资料。
  • 内容预计分为六篇正文,本篇是第二篇正文:数据的探索性分析(Exploratory Data Analysis),上一篇我们了解了赛题和数据挖掘流程(“捏泥人”),这一篇将从实战角度探索数据,总结数据分析技巧,依然会将重点放在“为什么这样做”上。

内容大纲如下:

  • 预测值分布(查看预测值总体分布与具体频数)
  • 数据统览(通过数据形状、类型与相关统计量,把握之后的发展方向)
  • 数据缺失与异常(介绍判断数据缺失与异常的技巧,并进行初步处理)
  • 数值特征与类型特征(区分字段类型,针对两种数据类型分别挖掘,基础分析与相关可视化)
  • 数据报告(介绍好用的数分神器pandas_profiling与那些年我安装时走过的坑)
    篇幅原因,数值特征与类型特征部分放在下一篇来讲

开始前,先导入包和数据集:

# 基础工具包即可
import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno   # 缺失值的可视化处理


"""导入数据集"""
train_data = pd.read_csv('./dataset/used_car_train_20200313.csv', sep=' ')   # 这个地方注意需要指定分隔符空格
test_data = pd.read_csv('./dataset/used_car_testA_20200313.csv', sep=' ')

1.数据通览

这一步通过数据查看(head,tail),数据信息(info,了解除nan外符号异常),行列信息(shape),数据的统计特征(describe)等大致了解数据。

# 查看数据的形状 注意数据的行和列
print('train_data_shape:', train_data.shape)
print('test_data_shape:', test_data.shape)

# 数据简要概览
train_data.head().append(train_data.tail())
test_data.head().append(test_data.tail())

菜鸟的数据挖掘实战(二)-数据的探索性分析EDA_第1张图片

  • trick:经常看数据集的head()以及shape是个好习惯,初学者建议执行一步看一下,有问题也可以及时发现,同时有效避免一个问题没解决,带来更大的错误。
    从忠哥那里了解到,数据的维度也很重要:“太多的行会导致花费大量时间来训练算法得到模型, 太少的数据会导致对算法训练不充分,得不到合适的模型 如果数据有太多的特征,会引起某些算法性能低下的问题。” 所以数据列数也要熟记于心。
# 数据信息查看 .info()可以看到每列的type,以及NAN缺失信息
train_data.info()

菜鸟的数据挖掘实战(二)-数据的探索性分析EDA_第2张图片
看框里圈出的部分,发现:1.有一些字段不是150000个,说明存在空值,清洗时要处理缺失;2.字段的类型中有一个是object,而不是数值型(int或者float),前文提到过info()就是用于查看符号异常的,这不,发现了一个。

# 通过.columns查看列名
train_data.columns

# 数据的统计信息概览 数据记录数,平均值,标准方差, 最小值,下四分位数, 中位数, 上四分位数,最大值
train_data.describe()

describe中有每列(数值列)的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以 及最大值。用于瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现 999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下。
菜鸟的数据挖掘实战(二)-数据的探索性分析EDA_第3张图片
会发现,统计特征有30列,但前面输出特征train_data有31列,是因为这里面是不包括那个object类型的那个字段的统计的,不是数值类型的, 没有中位数,均值,与数值型用describe的区别:

train_data['notRepairedDamage'].describe()

# 结果:
count     150000
unique         3
top          0.0
freq      111361
Name: notRepairedDamage, dtype: object

2.数据缺失与异常

先看下哪些存在nan值,小的填充大的删除,其中尤其注意object型数据。

# 用isnull()查看每列的存在nan的情况
train_data.isnull().sum()
test_data.isnull().sum()

菜鸟的数据挖掘实战(二)-数据的探索性分析EDA_第4张图片
很明显,存在空值的是 bodytype, fueltype和gearbox。还可以用可视化更明显地看看nan值多少:

missing = train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()

菜鸟的数据挖掘实战(二)-数据的探索性分析EDA_第5张图片

  • trick:通过以上两句可以很直观的了解哪些列存在 “nan”, 并可以把nan的个数打印,主要的目的在于 nan存在的个数是 否真的很大,如果很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,但如果nan存在的过多、可以考虑删掉。
    用msno包可视化缺省值:
# 可视化看下缺省值
msno.matrix(train_data.sample(250))  # sample(250)表示抽取250个样本。
#msno.matrix(test_data.sample(250))
# 上图是代码运行后得到的结果,白色的是缺失值

#msno.bar(train_data.sample(1000))
msno.bar(test_data.sample(1000))   # 这个结果不在这里显示了

菜鸟的数据挖掘实战(二)-数据的探索性分析EDA_第6张图片
更多msno包处理缺失值技巧查看缺失值可视化处理–missingno
以上是基础操作,这里还有一个大鱼不要放过!之前有个object字段还记得吗?拿出来单独看一下值

  • 要对数据保持怀疑谨慎的态度,尤其object字段。因为很可能出现错误或缺失。
# 看看object这个字段的取值情况
train_data['notRepairedDamage'].value_counts()

## 结果:
0.0    111361
-       24324
1.0     14315
Name: notRepairedDamage, dtype: int64

这个“-”很明显是缺失的一种表示,恭喜你逮住一条落网之鱼!
因为很多模型对nan有直接的处理, 这里我们可以先不做处理,先替换为nan。

train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)
# test_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

# 这时候再看缺失  就会发现缺省值最多的是这个notRepairedDamage字段
train_data.isnull().sum()

菜鸟的数据挖掘实战(二)-数据的探索性分析EDA_第7张图片

3.预测值分布

这次是个回归题,离群点对预测的影响特别大,要格外当心。
若训练集中有影响较大的离群点,可以考虑去掉,但测试集中的离群点就没办法了。

先把训练集读进来,重点看预测目标price的情况。

import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings('ignore')
pd.set_option('display.max_columns', None)


train_df = pd.read_csv('used_car_train_20200313.csv', sep=' ')
print(train_df.shape)
train_df.describe()

发现均值在5900左右,标准差在7500左右,而最大值居然有99999,离群点自由飞翔着…

  • trick:describe()用于查看数据基本特性,是EDA中最常用的操作

参考资料

简单eda+baseline
零基础数据挖掘入门系列(二) - 数据的探索性(EDA)分析

你可能感兴趣的:(零基础入门数据挖掘)