注:部分代码需要安装合适版本的库,版本不同可能函数用法稍有不同,交给GPT就行。
参考鸢尾花丛书,链接如下:
参考书籍及源代码链接https://github.com/Visualize-ML
博客是选出自己感觉用的到的精炼部分和自己的理解,算是笔记,科研时参考方便!!
一、写在前面
在数据分析和机器学习任务中,处理缺失值是一个常见且重要的步骤。缺失值可以根据其产生的原因和与数据中其他变量的关系被分为三种主要类型:完全随机缺失值、随机缺失值、非随机缺失值。
- 完全随机缺失值(MCAR): - 在MCAR的情况下,缺失值的发生是完全随机的,不依赖于数据中的任何变量,包括缺失值本身。换句话说,缺失与否与数据中的观测值无关,仅仅是出于随机或偶然的原因。- 例如,在一个调查中,受访者是否回答某个问题可能仅仅是因为他们忘记了或者当时不方便回答,这种缺失与他们的其他回答或特征无关。- 处理MCAR缺失值相对简单,因为可以使用多种插补方法(如均值插补、中位数插补、众数插补、多重插补等)来填补缺失值,这些方法通常不会产生显著的偏差。
- 随机缺失值(MAR): - 在MAR的情况下,缺失值的发生依赖于数据中的其他观测值,但与缺失值本身无关。即,缺失的模式可以通过数据中的其他变量来预测。- 例如,在医疗数据中,高收入群体可能更倾向于完成健康调查,因为他们可能拥有更好的医疗资源或更高的健康意识。这里的缺失(未完成的调查)与收入水平有关,但与缺失值本身(如未报告的血压值)无关。- 处理MAR缺失值时,需要更加谨慎,因为简单的插补方法(如均值插补)可能会引入偏差。多重插补等更复杂的方法在这种情况下更为适用。
- 非随机缺失值(MNAR)或非信息缺失(NMAR): - 在MNAR或NMAR的情况下,缺失值的发生不仅依赖于数据中的其他观测值,还依赖于缺失值本身。即,缺失的模式直接由缺失值本身的性质决定。- 例如,在一份关于收入水平的调查中,高收入者可能更倾向于不报告他们的确切收入,因为他们担心隐私泄露或税务问题。这里的缺失(未报告的收入)与缺失值本身(高收入)直接相关。- 处理MNAR缺失值非常具有挑战性,因为缺失值的发生与缺失值本身的性质紧密相关,这使得任何基于观测数据的插补方法都可能产生偏差。在这种情况下,可能需要依赖模型假设、专家知识或额外的数据来估计缺失值。
NaN(not a number)常用于表示缺失值,numpy.nan是一个可以产生缺失值的函数(例如df['列名'] = np.nan。一些numpy函数遇到NaN会报错、有的函数则会忽略NaN值。
二、缺失值可视化
1、生成含随机缺失值的数据集
鸢尾花数据集为例,4个特征;3个类别0、1、2;150个样本,数据head如下:
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
# 加载iris数据集
iris = load_iris()
# 将数据(特征)和目标变量转换为Pandas DataFrame
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = pd.Series(iris.target, name='species')
X.head()
完整样本成对特征分析图如下,共150个数据点:
引入随机缺失值NaN:
X_NaN = X.copy()
#生成一个与 X_NaN 相同形状的随机矩阵,数值满足 0 到 1 之间均匀分布。
mask = np.random.uniform(0,1,size = X_NaN.shape)
#将小于等于 0.4 的元素设为 True,形成一个与 X_NaN 相同形状的布尔矩阵,用作 mask
mask = (mask <= 0.4)
#将X_NaN 中对应 True 位置的元素设置为缺失值 NaN
X_NaN[mask] = np.NaN
print(X_NaN.tail)
引入随机缺失值后的数据成对特征图可视化:
iris_df_NaN = X_NaN.copy()
iris_df_NaN['species'] = y
sns.pairplot(iris_df_NaN, hue='species', palette = "Set1")
2、缺失值位置可视化
①查找缺失值并heatmap可视化
黑条代表缺失值(True)
# 用isna()方法查找缺失值
is_NaN = iris_df_NaN.isna() #为了准确获取缺失值位置、数量等信息,对于 Pandas 数据帧数据可以采用 isna() 或 notna() 方法。
print(is_NaN) #数据缺失的话,为 True;否则,为False
fig, ax = plt.subplots()
sns.heatmap(is_NaN,
ax = ax,
cmap='gray_r',
cbar=False)
#'gray_r' 是一种反向的灰度配色方案,其中较高的值显示为较亮的灰色.coolwarm、viridis、RdBu_r、cubehelix等
②查找非缺失值并heatmap可视化
黑条代表非缺失值(True)
not_NaN = iris_df_NaN.notna() #与上一个函数相反
# sum_rows = not_NaN.sum(axis=1)
print(not_NaN)
fig, ax = plt.subplots()
ax = sns.heatmap(not_NaN,
cmap='gray_r',
cbar=False)
③missingno热图+每行非缺失值数量变化曲线
黑条代表非缺失值(True),白带为缺失值,曲线是每行非缺失值的数量。
import missingno as msno
# missingno has to be installed first
# pip install missingno
msno.matrix(iris_df_NaN)
plt.show()
补充知识:
seaborn的调色板大致可以分为几类:定性调色板(用于分类数据)、顺序调色板(用于有序数据)和发散调色板(用于表示数据从中心值的变化)。以下是一些常用的内置调色板示例:
- 定性:
"deep"
,"muted"
,"pastel"
,"bright"
,"dark"
,"colorblind"
,"Set1"
,"Set2"
,"Set3"
, 等等。 - 顺序:
"viridis"
,"plasma"
,"inferno"
,"magma"
,"cividis"
,"coolwarm"
,"Blues"
,"Greens"
, 等等。 - 发散:
"PuOr"
,"BrBG"
,"RdGy"
,"PiYG"
, 等等。
三、统计缺失值信息
对于panda数据帧,info()函数可统计数据非缺失值数量和数据类型。
# 每列非缺失值数量信息
X_NaN.info()
#每列缺失值数量信息
print("\nCount total NaN at each column:\n",
X_NaN.isnull().sum()) #每列缺失值数量
print("\nPercentage of NaN at each column:\n",
X_NaN.isnull().sum()/len(X_NaN)*100) #计算每列缺失值的百分比
下期将会继续探讨缺失值的处理方法,涵盖代数/统计/机器学习算法补全数据缺失值!!
一定不要错过,喜欢的话欢迎订阅该专栏!!
版权归原作者 柯宝最帅 所有, 如有侵权,请联系我们删除。