内容回顾:数据初步可视化
- 单特征可视化:连续变量箱线图(还说了核密度直方图)、离散特征直方图
- 特征和标签关系可视化
- 特征与特征关系可视化【箱线图美化--->直方图】
1.单特征分布可视化
找到连续特征
# 首先查看都有什么特征
import pandas as pd
data = pd.read_csv('data.csv')
data.head()
# 找到所有的连续特征(更容易理解方法)
continuous_features = [] # 创建一个空列表用于存储连续特征名
for i in data.columns: # 遍历数据框的所有列名
if data[i].dtype != 'object': # 检查当前列的数据类型是否为非对象类型
continuous_features.append(i) # 如果是非对象类型,则添加到连续特征列表
continuous_features # 返回最终的连续特征列表
#实现上述操作,更简单的方法如下,借助select_dtypes方法。(能看懂即可)
# 使用select_dtypes方法筛选float64和int64类型的列,转换为列名列表
continuous_features = data.select_dtypes(include=['float64', 'int64']).columns.tolist()
# 1. data.select_dtypes(include=['float64', 'int64']) - 选择数据类型为float64或int64的列
# 2. .columns - 获取这些列的列名Index对象
# 3. .tolist() - 将Index对象转换为Python列表
continuous_features # 输出最终的连续特征列表
初识matplotlib库
作为一个普通人,绘制一个图需要什么?
1. 需要指定图的类型,比如折线图,散点图,柱状图等
2. 需要指定图的坐标轴,比如x轴和y轴,并且传入数据
3. 需要指定图的标题,比如x轴和y轴的标签,以及标题
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
data = pd.read_csv('data.csv')
sns.boxplot(x=data['Annual Income'])
plt.title('Annual Income 的箱线图')
plt.xlabel('Annual Income')
plt.show()
# 设置全局字体为支持中文的字体 (例如 SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_csv('data.csv')
sns.boxplot(x=data['Annual Income'])
plt.title('年收入 箱线图') # 使用中文标题
plt.xlabel('年收入') # 使用中文标签
plt.show()
数值变量有的是连续变量 有的是离散变量
# 绘制直方图
sns.histplot(data['Years in current job'])
plt.title('在当前工作年限 直方图')
plt.xlabel('在当前工作年限')
plt.ylabel('员工数量')
plt.show()
# 还有很多新的参数可以调整图像 不需要记忆 用的时候问下ai即可
sns.histplot(x=data['Years in current job'])
plt.title('在当前工作年限 直方图')
plt.xlabel('在当前工作年限')
plt.ylabel('员工数量')
plt.xticks(rotation=45, ha='right') # 旋转45度,并右对齐
plt.tight_layout() # 自动调整子图参数,提供足够的空间
plt.show()
2.绘制特征和标签的关系【特征与标签关系可视化】
标签是离散的,特征如果是连续的应该绘制什么图?
可以分别考虑违约和不违约情况下的连续特征,画2个箱线图
# 另一种可视化方式:箱线图
plt.figure(figsize=(8, 6)) # 创建8x6英寸的画布
sns.boxplot(x='Credit Default', y='Annual Income', data=data)
# 绘制分组箱线图:
# x轴:'Credit Default'列(信用违约状态)
# y轴:'Annual Income'列(年收入数据)
# data参数指定数据来源
plt.title('Annual Income vs. Credit Default') # 设置图表标题
plt.xlabel('Credit Default') # 设置x轴标签 【分类变量】
plt.ylabel('Annual Income') # 设置y轴标签 【数值型变量】
plt.show() # 显示图表
# 另一种可视化方式:小提琴图
# 相较于箱线图,小提琴图更加美观
plt.figure(figsize=(8, 6))
sns.violinplot(x='Credit Default', y='Annual Income', data=data)
plt.title('Annual Income vs. Credit Default')
plt.xlabel('Credit Default')
plt.ylabel('Annual Income')
plt.show()
但是实际上连续变量也可以
# 绘制 Annual Income 和 Credit Default 的关系图
plt.figure(figsize=(8, 6))
sns.histplot(x='Annual Income', hue='Credit Default', data=data, kde=True, element="step")
plt.title('Annual Income vs. Credit Default')
plt.xlabel('Annual Income')
plt.ylabel('Count')
plt.show()
绘制类似于直方图的图像,可以用核密度估计来完成边缘的柔和化
绘制离散变量和标签的关系
# 绘制 Number of Open Accounts 和 Credit Default 的关系图
plt.figure(figsize=(8, 6))
sns.countplot(x='Number of Open Accounts', hue='Credit Default', data=data)
plt.title('Number of Open Accounts vs. Credit Default')
plt.xlabel('Number of Open Accounts')
plt.ylabel('Count')
plt.show()
可以看到 如果number of open accounts的值太多 就会很散,不美观,所以这时候采取分组的措施
# 将 "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('Number of Open Accounts (Grouped) vs. Credit Default')
plt.xlabel('Number of Open Accounts Group')
plt.ylabel('Count')
plt.show()