Information Value and Weight of Evidence

For Funny

Nguyen Chi Dung

Giới thiệu

Information Value and Weight of Evidence (tạm dịch là giá trị thông tin IV và bằng chứng có trọng số WoE) có lẽ là một cụm từ hot, nhất là đối với giới làm rủi ro và phân loại hồ sơ tín dụng. Sau một thời gian theo dõi các bài viết thì điều rõ ràng là:

  1. Hiểu chưa chính xác về IV và WoE,

  2. Ứng dụng nó thế nào trong một bài toán điển hình, ví dụ, phân loại hồ sơ tín dụng với mô hình Logistic thì không thấy nói gì. Chỉ mới dừng lại ở mô tả IV và WoE mà không tiến xa hơn.

  3. Không chứng minh được một số khía cạnh quan trọng của WoE. Ví dụ, có đúng là chơi WoE cho Logistic thì sẽ làm lợi hơn cho ngân hàng về, chẳng hạn, lợi nhuận cao hơn và rủi ro thấp hơn hay không?. Không nên, và không cần thiết phải dùng một mô hình phức tạp trong khi không chứng minh được sự hữu ích của nó trong thực tế ứng với một tình huống cụ thể, với một bộ số liệu cụ thể. Hãy nói chuyện với nhau bằng các con số. Vì nói như George Box thì “All Models Are Wrong, Some Are Useful”.

Trước hết cần hiểu IV và WoE là gì, rồi mới tính tiếp các thứ khác. Bài viết này hướng đến mục đích đó.

Về WoE, IV và cách tính toán chúng các bạn có thể tham khảo ở:

Tóm lại:

IV là thước đo về sức mạnh dự báo của một biến định tính (categorical variable) đối với việc dự báo kết cục (hay nhãn) của biến được phân loại.

WoE chỉ là thằng cha trung gian để tính IV (chính xác là IV tích lũy). Chúng ta không cần quan tâm nhiều về thằng này mà chỉ chú ý IV thôi.

Ok. Trở lại với một bộ số liệu từng được sử dụng ở cuốn sách Thực hành thống kê với SPSS và Stata mà chúng ta đã biết ở một series post trước:

# Đọc dữ liệu: 
library(foreign)
dung <- read.spss("F:/tkdb/bankloan.sav", to.data.frame = TRUE)
library(tidyverse)
library(magrittr)

dung <- na.omit(dung) # Loại  NA. 
dung %<>% mutate(default = case_when(default == "Yes" ~ 1, 
                                     default == "No" ~ 0)) # Dán lại nhãn. 

# Giả sử chúng ta chúng ta những người  xin  vay thành 5 nhóm tuổi như  sau: 
dung %<>% mutate(nhom_tuoi = case_when(age >= 20 & age <= 27 ~ "Nhom1", 
                                       age >= 28 & age <= 31 ~ "Nhom2", 
                                       age >= 32 & age <= 36 ~ "Nhom3", 
                                       age >= 37 & age <= 40 ~ "Nhom4", 
                                       age >= 41 ~ "Nhom5"))

# Rồi  tính tỉ lệ (số lượng) các  nhãn hồ sơ được duyệt vay cho 5 nhóm này 
# đồng  thời hình  ảnh hóa: 
dung %>% 
  group_by(nhom_tuoi, default) %>% 
  count() %>% 
  ungroup() %>% 
  ggplot(aes(nhom_tuoi, n, fill = as.factor(default))) +
  geom_col(position = "fill")

# Có thể  thấy rằng, nếu phân ra 5 nhóm như trên thì nhóm 1 và 2 tỉ lệ 
# hồ  sơ xấu cao nhất. Ba  nhóm còn lại gần như nhau. 

# Tính toán các con số cần thiết: 
dung %>% 
  group_by(nhom_tuoi, default) %>% 
  count() %>% 
  ungroup() -> u

df1 <- u %>% filter(default == 0)  %>% rename(G = n) %>% select(-default)
df2 <- u %>% filter(default == 1)  %>% rename(B = n) %>% select(-default)

mydf <- merge(df1, df2, by = "nhom_tuoi")

mydf %<>% mutate(total = G + B)

# Tính toán thủ công IV, WoE theo những mô tả ở ba nghiên  cứu trên: 
mydf %<>% mutate(DoL = total / sum(total), 
                 DoG = G / sum(G), 
                 DoB = B / sum(B), 
                 h = DoB - DoG, 
                 WoE = log(DoB / DoG), 
                 IV = h*WoE, 
                 IV_cum = cumsum(IV))

# Xem IV và WoE tính toán được: 
knitr::kable(mydf)
nhom_tuoi G B total DoL DoG DoB h WoE IV IV_cum
Nhom1 83 54 137 0.1957143 0.1605416 0.2950820 0.1345404 0.6087002 0.0818948 0.0818948
Nhom2 99 42 141 0.2014286 0.1914894 0.2295082 0.0380188 0.1811065 0.0068855 0.0887802
Nhom3 110 29 139 0.1985714 0.2127660 0.1584699 -0.0542960 -0.2946278 0.0159971 0.1047773
Nhom4 87 22 109 0.1557143 0.1682785 0.1202186 -0.0480600 -0.3363089 0.0161630 0.1209403
Nhom5 138 36 174 0.2485714 0.2669246 0.1967213 -0.0702033 -0.3051780 0.0214245 0.1423648

Tính toán thủ công ở trên để nhấn mạnh rằng: (1) IV và WoE được tính toán ra sao, và (2) khả năng tự viết một hàm tính IV và WoE cho phù hợp với điều kiện cụ thể của nơi làm việc.

R có một gói hỗ trợ tính toán IV và WoE nhanh chóng là gói Information. Chúng ta có thể so sánh kết quả tính tay và sử dụng gói này:

library(Information)
IV <- create_infotables(data = dung, 
                        y = "default", 
                        bins = 5, 
                        parallel = TRUE)

# IV và  WoE tương ứng của biến age khi bị  phân thành 5 khúc: 
IV$Tables$age %>% knitr::kable()
age N Percent WOE IV
[20,27] 137 0.1957143 0.6087002 0.0818948
[28,31] 141 0.2014286 0.1811065 0.0887802
[32,36] 139 0.1985714 -0.2946278 0.1047773
[37,40] 109 0.1557143 -0.3363089 0.1209403
[41,56] 174 0.2485714 -0.3051780 0.1423648

Thế thì IV dùng để làm gì? Câu trả lời là:

According to Siddiqi (2006), by convention the values of the IV statistic in credit scoring can be interpreted as follows.

If the IV statistic is:

  1. Less than 0.02, then the predictor is not useful for modeling (separating the Goods from the Bads)

  2. 0.02 to 0.1, then the predictor has only a weak relationship to the Goods/Bads odds ratio

  3. 0.1 to 0.3, then the predictor has a medium strength relationship to the Goods/Bads odds ratio

  4. 0.3 to 0.5, then the predictor has a strong relationship to the Goods/Bads odds ratio

  5. 0.5, suspicious relationship (Check once).

(Còn nữa..)