零基础入门数据挖掘-二手车交易价格预测之数据分析
文章目录
0.前言
探索性数据分析,即EDA(exploratory Data Analysis)的目标是:
- EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用。
- 当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。
- 引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。
- 完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡。
代码见我的Github
1. 代码示例
所有代码均是在jupyter notebook
中运行,可以实时查看处理数据的结果。
1.1 载入各种数据科学以及可视化库
- 数据科学库:pandas、numpy、scipy
- 可视化库:matplotlib、seabon
- 其他
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno
1.2 载入数据
## 1) 载入训练集和测试集;
path = './'
Train_data = pd.read_csv(path+'used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv(path+'used_car_testA_20200313.csv', sep=' ')
我是把数据放在当前文件夹下的,`"./"代表的就是当前文件夹。
所有特征都脱敏处理了
Field | Description |
---|---|
SaleID | 交易ID,唯一编码 |
name | 汽车交易名称,已脱敏 |
regDate | 汽车注册日期,例如20160101,2016年01月01日 |
model | 车型编码,已脱敏 |
brand | 汽车品牌,已脱敏 |
bodyType | 车身类型:豪华轿车:0,微型车:1,厢型车:2,大巴车:3,敞篷车:4,双门汽车:5,商务车:6,搅拌车:7 |
fuelType | 燃油类型:汽油:0,柴油:1,液化石油气:2,天然气:3,混合动力:4,其他:5,电动:6 |
gearbox | 变速箱:手动:0,自动:1 |
power | 发动机功率:范围 [ 0, 600 ] |
kilometer | 汽车已行驶公里,单位万km |
notRepairedDamage | 汽车有尚未修复的损坏:是:0,否:1 |
regionCode | 地区编码,已脱敏 |
seller | 销售方:个体:0,非个体:1 |
offerType | 报价类型:提供:0,请求:1 |
creatDate | 汽车上线时间,即开始售卖时间 |
price | 二手车交易价格(预测目标) |
v系列特征 | 匿名特征,包含v0,v1,v2,…,v14在内15个匿名特征 |
观察前几个和后几个数据:
## 2) 简略观察数据(head()+shape)
Train_data.head().append(Train_data.tail())
同理可以查看测试数据:
1.3 纵览数据概况
- 查看数据前5行:dataframe.head()
- 查看数据的信息,包括每个字段的名称、非空数量、字段的数据类型:data.info()
- 查看数据的统计概要(count/mean/std/min/25%/50%/75%max):data.describe()
- 查看dataframe的大小:dataframe.shape
- 按列/数组排序
- 按某列排序:正序(倒序)df.groupby([‘列名’]).cumcount()
- 对该列或该行进行值排序:sort_values(by=“列名/行名”)
- 对数组进行升序排序,返回索引值。降序的话可以给a加负号。 numpy.argsort(a) 或者 a.argsort()
- 数据相加
- a.sum(axis=1) :a为数组,sum(axis=1)表示每行的数相加,平时不加axis则默认为0,为0表示每列的数相加。
- 字典操作
-
sorted对字典或者列表的后面一个值排序
sorted(dic.items() , key=lambda x:x[1] , reverse=True )
sorted (dic.items(),key=operator.itemgetter(1) ,reverse=True)
-
字典的get函数:
dic.get(key,0)相当于if ……else ,若key在字典dic中则返回dic[key]的值,若不在则返回0。
-
1.4 判断数据缺失和异常
数据缺失的类型
- 完全随机缺失(missing completely at random,MCAR):指的是数据的缺失是完全随机的,不依赖于任何不完全变量或完全变量,不影响样本的无偏性,如家庭地址缺失;
- 随机缺失(missing at random,MAR):指的是数据的缺失不是完全随机的,即该类数据的缺失依赖于其他完全变量,如财务数据缺失情况与企业的大小有关;
- 非随机缺失(missing not at random,MNAR):指的是数据的缺失与不完全变量自身的取值有关,如高收入人群不原意提供家庭收入;
对于随机缺失和非随机缺失,直接删除记录是不合适的,原因上面已经给出。随机缺失可以通过已知变量对缺失值进行估计,而非随机缺失的非随机性还没有很好的解决办法。
查看缺失情况:
-
dataframe.isnull()
元素级别的判断,把对应的所有元素的位置都列出来,元素为空或者NA就显示True,否则就是False -
dataframe.isnull().any()
列级别的判断,只要该列有为空或者NA的元素,就为True,否则False -
missing = dataframe.columns[ dataframe.isnull().any() ].tolist()
将为空或者NA的列找出来 -
dataframe [ missing ].isnull().sum()
将列中为空或者NA的个数统计出来 -
len(data[“feature”] [ pd.isnull(data[“feature”]) ]) / len(data))
缺失值比例
处理方式:
无论是打比赛还是在实际工程项目中,都会遇到数据缺失的情况,如果数据集较小,还能在excel或者其他可视化软件大致看一下导致数据缺失的原因,那么数据集较大时,想要探索其中规律,无疑难度也是越来越大,本文使用一个缺失值可视化包missingno,这个包功能很简单,只有几个方法,使用起来也特别方便,不过它只能和pandas联合起来使用,可以说是pandas衍生功能的一大神器。
1.5了解预测值的分布
选中要进行预测的那一列并分析。
如果不服从正态分布,在进行回归之前必须进行转换。虽然对数变换做得很好,但最佳拟合是*约翰逊分布。
具体参考代码。
- 总体分布概况(*约翰逊分布等)
- 查看skewness and kurtosis
- 查看预测值的具体频数
1.6 特征分为类别特征和数字特征,并对类别特征查看unique分布
1.7 数字特征分析
- 相关性分析
- 查看几个特征得 偏度和峰值
- 每个数字特征得分布可视化
- 数字特征相互之间的关系可视化
- 多变量互相回归关系可视化
1.8 类型特征分析
- unique分布
- 类别特征箱形图可视化
- 类别特征的小提琴图可视化
- 类别特征的柱形图可视化类别
- 特征的每个类别频数可视化(count_plot)
1.9 用pandas_profiling生成数据报告
总结
所给出的EDA步骤为广为普遍的步骤,在实际的不管是工程还是比赛过程中,这只是最开始的一步,也是最基本的一步。
接下来一般要结合模型的效果以及特征工程等来分析数据的实际建模情况,根据自己的一些理解,查阅文献,对实际问题做出判断和深入的理解。
最后不断进行EDA与数据处理和挖掘,来到达更好的数据结构和分布以及较为强势相关的特征
数据探索在机器学习中我们一般称为EDA(Exploratory Data Analysis):
是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。
数据探索有利于我们发现数据的一些特性,数据之间的关联性,对于后续的特征构建是很有帮助的。
-
对于数据的初步分析(直接查看数据,或.sum(), .mean(),.descirbe()等统计函数)可以从:样本数量,训练集数量,是否有时间特征,是否是时许问题,特征所表示的含义(非匿名特征),特征类型(字符类似,int,float,time),特征的缺失情况(注意缺失的在数据中的表现形式,有些是空的有些是”NAN”符号等),特征的均值方差情况。
-
分析记录某些特征值缺失占比30%以上样本的缺失处理,有助于后续的模型验证和调节,分析特征应该是填充(填充方式是什么,均值填充,0填充,众数填充等),还是舍去,还是先做样本分类用不同的特征模型去预测。
-
对于异常值做专门的分析,分析特征异常的label是否为异常值(或者偏离均值较远或者事特殊符号),异常值是否应该剔除,还是用正常值填充,是记录异常,还是机器本身异常等。
-
对于Label做专门的分析,分析标签的分布情况等。
-
进步分析可以通过对特征作图,特征和label联合做图(统计图,离散图),直观了解特征的分布情况,通过这一步也可以发现数据之中的一些异常值等,通过箱型图分析一些特征值的偏离情况,对于特征和特征联合作图,对于特征和label联合作图,分析其中的一些关联性。