数据挖掘-Task2 数据分析

  • EDA-数据探索
    • EDA目标
      • 内容介绍
        • 载入各种数据科学以及可视化库
        • 载入数据
        • 判断数据缺失和异常
        • 预测值的分布
        • 用pandas_profiling生成数据报告
        • 总结
    • 代码示例
      • 载入各种数据科学以及可视化库
      • 载入数据
        • 载入训练集和测试集;
      • 简略观察数据(head()+shape)
      • 总览数据概况
        • 通过describe()来熟悉数据的相关统计量
        • 通过info()来熟悉数据类型
      • 判断数据缺失和异常
      • 查看每列的存在nan情况
        • nan可视化
        • 可视化看下缺省值
      • 查看异常值检测
      • 了解预测值的分布
    • 总体分布概况(无界约翰逊分布等)
      • 查看skewness and kurtosis
      • 查看预测值的具体频数
        • log变换 z之后的分布较均匀,可以进行log变换进行预测,这也是预测问题常用的trick
      • 特征分为类别特征和数字特征,并对类别特征查看unique分布
        • 分离label即预测值
      • 特征nunique分布
    • 用pandas_profiling生成数据报告
    • 经验总结

EDA-数据探索

赛题:零基础入门数据挖掘 - 二手车交易价格预测

EDA目标

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

完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡。还有一部分知识没有吃透,就不传上来了。

内容介绍

载入各种数据科学以及可视化库

数据科学库 pandas、numpy、scipy;
可视化库 matplotlib、seabon;

载入数据

载入训练集和测试集;
简略观察数据(head()+shape);
通过describe()来熟悉数据的相关统计量
通过info()来熟悉数据类型

判断数据缺失和异常

查看每列的存在nan情况
异常值检测

预测值的分布

总体分布概况(无界约翰逊分布等)
查看skewness 和 kurtosis
特征分为类别特征和数字特征,并对类别特征查看unique分布

用pandas_profiling生成数据报告

总结

代码示例

载入各种数据科学以及可视化库

库都是在windows下在cmd界面用pip install 安装
*pandans_profile在命令中改为pandas-profile

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
import scipy.stats as st
import pandas_profiling

载入数据

载入训练集和测试集;

Train_data = pd.read_csv('F://shuju/used_car_train_20200313.csv',sep=' ')
Test_data = pd.read_csv('F://shuju/used_car_testA_20200313.csv',sep=' ')

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个匿名特征】

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

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

Train_data.shape
Test_data.head().append(Test_data.tail())

Test_data.shape

看数据集的head()以及shape,能有效避免导致接下里的连串的错误。

总览数据概况

describe种有每列的统计量,个数count、平均值mean、方差std、最小值min、中位数25% 50% 75% 、以及最大值,看这个信息主要是瞬间掌握数据的大概的范围以及每个值的异常值的判断,
通过info来了解数据每列的type,有助于了解是否存在除了nan以外的特殊符号异常

通过describe()来熟悉数据的相关统计量

Train_data.describe()

Test_data.describe()

通过info()来熟悉数据类型

Train_data.info()


这里可以看到notRepairedDamage是唯一一个object类型

Test_data.info()


这里也是同样的情况notRepairedDamage是唯一一个object类型

判断数据缺失和异常

查看每列的存在nan情况

Train_data.isnull().sum()

Test_data.isnull().sum()

nan可视化

missing = Train_data.isnull().sum()
missing = missing[missing > 0]
missing.sort_values(inplace=True)
missing.plot.bar()

通过以上两句可以很直观的了解哪些列存在 “nan”, 并可以把nan的个数打印.

可视化看下缺省值

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


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



测试集的缺省和训练集的差不多情况.

查看异常值检测

Train_data.info()


可以发现除了notRepairedDamage 为object类型其他都为数字 这里我们把他的几个不同的值都进行显示就知道了

Train_data['notRepairedDamage'].value_counts()

0.0 111361
– 24324
1.0 14315
Name: notRepairedDamage, dtype: int64
可以看出来‘ - ’也为空缺值,因为很多模型对nan有直接的处理,这里我们先不做处理,先替换成nan

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

0.0 111361
1.0 14315
Name: notRepairedDamage, dtype: int64

Train_data.isnull().sum()
Test_data['notRepairedDamage'].value_counts()

0.0 37249
– 8031
1.0 4720
Name: notRepairedDamage, dtype: int64

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

0 149999
1 1
Name: seller, dtype: int64

Train_data["offerType"].value_counts()
Train_data['fuelType'].value_counts()
Train_data['gearbox'].value_counts()
Train_data["seller"].value_counts()

对多个值检测发现,seller和offerType两个类别特征严重倾斜,一般不会对预测有什么帮助,故这边先删掉。

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

了解预测值的分布

Train_data['price']

0 1850
1 3600
2 6222
3 2400
4 5200
5 8000
6 3500
7 1000
8 2850
9 650
10 3100
11 5450
12 1600
13 3100
14 6900
15 3200
16 10500
17 3700
18 790
19 1450
20 990
21 2800
22 350
23 599
24 9250
25 3650
26 2800
27 2399
28 4900
29 2999

149970 900
149971 3400
149972 999
149973 3500
149974 4500
149975 3990
149976 1200
149977 330
149978 3350
149979 5000
149980 4350
149981 9000
149982 2000
149983 12000
149984 6700
149985 4200
149986 2800
149987 3000
149988 7500
149989 1150
149990 450
149991 24950
149992 950
149993 4399
149994 14780
149995 5900
149996 9500
149997 7500
149998 4999
149999 4700
Name: price, Length: 150000, dtype: int64
1
Train_data[‘price’].value_counts()
500 2337
1500 2158
1200 1922
1000 1850
2500 1821
600 1535
3500 1533
800 1513
2000 1378
999 1356
750 1279
4500 1271
650 1257
1800 1223
2200 1201
850 1198
700 1174
900 1107
1300 1105
950 1104
3000 1098
1100 1079
5500 1079
1600 1074
300 1071
550 1042
350 1005
1250 1003
6500 973
1999 929

21560 1
7859 1
3120 1
2279 1
6066 1
6322 1
4275 1
10420 1
43300 1
305 1
1765 1
15970 1
44400 1
8885 1
2992 1
31850 1
15413 1
13495 1
9525 1
7270 1
13879 1
3760 1
24250 1
11360 1
10295 1
25321 1
8886 1
8801 1
37920 1
8188 1
Name: price, Length: 3763, dtype: int64

总体分布概况(无界约翰逊分布等)

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

Train_data.skew(), Train_data.kurt()

(SaleID 6.017846e-17
, name 5.576058e-01
, regDate 2.849508e-02
, model 1.484388e+00
, brand 1.150760e+00
, bodyType 9.915299e-01
, fuelType 1.595486e+00
, gearbox 1.317514e+00
, power 6.586318e+01
, kilometer -1.525921e+00
, notRepairedDamage 2.430640e+00
, regionCode 6.888812e-01
, creatDate -7.901331e+01
, price 3.346487e+00
, v_0 -1.316712e+00
, v_1 3.594543e-01
, v_2 4.842556e+00
, v_3 1.062920e-01
, v_4 3.679890e-01
, v_5 -4.737094e+00
, v_6 3.680730e-01
, v_7 5.130233e+00
, v_8 2.046133e-01
, v_9 4.195007e-01
, v_10 2.522046e-02
, v_11 3.029146e+00
, v_12 3.653576e-01
, v_13 2.679152e-01
, v_14 -1.186355e+00
, dtype: float64, SaleID -1.200000
, name -1.039945
, regDate -0.697308
, model 1.740483
, brand 1.076201
, bodyType 0.206937
, fuelType 5.880049
, gearbox -0.264161
, power 5733.451054
, kilometer 1.141934
, notRepairedDamage 3.908072
, regionCode -0.340832
, creatDate 6881.080328
, price 18.995183
, v_0 3.993841
, v_1 -1.753017
, v_2 23.860591
, v_3 -0.418006
, v_4 -0.197295
, v_5 22.934081
, v_6 -1.742567
, v_7 25.845489
, v_8 -0.636225
, v_9 -0.321491
, v_10 -0.577935
, v_11 12.568731
, v_12 0.268937
, v_13 -0.438274
, v_14 2.393526
, dtype: float64)

skew、kurt说明参考https://www.cnblogs.com/wyy1480/p/10474046.html

查看预测值的具体频数

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

特征分为类别特征和数字特征,并对类别特征查看unique分布

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即预测值

Y_train = Train_data['price']
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',]

数字特征
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())

name的特征分布如下:
name特征有个99662不同的值
708 282
387 282
55 280
1541 263
203 233
53 221
713 217
290 197
1186 184
911 182
2044 176
1513 160
1180 158
631 157
893 153
2765 147
473 141
1139 137
1108 132
444 129
306 127
2866 123
2402 116
533 114
1479 113
422 113
4635 110
725 110
964 109
1373 104

89083 1
95230 1
164864 1
173060 1
179207 1
181256 1
185354 1
25564 1
19417 1
189324 1
162719 1
191373 1
193422 1
136082 1
140180 1
144278 1
146327 1
148376 1
158621 1
1404 1
15319 1
46022 1
64463 1
976 1
3025 1
5074 1
7123 1
11221 1
13270 1
174485 1
Name: name, Length: 99662, dtype: int64
model的特征分布如下:
model特征有个248不同的值
0.0 11762
19.0 9573
4.0 8445
1.0 6038
29.0 5186
48.0 5052
40.0 4502
26.0 4496
8.0 4391
31.0 3827
13.0 3762
17.0 3121
65.0 2730
49.0 2608
46.0 2454
30.0 2342
44.0 2195
5.0 2063
10.0 2004
21.0 1872
73.0 1789
11.0 1775
23.0 1696
22.0 1524
69.0 1522
63.0 1469
7.0 1460
16.0 1349
88.0 1309
66.0 1250

141.0 37
133.0 35
216.0 30
202.0 28
151.0 26
226.0 26
231.0 23
234.0 23
233.0 20
198.0 18
224.0 18
227.0 17
237.0 17
220.0 16
230.0 16
239.0 14
223.0 13
236.0 11
241.0 10
232.0 10
229.0 10
235.0 7
246.0 7
243.0 4
244.0 3
245.0 2
209.0 2
240.0 2
242.0 2
247.0 1
Name: model, Length: 248, dtype: int64
brand的特征分布如下:
brand特征有个40不同的值
0 31480
4 16737
14 16089
10 14249
1 13794
6 10217
9 7306
5 4665
13 3817
11 2945
3 2461
7 2361
16 2223
8 2077
25 2064
27 2053
21 1547
15 1458
19 1388
20 1236
12 1109
22 1085
26 966
30 940
17 913
24 772
28 649
32 592
29 406
37 333
2 321
31 318
18 316
36 228
34 227
33 218
23 186
35 180
38 65
39 9
Name: brand, dtype: int64
bodyType的特征分布如下:
bodyType特征有个8不同的值
0.0 41420
1.0 35272
2.0 30324
3.0 13491
4.0 9609
5.0 7607
6.0 6482
7.0 1289
Name: bodyType, dtype: int64
fuelType的特征分布如下:
fuelType特征有个7不同的值
0.0 91656
1.0 46991
2.0 2212
3.0 262
4.0 118
5.0 45
6.0 36
Name: fuelType, dtype: int64
gearbox的特征分布如下:
gearbox特征有个2不同的值
0.0 111623
1.0 32396
Name: gearbox, dtype: int64
notRepairedDamage的特征分布如下:
notRepairedDamage特征有个2不同的值
0.0 111361
1.0 14315
Name: notRepairedDamage, dtype: int64
regionCode的特征分布如下:
regionCode特征有个7905不同的值
419 369
764 258
125 137
176 136
462 134
428 132
24 130
1184 130
122 129
828 126
70 125
827 120
207 118
1222 117
2418 117
85 116
2615 115
2222 113
759 112
188 111
1757 110
1157 109
2401 107
1069 107
3545 107
424 107
272 107
451 106
450 105
129 105

6324 1
7372 1
7500 1
8107 1
2453 1
7942 1
5135 1
6760 1
8070 1
7220 1
8041 1
8012 1
5965 1
823 1
7401 1
8106 1
5224 1
8117 1
7507 1
7989 1
6505 1
6377 1
8042 1
7763 1
7786 1
6414 1
7063 1
4239 1
5931 1
7267 1
Name: regionCode, Length: 7905, dtype: int64

用pandas_profiling生成数据报告

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

经验总结

所给出的EDA步骤为广为普遍的步骤,在实际的不管是工程还是比赛过程中,这只是最开始的一步,也是最基本的一步。
接下来一般要结合模型的效果以及特征工程等来分析数据的实际建模情况,根据自己的一些理解,查阅文献,对实际问题做出判断和深入的理解。
最后不断进行EDA与数据处理和挖掘,来到达更好的数据结构和分布以及较为强势相关的特征
数据探索在机器学习中我们一般称为EDA(Exploratory Data Analysis):
是指对已有的数据(特别是调查或观察得来的原始数据)在尽量少的先验假定下进行探索,通过作图、制表、方程拟合、计算特征量等手段探索数据的结构和规律的一种数据分析方法。
数据探索有利于我们发现数据的一些特性,数据之间的关联性,对于后续的特征构建是很有帮助的。
对于数据的初步分析(直接查看数据,或.sum(), .mean(),.descirbe()等统计函数)可以从:样本数量,训练集数量,是否有时间特征,是否是时许问题,特征所表示的含义(非匿名特征),特征类型(字符类似,int,float,time),特征的缺失情况(注意缺失的在数据中的表现形式,有些是空的有些是”NAN”符号等),特征的均值方差情况。
分析记录某些特征值缺失占比30%以上样本的缺失处理,有助于后续的模型验证和调节,分析特征应该是填充(填充方式是什么,均值填充,0填充,众数填充等),还是舍去,还是先做样本分类用不同的特征模型去预测。
对于异常值做专门的分析,分析特征异常的label是否为异常值(或者偏离均值较远或者事特殊符号),异常值是否应该剔除,还是用正常值填充,是记录异常,还是机器本身异常等。
对于Label做专门的分析,分析标签的分布情况等。
进步分析可以通过对特征作图,特征和label联合做图(统计图,离散图),直观了解特征的分布情况,通过这一步也可以发现数据之中的一些异常值等,通过箱型图分析一些特征值的偏离情况,对于特征和特征联合作图,对于特征和label联合作图,分析其中的一些关联性。

DateWhale数据挖掘-纯小白相关推荐

  1. 0基础学python有多难-0基础纯小白学Python,请注意这2个坑

    0基础的纯小白学Python有哪些坑需要避免?有没有适合小白的Python教材推荐? 很多纯0基础,毫无编程经验的小白在学习Python的过程中总是无法坚持下来,究其原因,其实就是因为毫无经验,方向不 ...

  2. Git(2)-- Git安装后首次配置与第一次使用Git和Github管理自己的代码(超详细纯小白图文教程)

    文章目录 0.写在前面: 一.注册Github 1.注册Github: 2.登录 3.创建仓库 二.安装Git 三.配置Git和Github(Git安装好后首次使用需要配置完成后才可以使用) 1.打开 ...

  3. C语言实现扫雷小游戏 纯小白 非黑窗口

    C语言实现一个普通的扫雷小游戏 纯小白所编(含代码非黑窗口!) 扫雷 主要功能 1.创建一个图形界面 2.了解扫雷游戏的原理 3.随机生成雷的位置 4.为整个数组加密,并在雷周围的位置加一 5.导入图 ...

  4. 两年,从纯小白到腾讯阿里,应届非计算机毕业生的2014互联网求职之路

    0. 写在前面 以此文,献给自己这两年的青葱岁月,感谢淘宝的朗英师兄和微博的旭爷.全栈pm莹姐姐.酷炫石女王.以及我逝去的头发. 参照Lucida的<9个offer,12家公司,35场面试... ...

  5. 两年,从纯小白到腾讯阿里,应届非计算机毕业生的2014互联网求职之路(转)...

    原文地址 0. 写在前面 以此文,献给自己这两年的青葱岁月,感谢淘宝的朗英师兄和微博的旭爷.全栈pm莹姐姐.酷炫石女王.以及我逝去的头发. 参照Lucida的<9个offer,12家公司,35场 ...

  6. 青龙面板搭建 纯小白教程

    教大家如何搭建青龙面板 薅羊毛(纯小白教程)大佬勿喷. 建议:服务器大家用腾讯的轻量云就可以 现在优惠力度大 1h2g2m轻量云 50r一年 推荐用2h4g8m的 74r一年 还可以用来搭建v2免流 ...

  7. 如何做个网站-纯小白

    如何做个网站-纯小白 推荐一个up主的视频,不是我的,只是学到很多东西,分享一下 https://www.bilibili.com/video/BV1Cx411V7FV 一.需要 1.服务器(可以自己 ...

  8. 纯小白操作淘宝C店的第一天

    @TOC纯小白操作淘宝C店 的第一天 三十岁生日的时候,发现自己得从小白开始创业,而创业的项目竟然是总所周知的淘宝C店. 很多人说,这是不务正业:很多人说,淘宝C店已经过了风口:很多人说,别浪费时间了 ...

  9. YOLOv5s的模型训练与使用(纯小白入门)

    YOLOv5s的模型训练与使用(纯小白入门) 文章目录 YOLOv5s的模型训练与使用(纯小白入门) 概要 下载yolov5与安装依赖 训练 检测 检测图片 实时检测视频 概要 本文主要面向第一次使用 ...

  10. 数据库里怎么修改服务器爆率,关于数据库点窜爆率及点窜和增加掉落的教程(纯小白版)...

    本帖最初由 killyou555 于 2020-2-17 09:01 编辑 由于近期不能出门,致使在家闲着.为了打发时候,翻出网盘里的魔兽天下单机版,重新起头一点一点的磨着玩,好长时候没玩了,原本自己 ...

最新文章

  1. AgileEAS.NET平台开发实例-药店系统-准备开发环境(上)
  2. RBAC用户角色权限设计方案
  3. 学校做计算机教室锐捷,锐捷云课堂:让学生爱上每一节课
  4. 读书笔记《单核工作法》_3原理2,3
  5. 亚信安全发布《2022年网络安全发展趋势及十大威胁预测》
  6. 三问Spring事务:解决什么问题?如何解决?存在什么问题?
  7. Leetcode 385.字典序排序
  8. 透视投影中3DMM系数的求解
  9. IPTV软件提取后无法安装:显示安装失败,需求的共享用户签名错误!请大神帮助,谢谢
  10. springboot系列(二十六):如何实现word模板单页导出?这你得会|超级详细,建议收藏
  11. springboot通过maven管理mysql驱动加载失败
  12. 转帖:免费完美激活Windows7旗舰版
  13. windows service 2012阿里云服务器在搭建mysql时缺少msvcr100.dll文件解决方案
  14. 股票实时行情数据有哪些分类?
  15. windows安全中心(windows defender)对下载内容报毒解决方案
  16. android studio jni.h 红色报错
  17. 区块链需要c语言和linux嘛,区块链技术如何运作?使用什么开发语言?
  18. Elastic search常用分词 和 多字段搜索优化
  19. 用【python】自做动图
  20. 2021-3-17 Jmeter线程组、运行启动方式

热门文章

  1. 吃鸡游戏计算机配置,手游吃鸡pc端吃什么配置
  2. 解决在onedrive里无法打开onenote笔记本的问题
  3. java中double..compare_为什么Java的Double.compare(double,double)实现了它的样子?
  4. 2019 “钱”途光明的 8 大前端开发技术,你还差几个?
  5. 【前端小技能】ElementUI表格双击可编辑--开箱即用
  6. [渝粤教育] 盐城工学院 材料物理性能 参考 资料
  7. java8分组lambda_Java 8,Lambda:在分组列表中排序并将所有组合并到列表中
  8. AUTOCAD——中心缩放
  9. 矩阵分析与应用 -- 线性方程组
  10. 发票查验、发票识别API