一、赛题理解

1.1赛题概述

赛题以预测二手车的交易价格为任务,该数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取15万条作为训练集,5万条作为测试集A,5万条作为测试集B,同时会对name、model、brand和regionCode等信息进行脱敏。
具体的数据表如下图:
SaleID - 销售样本ID
name - 汽车编码
regDate - 汽车注册时间
model - 车型编码
brand - 品牌
bodyType - 车身类型
fuelType - 燃油类型
gearbox - 变速箱
power - 汽车功率
kilometer - 汽车行驶公里
notRepairedDamage - 汽车有尚未修复的损坏
regionCode - 看车地区编码
seller - 销售方
offerType - 报价类型
creatDate - 广告发布时间
price - 汽车价格
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’ 【匿名特征,包含v0-14在内15个匿名特征】
数字全都脱敏处理,都为label encoding形式,即数字形式

1.2预测指标

赛题的预测评估指标为MAE(MeanAbsoluteError)

其中 yi 代表第 i 个样本的真实值,其中 ^yi 代表第 i 个样本的预测值。
对于回归预测类常见的评估指标如下:
平均绝对误差(Mean Absolute Error,MAE),均方误差(Mean Squared Error,MSE),平均绝对百分误差(Mean Absolute Percentage Error,MAPE),均方根误差(Root Mean Squared Error), R2(R-Square)

二、 EDA-数据探索性分析

EDA (Exploratory Data Analysis),也就是对数据进行探索性的分析,从而为之后的数据预处理和特征工程提供必要的结论
学习参考链接1:https://www.jianshu.com/p/9325c9f88ee6

学习参考链接2:https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12281978.0.0.68021b43qQHjp5&postId=95457

2.1 内容介绍

1.载入各种数据科学以及可视化库:
数据科学库 pandas、numpy、scipy;可视化库 matplotlib、seabon;其他;
2.载入数据:
载入训练集和测试集;简略观察数据(head()+shape);
3.数据总览:
通过describe()来熟悉数据的相关统计量;通过info()来熟悉数据类型
4.判断数据缺失和异常:
查看每列的存在nan情况;异常值检测
5.了解预测值的分布:
总体分布概况(无界约翰逊分布等);查看skewness and kurtosis;查看预测值的具体频数
6.特征分为类别特征和数字特征,并对类别特征查看unique分布
7.数字特征分析:
相关性分析;查看几个特征的偏度和峰值;每个数字特征得分布可视化;数字特征相互之间的关系可视化;多变量互相回归关系可视化
8.类型特征分析:
unique分布;类别特征箱形图可视化;类别特征的小提琴图可视化;类别特征的柱形图可视化类别;特征的每个类别频数可视化(count_plot)
9.用pandas_profiling生成数据报告

2.2数据总览

1.载入各种数据科学以及可视化库
整体数据把握:包括读入数据之后,首先利用.shape查看数据维度,然后利用.head()与.tail()查看数据的前五行和最后五行了解其列数以及每列的具体value.

  • pandas 是基于NumPy
    的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
  • NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested
    list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。
  • Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
  • Seaborn是基于matplotlib的图形可视化python包。它提供了一种高度交互式界面,便于用户能够做出各种有吸引力的统计图表。
  • missingno库提供了一个灵活易用的可视化工具来观察数据缺失情况,是基于matplotlib的,接受pandas数据源。
#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是一个做可视化非常nice的包,它的别名sns是约定俗成的的东西,还有一段很有意思的故事
import missingno as msno # 用来检测缺失值
#载入训练集和测试集;
path = './datalab/231784/'
Train_data = pd.read_csv(path+'used_car_train_20200313.csv', sep=' ')
Test_data = pd.read_csv(path+'used_car_testA_20200313.csv', sep=' ')#简略观察数据(head()+shape)训练集
Train_data.head().append(Train_data.tail())
Train_data.shape
#测试集
Test_data.head().append(Test_data.tail())
Test_data.shape#通过describe()来熟悉数据的相关统计量
Train_data.describe()
Test_data.describe()
#通过info()来熟悉数据类型
Train_data.info()
Test_data.info()
  • 用describe()来对数据进行基本统计量的分析,关于describe()的基本参数如下(且其默认只对数值型数据进行分析,如果有字符串,时间序列等的数据,会减少统计的项目):
    count:一列的元素个数;
    mean:一列数据的平均值;
    std:一列数据的均方差;(方差的算术平方根,反映一个数据集的离散程度:越大,数据间的差异越大,数据集中数据的离散程度越高;越小,数据间的大小差异越小,数据集中的数据离散程度越低)
    min:一列数据中的最小值;
    max:一列数中的最大值;
    25%:一列数据中,前 25% 的数据的平均值;
    50%:一列数据中,前 50% 的数据的平均值;
    75%:一列数据中,前 75% 的数据的平均值;
  • 用info()来查看数据类型,并主要查看是否有异常数据

2. 判断数据缺失和异常
包括利用.info()查看列索引名称,每列有多少缺失值以及每列的数据类型(float,object等等);利用.describe()查看每列个数,平均值,最大值,最小值,3/4分位数,标准差等等值。

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

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

运行结果:

SaleID                  0
name                    0
regDate                 0
model                   1
brand                   0
bodyType             4506
fuelType             8680
gearbox              5981
power                   0
kilometer               0
notRepairedDamage       0
regionCode              0
seller                  0
offerType               0
creatDate               0
price                   0
v_0                     0
v_1                     0
v_2                     0
v_3                     0
v_4                     0
v_5                     0
v_6                     0
v_7                     0
v_8                     0
v_9                     0
v_10                    0
v_11                    0
v_12                    0
v_13                    0
v_14                    0
dtype: int64

可以看出,bodyType 、fuelType 、gearbox有存在缺失值

#查看每列的存在nan情况用sum计数
Test_data.isnull().sum()
#nan可视化
#如果缺失值少可以尝试用规律填充,如果很小一般选择填充,如果使用lgb等树模型可以直接空缺,让树自己去优化,
#但如果nan存在的过多、可以考虑删掉
missing = Train_data.isnull().sum()
missing = missing[missing > 0]
#sort_value函数来进行排序,设置inplace=True让排序后的结果替换原来的数据,默认值为False
missing.sort_values(inplace=True)
missing.plot.bar()
  • 同时我们也可以通过missingno库查看缺省值的其他属性。

    矩阵图matrix
    柱状图bar
    热力图heatmap
    树状图dendrogram
    Matrix是使用最多的函数,能快速直观地看到数据集的完整性情况,矩阵显示;bar可以简单的展示无效数据的条形图

msno.matrix(Train_data.sample(250))
msno.bar(Train_data.sample(1000))
msno.matrix(Test_data.sample(250))
msno.bar(Test_data.sample(1000))

缺省热力图:热力图表示两个特征之间的缺失相关性,即一个变量的存在或不存在如何强烈影响的另一个的存在。如果x和y的热度值是1,则代表当x缺失时,y也百分之百缺失。如果x和y的热度相关性为-1,说明x缺失的值,那么y没有缺失;而x没有缺失时,y为缺失。至于 矩阵图,与柱状图没有查看的必要,我们可以用缺省热力图观察一下情况:

msno.heatmap(Train_data.sample(10000))

msno.heatmap(Test_data.sample(10000))


树状图:树形图使用层次聚类算法通过它们的无效性相关性(根据二进制距离测量)将变量彼此相加。在树的每个步骤,基于哪个组合最小化剩余簇的距离来分割变量。变量集越单调,它们的总距离越接近零,并且它们的平均距离(y轴)越接近零。

msno.dendrogram(Train_data.sample(10000))
msno.dendrogram(Test_data.sample(10000))

由上面的热力图以及聚类图可以看出,各个缺失值之间的相关性并不明显。
3.数据的异常情况
利用.isnull().sun()可查看数据每一列的缺失个数情况,我们也可以利用柱形图plot.bar()以及.matrix(data.sample(250/1k))等方法对缺失值进行可视化;对特殊的列进行处理,例如对于类型为object的列,我们可以利用.value.counts()查看此列的各值统计的种类与个数情况等等,对于不合理的value我们可以对其进行替换,eg:利用.replace(’-’,np.nan,inplace=True)将’-'替换为缺失值NAN等,再比如对于数据分布严重倾斜的列,其统计是无意义的,因此我们可以选择将其删除,eg,此次比赛的“seler”与“offertype”

在之前调用info()函数的时候我们看到各属性之中只有notRepairedDamage的类型不为数字而是object,object实际上是指针类型,为了存放长度不确定的字符串,这里看一下notRepaiedDamage的取值,可以发现除了notRepairedDamage 为object类型其他都为数字 这里我们把他的几个不同的值都进行显示就知道了
Train_data.info()
Train_data['notRepairedDamage'].value_counts()
0.0    111361
-       24324
1.0     14315
Name: notRepairedDamage, dtype: int64
Test_data['notRepairedDamage'].value_counts()
0.0    37249
-       8031
1.0     4720
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()
观察其他数据Train_data['seller'].value_counts()
Train_data['offerType'].value_counts()

发现这两个属性严重倾斜,一般对预测没有什么帮助,所以先删掉

del Train_data['seller']
del Train_data['offerType']
del Test_data['seller']
del Test_data['offerType'

4.预测值的分布
对于我们整个模型需要预测的数据price,我们要通过训练数据的直接输出和.value_counts()对它有一个整体的把握。对其(1)总体分布概况,符合正态,对数正态还是无界约翰逊分布,(若进行回归分析,则需要保证分布符合正态,有时可通过对数据求对数log以满足前提假设);(2)2) 查看偏度和峰度skewness and kurtosis;

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

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

  • 偏度(Skewness)也称偏态、偏态系数,是描述数据分布形态的统计量,是统计数据分布偏斜方向和程度的度量,其描述的是某总体取值分布的对称性,简单来说就是数据的不对称程度。
  • 峰度(Kurtosis)峰度是描述某变量所有取值分布形态陡缓程度的统计量,简单来说就是数据分布顶的尖锐程度。
#总体分布概况(无界约翰逊分布等)
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)
# 查看skewness and kurtosis
sns.distplot(Train_data['price']);
print("Skewness: %f" % Train_data['price'].skew())
print("Kurtosis: %f" % Train_data['price'].kurt())

Skewness: 3.346487
Kurtosis: 18.995183
很明显,预测值的数据分布不服从正态分布,偏度与峰度的值都很大,我们要对它进行变换。
seaborn中的distplot主要功能是绘制单变量的直方图,且还可以在直方图的基础上施加kdeplot和rugplot的部分内容,是一个功能非常强大且实用的函数,其主要参数如下:
a:一维数组形式,传入待分析的单个变量
bins:int型变量,用于确定直方图中显示直方的数量,默认为None,这时bins的具体个数由Freedman-Diaconis准则来确定
hist:bool型变量,控制是否绘制直方图,默认为True
kde:bool型变量,控制是否绘制核密度估计曲线,默认为True
rug:bool型变量,控制是否绘制对应rugplot的部分,默认为False
fit:传入scipy.stats中的分布类型,用于在观察变量上抽取相关统计特征来强行拟合指定的分布,默认为None,即不进行拟合
hist_kws,kde_kws,rug_kws:这几个变量都接受字典形式的输入,键值对分别对应各自原生函数中的参数名称与参数值,在下文中会有示例
color:用于控制除了fit部分拟合出的曲线之外的所有对象的色彩
vertical:bool型,控制是否颠倒x-y轴,默认为False,即不颠倒
norm_hist:bool型变量,用于控制直方图高度代表的意义,为True直方图高度表示对应的密度,为False时代表的是对应的直方区间内记录值个数,默认为False
label:控制图像中的图例标签显示内容
Johnson SU为约翰逊分布,是一种经过约翰变换后服从正态分布概率的随机变量的概率分布;normal为正态分布;lognormal为对数正态分布,对数正态分布从短期来看,与正态分布非常接近。但长期来看,对数正态分布向上分布的数值更多一些。

通过结果我们可以看到,无界约翰逊分布对price的分布情况拟合最好。

Train_data.skew(), Train_data.kurt()
sns.distplot(Train_data.skew(),color='blue',axlabel ='Skewness')
sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness')
#查看预测值的具体频数
plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()
# log变换 z之后的分布较均匀,可以进行log变换进行预测,这也是预测问题常用的trick
plt.hist(np.log(Train_data['price']), orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()

5.特征分类判别
特征分为类别特征和数字特征,对类别特征查看unique分布。
对于特征,我们一般将其分为类别特征或者数字特征,可以通过dtype是number or object来简单地辨别,但真实场景中此种方法肯定是不行的。因为有时提供的数据早已对本来应该是类别的特征数字化,所以我们就需要通过已有的先验知识以及常识来对特征进行分类,分为numeric_features与categorical_features。并对于categorical_features特征通过.nunique()来查看其分布情况,包括种类与个数等等。

# 分离label即预测值
Y_train = Train_data['price']
 在分析之前需要确定哪些特征是numeric型数据,哪些特征是object型数据。自动化的方法是这样的:
# num_feas = Train_data.select_dtypes(include=[np.number])
# obj_feas = Train_data.select_dtypes(include=[np.object])

但本题的数据集的label已经标好名称了,而且label是有限的,每个种类是可以理解的,所以还是需要人为标注,例如车型bodyType虽然是数值型数据,但其实我们知道它应该是object型数据。所以可以这样:

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' ]categorical_features = ['name', 'model', 'brand', 'bodyType', 'fuelType', 'gearbox', 'notRepairedDamage', 'regionCode',]

对训练集和测试集中的类别特征进行统计

# 特征nunique分布
for cat_fea in categorical_features:print(cat_fea + "的特征分布如下:")print("{}特征有个{}不同的值".format(cat_fea, Train_data[cat_fea].nunique()))print(Train_data[cat_fea].value_counts())
# 特征nunique分布
for cat_fea in categorical_features:print(cat_fea + "的特征分布如下:")print("{}特征有个{}不同的值".format(cat_fea, Test_data[cat_fea].nunique()))print(Test_data[cat_fea].value_counts())

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

numeric_features.append('price')
## 1)计算各属性与price的相关性
price_numeric = Train_data[numeric_features]
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)


关于seaborn的heatmap看这里https://www.jianshu.com/p/e195a09a8ca9

#在计算完相关性后将数字特征中的price删除
del price_numeric['price']
## 2) 查看几个特征值的偏度和峰值
for col in numeric_features:print('{:15}'.format(col), 'Skewness: {:05.2f}'.format(Train_data[col].skew()) , '   ' ,'Kurtosis: {:06.2f}'.format(Train_data[col].kurt())  )
## 3) 每个数字特征得分布可视化,使用melt()函数将列名转换成列数据,再使用FaceGrid和map绘制出每个属性的分布图
f = pd.melt(Train_data, value_vars=numeric_features)# 利用pandas的melt函数将测试集中的numeric_features所对应的数据取出来
# 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")
g = g.map(sns.distplot, "value")

## 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()

价格与各特征之间的相关度图
可以看出成闭团状的相关图还是很多的,说明相应特征的相关度比较大。

多变量之间的关系可视化,可视化更多学习可参考很不错的文章https://www.jianshu.com/p/6e18d21a4cad

## 5) 多变量互相回归关系可视化
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6), (ax7, ax8), (ax9, ax10)) = plt.subplots(nrows=5, ncols=2, figsize=(24, 20))
# ['v_12', 'v_8' , 'v_0', 'power', 'v_5',  'v_2', 'v_6', 'v_1', 'v_14']
v_12_scatter_plot = pd.concat([Y_train,Train_data['v_12']],axis = 1)
sns.regplot(x='v_12',y = 'price', data = v_12_scatter_plot,scatter= True, fit_reg=True, ax=ax1)v_8_scatter_plot = pd.concat([Y_train,Train_data['v_8']],axis = 1)
sns.regplot(x='v_8',y = 'price',data = v_8_scatter_plot,scatter= True, fit_reg=True, ax=ax2)v_0_scatter_plot = pd.concat([Y_train,Train_data['v_0']],axis = 1)
sns.regplot(x='v_0',y = 'price',data = v_0_scatter_plot,scatter= True, fit_reg=True, ax=ax3)power_scatter_plot = pd.concat([Y_train,Train_data['power']],axis = 1)
sns.regplot(x='power',y = 'price',data = power_scatter_plot,scatter= True, fit_reg=True, ax=ax4)v_5_scatter_plot = pd.concat([Y_train,Train_data['v_5']],axis = 1)
sns.regplot(x='v_5',y = 'price',data = v_5_scatter_plot,scatter= True, fit_reg=True, ax=ax5)v_2_scatter_plot = pd.concat([Y_train,Train_data['v_2']],axis = 1)
sns.regplot(x='v_2',y = 'price',data = v_2_scatter_plot,scatter= True, fit_reg=True, ax=ax6)v_6_scatter_plot = pd.concat([Y_train,Train_data['v_6']],axis = 1)
sns.regplot(x='v_6',y = 'price',data = v_6_scatter_plot,scatter= True, fit_reg=True, ax=ax7)v_1_scatter_plot = pd.concat([Y_train,Train_data['v_1']],axis = 1)
sns.regplot(x='v_1',y = 'price',data = v_1_scatter_plot,scatter= True, fit_reg=True, ax=ax8)v_14_scatter_plot = pd.concat([Y_train,Train_data['v_14']],axis = 1)
sns.regplot(x='v_14',y = 'price',data = v_14_scatter_plot,scatter= True, fit_reg=True, ax=ax9)v_13_scatter_plot = pd.concat([Y_train,Train_data['v_13']],axis = 1)
sns.regplot(x='v_13',y = 'price',data = v_13_scatter_plot,scatter= True, fit_reg=True, ax=ax10)


5.2类别特征分析
(1)unique分布,通过.unique()查看其是否是稀疏的,删除特别稀疏的特征,因为对于结果的预测没有实际的意义。
(2)类别特征箱形图可视化,通过箱型图查看是否有异常值,也可以看出不同数据分布的对比。
(3)类别特征的小提琴图可视化,箱型图进阶版,最大的不同是不仅可以看出是否有异常值,还能够看出在每个value上面的个数fenbuqk,数据集中或者稀疏分布在那个区域等等。
(4)类别特征的柱形图可视化

## 1) unique分布
for fea in categorical_features:print(Train_data[fea].nunique())
categorical_features
## 2) 类别特征箱形图可视化# 因为 name和 regionCode的类别太稀疏了,这里我们把不稀疏的几类画一下
categorical_features = ['model','brand','bodyType','fuelType','gearbox','notRepairedDamage']
for c in categorical_features:Train_data[c] = Train_data[c].astype('category')if Train_data[c].isnull().any():Train_data[c] = Train_data[c].cat.add_categories(['MISSING'])Train_data[c] = Train_data[c].fillna('MISSING')def boxplot(x, y, **kwargs):sns.boxplot(x=x, y=y)x=plt.xticks(rotation=90)f = pd.melt(Train_data, id_vars=['price'], value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False, size=5)
g = g.map(boxplot, "value", "price")
Train_data.columns
## 3) 类别特征的小提琴图可视化
catg_list = categorical_features
target = 'price'
for catg in catg_list :sns.violinplot(x=catg, y=target, data=Train_data)plt.show()


①白点代表中位数Q2(即数据中有一半大于中位数,在其之上,另一半小于中位数,在其之下);

②黑色矩形是下四分位数到上四分位数的范围,矩形上边缘为上四分位数Q3,代表数据中有四分之一的数目大于上四分位数,下边缘为下四分位数Q1,代表数据中有四分之一的数目小于下四分位数;

四分位间距IQR(上四分位数和下四分为数间距)长短代表非异常数据的分散和对称程度,长则分散,短则集中;

③上下贯穿小提琴图的黑线代表最小非异常值min到最大非异常值max的区间,线上下端分别代表上限和下限,超出此范围为异常数据 ;

④黑色矩形外部形状为核密度估计,图形纵轴方向长度代表数据弥散程度,横轴方向长度代表在某纵坐标位置数据分布量。

categorical_features = ['model','brand','bodyType','fuelType','gearbox','notRepairedDamage']
## 4) 类别特征的柱形图可视化
def bar_plot(x, y, **kwargs):sns.barplot(x=x, y=y)x=plt.xticks(rotation=90)f = pd.melt(Train_data, id_vars=['price'], value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False, size=5)
g = g.map(bar_plot, "value", "price")

##  5) 类别特征的每个类别频数可视化(count_plot)
def count_plot(x,  **kwargs):sns.countplot(x=x)x=plt.xticks(rotation=90)f = pd.melt(Train_data,  value_vars=categorical_features)
g = sns.FacetGrid(f, col="variable",  col_wrap=2, sharex=False, sharey=False, size=5)
g = g.map(count_plot, "value")


6.用pandas_profilling生成数据报告
用pandas_profiling生成一个较为全面的可视化和数据报告(较为简单、方便)这是pandas一个非常强大的功能,其不仅对数据总体进行了统计,还对每个变量的情况(是否稀疏,基数是否大等等)进行了统计,个人觉得几乎包含了前面所有的手动数据探索,而且warnings部分还能对你特征工程的构造有很多启发,例如删除太稀疏的特征,高相关的特征多取一等等情况,

import pandas_profiling
pfr = pandas_profiling.ProfileReport(Train_data)
pfr.to_file("./example.html")

三、总结

  1. 运用describe()和info()进行数据基本统计量的描述
  2. 运用missingno库和pandas.isnull()来对异常值和缺失值进行可视化察觉以及处理
  3. 熟悉偏度(Skewness)与峰度(Kurtosis)的概念,可以用skeu()和kurt()计算其值
  4. 在确定预测值的范围与分布后,可以做一些取对数或者开根号的方式缓解数据集中的问题
  5. 相关性分析时,用corr()计算各特征的相关系数;用seaborn的heatmap画出相关系数的热力图;用seaborn的FacetGrid和pairplot可以分别画出各特征内部之间以及预测值与其他特征之间的数据分布图;也可以用seaborn的regplot来对预测值与各特征的关系进行回归分析。

天池二手车交易价格预测Task2-赛题理解与数据探索性分析(EDA)相关推荐

  1. 【算法竞赛学习】二手车交易价格预测-Task1赛题理解

    二手车交易价格预测-Task1 赛题理解 一. 赛题理解 Tip:此部分为零基础入门数据挖掘的 Task1 赛题理解 部分,为大家入门数据挖掘比赛提供一个基本的赛题入门讲解,欢迎后续大家多多交流. 赛 ...

  2. 【二手车交易价格预测】赛题理解

    一.赛题背景 本次新人赛是Datawhale与天池联合发起的0基础入门系列赛事第一场 -- 零基础入门数据挖掘之二手车交易价格预测大赛. 赛题以二手车市场为背景,要求选手预测二手汽车的交易价格,这是一 ...

  3. 【算法竞赛学习】二手车交易价格预测-Task2数据分析

    二手车交易价格预测-Task2 数据分析 二. EDA-数据探索性分析 Tip:此部分为零基础入门数据挖掘的 Task2 EDA-数据探索性分析 部分,带你来了解数据,熟悉数据,和数据做朋友,欢迎大家 ...

  4. 阿里天池二手车交易价格预测(一)——EDA

    阿里天池二手车交易价格预测(一)--EDA Exploratory Data Analysis是数据科学领取理解和分析数据的方法,通过不断的收集.分析和假设验证,以取得对数据的深入理解. EDA的价值 ...

  5. 二手车交易价格预测-task2

    数据挖掘入门- 二手车交易价格预测-task2 EDA(Exploratory Data Analysis)-数据探索性分析 2.1 EDA目标 2.2 内容介绍 2.3 经验总结 EDA(Explo ...

  6. 天池大赛-心跳信号分类预测:赛题理解与baseline解析

    比赛地址:零基础入门数据挖掘-心跳信号分类预测 参考资料:由DataWhale开源的学习资料 1. 赛题简介 本次新人赛是Datawhale与天池联合发起的0基础入门系列赛事 -- 心跳信号分类预测. ...

  7. 天池二手车交易价格预测-Task1

    一.注册天池账号 二.熟悉赛题 三.下载数据集

  8. 二手车交易价格预测-01

    数据挖掘入门- 二手车交易价格预测-01 1-赛题分析 1.1 目的 1.2 数据 1.3 字段表 2-评测标准 3-结果提交 4-Datawhale带学资料 4.1 Baseline方案 4.2 比 ...

  9. 第一次认真的二手车交易价格预测--赛题分析

    二手车交易价格预测--赛题分析 数据比赛步骤 一. 赛题分析 1.1 学习目标 1.2 了解赛题 1.2.1 赛题概况 1.2.2 数据概况 train.csv 1.2.3 预测指标 一般问题评价指标 ...

最新文章

  1. OpenCV+python:直方图的应用(一)
  2. ashx误删后,未能创建类型
  3. 关于流控器件和压控器件
  4. 垃圾回收策略和算法,看这篇就够了
  5. 深度学习-tensorflow1.x:平均值(reduce_mean)与求和(reduce_sum) 小白理解 代码实现 Tensorflow1.x 和 Numpy
  6. BIO、NIO、AIO入门认识
  7. 关于html中css无法作用的问题
  8. Who's in the Middle - poj 2388 (快速排序寻找中位数)
  9. protected的继承方式有什么特点_酿酒:大曲酒有哪些配料方式?有什么特点?
  10. 南京邮电大学计算机专业学费多少,南京邮电大学学费多少
  11. ESET NOD32 v11.0.154
  12. Tomcat之deamon守护线程
  13. Python 获取车票信息
  14. 【西祠日志】【05】修修补补asp留言板,学习git,asp的ajax实现(2015.07.21周二)
  15. 智慧城市将成为推进我国新型城镇化的新思路、新手段、新模式
  16. ceph存储 FC HBA、iSCSI HBA、以太网卡3者区别
  17. 凸优化 - 2 - 凸集和凸函数
  18. 手机APP开发之MIT Appinventor详细实战教程(十三),云服务器的数据遇到的问题和解决的方法,以及网页客户端的详细使用方法,WIFI通信,数据获取在one net平台的相关应用
  19. 跑跑卡丁车辅助[免费辅助]跑跑卡丁车手游挂机自动日常肝图刷车刷道具
  20. UNION ALL用法 以及 UNION ALL和UNION的区别

热门文章

  1. android象棋简单实现
  2. 中国海洋大学第四届朗讯杯高级组 Playing Fair with Cryptography
  3. JavaScript匀速运动
  4. 韩国独自为朝韩铁路试运行买单5454亿韩元(图)
  5. zspace初级教程
  6. 国密算法SM1/SM2/SM3/SM4
  7. 还原巴菲特的部分真相(中)
  8. 从json提取数据,保存成txt格式
  9. swift 隐藏状态栏_swift 屏幕的翻转 + 状态栏(statusBar)的隐藏
  10. uniapp plus.downloader.createDownload 无反应问题