library(openxlsx)
library(DT)
library(pander)
library(readr)
library(ggplot2)
library(dplyr)
library(skimr)
library(psych)
library(formattable)
library(htmltools)
library(DescTools)
library(epitools)
library(pROC)
d <- read.xlsx("/Users/phamxuanhoan/Downloads/Dldtb5.xlsx")
Bộ dữ liệu Bank Marketing Dataset chứa tổng cộng 41188 quan sát với 21 biến đặc trưng mô tả thông tin liên quan đến việc khách hàng có đăng kí sản phẩm ngân hàng sau chiến dịch tiếp thị hay không. Việc hiểu rõ cấu trúc và ý nghĩa của các biến là bước đầu quan trọng trong quá trình phân tích và xử lý dữ liệu.
Dữ liệu Bank Marketing Dataset là một tập dữ liệu chứa thông tin từ các chiến dịch tiếp thị qua điện thoại của một ngân hàng Bồ Đào Nha nhằm quảng bá sản phẩm tiền gửi có kỳ hạn (term deposit). Tập dữ liệu bao gồm 41.188 bản ghi, và 21 biến đặc trưng mỗi bản ghi tương ứng với một khách hàng, cùng nhiều biến số mô tả các đặc điểm cá nhân (tuổi, nghề nghiệp, tình trạng hôn nhân, trình độ học vấn…), hành vi tài chính (có vay nhà, vay tiêu dùng…), thông tin liên hệ (phương thức liên hệ, số lần liên lạc, thời gian liên hệ…) và kết quả của chiến dịch (khách hàng có đăng ký sản phẩm hay không). Nhờ độ chi tiết và quy mô lớn, dữ liệu này thường được sử dụng trong các bài toán phân tích khách hàng, dự báo hành vi và xây dựng mô hình học máy.
Mục đích của nghiên cứu này là khám phá các yếu tố có ảnh hưởng đến quyết định đăng ký sản phẩm tiền gửi có kỳ hạn của khách hàng sau chiến dịch tiếp thị. Cụ thể, nghiên cứu tập trung kiểm định xem các biến như tình trạng hôn nhân (marital), hình thức liên hệ (contact), độ tuổi, và tình trạng vay nợ (loan, housing) có liên quan thống kê đến hành vi đăng ký sản phẩm hay không. Qua đó, nghiên cứu giúp xác định nhóm khách hàng tiềm năng, hỗ trợ ngân hàng thiết kế các chiến dịch tiếp thị hiệu quả hơn và tối ưu hóa nguồn lực phân phối.
names(d)
## [1] "age" "job" "marital" "education"
## [5] "default" "housing" "loan" "contact"
## [9] "month" "day_of_week" "duration" "campaign"
## [13] "pdays" "previous" "poutcome" "emp.var.rate"
## [17] "cons.price.idx" "cons.conf.idx" "euribor3m" "nr.employed"
## [21] "y"
str(d)
## 'data.frame': 41188 obs. of 21 variables:
## $ age : num 56 57 37 40 56 45 59 41 24 25 ...
## $ job : chr "housemaid" "services" "services" "admin." ...
## $ marital : chr "married" "married" "married" "married" ...
## $ education : chr "basic.4y" "high.school" "high.school" "basic.6y" ...
## $ default : chr "no" "unknown" "no" "no" ...
## $ housing : chr "no" "no" "yes" "no" ...
## $ loan : chr "no" "no" "no" "no" ...
## $ contact : chr "telephone" "telephone" "telephone" "telephone" ...
## $ month : chr "may" "may" "may" "may" ...
## $ day_of_week : chr "mon" "mon" "mon" "mon" ...
## $ duration : num 261 149 226 151 307 198 139 217 380 50 ...
## $ campaign : num 1 1 1 1 1 1 1 1 1 1 ...
## $ pdays : num 999 999 999 999 999 999 999 999 999 999 ...
## $ previous : num 0 0 0 0 0 0 0 0 0 0 ...
## $ poutcome : chr "nonexistent" "nonexistent" "nonexistent" "nonexistent" ...
## $ emp.var.rate : num 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 ...
## $ cons.price.idx: num 94 94 94 94 94 ...
## $ cons.conf.idx : num -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 -36.4 ...
## $ euribor3m : num 4.86 4.86 4.86 4.86 4.86 ...
## $ nr.employed : num 5191 5191 5191 5191 5191 ...
## $ y : chr "no" "no" "no" "no" ...
Tên biến | Mô tả |
---|---|
Job |
Nghề nghiệp (blue-collar, entrepreneur, technician,…) |
Age |
Tuổi của khách hàng (số nguyên) |
Marital |
Tình trạng hôn nhân (single, married, divorced) |
Education |
Trình độ học vấn (basic.9y, high.school, university.degree,…) |
Default |
Khách hàng có nợ xấu (từng không trả đúng hạn khoản vay) (yes/no/unknown) |
Housing |
Khách hàng có vay mua nhà không (yes/no) |
Loan |
Khách hàng có vay tiêu dùng không (yes/no) |
Contact |
Phương thức liên lạc (cellular, telephone) |
Month |
Tháng thực hiện cuộc gọi marketing (may, jun, …) |
Day_of_week |
Thứ trong tuần gọi điện (mon, tue, wed, …) |
Duration |
Thời gian (giây) của cuộc gọi marketing hiện tại |
Campaign |
Số lần liên hệ với khách hàng trong chiến dịch hiện tại |
P_days |
Số ngày kể từ lần liên hệ gần nhất (-1 hoặc 999 = chưa từng liên hệ) |
Previous |
Số lần liên hệ trước đó trong quá khứ |
Poutcome |
Kết quả của chiến dịch marketing trước đó (success/failure/nonexistent) |
y |
Kết quả có đăng ký tiền gửi không |
dldt <- c("job" , "marital" , "education" , "default" , "housing" , "loan" , "contact" , "month" , "day_of_week" , "poutcome" , "y")
dldt
## [1] "job" "marital" "education" "default" "housing"
## [6] "loan" "contact" "month" "day_of_week" "poutcome"
## [11] "y"
dt <- d[, dldt]
head(dt)
## job marital education default housing loan contact month
## 1 housemaid married basic.4y no no no telephone may
## 2 services married high.school unknown no no telephone may
## 3 services married high.school no yes no telephone may
## 4 admin. married basic.6y no no no telephone may
## 5 services married high.school no no yes telephone may
## 6 services married basic.9y unknown no no telephone may
## day_of_week poutcome y
## 1 mon nonexistent no
## 2 mon nonexistent no
## 3 mon nonexistent no
## 4 mon nonexistent no
## 5 mon nonexistent no
## 6 mon nonexistent no
tail(dt)
## job marital education default housing loan contact
## 41183 unemployed single basic.4y no yes no cellular
## 41184 retired married professional.course no yes no cellular
## 41185 blue-collar married professional.course no no no cellular
## 41186 retired married university.degree no yes no cellular
## 41187 technician married professional.course no no no cellular
## 41188 retired married professional.course no yes no cellular
## month day_of_week poutcome y
## 41183 nov fri success no
## 41184 nov fri nonexistent yes
## 41185 nov fri nonexistent no
## 41186 nov fri nonexistent no
## 41187 nov fri nonexistent yes
## 41188 nov fri failure no
any(is.na(dt))
## [1] FALSE
# Kiểm tra kiểu dữ liệu của từng biến trong dldt
sapply(dt, class)
## job marital education default housing loan
## "character" "character" "character" "character" "character" "character"
## contact month day_of_week poutcome y
## "character" "character" "character" "character" "character"
dt <- data.frame(lapply(dt, as.factor))
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$marital)/sum(nrow(dt))
##
## divorced married single unknown
## 0.111974361 0.605224823 0.280858502 0.001942313
Nhận xét: Bảng tần suất cho thấy phần lớn khách hàng thuộc nhóm đã kết hôn (married: 60.5%), theo sau là nhóm độc thân (single: 28.1%). Tỷ lệ khách hàng đã ly hôn (divorced) chiếm khoảng 11.2%, còn nhóm không rõ (unknown) chiếm tỷ lệ rất nhỏ (0.2%). Điều này phản ánh dữ liệu có tính thiên lệch về phía nhóm “married”, có thể ảnh hưởng đến các phân tích liên quan.
Bảng tần số
#Lập bảng tần số biến
table(dt$marital)
##
## divorced married single unknown
## 4612 24928 11568 80
Nhận xét: Bảng tần suất cho thấy phần lớn khách hàng thuộc nhóm đã kết hôn (married: 60.5%), theo sau là nhóm độc thân (single: 28.1%). Tỷ lệ khách hàng đã ly hôn (divorced) chiếm khoảng 11.2%, còn nhóm không rõ (unknown) chiếm tỷ lệ rất nhỏ (0.2%). Điều này phản ánh dữ liệu có tính thiên lệch về phía nhóm “married”, có thể ảnh hưởng đến các phân tích liên quan.
Biểu đồ
marital_freq <- table(dt$marital)
marital_pct <- marital_freq / nrow(dt)
# Tạo bảng tần suất và tính phần trăm
marital_df <- as.data.frame(table(dt$marital))
colnames(marital_df) <- c("marital", "Count")
# Tính phần trăm và vị trí nhãn
marital_df <- marital_df %>%
arrange(desc(marital)) %>%
mutate(
Percent = Count / sum(Count),
Label = paste0(round(Percent * 100, 1), "%"), # Chỉ còn phần trăm
cumpercent = cumsum(Percent),
ypos = cumpercent - Percent / 2
)
# Vẽ biểu đồ tròn chỉ hiển thị phần trăm ở giữa mỗi phần
ggplot(marital_df, aes(x = "", y = Percent, fill = marital)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(y = ypos, label = Label), size = 5, color = "black") + # Nhãn nằm giữa mỗi phần
scale_fill_manual(values = c("married" = "lightblue",
"single" = "green",
"divorced" = "lightpink",
"unknown" = "yellow")) +
theme_void() +
labs(title = "Biểu đồ tần suất tình trạng hôn nhân")
Nhận xét:
Biểu đồ tròn thể hiện phân bố tình trạng hôn nhân (Marital) cho thấy sự phân bố không đồng đều giữa các nhóm. Nhóm “Married” (Đã kết hôn) chiếm tỷ lệ lớn nhất với 60.5%, cho thấy phần lớn đối tượng trong dữ liệu là người đã kết hôn. Tiếp theo, nhóm “Single” (Độc thân) chiếm 28.1%, cũng chiếm một tỷ lệ đáng kể, trong khi nhóm “Divorced” (Ly hôn) chỉ chiếm 11.2%, tỷ lệ này khá thấp. Nhóm “Unknown” (Không rõ) chiếm tỷ lệ nhỏ nhất với 0.2%, cho thấy có rất ít dữ liệu không xác định tình trạng hôn nhân.
Biểu đồ cung cấp cái nhìn tổng quan về sự phân bố các trạng thái hôn nhân, giúp người xem nhanh chóng nhận biết được tỷ lệ phần trăm của từng nhóm. Màu sắc trong biểu đồ được sử dụng hợp lý và phân biệt rõ ràng các nhóm, làm cho biểu đồ dễ hiểu và dễ dàng so sánh các tỷ lệ. Chú giải (legend) bên phải biểu đồ cung cấp thông tin bổ sung, hỗ trợ người xem nhận diện từng nhóm một cách chính xác. Biểu đồ này là công cụ hữu ích để thể hiện sự phân bố các tình trạng hôn nhân trong tập dữ liệu một cách trực quan và dễ hiểu.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$loan)/sum(nrow(dt))
##
## no unknown yes
## 0.82426920 0.02403613 0.15169467
Nhận xét: Bảng tần suất của biến Loan (vay tiêu dùng) phản ánh tỷ lệ phần trăm khách hàng trong từng nhóm. Nhóm “no” (không vay tiêu dùng) chiếm tỷ lệ lớn nhất với 82.43%, cho thấy phần lớn khách hàng trong tập dữ liệu không có khoản vay tiêu dùng. Nhóm “yes” (có vay tiêu dùng) chiếm 15.16%, thấp hơn đáng kể so với nhóm “no”, nhưng vẫn là một tỷ lệ đáng lưu ý. Nhóm “unknown” (không rõ) chiếm tỷ lệ rất nhỏ, chỉ 2.40%, cho thấy phần lớn dữ liệu đều được ghi nhận rõ ràng. Sự chênh lệch tỷ lệ giữa “no” và “yes” là khoảng 67 điểm phần trăm, thể hiện sự khác biệt rõ rệt trong thói quen vay tiêu dùng của khách hàng.
Bảng tần số
#Lập bảng tần số biến
table(dt$loan)
##
## no unknown yes
## 33950 990 6248
Nhận xét: Bảng tần số cung cấp số lượng thực tế các khách hàng trong từng nhóm của biến Loan. Có 33,950 khách hàng không vay tiêu dùng (no), chiếm số lượng áp đảo. Trong khi đó, 6,248 khách hàng có vay tiêu dùng (yes), chỉ bằng khoảng 18.4% so với nhóm “no”. Nhóm “unknown” có 990 trường hợp, là số lượng rất nhỏ, chiếm chưa đến 3% tổng số mẫu. Từ bảng này, ta thấy rõ phần lớn khách hàng trong dữ liệu không có khoản vay tiêu dùng, và số liệu bị thiếu gần như không ảnh hưởng đáng kể đến tổng thể.
Biểu đồ
# Bước 1: Tính tần suất theo loan
loan_freq <- table(dt$loan) # Đếm số lượng từng biểu hiện
loan_df <- as.data.frame(loan_freq) # Chuyển sang data.frame
colnames(loan_df) <- c("loan", "Count") # Đặt tên cột
# Bước 2: Vẽ biểu đồ cột
ggplot(loan_df, aes(x = reorder(loan, -Count), y = Count, fill = loan)) +
geom_bar(stat = "identity") +
geom_text(aes(label = Count), vjust = -0.5, size = 4) + # Hiển thị số ở trên mỗi cột
labs(title = "Biểu đồ Phân bố số lượng theo vay tiêu dùng (loan)",
x = "Vay tiêu dùng",
y = "Số lượng") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_brewer(palette = "Set3") +
guides(fill = guide_none()) # Ẩn chú giải nếu bạn muốn
Nhận xét - Biểu đồ cột minh họa trực quan sự phân bố số lượng khách hàng theo tình trạng vay tiêu dùng. Nhóm “no” có cột cao nhất với 33,950 người, thể hiện rằng phần lớn khách hàng không có khoản vay. Nhóm “yes” có cột thấp hơn nhiều, với 6,248 người, cho thấy đây là nhóm thiểu số. Nhóm “unknown” có cột thấp nhất với 990 người, xác nhận rằng dữ liệu bị thiếu là rất ít. - Các nhãn số liệu được hiển thị trực tiếp trên từng cột giúp người xem dễ dàng so sánh và nắm bắt thông tin. Biểu đồ làm nổi bật sự khác biệt lớn giữa các nhóm và hỗ trợ việc đánh giá xu hướng tài chính của khách hàng một cách trực quan.
# Tạo bảng tần suất phần trăm
loan_df <- as.data.frame(table(dt$loan))
colnames(loan_df) <- c("loan", "Count")
loan_df$Percent <- loan_df$Count / sum(loan_df$Count) * 100
# Vẽ biểu đồ cột ngang theo phần trăm
ggplot(loan_df, aes(x = Percent, y = reorder(loan, Percent), fill = loan)) +
geom_col(width = 0.6) +
geom_text(aes(label = paste0(round(Percent, 1), "%")),
hjust = -0.1, size = 4) +
labs(title = "Biểu đồ cột ngang tần suất vay tiêu dùng (loan)",
x = "Tần suất (%)", y = "Vay tiêu dùng") +
theme_minimal() +
scale_fill_brewer(palette = "Set2") +
xlim(0, max(loan_df$Percent) * 1.15) # chừa chỗ cho nhãn
Nhận xét: - Biểu đồ cột minh họa trực quan sự phân bố số lượng khách hàng theo tình trạng vay tiêu dùng. Nhóm “no” có cột cao nhất với 33,950 người, thể hiện rằng phần lớn khách hàng không có khoản vay. Nhóm “yes” có cột thấp hơn nhiều, với 6,248 người, cho thấy đây là nhóm thiểu số. Nhóm “unknown” có cột thấp nhất với 990 người, xác nhận rằng dữ liệu bị thiếu là rất ít. - Các nhãn số liệu được hiển thị trực tiếp trên từng cột giúp người xem dễ dàng so sánh và nắm bắt thông tin. Biểu đồ làm nổi bật sự khác biệt lớn giữa các nhóm và hỗ trợ việc đánh giá xu hướng tài chính của khách hàng một cách trực quan.
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$contact)/sum(nrow(dt))
##
## cellular telephone
## 0.634748 0.365252
Nhận xét: Bảng tần suất của biến Contact (phương thức liên hệ với khách hàng) cho thấy sự chênh lệch rõ ràng giữa hai hình thức liên lạc. Nhóm “cellular” (liên hệ qua điện thoại di động) chiếm tỷ lệ cao nhất, lên tới 63.47%, trong khi nhóm “telephone” (liên hệ qua điện thoại cố định) chỉ chiếm 36.53%. Điều này cho thấy phương thức liên hệ chủ yếu trong chiến dịch tiếp thị là sử dụng điện thoại di động, có thể do tính linh hoạt, tiện lợi và hiệu quả cao hơn so với điện thoại cố định. Tỷ lệ chênh lệch khoảng 27 điểm phần trăm phản ánh xu hướng ưa chuộng sử dụng di động trong hoạt động giao tiếp với khách hàng.
Bảng tần số
#Lập bảng tần số biến
table(dt$contact)
##
## cellular telephone
## 26144 15044
Nhận xét: Bảng tần số cung cấp cái nhìn cụ thể hơn về số lượng khách hàng theo từng phương thức liên hệ. Có 26,144 khách hàng được liên hệ qua “cellular”, cao hơn đáng kể so với 15,044 người được liên hệ qua “telephone”. Số lượng sử dụng điện thoại di động gấp khoảng 1.74 lần so với điện thoại cố định. Điều này không chỉ cho thấy sự phổ biến của điện thoại di động mà còn cho thấy doanh nghiệp có xu hướng ưu tiên phương thức này trong quá trình liên lạc nhằm đạt hiệu quả cao hơn trong việc tiếp cận khách hàng.
Biểu đồ
# Tạo bảng tần suất
contact_freq <- as.data.frame(table(dt$contact))
colnames(contact_freq) <- c("Contact", "Count")
# Tính phần trăm và vị trí hiển thị nhãn
contact_freq <- contact_freq %>%
arrange(desc(Contact)) %>%
mutate(
Percent = Count / sum(Count) * 100,
Label = paste0(round(Percent, 1), "%"), # Chỉ hiển thị phần trăm
cumpercent = cumsum(Percent),
ypos = cumpercent - Percent / 2
)
# Vẽ biểu đồ tròn chỉ hiển thị phần trăm
ggplot(contact_freq, aes(x = "", y = Percent, fill = Contact)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y", start = 0) +
geom_text(aes(y = ypos, label = Label), size = 5, color = "black") + # Chỉ nhãn phần trăm
scale_fill_brewer(palette = "Pastel1") +
labs(title = "Biểu đồ tần suất cách thức liên hệ (Contact)") +
theme_void()
Nhận xét
Bảng tần suất
#Lập bảng tần suất của biến
table(dt$y)/sum(nrow(dt))
##
## no yes
## 0.8873458 0.1126542
Nhận xét: Bảng tần suất cho biết tỷ lệ phần trăm giữa các nhóm. Cụ thể, nhóm “no” chiếm 88.73%, trong khi nhóm “yes” chỉ chiếm 11.27%. Như vậy, gần 9 trên 10 người được tiếp thị đã từ chối đăng ký, trong khi chỉ có hơn 1 trên 10 người đồng ý đăng ký. Điều này cho thấy hiệu quả tiếp thị trong chiến dịch này là khá thấp, với tỷ lệ chuyển đổi thấp hơn kỳ vọng.
Bảng tần số
#Lập bảng tần số biến
table(dt$y)
##
## no yes
## 36548 4640
Nhận xét: Bảng tần số cho thấy tổng cộng có 41,188 khách hàng được khảo sát. Trong đó, 36,548 khách hàng không đăng ký (no) và chỉ 4,640 khách hàng đăng ký (yes) sau khi tiếp thị. Điều này phản ánh một sự chênh lệch rất lớn giữa hai nhóm, khi số người không đăng ký chiếm áp đảo hoàn toàn so với nhóm đăng ký.
Biểu đồ
# Lập bảng tần số biến y
y_freq <- as.data.frame(table(dt$y))
colnames(y_freq) <- c("y", "Count")
# Vẽ biểu đồ cột ngang với chú thích
ggplot(y_freq, aes(x = reorder(y, Count), y = Count, fill = y)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ Phân bố số khách hàng đăng ký sau tiếp thị (y)",
x = "Biểu hiện",
y = "Số lượng",
fill = "Biểu hiện") +
theme_minimal() +
coord_flip() +
scale_fill_brewer(palette = "Pastel2")
Nhận xét:
library(ggplot2)
library(dplyr)
# Tạo bảng tần suất và phần trăm
y_freq <- as.data.frame(table(dt$y))
colnames(y_freq) <- c("y", "Count")
# Tính phần trăm
y_freq <- y_freq %>%
arrange(desc(y)) %>% # Sắp xếp để tính đúng vị trí
mutate(
Percent = Count / sum(Count) * 100,
Label = paste0(round(Percent, 1), "%"),
cumpercent = cumsum(Percent),
ypos = cumpercent - Percent / 2 # Vị trí trung tâm theo phần trăm
)
# Vẽ biểu đồ tròn
ggplot(y_freq, aes(x = "", y = Percent, fill = y)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y", start = 0) +
geom_text(aes(y = ypos, label = Label), color = "black", size = 4) +
scale_fill_manual(values = c("no" = "#FBB4AE", "yes" = "#B3CDE3")) +
labs(title = "Biểu đồ Tần suất khách hàng đăng ký sau tiếp thị (y)") +
theme_void()
Nhận xét:
Biểu đồ tròn trên thể hiện tần suất đăng ký dịch vụ của khách hàng sau tiếp thị, được biểu diễn qua biến y với hai giá trị: “yes” (đồng ý đăng ký) và “no” (không đăng ký). Tỷ lệ khách hàng trả lời “no” chiếm phần lớn diện tích biểu đồ, tương ứng 88.7%, trong khi chỉ 11.3% khách hàng chọn “yes”.
Điều này phản ánh một thực tế đáng chú ý: phần lớn khách hàng không bị thuyết phục bởi chiến dịch tiếp thị. Với gần 9 trên 10 người từ chối đăng ký, hiệu quả của hoạt động marketing là khá thấp. Sự chênh lệch lớn giữa hai nhóm được minh họa rõ qua biểu đồ tròn, với phần màu hồng (no) lấn át hoàn toàn phần màu xanh (yes). Đây là dấu hiệu cho thấy cần đánh giá lại chiến lược tiếp thị hiện tại, từ thông điệp truyền tải đến cách tiếp cận khách hàng, nhằm nâng cao tỷ lệ chuyển đổi trong các chiến dịch tương lai.
Ước lượng khoảng tin cậy
# Số người đã kết hôn
n_married <- sum(dt$marital == "married")
# Tổng số quan sát
n_total <- nrow(dt)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ người đã kết hôn
prop.test(n_married, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_married out of n_total, null probability 0.5
## X-squared = 1823.8, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.6004825 0.6099475
## sample estimates:
## p
## 0.6052248
Giả thuyết kiểm định:
H₀: Tỷ lệ kết hôn thực tế là 50% (\(p = 0.50\))
H₁: Tỷ lệ kết hôn thực tế khác 50% (\(p \ne 50\))
Với p-value = 0.605 > 0.05, ta bác bỏ giả thuyết H₀ ở mức ý nghĩa 5%. Điều này nghĩa là: Tỷ lệ kết hôn thực tế không phải là 50%. Theo kết quả kiểm định, tỷ lệ kết hôn thực tế (p = 0.6052248) là khoảng 60.5%, và khoảng tin cậy 95% cho tỷ lệ này là từ 0.6004825 đến 0.6099475. Điều này cho thấy tỷ lệ kết hôn thực tế cao hơn 50%, và sự khác biệt giữa tỷ lệ thực tế và tỷ lệ giả thuyết (50%) là có ý nghĩa thống kê.
Ước lượng khoảng tin cậy
# Số người có vay tiêu dùng
n_loan <- sum(dt$loan == "yes")
# Tổng số quan sát
n_total <- nrow(dt)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ người có khoản vay tiêu dùng
prop.test(n_loan, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_loan out of n_total, null probability 0.5
## X-squared = 19986, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1482508 0.1552038
## sample estimates:
## p
## 0.1516947
Giả thuyết kiểm định:
H₀: Tỷ lệ khách hàng có khoản vay tiêu dùng (“loan = yes”) bằng hoặc lớn hơn 50% (p ≥ 0.5).
H₁: Tỷ lệ khách hàng có khoản vay tiêu dùng (“loan = yes”) khác 50% (p ≠ 0.5).
Kết quả kiểm định tỉ lệ một mẫu cho thấy tỷ lệ khách hàng có khoản vay tiêu dùng là 0.1517, tương đương khoảng 15.17%. Đây là giá trị tỷ lệ mẫu được ước lượng từ dữ liệu thực tế. So với giá trị giả định 50%, tỷ lệ này thấp hơn đáng kể.
Khoảng tin cậy 95% cho tỉ lệ này nằm trong khoảng [0.1483; 0.1552], nghĩa là chúng ta có thể tin tưởng 95% rằng tỷ lệ thực sự của toàn bộ khách hàng trong dân số nằm trong khoảng này. Đặc biệt, khoảng tin cậy này hoàn toàn nằm dưới 0.5, củng cố thêm bằng chứng rằng tỷ lệ thực tế thấp hơn mức giả định.
Giá trị p-value thu được từ kiểm định là rất nhỏ (p-value < 2.2e-16), thấp hơn rất nhiều so với mức ý nghĩa thông thường α = 0.05. Điều này dẫn đến bác bỏ giả thuyết H₀, tức là có đủ bằng chứng thống kê để khẳng định rằng tỷ lệ khách hàng có khoản vay tiêu dùng khác 50% (và cụ thể là thấp hơn đáng kể).
Ước lượng khoảng tin cậy
# Số người được liên hệ bằng điện thoại
n_contact <- sum(dt$contact == "telephone")
# Tổng số quan sát
n_total <- nrow(dt)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ người chưa từng kết hôn
prop.test(n_contact, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_contact out of n_total, null probability 0.5
## X-squared = 2990.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3606026 0.3699266
## sample estimates:
## p
## 0.365252
Giả thuyết kiểm định:
H₀: Tỷ lệ khách hàng được liên hệ bằng điện thoại cố định bằng 50% (p = 0.5).
H₁: Tỷ lệ khách hàng được liên hệ bằng điện thoại cố định khác 50% (p ≠ 0.5).
Kiểm định cho kết quả p-value = 0.8189.
Dựa trên kết quả hiển thị, tỷ lệ khách hàng được liên hệ bằng điện thoại cố định (telephone) là 36.52% (tương ứng với 15,044 người trên tổng số 40,188 khách hàng). Kết quả kiểm định tỉ lệ với mức ý nghĩa 5% (α = 0.05) đã cho ra p-value < 2.2e-16, cho thấy có đủ bằng chứng thống kê để bác bỏ giả thuyết H₀.
Khoảng tin cậy 95% cho tỷ lệ khách hàng được liên hệ bằng điện thoại cố định là [0.360, 0.371], nghĩa là tỷ lệ thực sự trong tổng thể nhiều khả năng nằm trong khoảng từ 36.0% đến 37.1%. Vì khoảng này không chứa giá trị 0.5, nên điều này khẳng định rằng tỷ lệ này khác biệt có ý nghĩa thống kê so với giả định 50%.
Ước lượng khoảng tin cậy
# Số người đăng kí sau chiến dịch tiếp thị
n_y <- sum(dt$y == "yes")
# Tổng số quan sát
n_total <- nrow(dt)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ người đăng kí sau chiến dịch tiếp thị
prop.test(n_y, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_y out of n_total, null probability 0.5
## X-squared = 24717, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1096248 0.1157560
## sample estimates:
## p
## 0.1126542
Giả thuyết kiểm định:
H₀: Tỷ lệ khách hàng đăng ký sau chiến dịch tiếp thị là 50% (p = 0.5).
H₁: Tỷ lệ khách hàng đăng ký sau chiến dịch tiếp thị khác 50% (p ≠ 0.5).
Kết quả cho thấy tỷ lệ khách hàng đăng ký sau chiến dịch tiếp thị là 11.27% (p = 0.1126542). Đây là một tỷ lệ khá thấp, phản ánh thực tế rằng phần lớn khách hàng không phản hồi tích cực với chiến dịch tiếp thị. Khoảng tin cậy 95% cho tỷ lệ này nằm trong khoảng từ 10.96% đến 11.58%, nghĩa là trong quần thể khách hàng, tỷ lệ thực sự có thể dao động trong giới hạn này.
Giá trị p-value < 2.2e-16, rất nhỏ so với mức ý nghĩa α = 0.05, cho thấy có đủ bằng chứng thống kê để bác bỏ giả thuyết H₀. Do đó, có thể khẳng định rằng tỷ lệ khách hàng đăng ký sau chiến dịch tiếp thị khác biệt có ý nghĩa thống kê so với mức 50% giả định.
Bảng tần số
table(dt$contact)
##
## cellular telephone
## 26144 15044
table(dt$y)
##
## no yes
## 36548 4640
# Gán nhãn rõ ràng cho các biến
dt$contact <- factor(dt$contact,
levels = c("telephone", "cellular"),
labels = c("telephone", "cellular"))
dt$y <- factor(dt$y,
levels = c("no", "yes"),
labels = c("no", "yes"))
# Lập bảng tần số chéo giữa contact và y
ray <- table(dt$contact, dt$y)
# Thêm tổng hàng và tổng cột
ray1 <- addmargins(ray)
# Hiển thị bảng với nhãn rõ ràng
ray1
##
## no yes Sum
## telephone 14257 787 15044
## cellular 22291 3853 26144
## Sum 36548 4640 41188
Nhận xét: Bảng tần số tuyệt đối cho thấy sự khác biệt đáng kể về số lượng người vay tiêu dùng giữa hai nhóm phương thức liên hệ. Trong tổng số 15,044 khách hàng được liên hệ qua điện thoại bàn (telephone), chỉ có 787 người vay tiêu dùng. Trong khi đó, nhóm khách hàng được liên hệ qua điện thoại di động (cellular) có tổng số 26,144 người, trong đó có tới 3,853 người đồng ý vay. Mặc dù nhóm cellular có quy mô lớn hơn, sự chênh lệch số tuyệt đối giữa hai nhóm vẫn gợi ý rằng phương thức liên hệ có thể liên quan đến hành vi vay tiêu dùng của khách hàng.
Sắp xếp lại các biểu hiện trong bảng tần số
# Lập bảng tần số chéo giữa contact và y
ray <- table(dt$contact, dt$y)
# Sắp xếp lại cột để 'yes' nằm bên trái
ray_reorder <- ray[, c("yes", "no")]
# Thêm tổng hàng và tổng cột
ray_final <- addmargins(ray_reorder)
# Hiển thị bảng tần số mới
ray_final
##
## yes no Sum
## telephone 787 14257 15044
## cellular 3853 22291 26144
## Sum 4640 36548 41188
Bảng tần suất
# Tạo bảng tần suất chéo (theo hàng)
contact_hosp_freq <- prop.table(table(dt$contact, dt$y), margin = 1)
# Làm tròn kết quả cho dễ đọc
contact_hosp_freq <- round(contact_hosp_freq, 4)
# Hiển thị bảng
contact_hosp_freq
##
## no yes
## telephone 0.9477 0.0523
## cellular 0.8526 0.1474
Nhận xét: Bảng tần suất cho thấy sự khác biệt rõ rệt về tỷ lệ đồng ý vay giữa hai nhóm. Cụ thể, chỉ 5.23% khách hàng được liên hệ qua telephone đồng ý vay, trong khi tỷ lệ này ở nhóm cellular là 14.74%. Điều này cho thấy nhóm khách hàng được liên hệ qua điện thoại di động có xu hướng đồng ý vay nhiều hơn gần 3 lần so với nhóm được liên hệ qua điện thoại bàn. Tỷ lệ này phản ánh một xu hướng nhất quán, cho thấy phương thức liên hệ là một yếu tố có thể ảnh hưởng đến hiệu quả tiếp cận và thuyết phục khách hàng trong các chiến dịch vay tiêu dùng.
Biểu đồ
# Chuyển bảng sang data.frame
ray_df <- as.data.frame(ray)
colnames(ray_df) <- c("contact", "y", "Count")
# Vẽ biểu đồ tần số
ggplot(ray_df, aes(x = contact, y = Count, fill = y)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = Count),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 4) +
labs(title = "Biểu đồ tần số giữa Contact và Y",
x = "Hình thức liên hệ",
y = "Tần số",
fill = "Kết quả Y") +
theme_minimal() +
scale_fill_brewer(palette = "Pastel2")
Nhận xét
Biểu đồ tần số giữa Contact và Y cho thấy sự khác biệt rõ rệt về số lượng người đồng ý vay (yes) giữa hai hình thức liên hệ. Cụ thể, trong số những người được liên hệ qua điện thoại bàn (telephone), chỉ có 787 người đồng ý vay, trong khi số này ở nhóm được liên hệ qua điện thoại di động (cellular) lên tới 3,853 người.
Đồng thời, số người không vay ở nhóm cellular cũng cao hơn, tuy nhiên mức tăng của nhóm “yes” là đáng kể hơn. Điều này cho thấy nhóm khách hàng được liên hệ qua điện thoại di động có xu hướng đồng ý vay nhiều hơn về mặt số lượng tuyệt đối.
# Lập bảng tần suất (tỷ lệ phần trăm)
ray_prop <- prop.table(ray, margin = 1)
ray_prop_df <- as.data.frame(ray_prop)
colnames(ray_prop_df) <- c("contact", "y", "Percent")
# Vẽ biểu đồ tần suất: cột chồng
ggplot(ray_prop_df, aes(x = contact, y = Percent, fill = y)) +
geom_bar(stat = "identity", position = "fill") +
geom_text(aes(label = scales::percent(Percent, accuracy = 0.1)),
position = position_stack(vjust = 0.5),
size = 4) +
labs(title = "Biểu đồ tần suất giữa Contact và Y",
x = "Hình thức liên hệ",
y = "Tỷ lệ (%)",
fill = "Kết quả Y") +
theme_minimal() +
scale_fill_brewer(palette = "Pastel2")
Nhận xét:
Giả thuyết kiểm định:
H₀: Biến hình thức liên hệ(contact) và kết qủa đăng kí sau chiến dịch là hai biến độc lập.
H₁: Biến hình thức liên hệ(contact) và kết qủa đăng kí sau chiến dịch có liên quan.
# Thực hiện kiểm định Chi bình phương
chi_ray1 <- chisq.test(ray1)
print(chi_ray1)
##
## Pearson's Chi-squared test
##
## data: ray1
## X-squared = 863.27, df = 4, p-value < 2.2e-16
Kết quả kiểm định cho thấy:
# Lập bảng tần số chéo giữa contact và y
ray <- table(dt$contact, dt$y)
# Thêm tổng hàng và tổng cột
ray1 <- addmargins(ray)
# Hiển thị bảng với nhãn rõ ràng
ray1
##
## no yes Sum
## telephone 14257 787 15044
## cellular 22291 3853 26144
## Sum 36548 4640 41188
Giả thuyết kiểm định:
H₀: p₁ - p₂ = 0: Tỷ lệ người đăng kí dùng điện thoại cố định = người đăng kí sử dụng điện thoại di động
H₁: p₁ - p₂ # 0: Tỷ lệ người đăng kí dùng điện thoại cố định # người đăng kí sử dụng điện thoại di động
# Kiểm tra bảng tần số chéo
print(ray)
##
## no yes
## telephone 14257 787
## cellular 22291 3853
# Tách số lượng "yes" theo từng nhóm contact
counts <- c(ray["telephone", "yes"], ray["cellular", "yes"])
# Tính tổng số quan sát theo từng nhóm contact
totals <- c(sum(ray["telephone", ]), sum(ray["cellular", ]))
# Kiểm định tỷ lệ - kiểm tra xem tỷ lệ ở nhóm telephone có nhỏ hơn cellular không?
test_result <- prop.test(counts, totals, alternative = "less", correct = FALSE)
# Hiển thị kết quả
test_result
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts out of totals
## X-squared = 863.27, df = 1, p-value < 2.2e-16
## alternative hypothesis: less
## 95 percent confidence interval:
## -1.00000000 -0.09038101
## sample estimates:
## prop 1 prop 2
## 0.05231321 0.14737607
Nhận xét: Dựa trên kết quả kiểm định tỉ lệ hai mẫu, ta thu được giá trị p-value < 2.2e-16, nhỏ hơn rất nhiều so với mức ý nghĩa α = 0.05. Điều này cho thấy có đủ bằng chứng thống kê để bác bỏ giả thuyết H₀. Nói cách khác, ta chấp nhận giả thuyết H₁: tỷ lệ người đăng ký vay tiêu dùng trong nhóm được liên hệ qua điện thoại bàn (telephone) nhỏ hơn so với nhóm được liên hệ qua điện thoại di động (cellular). Cụ thể, tỷ lệ đăng ký vay ở nhóm telephone là khoảng 5.2%, trong khi ở nhóm cellular là khoảng 14.8%. Sự chênh lệch này có ý nghĩa thống kê, cho thấy hình thức liên hệ qua điện thoại di động hiệu quả hơn trong việc thúc đẩy khách hàng đăng ký vay tiêu dùng.
ray <- table(dt$contact, dt$y)
riskratio(ray, method="wald")
## $data
##
## no yes Total
## telephone 14257 787 15044
## cellular 22291 3853 26144
## Total 36548 4640 41188
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## telephone 1.000000 NA NA
## cellular 2.817186 2.616244 3.033563
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## telephone NA NA NA
## cellular 0 1.838336e-210 9.481264e-190
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét:
Dựa vào bảng kết quả tính tỷ số nguy cơ (Relative Risk - RR), ta có thể nhận xét chi tiết như sau:
Trong hai nhóm được liên hệ qua điện thoại bàn (telephone) và điện thoại di động (cellular), tỷ số nguy cơ cho thấy sự khác biệt rõ rệt về khả năng khách hàng đăng ký vay tiêu dùng. Cụ thể, nhóm được liên hệ qua điện thoại di động có tỷ số nguy cơ (RR) bằng 2.82 (ước lượng chính xác là 2.817186), nghĩa là khách hàng trong nhóm này có nguy cơ đăng ký vay cao gấp gần 2.82 lần so với nhóm được liên hệ qua điện thoại bàn. Khoảng tin cậy 95% cho tỷ số nguy cơ của nhóm cellular là từ 2.616 đến 3.034, cho thấy ước lượng này là chính xác và có độ tin cậy cao.
Ngoài ra, giá trị p-value của nhóm cellular qua các phương pháp kiểm định (midp.exact, fisher.exact và chi-square) đều cực kỳ nhỏ (gần bằng 0), chứng tỏ sự khác biệt về tỷ lệ đăng ký vay giữa hai nhóm là có ý nghĩa thống kê. Nhóm telephone được sử dụng làm nhóm tham chiếu nên có RR = 1.0 và không có khoảng tin cậy vì là chuẩn gốc.
Từ đó, có thể kết luận rằng: việc liên hệ khách hàng qua điện thoại di động hiệu quả hơn đáng kể so với điện thoại bàn trong việc thúc đẩy khách hàng đăng ký vay tiêu dùng. Đây là bằng chứng rõ ràng hỗ trợ cho các kết quả kiểm định trước đó.
result <- oddsratio(ray)
print(result)
## $data
##
## no yes Total
## telephone 14257 787 15044
## cellular 22291 3853 26144
## Total 36548 4640 41188
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## telephone 1.000000 NA NA
## cellular 3.130724 2.893163 3.392136
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## telephone NA NA NA
## cellular 0 1.838336e-210 9.481264e-190
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét:
Dựa vào bảng kết quả phân tích tỷ số chênh (Odds Ratio - OR), ta có thể nhận xét chi tiết như sau:
Tỷ số chênh (OR) giữa hai nhóm khách hàng được liên hệ bằng điện thoại di động (cellular) và điện thoại bàn (telephone) phản ánh xác suất đăng ký vay tiêu dùng trong hai nhóm. Cụ thể, nhóm được liên hệ qua điện thoại di động có OR = 3.13 (ước lượng chính xác là 3.130724), tức là khả năng đăng ký vay của họ cao hơn khoảng 3.13 lần so với nhóm được liên hệ bằng điện thoại bàn.
Khoảng tin cậy 95% của OR nằm trong khoảng [2.89; 3.39], cho thấy ước lượng này đáng tin cậy và có ý nghĩa thống kê. Đồng thời, giá trị p-value từ các phép kiểm định (midp.exact, fisher.exact và chi-square) đều cực kỳ nhỏ (tiệm cận 0), khẳng định sự khác biệt giữa hai nhóm là có ý nghĩa thống kê cao.
Nhóm telephone có OR = 1.0 và không có khoảng tin cậy vì đây là nhóm tham chiếu (reference group). Từ đó có thể kết luận: Khách hàng được liên hệ qua điện thoại di động có xác suất đăng ký vay tiêu dùng cao hơn rõ rệt so với những người được liên hệ bằng điện thoại bàn. Điều này một lần nữa củng cố kết quả từ các kiểm định trước và khuyến nghị rằng phương thức liên hệ qua điện thoại di động có thể mang lại hiệu quả tốt hơn trong chiến dịch tiếp thị.
Chọn biến y (Quyết định đăng ký) làm biến phụ thuộc, biến Marital (Tình trạng hôn nhân) làm biến độc lập.
Bảng tần số
# Kiểm tra giá trị biến marital
table(dt$marital)
##
## divorced married single unknown
## 4612 24928 11568 80
# Gán nhãn cho biến marital
dt$marital <- factor(dt$marital,
levels = c("single", "married", "divorced"),
labels = c("Single", "Married", "Divorced"))
Lập bảng tần số chéo giữa marital và y
marital_tab <- table(dt$marital, dt$y)
# Thêm tổng hàng và tổng cột
marital_tab1 <- addmargins(marital_tab)
marital_tab1
##
## no yes Sum
## Single 9948 1620 11568
## Married 22396 2532 24928
## Divorced 4136 476 4612
## Sum 36480 4628 41108
Nhận xét:
Bảng tần số chéo cho thấy trong 41.108 khách hàng, nhóm đã kết hôn chiếm nhiều nhất (24.928 người), tiếp theo là độc thân (11.568) và đã ly hôn (4.612). Nhóm độc thân có tỷ lệ đăng ký cao nhất (14%), trong khi nhóm đã kết hôn và đã ly hôn chỉ khoảng 10%. Điều này cho thấy tình trạng hôn nhân có liên quan đến hành vi đăng ký, với khách hàng độc thân có xu hướng đăng ký dịch vụ nhiều hơn.
Sắp xếp lại các cột trong bảng
# Sắp xếp cột để “yes” nằm bên trái
marital_tab_reorder <- marital_tab[, c("yes", "no")]
# Thêm tổng
marital_tab_final <- addmargins(marital_tab_reorder)
marital_tab_final
##
## yes no Sum
## Single 1620 9948 11568
## Married 2532 22396 24928
## Divorced 476 4136 4612
## Sum 4628 36480 41108
Bảng tần suất
# Bảng tần suất theo hàng
marital_freq <- prop.table(marital_tab, margin = 1)
marital_freq <- round(marital_freq, 4)
marital_freq
##
## no yes
## Single 0.8600 0.1400
## Married 0.8984 0.1016
## Divorced 0.8968 0.1032
Nhận xét:
Bảng tần suất cho thấy mối quan hệ giữa tình trạng hôn nhân và biến “yes/no”. Trong nhóm Single, tỷ lệ trả lời “yes” là 14,0%, cao hơn so với nhóm Married (10,16%) và Divorced (10,32%). Ngược lại, tỷ lệ “no” chiếm ưu thế ở cả ba nhóm, lần lượt là 86,0% (Single), 89,84% (Married) và 89,68% (Divorced). Điều này cho thấy những người độc thân có xu hướng trả lời “yes” nhiều hơn so với những người đã kết hôn hoặc đã ly hôn, trong khi hai nhóm sau có tỷ lệ “no” tương đối tương đồng và cao hơn.
Biểu đồ
# Chuyển sang data frame để vẽ
marital_df <- as.data.frame(marital_tab)
colnames(marital_df) <- c("Marital", "y", "Count")
# Biểu đồ tần số
ggplot(marital_df, aes(x = Marital, y = Count, fill = y)) +
geom_bar(stat = "identity", position = "dodge") +
geom_text(aes(label = Count), position = position_dodge(width = 0.9),
vjust = -0.3, size = 4) +
labs(title = "Biểu đồ tần số giữa Marital và Y",
x = "Tình trạng hôn nhân",
y = "Tần số", fill = "Kết quả Y") +
theme_minimal() +
scale_fill_brewer(palette = "Pastel2")
Nhận xét
Biểu đồ tần số giữa Marital và Y cho thấy sự khác biệt đáng kể về số lượng người đồng ý (yes) theo từng tình trạng hôn nhân. Cụ thể, nhóm Married có số người trả lời “yes” cao nhất với 2.532 người, vượt xa nhóm Single (1.620 người) và Divorced (476 người).
Tuy nhiên, số người trả lời “no” ở nhóm Married cũng áp đảo (22.396 người), phản ánh rằng mặc dù số “yes” nhiều nhất về mặt tuyệt đối, tỷ lệ “no” vẫn chiếm ưu thế ở tất cả các nhóm. Điều này cho thấy tình trạng hôn nhân có tác động nhất định đến kết quả Y, trong đó nhóm Married đồng ý nhiều hơn về mặt số lượng, nhưng mức độ từ chối vẫn rất cao.
# Biểu đồ tần suất (tỷ lệ phần trăm)
marital_prop <- prop.table(marital_tab, margin = 1)
marital_prop_df <- as.data.frame(marital_prop)
colnames(marital_prop_df) <- c("Marital", "y", "Percent")
ggplot(marital_prop_df, aes(x = Marital, y = Percent, fill = y)) +
geom_bar(stat = "identity", position = "fill") +
geom_text(aes(label = scales::percent(Percent, accuracy = 0.1)),
position = position_stack(vjust = 0.5), size = 4) +
labs(title = "Biểu đồ tần suất giữa Marital và Y",
x = "Tình trạng hôn nhân",
y = "Tỷ lệ (%)", fill = "Kết quả Y") +
theme_minimal() +
scale_fill_brewer(palette = "Pastel2")
Nhận xét:
Biểu đồ tần suất theo tỷ lệ giữa Marital và Y cho thấy sự khác biệt rõ rệt về tỷ lệ “yes” giữa các nhóm tình trạng hôn nhân. Nhóm Single có tỷ lệ “yes” cao nhất (14,0%), trong khi hai nhóm Married (10,2%) và Divorced (10,3%) có tỷ lệ “yes” thấp hơn và gần như tương đương nhau.
Ngược lại, tỷ lệ “no” chiếm ưu thế ở cả ba nhóm (dao động từ 86,0% đến 89,8%), cho thấy phần lớn khách hàng trong mọi tình trạng hôn nhân đều trả lời “no”. Tuy nhiên, việc nhóm Single có tỷ lệ “yes” cao hơn gợi ý rằng những người độc thân có xu hướng đồng ý nhiều hơn so với những người đã kết hôn hoặc ly hôn.
Giả thuyết kiểm định:
H₀: Biến tình trạng hôn nhân (marital) và kết quả Y là hai biến độc lập.
H₁: Biến tình trạng hôn nhân (marital) và kết quả Y có liên quan.
chi_marital <- chisq.test(marital_tab)
chi_marital
##
## Pearson's Chi-squared test
##
## data: marital_tab
## X-squared = 121.61, df = 2, p-value < 2.2e-16
Nhận xét:
Giá trị kiểm định Chi-square = 121.61 với bậc tự do (df) = 2 và p-value < 2.2e-16, nhỏ hơn rất nhiều so với mức ý nghĩa phổ biến α = 0.05.
Do đó, có đủ bằng chứng để bác bỏ giả thuyết H₀. Nói cách khác, kết quả kiểm định cho thấy có mối liên hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và kết quả Y trong bộ dữ liệu này.
Giả thuyết kiểm định:
H₀: Không có sự khác biệt về tỷ lệ (risk difference = 0) giữa hai nhóm tình trạng hôn nhân được so sánh.
H₁: Có sự khác biệt về tỷ lệ (risk difference ≠ 0) giữa hai nhóm tình trạng hôn nhân được so sánh.
# Kiểm định tỉ lệ giữa nhóm Married và Single (hoặc Divorced)
counts_marital <- c(marital_tab["Single","yes"], marital_tab["Married","yes"])
totals_marital <- c(sum(marital_tab["Single",]), sum(marital_tab["Married",]))
prop.test(counts_marital, totals_marital, alternative="two.sided", correct=FALSE)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_marital out of totals_marital
## X-squared = 115.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.03111678 0.04582115
## sample estimates:
## prop 1 prop 2
## 0.1400415 0.1015725
Nhận xét:
Giá trị kiểm định Chi-square = 115.97 với bậc tự do df = 1 và p-value < 2.2e-16, nhỏ hơn rất nhiều so với mức ý nghĩa α = 0.05.
Khoảng tin cậy 95% cho hiệu tỷ lệ (RD) nằm trong khoảng [0.0311; 0.0458], không bao gồm 0.
Ước lượng tỷ lệ mẫu cho thấy nhóm 1 có tỷ lệ “yes” là 14,0%, trong khi nhóm 2 chỉ 10,2%.
Kết luận: Có đủ bằng chứng thống kê để bác bỏ giả thuyết H₀. Nói cách khác, tỷ lệ “yes” giữa hai nhóm hôn nhân khác nhau một cách có ý nghĩa thống kê, với nhóm 1 có xu hướng đồng ý nhiều hơn nhóm 2 khoảng 3,1% – 4,6%.
riskratio(marital_tab, method="wald")
## $data
##
## no yes Total
## Single 9948 1620 11568
## Married 22396 2532 24928
## Divorced 4136 476 4612
## Total 36480 4628 41108
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Single 1.0000000 NA NA
## Married 0.7253031 0.6842072 0.7688674
## Divorced 0.7369889 0.6693171 0.8115027
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Single NA NA NA
## Married 0.000000e+00 3.05560e-26 4.815509e-27
## Divorced 1.386538e-10 1.67124e-10 3.005916e-10
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét:
Dựa vào bảng kết quả tính tỷ số nguy cơ (Relative Risk – RR), có thể nhận xét như sau:
Nhóm Single được chọn làm nhóm tham chiếu (RR = 1.0). So với nhóm này, nhóm Married có RR = 0.73 (khoảng tin cậy 95%: 0.684 – 0.769) và nhóm Divorced có RR = 0.74 (khoảng tin cậy 95%: 0.669 – 0.812). Điều này có nghĩa là khả năng “đồng ý” (yes) của hai nhóm Married và Divorced thấp hơn so với nhóm Single lần lượt khoảng 27% và 26%.
Giá trị p-value của cả hai nhóm Married và Divorced đều cực kỳ nhỏ (≈ 0), cho thấy sự khác biệt về tỷ lệ “yes” giữa các nhóm hôn nhân là có ý nghĩa thống kê.
Kết luận: Nhóm Single có nguy cơ “đồng ý” cao nhất, trong khi nhóm Married và Divorced có tỷ lệ “yes” thấp hơn đáng kể. Điều này củng cố thêm các kết quả kiểm định trước, cho thấy tình trạng hôn nhân có ảnh hưởng rõ rệt đến khả năng khách hàng đồng ý với Y.
oddsratio(marital_tab)
## $data
##
## no yes Total
## Single 9948 1620 11568
## Married 22396 2532 24928
## Divorced 4136 476 4612
## Total 36480 4628 41108
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Single 1.0000000 NA NA
## Married 0.6942345 0.6495405 0.7422068
## Divorced 0.7068792 0.6337228 0.7872161
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Single NA NA NA
## Married 0.000000e+00 3.05560e-26 4.815509e-27
## Divorced 1.386538e-10 1.67124e-10 3.005916e-10
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét:
Dựa vào bảng kết quả phân tích tỷ số chênh (Odds Ratio – OR), có thể nhận xét như sau:
Nhóm Single được chọn làm nhóm tham chiếu (OR = 1.0). So với nhóm này, nhóm Married có OR = 0.69 (khoảng tin cậy 95%: 0.650 – 0.742) và nhóm Divorced có OR = 0.71 (khoảng tin cậy 95%: 0.634 – 0.787). Điều này cho thấy khả năng “yes” (đồng ý) của nhóm Married thấp hơn 31% và nhóm Divorced thấp hơn 29% so với nhóm Single.
Giá trị p-value của cả hai nhóm Married và Divorced đều cực kỳ nhỏ (≈ 0), chứng tỏ sự khác biệt về tỷ lệ “yes” giữa các nhóm là có ý nghĩa thống kê cao.
Kết luận: Nhóm Single có khả năng “yes” cao nhất, trong khi Married và Divorced có xác suất đồng ý thấp hơn rõ rệt. Kết quả này một lần nữa củng cố cho các kiểm định trước đó, khẳng định tình trạng hôn nhân ảnh hưởng đáng kể đến khả năng đồng ý với Y.
Chọn biến loan (Có khoản vay cá nhân hay không) làm biến độc lập.
Bảng tần số
# Gán nhãn cho biến loan
dt$loan <- factor(dt$loan,
levels = c("no", "yes"),
labels = c("Không vay tiêu dùng", "Có vay tiêu dùng"))
# Bảng tần số
loan_tab <- table(dt$loan, dt$y)
loan_tab1 <- addmargins(loan_tab)
loan_tab1
##
## no yes Sum
## Không vay tiêu dùng 30100 3850 33950
## Có vay tiêu dùng 5565 683 6248
## Sum 35665 4533 40198
Nhận xét:
Bảng tần số cho thấy trong tổng số 40.198 quan sát, phần lớn khách hàng thuộc nhóm không vay tiêu dùng với 33.950 người, trong đó 3.850 người trả lời “yes” và 30.100 người trả lời “no”. Nhóm có vay tiêu dùng chiếm tỷ trọng nhỏ hơn với 6.248 người, trong đó có 683 người trả lời “yes” và 5.565 người trả lời “no”. Điều này phản ánh rằng số lượng khách hàng không vay tiêu dùng chiếm ưu thế trong tập dữ liệu.
Bảng tần suất
loan_freq <- prop.table(loan_tab, margin = 1)
loan_freq <- round(loan_freq, 4)
loan_freq
##
## no yes
## Không vay tiêu dùng 0.8866 0.1134
## Có vay tiêu dùng 0.8907 0.1093
Nhận xét:
Bảng tần suất cho thấy tỷ lệ “yes” ở nhóm không vay tiêu dùng là 11,34%, trong khi tỷ lệ này ở nhóm có vay tiêu dùng là 10,93%. Ngược lại, tỷ lệ “no” chiếm đa số ở cả hai nhóm (lần lượt là 88,66% và 89,07%). Điều này cho thấy mặc dù có sự chênh lệch nhẹ về tỷ lệ “yes” giữa hai nhóm, nhưng nhìn chung phần lớn khách hàng trong cả hai nhóm đều trả lời “no”.
Biểu đồ
loan_df <- as.data.frame(loan_tab)
colnames(loan_df) <- c("Loan", "y", "Count")
ggplot(loan_df, aes(x = Loan, y = Count, fill = y)) +
geom_bar(stat="identity", position="dodge") +
geom_text(aes(label=Count), position=position_dodge(width=0.9),
vjust=-0.3, size=4) +
labs(title="Biểu đồ tần số giữa Loan và Y",
x="Khoản vay cá nhân", y="Tần số", fill="Kết quả Y") +
theme_minimal() +
scale_fill_brewer(palette="Pastel2")
Nhận xét:
Biểu đồ tần số giữa Loan và Y cho thấy sự khác biệt rõ rệt về số lượng người đồng ý (yes) giữa hai nhóm khách hàng có vay tiêu dùng và không vay tiêu dùng. Cụ thể, trong số những người không vay tiêu dùng, có 3.850 người đồng ý, trong khi ở nhóm có vay tiêu dùng chỉ có 683 người đồng ý.
Đồng thời, số người trả lời “no” ở nhóm không vay tiêu dùng cũng cao hơn rất nhiều. Tuy nhiên, mức chênh lệch về số lượng “yes” giữa hai nhóm vẫn thể hiện rằng nhóm khách hàng không vay tiêu dùng có xu hướng đồng ý nhiều hơn về mặt số lượng tuyệt đối.
loan_prop <- prop.table(loan_tab, margin = 1)
loan_prop_df <- as.data.frame(loan_prop)
colnames(loan_prop_df) <- c("Loan", "y", "Percent")
ggplot(loan_prop_df, aes(x = Loan, y = Percent, fill = y)) +
geom_bar(stat="identity", position="fill") +
geom_text(aes(label=scales::percent(Percent, accuracy=0.1)),
position=position_stack(vjust=0.5), size=4) +
labs(title="Biểu đồ tần suất giữa Loan và Y",
x="Khoản vay cá nhân", y="Tỷ lệ (%)", fill="Kết quả Y") +
theme_minimal() +
scale_fill_brewer(palette="Pastel2")
Nhận xét:
Biểu đồ tần suất giữa Loan và Y cho thấy tỷ lệ “yes” và “no” giữa hai nhóm gần như tương đồng. Cụ thể, nhóm không vay tiêu dùng có tỷ lệ “yes” là 11,3%, trong khi nhóm có vay tiêu dùng có tỷ lệ “yes” thấp hơn chút ít, đạt 10,9%.
Ở cả hai nhóm, tỷ lệ “no” đều chiếm ưu thế tuyệt đối (lần lượt 88,7% và 89,1%). Điều này cho thấy dù có hay không có khoản vay tiêu dùng thì phần lớn khách hàng đều không đồng ý (no), và sự khác biệt về tỷ lệ “yes” giữa hai nhóm là rất nhỏ.
Giả thuyết kiểm định:
H₀: Biến Loan (khoản vay cá nhân) và Y (kết quả) là hai biến độc lập.
H₁: Biến Loan (khoản vay cá nhân) và Y (kết quả) có mối liên hệ với nhau.
chi_loan <- chisq.test(loan_tab)
chi_loan
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: loan_tab
## X-squared = 0.84064, df = 1, p-value = 0.3592
Nhận xét:
Giá trị kiểm định Chi-square = 0.84064 với bậc tự do df = 1 và p-value = 0.3592, lớn hơn nhiều so với mức ý nghĩa α = 0.05.
Điều này không đủ bằng chứng để bác bỏ giả thuyết H₀.
Kết luận: Trong tập dữ liệu này, không có mối liên hệ có ý nghĩa thống kê giữa tình trạng vay tiêu dùng và kết quả Y.
Giả thuyết kiểm định:
H₀: Không có sự khác biệt về tỷ lệ “yes” giữa hai nhóm khách hàng (Risk Difference = 0).
H₁: Có sự khác biệt về tỷ lệ “yes” giữa hai nhóm khách hàng (Risk Difference ≠ 0).
counts_loan <- c(loan_tab["Không vay tiêu dùng","yes"], loan_tab["Có vay tiêu dùng","yes"])
totals_loan <- c(sum(loan_tab["Không vay tiêu dùng",]), sum(loan_tab["Có vay tiêu dùng",]))
prop.test(counts_loan, totals_loan, alternative="greater", correct=FALSE)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_loan out of totals_loan
## X-squared = 0.88102, df = 1, p-value = 0.174
## alternative hypothesis: greater
## 95 percent confidence interval:
## -0.002996281 1.000000000
## sample estimates:
## prop 1 prop 2
## 0.1134021 0.1093150
Nhận xét:
Giá trị kiểm định Chi-square = 0.88102, df = 1 với p-value = 0.174 (lớn hơn mức ý nghĩa α = 0.05).
Khoảng tin cậy 95% cho hiệu tỷ lệ (Risk Difference) nằm trong khoảng [-0.0030; 1.0000], bao gồm giá trị 0.
Tỷ lệ “yes” ước lượng ở nhóm 1 là 11,34% và ở nhóm 2 là 10,93%, chênh lệch rất nhỏ.
Kết luận: Không có đủ bằng chứng thống kê để bác bỏ giả thuyết H₀. Nói cách khác, không có sự khác biệt có ý nghĩa thống kê về tỷ lệ “yes” giữa hai nhóm khách hàng dựa trên tình trạng vay tiêu dùng.
Giả thuyết kiểm định:
H₀: Không có sự khác biệt về rủi ro (tỷ số nguy cơ – RR = 1) giữa hai nhóm khách hàng dựa trên tình trạng vay tiêu dùng.
H₁: Có sự khác biệt về rủi ro (RR ≠ 1) giữa hai nhóm khách hàng dựa trên tình trạng vay tiêu dùng.
counts_loan <- c(loan_tab["Không vay tiêu dùng","yes"], loan_tab["Có vay tiêu dùng","yes"])
totals_loan <- c(sum(loan_tab["Không vay tiêu dùng",]), sum(loan_tab["Có vay tiêu dùng",]))
prop.test(counts_loan, totals_loan, alternative="greater", correct=FALSE)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_loan out of totals_loan
## X-squared = 0.88102, df = 1, p-value = 0.174
## alternative hypothesis: greater
## 95 percent confidence interval:
## -0.002996281 1.000000000
## sample estimates:
## prop 1 prop 2
## 0.1134021 0.1093150
oddsratio(loan_tab)
## $data
##
## no yes Total
## Không vay tiêu dùng 30100 3850 33950
## Có vay tiêu dùng 5565 683 6248
## Total 35665 4533 40198
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Không vay tiêu dùng 1.0000000 NA NA
## Có vay tiêu dùng 0.9597354 0.8797823 1.045457
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Không vay tiêu dùng NA NA NA
## Có vay tiêu dùng 0.3482678 0.3607284 0.3479236
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét:
Dựa vào bảng kết quả Odds Ratio (OR), có thể nhận xét như sau:
Nhóm “Không vay tiêu dùng” được chọn làm nhóm tham chiếu (OR = 1.0). Nhóm “Có vay tiêu dùng” có OR = 0.96 (khoảng tin cậy 95%: 0.880 – 1.045). Điều này cho thấy khả năng trả lời “yes” của nhóm có vay tiêu dùng thấp hơn một chút so với nhóm không vay tiêu dùng, nhưng mức giảm này không đáng kể.
Giá trị p-value = 0.349 (lớn hơn 0.05) chứng tỏ sự khác biệt này không có ý nghĩa thống kê. Khoảng tin cậy 95% của OR bao gồm 1.0, càng khẳng định rằng không có bằng chứng mạnh mẽ cho sự khác biệt giữa hai nhóm.
Tiêu.chí | Logit | Probit | Cloglog |
---|---|---|---|
Hàm liên kết | \(\log \frac{p}{1-p}\) | \(\Phi^{-1}(p)\) (nghịch đảo phân phối chuẩn) | \(\log(-\log(1-p))\) |
Dữ liệu phù hợp |
Biến phụ thuộc: Định tính (nhị phân: 0/1). Biến độc lập: Có thể định lượng, định tính (dummy) hoặc kết hợp cả hai. |
Biến phụ thuộc: Định tính (nhị phân). Biến độc lập: Tương tự Logit, có thể định lượng, định tính hoặc cả hai, thường dùng khi dữ liệu được giả định tuân theo phân phối chuẩn ngầm. |
Biến phụ thuộc: Định tính (nhị phân). Biến độc lập: Định lượng, định tính hoặc kết hợp; đặc biệt phù hợp khi xác suất sự kiện rất thấp. |
Đặc điểm đường cong | Đường S (sigmoid) đối xứng. | Đường cong tương tự Logit nhưng mượt hơn ở phần đuôi. | Đường cong bất đối xứng, nghiêng về một phía. |
Giải thích hệ số | Hệ số cho biết log-odds thay đổi bao nhiêu khi biến độc lập tăng 1 đơn vị. | Hệ số cho biết mức thay đổi trong biến tiềm ẩn (latent variable) – biến tiềm ẩn này giả định tuân theo phân phối chuẩn. Khi biến độc lập tăng 1 đơn vị, xác suất thay đổi theo hàm phân phối chuẩn chuẩn hóa (không trực tiếp diễn giải log-odds nhưng có thể quy đổi sang xác suất cận biên). | Hệ số cho biết tác động của biến độc lập lên log(-log(1-p)). Ảnh hưởng rõ rệt hơn khi xác suất ở gần 0 hoặc 1. |
Giả định phân phối lỗi | Logistic | Chuẩn (Normal) | Gumbel (Extreme value) |
Khi nào sử dụng | Phổ biến nhất, dễ giải thích, dùng cho hầu hết dữ liệu nhị phân. | Thích hợp khi có lý do tin rằng biến tiềm ẩn hoặc nhiễu tuân theo phân phối chuẩn (ví dụ: dữ liệu xã hội, hành vi). | Dùng khi mô hình hóa sự kiện hiếm hoặc xác suất rất nhỏ/rất lớn. |
So sánh AIC/BIC | Có thể | Có thể | Có thể |
Khả năng phân loại nhị phân | Rất tốt, trực quan. | Gần tương đương Logit, đôi khi chính xác hơn với dữ liệu chuẩn hóa. | Tốt hơn khi dữ liệu có phân bố bất đối xứng. |
curve(log(x / (1 - x)), 0.01, 0.99, col = "blue", lwd = 2,
ylab = "Link function", xlab = "Probability", main = "So sánh các hàm liên kết")
curve(qnorm(x), 0.01, 0.99, col = "red", lwd = 2, add = TRUE)
curve(log(-log(1 - x)), 0.01, 0.99, col = "green", lwd = 2, add = TRUE)
legend("topleft", legend = c("Logit", "Probit", "Cloglog"),
col = c("blue", "red", "green"), lty = 1, lwd = 2)
str(d[, c("y", "marital", "contact", "loan")])
## 'data.frame': 41188 obs. of 4 variables:
## $ y : chr "no" "no" "no" "no" ...
## $ marital: chr "married" "married" "married" "married" ...
## $ contact: chr "telephone" "telephone" "telephone" "telephone" ...
## $ loan : chr "no" "no" "no" "no" ...
d$y <- factor(d$y, levels = c("no", "yes"))
d$marital <- factor(d$marital, levels = c("single", "married", "divorced"))
d$contact <- factor(d$contact, levels = c("cellular", "telephone"))
d$loan <- factor(d$loan, levels = c("no", "yes"))
Mục tiêu của bài phân tích là xây dựng một mô hình hồi quy logit để tìm hiểu những yếu tố nào ảnh hưởng đến khả năng khách hàng đăng ký dịch vụ. Trong mô hình này:
Biến phụ thuộc (y) là việc khách hàng có đăng ký (yes) hay không đăng ký (no).
Biến độc lập bao gồm tình trạng hôn nhân (marital), phương thức liên hệ (contact) và tình trạng vay (loan).
Mục tiêu cụ thể gồm:
Đo lường tác động của tình trạng hôn nhân: So sánh log-odds đăng ký của khách hàng đã kết hôn (Married) so với độc thân (Single) – nhóm “Single” là mức tham chiếu.
Đánh giá phương thức liên hệ: Xem xét sự khác biệt trong log-odds khi liên hệ qua Telephone so với Cellular.
Phân tích ảnh hưởng của khoản vay: So sánh log-odds đăng ký giữa nhóm có khoản vay (Yes) và không vay (No).
d <- na.omit(d)
## Mô hình Logit
model_logit <- glm(y ~ marital + contact + loan, data = d, family = binomial(link = "logit"))
# Tóm tắt mô hình
summary(model_logit)
##
## Call:
## glm(formula = y ~ marital + contact + loan, family = binomial(link = "logit"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.55192 0.02901 -53.504 < 2e-16 ***
## maritalmarried -0.29732 0.03484 -8.535 < 2e-16 ***
## maritaldivorced -0.28597 0.05643 -5.068 4.02e-07 ***
## contacttelephone -1.10786 0.04109 -26.960 < 2e-16 ***
## loanyes -0.05705 0.04453 -1.281 0.2
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 28252 on 40118 degrees of freedom
## Residual deviance: 27264 on 40114 degrees of freedom
## AIC: 27274
##
## Number of Fisher Scoring iterations: 5
# Giá trị AIC
AIC(model_logit)
## [1] 27274.04
# Dự đoán nhị phân với ngưỡng 0.5
pred_logit <- ifelse(predict(model_logit, type = "response") > 0.5, "yes", "no")
# Ma trận nhầm lẫn
table(Predicted = pred_logit, Actual = d$y)
## Actual
## Predicted no yes
## no 35598 4521
\[ \textbf{Mô hình: } \log \left( \frac{p}{1-p} \right) = \beta_0 + \beta_1 X_{1} + \beta_2 X_{2} + \beta_3 X_{3} \]
Thay các hệ số ước lượng (Estimate) vào:
\[ \text{logit}(p) = -1.55192 - 0.29732(\text{maritalmarried}) - 1.10786(\text{contacttelephone}) - 0.05705(\text{loanyes}) \]
\[ \text{logit}(p) = \log \left( \frac{p}{1-p} \right) = \beta_0 + \beta_1 X_{1} + \beta_2 X_{2} + \beta_3 X_{3} \]
\[ \text{logit}(p) = -1.55192 - 0.29732(\text{maritalmarried}) - 1.10786(\text{contacttelephone}) - 0.05705(\text{loanyes}) \]
Mỗi hệ số \(\beta_j\) cho biết khi biến \(X_j\) tăng 1 đơn vị:
\[ \text{Odds mới} = \text{Odds cũ} \times e^{\beta_j} \]
Các hệ số trong mô hình cho thấy hướng và mức độ tác động của từng biến độc lập đến biến phụ thuộc, đồng thời thể hiện mức độ ý nghĩa thống kê thông qua giá trị p-value. Intercept có hệ số −1.55192, biểu thị log-odds cơ bản khi tất cả biến độc lập bằng 0; điều này cho thấy xác suất cơ sở khá thấp, khoảng 17,5%. maritalmarried có hệ số −0.29732 và rất có ý nghĩa thống kê (p < 0.001), nghĩa là người đã kết hôn có odds xảy ra sự kiện thấp hơn, giảm khoảng 26% (OR ≈ 0.74). maritaldivorced có hệ số −0.28597 và cũng rất có ý nghĩa (p < 0.001), cho thấy người đã ly hôn có odds giảm 25%. contacttelephone có hệ số −1.10786 và mức ý nghĩa rất cao (p < 0.001), đây là biến tác động mạnh nhất, làm odds giảm đến 67% (OR ≈ 0.33). Ngược lại, loanyes có hệ số −0.05705 với p-value = 0.20, không đủ ý nghĩa thống kê, cho thấy việc có khoản vay không tác động rõ rệt đến xác suất xảy ra sự kiện.
Giá trị Null deviance = 28252 phản ánh độ lệch của mô hình chỉ với hằng số, tức là mô hình cơ bản không có biến giải thích. Khi đưa các biến vào mô hình, Residual deviance giảm còn 27264, thể hiện mô hình đã được cải thiện đáng kể trong việc giải thích dữ liệu. Sự giảm này cho thấy các biến độc lập mang thông tin có ích và giúp mô hình dự đoán tốt hơn so với mô hình rỗng.
Giá trị AIC = 27274 (Akaike Information Criterion) đánh giá sự cân bằng giữa độ phù hợp và độ phức tạp của mô hình. AIC thấp hơn so với mô hình rỗng cho thấy mô hình này hiệu quả hơn trong việc dự đoán mà không quá phức tạp. Đây cũng là cơ sở để so sánh mô hình logit này với các mô hình khác (probit, cloglog) trong cùng bộ dữ liệu.
Bảng dự đoán ma trận nhầm lẫn cho thấy trong tổng số 40.119 quan sát, mô hình dự đoán 35.598 trường hợp “no” và 4.521 trường hợp “yes”. Trong số đó, đa số trường hợp “no” được dự đoán đúng, phản ánh khả năng mô hình nhận diện tốt nhóm “không xảy ra sự kiện”. Tuy nhiên, số lượng dự đoán “yes” tương đối ít, cho thấy mô hình thận trọng và có xu hướng thiên về dự đoán “no”. Điều này dẫn đến một mô hình có độ chính xác tổng thể cao nhờ nhóm “no” chiếm tỷ lệ lớn, nhưng có thể gặp vấn đề về độ nhạy (sensitivity) khi dự đoán nhóm “yes” – tức là mô hình có thể bỏ sót nhiều trường hợp “yes” thực tế.
Mục tiêu của bài phân tích là xây dựng một mô hình hồi quy Probit để tìm hiểu những yếu tố nào ảnh hưởng đến khả năng khách hàng đăng ký dịch vụ. Trong mô hình này:
Biến phụ thuộc (y): Việc khách hàng có đăng ký (yes) hay không đăng ký (no).
Biến độc lập: Tình trạng hôn nhân (marital), phương thức liên hệ (contact) và tình trạng vay (loan).
Mục tiêu cụ thể gồm:
Đo lường tác động của tình trạng hôn nhân: So sánh xác suất đăng ký của khách hàng đã kết hôn (Married) với nhóm độc thân (Single) – trong đó nhóm “Single” được dùng làm mức tham chiếu.
Đánh giá phương thức liên hệ: Xem xét sự khác biệt trong xác suất đăng ký khi khách hàng được liên hệ qua Telephone so với Cellular.
Phân tích ảnh hưởng của khoản vay: So sánh xác suất đăng ký giữa nhóm khách hàng có khoản vay (Yes) và nhóm không vay (No).
## 5.2. Mô hình Probit
model_probit <- glm(y ~ marital + contact + loan, data = d, family = binomial(link = "probit"))
# Tóm tắt mô hình
summary(model_probit)
##
## Call:
## glm(formula = y ~ marital + contact + loan, family = binomial(link = "probit"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.93894 0.01588 -59.115 < 2e-16 ***
## maritalmarried -0.15802 0.01861 -8.490 < 2e-16 ***
## maritaldivorced -0.15298 0.02970 -5.151 2.59e-07 ***
## contacttelephone -0.55833 0.01976 -28.253 < 2e-16 ***
## loanyes -0.02963 0.02338 -1.267 0.205
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 28252 on 40118 degrees of freedom
## Residual deviance: 27264 on 40114 degrees of freedom
## AIC: 27274
##
## Number of Fisher Scoring iterations: 5
# AIC của mô hình
AIC(model_probit)
## [1] 27274.14
# Dự đoán và phân loại
pred_probit <- ifelse(predict(model_probit, type = "response") > 0.5, "yes", "no")
# Ma trận nhầm lẫn
table(Predicted = pred_probit, Actual = d$y)
## Actual
## Predicted no yes
## no 35598 4521
\[ \Phi^{-1}(p) = \beta_0 + \beta_1 X_{1} + \beta_2 X_{2} + \beta_3 X_{3} \]
\[ \Phi^{-1}(p) = -0.93894 - 0.15802(\text{maritalmarried}) - 0.55833(\text{contacttelephone}) - 0.02963(\text{loanyes}) \]
Mỗi hệ số \(\beta_j\) cho biết khi biến \(X_j\) tăng 1 đơn vị:
\[ z_{\text{mới}} = z_{\text{cũ}} + \beta_j \]
Trong mô hình Probit:
Các hệ số của mô hình Probit cho thấy hướng tác động của từng biến và mức độ ý nghĩa thống kê thông qua giá trị p-value. Intercept có hệ số −0.93894, đây là điểm z cơ bản khi tất cả các biến độc lập bằng 0; chuyển sang xác suất, điều này phản ánh khả năng đăng ký dịch vụ cơ sở ở mức khá thấp. Biến maritalmarried có hệ số −0.15802 và rất có ý nghĩa (p < 0.001), cho thấy người đã kết hôn có điểm z giảm, đồng nghĩa với xác suất đăng ký giảm nhẹ. maritaldivorced cũng có hệ số âm −0.15298 với mức ý nghĩa cao (p < 0.001), hàm ý người ly hôn cũng có xác suất đăng ký thấp hơn so với nhóm độc thân. Biến contacttelephone có hệ số −0.55833 với p < 0.001 – đây là biến tác động mạnh nhất, làm điểm z giảm mạnh, từ đó xác suất giảm đáng kể khi khách hàng được liên hệ qua điện thoại. Riêng loanyes có hệ số −0.02963 và p-value = 0.205, không đủ ý nghĩa thống kê, cho thấy việc có khoản vay không tác động rõ rệt đến xác suất đăng ký dịch vụ.
Null deviance = 28252 thể hiện độ lệch khi mô hình chỉ có hằng số (không có biến giải thích). Khi đưa các biến vào, Residual deviance giảm còn 27264, cho thấy mô hình Probit đã cải thiện đáng kể khả năng giải thích dữ liệu. Việc giảm deviance phản ánh rằng các biến độc lập cung cấp thông tin có giá trị và giúp mô hình dự đoán tốt hơn so với mô hình rỗng.
AIC = 27274 (Akaike Information Criterion) giúp đánh giá sự cân bằng giữa độ phù hợp và độ phức tạp của mô hình. AIC thấp cho thấy mô hình Probit vừa hiệu quả trong việc dự đoán vừa không quá phức tạp. Đây cũng là cơ sở để so sánh mô hình Probit với các mô hình hồi quy khác (như Logit hoặc Cloglog) trên cùng bộ dữ liệu.
Kết quả dự đoán cho thấy trên tổng số 40.119 quan sát, mô hình Probit dự đoán 35.598 trường hợp “no” và 4.521 trường hợp “yes”. Phần lớn các trường hợp “no” được dự đoán đúng, chứng tỏ mô hình nhận diện tốt nhóm “không đăng ký dịch vụ”. Tuy nhiên, số lượng dự đoán “yes” khá thấp, cho thấy mô hình có xu hướng nghiêng về dự đoán “no”. Điều này khiến mô hình đạt độ chính xác tổng thể cao nhờ nhóm “no” chiếm tỷ trọng lớn, nhưng lại có thể bỏ sót nhiều trường hợp “yes” thực tế – phản ánh mức độ nhạy (sensitivity) của mô hình chưa cao.
Mục tiêu của bài phân tích là xây dựng một mô hình hồi quy cloglog để tìm hiểu những yếu tố nào ảnh hưởng đến khả năng khách hàng đăng ký dịch vụ. Trong mô hình này:
Biến phụ thuộc (y): Việc khách hàng có đăng ký (yes) hay không đăng ký (no).
Biến độc lập: Tình trạng hôn nhân (marital), phương thức liên hệ (contact) và tình trạng vay (loan).
Mục tiêu cụ thể gồm:
Đo lường tác động của tình trạng hôn nhân: So sánh xác suất đăng ký của khách hàng đã kết hôn (Married) với nhóm độc thân (Single) – trong đó nhóm “Single” được sử dụng làm mức tham chiếu.
Đánh giá phương thức liên hệ: Xem xét sự khác biệt trong xác suất đăng ký khi khách hàng được liên hệ qua Telephone so với Cellular.
Phân tích ảnh hưởng của khoản vay: So sánh xác suất đăng ký giữa nhóm khách hàng có khoản vay (Yes) và nhóm không vay (No).
## 5.3. Mô hình Cloglog
model_cloglog <- glm(y ~ marital + contact + loan, data = d, family = binomial(link = "cloglog"))
# Tóm tắt mô hình
summary(model_cloglog)
##
## Call:
## glm(formula = y ~ marital + contact + loan, family = binomial(link = "cloglog"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.64789 0.02658 -61.990 < 2e-16 ***
## maritalmarried -0.27613 0.03229 -8.551 < 2e-16 ***
## maritaldivorced -0.26508 0.05268 -5.032 4.86e-07 ***
## contacttelephone -1.05510 0.03962 -26.629 < 2e-16 ***
## loanyes -0.05361 0.04160 -1.289 0.197
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 28252 on 40118 degrees of freedom
## Residual deviance: 27264 on 40114 degrees of freedom
## AIC: 27274
##
## Number of Fisher Scoring iterations: 6
# AIC
AIC(model_cloglog)
## [1] 27274.12
# Dự đoán kết quả
pred_cloglog <- ifelse(predict(model_cloglog, type = "response") > 0.5, "yes", "no")
# Ma trận nhầm lẫn
table(Predicted = pred_cloglog, Actual = d$y)
## Actual
## Predicted no yes
## no 35598 4521
\[ \text{cloglog}(p) = \log\left[-\log(1-p)\right] = \beta_0 + \beta_1 X_{1} + \beta_2 X_{2} + \beta_3 X_{3} \]
\[ \text{cloglog}(p) = -1.64789 - 0.27613(\text{maritalmarried}) - 1.05510(\text{contacttelephone}) - 0.05361(\text{loanyes}) \]
Mỗi hệ số \(\beta_j\) cho biết khi biến \(X_j\) tăng 1 đơn vị:
\[ \eta_{\text{mới}} = \eta_{\text{cũ}} + \beta_j \]
Trong mô hình cloglog:
Các hệ số trong mô hình cloglog thể hiện hướng và mức độ tác động của từng biến độc lập đến xác suất khách hàng đăng ký dịch vụ, đồng thời phản ánh ý nghĩa thống kê thông qua p-value. Intercept có hệ số −1.64789, đây là log-odds theo thang cloglog khi tất cả biến độc lập bằng 0; điều này cho thấy xác suất cơ sở của khách hàng đăng ký dịch vụ ở mức khá thấp. maritalmarried có hệ số −0.27613 và rất có ý nghĩa thống kê (p < 0.001), cho thấy khách hàng đã kết hôn có khả năng đăng ký thấp hơn nhóm độc thân (OR ≈ e −0.27613 ≈0.76, giảm 24%). maritaldivorced có hệ số −0.26508 (p < 0.001), hàm ý khách hàng đã ly hôn cũng có xác suất đăng ký thấp hơn, với odds giảm khoảng 23%. contacttelephone có hệ số −1.05510 với mức ý nghĩa rất cao (p < 0.001), đây là biến tác động mạnh nhất, làm odds giảm khoảng 65% khi khách hàng được liên hệ qua điện thoại. Ngược lại, loanyes có hệ số −0.05361 và p-value = 0.197, không đủ ý nghĩa thống kê để kết luận việc có khoản vay ảnh hưởng đến xác suất đăng ký dịch vụ.
Null deviance = 28252 phản ánh mức độ lệch của mô hình khi chỉ có hằng số (không có biến giải thích). Khi các biến được đưa vào, Residual deviance giảm xuống 27264, cho thấy mô hình cloglog đã cải thiện đáng kể khả năng giải thích dữ liệu. Sự giảm deviance này chứng minh rằng các biến độc lập mang thông tin quan trọng, giúp mô hình dự đoán tốt hơn so với mô hình rỗng.
AIC = 27274 cung cấp thước đo cân bằng giữa độ phù hợp và độ phức tạp của mô hình. AIC thấp cho thấy mô hình cloglog có khả năng dự đoán tốt mà không trở nên quá phức tạp. Đây cũng là cơ sở để so sánh với các mô hình khác (logit và probit) trong cùng bộ dữ liệu.
Kết quả dự đoán từ mô hình cho thấy trên tổng số 40.119 quan sát, mô hình cloglog dự đoán 35.598 trường hợp “no” và 4.521 trường hợp “yes”. Hầu hết các trường hợp “no” được dự đoán đúng, điều này phản ánh khả năng mô hình nhận diện tốt nhóm “không đăng ký dịch vụ”. Tuy nhiên, số lượng “yes” được dự đoán khá ít, cho thấy mô hình có xu hướng thiên về dự đoán “no”. Điều này giúp mô hình đạt độ chính xác tổng thể cao do nhóm “no” chiếm tỷ lệ lớn, nhưng đồng thời cũng làm giảm độ nhạy (sensitivity) vì bỏ sót nhiều trường hợp “yes” thực tế.