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")
Sum IV after automatic binning
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)