Warning: package 'tidyverse' was built under R version 4.5.1
Warning: package 'ggplot2' was built under R version 4.5.1
Warning: package 'readr' was built under R version 4.5.1
Warning: package 'dplyr' was built under R version 4.5.1
Warning: package 'stringr' was built under R version 4.5.1
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.2
✔ ggplot2 4.0.0 ✔ tibble 3.2.1
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.0.4
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Code
library(ggplot2)library(scales)
Attaching package: 'scales'
The following object is masked from 'package:purrr':
discard
The following object is masked from 'package:readr':
col_factor
Code
library(readxl)
Warning: package 'readxl' was built under R version 4.5.2
1. Bối cảnh bài toán
Trong bài tập này, biến định tính nhị phân được phân tích là tình trạng khách hàng rời mạng (customer churn). Biến này thường chỉ có hai giá trị, ví dụ: Có rời mạng và Không rời mạng, hoặc được mã hóa thành 1 = rời mạng và 0 = không rời mạng. Vì đây là biến chỉ dùng để phân loại khách hàng thành hai nhóm nên nó thuộc dạng dữ liệu định tính nhị phân.
Việc ước lượng chính xác tỷ lệ khách hàng rời mạng, ký hiệu là \(p\), có ý nghĩa rất quan trọng đối với mô hình tài chính viễn thông. Nếu tỷ lệ rời mạng cao, doanh nghiệp sẽ mất doanh thu thuê bao định kỳ, giảm giá trị vòng đời khách hàng và phải tốn thêm chi phí để thu hút khách hàng mới thay thế. Ngược lại, nếu ước lượng tỷ lệ rời mạng quá thấp so với thực tế, doanh nghiệp có thể đánh giá sai dòng tiền, lợi nhuận kỳ vọng và ngân sách cần dành cho các chương trình giữ chân khách hàng. Vì vậy, ước lượng đúng tỷ lệ khách hàng rời mạng giúp doanh nghiệp dự báo doanh thu chính xác hơn, xây dựng chiến lược chăm sóc khách hàng phù hợp và giảm rủi ro trong các quyết định tài chính.
cat("Số dòng sau khi làm sạch:", nrow(df_clean), "\n")
Số dòng sau khi làm sạch: 5035
Code
cat("Các giá trị của biến Churn:", levels(df_clean$Churn), "\n")
Các giá trị của biến Churn: False No True Yes
7. Tính tỷ lệ mẫu của nhóm khách hàng rời mạng
Code
n <-nrow(df_clean)p_hat <-sum(df_clean$Churn =="Yes") / ncat("Cỡ mẫu n:", n, "\n")
Cỡ mẫu n: 5035
Code
cat("Số khách hàng rời mạng:", sum(df_clean$Churn =="Yes"), "\n")
Số khách hàng rời mạng: 556
Code
cat("Tỷ lệ mẫu p_hat:", p_hat, "\n")
Tỷ lệ mẫu p_hat: 0.110427
Code
cat("Tỷ lệ khách hàng rời mạng:", scales::percent(p_hat, accuracy =0.01), "\n")
Tỷ lệ khách hàng rời mạng: 11.04%
8. Kiểm tra điều kiện Success-Failure
Code
n <-nrow(df_clean)p_hat <-sum(df_clean$Churn =="Yes") / nsuccess_val <- n * p_hatfailure_val <- n * (1- p_hat)cat("Số lượng Thành công (Successes):", success_val, "\n")
Số lượng Thành công (Successes): 556
Code
cat("Số lượng Thất bại (Failures):", failure_val, "\n")
Số lượng Thất bại (Failures): 4479
Code
if (success_val >=10&& failure_val >=10) {message("KẾT LUẬN: Đủ điều kiện để áp dụng xấp xỉ phân phối chuẩn!")} else {warning("KẾT LUẬN: Không đủ điều kiện áp dụng xấp xỉ phân phối chuẩn!")}
9. Biểu đồ cột phân phối tần số của biến Churn
Code
ggplot(df_clean, aes(x = Churn, fill = Churn)) +geom_bar(width =0.65, alpha =0.9) +geom_text(stat ="count",aes(label =after_stat(count)),vjust =-0.4,size =4 ) +scale_fill_manual(values =c("No"="#1F3A5F", "Yes"="#D94F45") ) +labs(title ="Phân phối tần số của biến Churn",subtitle ="So sánh số lượng khách hàng không rời mạng và rời mạng",x ="Tình trạng rời mạng",y ="Số lượng khách hàng",fill ="Churn" ) +theme_minimal(base_size =13) +theme(plot.title =element_text(face ="bold"),plot.subtitle =element_text(size =11),legend.position ="top" )
10. Giải thích ảnh hưởng của cỡ mẫu đến sai số chuẩn
Nếu cỡ mẫu (n) bị thu hẹp đáng kể, ví dụ chỉ còn (n = 30), sai số chuẩn của tỷ lệ mẫu sẽ tăng lên. Công thức sai số chuẩn của tỷ lệ là (SE = ). Trong công thức này, (n) nằm ở mẫu số, nên khi (n) giảm thì (SE) sẽ tăng. Điều đó có nghĩa là tỷ lệ mẫu () trở nên kém ổn định hơn và dễ dao động mạnh giữa các mẫu khác nhau. Ngoài ra, khi cỡ mẫu quá nhỏ, điều kiện Success-Failure có thể không còn được thỏa mãn, tức là số lượng khách hàng rời mạng và không rời mạng không đủ lớn. Khi đó, phân phối lấy mẫu của tỷ lệ chưa đủ gần với phân phối chuẩn, nên việc dùng xấp xỉ phân phối chuẩn để suy luận thống kê sẽ không còn đáng tin cậy. ### 11. Công thức và tính toán Sai số chuẩn của tỷ lệ mẫu
Sai số chuẩn (Standard Error) của tỷ lệ mẫu được tính theo công thức:
\[
SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}
\]
Trong đó, () là tỷ lệ mẫu của nhóm khách hàng rời mạng và (n) là cỡ mẫu sau khi dữ liệu đã được làm sạch.
Code
SE <-sqrt((p_hat * (1- p_hat)) / n)cat("Sai số chuẩn SE:", SE, "\n")
Sai số chuẩn SE: 0.004417013
Code
cat("Sai số chuẩn SE theo phần trăm:", scales::percent(SE, accuracy =0.01), "\n")
Sai số chuẩn SE theo phần trăm: 0.44%
12. Khoảng tin cậy 95% cho tỷ lệ khách hàng rời mạng
Code
x <-sum(df_clean$Churn =="Yes")n <-nrow(df_clean)prop_result <-prop.test(x = x, n = n, conf.level =0.95)binom_result <-binom.test(x = x, n = n, conf.level =0.95)ci_compare <- tibble::tibble(Phuong_phap =c("prop.test() - Xấp xỉ", "binom.test() - Chính xác"),Lower_Bound =c(prop_result$conf.int[1], binom_result$conf.int[1]),Upper_Bound =c(prop_result$conf.int[2], binom_result$conf.int[2]))ci_compare <- ci_compare |> dplyr::mutate(Lower_Bound = scales::percent(Lower_Bound, accuracy =0.01),Upper_Bound = scales::percent(Upper_Bound, accuracy =0.01) )ci_compare
Kết quả trên cho thấy khoảng tin cậy 95% của tỷ lệ khách hàng rời mạng theo hai phương pháp. Hàm prop.test() sử dụng cách tiếp cận xấp xỉ, phù hợp khi cỡ mẫu đủ lớn và điều kiện Success-Failure được thỏa mãn. Trong khi đó, binom.test() sử dụng kiểm định nhị thức chính xác nên thường được xem là thận trọng hơn, đặc biệt trong trường hợp cỡ mẫu nhỏ hoặc tỷ lệ gần 0/1. ### 13. Khoảng tin cậy 99% và sự đánh đổi giữa độ chính xác và độ tin cậy
Code
x <-sum(df_clean$Churn =="Yes")n <-nrow(df_clean)prop_result_99 <-prop.test(x = x, n = n, conf.level =0.99)binom_result_99 <-binom.test(x = x, n = n, conf.level =0.99)ci_compare_99 <- tibble::tibble(Phuong_phap =c("prop.test() - Xấp xỉ", "binom.test() - Chính xác"),Lower_Bound =c(prop_result_99$conf.int[1], binom_result_99$conf.int[1]),Upper_Bound =c(prop_result_99$conf.int[2], binom_result_99$conf.int[2]))ci_compare_99 <- ci_compare_99 |> dplyr::mutate(Lower_Bound = scales::percent(Lower_Bound, accuracy =0.01),Upper_Bound = scales::percent(Upper_Bound, accuracy =0.01) )ci_compare_99
Khi mức tin cậy tăng từ 95% lên 99%, khoảng tin cậy sẽ rộng ra. Lý do là nhà nghiên cứu muốn chắc chắn hơn rằng khoảng ước lượng có chứa tỷ lệ rời mạng thực tế của tổng thể, nên cần mở rộng biên độ dao động quanh tỷ lệ mẫu. Đây chính là sự đánh đổi giữa độ chính xác và độ tin cậy. Khoảng tin cậy hẹp hơn thể hiện độ chính xác cao hơn, nhưng mức tin cậy thấp hơn. Ngược lại, khoảng tin cậy rộng hơn giúp tăng khả năng bao phủ giá trị thật, nhưng làm kết quả kém chính xác hơn về mặt thực hành. Đối với nhà quản trị viễn thông, khoảng tin cậy 99% giúp ra quyết định thận trọng hơn khi đánh giá rủi ro khách hàng rời mạng, nhưng cũng có thể khiến kế hoạch tài chính hoặc ngân sách giữ chân khách hàng phải dự phòng rộng hơn.
14. Thiết lập giả thuyết thống kê
Để kiểm định xem tỷ lệ khách hàng rời mạng thực tế có vượt quá ngưỡng tuyên bố 25% hay không, em đặt (p) là tỷ lệ rời mạng thực tế của toàn bộ khách hàng trong tổng thể.
Giả thuyết Không và giả thuyết Đối được phát biểu như sau:
\[
H_0: p \leq 0.25
\]
\[
H_1: p > 0.25
\]
Trong đó, (H_0) cho rằng tỷ lệ khách hàng rời mạng thực tế không vượt quá 25%, còn (H_1) cho rằng tỷ lệ khách hàng rời mạng thực tế lớn hơn 25%. Đây là kiểm định một phía bên phải vì câu hỏi nghiên cứu quan tâm đến việc tỷ lệ rời mạng có vượt quá ngưỡng 25% hay không.
15. Kiểm định tỷ lệ một phía bằng prop.test()
Code
res_test <-prop.test(x =sum(df_clean$Churn =="Yes"),n = n,p =0.25,alternative ="greater")# Tính toán Z-score kèm dấuz_score <-sqrt(res_test$statistic) *sign(p_hat -0.25)names(z_score) <-"z"cat("Trị số kiểm định Z-score:", z_score, "\n")
Trị số kiểm định Z-score: -22.85553
Code
cat("Giá trị P-value:", res_test$p.value, "\n")
Giá trị P-value: 1
Kết quả kiểm định một phía được dùng để xem tỷ lệ khách hàng rời mạng thực tế có lớn hơn ngưỡng 25% hay không. Nếu giá trị P-value nhỏ hơn mức ý nghĩa thường dùng, ví dụ (= 0.05), em có cơ sở bác bỏ giả thuyết (H_0) và kết luận rằng tỷ lệ rời mạng có thể vượt quá 25%. Ngược lại, nếu P-value lớn hơn 0.05, em chưa có đủ bằng chứng thống kê để kết luận tỷ lệ rời mạng thực tế vượt quá ngưỡng 25%.
16. Diễn giải P-value học thuật
Code
alpha <-0.05p_value <- res_test$p.valuecat("Mức ý nghĩa alpha:", alpha, "\n")
Mức ý nghĩa alpha: 0.05
Code
cat("P-value:", p_value, "\n")
P-value: 1
Code
if (p_value < alpha) {cat("Kết luận: Bác bỏ giả thuyết H0 ở mức ý nghĩa 5%.\n")} else {cat("Kết luận: Không đủ bằng chứng để bác bỏ giả thuyết H0 ở mức ý nghĩa 5%.\n")}
Kết luận: Không đủ bằng chứng để bác bỏ giả thuyết H0 ở mức ý nghĩa 5%.
Với mức ý nghĩa (= 0.05), em so sánh giá trị P-value thu được từ kiểm định với (). Nếu P-value nhỏ hơn 0.05, em bác bỏ giả thuyết (H_0). Điều này có nghĩa là dữ liệu mẫu cung cấp đủ bằng chứng thống kê để kết luận rằng tỷ lệ khách hàng rời mạng thực tế lớn hơn 25%.
Trong ngữ cảnh bài toán này, P-value được hiểu là xác suất để thu được một tỷ lệ rời mạng mẫu lớn hơn hoặc bằng tỷ lệ quan sát được (), trong điều kiện giả thuyết (H_0: p = 0.25) là đúng. Nói cách khác, nếu tỷ lệ rời mạng thực tế thật sự chỉ bằng 25%, thì P-value cho biết khả năng quan sát được một kết quả cực đoan như mẫu hiện tại hoặc còn cực đoan hơn. Nếu xác suất này rất nhỏ, em có cơ sở nghi ngờ giả thuyết (H_0) và nghiêng về kết luận rằng tỷ lệ rời mạng đã vượt quá ngưỡng 25%.
17. Ý nghĩa thống kê và ý nghĩa thực tiễn
Ý nghĩa thống kê (Statistical Significance) cho biết kết quả quan sát được trong mẫu có đủ bằng chứng để bác bỏ giả thuyết (H_0) hay không. Ví dụ, nếu P-value nhỏ hơn 0.05, em có thể kết luận rằng tỷ lệ khách hàng rời mạng thực tế lớn hơn 25% ở mức ý nghĩa 5%. Tuy nhiên, ý nghĩa thống kê không tự động đồng nghĩa với việc kết quả đó quan trọng về mặt kinh doanh.
Ý nghĩa thực tiễn (Practical Significance) xem xét mức độ ảnh hưởng của kết quả trong bối cảnh thực tế. Trong trường hợp tỷ lệ rời mạng mẫu chỉ cao hơn ngưỡng 25% khoảng 1.54%, dù kết quả có ý nghĩa thống kê, nhà quản trị vẫn cần cân nhắc chi phí và lợi ích. Nếu chi phí triển khai chiến dịch giữ chân khách hàng lớn hơn nhiều so với thiệt hại tài chính do 1.54% khách hàng rời mạng vượt mức gây ra, em sẽ không khuyên ban giám đốc triển khai chiến dịch quy mô lớn ngay lập tức. Thay vào đó, em đề xuất phân tích sâu hơn nhóm khách hàng có nguy cơ rời mạng cao, thử nghiệm chiến dịch nhỏ trên một nhóm khách hàng mục tiêu, rồi đánh giá hiệu quả trước khi mở rộng toàn bộ chương trình.
18. Forest Plot trực quan hóa khoảng tin cậy 95%
Code
x <-sum(df_clean$Churn =="Yes")n <-nrow(df_clean)test_res <-prop.test(x = x,n = n,conf.level =0.95)plot_ci <-data.frame(Metric ="Tỷ lệ Churn thực tế",p_hat = x / n,Lower = test_res$conf.int[1],Upper = test_res$conf.int[2])# Giới hạn trục để biểu đồ không bị quá trốngx_min <-min(plot_ci$Lower, 0.25) -0.02x_max <-max(plot_ci$Upper, 0.25) +0.02ggplot(plot_ci, aes(y = Metric, x = p_hat)) +geom_segment(aes(x = Lower, xend = Upper, y = Metric, yend = Metric),color ="#DC2626",linewidth =1.4 ) +geom_point(color ="#1E3A8A",size =5 ) +geom_vline(xintercept =0.25,linetype ="dashed",color ="gray40",linewidth =1 ) +geom_text(aes(label = scales::percent(p_hat, accuracy =0.01)),vjust =-1.2,color ="#1E3A8A",fontface ="bold",size =4 ) +scale_x_continuous(labels = scales::percent_format(accuracy =0.1),limits =c(x_min, x_max) ) +labs(title ="Khoảng tin cậy 95% của tỷ lệ khách hàng rời mạng",subtitle ="So sánh tỷ lệ mẫu với ngưỡng mục tiêu 25%",x ="Tỷ lệ khách hàng rời mạng",y ="",caption ="Thanh đỏ: khoảng tin cậy 95%; điểm xanh: tỷ lệ mẫu; đường nét đứt: ngưỡng 25%" ) +theme_minimal(base_size =13) +theme(plot.title =element_text(face ="bold"),plot.subtitle =element_text(size =11),axis.text.y =element_text(face ="bold"),panel.grid.major.y =element_blank() )
Biểu đồ trên thể hiện tỷ lệ rời mạng mẫu () bằng điểm màu xanh và khoảng tin cậy 95% bằng thanh sai số màu đỏ. Đường nét đứt biểu thị ngưỡng mục tiêu 25%. Nếu toàn bộ khoảng tin cậy nằm phía trên đường 25%, điều này cho thấy tỷ lệ rời mạng thực tế có khả năng cao vượt ngưỡng mục tiêu. Nếu khoảng tin cậy cắt qua đường 25%, kết luận sẽ thận trọng hơn vì dữ liệu chưa cho thấy sự vượt ngưỡng một cách rõ ràng.
19. Bảng tóm tắt kết quả kiểm định
Code
x <-sum(df_clean$Churn =="Yes")n <-nrow(df_clean)p_hat <- x / ntest_95 <-prop.test(x = x,n = n,conf.level =0.95)res_test <-prop.test(x = x,n = n,p =0.25,alternative ="greater")z_score <-sqrt(res_test$statistic) *sign(p_hat -0.25)names(z_score) <-"z"ket_luan <-ifelse( res_test$p.value <0.05,"Bác bỏ H0: Có bằng chứng tỷ lệ rời mạng vượt 25%","Không bác bỏ H0: Chưa đủ bằng chứng tỷ lệ rời mạng vượt 25%")summary_table <- tibble::tibble(`Tỷ lệ mẫu`= scales::percent(p_hat, accuracy =0.01),`Cận dưới CI 95%`= scales::percent(test_95$conf.int[1], accuracy =0.01),`Cận trên CI 95%`= scales::percent(test_95$conf.int[2], accuracy =0.01),`Trị số kiểm định Z`=round(as.numeric(z_score), 4),`P-value`=format.pval(res_test$p.value, digits =4),`Kết luận thống kê`= ket_luan)knitr::kable( summary_table,caption ="Bảng tóm tắt kết quả kiểm định tỷ lệ khách hàng rời mạng",align ="c")
Bảng tóm tắt kết quả kiểm định tỷ lệ khách hàng rời mạng
Tỷ lệ mẫu
Cận dưới CI 95%
Cận trên CI 95%
Trị số kiểm định Z
P-value
Kết luận thống kê
11.04%
10.20%
11.95%
-22.8555
1
Không bác bỏ H0: Chưa đủ bằng chứng tỷ lệ rời mạng vượt 25%
20. Báo cáo khuyến nghị quản trị
Kết quả phân tích cho thấy tỷ lệ khách hàng rời mạng mẫu là 11.04%. Khoảng tin cậy 95% giúp ước lượng khoảng dao động hợp lý của tỷ lệ rời mạng thực tế trong tổng thể khách hàng. Đồng thời, kiểm định một phía với giả thuyết (H_0: p ) và (H_1: p > 0.25) được sử dụng để xem tỷ lệ rời mạng có vượt ngưỡng 25% hay không. Dựa trên P-value thu được là 1, nếu P-value nhỏ hơn mức ý nghĩa (= 0.05), em có cơ sở bác bỏ (H_0), tức là dữ liệu mẫu cho thấy tỷ lệ rời mạng thực tế có khả năng vượt quá 25%.
Với vai trò tư vấn cho Giám đốc Chăm sóc khách hàng, em cho rằng tuyên bố “giữ tỷ lệ khách hàng rời mạng dưới 25%” cần được xem xét lại nếu kết quả kiểm định có ý nghĩa thống kê. Tuy nhiên, quyết định quản trị không nên chỉ dựa vào ý nghĩa thống kê. Nhà quản trị cần đánh giá thêm ý nghĩa thực tiễn, tức là mức vượt 25% có đủ lớn để gây thiệt hại tài chính nghiêm trọng hay không. Nếu tỷ lệ mẫu chỉ vượt ngưỡng khoảng 1.54%, doanh nghiệp nên so sánh chi phí triển khai chiến dịch giữ chân khách hàng với thiệt hại do phần vượt mức này gây ra.
Sai lầm Loại I trong bài toán này là bác bỏ (H_0) khi thực tế tỷ lệ rời mạng vẫn chưa vượt quá 25%. Khi đó, doanh nghiệp có thể phạt hoặc đánh giá sai bộ phận Chăm sóc khách hàng dù họ vẫn đang làm tốt. Để giảm rủi ro này, ban giám đốc nên dùng mức ý nghĩa nghiêm ngặt hơn như 1%, kết hợp thêm khoảng tin cậy 99%, phân tích dữ liệu theo nhiều kỳ và kiểm tra thêm các yếu tố tài chính trước khi ra quyết định kỷ luật hoặc triển khai chiến dịch lớn.
Source Code
---title: "Bài tập Session 03 - Ước lượng tỷ lệ khách hàng rời mạng"author: "Họ và tên: Hồ thị Bích Thảo | MSSV: 2321000361"date: todayformat: html: toc: true code-fold: true code-tools: true---```{r setup}knitr::opts_chunk$set(echo = TRUE, warning = FALSE, message = FALSE)library(tidyverse)library(ggplot2)library(scales)library(readxl)```## 1. Bối cảnh bài toánTrong bài tập này, biến định tính nhị phân được phân tích là **tình trạng khách hàng rời mạng** (*customer churn*). Biến này thường chỉ có hai giá trị, ví dụ: **Có rời mạng** và **Không rời mạng**, hoặc được mã hóa thành **1 = rời mạng** và **0 = không rời mạng**. Vì đây là biến chỉ dùng để phân loại khách hàng thành hai nhóm nên nó thuộc dạng dữ liệu định tính nhị phân.Việc ước lượng chính xác tỷ lệ khách hàng rời mạng, ký hiệu là $p$, có ý nghĩa rất quan trọng đối với mô hình tài chính viễn thông. Nếu tỷ lệ rời mạng cao, doanh nghiệp sẽ mất doanh thu thuê bao định kỳ, giảm giá trị vòng đời khách hàng và phải tốn thêm chi phí để thu hút khách hàng mới thay thế. Ngược lại, nếu ước lượng tỷ lệ rời mạng quá thấp so với thực tế, doanh nghiệp có thể đánh giá sai dòng tiền, lợi nhuận kỳ vọng và ngân sách cần dành cho các chương trình giữ chân khách hàng. Vì vậy, ước lượng đúng tỷ lệ khách hàng rời mạng giúp doanh nghiệp dự báo doanh thu chính xác hơn, xây dựng chiến lược chăm sóc khách hàng phù hợp và giảm rủi ro trong các quyết định tài chính.## Phần B — Nạp & Khám phá dữ liệu### 5. Đọc dữ liệu```{r load-data}df <- read.csv("C:/Users/hothi/Downloads/telco_churn.csv")head(df)```### 6. Làm sạch dữ liệu```{r clean-data}df$TotalCharges <- trimws(as.character(df$TotalCharges))df$TotalCharges[df$TotalCharges == ""] <- NAdf$TotalCharges <- as.numeric(df$TotalCharges)df_clean <- df |> tidyr::drop_na()df_clean$Churn <- as.factor(df_clean$Churn)cat("Số dòng dữ liệu gốc:", nrow(df), "\n")cat("Số dòng sau khi làm sạch:", nrow(df_clean), "\n")cat("Các giá trị của biến Churn:", levels(df_clean$Churn), "\n")```### 7. Tính tỷ lệ mẫu của nhóm khách hàng rời mạng```{r sample-proportion}n <- nrow(df_clean)p_hat <- sum(df_clean$Churn == "Yes") / ncat("Cỡ mẫu n:", n, "\n")cat("Số khách hàng rời mạng:", sum(df_clean$Churn == "Yes"), "\n")cat("Tỷ lệ mẫu p_hat:", p_hat, "\n")cat("Tỷ lệ khách hàng rời mạng:", scales::percent(p_hat, accuracy = 0.01), "\n")```### 8. Kiểm tra điều kiện Success-Failure```{r success-failure-check}n <- nrow(df_clean)p_hat <- sum(df_clean$Churn == "Yes") / nsuccess_val <- n * p_hatfailure_val <- n * (1 - p_hat)cat("Số lượng Thành công (Successes):", success_val, "\n")cat("Số lượng Thất bại (Failures):", failure_val, "\n")if (success_val >= 10 && failure_val >= 10) { message("KẾT LUẬN: Đủ điều kiện để áp dụng xấp xỉ phân phối chuẩn!")} else { warning("KẾT LUẬN: Không đủ điều kiện áp dụng xấp xỉ phân phối chuẩn!")}```### 9. Biểu đồ cột phân phối tần số của biến Churn```{r churn-bar-chart}ggplot(df_clean, aes(x = Churn, fill = Churn)) + geom_bar(width = 0.65, alpha = 0.9) + geom_text( stat = "count", aes(label = after_stat(count)), vjust = -0.4, size = 4 ) + scale_fill_manual( values = c("No" = "#1F3A5F", "Yes" = "#D94F45") ) + labs( title = "Phân phối tần số của biến Churn", subtitle = "So sánh số lượng khách hàng không rời mạng và rời mạng", x = "Tình trạng rời mạng", y = "Số lượng khách hàng", fill = "Churn" ) + theme_minimal(base_size = 13) + theme( plot.title = element_text(face = "bold"), plot.subtitle = element_text(size = 11), legend.position = "top" )```### 10. Giải thích ảnh hưởng của cỡ mẫu đến sai số chuẩnNếu cỡ mẫu (n) bị thu hẹp đáng kể, ví dụ chỉ còn (n = 30), sai số chuẩn của tỷ lệ mẫu sẽ tăng lên. Công thức sai số chuẩn của tỷ lệ là (SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}). Trong công thức này, (n) nằm ở mẫu số, nên khi (n) giảm thì (SE) sẽ tăng. Điều đó có nghĩa là tỷ lệ mẫu (\hat{p}) trở nên kém ổn định hơn và dễ dao động mạnh giữa các mẫu khác nhau. Ngoài ra, khi cỡ mẫu quá nhỏ, điều kiện Success-Failure có thể không còn được thỏa mãn, tức là số lượng khách hàng rời mạng và không rời mạng không đủ lớn. Khi đó, phân phối lấy mẫu của tỷ lệ chưa đủ gần với phân phối chuẩn, nên việc dùng xấp xỉ phân phối chuẩn để suy luận thống kê sẽ không còn đáng tin cậy. \### 11. Công thức và tính toán Sai số chuẩn của tỷ lệ mẫuSai số chuẩn (*Standard Error*) của tỷ lệ mẫu được tính theo công thức:$$SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}$$Trong đó, (\hat{p}) là tỷ lệ mẫu của nhóm khách hàng rời mạng và (n) là cỡ mẫu sau khi dữ liệu đã được làm sạch.```{r standard-error}SE <- sqrt((p_hat * (1 - p_hat)) / n)cat("Sai số chuẩn SE:", SE, "\n")cat("Sai số chuẩn SE theo phần trăm:", scales::percent(SE, accuracy = 0.01), "\n")```### 12. Khoảng tin cậy 95% cho tỷ lệ khách hàng rời mạng```{r confidence-intervals}x <- sum(df_clean$Churn == "Yes")n <- nrow(df_clean)prop_result <- prop.test(x = x, n = n, conf.level = 0.95)binom_result <- binom.test(x = x, n = n, conf.level = 0.95)ci_compare <- tibble::tibble( Phuong_phap = c("prop.test() - Xấp xỉ", "binom.test() - Chính xác"), Lower_Bound = c(prop_result$conf.int[1], binom_result$conf.int[1]), Upper_Bound = c(prop_result$conf.int[2], binom_result$conf.int[2]))ci_compare <- ci_compare |> dplyr::mutate( Lower_Bound = scales::percent(Lower_Bound, accuracy = 0.01), Upper_Bound = scales::percent(Upper_Bound, accuracy = 0.01) )ci_compare```Kết quả trên cho thấy khoảng tin cậy 95% của tỷ lệ khách hàng rời mạng theo hai phương pháp. Hàm `prop.test()` sử dụng cách tiếp cận xấp xỉ, phù hợp khi cỡ mẫu đủ lớn và điều kiện Success-Failure được thỏa mãn. Trong khi đó, `binom.test()` sử dụng kiểm định nhị thức chính xác nên thường được xem là thận trọng hơn, đặc biệt trong trường hợp cỡ mẫu nhỏ hoặc tỷ lệ gần 0/1. \### 13. Khoảng tin cậy 99% và sự đánh đổi giữa độ chính xác và độ tin cậy```{r confidence-interval-99}x <- sum(df_clean$Churn == "Yes")n <- nrow(df_clean)prop_result_99 <- prop.test(x = x, n = n, conf.level = 0.99)binom_result_99 <- binom.test(x = x, n = n, conf.level = 0.99)ci_compare_99 <- tibble::tibble( Phuong_phap = c("prop.test() - Xấp xỉ", "binom.test() - Chính xác"), Lower_Bound = c(prop_result_99$conf.int[1], binom_result_99$conf.int[1]), Upper_Bound = c(prop_result_99$conf.int[2], binom_result_99$conf.int[2]))ci_compare_99 <- ci_compare_99 |> dplyr::mutate( Lower_Bound = scales::percent(Lower_Bound, accuracy = 0.01), Upper_Bound = scales::percent(Upper_Bound, accuracy = 0.01) )ci_compare_99```Khi mức tin cậy tăng từ 95% lên 99%, khoảng tin cậy sẽ rộng ra. Lý do là nhà nghiên cứu muốn chắc chắn hơn rằng khoảng ước lượng có chứa tỷ lệ rời mạng thực tế của tổng thể, nên cần mở rộng biên độ dao động quanh tỷ lệ mẫu. Đây chính là sự đánh đổi giữa độ chính xác và độ tin cậy. Khoảng tin cậy hẹp hơn thể hiện độ chính xác cao hơn, nhưng mức tin cậy thấp hơn. Ngược lại, khoảng tin cậy rộng hơn giúp tăng khả năng bao phủ giá trị thật, nhưng làm kết quả kém chính xác hơn về mặt thực hành. Đối với nhà quản trị viễn thông, khoảng tin cậy 99% giúp ra quyết định thận trọng hơn khi đánh giá rủi ro khách hàng rời mạng, nhưng cũng có thể khiến kế hoạch tài chính hoặc ngân sách giữ chân khách hàng phải dự phòng rộng hơn.### 14. Thiết lập giả thuyết thống kêĐể kiểm định xem tỷ lệ khách hàng rời mạng thực tế có vượt quá ngưỡng tuyên bố 25% hay không, em đặt (p) là tỷ lệ rời mạng thực tế của toàn bộ khách hàng trong tổng thể.Giả thuyết Không và giả thuyết Đối được phát biểu như sau:$$H_0: p \leq 0.25$$$$H_1: p > 0.25$$Trong đó, (H_0) cho rằng tỷ lệ khách hàng rời mạng thực tế không vượt quá 25%, còn (H_1) cho rằng tỷ lệ khách hàng rời mạng thực tế lớn hơn 25%. Đây là kiểm định một phía bên phải vì câu hỏi nghiên cứu quan tâm đến việc tỷ lệ rời mạng có **vượt quá** ngưỡng 25% hay không.### 15. Kiểm định tỷ lệ một phía bằng `prop.test()````{r one-sided-prop-test}res_test <- prop.test( x = sum(df_clean$Churn == "Yes"), n = n, p = 0.25, alternative = "greater")# Tính toán Z-score kèm dấuz_score <- sqrt(res_test$statistic) * sign(p_hat - 0.25)names(z_score) <- "z"cat("Trị số kiểm định Z-score:", z_score, "\n")cat("Giá trị P-value:", res_test$p.value, "\n")```Kết quả kiểm định một phía được dùng để xem tỷ lệ khách hàng rời mạng thực tế có lớn hơn ngưỡng 25% hay không. Nếu giá trị P-value nhỏ hơn mức ý nghĩa thường dùng, ví dụ (\alpha = 0.05), em có cơ sở bác bỏ giả thuyết (H_0) và kết luận rằng tỷ lệ rời mạng có thể vượt quá 25%. Ngược lại, nếu P-value lớn hơn 0.05, em chưa có đủ bằng chứng thống kê để kết luận tỷ lệ rời mạng thực tế vượt quá ngưỡng 25%.### 16. Diễn giải P-value học thuật```{r p-value-decision}alpha <- 0.05p_value <- res_test$p.valuecat("Mức ý nghĩa alpha:", alpha, "\n")cat("P-value:", p_value, "\n")if (p_value < alpha) { cat("Kết luận: Bác bỏ giả thuyết H0 ở mức ý nghĩa 5%.\n")} else { cat("Kết luận: Không đủ bằng chứng để bác bỏ giả thuyết H0 ở mức ý nghĩa 5%.\n")}```Với mức ý nghĩa (\alpha = 0.05), em so sánh giá trị P-value thu được từ kiểm định với (\alpha). Nếu P-value nhỏ hơn 0.05, em bác bỏ giả thuyết (H_0). Điều này có nghĩa là dữ liệu mẫu cung cấp đủ bằng chứng thống kê để kết luận rằng tỷ lệ khách hàng rời mạng thực tế lớn hơn 25%.Trong ngữ cảnh bài toán này, P-value được hiểu là xác suất để thu được một tỷ lệ rời mạng mẫu lớn hơn hoặc bằng tỷ lệ quan sát được (\hat{p}), trong điều kiện giả thuyết (H_0: p = 0.25) là đúng. Nói cách khác, nếu tỷ lệ rời mạng thực tế thật sự chỉ bằng 25%, thì P-value cho biết khả năng quan sát được một kết quả cực đoan như mẫu hiện tại hoặc còn cực đoan hơn. Nếu xác suất này rất nhỏ, em có cơ sở nghi ngờ giả thuyết (H_0) và nghiêng về kết luận rằng tỷ lệ rời mạng đã vượt quá ngưỡng 25%.### 17. Ý nghĩa thống kê và ý nghĩa thực tiễn**Ý nghĩa thống kê** (*Statistical Significance*) cho biết kết quả quan sát được trong mẫu có đủ bằng chứng để bác bỏ giả thuyết (H_0) hay không. Ví dụ, nếu P-value nhỏ hơn 0.05, em có thể kết luận rằng tỷ lệ khách hàng rời mạng thực tế lớn hơn 25% ở mức ý nghĩa 5%. Tuy nhiên, ý nghĩa thống kê không tự động đồng nghĩa với việc kết quả đó quan trọng về mặt kinh doanh.**Ý nghĩa thực tiễn** (*Practical Significance*) xem xét mức độ ảnh hưởng của kết quả trong bối cảnh thực tế. Trong trường hợp tỷ lệ rời mạng mẫu chỉ cao hơn ngưỡng 25% khoảng 1.54%, dù kết quả có ý nghĩa thống kê, nhà quản trị vẫn cần cân nhắc chi phí và lợi ích. Nếu chi phí triển khai chiến dịch giữ chân khách hàng lớn hơn nhiều so với thiệt hại tài chính do 1.54% khách hàng rời mạng vượt mức gây ra, em sẽ không khuyên ban giám đốc triển khai chiến dịch quy mô lớn ngay lập tức. Thay vào đó, em đề xuất phân tích sâu hơn nhóm khách hàng có nguy cơ rời mạng cao, thử nghiệm chiến dịch nhỏ trên một nhóm khách hàng mục tiêu, rồi đánh giá hiệu quả trước khi mở rộng toàn bộ chương trình.### 18. Forest Plot trực quan hóa khoảng tin cậy 95%```{r forest-plot-ci}x <- sum(df_clean$Churn == "Yes")n <- nrow(df_clean)test_res <- prop.test( x = x, n = n, conf.level = 0.95)plot_ci <- data.frame( Metric = "Tỷ lệ Churn thực tế", p_hat = x / n, Lower = test_res$conf.int[1], Upper = test_res$conf.int[2])# Giới hạn trục để biểu đồ không bị quá trốngx_min <- min(plot_ci$Lower, 0.25) - 0.02x_max <- max(plot_ci$Upper, 0.25) + 0.02ggplot(plot_ci, aes(y = Metric, x = p_hat)) + geom_segment( aes(x = Lower, xend = Upper, y = Metric, yend = Metric), color = "#DC2626", linewidth = 1.4 ) + geom_point( color = "#1E3A8A", size = 5 ) + geom_vline( xintercept = 0.25, linetype = "dashed", color = "gray40", linewidth = 1 ) + geom_text( aes(label = scales::percent(p_hat, accuracy = 0.01)), vjust = -1.2, color = "#1E3A8A", fontface = "bold", size = 4 ) + scale_x_continuous( labels = scales::percent_format(accuracy = 0.1), limits = c(x_min, x_max) ) + labs( title = "Khoảng tin cậy 95% của tỷ lệ khách hàng rời mạng", subtitle = "So sánh tỷ lệ mẫu với ngưỡng mục tiêu 25%", x = "Tỷ lệ khách hàng rời mạng", y = "", caption = "Thanh đỏ: khoảng tin cậy 95%; điểm xanh: tỷ lệ mẫu; đường nét đứt: ngưỡng 25%" ) + theme_minimal(base_size = 13) + theme( plot.title = element_text(face = "bold"), plot.subtitle = element_text(size = 11), axis.text.y = element_text(face = "bold"), panel.grid.major.y = element_blank() )```Biểu đồ trên thể hiện tỷ lệ rời mạng mẫu (\hat{p}) bằng điểm màu xanh và khoảng tin cậy 95% bằng thanh sai số màu đỏ. Đường nét đứt biểu thị ngưỡng mục tiêu 25%. Nếu toàn bộ khoảng tin cậy nằm phía trên đường 25%, điều này cho thấy tỷ lệ rời mạng thực tế có khả năng cao vượt ngưỡng mục tiêu. Nếu khoảng tin cậy cắt qua đường 25%, kết luận sẽ thận trọng hơn vì dữ liệu chưa cho thấy sự vượt ngưỡng một cách rõ ràng.### 19. Bảng tóm tắt kết quả kiểm định```{r summary-test-table}x <- sum(df_clean$Churn == "Yes")n <- nrow(df_clean)p_hat <- x / ntest_95 <- prop.test( x = x, n = n, conf.level = 0.95)res_test <- prop.test( x = x, n = n, p = 0.25, alternative = "greater")z_score <- sqrt(res_test$statistic) * sign(p_hat - 0.25)names(z_score) <- "z"ket_luan <- ifelse( res_test$p.value < 0.05, "Bác bỏ H0: Có bằng chứng tỷ lệ rời mạng vượt 25%", "Không bác bỏ H0: Chưa đủ bằng chứng tỷ lệ rời mạng vượt 25%")summary_table <- tibble::tibble( `Tỷ lệ mẫu` = scales::percent(p_hat, accuracy = 0.01), `Cận dưới CI 95%` = scales::percent(test_95$conf.int[1], accuracy = 0.01), `Cận trên CI 95%` = scales::percent(test_95$conf.int[2], accuracy = 0.01), `Trị số kiểm định Z` = round(as.numeric(z_score), 4), `P-value` = format.pval(res_test$p.value, digits = 4), `Kết luận thống kê` = ket_luan)knitr::kable( summary_table, caption = "Bảng tóm tắt kết quả kiểm định tỷ lệ khách hàng rời mạng", align = "c")```### 20. Báo cáo khuyến nghị quản trịKết quả phân tích cho thấy tỷ lệ khách hàng rời mạng mẫu là `r scales::percent(p_hat, accuracy = 0.01)`. Khoảng tin cậy 95% giúp ước lượng khoảng dao động hợp lý của tỷ lệ rời mạng thực tế trong tổng thể khách hàng. Đồng thời, kiểm định một phía với giả thuyết (H_0: p \leq 0.25) và (H_1: p \> 0.25) được sử dụng để xem tỷ lệ rời mạng có vượt ngưỡng 25% hay không. Dựa trên P-value thu được là `r format.pval(res_test$p.value, digits = 4)`, nếu P-value nhỏ hơn mức ý nghĩa (\alpha = 0.05), em có cơ sở bác bỏ (H_0), tức là dữ liệu mẫu cho thấy tỷ lệ rời mạng thực tế có khả năng vượt quá 25%.Với vai trò tư vấn cho Giám đốc Chăm sóc khách hàng, em cho rằng tuyên bố “giữ tỷ lệ khách hàng rời mạng dưới 25%” cần được xem xét lại nếu kết quả kiểm định có ý nghĩa thống kê. Tuy nhiên, quyết định quản trị không nên chỉ dựa vào ý nghĩa thống kê. Nhà quản trị cần đánh giá thêm ý nghĩa thực tiễn, tức là mức vượt 25% có đủ lớn để gây thiệt hại tài chính nghiêm trọng hay không. Nếu tỷ lệ mẫu chỉ vượt ngưỡng khoảng 1.54%, doanh nghiệp nên so sánh chi phí triển khai chiến dịch giữ chân khách hàng với thiệt hại do phần vượt mức này gây ra.Sai lầm Loại I trong bài toán này là bác bỏ (H_0) khi thực tế tỷ lệ rời mạng vẫn chưa vượt quá 25%. Khi đó, doanh nghiệp có thể phạt hoặc đánh giá sai bộ phận Chăm sóc khách hàng dù họ vẫn đang làm tốt. Để giảm rủi ro này, ban giám đốc nên dùng mức ý nghĩa nghiêm ngặt hơn như 1%, kết hợp thêm khoảng tin cậy 99%, phân tích dữ liệu theo nhiều kỳ và kiểm tra thêm các yếu tố tài chính trước khi ra quyết định kỷ luật hoặc triển khai chiến dịch lớn.