BÁO CÁO TỰ HỌC AI-FIRST — SESSION 07

Mô hình tuyến tính tổng quát (GLM) & Biến nhị phân

📌 QUY ĐỊNH NỘP BÀI (BẮT BUỘC ĐỌC TRƯỚC): - Nộp đúng 1 file .md duy 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.


PHẦN 0: THÔNG TIN SINH VIÊN

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

PHẦN 1: BẢNG TÓM TẮT TỰ HỌC (Bắt buộc — điền trung thực)

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

Các chủ đề đã tìm hiểu

Tự đánh giá mức độ hiểu sau buổi học

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.

PHẦN 2: KIẾN THỨC CỐT LÕI ĐÃ HỌC (Tối đa 300 từ)

Khái niệm tôi đã hiểu rõ nhất

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).

Khái niệm tôi còn thấy khó / chưa chắc

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.

Điều thú vị nhất tôi phát hiện

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.


PHẦN 3: 10 HỘI THOẠI TIÊU BIỂU (Câu hỏi AI có tư duy phản biện)

Hội thoại #1

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.

Hội thoại #2

Câu hỏi tôi đã hỏi:
> Trong bài Telco, MonthlyCharges có hệ số âm sau khi thêm ContractInternetService; đ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ô.

Hội thoại #3

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.

Hội thoại #4

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.

Hội thoại #5

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.

Hội thoại #6

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.

Hội thoại #7

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ể.

Hội thoại #8

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ê.

Hội thoại #9

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.

Hội thoại #10

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.


PHẦN 4: CÂU HỎI PHẢN BIỆN & ĐIỀU CÒN BỎ NGỎ

  1. Nếu thêm biến tenure, PaymentMethodTechSupport, 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?
  2. Ngưỡng phân loại 0.5 có tối ưu cho chiến dịch giữ chân không, hay nên chọn threshold dựa trên chi phí gọi chăm sóc và lợi ích giữ chân khách hàng?
  3. Nếu khách hàng Fiber optic có churn cao, nguyên nhân nằm ở chất lượng dịch vụ, giá, kỳ vọng khách hàng hay vì nhóm này có đặc điểm khác biệt chưa đưa vào mô hình?
  4. AUC cao có đủ để triển khai mô hình không nếu mô hình có thể tạo thiên lệch chăm sóc giữa các nhóm khách hàng?

PHẦN 5: BÀI TẬP THỰC HÀNH (Đưa nội dung Ex7 vào theo mẫu)

Phần A — Thiết lập Quarto Project (CLO3)

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)

Phần B — Nạp & Khám phá Dữ liệu (CLO1, CLO3)

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

Phần C — Phân tích Thống kê Chính (CLO3, CLO4)

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: ContractInternetServiceFiber 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.


Phần D — Trực quan hóa & Báo cáo (CLO4, CLO5)

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.


Phần E — Prompt AI Nâng cao

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.


Phần F — AI-Grader Prompt

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

PHẦN 6: TỰ KIỂM TRA TRƯỚC KHI NỘP