锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

机器学习(5)——数据探索与可视化(1)

时间:2023-09-09 20:07:02 whj1精密电位器精密电位器whj1

目录

1 缺失值处理

1.1 缺失值处理方法简单

1.1.1 发现数据中的缺失值

1.1.2 去掉有缺失值的行或列

1.1.3 插补缺失值

1.2 缺失值填充方法复杂

1.2.1 IterativeImputer多变量缺失值填充

1.2.2 K-近邻缺失值填充

1.2.3 随机森林缺失值填充

2 数据描述和异常值发现

2.1 统计数据描述

2.1.1 数据集中的位置

2.1.2 离散程度

2.1.3 偏度和峰度

2.1.4 单个数据变量的分布

2.2发现异常值的基本方法


在数据探索过程中,面对一组读取的数据,第一个问题是检查数据是否完整,数据是否包含缺失值。如果数据不完整,则需要使用适当的缺失值处理方法来填补不同的缺失值。在获得完整的数据后,要描述和统计数据,以进一步全面了解数据的形式和内容。

将包括数据探索和可视化:缺失值处理数据描述与异常值发现数据关系的可视化分析数据样本之间的距离

1 缺失值处理

数据缺失是指在数据采集、传输和处理过程中由于某些原因导致数据不完整的情况。由于需要分析的数据获取过程中可能存在各种干扰因素,因此在数据分析中存在缺失值是一种非常常见的现象。如何使用适当的方法来处理缺失值是数据预处理的关键问题之一。处理缺失值的方法有很多,如消除缺失值、平均填充、K-填补近邻缺失值等方法。

1.1 缺失值处理方法简单

1.1.1 发现数据中的缺失值

在处理数据缺失值时,第一步是分析数据中是否存在缺失值和缺失值的形式。以下是一个数据集,介绍了从数据中发现缺失值的方法。

热带大气海洋数据.csv文件提取链接:

链接:https://pan.baidu.com/s/1pYM1fTz9m7ZA6yOP54CWkg
提取码:whj6

import pandas as pd ##读取用于演示的数据集 oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv') 判断每个变量中是否存在缺失值 print(pd.isna(oceandf).sum())

本例使用pd.isna()方法判断每个位置是否缺失值,然后使用sum()方法计算每个变量缺失值的数量。

运行结果如下:

Year               0 Latitude           0 Longitude          0 SeaSurfaceTemp     3 AirTemp           81 Humidity          93 UWind              0 VWind              0 dtype: int64

从运行结果可以看出,共有三个变量有缺失值,即SeaSurfaceTemp(三个缺失值)AirTemp(81缺失值)Humidity(93缺失值)。虽然我们知道数据中的缺失值,但我们不知道数据表中缺失值的分布。对于这种情况,我们可以使用它msno.matrix()函数数据中缺失值的分布可视化。

import pandas as pd import missingno as msno import matplotlib.pyplot as plt #图像显示中文设置 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False ##读取用于演示的数据集 oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv') 判断每个变量中是否存在缺失值 #print(pd.isna(oceandf).sum())  #使用可视化方法查看数据缺失值在数据中的分布 msno.matrix(oceandf,figsize=(15,8),width_ratios=(13,2),color=(0.25,0.25,0.5)) plt.show()

运行结果如下:

缺失值分布可视化

左侧表示数据中缺失值的分布,736表示数据表中第736行数据空白的部位表示该处存在缺失值,右边部分的折线表示每个样本缺失值的情况,8表示数据中一共有8个变量,5表示对应的样本只有5个变量是完整的,存在3个缺失值。

在发现数据中带有缺失值后,就需要根据缺失值的情况进行预处理,下面介绍几种简单的数据缺失值预处理方法。

1.1.2 剔除带有缺失值的行或列

剔除带有缺失值的行或列是最简单的缺失值处理方法。通常情况下,如果数据中只有较少的样本带有缺失值,则可以剔除带有缺失值的行。如果某列的数据带有大量的缺失值,进行缺失值填充可能会带来更多的负面影响,则可以直接剔除缺失值所在的列。剔除数据中带有缺失值的行或列,可以使用数据的dropna()方法,指定该方法的参数axis=0则会剔除带有缺失值所在的,指定参数axis=1则会剔除带有缺失值所在的

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()

运行结果如下:

剔除带有缺失值的行:

Int64Index: 565 entries, 0 to 735
Data columns (total 8 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Year            565 non-null    int64  
 1   Latitude        565 non-null    int64  
 2   Longitude       565 non-null    int64  
 3   SeaSurfaceTemp  565 non-null    float64
 4   AirTemp         565 non-null    float64
 5   Humidity        565 non-null    float64
 6   UWind           565 non-null    float64
 7   VWind           565 non-null    float64
dtypes: float64(5), int64(3)
memory usage: 39.7 KB
剔除带有缺失值的列:

RangeIndex: 736 entries, 0 to 735
Data columns (total 5 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Year       736 non-null    int64  
 1   Latitude   736 non-null    int64  
 2   Longitude  736 non-null    int64  
 3   UWind      736 non-null    float64
 4   VWind      736 non-null    float64
dtypes: float64(2), int64(3)
memory usage: 28.9 KB

1.1.3 对缺失值进行插补

缺失值插补是处理带有缺失值数据的另一种方式。下面介绍如何使用缺失值的均值、前面的值等进行缺失值插补。在这之前首先使用散点图,可视化出剔除带有缺失值行后,AirTemp和Humidity变量的数据分布。

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
#可视化出剔除缺失值所在行后AirTemp和Humidity变量的数据分布散点图
plt.figure()
plt.scatter(oceandf.AirTemp,oceandf.Humidity,c='blue')
plt.grid()
plt.xlabel('AirTemp')
plt.ylabel('Humidity')
plt.title('剔除带有缺失值的行')
plt.show()

注意:程序可视化出的是数据在剔除缺失值所在的行后的结果,而这里仍然使用原始数据表oceandf进行可视化,这是因为在可视化时,使用的plt.scatter()函数会自动地不显示带有缺失值的点(本来就不包含这些点)。

运行结果如下:

 针对数据表数据,pandas库提供了数据表的fillna()方法,该方法可以通过参数method设置缺失值的填充方式,常用的方式有method="ffill",使用缺失值前面的值进行填充method="bfill",使用缺失值后面的值进行填充。下面针对oceandf数据集分别使用这两种方式填充缺失值,并可视化出填充后缺失值所在的位置。

(1)method="ffill"

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
# #可视化出剔除缺失值所在行后AirTemp和Humidity变量的数据分布散点图
# plt.figure()
# plt.scatter(oceandf.AirTemp,oceandf.Humidity,c='blue')
# plt.grid()
# plt.xlabel('AirTemp')
# plt.ylabel('Humidity')
# plt.title('剔除带有缺失值的行')
# plt.show()
#找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#使用缺失值前面的值进行填充
oceandf4 = oceandf.fillna(axis=0,method='ffill')
plt.figure()
plt.scatter(oceandf4.AirTemp[~nanaindex],oceandf4.Humidity[~nanaindex],
            c='blue',marker='o',label='非缺失值')
plt.scatter(oceandf4.AirTemp[nanaindex],oceandf4.Humidity[nanaindex],
            c='red',marker='s',label='缺失值')
plt.grid()
plt.legend(loc='best',fontsize=12)
plt.xlabel('AirTemp')
plt.ylabel('Humidity')
plt.title('使用缺失值前面的值进行填充')
plt.show()

运行结果如下:

使用缺失值前面的值进行填充

图中,蓝色圆点表示不带缺失值的数据,红色矩形表示带有缺失值的数据。填充的缺失值分布在两条直线上,这是因为每个变量的缺失值比较集中,数据填充值较为单一。

(2)method="bfill"

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
# #可视化出剔除缺失值所在行后AirTemp和Humidity变量的数据分布散点图
# plt.figure()
# plt.scatter(oceandf.AirTemp,oceandf.Humidity,c='blue')
# plt.grid()
# plt.xlabel('AirTemp')
# plt.ylabel('Humidity')
# plt.title('剔除带有缺失值的行')
# plt.show()
#找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#使用缺失值后面的值进行填充
oceandf4 = oceandf.fillna(axis=0,method='bfill')
plt.figure(figsize=(10,6))
plt.scatter(oceandf4.AirTemp[~nanaindex],oceandf4.Humidity[~nanaindex],
            c='blue',marker='o',label='非缺失值')
plt.scatter(oceandf4.AirTemp[nanaindex],oceandf4.Humidity[nanaindex],
            c='red',marker='s',label='缺失值')
plt.grid()
plt.legend(loc='best',fontsize=12)
plt.xlabel('AirTemp')
plt.ylabel('Humidity')
plt.title('使用缺失值后面的值进行填充')
plt.show()

运行结果如下:

 使用缺失值后面的值进行填充

注意:针对oceandf数据集,因为两个变量的缺失值分布的位置较为集中,所以不太适合使用前面或者后面的值进行缺失值填充,当缺失值的分布在每个变量中较为离散时,使用这种方法较为合适。

(3)使用均值对变量进行缺失值填充

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
oceandf3.info()
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#使用变量均值进行填充
AirTempmean = oceandf.AirTemp.mean()
Humiditymean = oceandf.Humidity.mean()
#填充
AirTemp = oceandf.AirTemp.fillna(value=AirTempmean)
Humidity = oceandf.Humidity.fillna(value=Humiditymean)
#可视化填充后的结果
plt.figure(figsize=(10,6))
plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
            c='blue',marker='o',label='非缺失值')
plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
            c='red',marker='s',label='缺失值')
plt.grid()
plt.legend(loc='best',fontsize=12)
plt.xlabel('AirTemp')
plt.ylabel('Humidity')
plt.title('使用变量均值进行填充')
plt.show()

 运行结果如下:

使用变量均值进行填充

从上面的3中缺失值填充结果可以发现,针对该数据使用简单的缺失值填充方法,并不能获得很好的缺失值填充效果,造成这个结果的一个重要原因是,在缺失值填充时,只单一的分析一个变量,并不能从整体数据出发,不能借助样本的其他信息进行填充。

 1.2 复杂的缺失值填充方法

复杂的缺失值填充方法会考虑到数据的整体情况,然后在对有缺失值的数据进行填充。

1.2.1 IterativeImputer多变量缺失值填充

Iterativelmputersklearn库中提供的一种缺失值填充方式,该方法会考虑数据在高位空间中的整体分布情况,然后对有缺失值的样本进行填充。

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
#找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#IterativeImputer多变量缺失值填充方法
iterimp = IterativeImputer(random_state=123)
oceandfiter = iterimp.fit_transform(oceandf)
#获取填充后的变量
AirTemp = oceandfiter[:,4]
Humidity = oceandfiter[:,5]
#可视化填充后的结果
plt.figure(figsize=(10,6))
plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
            c='blue',marker='o',label='非缺失值')
plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
            c='red',marker='s',label='缺失值')
plt.grid()
plt.legend(loc='best',fontsize=12)
plt.xlabel('AirTemp')
plt.ylabel('Humidity')
plt.title('IterativeImputer多变量缺失值填充方法')
plt.show()

 运行结果如下:

 IterativeImputer多变量缺失值填充

从运行结果来看,该方法填充的效果更符合数据的分布规律。

1.2.2 K-近邻缺失值填充

K-近邻缺失值填充方法是复杂的缺失值填充方式之一,该方法会利用带有缺失值样本的多个近邻的综合情况,对缺失值样本进行填充,该方法可以使用sklearn库中的KNNImputer来完成。

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.impute import KNNImputer
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
#找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#KNNImputer缺失值填充方法
knnimp = KNNImputer(n_neighbors=5)
oceandfknn = knnimp.fit_transform(oceandf)
#获取填充后的变量
AirTemp = oceandfknn[:,4]
Humidity = oceandfknn[:,5]
#可视化填充后的结果
plt.figure(figsize=(10,6))
plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
            c='blue',marker='o',label='非缺失值')
plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
            c='red',marker='s',label='缺失值')
plt.grid()
plt.legend(loc='best',fontsize=12)
plt.xlabel('AirTemp')
plt.ylabel('Humidity')
plt.title('KNNImputer缺失值填充方法')
plt.show()

 运行结果如下:

 KNNImputer缺失值填充方法

K-近邻缺失值填充结果在数据分布上也较符合原始数据的分布。

1.2.3 随机森林缺失值填充

针对带有缺失值的数据,也可以使用随机森林缺失值填充方法。该方法利用随机森林的思想进行缺失值填充,也是一种考虑数据整体情况的缺失值填充方法。

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.impute import KNNImputer
from missingpy import MissForest  #missingpy,此处需要较低版本的scikit-learn来支持,

#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
#找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#MissForest缺失值填充方法
forestimp = MissForest(n_estimators=100,random_state=123)
oceandfforest = forestimp.fit_transform(oceandf)
#获取填充后的变量
AirTemp = oceandfforest[:,4]
Humidity = oceandfforest[:,5]
#可视化填充后的结果
plt.figure(figsize=(10,6))
plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
            c='blue',marker='o',label='非缺失值')
plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
            c='red',marker='s',label='缺失值')
plt.grid()
plt.legend(loc='best',fontsize=12)
plt.xlabel('AirTemp')
plt.ylabel('Humidity')
plt.title('MissForest缺失值填充方法')
plt.show()

注意:由于我的scikit-learn为1.1.1版本,所以运行失败,如果需要尝试的话,可以通过降低scikit-learn的版本如0.22来支持missingpy。

2 数据描述与异常值发现

数据描述是通过分析数据的统计特征,增强对数据的理解,从而利用合适的机器学习方法,对数据进行挖掘、分析。

2.1 数据描述统计

数据描述统计主要有数据的集中位置、离散程度、偏度和峰度等。

Iris.csv文件链接:

链接:https://pan.baidu.com/s/1TEq5SxWyi-6deYixjP_s8Q 
提取码:whj6

import pandas as pd
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
Iris2 = Iris.drop(["Id","Species"],axis=1)
print(Iris2.head())

 运行结果如下:

 SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm
0            5.1           3.5            1.4           0.2
1            4.9           3.0            1.4           0.2
2            4.7           3.2            1.3           0.2
3            4.6           3.1            1.5           0.2
4            5.0           3.6            1.4           0.2

2.1.1 数据集中的位置

针对导入的鸢尾花数据集Iris2,只保留了原始数据的4个数值变量。描述数据集中位置的统计量主要有均值、中位数、众数等。在计算数据中4个变量的相关统计量时,均值可使用mean()方法中位数可以使用median()方法众数可以使用mode()方法

import pandas as pd
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
Iris2 = Iris.drop(["Id","Species"],axis=1)
#均值
print("均值:\n", Iris2.mean())
#中位数
print("中位数:\n", Iris2.median())
#众数
print("众数:\n", Iris2.mode())

 运行结果如下:

均值:
 SepalLengthCm    5.843333
SepalWidthCm     3.054000
PetalLengthCm    3.758667
PetalWidthCm     1.198667
dtype: float64
中位数:
 SepalLengthCm    5.80
SepalWidthCm     3.00
PetalLengthCm    4.35
PetalWidthCm     1.30
dtype: float64
众数:
    SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm
0            5.0           3.0            1.5           0.2

2.1.2 离散程度

描述数据离散程度的统计量主要有方差、标准差、变异系数、分位数和极差等。其中方差和标准差取值越大,表明数据离散程度就越大,并且方差是标准差的平方,可以使用var()方法计算方差使用std()方法计算标准差变异系数是度量观测数据的标准差相对于均值的离中趋势,计算公式为均值除以标准差,变异系数没有量纲,所以针对不同度量方式的变量可以相互比较,变异系数取值越大说明数据越分散;分位数可以使用quantile()方法进行计算;极差是指数据最大值和最小值之间的差值,极差越小说明数据越集中,可以使用max()方法减去min()方法获得。

import pandas as pd
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
Iris2 = Iris.drop(["Id","Species"],axis=1)
# #均值
# print("均值:\n", Iris2.mean())
# #中位数
# print("中位数:\n", Iris2.median())
# #众数
# print("众数:\n", Iris2.mode())
#极差
print("极差:\n", Iris2.max()-Iris2.min())
#分位数
print("分位数:\n", Iris2.quantile(q=[0,0.25,0.5,0.75,1]))
#方差
print("方差:\n", Iris2.var())
#标准差
print("标准差:\n", Iris2.std())
#变异系数
print("变异系数:\n", Iris2.mean()/Iris2.std())

 运行结果如下:

极差:
SepalLengthCm    3.6
SepalWidthCm     2.4
PetalLengthCm    5.9
PetalWidthCm     2.4
dtype: float64
分位数:
       SepalLengthCm  SepalWidthCm  PetalLengthCm  PetalWidthCm
0.00            4.3           2.0           1.00           0.1
0.25            5.1           2.8           1.60           0.3
0.50            5.8           3.0           4.35           1.3
0.75            6.4           3.3           5.10           1.8
1.00            7.9           4.4           6.90           2.5
方差:
SepalLengthCm    0.685694
SepalWidthCm     0.188004
PetalLengthCm    3.113179
PetalWidthCm     0.582414
dtype: float64
标准差:
SepalLengthCm    0.828066
SepalWidthCm     0.433594
PetalLengthCm    1.764420
PetalWidthCm     0.763161
dtype: float64
变异系数:
SepalLengthCm    7.056602
SepalWidthCm     7.043450
PetalLengthCm    2.130256
PetalWidthCm     1.570661
dtype: float64

2.1.3 偏度和峰度

偏度和峰度使用来描述数据分布特征统计量的指标。偏度也称偏态系数,是用于衡量分布的不对称程度或偏斜程度的指标,可以通过数据表的skew()方法进行计算。峰度又称为峰态系数,是用来衡量数据尾部分散度的指标直观看来峰度反映了峰部的尖度,可以通过数据表的kurtosis()方法计算。

import pandas as pd
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
Iris2 = Iris.drop(["Id","Species"],axis=1)
# #均值
# print("均值:\n", Iris2.mean())
# #中位数
# print("中位数:\n", Iris2.median())
# #众数
# print("众数:\n", Iris2.mode())
# #极差
# print("极差:\n", Iris2.max()-Iris2.min())
# #分位数
# print("分位数:\n", Iris2.quantile(q=[0,0.25,0.5,0.75,1]))
# #方差
# print("方差:\n", Iris2.var())
# #标准差
# print("标准差:\n", Iris2.std())
# #变异系数
# print("变异系数:\n", Iris2.mean()/Iris2.std())
#偏度
print("偏度:\n", Iris2.skew())
#峰度
print("峰度:\n", Iris2.kurtosis())

 运行结果如下:

偏度:
SepalLengthCm    0.314911
SepalWidthCm     0.334053
PetalLengthCm   -0.274464
PetalWidthCm    -0.104997
dtype: float64
峰度:
SepalLengthCm   -0.552064
SepalWidthCm     0.290781
PetalLengthCm   -1.401921
PetalWidthCm    -1.339754
dtype: float64

针对多个数据特征(变量),相关系数是度量数据变量之间线性相关性的指标。在二元变量的相关分析中,比较常用的是Pearson相关系数,常用于分析连续数值变量之间的关系Spearman秩相关系数和判定系数,常用于分析离散数值变量之间的关系。对于数据表的相关系数,可以使用corr()方法进行计算,通过参数method可以指定计算的相关系数类型。对于多变量之间的相关系数,可在计算出其相关系数矩阵后,使用热力图进行可视化。获得鸢尾花4个变量的相关系数热力图的程序如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
Iris2 = Iris.drop(["Id","Species"],axis=1)
#相关系数
iriscorr = Iris2.corr(method="pearson")
#使用热力图可视化
plt.figure(figsize=(8,6))
ax=sns.heatmap(iriscorr,fmt=".3f",annot=True,cmap="YlGnBu")
#y轴标签居中
ax.set_yticklabels(iriscorr.index.values,va="center")
plt.title('Iris相关系数热力图')
plt.show()

 运行结果如下:

Iris相关系数热力图

相关系数的取值范围在[-1,1]之间,如果小于0说明变量之间负相关,越接近-1,负相关性越强;大于0说明变量间正相关,越接近于1,正相关性越强。

2.1.4 单个数据变量的分布情况

对于数据的描述统计,还可以使用可视化的方法进行分析,其中单个连续变量可以使用直方图进行可视化,辅助计算得到的相关统计量对数据进行更详细的理解。针对鸢尾花数据的PetalLengthCm变量,通过下面的直方图可视化程序,可获得如下图所示的直方图。可以发现该数据的分布呈现两个峰的情况,并且每个峰的分布情况也不一样。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
Iris2 = Iris.drop(["Id","Species"],axis=1)
#数值变量直方图可视化
plt.figure(figsize=(10,6))
plt.hist(Iris2.PetalLengthCm,bins=30,color="blue")
plt.grid()
plt.xlabel('PetalLengthCm')
plt.ylabel('频数')
plt.title('直方图')
plt.show()

 运行结果如下:

 数值变量直方图

对于单个变量的离散变量,可以使用条形图进行可视化,对比每种离散值的出现情况。针对鸢尾花数据每类花的样本数据,使用条形图可视化的程序如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
Iris = pd.read_csv("E:/PYTHON/Iris.csv")
Iris2 = Iris.drop(["Id","Species"],axis=1)
#分类变量条形图可视化
plotdata = Iris.Species.value_counts()
plt.figure(figsize=(10,6))
plt.bar(x=plotdata.index.values,height=plotdata.values,color="blue")
plt.grid()
plt.xlabel('数据种类')
plt.ylabel('频数')
plt.title('条形图')
plt.show()

 运行结果如下:

 分类变量条形图

2.2 发现异常值的基本方法

在数据分析过程中,经常会遇到数据中包含异常值的情况,并且异常值的存在经常会影响数据的建模结果。针对单个变量,通常可以使用3sigma法则识别异常值,即超出均值3倍标准差的数据可被认为是异常值,也可以使用箱线图来发现异常值。

使用前文由KNN填充缺失值后的oceandfknn数据中的5个变量,分析每个变量是否存在异常值:

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.impute import KNNImputer
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
#找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#KNNImputer缺失值填充方法
knnimp = KNNImputer(n_neighbors=5)
oceandfknn = knnimp.fit_transform(oceandf)
# #获取填充后的变量
# AirTemp = oceandfknn[:,4]
# Humidity = oceandfknn[:,5]
# #可视化填充后的结果
# plt.figure(figsize=(10,6))
# plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
#             c='blue',marker='o',label='非缺失值')
# plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
#             c='red',marker='s',label='缺失值')
# plt.grid()
# plt.legend(loc='best',fontsize=12)
# plt.xlabel('AirTemp')
# plt.ylabel('Humidity')
# plt.title('KNNImputer缺失值填充方法')
# plt.show()
#使用KNN填充缺失值后的oceandfknn数据中的5个变量演示
oceandfknn5=pd.DataFrame(data=oceandfknn[:,3:8],columns=["SesSurfaceTemp","AirTemp","Humidity","UWind","VWind"])
print(oceandfknn5.head(2))

 运行结果如下:

剔除带有缺失值的行:

Int64Index: 565 entries, 0 to 735
Data columns (total 8 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Year            565 non-null    int64  
 1   Latitude        565 non-null    int64  
 2   Longitude       565 non-null    int64  
 3   SeaSurfaceTemp  565 non-null    float64
 4   AirTemp         565 non-null    float64
 5   Humidity        565 non-null    float64
 6   UWind           565 non-null    float64
 7   VWind           565 non-null    float64
dtypes: float64(5), int64(3)
memory usage: 39.7 KB
剔除带有缺失值的列:

RangeIndex: 736 entries, 0 to 735
Data columns (total 5 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Year       736 non-null    int64  
 1   Latitude   736 non-null    int64  
 2   Longitude  736 non-null    int64  
 3   UWind      736 non-null    float64
 4   VWind      736 non-null    float64
dtypes: float64(2), int64(3)
memory usage: 28.9 KB
   SesSurfaceTemp  AirTemp  Humidity  UWind  VWind
0           27.59    27.15      79.6   -6.4    5.4
1           27.55    27.02      75.8   -5.3    5.3

对于oceandfknn数据中的每个变量使用3sigma法则,计算每个变量中是否存在异常值,以及异常值的数量:

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.impute import KNNImputer
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
#找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#KNNImputer缺失值填充方法
knnimp = KNNImputer(n_neighbors=5)
oceandfknn = knnimp.fit_transform(oceandf)
# #获取填充后的变量
# AirTemp = oceandfknn[:,4]
# Humidity = oceandfknn[:,5]
# #可视化填充后的结果
# plt.figure(figsize=(10,6))
# plt.scatter(AirTemp[~nanaindex],Humidity[~nanaindex],
#             c='blue',marker='o',label='非缺失值')
# plt.scatter(AirTemp[nanaindex],Humidity[nanaindex],
#             c='red',marker='s',label='缺失值')
# plt.grid()
# plt.legend(loc='best',fontsize=12)
# plt.xlabel('AirTemp')
# plt.ylabel('Humidity')
# plt.title('KNNImputer缺失值填充方法')
# plt.show()
#使用KNN填充缺失值后的oceandfknn数据中的5个变量演示
oceandfknn5=pd.DataFrame(data=oceandfknn[:,3:8],columns=["SesSurfaceTemp","AirTemp","Humidity","UWind","VWind"])
print(oceandfknn5.head(2))
#根据3sigma法则,超出均值3倍标准差的数据可被认为是异常值
oceandfknn5mean=oceandfknn5.mean()
oceandfknn5std=oceandfknn5.std()
#计算对应的样本是否为异常值
outliers=abs(oceandfknn5-oceandfknn5mean)>3*oceandfknn5std
#计算每个变量有多少异常值
print(outliers.sum())

运行结果如下:

剔除带有缺失值的行:

Int64Index: 565 entries, 0 to 735
Data columns (total 8 columns):
 #   Column          Non-Null Count  Dtype  
---  ------          --------------  -----  
 0   Year            565 non-null    int64  
 1   Latitude        565 non-null    int64  
 2   Longitude       565 non-null    int64  
 3   SeaSurfaceTemp  565 non-null    float64
 4   AirTemp         565 non-null    float64
 5   Humidity        565 non-null    float64
 6   UWind           565 non-null    float64
 7   VWind           565 non-null    float64
dtypes: float64(5), int64(3)
memory usage: 39.7 KB
剔除带有缺失值的列:

RangeIndex: 736 entries, 0 to 735
Data columns (total 5 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   Year       736 non-null    int64  
 1   Latitude   736 non-null    int64  
 2   Longitude  736 non-null    int64  
 3   UWind      736 non-null    float64
 4   VWind      736 non-null    float64
dtypes: float64(2), int64(3)
memory usage: 28.9 KB
   SesSurfaceTemp  AirTemp  Humidity  UWind  VWind
0           27.59    27.15      79.6   -6.4    5.4
1           27.55    27.02      75.8   -5.3    5.3
SesSurfaceTemp     0
AirTemp            0
Humidity           0
UWind              6
VWind             10
dtype: int64

从输出结果发现,UWind 变量有6个异常值,VWind变量有10个异常值。针对该数据也可以使用箱线图进行可视化分析,箱线图在可视化时会使用点输出异常值的位置,因此可以判断数据中是否存在异常值。

import pandas as pd
import missingno as msno
import matplotlib.pyplot as plt
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.impute import KNNImputer
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取用于演示的数据集
oceandf = pd.read_csv('E:\PYTHON\热带大气海洋数据.csv')
#剔除带有缺失值的行
oceandf2 = oceandf.dropna(axis=0)
print('剔除带有缺失值的行:')
oceandf2.info()
#剔除带有缺失值的列
oceandf3 = oceandf.dropna(axis=1)
print('剔除带有缺失值的列:')
oceandf3.info()
#找到缺失值所在的位置
nanaindex = pd.isna(oceandf.AirTemp)|pd.isna(oceandf.Humidity)
#KNNImputer缺失值填充方法
knnimp = KNNImputer(n_neighbors=5)
oceandfknn = knnimp.fit_transform(oceandf)
#使用KNN填充缺失值后的oceandfknn数据中的5个变量演示
oceandfknn5=pd.DataFrame(data=oceandfknn[:,3:8],columns=["SesSurfaceTemp","AirTemp","Humidity","UWind","VWind"])
#使用箱线图分析数据中是否存在异常值
oceandfknn5.plot(kind="box",figsize=(10,6))
plt.title("数据集箱线图")
plt.grid()
plt.show()

运行结果如下:

 用箱线图分析数据中是否存在异常值:

从图中可以发现,Humidity变量有一个异常值,UWind和VWind变量有多个异常值。

前面两种方式是分析单个变量是否有异常值,对于两个变量,也可以使用散点图,直观地分析数据中是否有异常值。

import matplotlib.pyplot as plt
#图像显示中文设置
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#针对两个变量可以使用散点图分析数据中是否有异常值
x=[10,8,13,9,11,14,6,4,12,7,5]
y=[7.46,6.77,12.74,7.11,7.81,8.84,6.08,5.39,8.15,6.42,5.73]
#使用散点图进行可视化
plt.figure(figsize=(10,6))
plt.plot(x,y,"ro")
plt.grid()
plt.legend(loc='best',fontsize=12)
plt.xlabel('X')
plt.ylabel('Y')
plt.text(12.5,12,"异常值")
plt.show()

运行结果如下:

用散点图分析两个变量是否有异常值

从图中结果可以发现,数据中有一个点明显和其他数据点有不同的趋势,因此可以认为该数据点属于异常值。 

笔记摘自——《Python机器学习算法与实战》

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章