在数据分析的过程中,数据可视化是一个至关重要的环节,它能帮助我们更直观地理解数据的特征和规律。本文将围绕数据可视化展开,介绍如何进行单特征分布可视化、特征与标签关系可视化,并使用 matplotlib
和 seaborn
库绘制各种图表。
一、单特征分布可视化
1.1 找到连续特征
在对数据进行可视化之前,我们需要先确定哪些特征是连续特征。以下是两种查找连续特征的方法:
import pandas as pd
# 读取数据
data = pd.read_csv('data.csv')
# 方法一:使用循环判断
continuous_features = []
for i in data.columns:
if data[i].dtype != 'object':
continuous_features.append(i)
print("方法一找到的连续特征:", continuous_features)
# 方法二:使用 select_dtypes 方法
continuous_features = data.select_dtypes(include=['float64', 'int64']).columns.tolist()
print("方法二找到的连续特征:", continuous_features)
这里我们探讨了实现同一目标的两种方法。在实际项目中,如果项目较为复杂,需要考虑内存管理、运行效率、算法复杂度以及代码美观性等因素。但对于初学者来说,达到目的即可,建议使用最简单直观的方法,便于理解和阅读。
1.2 初识 matplotlib
库
matplotlib
是 Python 中常用的绘图库,使用它绘制图表通常需要指定图的类型、坐标轴以及标题等信息。下面是一个绘制箱线图的示例:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
data = pd.read_csv('data.csv')
# 设置全局字体为支持中文的字体 (例如 SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 绘制箱线图
sns.boxplot(x=data['Annual Income'])
plt.title('年收入 箱线图')
plt.xlabel('年收入')
plt.show()
在上述代码中,我们首先设置了支持中文的字体,解决了中文显示不全的问题。然后使用 seaborn
的 boxplot
函数绘制了 Annual Income
列的箱线图,并添加了标题和 x 轴标签。
1.3 绘制直方图
除了箱线图,我们还可以使用直方图来展示数据的分布情况。以下是绘制 Years in current job
列直方图的示例:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
data = pd.read_csv('data.csv')
# 设置全局字体为支持中文的字体 (例如 SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 绘制直方图
sns.histplot(data['Years in current job'])
plt.title('在当前工作年限 直方图')
plt.xlabel('在当前工作年限')
plt.ylabel('员工数量')
plt.xticks(rotation=45, ha='right') # 旋转 45 度,并右对齐
plt.tight_layout() # 自动调整子图参数,提供足够的空间
plt.show()
在这个示例中,我们使用 seaborn
的 histplot
函数绘制了直方图,并通过 plt.xticks
函数旋转了 x 轴标签,使用 plt.tight_layout
函数自动调整子图参数,使图表更加美观。
二、绘制特征和标签的关系
2.1 标签离散,特征连续的情况
当标签是离散的,特征是连续的时候,我们可以使用箱线图、小提琴图或直方图来展示它们之间的关系。以下是相关示例代码:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
data = pd.read_csv('data.csv')
# 设置全局字体为支持中文的字体 (例如 SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 绘制箱线图
plt.figure(figsize=(8, 6))
sns.boxplot(x='Credit Default', y='Annual Income', data=data)
plt.title('年收入与信用违约的关系(箱线图)')
plt.xlabel('信用违约')
plt.ylabel('年收入')
plt.show()
# 绘制小提琴图
plt.figure(figsize=(8, 6))
sns.violinplot(x='Credit Default', y='Annual Income', data=data)
plt.title('年收入与信用违约的关系(小提琴图)')
plt.xlabel('信用违约')
plt.ylabel('年收入')
plt.show()
# 绘制带核密度估计的直方图
plt.figure(figsize=(8, 6))
sns.histplot(x='Annual Income', hue='Credit Default', data=data, kde=True, element="step")
plt.title('年收入与信用违约的关系(直方图)')
plt.xlabel('年收入')
plt.ylabel('数量')
plt.show()
2.2 绘制离散变量和标签的关系
对于离散变量和标签的关系,我们可以使用计数图来展示。当离散变量的值较多时,可以进行分组处理。以下是示例代码:
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# 读取数据
data = pd.read_csv('data.csv')
# 设置全局字体为支持中文的字体 (例如 SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 绘制计数图
plt.figure(figsize=(8, 6))
sns.countplot(x='Number of Open Accounts', hue='Credit Default', data=data)
plt.title('开户数量与信用违约的关系')
plt.xlabel('开户数量')
plt.ylabel('数量')
plt.show()
# 将 "Number of Open Accounts" 分组
data['Open Accounts Group'] = pd.cut(data['Number of Open Accounts'], bins=[0, 5, 10, 15, 20, float('inf')], labels=['0 - 5', '6 - 10', '11 - 15', '16 - 20', '20+'])
# 绘制分组后的计数图
plt.figure(figsize=(10, 6))
sns.countplot(x='Open Accounts Group', hue='Credit Default', data=data)
plt.title('分组后的开户数量与信用违约的关系')
plt.xlabel('开户数量分组')
plt.ylabel('数量')
plt.show()

通过以上的可视化操作,我们可以更直观地观察数据的分布和特征与标签之间的关系。在实际数据分析中,我们可以根据数据的特点选择合适的可视化方法,从而更好地理解数据。同时,我们也应该注重从数据分布本身去认识数据,有时候不依赖复杂的模型,单纯从数据中就能发现很多有价值的信息。