1 .Thủ tục binning tự động trong R với bộ dữ liệu HMEQ
1.1 .Chuẩn bị các packages cơ bản
Để binning trong R trước hết cần 2 gói dữ liệu sau:
- smbinning
- plyr
Để cài đặt các gói này, sử dụng câu lệnh sau:
install.packages("plyr")
install.packages("smbinning")
Sau đó cần gọi các gói câu lệnh này ra
library(plyr)
library(smbinning)
library(tcltk)
1.2 .Nhập dữ liệu từ SAS vào R
Trong ví dụ này, bộ dữ liệu được sử dụng là bộ dữ liệu “hmeq” được cung cấp miễn phí trên trang web http://www.creditriskanalytics.net/datasets.html . Câu lệnh dưới đây sẽ được sử dụng để nhập dữ liệu vào R từ file dữ liệu dạng SAS.
library(haven)
datahmeq <- read_sas("C:/SASdata/hmeq.sas7bdat")
hmeq <- data.frame(datahmeq)
1.3 .Xác định các biến liên tục để bin
Để xem đặc tính của các biến có mặt trong bộ dữ liệu sử dụng câu lệnh
str(hmeq)
Khi đó, kiểm tra kết quả, phát hiện xem những biến nào có thể bin được. Các biến bin được phải là dạng biến liên tục hoặc biến phân loại. Trong R, biến liên tục được dịnh dạng là num, biến phân loại được định dạng kiểu factor. Ngoài ra, để kiểm tra xem biến nào thực sự tốt và có thể dùng bin được, sử dụng lệnh smbinning trong R để phần mềm tự động bin tất cả các biến và đưa ra tổng IV của từng biến, chỉ chọn các biến có tổng IV lớn hơn 0.1 là chấp nhận được hoặc lớn hơn 0.3 là tốt. Câu lệnh để tính tổng IV sau bin tự động của tất cả các biến như sau
sumiv = smbinning.sumiv(df=hmeq,y="BAD")
Char | IV | Process | |
---|---|---|---|
12 | DEBTINC | 1.9110 | Numeric binning OK |
8 | DELINQ | 0.5653 | Numeric binning OK |
3 | VALUE | 0.4411 | Numeric binning OK |
7 | DEROG | 0.3472 | Numeric binning OK |
9 | CLAGE | 0.2454 | Numeric binning OK |
10 | NINQ | 0.1710 | Numeric binning OK |
1 | LOAN | 0.1321 | Numeric binning OK |
6 | YOJ | 0.0529 | Numeric binning OK |
2 | MORTDUE | 0.0423 | Numeric binning OK |
4 | REASON | NA | Not numeric nor factor |
5 | JOB | NA | Not numeric nor factor |
11 | CLNO | NA | No significant splits |
Theo thứ tự ở trên có thể thấy, các biến có thể dùng để bin bao gồm “DEBTINC”, “DELINQ”, “VALUE”, “DEROG”, “CLAGE”, “NINQ”, “LOAN”. Để tạo list các biến này sử dụng câu lệnh sau:
numlist = c("DEBTINC","DELINQ","VALUE","DEROG","CLAGE","NINQ","LOAN")
1.4 .Binning dữ liệu tự động với các biến đã chọn
Để binning dữ liệu tự động trong R với danh sách các biến ở trên, sử dụng đoạn code sau:
for(i in 1:length(numlist)) {
# Binning HEMQ và lưu thành temp theo biến ở vị trí i trong numlist
temp <- smbinning(df=hmeq,y="BAD",x=numlist[i],p=0.05)
# Tạo temp2 chỉ lưu cutpoint và WoE của nhóm bin
temp2 = data.frame(temp$ivtable$Cutpoint,temp$ivtable$WoE)
# Rename tên biến trong temp2, câu lệnh paste dùng để ghép từ
temp2 = rename(temp2,c("temp.ivtable.Cutpoint" = paste("g",numlist[i], sep=""), "temp.ivtable.WoE" = paste("woe",numlist[i],sep = "")))
# Bỏ quan sát cuối của temp2
temp2 = temp2[-c(nrow(temp2)),]
# Thêm biến recode cho nhóm bin, id = 1,2,3,..
temp2 = data.frame(temp2, id = as.numeric(temp2[,1]))
temp2$id[id = nrow(temp2)] = 0
temp2$id = temp2$id + 1
# Gán tên woe+tênbiến cho temp2
assign(paste("woe",numlist[i],sep = ""),temp2)
# Tạo biến nhóm bin trong dữ liệu hmeq gốc
hmeq=smbinning.gen(hmeq, temp, chrname = "bingroup" )
# Tạo biến recode cho biến bingroup
hmeq = data.frame(hmeq, id = as.numeric(hmeq$bingroup))
# Ghép hai file hmeq và temp2 để nối woe
hmeq = merge(hmeq,temp2,by ="id" )
# Bỏ biến bingroup và id
hmeq = subset(hmeq, select = - bingroup)
hmeq = subset(hmeq, select = - id)
# Bỏ file temp và temp2
rm(temp,temp2)
}
1.5 .Xuất dữ liệu ra file SAS
Khi xuất dữ liệu từ R ra file SAS. R sẽ tạo một file txt cho dữ liệu và một file SAS để import dữ liệu. Lưu ý, khi chạy file SAS để import dữ liệu nên sửa lại library cho phù hợp. Code để export dữ liệu ra file SAS như sau:
library(foreign)
write.foreign(hmeq, "c:/SASdata/hmeqbin.txt", "c:/SASdata/hmeqbin.sas", package="SAS")
Sau đó, mở file SASeditor vừa export sửa lại code cho phù hợp. File mẫu:
* Written by R;
* write.foreign(hmeq, "c:/SASdata/hmeqbin.txt", "c:/SASdata/hmeqbin.sas", ;
LIBNAME DATA "C:\SASdata";
RUN;
PROC FORMAT;
value gDEBTINC
1 = "<= 42.3189"
2 = "> 42.3189"
3 = "Missing"
4 = "Total"
;
value gDELINQ
1 = "<= 0"
2 = "<= 1"
3 = "> 1"
4 = "Missing"
5 = "Total"
;
value gVALUE
1 = "<= 47471"
2 = "> 47471"
3 = "Missing"
4 = "Total"
;
value gDEROG
1 = "<= 0"
2 = "> 0"
3 = "Missing"
4 = "Total"
;
value gCLAGE
1 = "<= 172.5516"
2 = "<= 240.4667"
3 = "<= 71.2308"
4 = "> 240.4667"
5 = "Missing"
6 = "Total"
;
value gNINQ
1 = "<= 0"
2 = "<= 1"
3 = "<= 3"
4 = "> 3"
5 = "Missing"
6 = "Total"
;
value gLOAN
1 = "<= 6000"
2 = "> 6000"
3 = "Missing"
4 = "Total"
;
DATA DATA.hmeqbin ;
LENGTH
REASON $ 7
JOB $ 7
;
INFILE "c:/SASdata/hmeqbin.txt"
DSD
LRECL= 160 ;
INPUT
BAD
LOAN
MORTDUE
VALUE
REASON
JOB
YOJ
DEROG
DELINQ
CLAGE
NINQ
CLNO
DEBTINC
gDEBTINC
woeDEBTINC
gDELINQ
woeDELINQ
gVALUE
woeVALUE
gDEROG
woeDEROG
gCLAGE
woeCLAGE
gNINQ
woeNINQ
gLOAN
woeLOAN
;
FORMAT gDEBTINC gDEBTINC. ;
FORMAT gDELINQ gDELINQ. ;
FORMAT gVALUE gVALUE. ;
FORMAT gDEROG gDEROG. ;
FORMAT gCLAGE gCLAGE. ;
FORMAT gNINQ gNINQ. ;
FORMAT gLOAN gLOAN. ;
RUN;
2 .Xử lý lại WOE trên SAS
Do cách tính WoE trên R được chuẩn hóa về trung bình của các WoE bằng 0. Phần trình bày phía sau sẽ tính lại WoE theo công thức thông thường. Trong đó, \[ WOE_i = \left[ ln \left( \dfrac{GOOD_i/ \sum \limits_i \left(GOOD_i\right)}{BAD_i/ \sum \limits_i \left(BAD_i\right)}\right)\right]\]
2.1 .Macro thiết lập tính lại WoE cho từng biến
Đề tính WoE cho từng biến sử dụng thuật toán trong MACRO sau:
/*Chọn library*/
LIBNAME DATA "C:\SASdata";
RUN;
/* Bắt đầu MACRO */
%MACRO REWOE(VAR);
/* Đếm số GOOD và BAD trong mỗi nhóm BIN */
PROC SQL NOPRINT;
CREATE TABLE DATA.BIN&VAR AS
SELECT *,
COUNT(CASE WHEN BAD = 0 THEN BAD ELSE . END)
AS GOODGROUP,
COUNT(CASE WHEN BAD = 1 THEN BAD ELSE . END)
AS BADGROUP
FROM DATA.HMEQBIN
GROUP BY G&VAR;
QUIT;
/* Lọc dữ liệu theo đối tượng nhóm BIN */
PROC SQL NOPRINT;
CREATE TABLE DATA.BIN&VAR AS
SELECT DISTINCT G&VAR,
BADGROUP, GOODGROUP
FROM DATA.BIN&VAR;
QUIT;
/* Tính Bad rate */
PROC SQL NOPRINT;
CREATE TABLE DATA.BIN&VAR AS
SELECT *,
BADGROUP/(BADGROUP+GOODGROUP)
AS BADRATE
FROM DATA.BIN&VAR;
QUIT;
/* Vẽ đồ thị Bad rate */
ODS GRAPHICS / RESET IMAGEMAP;
PROC SGPLOT DATA=DATA.BIN&VAR;
VBAR G&VAR / RESPONSE=BADRATE STAT=MEAN NAME='BAR';
YAXIS GRID;
RUN;
/* Tính WoE và IV cho từng nhóm bin */
PROC SQL NOPRINT;
CREATE TABLE DATA.BIN&VAR AS
SELECT *,
BADGROUP/SUM(BADGROUP) AS BADGROUPDIST,
GOODGROUP/SUM(GOODGROUP) AS GOODGROUPDIST,
LOG((GOODGROUP/SUM(GOODGROUP))/(BADGROUP/SUM(BADGROUP)))
AS WOESAS_&VAR,
(GOODGROUP/SUM(GOODGROUP)-BADGROUP/SUM(BADGROUP))*LOG((GOODGROUP/SUM(GOODGROUP))/(BADGROUP/SUM(BADGROUP)))
AS IV&VAR
FROM DATA.BIN&VAR;
QUIT;
/* Tính tổng IV cho từng biến */
PROC SQL NOPRINT;
CREATE TABLE DATA.BIN&VAR AS
SELECT *,
SUM(IV&VAR) AS SUMIV&VAR
FROM DATA.BIN&VAR;
QUIT;
/* Lọc thông tin căn bản cho từng biến */
PROC SQL NOPRINT;
CREATE TABLE DATA.BIN&VAR AS
SELECT
G&VAR, WOESAS_&VAR, SUMIV&VAR
FROM DATA.BIN&VAR;
QUIT;
/* Ghép lại dữ liệu WoE vừa tính vào dữ liệu gốc */
PROC SQL NOPRINT;
CREATE TABLE DATA.HMEQBIN AS
SELECT *
FROM DATA.HMEQBIN AS A, DATA.BIN&VAR AS B
WHERE A.G&VAR = B.G&VAR;
QUIT;
%MEND REWOE;
2.2 .Chạy MACRO cho danh sách các biến
Để chạy đoạn MACRO trên cho danh sách các biến đã được bin, chạy đoạn MACRO LOOP qua danh sách các biến như sau:
%LET VARLIST = DEBTINC DELINQ VALUE DEROG CLAGE NINQ LOAN;
%MACRO LOOP(LIST);
%LET NWORDS=%SYSFUNC(COUNTW(&LIST));
%DO I=1 %TO &NWORDS;
%REWOE(%SCAN(&LIST, &I))
%END;
%MEND;
%LOOP(&VARLIST);
3 .Tổng hợp các file trong quá trình BIN
Các file dữ liệu và các file khác trong quá trình thực hiện thủ tục trên có thể download tại đây:(click vào tên file cần down)