机器学习(5)——数据探索与可视化(1)
时间:2023-09-09 20:07:02
目录
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多变量缺失值填充
Iterativelmputer是sklearn库中提供的一种缺失值填充方式,该方法会考虑数据在高位空间中的整体分布情况,然后对有缺失值的样本进行填充。
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机器学习算法与实战》