零基础入门数据挖掘-二手车交易价格预测(Day1数据分析)

开题语

参加比赛的第一件事不是下数据,跑模型,而是要先静下心来读题,磨刀不误砍柴工。

赛题数据

赛题以预测二手车的交易价格为任务,该数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取15万条作为训练集,5万条作为测试集A,5万条作为测试集B,同时会对name、model、brand和regionCode等信息进行脱敏。

该赛题是阿里天池新人入门赛,以二手车交易为背景,数据中包含了二手车的车况、品牌、里程数等信息,并对部分信息进行脱敏,同时还提供了15个匿名特征。最终预测销售的价格price。

字段表

在这里插入图片描述

评价标准

评价标准为MAE(Mean Absolute Error)。
在这里插入图片描述
可以看出,评价就是以预测的价格和实际的label值的差值的绝对值的均值,这是一个比较直观、简单的评价方式,对于初学者来说没有那么劝退。

探索性数据分析

探索性数据分析(Exploratory Data Analysis,简称EDA),摘抄网上的一个中文解释,是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。特别是当我们对面对大数据时代到来的时候,各种杂乱的“脏数据”,往往不知所措,不知道从哪里开始了解目前拿到手上的数据时候,探索性数据分析就非常有效。

探索性数据分析的计划

1、Form hypotheses/develop investigation theme to explore形成假设,确定主题去探索
2、Wrangle data清理数据 3、Assess quality of data评价数据质量 4、Profile data数据报表
5、Explore each individual variable in the dataset探索分析每个变量 6、Assess the
relationship between each variable and the target探索每个自变量与因变量之间的关系
7、Assess interactions between variables探索每个自变量之间的相关性 8、Explore data
across many dimensions从不同的维度来分析数据

基础操作(jupyter notebook环境下)

读csv数据

import numpy as np
import pandas as pd
## 通过Pandas对于数据进行读取 (pandas是一个很友好的数据读取函数库)
Train_data = pd.read_csv(r'E:\second_car\used_car_train_20200313.csv', sep=' ')
TestA_data = pd.read_csv(r'E:\second_car\used_car_testA_20200313.csv', sep=' ')
## 输出数据的大小信息
print('Train data shape:',Train_data.shape)
print('TestA data shape:',TestA_data.shape)

输出数据的大小信息

Train_data.head()#默认显示五行,可在括号内进行调节

这里要注意的是,在windows系统当中读取文件路径可以使用,但是在python字符串中\有转义的含义,如\t可代表TAB,\n代表换行,所以我们需要采取一些方式使得\不被解读为转义字符。
解决方法:
在路径前面加r,即保持字符原始值的意思。
替换为双反斜杠
替换为正斜杠

浏览数据

Train_data.head()#默认显示五行,可在括号内进行调节

在这里插入图片描述

扫描二维码关注公众号,回复: 10402495 查看本文章

查看简要信息

Train_data.info() 

在这里插入图片描述
可以看到数据列名,缺失信息和数据类型。
这里注意到notRepairedDamage(汽车有尚未修复的损坏:是:0,否:1)的数据类型是object,发现有’-'的存在,这可以算是NaN的一种,所以可以将其替换为NaN。

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

bodyType(车身类型:豪华轿车:0,微型车:1,厢型车:2,大巴车:3,敞篷车:4,双门汽车:5,商务车:6,搅拌车:7) 和model(车型编码,已脱敏)有缺少的值。

查看列名

Train_data.columns

在这里插入图片描述

数据统计信息浏览

Train_data.describe() 

在这里插入图片描述
可以看到数据的平均值,方差,最小值,最大值等。比如可以看出model的编号最大为39,表明有39种车型等。数据的类型差异比较大,比如说日期也用数值表示,数据之间大小差距很大,后期需要归一化,否则不好计算。

查看价格

Train_data['price'].value_counts()

在这里插入图片描述
除了发现比较便宜的价格比较多以外没发现啥特别有用的,不过啥车只要500块嗷

画图看看分布

sns.distplot(Train_data['price']);

在这里插入图片描述
确实是有一个明显集中的范围(0-10000)左右吧。但分布和正态分布不太像,有明显的偏移,也很尖锐。

太过集中不利于求解,我们做一个log变换,让其分布均匀一点

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

在这里插入图片描述
在这里插入图片描述

相关性分析

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', 'regionCode',]
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) 

在这里插入图片描述

可以看出kilometers和v3等特征比较关键,里程数这个特征也是符合现实意义的,毕竟可以衡量车的新旧。

画出各特征的分布

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")

在这里插入图片描述

可以看出匿名特征的分布相对比较均匀。

看看各个数值之间的相关性

sns.set()
columns = num_feas
sns.pairplot(Train_data[columns], size = 2 , kind = 'scatter', diag_kind ='kde', palette = "PuBu")
plt.show()

在这里插入图片描述
可以看出成闭团状的相关图还是很多的,说明相应特征的相关度比较大。
price与其他变量相关性可视化

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])

在这里插入图片描述

结语

至此,对于数据的分析有了一个概况,比如我们了解到kilometers和v3是两个比较重要的特征,匿名特征的分布较为符合正态分布等。还将缺省值有了一个了解,这对于后续的工作是十分有帮助的。

发布了34 篇原创文章 · 获赞 24 · 访问量 1994

猜你喜欢

转载自blog.csdn.net/fengshiyu1997/article/details/105070482