信用风险建模:直方图数据可视化问题及优化建议求助
信用风险模型数据直方图优化建议
针对你当前直方图无法读取有效信息的问题,结合信用风险数据的特点(通常存在严重偏态、异常值),给出以下优化方案:
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
相关产品推荐
相关产品推荐

