河北高校邀请赛——二手车交易价格预测学习笔记(2)

Task 02数据分析

数据探索在机器学习中我们一般称为EDA(Exploratory Data Analysis),指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。

数据探索有利于我们发现数据的一些特性,数据之间的关联性,对于后续的特征构建是很有帮助的。

数据总览:

在这里插入图片描述

代码示例:

下列分析全部以训练数据集为例,测试集同理。

  • 导入常用的数据分析库:
#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
import missingno as msno
from sklearn.impute import SimpleImputer
  • 读入数据集:
Train_data = pd.read_csv('car_train_0110.csv', sep=' ')
Test_data = pd.read_csv('car_testA_0110.csv', sep=' ')
# Train data shape: (250000, 40)
# Test data shape: (50000, 39)
  • 分析数据概况:
# 通过describe()来熟悉数据的相关统计量
Train_data.describe()

在这里插入图片描述

describe种有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值。看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断。

  • 缺失值和异常分析:
Train_data.isnull().sum()

在这里插入图片描述
发现在bodyType“车身类型”、fuelType“燃油类型”和notRepairedDamage“汽车有尚未修复的损坏”三个字段存在缺失值,缺失比例在5%-20%上下不等。其实缺失的特征比例不多,均低于80%,后期可以考虑使用RF进行特征填充。

# 使用missingno库查看缺失值的分布情况(前250行)
msno.matrix(Train_data.sample(250))

在这里插入图片描述
发现缺失的行还是比较均匀的,说明数据本身没有较多异常。

  • 初步筛选特征
    在这里插入图片描述
    发现seller和offerType两个标签型特征中的字段分布极为不均,这种信息含量小特征对后续模型训练没有什么帮助,可以删除。
#拜拜了您嘞
Train_data.drop(columns=['seller','offerType'],axis=1,inplace=True)
  • 分析标签数据
## 1) 用三种分布拟合总体分布概况
import scipy.stats as st
y = Train_data['price']
plt.figure(1); plt.title('Johnson SU')
sns.distplot(y, kde=False, fit=st.johnsonsu)
plt.figure(2); plt.title('Normal')
sns.distplot(y, kde=False, fit=st.norm)
plt.figure(3); plt.title('Log Normal')
sns.distplot(y, kde=False, fit=st.lognorm)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现使用无界约翰逊分布和对数化的正态分布拟合价格的概率密度函数效果较好。而且我们可以看出,大多数二手车的售价都低于20000元,label的分布非常“偏左”,很不均匀。为了提高后续模型学习效率,我们需要将price的分布转换的更加均匀。那么,对price做对数变换也许是一个好的选择。但是大约有3%的车是白送的(售价为0),所以这里我在对数化之前把它们的值改成1。

price=Train_data['price'].values.reshape(-1,1)
imp=SimpleImputer(missing_values=0,strategy='constant',fill_value=1)
Train_data['price']=imp.fit_transform(price)
sns.distplot(np.log(price),kde=True)

在这里插入图片描述
由上图可见,经过对数变换后,price标签的分布变得均匀了一些,除了price=0的点有比较异常的分布。仔细想想似乎白送二手车的情况在现实中不可能发生,那么看来将price=0的数据作为缺失值剔除会比较好,而且3%的数据(7312条)损失也可以接受。

  • 特征相关性分析
#给特征分成数值型特征和标签型特征两类
numeric_features = ['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', 'v_15', 'v_16', 'v_17', 'v_18', 'v_19', 'v_20', 'v_21', 'v_22', 'v_23' ]

categorical_features = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionCode','creatDate']

numeric_features.append('price')
## 1) 相关性分析
price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()   #默认pearson相关系数
print(correlation['price'].sort_values(ascending = False),'\n')

在这里插入图片描述

f , ax = plt.subplots(figsize = (10,10))
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
sns.heatmap(correlation,square = True,  vmax=0.8)

在这里插入图片描述
根据correlation关联矩阵画出相关性热力图,特征好多。。而且有相当一部分特征相关系数小于0.2,后期可以做特征筛选。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值