Tập dữ liệu biểu hiện xu hướng mua sắm và hành vi của khách hàng. Tập dữ liệu này cung cấp ảnh chụp nhanh chi tiết về hành vi mua sắm trực tuyến và xu hướng của người tiêu dùng. Tập dữ liệu này chứa các hồ sơ khách hàng tổng hợp nhưng thực tế với nhiều tính năng như độ tuổi, giới tính, danh mục mua hàng, sở thích thanh toán và mức độ tương tác với các ưu đãi khuyến mại. Tập dữ liệu này lý tưởng cho phân tích dữ liệu khám phá, phân khúc khách hàng, mô hình hành vi và hệ thống đề xuất. Tập dữ liệu này cũng có thể được sử dụng cho các tác vụ học có giám sát như dự đoán mua hàng hoặc phân tích tỷ lệ hủy đơn hàng.
d <- read.csv("C:/Users/Ngo Trang/Documents/Shopping Trends And Customer Behaviour Dataset.csv", header = TRUE)
str(d)
## 'data.frame': 3900 obs. of 17 variables:
## $ Customer.ID : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Age : int 55 19 50 21 45 46 63 27 26 57 ...
## $ Gender : chr "Male" "Male" "Male" "Male" ...
## $ Item.Purchased : chr "Blouse" "Sweater" "Jeans" "Sandals" ...
## $ Category : chr "Clothing" "Clothing" "Clothing" "Footwear" ...
## $ Purchase.Amount..USD. : int 53 64 73 90 49 20 85 34 97 31 ...
## $ Location : chr "Kentucky" "Maine" "Massachusetts" "Rhode Island" ...
## $ Color : chr "Gray" "Maroon" "Maroon" "Maroon" ...
## $ Season : chr "Winter" "Winter" "Spring" "Spring" ...
## $ Review.Rating : num 3.1 3.1 3.1 3.5 2.7 2.9 3.2 3.2 2.6 4.8 ...
## $ Subscription.Status : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Shipping.Type : chr "Express" "Express" "Free Shipping" "Next Day Air" ...
## $ Discount.Applied : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Promo.Code.Used : logi TRUE TRUE TRUE TRUE TRUE TRUE ...
## $ Previous.Purchases : int 14 2 23 49 31 14 49 19 8 4 ...
## $ Payment.Method : chr "Venmo" "Cash" "Credit Card" "PayPal" ...
## $ Frequency.of.Purchases: chr "Fortnightly" "Fortnightly" "Weekly" "Weekly" ...
Để khám phá dữ liệu ban đầu chúng ta sẽ xem nhanh cấu trúc và nội dung dữ liệu ở 5 quan sát đầu và 5 quan sát cuối bảng.
# Hiển thị một vài dòng đầu của dữ liệu
head(d,5)
# Hiển thị một vài dòng cuối của dữ liệu
tail(d,5)
Bộ dữ liệu d bao gồm 3900 quan sát với 17 biến bao gồm cả biến định lượng và biến định tính.
names(d)
## [1] "Customer.ID" "Age" "Gender"
## [4] "Item.Purchased" "Category" "Purchase.Amount..USD."
## [7] "Location" "Color" "Season"
## [10] "Review.Rating" "Subscription.Status" "Shipping.Type"
## [13] "Discount.Applied" "Promo.Code.Used" "Previous.Purchases"
## [16] "Payment.Method" "Frequency.of.Purchases"
Gender – giới tính
Item Purchased – sản phẩm đã mua
Category – danh mục sản phẩm
Location – địa điểm
Color – màu sắc sản phẩm
Season – mùa mua sắm
Subscription Status – trạng thái đăng ký chương trình thanh viên
Shipping Type – hình thức giao hàng
Discount Applied – đã áp dụng giảm giá
Promo Code Used – đã dùng mã khuyến mãi
Payment Method – phương thức thanh toán
Frequency of Purchases – tần suất mua hàng (dạng phân loại như “Low”, “Medium”, “High”)
Customer ID – mã khách hàng
Age – tuổi
Purchase Amount (USD) – số tiền mua hàng (USD)
Review Rating – điểm đánh giá sản phẩm
Previous Purchases – số lần mua hàng trước đó
Tại bài phân tích này chúng ta sẽ sử dụng:
2 biến phụ thuộc: Subscription Status – trạng thái đăng ký chương trình thành viên và Gender – giới tính.
biến độc lập: Promo Code Used – đã dùng mã khuyến mãi, Category – danh mục sản phẩm, Payment Method – phương thức thanh toán.
# Bảng tần số
su1 <- table(d$Subscription.Status)
su1
##
## No Yes
## 1357 2543
# Bảng tần suất
su2 <- table(d$Subscription.Status)/sum(nrow(d))
su2
##
## No Yes
## 0.3479487 0.6520513
Bộ dữ liệu d bao gồm: 1053 khách hàng đã đăng ký tham gia chương trình thành viên, chiếm tỷ trọng 27% tổng số khách hàng và 2847 khách hàng chưa đăng ký tham gia chương trình thành viên, chiếm tỷ trọng 73% tổng số khách hàng.
library(ggplot2)
ggplot(as.data.frame(su2), aes(x = "", y = Freq, fill = Var1)) +
geom_col(width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(Freq * 100), "%")),
position = position_stack(vjust = 0.5)) +
labs(title = "Tần suất đăng ký chương trình thành viên", fill = "Trạng thái đăng ký") +
theme_void() +
theme(plot.title = element_text(hjust = 0.5))
# Bảng tần số
ge1 <- table(d$Gender)
ge1
##
## Female Male
## 1248 2652
# Bảng tần suất
ge2 <- table(d$Gender)/sum(nrow(d))
ge2
##
## Female Male
## 0.32 0.68
Bộ dữ liệu d bao gồm: 1248 khách hàng là nữ, chiếm tỷ trọng 32% tổng số khách hàng và 2652 khách hàng là nam, chiếm 68% tổng số khách hàng.
ggplot(as.data.frame(ge2), aes(x = "", y = Freq, fill = Var1)) +
geom_col(width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(Freq * 100), "%")),
position = position_stack(vjust = 0.5)) +
labs(title = "Tần suất giới tính khách hàng", fill = "Giới tính") +
theme_void() +
theme(plot.title = element_text(hjust = 0.5))
# Bảng tần số
pr1 <- table(d$Promo.Code.Used)
pr1
##
## FALSE TRUE
## 1063 2837
# Bảng tần suất
pr2 <- table(d$Promo.Code.Used)/sum(nrow(d))
pr2
##
## FALSE TRUE
## 0.2725641 0.7274359
Bộ dữ liệu d bao gồm: 1677 khách hàng đã dùng mã khuyến mãi, chiếm tỷ trọng 43% tổng số khách hàng và 2223 khách hàng không dùng mã khuyến mãi, chiếm tỷ trọng 57% tổng số khách hàng.
ggplot(as.data.frame(pr2), aes(x = "", y = Freq, fill = Var1)) +
geom_col(width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(Freq * 100), "%")),
position = position_stack(vjust = 0.5)) +
labs(title = "Tần suất trạng thái khách hàng sử dụng mã khuyến mãi", fill = "Trạng thái sử dụng mã khuyến mãi") +
theme_void() +
theme(plot.title = element_text(hjust = 0.5))
# Bảng tần số
ca1 <- table(d$Category)
ca1
##
## Accessories Clothing Footwear Outerwear
## 1240 1737 599 324
# Bảng tần suất
ca2 <- table(d$Category)/sum(nrow(d))
ca2
##
## Accessories Clothing Footwear Outerwear
## 0.31794872 0.44538462 0.15358974 0.08307692
Bộ dữ liệu d bao gồm: 1240 sản phẩm là phụ kiện, chiếm tỷ trọng 31.8% tổng sản phẩm bán ra. 1737 sản phẩm là quần áo chiếm tỷ trọng 44.54% tổng sản phẩm bán ra. 599 sản phẩm là giày dép chiếm tỷ trọng 15.36% tổng sản phẩm bán ra. Và 324 sản phẩm là áo khoác ngoài chiếm tỷ trọng 8.3% tổng sản phẩm bán ra.
ggplot(as.data.frame(ca2), aes(x = "", y = Freq, fill = Var1)) +
geom_col(width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(Freq * 100), "%")),
position = position_stack(vjust = 0.5)) +
labs(title = "tần suất số sản phẩm bán ra", fill = "Loại sản phẩm") +
theme_void() +
theme(plot.title = element_text(hjust = 0.5))
# Bảng tần số
pa1 <- table(d$Payment.Method)
pa1
##
## Bank Transfer Cash Credit Card Debit Card PayPal
## 612 670 671 636 677
## Venmo
## 634
# Bảng tần suất
pa2 <- table(d$Payment.Method)/sum(nrow(d))
pa2
##
## Bank Transfer Cash Credit Card Debit Card PayPal
## 0.1569231 0.1717949 0.1720513 0.1630769 0.1735897
## Venmo
## 0.1625641
Bộ dữ liệu d bao gồm: 612 khách hàng thanh toán bằng cách chuyển khoản ngân hàng, chiếm 15.7% tổng số khách hàng. 670 khách hàng sử dụng tiền mặt để thanh toán, chiếm 17.18% tổng số khách hàng. 671 khách hàng thanh toán bằng thẻ tín dụng, chiếm 17.2% tổng số khách hàng. 636 khách hàng sử dụng thẻ ghi nợ để thanh toán, chiếm tỷ trọng 16.31% tổng số khách hàng. 677 khách hàng sử dụng ví điện tử PayPal để thanh toán, chiếm 17.35% tổng số khách hàng. Và 634 khachs hàng sử dụng ví điẹne tử Venmo để thanh toán, chiếm 16.26% tổng só khách hàng.
ggplot(as.data.frame(pa2), aes(x = "", y = Freq, fill = Var1)) +
geom_col(width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(Freq * 100), "%")),
position = position_stack(vjust = 0.5)) +
labs(title = "tần suất phương thức thanh toán của khách hàng", fill = "Phương thức thanh toán") +
theme_void() +
theme(plot.title = element_text(hjust = 0.5))
# Số lượng khách hàng đã đăng ký tham gia chương trình thành viên
Yes <- sum(d$Subscription.Status == "Yes")
# Kiểm định tỷ lệ 1 mẫu
prop.test(Yes, sum(nrow(d)), p = 0.5, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: Yes out of sum(nrow(d)), null probability 0.5
## X-squared = 360.06, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.6368298 0.6669709
## sample estimates:
## p
## 0.6520513
Đặt giả thuyết:
H0:Tỷ lệ khách hàng đã đăng ký tham gia chương trình thành viên = 0.5
H1:Tỷ lệ khách hàng đã đăng ký tham gia chương trình thành viên ≠ 0.5
Ta thấy giá trị p-value < 2.2e-16 < 5% bác bỏ H0, đồng nghĩa với việc tỷ lệ khách hàng đã đăng ký tham gia chương trình thành viên không phải là 50% trong tổng số khách hàng. Ngoài ra, ta có thể ước lượng số tỷ lệ khách hàng đã đăng ký tham gia chương trình thành viên trong thực tế với độ tin cậy 95% nằm trong khoảng từ 25.62% đến 28.43%.
# Số khách hàng là nữ
Female <- sum(d$Gender == "Female")
# Kiểm định tỷ lệ 1 mẫu
prop.test(Female, sum(nrow(d)), p = 0.32, conf.level = 0.95)
##
## 1-sample proportions test without continuity correction
##
## data: Female out of sum(nrow(d)), null probability 0.32
## X-squared = 7.7977e-29, df = 1, p-value = 1
## alternative hypothesis: true p is not equal to 0.32
## 95 percent confidence interval:
## 0.3055431 0.3348111
## sample estimates:
## p
## 0.32
Đặt giả thuyết:
H0:Tỷ lệ khách hàng là nữ = 0.5
H1:Tỷ lệ khách hàng là nữ ≠ 0.5
Ta thấy giá trị p-value < 2.2e-16 < 5% bác bỏ H0, nghĩa là tỷ lệ khách hàng là nữ trong thực tế không phải chiếm 50% trong tổng số khách hàng. Ngoài ra, ta có thể ước lượng tỷ lệ khách hàng là nữ trong thực tế với độ tin cậy 95% nằm trong khoảng từ 30.54% đến 33.49%.
vd01 <- table(d$Subscription.Status,d$Promo.Code.Used)
addmargins(vd01 )
##
## FALSE TRUE Sum
## No 733 624 1357
## Yes 330 2213 2543
## Sum 1063 2837 3900
# Tính tỷ lệ phần trăm theo hàng
vd1 <- prop.table(vd01, margin = 1) * 100
vd1
##
## FALSE TRUE
## No 54.01621 45.98379
## Yes 12.97680 87.02320
ggplot(as.data.frame(vd01), aes(x = Var1, y = Freq, fill = Var2)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_text(aes(label = paste0(Freq, " (", round(vd1[cbind(as.character(Var1), as.character(Var2))], 1), "%)")),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
labs(title = "Đăng ký chương trình thành viên và đã sử dụng mã khuyến mãi",
x = "Đăng ký chương trình thành viên",
y = "Số lượng",
fill = "Sử dụng mã khuyến mãi") +
theme_minimal()
Trong nhóm chưa đăng ký chương trình thành viên, có 733 người chưa sử dụng khuyến mãi (chiếm 54,02%) và 624 người đã sử dụng khuyến mãi (chiếm 45,98%), tổng cộng 1.357 người. Trong nhóm đã đăng ký chương trình thành viên, có 330 người chưa sử dụng khuyến mãi (chiếm 12,98%) và 2.213 người đã sử dụng khuyến mãi (chiếm 87,02%), tổng cộng 2.543 người.
Giả thuyết:
H₀ :Subscription Status và Promo Code Used độc lập với nhau.
H₁ :Subscription Statu và Promo Code Used không độc lập.
chisq.test(vd01)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: vd01
## X-squared = 749.56, df = 1, p-value < 2.2e-16
Kết quả cung cấp:
Giá trị Chi-bình phương (X²): 1908.9
Bậc tự do (df): 1
Giá trị p: p-value < 2.2e-16
Qua kết quả kiểm định cho ta p−value < 2.2e−16 < 0.05, nên bác bỏ H0, đồng nghĩa với việc khách hàng đăng ký chương trình thành viên và khách hàng đã sử dụng mã khuyến mãi có mối quan hệ với nhau.
- Quan tâm đến nhóm khách hàng đã đăng ký chương trình thành viên (YES) và đã sử dụng khuyến mãi (TRUE).
library(epitools)
riskratio(vd01)
## $data
##
## FALSE TRUE Total
## No 733 624 1357
## Yes 330 2213 2543
## Total 1063 2837 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## No 1.000000 NA NA
## Yes 1.892476 1.783003 2.00867
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## No NA NA NA
## Yes 0 2.097923e-161 1.779667e-165
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm khách hàng đã đăng ký chương trình thành viên và đã sử dụng mã khuyển mãi gấp 1,89 lần nhóm khách hàng chưa đăng ký chương trình thành viên và đã sử dụng mã khuyến mãi.
- Quan tâm đến nhóm khách hàng đã đăng ký chương trình thành viên (YES) và chưa sử dụng khuyến mãi (FALSE).
riskratio(vd01, rev = 'c')
## $data
##
## TRUE FALSE Total
## No 624 733 1357
## Yes 2213 330 2543
## Total 2837 1063 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## No 1.000000 NA NA
## Yes 0.240239 0.214788 0.2687057
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## No NA NA NA
## Yes 0 2.097923e-161 1.779667e-165
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm khách hàng đã đăng ký chương trình thành viên và chưa sử dụng mã khuyến mãi thấp hơn nhóm khách hàng chưa đăng ký chương trình thành viên và chưa sử dụng mã khuyến mãi là 0,24 lần.
- Quan tâm đến nhóm khách hàng chưa đăng ký chương trình thành viên (NO) và đã sử dụng khuyến mãi (TRUE).
riskratio(vd01, rev = "r")
## $data
##
## FALSE TRUE Total
## Yes 330 2213 2543
## No 733 624 1357
## Total 1063 2837 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Yes 1.0000000 NA NA
## No 0.5284084 0.4978419 0.5608516
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Yes NA NA NA
## No 0 2.097923e-161 1.779667e-165
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm khách hàng chưa đăng ký chương trình thành viên và đã sử dụng mã khuyến mãi thấp hơn nhóm khách hàng đã đăng ký chương trình thành viên và đã sử dụng mã khuyến mãi là 0,53 lần.
- Quan tâm đến nhóm khách hàng chưa đăng ký chương trình thành viên (NO) và chưa sử dụng khuyến mãi (FALSE).
riskratio(vd01, rev = "b")
## $data
##
## TRUE FALSE Total
## Yes 2213 330 2543
## No 624 733 1357
## Total 2837 1063 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Yes 1.000000 NA NA
## No 4.162522 3.721544 4.655753
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Yes NA NA NA
## No 0 2.097923e-161 1.779667e-165
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm khách hàng chưa đăng ký chương trình thành viên và chưa sử dụng mã khuyến mãi cao gấp 4,16 lần nhóm khách hàng đã đăng ký chương trình thành viên và chưa sử dụng mã khuyến mãi.
Chưa sử dụng khuyễn mãi (FALSE) ~ Thành công/đã sử dụng khuyến mãi (TRUE) ~ Thất bại
oddsratio(vd01)
## $data
##
## FALSE TRUE Total
## No 733 624 1357
## Yes 330 2213 2543
## Total 1063 2837 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## No 1.000000 NA NA
## Yes 7.870345 6.730132 9.220399
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## No NA NA NA
## Yes 0 2.097923e-161 1.779667e-165
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Những khách hàng chưa đăng ký chương trình thành viên có khả năng chưa sử dụng mã khuyến mãi cao hơn khoảng 7,87 lần so với những khách hàng đã đăng ký chương trình thành viên.
oddsratio(vd01, rev = 'r')
## $data
##
## FALSE TRUE Total
## Yes 330 2213 2543
## No 733 624 1357
## Total 1063 2837 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Yes 1.0000000 NA NA
## No 0.1270521 0.1084552 0.1485855
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Yes NA NA NA
## No 0 2.097923e-161 1.779667e-165
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Những khách hàng đã đăng ký chương trình thành viên có khả năng chưa sử dụng mã khuyến mãi thấp hơn khoảng 0,13 lần so với những khách hàng chưa đăng ký chương trình thành viên.
Đã sử dụng khuyến mãi (TRUE) ~ Thành công/chưa sử dụng khuyễn mãi (FALSE) ~ Thất bại
oddsratio(vd01, rev = 'c')
## $data
##
## TRUE FALSE Total
## No 624 733 1357
## Yes 2213 330 2543
## Total 2837 1063 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## No 1.0000000 NA NA
## Yes 0.1270521 0.1084552 0.1485855
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## No NA NA NA
## Yes 0 2.097923e-161 1.779667e-165
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Những khách hàng chưa đăng ký chương trình thành viên có khả năng chưa sử dụng mã khuyến mãi thấp hơn khoảng 0,13 lần so với những khách hàng đã đăng ký chương trình thành viên.
oddsratio(vd01, rev = 'b')
## $data
##
## TRUE FALSE Total
## Yes 2213 330 2543
## No 624 733 1357
## Total 2837 1063 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Yes 1.000000 NA NA
## No 7.870345 6.730132 9.220399
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Yes NA NA NA
## No 0 2.097923e-161 1.779667e-165
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Những khách hàng đã đăng ký chương trình thành viên có khả năng chưa sử dụng mã khuyến mãi cao hơn khoảng 7,87 lần so với những khách hàng chưa đăng ký chương trình thành viên.
vd02 <- table(d$Subscription.Status,d$Category)
addmargins(vd02)
##
## Accessories Clothing Footwear Outerwear Sum
## No 438 617 197 105 1357
## Yes 802 1120 402 219 2543
## Sum 1240 1737 599 324 3900
# Tính tỷ lệ phần trăm theo hàng
vd2 <- prop.table(vd02, margin = 1) * 100
vd2
##
## Accessories Clothing Footwear Outerwear
## No 32.277082 45.467944 14.517318 7.737657
## Yes 31.537554 44.042470 15.808101 8.611876
ggplot(as.data.frame(vd02), aes(x = Var1, y = Freq, fill = Var2)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_text(aes(label = paste0(Freq, " (", round(vd2[cbind(as.character(Var1), as.character(Var2))], 1), "%)")),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
labs(title = "Đăng ký chương trình thành viên và loại sản phẩm",
x = "Đăng ký chương trình thành viên",
y = "Số lượng",
fill = "Loại sản phẩm") +
theme_minimal()
Trong nhóm chưa đăng ký chương trình thành viên, có 438 người mua phụ kiện (chiếm 32,28%), 617 người mua quần áo (45,47%), 197 người mua giày dép (14,52%) và 105 người mua áo khoác (7,74%), tổng cộng 1.357 người.
Trong nhóm đã đăng ký chương trình thành viên, có 802 người mua phụ kiện (chiếm 31,54%), 1.120 người mua quần áo (44,04%), 402 người mua giày dép (15,81%) và 219 người mua áo khoác (8,61%), tổng cộng 2.543 người.
Giả thuyết:
H₀ :Subscription Status và Categoryd độc lập với nhau.
H₁ :Subscription Statu và Categoryd không độc lập.
chisq.test(vd02)
##
## Pearson's Chi-squared test
##
## data: vd02
## X-squared = 2.3297, df = 3, p-value = 0.5068
Kết quả cung cấp:
Giá trị Chi-bình phương (X²): 1.3444
Bậc tự do (df): 3
Giá trị p: p-value = 0.7186
Qua kết quả kiểm định cho ta p-value = 0.7186 > 0.05, không đủ cơ sở bác bỏ H0, đồng nghĩa với việc khách hàng đăng ký chương trình thành viên và loại sản phẩm được bán ra không có mối quan hệ với nhau.
vd03 <- table(d$Subscription.Status,d$Payment.Method)
addmargins(vd03)
##
## Bank Transfer Cash Credit Card Debit Card PayPal Venmo Sum
## No 206 237 222 231 243 218 1357
## Yes 406 433 449 405 434 416 2543
## Sum 612 670 671 636 677 634 3900
# Tính tỷ lệ phần trăm theo hàng
vd3 <- prop.table(vd03, margin = 1) * 100
vd3
##
## Bank Transfer Cash Credit Card Debit Card PayPal Venmo
## No 15.18055 17.46500 16.35962 17.02284 17.90715 16.06485
## Yes 15.96540 17.02713 17.65631 15.92607 17.06646 16.35863
ggplot(as.data.frame(vd03), aes(x = Var1, y = Freq, fill = Var2)) +
geom_col(position = position_dodge(width = 0.9)) +
labs(title = "Đăng ký chương trình thành viên và phương thức thanh toán",
x = "Đăng ký chương trình thành viên",
y = "Số lượng",
fill = "Phương thức thanh toán") +
theme_minimal()
Trong nhóm chưa đăng ký chương trình thành viên, có 206 người thanh toán bằng chuyển khoản ngân hàng (chiếm 15,18%), 237 người thanh toán bằng tiền mặt (17,47%), 222 người dùng thẻ tín dụng (16,36%), 231 người dùng thẻ ghi nợ (17,02%), 243 người thanh toán qua PayPal (17,91%) và 218 người qua Venmo (16,06%), tổng cộng 1.357 người.
Trong nhóm đã đăng ký chương trình thành viên, có 406 người thanh toán bằng chuyển khoản ngân hàng (chiếm 15,97%), 433 người bằng tiền mặt (17,03%), 449 người dùng thẻ tín dụng (17,66%), 405 người dùng thẻ ghi nợ (15,93%), 434 người thanh toán qua PayPal (17,07%) và 416 người qua Venmo (16,36%), tổng cộng 2.543 người.
Giả thuyết:
H₀ :Subscription Status và Payment Methodd độc lập với nhau.
H₁ :Subscription Statu và Payment Method không độc lập.
chisq.test(vd03)
##
## Pearson's Chi-squared test
##
## data: vd03
## X-squared = 2.3707, df = 5, p-value = 0.7958
Kết quả cung cấp:
Giá trị Chi-bình phương (X²): 3.8587
Bậc tự do (df): 5
Giá trị p: p-value = 0.5699
Qua kết quả kiểm định cho ta p−value = 0.5699 > 0.05, không đủ cơ sở bác bỏ H0, đồng nghĩa với việc khách hàng đăng ký chương trình thành viên và phương thức thanh toán không có mối quan hệ với nhau.
vd04 <- table(d$Gender,d$Promo.Code.Used)
addmargins(vd04)
##
## FALSE TRUE Sum
## Female 88 1160 1248
## Male 975 1677 2652
## Sum 1063 2837 3900
# Tính tỷ lệ phần trăm theo hàng
vd4 <- prop.table(vd04, margin = 1) * 100
vd4
##
## FALSE TRUE
## Female 7.051282 92.948718
## Male 36.764706 63.235294
ggplot(as.data.frame(vd04), aes(x = Var1, y = Freq, fill = Var2)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_text(aes(label = paste0(Freq, " (", round(vd4[cbind(as.character(Var1), as.character(Var2))], 1), "%)")),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
labs(title = "Giới tính và đã sử dụng mã khuyến mãi",
x = "Giới tính",
y = "Số lượng",
fill = "Sử dụng mã khuyến mãi") +
theme_minimal()
Trong nhóm nữ, có 88 người chưa sử dụng mã khuyến mãi (chiếm 7,05%) và 1.160 người đã sử dụng mã khuyến mãi (chiếm 92,95%), tổng cộng 1.248 người.
Trong nhóm nam, có 975 người chưa sử dụng mã khuyến mãi (chiếm 36,76%) và 1.677 người đã sử dụng mã khuyến mãi (chiếm 63,24%), tổng cộng 2.652 người.
Giả thuyết:
H₀ :Gender và Promo Code Used độc lập với nhau.
H₁ :Gender và Promo Code Used không độc lập.
chisq.test(vd04)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: vd04
## X-squared = 376.39, df = 1, p-value < 2.2e-16
Kết quả cung cấp:
Giá trị Chi-bình phương (X²): 1381.9
Bậc tự do (df): 1
Giá trị p: p-value < 2.2e-16
Qua kết quả kiểm định cho ta p−value < 2.2e−16 < 0.05, nên bác bỏ H0, đồng nghĩa với việc giới tính khách hàng và khách hàng đã sử dụng mã khuyến mãi có mối quan hệ với nhau.
- Quan tâm đến nhóm khách hàng là nam và đã sử dụng khuyến mãi (TRUE).
library(epitools)
riskratio(vd04)
## $data
##
## FALSE TRUE Total
## Female 88 1160 1248
## Male 975 1677 2652
## Total 1063 2837 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Female 1.0000000 NA NA
## Male 0.6803245 0.6583736 0.7030074
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0 2.336886e-98 3.583639e-84
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm khách hàng là nam đã sử dụng mã khuyến mãi thấp hơn khoảng 0,68 lần nhóm khách hàng là nữ đã sử dụng mã khuyến mãi.
- Quan tâm đến nhóm khách hàng là nam và chưa sử dụng khuyến mãi (FALSE).
riskratio(vd04, rev = 'c')
## $data
##
## TRUE FALSE Total
## Female 1160 88 1248
## Male 1677 975 2652
## Total 2837 1063 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 5.213904 4.236785 6.416373
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0 2.336886e-98 3.583639e-84
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm khách hàng là nam chưa sử dụng mã khuyến mãi cao hơn khoảng 5,21 lần nhóm khách hàng là nữ chưa sử dụng mã khuyến mãi.
- Quan tâm đến nhóm khách hàng là nữ và đã sử dụng khuyến mãi (YES).
riskratio(vd04, rev = "r")
## $data
##
## FALSE TRUE Total
## Male 975 1677 2652
## Female 88 1160 1248
## Total 1063 2837 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Male 1.000000 NA NA
## Female 1.469887 1.42246 1.518894
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 0 2.336886e-98 3.583639e-84
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm khách hàng là nữ đã sử dụng mã khuyến mãi cao hơn khoảng 1,47 lần nhóm khách hàng là nam đã sử dụng mã khuyến mãi.
- Quan tâm đến nhóm khách hàng là nữ và chưa sử dụng khuyến mãi (FALSE).
riskratio(vd04, rev = "b")
## $data
##
## TRUE FALSE Total
## Male 1677 975 2652
## Female 1160 88 1248
## Total 2837 1063 3900
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Male 1.0000000 NA NA
## Female 0.1917949 0.1558513 0.236028
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 0 2.336886e-98 3.583639e-84
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhóm khách hàng là nữ chưa sử dụng mã khuyến mãi thấp hơn khoảng 0,19 lần nhóm khách hàng là nam chưa sử dụng mã khuyến mãi.
Chưa sử dụng khuyễn mãi (FALSE) ~ Thành công/đã sử dụng khuyến mãi (TRUE) ~ Thất bại
oddsratio(vd04)
## $data
##
## FALSE TRUE Total
## Female 88 1160 1248
## Male 975 1677 2652
## Total 1063 2837 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.0000000 NA NA
## Male 0.1307131 0.1031578 0.1637429
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0 2.336886e-98 3.583639e-84
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Những khách hàng là nữ có khả năng chưa sử dụng mã khuyến mãi thấp hơn khoảng 0,13 lần so với những khách hàng là nam.
oddsratio(vd04, rev = 'r')
## $data
##
## FALSE TRUE Total
## Male 975 1677 2652
## Female 88 1160 1248
## Total 1063 2837 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Male 1.000000 NA NA
## Female 7.648858 6.107136 9.693884
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 0 2.336886e-98 3.583639e-84
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Những khách hàng là nam có khả năng chưa sử dụng mã khuyến mãi cao hơn khoảng 7,65 lần so với những khách hàng là nữ.
Đã sử dụng khuyến mãi (TRUE) ~ Thành công/chưa sử dụng khuyễn mãi (FALSE) ~ Thất bại
oddsratio(vd04, rev = 'c')
## $data
##
## TRUE FALSE Total
## Female 1160 88 1248
## Male 1677 975 2652
## Total 2837 1063 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 7.648858 6.107136 9.693884
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0 2.336886e-98 3.583639e-84
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Những khách hàng là nữ có khả năng đã sử dụng mã khuyến mãi cao hơn khoảng 7,65 lần so với những khách hàng là nam.
oddsratio(vd04, rev = 'b')
## $data
##
## TRUE FALSE Total
## Male 1677 975 2652
## Female 1160 88 1248
## Total 2837 1063 3900
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Male 1.0000000 NA NA
## Female 0.1307131 0.1031578 0.1637429
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 0 2.336886e-98 3.583639e-84
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Những khách hàng là nam có khả năng đã sử dụng mã khuyến mãi thấp hơn khoảng 7,65 lần so với những khách hàng là nữ.
vd05 <- table(d$Gender,d$Category)
addmargins(vd05)
##
## Accessories Clothing Footwear Outerwear Sum
## Female 392 556 199 101 1248
## Male 848 1181 400 223 2652
## Sum 1240 1737 599 324 3900
# Tính tỷ lệ phần trăm theo hàng
vd5 <- prop.table(vd05, margin = 1) * 100
vd5
##
## Accessories Clothing Footwear Outerwear
## Female 31.410256 44.551282 15.945513 8.092949
## Male 31.975867 44.532428 15.082956 8.408748
ggplot(as.data.frame(vd05), aes(x = Var1, y = Freq, fill = Var2)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_text(aes(label = paste0(Freq, " (", round(vd5[cbind(as.character(Var1), as.character(Var2))], 1), "%)")),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
labs(title = "Giới tính và loại sản phẩm",
x = "Giới tính",
y = "Số lượng",
fill = "Loại sản phẩm") +
theme_minimal()
Trong nhóm nữ, có 392 người mua phụ kiện (chiếm 31,41%), 556 người mua quần áo (44,55%), 199 người mua giày dép (15,95%) và 101 người mua áo khoác (8,09%), tổng cộng 1.248 người.
Trong nhóm nam, có 848 người mua phụ kiện (chiếm 31,98%), 1.181 người mua quần áo (44,53%), 400 người mua giày dép (15,08%) và 223 người mua áo khoác (8,41%), tổng cộng 2.652 người.
Giả thuyết:
H₀ :Gender và Category độc lập với nhau.
H₁ :Gender và Category không độc lập.
chisq.test(vd05)
##
## Pearson's Chi-squared test
##
## data: vd05
## X-squared = 0.59842, df = 3, p-value = 0.8968
Kết quả cung cấp:
Giá trị Chi-bình phương (X²): 0.59842
Bậc tự do (df): 3
Giá trị p: p-value = 0.8968
Qua kết quả kiểm định cho ta p−value = 0.8968 > 0.05, không đủ cơ sở bác bỏ H0, đồng nghĩa với việc giới tính khách hàng và loại sản phẩm không có mối quan hệ với nhau.
vd06 <- table(d$Gender,d$Payment.Method)
addmargins(vd06)
##
## Bank Transfer Cash Credit Card Debit Card PayPal Venmo Sum
## Female 203 212 223 181 221 208 1248
## Male 409 458 448 455 456 426 2652
## Sum 612 670 671 636 677 634 3900
# Tính tỷ lệ phần trăm theo hàng
vd6 <- prop.table(vd06, margin = 1) * 100
vd6
##
## Bank Transfer Cash Credit Card Debit Card PayPal Venmo
## Female 16.26603 16.98718 17.86859 14.50321 17.70833 16.66667
## Male 15.42232 17.26998 16.89291 17.15686 17.19457 16.06335
ggplot(as.data.frame(vd06), aes(x = Var1, y = Freq, fill = Var2)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_text(aes(label = paste0(Freq, " (", round(vd6[cbind(as.character(Var1), as.character(Var2))], 1), "%)")),
position = position_dodge(width = 0.9),
vjust = -0.3, size = 3) +
labs(title = "Giới tính và phương thức thanh toán",
x = "Giới tính",
y = "Số lượng",
fill = "Phương thức thanh toán") +
theme_minimal()
Trong nhóm nữ, có 203 người thanh toán bằng chuyển khoản ngân hàng (chiếm 16,27%), 212 người bằng tiền mặt (16,99%), 223 người dùng thẻ tín dụng (17,87%), 181 người dùng thẻ ghi nợ (14,50%), 221 người thanh toán qua PayPal (17,71%) và 208 người qua Venmo (16,67%), tổng cộng 1.248 người.
Trong nhóm nam, có 409 người thanh toán bằng chuyển khoản ngân hàng (chiếm 15,42%), 458 người bằng tiền mặt (17,27%), 448 người dùng thẻ tín dụng (16,89%), 455 người dùng thẻ ghi nợ (17,16%), 456 người thanh toán qua PayPal (17,19%) và 426 người qua Venmo (16,06%), tổng cộng 2.652 người.
Giả thuyết:
H₀ :Gender và Payment Method độc lập với nhau.
H₁ :Gender và Payment Methoy không độc lập.
chisq.test(vd06)
##
## Pearson's Chi-squared test
##
## data: vd06
## X-squared = 4.8776, df = 5, p-value = 0.431
Kết quả cung cấp:
Giá trị Chi-bình phương (X²): 4.8776
Bậc tự do (df): 5
Giá trị p: p-value = 0.431
Qua kết quả kiểm định cho ta p−value = 0.431 > 0.05, không đủ cơ sở bác bỏ H0, đồng nghĩa với việc giới tính khách hàng và phương thức thanh toán không có mối quan hệ với nhau.
Phương trình tổng quát:
\[ \text{logit}(\pi) = \log\left(\frac{\pi}{1 - \pi}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k \]
Với π là xác suất để biến phụ thuộc nhận giá trị “thành công”. Đối với hàm glm phạm trù thứ hai của biến nhị phân thể hiện cho “thành công” (chúng ta sử dụng hàm levels() để kiểm tra thứ tự của các phạm trù của một biến định tính.
Bài toán đặt ra: Chọn ngẫu nhiên 1 khách hàng. Tính xác suất người đó là nữ.
logit <- glm(factor(Gender) ~ Previous.Purchases,family = binomial(link = "logit"),data = d)
summary(logit)
##
## Call:
## glm(formula = factor(Gender) ~ Previous.Purchases, family = binomial(link = "logit"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.619745 0.068598 9.034 <2e-16 ***
## Previous.Purchases 0.005329 0.002380 2.239 0.0251 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4889.6 on 3899 degrees of freedom
## Residual deviance: 4884.6 on 3898 degrees of freedom
## AIC: 4888.6
##
## Number of Fisher Scoring iterations: 4
Hàm hồi quy:
\[ \text{logit}(\pi) = \log\left(\frac{\pi}{1 - \pi}\right) = 0.619745 + 0.005329 \cdot \text{Previous Purchases} \]
Khi số lần mua hàng trước đó bằng 0, giá trị\[ z = \text{logit}(\pi) = \log\left(\frac{\pi}{1 - \pi}\right) \] là 0.6197. Điều này tương ứng với xác suất cơ bản khách hàng là nữ (Gender = 1) khi chưa từng mua hàng trước đó, với xác suất khoảng 65%.
Hệ số của biến Previous.Purchases là 0.0053, có ý nghĩa thống kê ở mức 5% (p = 0.0251). Điều này nghĩa là:
→ Mỗi lần mua hàng trước đó tăng thêm 1 sẽ làm log-odds (z) khách hàng là nữ tăng thêm 0.0053. Vì log-odds tăng, nên xác suất khách hàng là nữ cũng tăng theo.
Tuy nhiên, vì hệ số 0.0053 là khá nhỏ, nên mặc dù mối liên hệ có ý nghĩa thống kê, thì mức ảnh hưởng thực tế là rất yếu. Nói cách khác, những khách hàng có nhiều lần mua hàng trước đây có xu hướng là nữ cao hơn một chút, nhưng biến này không phải là yếu tố mạnh để phân biệt giới tính.
Từ mô hình logit ta suy ra được:
Nếu hồi quy đơn:
\[ \pi = \frac{e^{\beta_0 + \beta_1 x_1}}{1 + e^{\beta_0 + \beta_1 x_1}} \]
Nếu hồi quy bội:
\[ \pi = \frac{e^{\beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_k x_k}}{1 + e^{\beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_k x_k}} \]
Bài toán: Kiểm tra xem các yếu tố như: Số lần mua hàng trước đó (Previous.Purchases), Việc sử dụng mã khuyến mãi (Promo.Code.Used), Loại sản phẩm (Category), Phương thức thanh toán (Payment.Method) có ảnh hưởng đến xác suất khách hàng là nữ giới hay không (Gender = “Female”).
d$Gender <- factor(d$Gender)
d$Promo.Code.Used <- as.factor(d$Promo.Code.Used)
d$Category <- as.factor(d$Category)
d$Payment.Method <- as.factor(d$Payment.Method)
logit2 <- glm(Gender ~ Previous.Purchases + Promo.Code.Used + Category + Payment.Method, family = binomial(link = "logit"), data = d)
summary(logit2)
##
## Call:
## glm(formula = Gender ~ Previous.Purchases + Promo.Code.Used +
## Category + Payment.Method, family = binomial(link = "logit"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 2.262444 0.161531 14.006 <2e-16 ***
## Previous.Purchases 0.005272 0.002504 2.105 0.0353 *
## Promo.Code.UsedTRUE -2.038148 0.117804 -17.301 <2e-16 ***
## CategoryClothing -0.038272 0.084143 -0.455 0.6492
## CategoryFootwear -0.088124 0.111904 -0.788 0.4310
## CategoryOuterwear 0.024318 0.141527 0.172 0.8636
## Payment.MethodCash 0.044350 0.126005 0.352 0.7249
## Payment.MethodCredit Card -0.031485 0.125323 -0.251 0.8016
## Payment.MethodDebit Card 0.198377 0.129221 1.535 0.1247
## Payment.MethodPayPal -0.016186 0.125396 -0.129 0.8973
## Payment.MethodVenmo 0.057166 0.126692 0.451 0.6518
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4889.6 on 3899 degrees of freedom
## Residual deviance: 4435.5 on 3889 degrees of freedom
## AIC: 4457.5
##
## Number of Fisher Scoring iterations: 5
Trong đó:
π=P(Gender=Female) là xác suất khách hàng là nữ.
Nhóm tham chiếu:
Category = Accessories
Payment.Method = Cash
Promo.Code.Used = FALSE
Từ mô hình hồi quy logistic sử dụng liên kết logit, ta phân tích khả năng khách hàng là nữ dựa vào các biến độc lập: số lần mua hàng trước đó (Previous.Purchases), việc sử dụng mã khuyến mãi (Promo.Code.Used), danh mục sản phẩm (Category) và phương thức thanh toán (Payment.Method). Kết quả ước lượng cho thấy hệ số chặn là 2.3068, tương ứng với log-odds khi khách hàng chưa từng mua hàng, không dùng mã khuyến mãi, mua sản phẩm thuộc nhóm cơ sở (Accessories) và thanh toán bằng tiền mặt. Xác suất khách hàng là nữ trong trường hợp cơ sở này đạt mức cao (khoảng 90.9%).
Hệ số của biến Promo.Code.Used là −2.0381 và có ý nghĩa thống kê rất cao (p < 0.001), cho thấy việc sử dụng mã khuyến mãi làm giảm mạnh xác suất khách hàng là nữ. Điều này phản ánh rằng nam giới có xu hướng sử dụng mã khuyến mãi nhiều hơn nữ giới. Ngược lại, biến Previous.Purchases có hệ số dương 0.0053 và có ý nghĩa thống kê ở mức 5% (p = 0.0353), cho thấy số lần mua hàng trước đó càng nhiều thì xác suất khách hàng là nữ càng cao, mặc dù mức ảnh hưởng này là nhẹ do hệ số thấp.
Các biến liên quan đến danh mục sản phẩm (Category) và phương thức thanh toán (Payment.Method) đều không có ý nghĩa thống kê (p-value > 0.1), cho thấy giới tính khách hàng không bị ảnh hưởng rõ rệt bởi các yếu tố này trong mô hình hiện tại.
Tổng thể, mô hình đã chỉ ra rằng trong các yếu tố hành vi tiêu dùng được đưa vào phân tích, chỉ có việc sử dụng mã khuyến mãi và tần suất mua hàng trong quá khứ có liên quan đến giới tính khách hàng, trong đó hành vi sử dụng mã khuyến mãi là yếu tố phân biệt giới tính rõ nhất. Các yếu tố còn lại không mang lại giá trị phân loại đáng kể cho mô hình.
Bài toán: “Liệu giới tính có ảnh hưởng đến việc khách hàng chọn phương thức thanh toán nào (tiền mặt, thẻ tín dụng, ví điện tử, v.v.) không?”
#Đảm bảo biến Payment.Method là factor và chọn mức tham chiếu là "Cash"
d$Payment.Method <- relevel(factor(d$Payment.Method), ref = "Cash")
library(nnet)
## Warning: package 'nnet' was built under R version 4.3.3
logit3 <- multinom(Payment.Method ~ Gender, data = d)
## # weights: 18 (10 variable)
## initial value 6987.861930
## iter 10 value 6982.768701
## final value 6982.710850
## converged
summary(logit3)
## Call:
## multinom(formula = Payment.Method ~ Gender, data = d)
##
## Coefficients:
## (Intercept) GenderMale
## Bank Transfer -0.04337877 -0.06977507
## Credit Card 0.05058641 -0.07266315
## Debit Card -0.15808824 0.15151612
## PayPal 0.04157636 -0.04595337
## Venmo -0.01904758 -0.05338212
##
## Std. Errors:
## (Intercept) GenderMale
## Bank Transfer 0.09819923 0.1194633
## Credit Card 0.09592334 0.1166912
## Debit Card 0.10120200 0.1209258
## PayPal 0.09613467 0.1166973
## Venmo 0.09759445 0.1185559
##
## Residual Deviance: 13965.42
## AIC: 13985.42
Dạng tổng quát của mô hình như sau:
\[ \log\left( \frac{P(y = j)}{P(y = \text{Cash})} \right) = \beta_{0j} + \beta_{1j} \cdot \text{GenderMale} \]
Với mỗi phương thức thanh toán (trừ tiền mặt), hệ số GenderMale cho biết ảnh hưởng của giới tính nam (so với nữ). Duy nhất “Debit Card” có hệ số dương (0.1515) → Nam có xác suất chọn phương thức này cao hơn nữ, khi so với tiền mặt. Các phương thức còn lại đều có hệ số âm → Nam ít có xu hướng chọn các phương thức này hơn nữ, khi so với tiền mặt. Tuy nhiên, cần kiểm tra ý nghĩa thống kê của các hệ số. Ở đây, hệ số GenderMale của Debit Card có giá trị dương và khá rõ.
Dựa trên mô hình hồi quy logistic đa thức, ta thấy rằng giới tính có ảnh hưởng nhất định đến lựa chọn phương thức thanh toán của khách hàng:
=> Như vậy, giới tính có ảnh hưởng nhưng không phải là yếu tố quyết định mạnh mẽ trong lựa chọn phương thức thanh toán.
Hồi quy Probit là một mô hình thống kê dùng để dự đoán xác suất của một biến phụ thuộc nhị phân (ví dụ: Có/Không, Nam/Nữ…) dựa trên các biến độc lập. Mô hình sử dụng hàm phân phối chuẩn tích lũy (CDF) làm hàm liên kết (link function) để mô hình hóa xác suất xảy ra sự kiện.
So sánh với hồi quy Logistic
| Nội dung | Hồi quy Logistic | Hồi quy Probit |
|---|---|---|
| Hàm liên kết | Logit: log(p / (1 - p)) |
Chuẩn tích lũy: Φ(x) |
| Phân phối sai số | Logistic | Chuẩn chuẩn hóa N(0,1) |
| Diễn giải hệ số | Theo odds ratio | Theo z-score chuẩn hóa |
| Phổ biến | Phổ biến rộng rãi | Phổ biến trong kinh tế lượng |
Bài toán: kiểm tra xem số lần mua hàng trước đó (Previous.Purchases) có ảnh hưởng đến xác suất khách hàng thuộc giới tính nào (biến Gender).
probit <- glm(factor(Gender) ~ Previous.Purchases, family = binomial(link = "probit"), data = d)
summary(probit)
##
## Call:
## glm(formula = factor(Gender) ~ Previous.Purchases, family = binomial(link = "probit"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.386197 0.041931 9.210 <2e-16 ***
## Previous.Purchases 0.003235 0.001447 2.235 0.0254 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4889.6 on 3899 degrees of freedom
## Residual deviance: 4884.6 on 3898 degrees of freedom
## AIC: 4888.6
##
## Number of Fisher Scoring iterations: 4
Hàm hồi quy Probit:
\[ \Phi^{-1}(\pi) = 0.3862 + 0.0032 \cdot \text{Previous Purchases} \] Khi số lần mua hàng trước đó bằng 0, giá trị \[ z = \Phi^{-1}(\pi) \] là 0.3862. Điều này tương ứng với xác suất cơ bản khách hàng là nữ (Gender = 1) khi chưa từng mua hàng trước đó, với xác suất gần 65% (vì Φ(0.3862) ≈ 0.65).
Hệ số của biến Previous.Purchases là 0.0032, có ý nghĩa thống kê ở mức 5% (p = 0.0254). Điều này nghĩa là: → Mỗi lần mua hàng trước tăng thêm 1, sẽ làm xác suất khách hàng là nữ tăng nhẹ, do tăng giá trị z của phân phối chuẩn.
Tuy nhiên, vì hệ số 0.0032 là rất nhỏ, nên mặc dù mối liên hệ là có ý nghĩa thống kê, thì mức ảnh hưởng thực tế là yếu. Khách hàng từng mua hàng nhiều lần có xu hướng là nữ cao hơn một chút, nhưng yếu tố này chưa đủ mạnh để phân biệt giới tính rõ ràng.
probit2 <- glm(Gender ~ Previous.Purchases + Promo.Code.Used + Category + Payment.Method,family = binomial(link = "probit"), data = d)
summary(probit2)
##
## Call:
## glm(formula = Gender ~ Previous.Purchases + Promo.Code.Used +
## Category + Payment.Method, family = binomial(link = "probit"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.330419 0.088610 15.014 <2e-16 ***
## Previous.Purchases 0.003149 0.001513 2.082 0.0374 *
## Promo.Code.UsedTRUE -1.156957 0.060386 -19.159 <2e-16 ***
## CategoryClothing -0.020951 0.050838 -0.412 0.6803
## CategoryFootwear -0.062969 0.067640 -0.931 0.3519
## CategoryOuterwear 0.012499 0.085411 0.146 0.8837
## Payment.MethodBank Transfer -0.026937 0.076218 -0.353 0.7238
## Payment.MethodCredit Card -0.050135 0.074474 -0.673 0.5008
## Payment.MethodDebit Card 0.085921 0.076464 1.124 0.2612
## Payment.MethodPayPal -0.038180 0.074453 -0.513 0.6081
## Payment.MethodVenmo 0.009029 0.075432 0.120 0.9047
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4889.6 on 3899 degrees of freedom
## Residual deviance: 4435.7 on 3889 degrees of freedom
## AIC: 4457.7
##
## Number of Fisher Scoring iterations: 5
Mô hình hồi quy được xây dựng với liên kết chuẩn (probit), cho ta phương trình:
\[\begin{aligned} \Phi^{-1}(\pi) =\ & 1.3304 + 0.0031 \cdot \text{Previous.Purchases} - 1.1570 \cdot \text{Promo.Code.Used}_{\text{TRUE}} \\ & - 0.0210 \cdot \text{Category}_{\text{Clothing}} - 0.0630 \cdot \text{Category}_{\text{Footwear}} + 0.0125 \cdot \text{Category}_{\text{Outerwear}} \\ & - 0.0269 \cdot \text{Payment.Method}_{\text{Bank Transfer}} - 0.0501 \cdot \text{Payment.Method}_{\text{Credit Card}} + 0.0859 \cdot \text{Payment.Method}_{\text{Debit Card}} \\ & - 0.0382 \cdot \text{Payment.Method}_{\text{PayPal}} + 0.0090 \cdot \text{Payment.Method}_{\text{Venmo}} \end{aligned}\]Mô hình hồi quy probit được sử dụng nhằm xác định các yếu tố ảnh hưởng đến xác suất một khách hàng là nữ. Kết quả ước lượng cho thấy hệ số chặn là 1.3304, tương ứng với giá trị 𝑧=Φ−1(𝜋)trong điều kiện khách hàng chưa từng mua hàng, không dùng mã khuyến mãi, chọn danh mục sản phẩm Accessories và thanh toán bằng tiền mặt. Giá trị này tương ứng với xác suất cơ bản là nữ khá cao, gần 91%.
Biến Promo.Code.Used có hệ số âm lớn (–1.1570) và có ý nghĩa thống kê rất cao (p < 0.001), cho thấy việc sử dụng mã khuyến mãi làm giảm đáng kể xác suất khách hàng là nữ. Điều này chỉ ra rằng nam giới có xu hướng dùng mã khuyến mãi nhiều hơn nữ giới.
Biến Previous.Purchases có hệ số dương nhẹ (0.0031) và có ý nghĩa thống kê ở mức 5% (p = 0.0374), cho thấy số lần mua hàng trước đó càng nhiều thì khả năng khách hàng là nữ tăng lên. Tuy nhiên, mức độ ảnh hưởng này không lớn do hệ số thấp.
Các biến còn lại bao gồm danh mục sản phẩm (Category) và phương thức thanh toán (Payment.Method) đều không có ý nghĩa thống kê (p-value > 0.1). Điều đó cho thấy các yếu tố này không đóng vai trò rõ rệt trong việc phân biệt giới tính khách hàng trong dữ liệu hiện có.
Tổng thể, mô hình probit cho thấy xác suất khách hàng là nữ chịu ảnh hưởng chủ yếu từ hành vi sử dụng mã khuyến mãi và mức độ thường xuyên mua sắm. Trong đó, hành vi dùng mã khuyến mãi là yếu tố quan trọng nhất giúp phân biệt giới tính. Các yếu tố còn lại không có giá trị giải thích đáng kể đối với biến phụ thuộc.
Hồi quy Cloglog (viết tắt của Complementary log-log) là một mô hình hồi quy nhị phân giống như logit và probit, được sử dụng khi biến phụ thuộc là biến định tính có hai giá trị (ví dụ: nam/nữ, có/không, thành công/thất bại,…).
Điểm khác biệt chính là ở hàm liên kết (link function). Trong khi logit và probit là đối xứng, thì cloglog là bất đối xứng, phù hợp khi xác suất xảy ra của biến phụ thuộc rất thấp hoặc rất cao (gần 0 hoặc gần 1).
Phương trình tổng quát:
\[ \text{cloglog}(\pi) = \log(-\log(1 - \pi)) = \beta_0 + \beta_1 x \]
Bài toán: Số lần mua hàng trước đó (Previous.Purchases) có ảnh hưởng đến xác suất khách hàng là nữ (Gender = 1) hay không?
cloglog <- glm(factor(Gender) ~ Previous.Purchases, family = binomial(link = "cloglog"),data = d)
summary(cloglog)
##
## Call:
## glm(formula = factor(Gender) ~ Previous.Purchases, family = binomial(link = "cloglog"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.050730 0.041668 1.217 0.2234
## Previous.Purchases 0.003153 0.001419 2.222 0.0263 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4889.6 on 3899 degrees of freedom
## Residual deviance: 4884.6 on 3898 degrees of freedom
## AIC: 4888.6
##
## Number of Fisher Scoring iterations: 4
Hmaf hồi quy Cloglog
\[ \text{cloglog}(\pi) = \log(-\log(1 - \pi)) = 0.0507 + 0.0032 \cdot \text{Previous.Purchases} \]
Khi số lần mua hàng trước đó bằng 0, ta có:\[ z = \text{cloglog}(\pi) = 0.0507 \] Suy ra xác suất khách hàng là nữ (Gender = 1) ở mức cơ bản là: pi = 1 - exp(-exp(0.0507)) ≈ 0.65 → Nghĩa là: khi khách hàng chưa từng mua hàng trước đó, xác suất là nữ vào khoảng 65%.
Hệ số của biến Previous.Purchases là 0.0032 → Khi số lần mua hàng tăng thêm 1, giá trị z=cloglog(π) cũng tăng thêm 0.0032, kéo theo xác suất khách hàng là nữ tăng nhẹ.
Giá trị p = 0.0263 (< 5%), nên biến Previous.Purchases có ý nghĩa thống kê, tức là có mối liên hệ có thật giữa tần suất mua hàng và giới tính khách hàng.
cloglog2 <- glm(Gender ~ Previous.Purchases + Promo.Code.Used + Category + Payment.Method,family = binomial(link = "cloglog"), data = d)
summary(cloglog2)
##
## Call:
## glm(formula = Gender ~ Previous.Purchases + Promo.Code.Used +
## Category + Payment.Method, family = binomial(link = "cloglog"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.865074 0.079679 10.857 <2e-16 ***
## Previous.Purchases 0.002999 0.001491 2.012 0.0443 *
## Promo.Code.UsedTRUE -1.026006 0.048281 -21.251 <2e-16 ***
## CategoryClothing -0.016528 0.049939 -0.331 0.7407
## CategoryFootwear -0.080008 0.067086 -1.193 0.2330
## CategoryOuterwear 0.009105 0.083665 0.109 0.9133
## Payment.MethodBank Transfer -0.026845 0.075211 -0.357 0.7211
## Payment.MethodCredit Card -0.057889 0.073517 -0.787 0.4310
## Payment.MethodDebit Card 0.070359 0.074153 0.949 0.3427
## Payment.MethodPayPal -0.039289 0.073288 -0.536 0.5919
## Payment.MethodVenmo 0.011334 0.074399 0.152 0.8789
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 4889.6 on 3899 degrees of freedom
## Residual deviance: 4436.0 on 3889 degrees of freedom
## AIC: 4458
##
## Number of Fisher Scoring iterations: 5
Hàm liên kết Cloglog được định nghĩa là:
\[\begin{aligned} \log\left( -\log(1 - \pi) \right) =\ & 0.8651 + 0.0030 \cdot \text{Previous.Purchases} - 1.0260 \cdot \text{Promo.Code.Used}_{\text{TRUE}} \\ & - 0.0165 \cdot \text{Category}_{\text{Clothing}} - 0.0800 \cdot \text{Category}_{\text{Footwear}} + 0.0091 \cdot \text{Category}_{\text{Outerwear}} \\ & - 0.0268 \cdot \text{Payment.Method}_{\text{Bank Transfer}} - 0.0579 \cdot \text{Payment.Method}_{\text{Credit Card}} + 0.0704 \cdot \text{Payment.Method}_{\text{Debit Card}} \\ & - 0.0393 \cdot \text{Payment.Method}_{\text{PayPal}} + 0.0113 \cdot \text{Payment.Method}_{\text{Venmo}} \end{aligned}\]Với nhóm tham chiếu: – Promo.Code.Used = FALSE – Category = Accessories – Payment.Method = Cash
Mô hình hồi quy sử dụng hàm liên kết Cloglog cho phép ước lượng xác suất khách hàng là nữ theo hướng phi đối xứng, phù hợp với trường hợp xác suất gần cận 0 hoặc 1. Kết quả ước lượng cho thấy hệ số chặn là 0.8651, ứng với điều kiện khách hàng chưa từng mua hàng, không dùng mã khuyến mãi, mua nhóm sản phẩm Accessories và thanh toán bằng tiền mặt. Điều này cho thấy trong điều kiện cơ bản, xác suất khách hàng là nữ đã ở mức khá cao.
Biến Promo.Code.Used có hệ số âm lớn (–1.0260), có ý nghĩa thống kê rất cao (p < 0.001), cho thấy việc sử dụng mã khuyến mãi làm giảm rõ rệt khả năng khách hàng là nữ. Đây là biến có ảnh hưởng mạnh nhất trong mô hình và đóng vai trò phân biệt giới tính rõ ràng.
Biến Previous.Purchases có hệ số dương (0.0030), có ý nghĩa thống kê ở mức 5% (p = 0.0443), cho thấy khách hàng từng mua sắm nhiều lần trong quá khứ có xác suất là nữ cao hơn. Tuy nhiên, hệ số nhỏ cho thấy mức độ ảnh hưởng là khiêm tốn.
Các biến còn lại như danh mục sản phẩm (Category) và phương thức thanh toán (Payment.Method) đều không có ý nghĩa thống kê (p > 0.1). Điều này cho thấy các yếu tố này không góp phần đáng kể trong việc phân biệt giới tính khách hàng trong tập dữ liệu hiện tại.
Tổng thể, mô hình Cloglog xác nhận rằng xác suất khách hàng là nữ chủ yếu bị ảnh hưởng bởi việc sử dụng mã khuyến mãi (ảnh hưởng âm rõ rệt) và tần suất mua hàng trước đó (ảnh hưởng dương nhẹ). Các yếu tố còn lại không cho thấy giá trị giải thích rõ ràng đối với biến phụ thuộc.