华为云大数据挑战赛热身赛——交通流量预测EDA-数据探索性分析

1 EDA目标

· EDA的价值主要在于熟悉数据集,了解数据集,对数据集进行验证来确定所获得数据集可以用于接下来的机器学习或者深度学习使用。

· 当了解了数据集之后我们下一步就是要去了解变量间的相互关系以及变量与预测值之间的存在关系。

· 引导数据科学从业者进行数据处理以及特征工程的步骤,使数据集的结构和特征集让接下来的预测问题更加可靠。

· 完成对于数据的探索性分析,并对于数据进行一些图表或者文字总结并打卡。

2 内容介绍

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生成数据报告

3 代码分析

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

1 import warnings
2 warnings.filterwarnings('ignore')
3 import pandas as pd
4 import numpy as np
5 import matplotlib.pyplot as plt
6 import seaborn as sns
7 import missingno as msno
8 import scipy.stats as st

3.2 载入数据

 1 train_path = './train_data.csv'
 2 test_path = './test_data.csv'
 3 # pandas显示首尾数据
 4 train_data = pd.read_csv(train_path,header=None,names=['time','cross','direction','leftFlow','straightFlow'])
 5 train_data = train_data.eval('total = leftFlow + straightFlow', inplace=False)
 6 print(train_data.head().append(train_data.tail()))
 7 print(train_data.shape)
 8 
 9 test_data = pd.read_csv(test_path,header=None,names=['time','cross','direction','leftFlow','straightFlow'])
10 test_data = test_data.eval('total = leftFlow + straightFlow', inplace=False)
11 print(test_data.head().append(test_data.tail()))
12 print(test_data.shape)

训练数据和测试数据概览如下(其中,total为leftFlow和straightFlow新合并成的列):

  · time - 时间

  · cross - 路口名

  · direction - 车流方向

  · leftFlow - 左转车流

  · straight - 直行车流

3.3 总览数据概况

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

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

1 # 总览数据概况
2 print(train_data.describe())
3 print(test_data.describe())
4 
5 # 查看数据类型
6 print(train_data.info())
7 print(test_data.info())

3.4 判断数据缺失和异常

1 # 查看数据缺失和异常
2 print(train_data.isnull().sum())
3 print(test_data.isnull().sum())

由此可见,该数据集中并无缺失和异常数据。

3.5 查看预测值的分布

1 # 查看预测值数据分布情况
2 print(train_data['leftFlow'].value_counts())
3 print(train_data['straightFlow'].value_counts())
4 print(train_data['total'].value_counts())
5 print(test_data['leftFlow'].value_counts())
6 print(test_data['straightFlow'].value_counts())
7 print(test_data['total'].value_counts())

可视化结果:

 1 y = train_data['total']
 2 plt.figure(1)
 3 plt.title('Johnson SU')
 4 sns.distplot(y, kde=False, fit=st.johnsonsu)
 5 plt.figure(2)
 6 plt.title('Normal')
 7 sns.distplot(y, kde=False, fit=st.norm)
 8 plt.figure(3)
 9 plt.title('Log Normal')
10 sns.distplot(y, kde=False, fit=st.lognorm)
11 plt.show()
12 
13 y = train_data['leftFlow']
14 plt.figure(1)
15 plt.title('Johnson SU')
16 sns.distplot(y, kde=False, fit=st.johnsonsu)
17 plt.figure(2)
18 plt.title('Normal')
19 sns.distplot(y, kde=False, fit=st.norm)
20 plt.figure(3)
21 plt.title('Log Normal')
22 sns.distplot(y, kde=False, fit=st.lognorm)
23 plt.show()
24 
25 y = train_data['straightFlow']
26 plt.figure(1)
27 plt.title('Johnson SU')
28 sns.distplot(y, kde=False, fit=st.johnsonsu)
29 plt.figure(2)
30 plt.title('Normal')
31 sns.distplot(y, kde=False, fit=st.norm)
32 plt.figure(3)
33 plt.title('Log Normal')
34 sns.distplot(y, kde=False, fit=st.lognorm)
35 plt.show()

total:

leftFlow:

straightFlow:

由上图可见,当前时刻总车流量更拟合无界约翰逊分布,其他数据对各分布的拟合效果并不是很好。

3.6 查看类别特征的unique分布

 1 categorical_features = ['time', 'cross', 'direction']
 2 # 特征unique分布
 3 for cat_fea in categorical_features:
 4     print(cat_fea + "的特征分布如下:")
 5     print("{}特征有个{}不同的值".format(cat_fea, train_data[cat_fea].nunique()))
 6     print(train_data[cat_fea].value_counts())
 7 
 8 # 特征unique 分布
 9 for cat_fea in categorical_features:
10     print(cat_fea + "的特征分布如下:")
11     print("{}特征有个{}不同的值".format(cat_fea, test_data[cat_fea].nunique()))
12     print(test_data[cat_fea].value_counts())

训练集:

测试集:

4 数据分析总览

训练集数据报告请见:http://123.57.131.141:8080/sample/train_report.html

测试集数据报告请见:http://123.57.131.141:8080/sample/test_report.html

原文地址:https://www.cnblogs.com/zdm-code/p/12944911.html