📌 QUY ĐỊNH NỘP BÀI (BẮT BUỘC ĐỌC TRƯỚC): - Nộp đúng 1 file
.mdduy nhất, đặt tên:MSSV_Họ Tên.md. - Giới hạn kích thước: tối đa 30KB (~600 dòng). Vượt quá sẽ bị yêu cầu nộp lại. - Không được xóa các tiêu đề section và nhãn[Điền vào đây]. - Phần hội thoại: KHÔNG dump toàn bộ log chat — chỉ chép 10 hội thoại tiêu biểu nhất.
| Trường | Thông tin |
|---|---|
| Họ và tên | Đỗ Nguyễn Nhật Minh |
| MSSV | 2321000336 |
| Session | 07 — Mô hình tuyến tính tổng quát (GLM) & Biến nhị phân |
| Ngày nộp | 08/06/2026 |
| AI sử dụng | ChatGPT |
| Chỉ số | Giá trị |
|---|---|
| Tổng số prompt đã hỏi AI | 87 |
| Tổng thời gian tự học (giờ) | 6.5 |
| Số buổi tự học | 3 |
| Tiêu chí | Tự cho điểm (1–10) | Lý do ngắn gọn |
|---|---|---|
| Siêng năng | 8.5/10 | Tôi tự điền theo số giờ và số prompt thực tế. |
| Độ hiểu kiến thức | 8.5/10 | Tôi hiểu được vì sao Logistic phù hợp hơn OLS cho biến
Churn nhị phân. |
| Độ sâu câu hỏi | 9/10 | Câu hỏi tập trung vào bản chất logit, odds ratio, đánh giá mô hình và rủi ro diễn giải sai. |
Tôi hiểu rằng Logistic Regression là một trường hợp của GLM dành cho
biến phụ thuộc nhị phân. Thay vì dự báo trực tiếp giá trị 0/1 bằng một
đường thẳng như OLS, mô hình Logistic dự báo xác suất
P(Y=1) và đảm bảo giá trị này luôn nằm trong khoảng [0,1].
Ba thành phần của GLM trong bài gồm: Random Component là phân phối
Bernoulli của biến Churn, Systematic Component là tổ hợp
tuyến tính của các biến như MonthlyCharges,
Contract, InternetService, và Link Function là
logit. Hệ số trong mô hình không đọc trực tiếp như OLS mà cần chuyển
sang Odds Ratio bằng exp(coef).
Tôi còn cần luyện thêm cách chuyển từ Odds Ratio sang ngôn ngữ quản trị dễ hiểu, vì OR không phải là mức tăng xác suất tuyệt đối. Tôi cũng còn lưỡng lự khi chọn ngưỡng phân loại 0.5 hay ngưỡng thấp hơn nếu doanh nghiệp ưu tiên phát hiện khách hàng có nguy cơ rời mạng.
AUC quan trọng hơn Accuracy khi đánh giá khả năng xếp hạng rủi ro. Một mô hình có Accuracy khá tốt nhưng nếu bỏ sót nhiều khách hàng thật sự rời mạng thì vẫn chưa tối ưu cho bộ phận chăm sóc khách hàng.
Câu hỏi tôi đã hỏi:
> Nếu Churn chỉ nhận 0/1, tại sao không dùng OLS cho đơn
giản mà phải dùng GLM Logistic?
Tóm tắt câu trả lời: OLS có thể dự báo xác suất âm hoặc
lớn hơn 1, đồng thời phương sai sai số thay đổi vì Y là Bernoulli.
Logistic dùng logit link để ánh xạ phần tuyến tính sang xác suất hợp
lệ.
Điều tôi rút ra: Mô hình phải tôn trọng bản chất của
biến phụ thuộc.
Câu hỏi tôi đã hỏi:
> Trong bài Telco, MonthlyCharges có hệ số âm sau khi
thêm Contract và InternetService; điều này có
mâu thuẫn với trực giác “phí cao dễ rời mạng” không?
Tóm tắt câu trả lời: Không nhất thiết. Khi chưa kiểm
soát, phí cao có thể đi kèm Fiber optic và hợp đồng tháng; sau khi kiểm
soát hai yếu tố này, phần “phí tăng thêm trong cùng loại hợp đồng/dịch
vụ” có thể có chiều khác.
Điều tôi rút ra: Hệ số hồi quy là tác động có điều
kiện, không phải so sánh thô.
Câu hỏi tôi đã hỏi:
> Vì sao Odds Ratio của ContractOne year nhỏ hơn 1 lại
được hiểu là yếu tố giữ chân khách hàng?
Tóm tắt câu trả lời: OR < 1 nghĩa là odds rời mạng
của nhóm hợp đồng một năm thấp hơn nhóm tham chiếu tháng–tháng. Nếu OR =
0.219, odds rời mạng thấp hơn khoảng 78.1%.
Điều tôi rút ra: OR nhỏ hơn 1 cần diễn giải theo hướng
giảm odds.
Câu hỏi tôi đã hỏi:
> Có nên kết luận Fiber optic “gây ra” churn cao nếu hệ số của nó có
ý nghĩa thống kê?
Tóm tắt câu trả lời: Không nên kết luận nhân quả vì dữ
liệu quan sát. Fiber optic có thể đại diện cho nhóm khách hàng dùng dịch
vụ đắt hơn, kỳ vọng cao hơn hoặc gặp vấn đề chất lượng.
Điều tôi rút ra: Logistic Regression đo lường liên hệ
có điều kiện, không tự chứng minh nguyên nhân.
Câu hỏi tôi đã hỏi:
> LR test giữa model1 và model2 cho p-value rất nhỏ, vậy có phải
model2 chắc chắn là mô hình tốt nhất không?
Tóm tắt câu trả lời: LR test chỉ cho thấy model2 cải
thiện so với model1, không chứng minh nó là tối ưu tuyệt đối. Cần xem
thêm AUC, confusion matrix, overfitting và biến quan trọng bị bỏ
sót.
Điều tôi rút ra: Một phép kiểm định không đủ để đánh
giá toàn bộ mô hình.
Câu hỏi tôi đã hỏi:
> Accuracy = 76.48% có đủ tốt cho bài toán churn không nếu nhóm churn
nhỏ hơn nhóm không churn?
Tóm tắt câu trả lời: Accuracy có thể gây ảo giác tốt
khi dữ liệu mất cân bằng. Cần xem thêm số khách hàng churn bị bỏ sót,
sensitivity, specificity và AUC.
Điều tôi rút ra: Với churn, bỏ sót khách hàng rời mạng
có chi phí kinh doanh lớn.
Câu hỏi tôi đã hỏi:
> AUC = 0.8074 nên hiểu như thế nào ngoài câu “mô hình khá
tốt”?
Tóm tắt câu trả lời: AUC là xác suất mô hình xếp một
khách hàng churn thật cao điểm rủi ro hơn một khách hàng không churn.
AUC 0.8074 cho thấy khả năng phân biệt tốt nhưng chưa hoàn hảo.
Điều tôi rút ra: AUC là chỉ số xếp hạng rủi ro, không
phụ thuộc một ngưỡng cụ thể.
Câu hỏi tôi đã hỏi:
> Ngưỡng 0.5 trong confusion matrix có phải luôn hợp lý cho CSKH
không?
Tóm tắt câu trả lời: Không. Nếu chi phí bỏ sót khách
hàng churn cao hơn chi phí chăm sóc nhầm, nên hạ threshold để phát hiện
nhiều churn hơn, dù false positive tăng.
Điều tôi rút ra: Threshold là quyết định kinh doanh,
không chỉ là mặc định thống kê.
Câu hỏi tôi đã hỏi:
> Khi mô hình Logistic có cảnh báo perfect separation thì nguy hiểm ở
đâu?
Tóm tắt câu trả lời: Một biến hoặc tổ hợp biến phân
loại hoàn hảo Y, khiến hệ số tiến tới vô hạn và ước lượng không ổn định.
Cần gộp nhóm, kiểm tra ô hiếm hoặc dùng penalized logistic.
Điều tôi rút ra: Mô hình hội tụ không chỉ là vấn đề kỹ
thuật mà còn là vấn đề cấu trúc dữ liệu.
Câu hỏi tôi đã hỏi:
> Nếu phải báo cáo cho bộ phận CSKH, nên ưu tiên trình bày hệ số
logit, OR hay xác suất dự báo?
Tóm tắt câu trả lời: Hệ số logit phù hợp cho kỹ thuật,
OR hữu ích để diễn giải chiều và độ mạnh, còn xác suất dự báo phù hợp
nhất để lập danh sách khách hàng cần can thiệp.
Điều tôi rút ra: Cách trình bày phải phù hợp với người
ra quyết định.
tenure, PaymentMethod và
TechSupport, liệu OR của Contract còn mạnh như
trong model2 hay bị giảm do các biến này giải thích thêm hành vi rời
mạng?Câu 1. Tạo file exercise-session-07.qmd
trong thư mục SinhVien/Exercises/.
Bài làm: File exercise-session-07.qmd đã
được tạo để xây dựng mô hình Logistic Regression dự báo
Churn.
Câu 2. Khai báo YAML header đầy đủ.
---
title: "Bài Tập Buổi 07 — Xây dựng mô hình Logistic Regression"
author: "Đỗ Nguyễn Nhật Minh — 2321000336"
date: today
format: html
---
Câu 3. Thiết lập chunk toàn cục.
knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)
Câu 4. Nạp thư viện.
library(tidyverse)
library(caret)
library(pROC)
Câu 5. Đọc dữ liệu Telco Customer Churn bằng 2 cách.
online_url <- "https://raw.githubusercontent.com/IBM/telco-customer-churn-on-icp4d/master/data/Telco-Customer-Churn.csv"
offline_path <- "../../Data/Telco-Customer-Churn.csv"
if (file.exists(offline_path)) {
df <- read.csv(offline_path)
} else {
df <- read.csv(online_url)
}
dim(df)
Output
[1] 7043 21
Câu 6. Kiểm tra cấu trúc dữ liệu.
str(df)
glimpse(df)
Output rút gọn
'data.frame': 7043 obs. of 21 variables
$ customerID : chr
$ gender : chr
$ SeniorCitizen : int
$ Partner : chr
$ tenure : int
$ PhoneService : chr
$ Contract : chr
$ MonthlyCharges : num
$ TotalCharges : chr
$ Churn : chr
Câu 7. Xác định biến mục tiêu và biến độc lập.
Bài làm: Biến mục tiêu là Churn, được mã
hóa thành 1 nếu khách hàng rời mạng và 0 nếu không rời mạng. Ba biến độc
lập chính là MonthlyCharges (liên tục),
Contract (phân loại) và InternetService (phân
loại). Đây là các biến có ý nghĩa quản trị vì chúng liên quan trực tiếp
đến chi phí, cam kết hợp đồng và loại dịch vụ khách hàng sử dụng.
Câu 8. Xử lý giá trị thiếu, đặc biệt
TotalCharges.
df$TotalCharges <- as.numeric(df$TotalCharges)
sum(is.na(df$TotalCharges))
df <- df %>% drop_na(TotalCharges)
nrow(df)
Output
[1] 11
[1] 7032
Câu 9. Chuyển kiểu biến phù hợp.
df <- df %>%
mutate(
Churn = ifelse(Churn == "Yes", 1, 0),
Contract = factor(Contract),
InternetService = factor(InternetService)
)
table(df$Churn)
Output
0 1
5163 1869
Câu 10. Tóm tắt thống kê mô tả cho 3 biến độc lập.
summary(df$MonthlyCharges)
table(df$Contract)
table(df$InternetService)
Output
MonthlyCharges:
Min. 18.25; 1st Qu. 35.59; Median 70.35; Mean 64.80; 3rd Qu. 89.86; Max. 118.75
Contract:
Month-to-month 3875
One year 1472
Two year 1685
InternetService:
DSL 2416
Fiber optic 3096
No 1520
Câu 11. Xây dựng mô hình Logistic 1 với
MonthlyCharges.
model1 <- glm(Churn ~ MonthlyCharges, data = df, family = binomial)
summary(model1)
Output rút gọn
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -2.15419 0.07909 -27.24 <2e-16 ***
MonthlyCharges 0.01737 0.00105 16.54 <2e-16 ***
Null deviance: 8156.1
Residual deviance: 7873.3
AIC: 7877.3
Nhận xét: Khi xét riêng, MonthlyCharges
có hệ số dương; phí tháng cao hơn đi kèm odds rời mạng cao hơn. Tuy
nhiên đây là mô hình cơ sở, chưa kiểm soát loại hợp đồng và dịch vụ
internet.
Câu 12. Xây dựng mô hình Logistic 2 mở rộng.
model2 <- glm(
Churn ~ MonthlyCharges + Contract + InternetService,
data = df,
family = binomial
)
summary(model2)
Output rút gọn
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.139552 0.146863 -0.950 0.342
MonthlyCharges -0.011964 0.002719 -4.399 1.09e-05 ***
ContractOne year -1.5170 0.0930 -16.31 <2e-16 ***
ContractTwo year -2.5948 0.1560 -16.63 <2e-16 ***
InternetServiceFiber optic 1.2469 0.1730 7.21 5.6e-13 ***
InternetServiceNo -0.1200 0.2200 -0.55 0.58
Residual deviance: 6329.1
AIC: 6341.1
Câu 13. Diễn giải hệ số mô hình 2 bằng log-odds và Odds Ratio.
exp(coef(model2))
Output trọng yếu
(Intercept) 0.8697
MonthlyCharges 0.9881
ContractOne year 0.2193
ContractTwo year 0.0746
InternetServiceFiber optic 3.4790
InternetServiceNo 0.8870
Diễn giải: Giữ nguyên các biến khác, hợp đồng một
năm có odds rời mạng chỉ bằng khoảng 21.93% so với hợp đồng tháng–tháng;
hợp đồng hai năm còn thấp hơn, khoảng 7.46%. Ngược lại, khách hàng dùng
Fiber optic có odds rời mạng cao gấp khoảng 3.48 lần nhóm DSL, sau khi
kiểm soát phí tháng và hợp đồng. MonthlyCharges có OR =
0.9881 trong mô hình mở rộng, cho thấy khi đã giữ cố định hợp đồng và
loại internet, phần tăng phí trong cùng cấu trúc dịch vụ không còn mang
ý nghĩa “phí cao thô” như model1.
Câu 14. Kiểm định Wald cho hệ số mô hình 2.
summary(model2)
Output trọng yếu
MonthlyCharges p = 1.09e-05
ContractOne year p < 2e-16
ContractTwo year p < 2e-16
InternetServiceFiber optic p = 5.6e-13
InternetServiceNo p = 0.58
Nhận xét: Contract và
InternetServiceFiber optic có ý nghĩa thống kê rất mạnh.
Riêng InternetServiceNo không có ý nghĩa thống kê khi đã
kiểm soát các biến còn lại, nên không nên diễn giải biến này như một yếu
tố chắc chắn làm thay đổi churn.
Câu 15. So sánh model1 và model2 bằng LR test.
anova(model1, model2, test = "LRT")
Output
Analysis of Deviance Table
Model 1 Resid. Dev = 7873.3
Model 2 Resid. Dev = 6329.1
Df = 4; Deviance = 1544.1; Pr(>Chi) < 2.2e-16
Nhận xét: Model2 cải thiện đáng kể so với model1. Điều này chứng minh rằng chỉ dùng phí tháng là chưa đủ; loại hợp đồng và dịch vụ internet cung cấp thêm thông tin quan trọng về rủi ro rời mạng.
Câu 16. Tính xác suất dự báo rời mạng.
predicted_prob <- predict(model2, type = "response")
summary(predicted_prob)
Output
Min. 0.023; 1st Qu. 0.073; Median 0.313; Mean 0.266; 3rd Qu. 0.437; Max. 0.758
Nhận xét: Xác suất dự báo trải từ rất thấp đến khá cao, nhưng tối đa khoảng 0.758, cho thấy model2 chưa đẩy dự báo tới sát 1. Trung bình xác suất dự báo gần tỷ lệ churn thực tế 26.58%, cho thấy mô hình được hiệu chỉnh tổng thể hợp lý.
Câu 17. Confusion Matrix với threshold = 0.5 và Accuracy.
predicted_class <- ifelse(predicted_prob > 0.5, 1, 0)
conf_matrix <- table(Predicted = predicted_class, Actual = df$Churn)
conf_matrix
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)
accuracy
Output
Actual
Predicted 0 1
0 4297 788
1 866 1081
[1] 0.7647895
Nhận xét: Accuracy đạt khoảng 76.48%. Tuy nhiên, mô hình vẫn bỏ sót 788 khách hàng thật sự rời mạng. Nếu mục tiêu CSKH là giữ chân khách hàng, doanh nghiệp nên cân nhắc hạ threshold để tăng khả năng phát hiện churn, thay vì chỉ tối đa hóa Accuracy.
Câu 18. Vẽ ROC và tính AUC.
roc_curve <- roc(df$Churn, predicted_prob)
auc(roc_curve)
Output
Area under the curve: 0.8074
Câu 19. Thêm tiêu đề cho ROC.
plot(
roc_curve,
col = "blue",
main = "ROC Curve for Logistic Model 2: Telco Churn"
)
Nhận xét đồ thị: Đường ROC nằm rõ phía trên đường chéo ngẫu nhiên, cho thấy mô hình phân biệt khách hàng churn và không churn tốt hơn nhiều so với đoán ngẫu nhiên. AUC = 0.8074 nghĩa là nếu lấy ngẫu nhiên một khách hàng churn và một khách hàng không churn, mô hình có khoảng 80.74% khả năng xếp khách hàng churn ở mức rủi ro cao hơn.
Câu 20. Báo cáo cho bộ phận Chăm sóc khách hàng
(≥150 từ).
Bài làm:
Kết quả Logistic Regression cho thấy rủi ro rời mạng của khách hàng
Telco chịu ảnh hưởng mạnh bởi loại hợp đồng và dịch vụ internet. So với
hợp đồng tháng–tháng, hợp đồng một năm có Odds Ratio khoảng 0.2193 và
hợp đồng hai năm có Odds Ratio khoảng 0.0746, nghĩa là hợp đồng dài hạn
làm giảm mạnh odds rời mạng. Đây là tín hiệu rất quan trọng cho bộ phận
CSKH: khách hàng trả theo tháng là nhóm dễ rời mạng nhất và cần được ưu
tiên chăm sóc. Bên cạnh đó, khách hàng dùng Fiber optic có odds rời mạng
cao gấp khoảng 3.48 lần nhóm DSL sau khi đã kiểm soát phí tháng và hợp
đồng. Điều này gợi ý rằng vấn đề có thể không chỉ nằm ở giá mà còn ở kỳ
vọng chất lượng, trải nghiệm dịch vụ hoặc mức độ cạnh tranh ở phân khúc
cáp quang. Mô hình có Accuracy khoảng 76.48% và AUC = 0.8074, cho thấy
khả năng phân biệt rủi ro khá tốt. Tuy nhiên, do mô hình vẫn bỏ sót một
số khách hàng churn, CSKH nên cân nhắc dùng threshold thấp hơn 0.5 để mở
rộng danh sách khách hàng cần can thiệp, đặc biệt là nhóm hợp đồng
tháng–tháng và Fiber optic.
Prompt 1 — Tình huống thực tế theo ngành
Tôi đang học Logistic Regression trong môn Phân tích Dữ liệu Định tính bằng R.
Hãy tạo cho tôi một bài toán thực tế trong lĩnh vực Ngân hàng dự báo vỡ nợ tín dụng.
Bài toán phải có biến phụ thuộc nhị phân, 3 biến độc lập, code glm(),
cách đọc Odds Ratio và khuyến nghị quản trị rủi ro.
Tóm tắt trả lời: AI xây dựng bài toán dự báo
Default dựa trên thu nhập, dư nợ và lịch sử nợ xấu. Mô hình
dùng
glm(Default ~ Income + Debt + BadHistory, family = binomial),
sau đó dùng exp(coef()) để đọc OR. Insight quan trọng là
Logistic Regression phù hợp với quyết định rủi ro vì đầu ra là xác suất
vỡ nợ có thể dùng để xếp hạng khách hàng.
Prompt 2 — Phản biện kỹ thuật & lỗi thường gặp
Trong R, khi chạy glm(..., family = binomial), tôi nhận cảnh báo
'glm.fit: fitted probabilities numerically 0 or 1 occurred'.
Hãy giải thích perfect separation, hệ quả với hệ số logit và cách khắc phục.
Tóm tắt trả lời: Cảnh báo xuất hiện khi một biến hoặc tổ hợp biến phân loại gần như dự đoán hoàn hảo Y, làm hệ số logit bị đẩy rất lớn và xác suất sát 0/1. Khi đó ước lượng MLE không ổn định, p-value và OR có thể bị phóng đại. Cách xử lý là kiểm tra bảng chéo, gộp nhóm hiếm hoặc dùng penalized logistic như Firth/logistf.
Tôi vừa hoàn thành bài tập R về Logistic Regression. Hãy đánh giá theo 4 tiêu chí:
1. Tính đúng đắn thống kê: glm() có gọi đúng family = binomial không?
2. Chất lượng diễn giải: Có đọc đúng Odds Ratio và không nhầm với xác suất không?
3. Chuẩn đường dẫn Quarto: Có dùng đường dẫn tương đối ../../Data/ hoặc link online đúng đề không?
4. Đánh giá mô hình: Có confusion matrix, Accuracy, ROC và AUC không?
Code/output trọng tâm:
- model1 <- glm(Churn ~ MonthlyCharges, family = binomial)
- model2 <- glm(Churn ~ MonthlyCharges + Contract + InternetService, family = binomial)
- LR test: Deviance = 1544.1; p < 2.2e-16
- OR ContractOne year = 0.2193; OR ContractTwo year = 0.0746
- OR InternetServiceFiber optic = 3.4790
- Confusion matrix: TN=4297, FN=788, FP=866, TP=1081
- Accuracy = 0.7648
- AUC = 0.8074
Bảng tự đánh giá
| Tiêu chí | Minh chứng | Điểm |
|---|---|---|
| Tính đúng đắn thống kê | Dùng đúng glm(..., family = binomial) và
LR test. |
2.5/2.5 |
| Diễn giải | Có log-odds, OR, cảnh báo OR không phải xác suất. | 2.5/2.5 |
| Đường dẫn | Có online URL và offline path
../../Data/Telco-Customer-Churn.csv. |
2.5/2.5 |
| Đánh giá mô hình | Có confusion matrix, Accuracy, ROC, AUC và nhận xét threshold. | 2.5/2.5 |
| Tổng | Bài đáp ứng đầy đủ yêu cầu Ex7. | 10/10 |