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à:
Hiểu chưa chính xác về IV và WoE,
Ứ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.
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 ở:
Nguồn 1 (hơi khó đọc vì nó là PhD Thesis của một trường khét tiếng): http://ciir.cs.umass.edu/pubfiles/ir-178.pdf
Nguồn 2 (dễ đọc hơn, và là credit scoring): http://essay.utwente.nl/65049/1/Thesis%20Ramon%20Man.pdf.
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:
Less than 0.02, then the predictor is not useful for modeling (separating the Goods from the Bads)
0.02 to 0.1, then the predictor has only a weak relationship to the Goods/Bads odds ratio
0.1 to 0.3, then the predictor has a medium strength relationship to the Goods/Bads odds ratio
0.3 to 0.5, then the predictor has a strong relationship to the Goods/Bads odds ratio
0.5, suspicious relationship (Check once).
(Còn nữa..)