信貸特征分析可視化函數(外置指標面板完整版)

XY的基礎處理

target_column=['SeriousDlqin2yrs']
feature_columns=['RevolvingUtilizationOfUnsecuredLines', 'age','NumberOfTime30-59DaysPastDueNotWorse', 'DebtRatio', 'MonthlyIncome','NumberOfOpenCreditLinesAndLoans', 'NumberOfTimes90DaysLate','NumberRealEstateLoansOrLines', 'NumberOfTime60-89DaysPastDueNotWorse','NumberOfDependents']
x_list=feature_columnsimport pandas as pd
df = pd.read_csv("cs-training.csv")
features=x_list
for i in x_list:df[i]=df[i].astype(float)
for i in target_column:df[i]=df[i].astype(float)import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
features = x_list
iv_values = []
df['Y']=df['SeriousDlqin2yrs']

第二步,我們封裝一個計算KS的函數


def calculate_ks(y_true, y_score):# 根據評分排序df = pd.DataFrame({'y': y_true, 'score': y_score})df = df.sort_values('score', ascending=False).reset_index(drop=True)# 計算累積分布df['cum_total'] = np.arange(1, len(df)+1) / len(df)df['cum_bad'] = df['y'].cumsum() / df['y'].sum()df['cum_good'] = (1 - df['y']).cumsum() / (len(df) - df['y'].sum())# 計算KS值ks = (df['cum_bad'] - df['cum_good']).abs().max()return ks

第三步,我們定義 plot_feature_analysis信貸特征分析可視化函數(外置指標面板完整版)


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score, roc_curvedef plot_feature_analysis(df, features, Y, n_bins=10, figsize=(20, 100)):"""參數:df : DataFrame 包含特征和目標變量的數據集features : list 需要分析的特征列表Y : str 目標變量名稱n_bins : int分箱數量 (默認10)figsize : tuple畫布尺寸 (寬, 高)"""# 動態計算布局n_features = len(features)fig, axes = plt.subplots(n_features, 1, figsize=figsize, constrained_layout=False, squeeze=False)# 調整畫布右側空間fig.subplots_adjust(right=0.7)  # 為指標面板騰出30%空間# 全局樣式設置plt.rcParams.update({'font.sans-serif': 'SimHei','axes.unicode_minus': False,'axes.titlesize': 20,'axes.titlepad': 20,'figure.dpi': 400})# 遍歷所有特征for idx, (feature, ax) in enumerate(zip(features, axes.flat)):ax2 = ax.twinx()  # 創建副坐標軸try:# === 數據清洗 ===df_clean = df[[feature, Y]].dropna()coverage = len(df_clean) / len(df)y = df_clean[Y]overall_bad_rate = y.mean()# === 動態分箱處理 ===ser = df_clean[feature]try:# 使用qcut并處理空箱bins = pd.qcut(ser, q=n_bins, duplicates='drop')bin_categories = bins.cat.categoriesexcept Exception as e:# 數值型變量分箱失敗時改用等距分箱bins = pd.cut(ser, bins=n_bins, include_lowest=True)bin_categories = bins.cat.categories# === 生成分箱標簽 ===bin_labels = []for interval in bin_categories:if pd.isnull(interval):bin_labels.append('Missing')else:left = round(interval.left, 2)right = round(interval.right, 2)bin_labels.append(f"{left}-{right}")# === 分箱統計 ===grouped = (df_clean.assign(bin=bins).groupby('bin', observed=False).agg(count=(Y, 'count'),bad=(Y, 'sum')).reindex(bin_categories)  # 確保包含所有分箱.fillna({'count':0, 'bad':0}).assign(bad_rate = lambda x: x['bad']/x['count'].replace(0, np.nan),lift = lambda x: x['bad_rate']/overall_bad_rate).reset_index()).fillna(0)# === 繪制柱狀圖 ===bars = ax.bar(bin_labels, grouped['count'], width=0.8,alpha=0.7,color='#1f77b4',label='樣本量')# === 繪制折線圖 ===line = ax2.plot(bin_labels, grouped['bad_rate'], color='#d62728',marker='o',markersize=20,linewidth=3,linestyle='--',label='逾期率')# === 添加數值標注 ===for i, (rect, br, lift, count, bad) in enumerate(zip(bars, grouped['bad_rate'], grouped['lift'],grouped['count'],grouped['bad'])):# 樣本量標注ax.text(rect.get_x() + rect.get_width()/2, rect.get_height() * 0.6, f"All: {count:,}\nBad: {bad:,}",ha='center', va='center',color='white', fontsize=13,fontweight='bold',linespacing=1.2)# 逾期率標注ax2.text(rect.get_x() + rect.get_width()/2, br + 0.005, f'{br:.2%}',ha='center', va='bottom',color='#d62728',fontsize=18, fontweight='bold')# Lift值標注ax.text(rect.get_x() + rect.get_width()/2, rect.get_height() * 0.95,f'Lift: {lift:.2f}',ha='center', va='top',color='#FFFF00',fontsize=15,fontweight='bold')# === 計算模型指標 ===#y_score = grouped['bad_rate'].iloc[pd.factorize(bins)[0]].values#auc = roc_auc_score(y, y_score)#fpr, tpr, _ = roc_curve(y, y_score)#ks = (tpr - fpr).max()y_score = grouped['bad_rate'].iloc[pd.factorize(bins)[0]].values  # 使用分箱壞樣本率作為評分auc = roc_auc_score(y, y_score)# auc=max(auc,1-auc)ks = calculate_ks(y, y_score)fpr, tpr, _ = roc_curve(y, y_score)# === 設置坐標軸 ===ax.set_ylabel('樣本量', color='#1f77b4', fontsize=20)ax2.set_ylabel('逾期率', color='#d62728', fontsize=20)ax.tick_params(axis='y', colors='#1f77b4', labelsize=14)ax2.tick_params(axis='y', colors='#d62728', labelsize=14)# === 設置X軸 ===ax.set_xticks(range(len(bin_labels)))ax.set_xticklabels(bin_labels,rotation=45,ha='right',fontsize=16)# === 添加外部指標面板 === # 獲取坐標位置(figure坐標系)ax_bbox = ax.get_position()panel_x = ax_bbox.x1 + 0.03  # 右側偏移3%panel_y = ax_bbox.y0 + ax_bbox.height*0.6  # 垂直居中偏上# 在figure層面添加文本fig.text(x=panel_x,y=panel_y,s=f"特征分析指標\n━━━━━━━━━━━━\n"f"特征名稱: {feature}\n"f"分箱數量: {len(bin_labels)}\n"f"特征覆蓋率: {coverage:.2%}\n"f"AUC: {auc:.3f}\n"f"KS值: {ks:.3f}\n"f"全局逾期率: {overall_bad_rate:.2%}",fontsize=15,linespacing=1.8,va='top',ha='left',fontfamily='SimHei',bbox=dict(boxstyle='round',facecolor='#f8f9fa',edgecolor='#ced4da',alpha=0.95,pad=0.8))# === 網格線設置 ===ax.grid(True, axis='y', linestyle=':', alpha=0.7)ax2.grid(True, axis='y', linestyle=':', alpha=0.3)except Exception as e:print(f"特征 {feature} 分析失敗: {str(e)}")ax.set_visible(False)ax2.set_visible(False)

第四步,使用示例


if __name__ == "__main__":# 執行分析,以上代碼都是在個人電腦基于開源數據編譯成功plot_feature_analysis(df,features,Y='Y',n_bins=8,figsize=(22, 80))plt.show()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83248.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ESP32-idf學習(三)esp32C3連接iot

一、前言 上一篇用藍牙作為通信方式,雖然勉強完成了控制,但結果顯然不是那么符合我們的預期,既然用藍牙還需要研究一段時間,那我們就先整一些現成的,不需要研究的!iot云平臺!這里當然也是通過w…

Axure RP11安裝、激活、漢化

一:注冊碼 Axure RP11.0.0.4122在2025-5-29日親測有效: 49bb9513c40444b9bcc3ce49a7a022f9

高光譜成像相機:基于高光譜成像技術的玉米種子純度檢測研究

種子純度是衡量種子質量的核心指標之一,直接影響農作物產量與品質。傳統檢測方法(如形態學觀察、生化分析)存在耗時長、破壞樣本、依賴人工等缺陷。近年來,高光譜成像技術因其融合光譜與圖像信息的優勢,成為無損檢測領…

Excel 中的TEXTJOIN用法(基礎版),將Excel 多個單元格內容按條件合并到一個單元格

1.新建一張數據透視表 選擇你需要的維度所在的列 2.點擊確定生成,勾選右邊的維度 3.選中單元格,通過 ShiftF3 查看函數參數 第一個參數:分隔符,用來分隔合并的文本,不需要分隔用"" 第二個參數:…

2025.05.28【Choropleth】群體進化學專用圖:區域數據可視化

Load geospatial data Start by loading your geospatial data in R, and build a basic plot. Data from the package The cartography comes with a set of geospatial data included. Learn how to use it to build a choropleth map. 文章目錄 Load geospatial dataData …

QT-Creator安裝教程(windows)

目錄 1,下載 1.1 鏡像源下載 1.2 運行下載的exe文件 1.2.1 QT5 版本安裝 1.2.2 QT6 版本安裝 1.2.3 如何在安裝完成之后,繼續添加擴展包 1,下載 1.1 鏡像源下載 地址:Index of /qtproject/

Deepin 23.10安裝Docker

個人博客地址:Deepin 23.10安裝Docker | 一張假鈔的真實世界 Deepin 是基于 Debian 的國產 Linux 發行版,安裝 Docker Desktop 可能會遇到兼容性問題,因為 Docker Desktop 官方主要支持 Ubuntu/Debian/Red Hat/Fedora/Arch 等主流發行版&…

ARXML解析與可視化工具

隨著汽車電子行業的快速發展,AUTOSAR標準在車輛軟件架構中發揮著越來越重要的作用。然而,傳統的ARXML文件處理工具往往存在高昂的許可費用、封閉的數據格式和復雜的使用門檻等問題。本文介紹一種基于TXT格式輸出的ARXML解析方案,為開發團隊提供了一個高效的替代解決方案。 …

2026-2030工業發展解讀系列:PLM/PDM系統解析報告(預覽版)

1 PLM系統的核心價值與功能定位 PLM是一種貫穿產品全生命周期的戰略性數字化工具,覆蓋從概念設計、研發、生產到退市的全流程管理。 PLM系統功能模塊包含數據管理、流程協同、項目管控等核心,支持從三維設計到生產制造的全鏈條數字化協同。 1.1數據管…

Go語言中的rune和byte類型詳解

1. rune類型 1.1. 基本概念 1. rune是Go語言的內建類型,它是int32的別名,即32位有符號整數; 2. 用于表示一個Unicode碼點,全拼Unicode code point; 3. 可以表示任何UTF-8編碼的字符; 1.2. 特點 1. 每…

【中國?珠海】2025 物聯網與邊緣計算國際研討會(IoTEC2025)盛大來襲!

2025 物聯網與邊緣計算國際研討會(IoTEC2025)盛大來襲! 科技浪潮奔涌向前,物聯網與邊緣計算已成為驅動各行業變革的核心力量。在此背景下,2025 物聯網與邊緣計算國際研討會(IoTEC2025)即將震撼…

Photoshop使用鋼筆繪制圖形

1、繪制臉部路徑 選擇鋼筆工具,再選擇“路徑”。 基于兩個點繪制一個彎曲的曲線 使用Alt鍵移動單個點,該點決定了后續的曲線方向 繼續繪制第3個點 最后一個點首尾是同一個點,使用鋼筆保證是閉合回路。 以同樣的方式繪制2個眼睛外框。 使用橢…

# 使用 Selenium 爬取蘇寧易購優質評價

使用 Selenium 爬取蘇寧易購優質評價 在數據挖掘和網絡爬蟲領域,Selenium 是一個強大的工具,尤其適合處理動態網頁內容。本文將通過一個實際案例,展示如何使用 Selenium 爬取蘇寧易購上的優質評價,并將這些評價保存到本地文件中。…

Windows上用FFmpeg推流及拉流的流程概覽

1. 視頻采集與推流(Windows FFmpeg) 采集設備:Windows上的攝像頭,比如“Integrated Camera”。 采集方式:FFmpeg通過 dshow 設備接口讀取攝像頭。 推流協議:你可以選擇推到 RTMP 或 RTSP 服務器。 推流…

研華工控機安裝Windows10系統,適用UEFI(GPT)格式安裝

主要硬件 主板:AIMB-787 、CPU:i5-6500 U盤啟動工具:通過網盤分享的文件:rufus-3.20.zip 鏈接: https://pan.baidu.com/s/1YlFfd-_EhFHCG4sEHBQ8dQ?pwdQT12 提取碼: QT12 Win10 22H2 Pro 純凈版系統:通過網盤分享…

什么是數字化轉型,如何系統性重構業務邏輯

“數字化轉型不是把原來的流程搬到系統里,而是用數據和技術重新定義業務邏輯,提升決策速度、客戶體驗和組織效率。” 光這一句話,其實就夠用了。 真懂的人,一聽這話就點頭;不懂的人,只覺得聽起來挺高級。…

windows安裝啟動elasticsearch

elasticsearch下載地址: https://www.elastic.co/downloads/past-releases#elasticsearch 1 Elasticsearch 的 Java 要求(Elasticsearch版本選擇): Elasticsearch 7.0~8.x 支持 Java 11(LTS)。Elasticsea…

thc-ssl-dos:SSL 壓力測試的輕量級工具!全參數詳細教程!Kali Linux教程!

簡介 THC-SSL-DOS 是一款用于驗證 SSL 性能的工具。 建立安全的 SSL 連接需要服務器比客戶端高 15 倍的處理能力。 THC-SSL-DOS 利用這種不對稱特性,通過使服務器過載并使其斷網。 此問題影響當今所有 SSL 實現。供應商自 2003 年以來就已意識到這個問題&#x…

comfyui利用 SkyReels-V2直接生成長視頻本地部署問題總結 1

在通過桌面版comfyUI 安裝ComfyUI-WanVideoWrapper 進行SkyReels-V2 生成長視頻的過程中,出現了,很多錯誤。 總結一下,讓大家少走點彎路 下面是基于搜索結果的 ComfyUI 本地部署 SkyReels-V2 實現長視頻生成的完整指南,涵蓋環境配…

廣告攔截器:全方位攔截,暢享無廣告體驗

在數字時代,廣告無處不在。無論是瀏覽網頁、使用社交媒體,還是觀看視頻,廣告的頻繁彈出常常打斷我們的體驗,讓人不勝其煩。更令人擔憂的是,一些廣告可能包含惡意軟件,威脅我們的設備安全和個人隱私。AdGuar…