其他分享
首页 > 其他分享> > 数据挖掘学习笔记(天池二手车预测02)

数据挖掘学习笔记(天池二手车预测02)

作者:互联网

文章目录

1.数据分析EDA

1.EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用。
2.当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。
3.引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。
4.完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡。

需分析:
① 数据总览,即describe()统计量以及info()数据类型
②缺失值以及异常值检测
③分析待预测的真实值的分布
④特征之间的相关性分析

2.数据总览

各种计算包的导入

#coding:utf-8
#导入warnings包,利用过滤器来实现忽略警告语句。
import warnings
warnings.filterwarnings('ignore')

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # seabon是一个做可视化的包
import missingno as msno  # 用来检测缺失值

数据载入

Train_data = pd.read_csv('used_car_train_20200313.csv', sep=' ')  # sep=' '是使对象用空格分开
Test_data = pd.read_csv('used_car_testA_20200313.csv', sep=' ')

简略观察数据(head()+shape)

print(Train_data.head().append(Train_data.tail()))  # 前5行和后5行

print(Train_data.shape)  # 形状 (150000, 31)

print(Test_data.head().append(Test_data.tail()))

print(Test_data.shape)

结果:
在这里插入图片描述
1.可以看出,数据的分散程度很大,有整型,有浮点,有正数,有负数,还有日期,当然可以当成是字符串。另外如果数据都换算成数值的话,数据间差距特别大,有些成千上万,有些几分几厘,这样在预测时就难以避免地会忽视某些值的作用,所以需要对其进行归一化。
2.shape的运用是也十分重要,对数据的大小要心中有数

用describe()来对数据进行基本统计量的分析,关于describe()的基本参数如下(且其默认只对数值型数据进行分析,如果有字符串,时间序列等的数据,会减少统计的项目):

count:一列的元素个数;
mean:一列数据的平均值;
std:一列数据的均方差;(方差的算术平方根,反映一个数据集的离散程度:越大,数据间的差异越大,数据集中数据的离散程度越高;越小,数据间的大小差异越小,数据集中的数据离散程度越低)
min:一列数据中的最小值;
max:一列数中的最大值;
25%:一列数据中,前 25% 的数据的平均值;
50%:一列数据中,前 50% 的数据的平均值;
75%:一列数据中,前 75% 的数据的平均值;

在这里插入图片描述

用info()来查看数据类型,并主要查看是否有异常数据
在这里插入图片描述

代码如下

# 1) 通过describe()来熟悉数据的相关统计量
print(Train_data.describe())

## 2) 通过info()来熟悉数据类型
print(Train_data.info())
print(Test_data.info())

从上面的统计量与信息来看,没有什么特别之处,就数据类型来说notRepairedDamage的类型是object是个另类,后续要进行特殊处理。

3.数据的缺失情况

pandas内置了isnull()可以用来判断是否有缺失值,它会对空值和NA进行判断然后返回True或False。

# 1) 查看每列的存在nan情况
print(Train_data.isnull().sum())
print(Test_data.isnull().sum())

可以看出缺失的数据值主要集中在bodyType,fuelType,gearbox,这三个特征中。训练集中model缺失了一个值,但是无伤大雅。至于如何填充,亦或是删除这些数据,需要后期在选用模型时再做考虑。
同时我们也可以通过missingno库查看缺省值的其他属性。

矩阵图matrix
柱状图bar
热力图heatmap
树状图dendrogram

# nan可视化
missing = Train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()
plt.show()

在这里插入图片描述
通过以上两句可以很直观的了解哪些列存在 “nan”, 并可以把nan的个数打印,主要的目的在于 nan存在的个数是否真的很大,如果很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,但如果nan存在的过多、可以考虑删掉

# 可视化看下缺省值
'''
白线越多,代表缺失值越多。
'''
msno.matrix(Train_data.sample(250))  # msno.matrix无效矩阵是一个数据密集的显示,它可以快速直观地看出数据完整度 空白越多说明缺失越严重
plt.show()

msno.bar(Train_data.sample(1000))  # 条形图提供与矩阵图相同的信息,但格式更简单
plt.show()

4.数据的异常情况

因为之前发现notRepairedDamage的类型是object是个另类,所以看一下它的具体情况。
python中的str和numpy中的string、unicode(字符编码),在pandas中都表示为object

print(Train_data['notRepairedDamage'].value_counts())

value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
在这里插入图片描述
发现有’-'的存在,这可以算是NaN的一种,所以可以将其替换为NaN

Train_data['notRepairedDamage'].replace('-', np.nan, inplace=True)

5.了解待预测的真实值的分布情况

看看价格预测值的分布情况

print(Train_data['price'])
print(Train_data['price'].value_counts())

会发现没什么特别的
接下来最重要的是要看一下历史成交价格的偏度(Skewness)与峰度(Kurtosis),此外自然界最优美的分布式正态分布,所以也要看一下待预测的价格分布是否满足正态分布。
再解释一下偏度与峰度,一般会拿偏度和峰度来看数据的分布形态,而且一般会跟正态分布做比较,我们把正态分布的偏度和峰度都看做零。如果算到偏度峰度不为0,即表明变量存在左偏右偏,或者是高顶平顶。
在这里插入图片描述
在这里插入图片描述

# 2) 查看skewness and kurtosis
sns.distplot(Train_data['price']);
plt.show()
print("Skewness: %f" % Train_data['price'].skew())
print("Kurtosis: %f" % Train_data['price'].kurt())

结果:
Skewness: 3.346487
Kurtosis: 18.995183

在这里插入图片描述
很明显,预测值的数据分布不服从正态分布,偏度与峰度的值都很大,也很符合他们的定义,从图中可以看出,长尾巴拖在右边印证了峰度值很大,峰顶很尖对应了偏度值很大。以我模糊的概率统计知识,这更加像是接近于卡方或者是F分布。所以要对数据本身进行变换。

plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()
plt.hist(np.log(Train_data['price']), orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()

在这里插入图片描述
由于数据较为集中,这就给预测模型的预测带来比较大的困难,所以可以进行一次log运算改善一下分布,有利于后续的预测。

6.数据特征相关性的分析

6.1numric特征的相关性分析

在分析之前需要确定哪些特征是numeric型数据,哪些特征是object型数据。自动化的方法是 这样的:

# 分离label即预测值
Y_train = Train_data['price']

这个区别方式适用于没有直接label coding的数据
这里不适用,需要人为根据实际含义来区分
数字特征
numeric_features = Train_data.select_dtypes(include=[np.number])
numeric_features.columns
类型特征
categorical_features = Train_data.select_dtypes(include=[np.object])
categorical_features.columns
但本题的数据集的label已经标好名称了,而且label是有限的,每个种类是可以理解的,所以还是需要人为标注,例如车型bodyType虽然是数值型数据,但其实我们知道它应该是object型数据。所以可以这样:

num_feas = ['power', 'kilometer', 'v_0', 'v_1', 'v_2', 'v_3', 'v_4', 'v_5', 'v_6', 'v_7', 'v_8', 'v_9', 'v_10', 'v_11', 'v_12', 'v_13','v_14' ]

obj_feas = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionC

下面我们将price加入num_feas,并用pandas笼统地分析一下特征之间的相关性,并进行可视化。

num_feas.append('price')
price_numeric = Train_data[num_feas]
correlation = price_numeric.corr()
print(correlation['price'].sort_values(ascending = False),'\n')

结果就不显示出来(懒)

f , ax = plt.subplots(figsize = (8, 8))
plt.title('Correlation of Numeric Features with Price', y = 1, size = 16)
sns.heatmap(correlation, square = True, annot=True, cmap='RdPu', vmax = 0.8) # 参数annot为True时,为每个单元格写入数据值。如果数组具有与数据相同的形状,则使用它来注释热力图而不是原始数据。
plt.show()

在这里插入图片描述
从热度图中可以看出跟price相关性高的几个特征主要包括:kilometer,v3。与我们的现实经验还是比较吻合的,那个v3可能是发动机等汽车重要部件相关的某个参数。

查看各个特征的偏度与峰度,以及数据的分布状况

del price_numeric['price']
#  输出数据的峰度与偏度,这里pandas可以直接调用
for col in num_feas:
    print('{:15}'.format(col),
          'Skewness: {:05.2f}'.format(Train_data[col].skew()) ,
          '   ' ,
          'Kurtosis: {:06.2f}'.format(Train_data[col].kurt())
         )

f = pd.melt(Train_data, value_vars = num_feas) # 利用pandas的melt函数将测试集中的num_feas所对应的数据取出来
# FacetGrid是sns库中用来画网格图的函数,其中col_wrap用来控制一行显示图的个数,sharex或者sharey是否共享x,y轴,意味着每个子图是否有自己的横纵坐标。
g = sns.FacetGrid(f, col = "variable",  col_wrap = 6, sharex = False, sharey = False, hue = 'variable', palette = "GnBu_d") # palette的可选参数与上文的cmap类似
g = g.map(sns.distplot, "value")
plt.show()

在这里插入图片描述
在这里插入图片描述
各个数值特征之间的相关性

## 4) 数字特征相互之间的关系可视化
sns.set()
columns = ['price', 'v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
sns.pairplot(Train_data[columns],size = 2 ,kind ='scatter',diag_kind='kde')
plt.show()

会显示很多图

price与其他变量相关性可视化。这里用匿名变量v0~v13进行分析,使用seaborn的regplot函数进行相关度回归分析

Y_train = Train_data['price']
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6), (ax7, ax8), (ax9, ax10),(ax11, ax12),(ax13,ax14)) = plt.subplots(nrows = 7, ncols=2, figsize=(24, 20))
ax = [ax1, ax2, ax3, ax4, ax5, ax6, ax7, ax8, ax9, ax10, ax11, ax12, ax13, ax14]
for num in range(0,14):
    sns.regplot(x = 'v_' + str(num), y = 'price', data = pd.concat([Y_train, Train_data['v_' + str(num)]],axis = 1), scatter = True, fit_reg = True, ax = ax[num])

可以看出大部分匿名变量的分布还是比较集中的,但线性回归的性能比较弱

6.2 pandas_profiling生成数据报告

用pandas_profiling生成一个较为全面的可视化和数据报告(较为简单、方便)最终打开html文件即可

#pandas_profiling生成数据报告
import pandas_profiling
pfr = pandas_profiling.ProfileReport(Train_data)
pfr.to_file("pandas_analysis.html")

生成的html文件用浏览器打开如下:
在这里插入图片描述
在这里插入图片描述
总结
1.运用describe()和info()进行数据基本统计量的描述
2.运用missingno库和pandas.isnull()来对异常值和缺失值进行可视化察觉以及处理
3.熟悉偏度(Skewness)与峰度(Kurtosis)的概念,可以用skeu()和kurt()计算其值
4.在确定预测值的范围与分布后,可以做一些取对数或者开根号的方式缓解数据集中的问题

相关性分析时
用corr()计算各特征的相关系数
用seaborn的heatmap画出相关系数的热力图
用seaborn的FacetGrid和pairplot可以分别画出各特征内部之间以及预测值与其他特征之间的数据分布图
也可以用seaborn的regplot来对预测值与各特征的关系进行回归分析
在这里插入图片描述

标签:02,plt,数据,price,print,Train,数据挖掘,天池,data
来源: https://blog.csdn.net/kaifan_/article/details/115767539