- 学习框架:零基础入门数据挖掘-菜鸟的学习路径
- 这是一个菜鸟的数据挖掘实战记录,目的是快速入门数据挖掘,少走弯路。内容上,由于自己的确是菜得不行,所以在跟随入门级比赛:二手车价格预测进行实战中,会重点叙述学习方法和思路,并补充其他学习资料。
- 内容预计分为六篇正文,本篇是第二篇正文:数据的探索性分析(Exploratory Data Analysis),上一篇我们了解了赛题和数据挖掘流程(“捏泥人”),这一篇将从实战角度探索数据,总结数据分析技巧,依然会将重点放在“为什么这样做”上。
内容大纲如下:
开始前,先导入包和数据集:
# 基础工具包即可
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=' ')
这一步通过数据查看(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())
# 数据信息查看 .info()可以看到每列的type,以及NAN缺失信息
train_data.info()
看框里圈出的部分,发现: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的另外一种表达方式,有的时候需要注意下。
会发现,统计特征有30列,但前面输出特征train_data有31列,是因为这里面是不包括那个object类型的那个字段的统计的,不是数值类型的, 没有中位数,均值,与数值型用describe的区别:
train_data['notRepairedDamage'].describe()
# 结果:
count 150000
unique 3
top 0.0
freq 111361
Name: notRepairedDamage, dtype: object
先看下哪些存在nan值,小的填充大的删除,其中尤其注意object型数据。
# 用isnull()查看每列的存在nan的情况
train_data.isnull().sum()
test_data.isnull().sum()
很明显,存在空值的是 bodytype, fueltype和gearbox。还可以用可视化更明显地看看nan值多少:
missing = train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
# 可视化看下缺省值
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)) # 这个结果不在这里显示了
更多msno包处理缺失值技巧查看缺失值可视化处理–missingno
以上是基础操作,这里还有一个大鱼不要放过!之前有个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()
这次是个回归题,离群点对预测的影响特别大,要格外当心。
若训练集中有影响较大的离群点,可以考虑去掉,但测试集中的离群点就没办法了。
先把训练集读进来,重点看预测目标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,离群点自由飞翔着…
简单eda+baseline
零基础数据挖掘入门系列(二) - 数据的探索性(EDA)分析