Python学习打卡第六天实战分享

数据初步可视化

内容回顾:

  1. 单特征可视化:连续变量箱线图(还说了核密度直方图)、离散特征直方图
  2. 特征和标签关系可视化
  3. 箱线图美化—>直方图

作业:去针对其他特征绘制单特征图和特征和标签的关系图,并且试图观察出一些有意思的结论

1.数据加载和初步查看

import pandas as pd
data = pd.read_csv('data.csv')  # 从CSV文件加载数据
data.head()  # 显示数据前5行

输出的结果是:

2.1查找所有连续特征

continuous_features = []
for i in data.columns:  # 遍历所有列
    if data[i].dtype != 'object':  # 如果列的数据类型不是文本类型
        continuous_features.append(i)  # 添加到连续特征列表中
continuous_features  # 显示结果

2.2查找所有离散特征 

discrete_features = []
for col in data.columns:
    # 判断条件:类型是object(字符串)或唯一值数量较少(小于20)
    if data[col].dtype == 'object' or data[col].nunique() < 20:
        discrete_features.append(col)
discrete_features

这是第一种方法:循环判断。

实现一个路径可以有很多方法,现在还有第二种方法筛选特征(select_dtypes)以查找连续特征为例:

continuous_features = data.select_dtypes(include=['float64', 'int64']).columns.tolist()

输出的结果是一样的。

两种方法选择推荐情况:

– 简单筛选时推荐使用 select_dtypes ,更简洁高效
– 需要复杂条件判断时可以使用循环方式
– 如果数据量很大, select_dtypes 的性能优势会更明显

 3.利用matplotlib库绘制可视化数据图

第一步:导入三个常用数据分析可视化库

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

第二步:设置中文显示(防止中文字符显示不全或有莫名其妙的警告)

# 设置全局字体为支持中文的字体 (例如 SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False

 第三步:单变量可视化

以“Monthly Debt”为例,连续特征用直方图可视化

plt.figure(figsize=(10, 6))
sns.histplot(data['Monthly Debt'], bins=30, kde=True, color='steelblue')
plt.title('月负债金额分布')
plt.xlabel('月负债金额')
plt.ylabel('频数') 
plt.grid(True, linestyle='--', alpha=0.3)
plt.show()

注:

这段代码用于绘制"Monthly Debt"(月负债金额)的分布直方图,具体含义如下:

1. plt.figure(figsize=(10, 6))
   – 创建10英寸(宽)×6英寸(高)的画布
2. sns.histplot(data['Monthly Debt'], bins=30, kde=True, color='steelblue')
   – 使用seaborn绘制直方图
   – bins=30 :将数据范围分成30个等宽区间
   – kde=True :叠加核密度估计曲线(平滑的分布曲线)
   – color='steelblue' :设置直方图为钢蓝色
3. plt.title('月负债金额分布')
    – 设置图表标题为"月负债金额分布"
4. plt.xlabel('月负债金额')
    – 设置x轴标签为"月负债金额"
5. plt.ylabel('频数')
   – 设置y轴标签为"频数"(各区间内数据点的数量)
6. plt.grid(True, linestyle='–', alpha=0.3)
   – 添加网格线
   – linestyle='–' :虚线样式
   – alpha=0.3 :设置30%透明度
7. plt.show()
   – 显示图形
 

这段代码最终会输出一个包含以下元素的图表:

– 钢蓝色直方条(显示各金额区间的频数)
– 平滑的分布曲线(反映数据密度)
– 虚线网格背景
– 完整的中文标签和标题

 

以“Purpose”为例,离散特征用直方图可视化

plt.figure(figsize=(12, 6))
sns.countplot(x='Purpose', data=data, order=data['Purpose'].value_counts().index)
plt.title('贷款目的分布')
plt.xlabel('贷款目的')
plt.ylabel('数量')
plt.xticks(rotation=45)  # 旋转x轴标签防止重叠
plt.tight_layout()  # 自动调整布局
plt.show()

注:有很多参数可以调整图像,但不需要记忆,用的时候问AI即可 

4.绘制特征和标签的关系

(1)离散变量VS违约标签

①房屋所有权

plt.figure(figsize=(10,6))
sns.countplot(
    x='Home Ownership',
    hue='Credit Default',
    data=data,
    palette={0:'#4caf50', 1:'#f44336'}  # 绿色:未违约, 红色:已违约
)
plt.title('房屋所有权与信用违约关系')
plt.xlabel('房屋所有权类型')
plt.ylabel('客户数量')
plt.legend(title='违约状态', labels=['未违约', '已违约'])
plt.xticks(rotation=45)  # 如果类别名称较长可旋转标签
plt.show()

 

②当前工作年限

plt.figure(figsize=(12,6))
sns.violinplot(
    x='Years in current job',
    y='Annual Income',  # 使用年收入作为y轴
    hue='Credit Default',
    data=data,
    split=True,  # 并排显示
    palette={0:'#4caf50', 1:'#f44336'},  # 绿色:未违约, 红色:已违约
    inner='quartile'  # 显示四分位线
)
plt.title('工作年限与年收入-违约关系')
plt.xlabel('当前工作年限')
plt.ylabel('年收入')
plt.legend(title='违约状态', labels=['未违约', '已违约'])
plt.xticks(rotation=45)  # 旋转x轴标签
plt.grid(True, linestyle=':', alpha=0.3)  # 添加网格线
plt.show()

 

③开放账户数量

plt.figure(figsize=(10,6))
sns.boxenplot(
    x='Credit Default',
    y='Number of Open Accounts',
    hue='Credit Default',
    data=data,
    palette=['#4caf50', '#f44336'],
    width=0.6,
    showfliers=False,
    legend=False
)
plt.title('开放账户数量与违约关系', pad=20)
plt.xlabel('信用违约状态', labelpad=10)
plt.ylabel('开放账户数量', labelpad=10)
plt.xticks([0,1], ['未违约', '已违约'])
plt.grid(True, linestyle=':', alpha=0.3)
plt.tight_layout()
plt.show()

 

④信用问题数量

plt.figure(figsize=(10,6))
sns.boxenplot(
    x='Credit Default',
    y='Number of Credit Problems',
    hue='Credit Default',  # 添加hue参数
    data=data,
    palette=['#4caf50', '#f44336'],  # 改为列表形式
    width=0.6,
    showfliers=False,
    legend=False  # 避免重复图例
)
plt.title('信用问题数量与违约关系', pad=20)
plt.xlabel('信用违约状态', labelpad=10)
plt.ylabel('信用问题数量', labelpad=10)
plt.xticks([0,1], ['未违约', '已违约'])
plt.grid(True, linestyle=':', alpha=0.3)
plt.tight_layout()
plt.show()

(2)连续变量VS违约标签

①年收入

plt.figure(figsize=(10,6))
sns.histplot(
    x='Annual Income',
    hue='Credit Default',
    data=data,
    bins=30,
    kde=True,
    palette=['#4caf50', '#f44336'],
    alpha=0.6,
    element='step'
)
plt.title('年收入分布与违约关系', pad=20)
plt.xlabel('年收入', labelpad=10)
plt.ylabel('频数', labelpad=10)
plt.legend(title='信用状态', labels=['未违约', '已违约'])
plt.grid(True, linestyle=':', alpha=0.3)
plt.tight_layout()
plt.show()

 

②信用评分

plt.figure(figsize=(10,6))
sns.ecdfplot(
    x='Credit Score',
    hue='Credit Default',
    data=data,
    palette=['#4caf50', '#f44336']
)
plt.title('信用评分累积分布与违约关系', pad=20)
plt.xlabel('信用评分', labelpad=10)
plt.ylabel('累积比例', labelpad=10)
plt.legend(title='信用状态', labels=['未违约', '已违约'])
plt.grid(True, linestyle=':', alpha=0.3)
plt.tight_layout()
plt.show()

 

③月负债

plt.figure(figsize=(10,6))
sns.violinplot(
    x='Credit Default',
    y='Monthly Debt',
    data=data,
    inner=None,  # 不显示内部线条
    palette=['#4caf50', '#f44336'],
    width=0.7
)
sns.stripplot(
    x='Credit Default',
    y='Monthly Debt',
    data=data,
    color='black',
    alpha=0.3,
    jitter=True
)
plt.title('月负债分布与违约关系', pad=20)
plt.xlabel('信用违约状态', labelpad=10)
plt.ylabel('月负债金额', labelpad=10)
plt.xticks([0,1], ['未违约', '已违约'])
plt.grid(True, linestyle=':', alpha=0.3)
plt.tight_layout()
plt.show()

 

(3)贷款期限 

# 准备数据
term_dist = data.groupby(['Term','Credit Default']).size().unstack()

# 绘制饼图+环形图组合
plt.figure(figsize=(12,6))
plt.subplot(121)
term_dist.plot(
    kind='pie',
    subplots=True,
    autopct='%1.1f%%',
    colors=['#4caf50','#f44336'],
    startangle=90,
    wedgeprops=dict(width=0.3)  # 环形图效果
)
plt.title('贷款期限违约分布(环形图)')
plt.ylabel('')

# 单独绘制违约率饼图
plt.subplot(122)
term_dist.sum(axis=1).plot(
    kind='pie',
    autopct='%1.1f%%',
    colors=['#2196f3','#ff9800'],
    startangle=90
)
plt.title('贷款期限分布')
plt.ylabel('')
plt.tight_layout()
plt.show()

 

 

总结:选择合适的可视化图形取决于变量类型和分析目的。

– 目标是否比较分布? → 选箱线图/小提琴图
– 目标是否看比例? → 选饼图/柱状图
– 目标是否找关系? → 选散点图/热力图

今天的内容完全是大模型辅助完成的。可以说一点不会。可能有错误,再接再厉!加油!!未来的自己一定要帮忙改正啊!!!

 编程的世界没有银弹,多尝试、多踩坑才能成长。加油!!!

@浙大疏锦行

作者:xiaoheplusv8

物联沃分享整理
物联沃-IOTWORD物联网 » Python学习打卡第六天实战分享

发表回复