7种Python可视化方法来处理多元分类数据

2025年1月5日 | 阅读8分钟

预先确定的组或类别的集合,观察结果可以属于这些组或类别,这被称为分类数据。您可以在任何地方找到分类数据。调查响应涉及诸如婚姻状况、职业、教育水平等因素。对于分类数据,可能存在一些问题需要在进行其他任务之前解决。本文将介绍处理 DataFrame 中分类数据的几种方法。现在让我们 examining 一些分类数据引起的问题以及 DataFrame 如何处理它。

如前所述,分类数据只能包含有限范围的值。

导入库

借助 Python 工具,我们可以用一行代码轻松地在 DataFrame 中管理分类数据并执行常见和复杂的运算。

  • Pandas:这个库提供了多种方法来一次性完成分析任务,并有助于将数据帧加载为二维数组格式。
  • Numpy:Numpy 数组非常快速,可以快速执行复杂的计算。
  • Matplotlib/Seaborn 包用于创建可视化辅助工具。
  • Sklearn:该模块包含许多具有预实现方法的库,用于执行各种任务,例如开发和评估模型以及准备数据。

现在数据集已准备好加载到 pandas 数据框中。

输出

 
	Fst_nme	Lst_nme	Blood_type	Mrg_status	income	device
0	Abdul	Colon	A+	married	145000	AndroidOS
1	Abdul	Pierce	B+	married	85000	MacOS
2	Desirae	Pierce	B+	MARRIED	130000	iOS
3	Shannon	Gibson	A+	married	175000	MacOS
4	Desirae	Little	B+	unmarried	130000	MacOS   

以特征和血型为例来理解成员资格限制。我们必须确认血型特征是否包含虚假信息。最初,必须创建一个包含所有可接受的血型数据的数据框。

说明

使用 Pandas 库,代码创建了一个名为 blood_type_categories 的新 DataFrame。此 DataFrame 中的血型列具有以下可能值:“A+”、“A-”、“B+”、“B-”、“AB+”、“AB-”、“O+”和“O-”。这有助于对血型相关数据进行分类或评估。

输出

 
     Blood_type
0                    A+
1                    A-
2                    B+
3                    B-
4                    AB+
5                    AB-
6                     O+
7                     O-   

现在可以使用差集技术来查找虚假值。

说明

在 main_data 数据集中,代码片段定位并分离了错误的血型。首先从 main_data 中提取不同的血型,并与 blood_type_categories 中指定的合法血型进行比较。在 main_data 中检测到但在 blood_type_categories 中未检测到的血型被归类为虚假,并保存在一个名为 bogus_blood_types 的集合中。

输出

 
{'C+', 'D-'}   

一旦识别出虚假值,就可以从数据集中删除相关行。如果存在信息,则某些情况下的值可能会被更改为其他值。但是,由于没有关于真实血型的信息,因此它们将被删除。

说明

为了删除包含错误血型的记录,您必须首先使用 isin() 检测包含虚假血型的记录,生成 bogus_records_index。然后,使用反向选择 (~bogus_records_index) 从主数据集中过滤掉这些虚假记录。最后,使用 unique() 确认清理后的数据集中每种血型都是唯一的。

输出

 
array(['A+', 'B+', 'A-', 'AB-', 'AB+', 'B-', 'O-', 'O+'], dtype=object)   

不一致类别处理

分类数据包含不一致是很常见的。检查属性,婚姻状况。让我们检查与婚姻状况相关的所有不同值。

说明

您可以使用.unique() 函数获取 main_data DataFrame 的 marriage_status 列中的所有唯一值的列表,以检查数据中的差异。这将帮助您确定任何差异,例如拼写错误、大小写差异或意外类别。

输出

 
array(['married', 'MARRIED', ' married', 'unmarried ', 'divorced',
       'unmarried', 'UNMARRIED', 'separated'], dtype=object)   

大写字母、前导和尾随空格以及其他格式元素的使用清楚地表明某些类别是多余的。让我们从讨论大写字母开始。

说明

使用 str.lower() 函数,此副本的 marriage_status 列从大写转换为小写,保持了统一性。最后,为了确认修改,unique() 函数显示了 marriage_status 列的唯一值。

输出

 
array(['married', ' married', 'unmarried ', 'divorced', 'unmarried',
       'separated'], dtype=object)   

接下来,我们将处理前导和尾随空格。

说明

inconsistent_data DataFrame 的 'marriage_status' 列包含需要清理和标准化的值。这是通过代码完成的。使用 str.strip() 函数,它删除了 'marriage_status' 列中每个元素的任何前导或尾随空格。最后,它通过检索和显示 'marriage_status' 列中的唯一值来验证清理后的数据。

输出

 
array(['married', 'unmarried', 'divorced', 'separated'], dtype=object)   

处理类别重映射

可以将数值数据(如年龄或财富)映射到多个类别。这有助于更深入地了解数据集。现在让我们研究 income 特征。

说明

提供的代码片段计算并输出数据集的收入范围。它从 main_data DataFrame 的 'income' 列中获取值,以获得最高和最低收入。可以使用 max() 方法找到最高收入,而可以使用 min() 函数找到最低收入。最后,将结果转换为字符串并打印出来,显示最高和最低收入金额。

输出

 
Max income - 190000, Min income - 40000   

现在让我们构建 income 特征的范围和标签。这是通过使用 pandas cut 函数完成的。

说明

我们在上面的代码中构建了收入范围并为它们命名,以便可以对数据进行分组。虽然标签提供了每个类别的名称,但范围变量定义了收入边界。您可以使用 pd.cut() 向 remapping_data DataFrame 添加一个名为“income_groups”的新列。此列将根据每个项目的收入将其分类到指定组之一。最终,通过 remapping_data.head() 显示了修改后的 DataFrame 的初始行。

输出

 
	Fst_nme	Lst_nme	Blood_type	Mrg_status	income	device	income_groups						
0	Abdul	Colon	A+	married	145000	AndroidOS		125k-150k						
1	Abdul	Pierce	B+	married	85000	MacOS		75k-100k						
2	Desirae	Pierce¬¬¬	B+	MARRIED	130000	iOS		125k-150k						
3	Shannon	Gibson	A+	married	175000	MacOS		150k+						
4	Desirae	Little	B+	unmarried	130000	MacOS		125k-150k	   

现在分布很容易可视化。

说明

remapping_data['income_groups'].count_value().plot.bar() 代码片段。为了查看 remapping_data DataFrame 中不同收入类别的分布,生成一个条形图。value_counts() 函数计算 income_groups 列的唯一值,plot.bar() 使用这些计数来创建条形图。这有助于理解每种数据集收入组类型的频率。

输出

Visualizations with Python to Handle Multivariate Categorical Data

在 Python 中清理分类数据

电话号码是为更好地理解此问题而创建的新数据框的唯一特征。

说明

这段代码会生成一个包含 100 个随机电话号码的列表,这些号码可能有九位或十位数字。国家代码“+91”会被附加到所有替代电话号码。在将这些电话号码保存到具有名为“phone_numbers”的单个列的 pandas DataFrame 中后,使用 head() 显示 DataFrame 的前几行。

输出

 
       phone_numbers
0     +91 707631849
1            6315742874
2     +91 1584173083
3             3389343099
4      +91 3970692379   

可以根据用例添加或删除号码之前的代码。同样,应该删除少于十位数字的电话号码。

说明

在处理电话号码之前,代码会删除“+91”前缀。之后,它识别出少于十位数字的电话号码并将其删除。然后删除任何剩余的包含缺失值的行。最后,它显示了清理后的 phone_numbers_data DataFrame 的前几行。

输出

 
         phone_numbers
0         5377617628
2         7152234401
3         2839400071
4         7651215019
5         4451571165   

最后,我们能够确认数据的清洁度。

Python Pandas:分类数据可视化

为了更深入地了解数据,可以使用各种图表来可视化分类数据。现在让我们看看每个血型有多少人。为此,我们将使用 Seaborn 库。

输出

Visualizations with Python to Handle Multivariate Categorical Data
 

输出

Visualizations with Python to Handle Multivariate Categorical Data

在 Python 中编码分类数据

数字是许多学习算法(如神经网络和回归)的必要输入。为了使这些算法正常工作,必须将分类数据转换为数值。让我们 examining 一些编码技术。

Python 标签编码

我们可以将类别编号从 0 到 num_categories - 1 使用标签编码。让我们使用血型特征来实现标签编码。

说明

代码片段使用 sklearn.preprocessing 包中的 LabelEncoder 将分类血型数据转换为数值形式。without_bogus_records DataFrame 的 blood_type 列的分类数据使用 fit_transform 函数转换为编码整数。为了显示 blood_type 列中的唯一编码值以及各种血型的唯一数值表示,最后使用.unique() 函数。

输出

 
array([0, 4, 1, 3, 2, 5, 7, 6])   

Python 中的独热编码

独热编码解决了标签编码的一些缺点。

Python 中的序数编码

序数数据是一种类别数据,其中顺序很重要。对于此类特征,我们也希望在编码后保留顺序。我们将使用序数编码来加密收入组。我们的目标是保持顺序,例如 40K-75K < 75K-100K < 100K-125K < 125K-150K < 150K+

说明

这一行代码创建了一个名为 custom_map 的自定义映射字典,并将 income_groups 列的收入范围分配整数值。然后使用 map 方法根据此映射转换 remapping_data DataFrame 中的 'income_groups' 列。每个收入范围字符串都将被替换为字典中与其对应的整数值。最后,它使用 head 函数显示更新 DataFrame 前几行的更改。

输出

 
	Fst_nme	Lst_nme	Blood_type	Mrg_status	income	device	incm_grp
0	Abdul	Colon	A+	married	145000	AndroidOS	4
1	Abdul	Pierce	B+	married	85000	MacOS	3
2	Desirae	Pierce	B+	MARRIED	130000	iOS	4
3	Shannon	Gibson	A+	married	175000	MacOS	5
4	Desirae	Little	B+	unmarried	130000	MacOS	4