You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

信用风险建模:直方图数据可视化问题及优化建议求助

信用风险模型数据直方图优化建议

针对你当前直方图无法读取有效信息的问题,结合信用风险数据的特点(通常存在严重偏态、异常值),给出以下优化方案:

1. 移除无分析价值的列

case_id是唯一标识列,其直方图没有业务或统计意义,应从可视化列表中剔除:

numerical_columns = ['collater_valueofguarantee_1124L', 'collater_valueofguarantee_876L',
                     'num_group1', 'num_group2', 'pmts_month_158T', 'pmts_month_706T',
                     'pmts_year_1139T', 'pmts_year_507T']

2. 处理数据偏态与异常值

信用数据(如担保价值、还款金额)普遍右偏,直接绘制直方图会导致大部分数据压缩在左侧,可通过以下方式优化:

  • 对数转换:对大于0的数值取对数,缩小极端值影响(注意处理0或负值,可加1后转换):
    import numpy as np
    
    for column in numerical_columns:
        data = df[column].dropna()
        # 仅对正数进行转换
        if (data > 0).all():
            data = np.log1p(data)  # log(1+x)避免log(0)错误
        plt.hist(data, bins='auto')
        plt.xlabel(f'Log-transformed {column}' if (data >0).all() else column)
        plt.ylabel('Frequency')
        plt.title(f'Histogram of {column}')
        plt.show()
    
  • 截断异常值:基于分位数过滤极端值(比如保留99%以内的数据):
    for column in numerical_columns:
        data = df[column].dropna()
        # 计算99分位数
        q99 = data.quantile(0.99)
        filtered_data = data[data <= q99]
        plt.hist(filtered_data, bins=20)
        plt.xlabel(f'{column} (≤99th percentile)')
        plt.ylabel('Frequency')
        plt.title(f'Histogram of {column} (Outliers Removed)')
        plt.show()
    

3. 优化直方图参数

  • 动态调整 bins:使用bins='auto'让matplotlib自动选择最优分箱数,替代固定的20 bins:
    plt.hist(data, bins='auto')
    
  • 绘制密度直方图:用密度(而非频率)展示,便于对比不同尺度的变量:
    plt.hist(data, bins='auto', density=True)
    plt.ylabel('Density')
    

4. 使用子网格布局对比多变量

将所有直方图放在同一画布,避免逐个弹出窗口,方便快速对比分布:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2, ncols=4, figsize=(16, 8))
axes = axes.flatten()

for idx, column in enumerate(numerical_columns):
    data = df[column].dropna()
    # 可选:应用对数转换或异常值过滤
    if (data > 0).all():
        data = np.log1p(data)
    axes[idx].hist(data, bins='auto')
    axes[idx].set_xlabel(f'Log({column})' if (data>0).all() else column, fontsize=8)
    axes[idx].set_ylabel('Frequency', fontsize=8)
    axes[idx].set_title(f'{column}', fontsize=10)

plt.tight_layout()
plt.show()

5. 添加辅助统计线

在直方图上标注均值、中位数,帮助快速定位分布中心:

for column in numerical_columns:
    data = df[column].dropna()
    plt.hist(data, bins='auto', alpha=0.7)
    # 添加均值线
    plt.axvline(data.mean(), color='red', linestyle='--', label=f'Mean: {data.mean():.2f}')
    # 添加中位数线
    plt.axvline(data.median(), color='blue', linestyle='-', label=f'Median: {data.median():.2f}')
    plt.legend()
    plt.xlabel(column)
    plt.ylabel('Frequency')
    plt.title(f'Histogram of {column} with Stats')
    plt.show()

6. 补充其他可视化方式

直方图无法完全展示分布细节,可结合以下图表:

  • 箱线图:直观展示四分位数和异常值:
    plt.boxplot(df[column].dropna())
    
  • QQ图:验证数据是否符合正态分布:
    import scipy.stats as stats
    stats.probplot(df[column].dropna(), plot=plt)
    plt.show()
    

内容的提问来源于stack exchange,提问作者De Tech Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:47:57