竞赛入门-数据探索性分析

  • 总览
  • 数据科学库
    • Numpy
    • Scipy
    • Pandas
  • 可视化库
    • matplotlib
    • seaborn
    • missingno库
  • 载入数据
  • 数据总揽
  • 数据检测
    • 缺失值检测
    • 异常值检测
  • 数据分布
    • 总体分布情况
    • 总体分布概况
    • skewness 和 kurtosis
    • 预测值分布
  • 数据特征
    • 数值特征分析
    • 相关性分析
    • 查看几个特征得 偏度和峰值
    • 每个数字特征得分布可视化
    • 数字特征相互之间的关系可视化
    • 多变量互相回归关系可视化
  • 类别特征分析
    • unique分布
    • 类别特征箱形图可视化
    • 类别特征的小提琴图可视化
    • 类别特征的柱形图可视化
    • 类别特征的每个类别频数可视化(count_plot)
  • 用pandas_profiling生成数据报告
  • 经验总结

总览


数据科学库

Numpy

Numpy(Numerical Python)
Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多为数据(矩阵)处理的库。用来存储和处理大型矩阵,比python自身的嵌套列表结构要高效得多。Python其余的科学计算扩展大部分都是以此为基础。

  1. 高性能科学计算和数据分析的基础包
  2. ndarry,多维数组(矩阵),具有矢量运算能力,快速,节省空间。
  3. 矩阵运算,无需循环,可完成类似Matlab中的矢量运算
  4. 线性代数,随即数生成
  5. import numpy as np

Scipy

Scipy
Scipy:基于Numpy提供了一个在Python中做科学计算的工具包。主要应用于统计,优化,整合,线性代数模块,傅利叶变换,信号和图像处理,常微分方程求解,稀疏矩阵等,在数学系或工程系相对用的多一些,和数据处理关系不大。
6. 在Nump库的基础上增加了众多的数学,科学及工程常用的库函数
7. 线性代数,常微分方程求解,信号处理,图像处理
8. 一般的数据处理numpy已经够用
9. import scipy as sp

Pandas

Pandas
Pandas:Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

可视化库

matplotlib

matplotlib
matplotlib:是一个python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

import matplotlib as mpl
import matplotlib.pyplot as plt

seaborn

seaborn
seaborn:是在matplotlit的基础上进行了更高级的API封装,从而使得做图更加容易,在大多数情况下使用seaborn就能制作出很具有吸引力的图,而是用matplotlib就能制作具有更多特色的图。应该把seaborn视为matplotlib的补充,而不是替代物

missingno库

missingo
missingo:是一个可视化缺失值库,方便使用,我们可以用pip install minssingno 下载安装。

import seaborn as sns

导入基础库代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno

载入数据

pd.read_csv():载入数据方法

Train_data = pd.read_csv('train.csv', sep=' ')

head():查看数据前5行方法
taill():查看数据后5行方法

Train_data.head().append(Train_data.tail())

shape:查看矩阵形状,如几行几列

Train_data.shape

要养成看数据集的head()以及shape的习惯,这会让你每一步更放心,导致接下里的连串的错误, 如果对自己的
pandas等操作不放心,建议执行一步看一下,这样会有效的方便你进行理解函数并进行操作。

数据总揽

describe():describe种有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值 看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,比如有的时候会发现999 9999 -1 等值这些其实都是nan的另外一种表达方式,有的时候需要注意下

info():通过info来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常

Train_data.describe()
Train_data.info()

数据检测

缺失值检测

isnull():Pandas中判断缺失值得方法,返回布尔值,缺失返回True,不缺失返回False
sum():加和函数

Train_data.isnull().sum()

plt.bar():matplotlit库中是使用条形图方法

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

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

matrix():可视化查看缺失值方法,missingno库中函数。

msno.matrix(Train_data.sample(250))

bar():missingno库中函数,调用条形图的方法

msno.bar(Train_data.sample(1000))

异常值检测

数据集中存在缺失值的的形式有很多,例如 “空值”,“-”等,或其他形式。
value_count():统计值类型的函数,也可以通过此函数查看数据是否倾斜

Train_data['notRepairedDamage'].value_counts()

因为很多模型对nan有直接的处理,这里我们先不做处理,先替换成nan.
replace():替换值方法

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

特征严重倾斜的类别,一般不会对预测有什么帮助,故这边先删掉,当然你也可以继续挖掘,但是一般意义不大。

del:删除函数

del Train_data["seller"]
del Train_data["offerType"]
del Test_data["seller"]
del Test_data["offerType"]

数据分布

总体分布情况

查看某特征的数值

Train_data['price']

某个特征的数值统计查询

Train_data['price'].value_counts()

约翰逊分布:经约翰逊变换后服从正态分布的随机变量的概率分布

总体分布概况

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

价格不服从正态分布,所以在进行回归之前,它必须进行转换,虽然对数变换做得很好,但最佳拟合是无界约翰逊分布

skewness 和 kurtosis

skewness(偏态)
正态分布(positive skewness distribution)是指频数分布的高峰偏于左侧,偏态系数为正直的频数分布形态。偏态分布为正偏态和负偏态。当均值大于众数时称为正偏态;当均值小于众数时称为负偏态。
kurtosis(峰度)
表征概率密度分布曲线在平均值处峰值高低的特征数
查看偏态和峰度代码

## 2) 查看skewness and kurtosis
sns.distplot(Train_data['price']);
print("Skewness: %f" % Train_data['price'].skew())
print("Kurtosis: %f" % Train_data['price'].kurt())
Train_data.skew(), Train_data.kurt()
sns.distplot(Train_data.skew(),color='blue',axlabel ='Skewness')
sns.distplot(Train_data.kurt(),color='orange',axlabel ='Kurtness')

预测值分布

## 3) 查看预测值的具体频数
plt.hist(Train_data['price'], orientation = 'vertical',histtype = 'bar', color ='red')
plt.show()

查看频数, 大于20000得值极少,其实这里也可以把这些当作特殊得值(异常值)直接用填充或者删掉,再前面进行。

# log变换 z之后的分布较均匀,可以进行log变换进行预测,这也是预测问题常用的trick
plt.hist(np.log(Train_data['price']), orientation = 'vertical',histtype = 'bar',color ='red')
plt.show()

数据特征

数据类型

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’(根据汽车的评
论、标签等大量信息得到的embedding向量)【人工构造 匿名特征】

# 分离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
# 特征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())

数值特征分析

numeric_features.append('price')
numeric_features
Train_data.head()

相关性分析

## 1) 相关性分析
price_numeric = Train_data[numeric_features]
correlation = price_numeric.corr()
print(correlation['price'].sort_values(ascending = False),'\n')
f , ax = plt.subplots(figsize = (7, 7))
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
sns.heatmap(correlation,square = True, vmax=0.8)
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) 每个数字特征得分布可视化
f = pd.melt(Train_data, value_vars=numeric_features)
g = sns.FacetGrid(f, col="variable", col_wrap=2, sharex=False, sharey=False)
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()
Train_data.columns

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

多变量互相回归关系可视化

## 5) 多变量互相回归关系可视化
fig, ((ax1, ax2), (ax3, ax4), (ax5, ax6), (ax7, ax8), (ax9, ax10)) = plt.subplots(nrows=5, ncols=2,
# ['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)

类别特征分析

unique分布

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

类别特征的每个类别频数可视化(count_plot)

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

用pandas_profiling生成数据报告

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

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

经验总结

所给出的EDA步骤为广为普遍的步骤,在实际的不管是工程还是比赛过程中,这只是最开始的一步,也是最基本的一步。
接下来一般要结合模型的效果以及特征工程等来分析数据的实际建模情况,根据自己的一些理解,查阅文献,对实际问题做出判断和深入的理解。
最后不断进行EDA与数据处理和挖掘,来到达更好的数据结构和分布以及较为强势相关的特征。

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

  1. 对于数据的初步分析(直接查看数据,或.sum(), .mean(),.descirbe()等统计函数)可以从:样本数量,训
    练集数量,是否有时间特征,是否是时许问题,特征所表示的含义(非匿名特征),特征类型(字符类似,
    int,float,time),特征的缺失情况(注意缺失的在数据中的表现形式,有些是空的有些是”NAN”符号
    等),特征的均值方差情况。
  2. 分析记录某些特征值缺失占比30%以上样本的缺失处理,有助于后续的模型验证和调节,分析特征应该是填
    充(填充方式是什么,均值填充,0填充,众数填充等),还是舍去,还是先做样本分类用不同的特征模型
    去预测。
  3. 对于异常值做专门的分析,分析特征异常的label是否为异常值(或者偏离均值较远或者事特殊符号),异常值
    是否应该剔除,还是用正常值填充,是记录异常,还是机器本身异常等。
  4. 对于Label做专门的分析,分析标签的分布情况等。
  5. 进步分析可以通过对特征作图,特征和label联合做图(统计图,离散图),直观了解特征的分布情况,通过
    这一步也可以发现数据之中的一些异常值等,通过箱型图分析一些特征值的偏离情况,对于特征和特征联合
    作图,对于特征和label联合作图,分析其中的一些关联性。

注:此为学习笔记,部分内容取自《Datawhale 数据挖掘学习路径》

竞赛入门-数据探索性分析(EDA)相关推荐

  1. 数据探索性分析(EDA)——异常值处理

    0 引言 前面有一篇文章介绍单变量分析时,我们提到需要对数据的异常值进行处理,异常值指的是远远偏离整个样本总体的观测值,异常值的存在会降低数据的正态性以及模型的拟合能力等等.异常值的检测主要用箱型图. ...

  2. #数据挖掘--第1章:EDA数据探索性分析

    #数据挖掘--第1章:EDA数据探索性分析 一.序言 二.EDA的意义 三.EDA的流程 一.序言   本系列博客面向初学者,只讲浅显易懂易操作的知识.包含:数据分析.特征工程.模型训练等通用流程.将 ...

  3. 数据探索性分析(EDA)常用方法大合集

    EDA(Exploratory Data Analysis),全名为数据探索性分析,是通过了解数据集,了解变量间的相互关系以及变量与预测值之间的关系,从而帮助我们后期更好地进行特征工程和建立模型,是数 ...

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

    一.赛题理解 1.1赛题概述 赛题以预测二手车的交易价格为任务,该数据来自某交易平台的二手车交易记录,总数据量超过40w,包含31列变量信息,其中15列为匿名变量.为了保证比赛的公平性,将会从中抽取1 ...

  5. python实现二手汽车价格预测(一)初始数据探索性分析

    python实现二手汽车价格预测(一)初始数据探索性分析 零基础入门数据挖掘的 EDA-数据探索性分析 部分,带你来了解数据,熟悉数据,和数据做朋友. 一.EDA目标 EDA的价值主要在于熟悉数据集, ...

  6. 数据探索性分析_探索性数据分析

    数据探索性分析 When we hear about Data science or Analytics , the first thing that comes to our mind is Mod ...

  7. 关于二手车交易预测的数据探索性分析

    关于二手车交易预测的数据探索性分析 我们为什么要进行数据分析呢?这是我摘自一个博客的一个答案,希望能给您帮助:探索性数据分析(Exploratory Data Analysis,简称EDA),摘抄网上 ...

  8. 机器学习的第一个难点,是数据探索性分析

    作者 | 陆春晖 责编 | 寇雪芹 头图 | 下载于视觉中国 当我们在进行机器学习领域的学习和研究时,遇到的第一个难点就是数据探索性分析(Exploratory Data Analysis).虽然从各 ...

  9. Kaggle泰坦尼克号数据机器学习实战:从缺失值处理、数据探索性分析、组合特征生成到多模型构建

    Kaggle泰坦尼克号数据机器学习实战:从缺失值处理.数据探索性分析.组合特征生成到多模型构建 泰坦尼克号的沉没是历史上最为人熟知的海难事件之一. 1912 年 4 月 15 日,在她的处女航中,泰坦 ...

最新文章

  1. 用JS来切换CSS,很好很简单
  2. C++ Primer 第十六章 模板与范型编程
  3. Windows下安装OpenSSL及其使用
  4. 16张扎心漫画,戳中女生私密日常,每一幕都很真实
  5. 螺旋遍历_螺旋形式的水平阶遍历
  6. ft2232驱动安装方法_教你win10系统显卡驱动安装失败的解决方法「系统天地」
  7. bzoj 4514: 数字配对
  8. python生成pdf报告模块_python生成pdf报告、python实现html转换为pdf报告
  9. python吃显卡还是内存条_内存条与显卡金手指氧化了解决方法
  10. node 生成随机头像_给微信设置卡通头像,再不怕撞脸!
  11. 小程序-云开发:云开发是什么?
  12. Linux——vi/vim文本编辑器、用户管理、关机重启的相关命令
  13. 一文带你了解助贷行业
  14. 帝国cms7.2 linux伪静态,帝国CMS7.0IIS伪静态设置教程
  15. 2000-XP-2003操作系统常见问题
  16. 推荐系统中的双塔模型
  17. 实践项目《项目开发团队分配管理软件》
  18. Kubernetes安装系列之kubctl exec权限设定
  19. JAVA 砸金蛋抽奖的简单实现
  20. ChinaRAP中国道路(路网)风险评估系统研究与应用

热门文章

  1. 计算机绘图尺寸标注,AutoCAD计算机绘图 第五章 尺寸标注.ppt
  2. TagSlam光学定位系统部署与调试
  3. XanderPanel -- 一个好用的 Dialog 拓展
  4. Windows 2008R2 安装VMware tools失败问题解决
  5. 天正建筑中如何调整标注尺寸的比例
  6. getchar---解析
  7. 如何恢复计算机工具栏,电脑任务栏怎么还原,详细教您怎么还原电脑任务栏
  8. [Linux]CentOS7校准时间--NTP
  9. 怎么去判断 js 的类型
  10. iOS VoiceOver编程指南