Dữ liệu được sử dụng trong bài có tên là Supermarket Sales Dataset. Dữ liệu được tác giả thu thập từ trang web Kaggle. Bộ dữ liệu này ghi lại các giao dịch cá nhân từ một chuỗi siêu thị tại Myanmar, với các thuộc tính chi tiết cho mỗi lần bán hàng. Bộ dữ liệu này có thể dùng để phân tích các mẫu bán hàng, sở thích khách hàng và hành vi thanh toán, rất phù hợp cho các dự án về học máy (machine learning), phân tích kinh doanh và trực quan hóa dữ liệu.
Ta tiến hành đọc file excel và gán bộ dữ liệu vào object tên data4.
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(DT)
library(readxl)
data4 <- read_excel("/Users/lengoctuongvy/Downloads/TLHK2:2025/T2_PHÂN TÍCH DỮ LIỆU ĐỊNH TÍNH/SuperMarket-Analysis.xlsx")
datatable(data4)
Ta thực hiện lệnh dim() để xem bộ dữ liệu có bao nhiêu biến và bao nhiêu quan sát.
dim(data4)
## [1] 1000 17
Nhận xét tổng quan về dữ liệu: Bộ dữ liệu Supermarket Sales bao gồm 1.000 quan sát và 17 biến. Mỗi quan sát tương ứng với một giao dịch tại siêu thị, được mô tả chi tiết bằng các đặc điểm như: chi nhánh, loại khách hàng, giới tính, dòng sản phẩm, phương thức thanh toán, giá cả, số lượng, doanh thu, lợi nhuận và mức độ hài lòng của khách hàng. Cấu trúc này giúp phân tích hành vi mua sắm, xu hướng thanh toán và đánh giá hiệu quả kinh doanh của từng chi nhánh một cách toàn diện.
Tiếp theo ta tiến hành xem tên các biến có trong dataset này.
names(data4)
## [1] "Invoice ID" "Branch"
## [3] "City" "Customer type"
## [5] "Gender" "Product line"
## [7] "Unit price" "Quantity"
## [9] "Tax 5%" "Sales"
## [11] "Date" "Time"
## [13] "Payment" "cogs"
## [15] "gross margin percentage" "gross income"
## [17] "Rating"
Dữ liệu bao gồm các biến sau:
Invoice ID: Mã định danh duy nhất cho mỗi giao dịch.
Branch: Chi nhánh siêu thị (ví dụ: Yangon, Naypyitaw, Mandalay).
City: Thành phố nơi chi nhánh siêu thị tọa lạc.
Customer Type: Loại khách hàng, phân biệt là “Member” (thành viên) hoặc “Normal” (khách thường).
Gender: Giới tính của khách hàng.
Product Line: Loại sản phẩm được bán (ví dụ: Sức khỏe & Làm đẹp, Phụ kiện điện tử, Gia dụng & Phong cách sống).
Unit Price: Giá bán theo đơn vị sản phẩm.
Quantity: Số lượng sản phẩm mua.
Tax 5%: Số tiền thuế tính theo tỷ lệ 5% trên giao dịch.
Total: Tổng tiền giao dịch bao gồm cả thuế.
Date: Ngày thực hiện giao dịch.
Time: Thời gian thực hiện giao dịch.
Payment: Phương thức thanh toán (ví dụ: Tiền mặt, Ví điện tử, Thẻ tín dụng).
COGS: Giá vốn hàng bán, tức là chi phí nguyên liệu sản phẩm.
Gross Margin Percentage: Tỷ lệ lợi nhuận cố định cho mỗi lần bán (4.7619%).
Gross Income: Lợi nhuận thu được từ giao dịch.
Rating: Đánh giá sự hài lòng của khách hàng (thang điểm 10).
Ta tiến hành xem có biến bị thiếu trong bộ dữ liệu hay không?
sum(is.na(data4))
## [1] 0
Hàm is.na() trong R được sử dụng để xác định các giá trị bị thiếu (NA) trong dữ liệu.
Kết quả trả về là TRUE tại những vị trí có giá trị thiếu.
Trả về FALSE nếu giá trị tại vị trí đó không bị thiếu.
Khi kết hợp với hàm sum(), ta có thể đếm tổng số giá trị bị thiếu trong toàn bộ tập dữ liệu: Trong R, TRUE được quy đổi thành 1, còn FALSE là 0. Do đó, hàm sum() sẽ cộng tất cả các giá trị TRUE, tương đương với tổng số ô bị thiếu dữ liệu trong data. Vậy ta nhận thấy không có giá trị NA trong dataset này.
Ta tiến hành xem cấu trúc tổng quát của dataset này:
str(data4)
## tibble [1,000 × 17] (S3: tbl_df/tbl/data.frame)
## $ Invoice ID : chr [1:1000] "750-67-8428" "226-31-3081" "631-41-3108" "123-19-1176" ...
## $ Branch : chr [1:1000] "Alex" "Giza" "Alex" "Alex" ...
## $ City : chr [1:1000] "Yangon" "Naypyitaw" "Yangon" "Yangon" ...
## $ Customer type : chr [1:1000] "Member" "Normal" "Normal" "Member" ...
## $ Gender : chr [1:1000] "Female" "Female" "Female" "Female" ...
## $ Product line : chr [1:1000] "Health and beauty" "Electronic accessories" "Home and lifestyle" "Health and beauty" ...
## $ Unit price : num [1:1000] 74.7 15.3 46.3 58.2 86.3 ...
## $ Quantity : num [1:1000] 7 5 7 8 7 7 6 10 2 3 ...
## $ Tax 5% : num [1:1000] 26.14 3.82 16.22 23.29 30.21 ...
## $ Sales : num [1:1000] 549 80.2 340.5 489 634.4 ...
## $ Date : chr [1:1000] "1/5/2019" "3/8/2019" "3/3/2019" "1/27/2019" ...
## $ Time : chr [1:1000] "1:08:00 PM" "10:29:00 AM" "1:23:00 PM" "8:33:00 PM" ...
## $ Payment : chr [1:1000] "Ewallet" "Cash" "Credit card" "Ewallet" ...
## $ cogs : num [1:1000] 522.8 76.4 324.3 465.8 604.2 ...
## $ gross margin percentage: num [1:1000] 4.76 4.76 4.76 4.76 4.76 ...
## $ gross income : num [1:1000] 26.14 3.82 16.22 23.29 30.21 ...
## $ Rating : num [1:1000] 9.1 9.6 7.4 8.4 5.3 4.1 5.8 8 7.2 5.9 ...
Nhận xét về cấu trúc dữ liệu: Bộ dữ liệu có kích thước 1.000 quan sát × 17 biến, được lưu dưới dạng tibble, thuận tiện cho xử lý và hiển thị trong R.
Trong đó:
Có nhiều biến định tính dạng ký tự (chr), ví dụ:Branch, City, Customer type, Gender, Product line, Payment.
Một số biến định lượng dạng số (num), như: Unit price, Quantity, Tax 5%, Sales, cogs, gross income, Rating.
Biến thời gian gồm: Date và Time, ban đầu là chuỗi (chr) nhưng có thể chuyển về định dạng Date và POSIXct để phân tích chuỗi thời gian.
Các biến tài chính như Tax 5%, Sales, cogs, gross income có thể dùng để tính hiệu quả kinh doanh theo từng giao dịch, sản phẩm hoặc chi nhánh.
Bộ dữ liệu rất thích hợp cho việc phân tích hành vi tiêu dùng, đánh giá hiệu suất chi nhánh và xây dựng mô hình dự báo trong lĩnh vực bán lẻ.
Tác giả chọn biến Gender và Customer type làm biến phụ thuộc. Các biến Product line, Payment, City làm biến độc lập để tiến hành phân tích.
Thực hiện thống kê mô tả cho biến Gender để xem tần số và tần suất của biến Gender trong 1000 lượt mua sắm ở siêu thị, ta được kết quả sau:
table(data4$Gender)
##
## Female Male
## 571 429
table(data4$Gender)/sum(nrow(data4))
##
## Female Male
## 0.571 0.429
data4 %>%
group_by(Gender) %>%
summarise(n = n()) %>%
mutate(perc = round(n / sum(n) * 100, 1)) %>%
ggplot(aes(x = "", y = perc, fill = Gender)) +
geom_col(color = NA) + # bỏ viền đen đi
coord_polar("y") +
geom_text(aes(x = 1.3, label = paste0(perc, "%")),
position = position_stack(vjust = 0.5), size = 5) +
labs(caption = "Biểu đồ tròn thể hiện tỷ lệ giới tính") +
theme_void() +
theme(legend.title = element_blank()) +
scale_fill_manual(values = c("Female" = "deeppink",
"Male" = "yellow"))
Nhận xét: Kết quả thống kê từ bộ dữ liệu cho thấy, trong tổng số 1.000 giao dịch, có: 571 giao dịch được thực hiện bởi khách hàng nữ, chiếm 57.1%. 429 giao dịch đến từ khách hàng nam, tương ứng với 42.9%. Tỷ lệ này phản ánh rằng khách hàng nữ có xu hướng mua sắm tại siêu thị nhiều hơn so với nam giới. Sự chênh lệch khoảng 14.2 điểm phần trăm là khá đáng kể và có thể đến từ các yếu tố như: Phụ nữ thường đóng vai trò chính trong việc mua sắm nhu yếu phẩm cho gia đình. Các ngành hàng phổ biến tại siêu thị như sức khỏe & làm đẹp, đồ gia dụng, và thực phẩm có thể hấp dẫn khách hàng nữ hơn. Nữ giới cũng có xu hướng mua hàng thường xuyên với số lượng nhỏ, trong khi nam giới có thể mua ít hơn nhưng số lượng lớn hơn.
Thực hiện thống kê mô tả cho biến Customer type để xem tần số và tần suất của biến Gender trong 1000 lượt mua sắm ở siêu thị, ta được kết quả sau:
table(data4$`Customer type`)
##
## Member Normal
## 565 435
table(data4$`Customer type`)/sum(nrow(data4))
##
## Member Normal
## 0.565 0.435
data4 %>%
group_by(`Customer type`) %>%
summarise(n = n()) %>%
ggplot(aes(x = reorder(`Customer type`, n), y = n)) + # x là Product line, sắp xếp theo n
geom_col(fill = '#FF10F0') +
geom_text(aes(label = n), vjust = -0.5, color = 'black') + # hiện số lên trên cột
labs(x = "Loại khách hàng", y = "Tần số",
caption = "Biểu đồ tần số loại khách hàng ") +
theme_minimal() +
coord_flip() # xoay ngang để dễ đọc nhãn
Nhận xét:Biến Customer type phản ánh loại khách hàng khi mua sắm tại siêu thị, gồm hai nhóm: Member và Normal. Trong tổng số 1.000 giao dịch, khách hàng thuộc nhóm Member chiếm ưu thế với 565 giao dịch, tương đương 56.5% tổng số, trong khi nhóm khách hàng Normal chiếm 435 giao dịch, chiếm 43.5%. Điều này cho thấy hơn một nửa khách hàng khi mua sắm tại siêu thị là thành viên đã đăng ký, thể hiện hiệu quả của chương trình khách hàng thân thiết trong việc thu hút và giữ chân khách hàng. Đồng thời, nhóm khách hàng không phải thành viên vẫn chiếm tỷ lệ khá lớn, cho thấy siêu thị vẫn có sức hấp dẫn rộng rãi đối với khách hàng mới hoặc không tham gia chương trình thành viên. Đây là cơ sở để siêu thị tiếp tục phát triển các chiến lược marketing, ưu đãi phù hợp nhằm tăng tỷ lệ khách hàng thành viên và thúc đẩy doanh thu bền vững.
Ta chọn 3 hạng mục từ 3 biến của danh sách các biến định tính trên, bao gồm:
Hạng mục “Female” của biến Gender - giới tính
Hạng mục “Member” của biến Customer type
Ta thực hiện khoảng ước lượng với độ tin cậy 95% cho tỷ lệ giới tính nữ (Gender=“Female”), ta thực hiện như sau:
# Số người là nữ
n_female <- sum(data4$Gender == "Female")
# Tổng số quan sát
n_total <- nrow(data4)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ nữ
prop.test(n_female, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_female out of n_total, null probability 0.5
## X-squared = 19.881, df = 1, p-value = 8.242e-06
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5396076 0.6018401
## sample estimates:
## p
## 0.571
Bài toán kiểm định
\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ nữ trong tổng thể } = 0.5 \\ H_1: & \text{Tỷ lệ nữ trong tổng thể } \ne 0.5 \end{array} \right. \]
Mức ý nghĩa 5%.
Diễn giải kết quả kiểm định:
Nếu p-value < 0.05 ⇒ bác bỏ H0 ⇒ tỷ lệ nữ ≠ 50%, có ý nghĩa thống kê.
Nếu p-value ≥ 0.05 ⇒ Chấp nhận H0, không đủ bằng chứng để nói tỷ lệ nữ khác 50%.
Ta thấy p_value= 8.242e-06<0.05, bác bỏ H0. Vậy tỷ lệ nữ trong mẫu khác 0.5 tại mức ý nghĩa 5%.
Ta thực hiện khoảng ước lượng với độ tin cậy 95% cho tỷ lệ giới tính nữ (Gender=“Female”), ta thực hiện như sau:
# Số người là nữ
n_member <- sum(data4$`Customer type` == "Member")
# Tổng số quan sát
n_total <- nrow(data4)
# Ước lượng khoảng tin cậy 95% cho tỷ lệ nữ
prop.test(n_member, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_member out of n_total, null probability 0.5
## X-squared = 16.641, df = 1, p-value = 4.516e-05
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5335802 0.5959142
## sample estimates:
## p
## 0.565
Bài toán kiểm định
\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ khách hàng thành viên trong tổng thể } = 0.5 \\ H_1: & \text{Tỷ lệ khách hàng thành viên trong tổng thể } \ne 0.5 \end{array} \right. \]
Mức ý nghĩa 5%.
Diễn giải kết quả kiểm định:
Nếu p-value < 0.05 ⇒ bác bỏ H0 ⇒ tỷ lệ nữ ≠ 50%, có ý nghĩa thống kê.
Nếu p-value ≥ 0.05 ⇒ Chấp nhận H0, không đủ bằng chứng để nói tỷ lệ nữ khác 50%.
Ta thấy p_value= 4.516e-15<0.05, bác bỏ H0. Vậy tỷ lệ khách hàng thành viên trong mẫu khác 0.5 tại mức ý nghĩa 5%.
Tác giả chọn biến Gender và Customer type làm biến phụ thuộc. Các biến Product line, Payment, City làm biến độc lập để phân tích mối quan hệ giữa Hai biến Định tính (Bivariate Analysis) như sau:
Gender và Customer type
Gender và Product line
Gender và Payment
Gender và City
Customer type và Product line
Customer type và Payment
Customer type và City
Ta thực hiện tạo bảng tần số, tần số biên cho biến đã chọn.
g2 <- table(data4$Gender, data4$`Customer type`)
addmargins(g2)
##
## Member Normal Sum
## Female 356 215 571
## Male 209 220 429
## Sum 565 435 1000
Ta thực hiện tạo bảng tần suất, tần suất biên cho biến đã chọn.
addmargins(prop.table(table(data4$Gender, data4$`Customer type`)))
##
## Member Normal Sum
## Female 0.356 0.215 0.571
## Male 0.209 0.220 0.429
## Sum 0.565 0.435 1.000
ggplot(data4 %>% group_by(Gender, `Customer type`) %>% summarise(count = n()) %>% ungroup(), aes(x = Gender, y = count, fill = `Customer type`)) +
geom_col(position = position_dodge()) +
geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5) +
labs(title = "Dòng sản phẩm bán ra theo giới tính", y = "Số lượng sản phẩm", x = "Giới tính")
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
Nhận xét:
Bảng tần số cho thấy trong tổng số 1.000 khách hàng, nữ chiếm 571 người (57.1%) và nam chiếm 429 người (42.9%). Xét theo loại khách hàng, trong nhóm “Member” (thành viên), số lượng nữ là 356, cao hơn đáng kể so với nam là 209. Ngược lại, trong nhóm “Normal” (khách thường), số lượng nam (220) nhỉnh hơn một chút so với nữ (215).
Bảng tần suất phản ánh rõ hơn tỷ lệ này: trong khi 35.6% khách hàng là nữ thuộc nhóm thành viên, thì tỷ lệ nam ở nhóm này chỉ là 20.9%; còn ở nhóm khách thường, tỷ lệ nữ và nam lần lượt là 21.5% và 22.0%.
Từ đó có thể thấy, khách hàng nữ có xu hướng đăng ký làm thành viên nhiều hơn so với nam. Đây là một đặc điểm đáng chú ý, gợi ý rằng các chương trình thành viên hoặc chính sách chăm sóc khách hàng thân thiết có thể đang hấp dẫn hơn với nữ giới. Doanh nghiệp có thể tận dụng đặc điểm này để điều chỉnh các chiến dịch marketing hoặc xây dựng chính sách ưu đãi hướng đến nhóm đối tượng phù hợp hơn.
chisq.test(table(data4$Gender, data4$`Customer type`))
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table(data4$Gender, data4$`Customer type`)
## X-squared = 17.962, df = 1, p-value = 2.253e-05
\[ \left\{ \begin{array}{ll} H_0: & \text{Giới tính và loại khách hàng là độc lập}\\ H_1: & \text{Giới tính và loại khách hàng có liên quan} \end{array} \right. \] Mức ý nghĩa 5%.
Ta thấy giá trị thống kê kiểm định là \(\chi^2 = 17{.}962\) với 1 bậc tự do và giá trị p rất nhỏ \(p\text{-value} = 2{.}253 \times 10^{-5}\). Vì \(p < 0.05\), nên bác bỏ giả thuyết không.
Vậy, có đủ bằng chứng thống kê để kết luận rằng giới tính và loại khách hàng có mối liên hệ với nhau ở mức ý nghĩa 5%. Điều này cho thấy việc một khách hàng là nam hay nữ có ảnh hưởng đến việc họ thuộc nhóm “Member” hay “Normal”, và đây là thông tin quan trọng để doanh nghiệp thiết kế chính sách khách hàng phù hợp hơn theo giới tính.
Ta thực hiện tạo bảng tần số, tần số biên cho biến đã chọn.
g1 <- table(data4$Gender, data4$`Product line`)
addmargins(g1)
##
## Electronic accessories Fashion accessories Food and beverages
## Female 94 108 98
## Male 76 70 76
## Sum 170 178 174
##
## Health and beauty Home and lifestyle Sports and travel Sum
## Female 77 91 103 571
## Male 75 69 63 429
## Sum 152 160 166 1000
Ta thực hiện tạo bảng tần suất, tần suất biên cho biến đã chọn.
addmargins(prop.table(table(data4$Gender, data4$`Product line`)))
##
## Electronic accessories Fashion accessories Food and beverages
## Female 0.094 0.108 0.098
## Male 0.076 0.070 0.076
## Sum 0.170 0.178 0.174
##
## Health and beauty Home and lifestyle Sports and travel Sum
## Female 0.077 0.091 0.103 0.571
## Male 0.075 0.069 0.063 0.429
## Sum 0.152 0.160 0.166 1.000
ggplot(data4 %>% group_by(Gender, `Product line`) %>% summarise(count = n()) %>% ungroup(), aes(x = Gender, y = count, fill = `Product line`)) +
geom_col(position = position_dodge()) +
geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5) +
labs(title = "Dòng sản phẩm bán ra theo giới tính", y = "Số lượng sản phẩm", x = "Giới tính")
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
Nhận xét:
Bảng tần số cho thấy trong tổng số 1000 quan sát, nữ chiếm 571 và nam chiếm 429. Trong từng dòng sản phẩm, nữ thường có số lượng đơn hàng cao hơn nam, ví dụ: nữ mua 108 đơn hàng dòng Fashion accessories trong khi nam chỉ mua 70; nữ mua 98 đơn hàng Food and beverages so với 76 của nam. Tuy nhiên, ở một số dòng như Health and beauty và Sports and travel, số lượng đơn hàng của nữ và nam khá gần nhau (nữ 77 vs nam 75, nữ 103 vs nam 63).
Bảng tần suất làm rõ tỷ lệ tương ứng trong tổng số 1000 đơn hàng. Các dòng sản phẩm phổ biến nhất là Fashion accessories (17.8%), Food and beverages (17.4%) và Electronic accessories (17.0%), với tỷ lệ nữ cao hơn nam ở hầu hết các dòng, đặc biệt là Fashion accessories (nữ 10.8%, nam 7.0%) và Electronic accessories (nữ 9.4%, nam 7.6%). Tổng tỷ lệ nữ chiếm 57.1%, cao hơn so với tỷ lệ nam 42.9%, phù hợp với tần số quan sát.
Như vậy, dữ liệu cho thấy nữ giới có xu hướng mua sắm nhiều hơn nam ở các dòng sản phẩm đa dạng, đặc biệt là các sản phẩm phụ kiện và thực phẩm, trong khi nam có tỷ lệ thấp hơn nhưng không quá chênh lệch đáng kể ở các nhóm khác. Tổng thể, nữ đóng góp phần lớn hơn vào tổng số giao dịch của siêu thị.
chisq.test(table(data4$Gender, data4$`Product line`))
##
## Pearson's Chi-squared test
##
## data: table(data4$Gender, data4$`Product line`)
## X-squared = 5.4353, df = 5, p-value = 0.3651
\[ \left\{ \begin{array}{ll} H_0: & \text{Giới tính và dòng sản phẩm là độc lập}\\ H_1: & \text{Giới tính và dòng sản phẩm có liên quan} \end{array} \right. \]
Mức ý nghĩa 5%.
Ta thấy p_value=0.3651>0.05, không đủ bằng chứng để bác bỏ H0. Vậy Giới tính và dòng sản phẩm là độc lập tại mức ý nghĩa 5%.
Ta thực hiện tạo bảng tần số, tần số biên cho biến đã chọn.
g3 <- table(data4$Gender, data4$Payment)
addmargins(g3)
##
## Cash Credit card Ewallet Sum
## Female 205 183 183 571
## Male 139 128 162 429
## Sum 344 311 345 1000
Ta thực hiện tạo bảng tần suất, tần suất biên cho biến đã chọn.
addmargins(prop.table(table(data4$Gender, data4$Payment)))
##
## Cash Credit card Ewallet Sum
## Female 0.205 0.183 0.183 0.571
## Male 0.139 0.128 0.162 0.429
## Sum 0.344 0.311 0.345 1.000
ggplot(data4 %>% group_by(Gender, Payment) %>% summarise(count = n()) %>% ungroup(), aes(x = Gender, y = count, fill = Payment)) +
geom_col(position = position_dodge()) +
geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5) +
labs(title = "Dòng sản phẩm bán ra theo giới tính", y = "Số lượng sản phẩm", x = "Giới tính")
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
Nhận xét:
Bảng tần số cho thấy trong tổng số 1.000 khách hàng, có 571 người là nữ (57.1%) và 429 người là nam (42.9%). Xét theo phương thức thanh toán, nữ giới sử dụng ba hình thức gần như đồng đều, với 205 người dùng tiền mặt, 183 dùng thẻ tín dụng và 183 dùng ví điện tử. Trong khi đó, nam giới có xu hướng ưa chuộng ví điện tử hơn (162 người), so với 139 người thanh toán bằng tiền mặt và 128 người dùng thẻ tín dụng.
Bảng tần suất cho thấy tỷ lệ nữ sử dụng từng phương thức lần lượt là 20.5% (Cash), 18.3% (Credit card) và 18.3% (Ewallet), còn tỷ lệ của nam là 13.9%, 12.8% và 16.2%. Nhìn chung, ví điện tử là phương thức phổ biến nhất với tổng tỷ lệ 34.5%, theo sau là tiền mặt (34.4%) và thẻ tín dụng (31.1%).
Như vậy, có thể thấy nữ giới có xu hướng phân bổ đều giữa các phương thức thanh toán, trong khi nam giới nghiêng nhiều hơn về ví điện tử. Kết quả này gợi ý rằng các giải pháp thanh toán số như ví điện tử đang được nam giới ưa chuộng hơn và có thể là kênh tiềm năng để tiếp cận nhóm khách hàng này trong các chiến dịch khuyến mãi hoặc chăm sóc khách hàng.
chisq.test(table(data4$Gender, data4$Payment))
##
## Pearson's Chi-squared test
##
## data: table(data4$Gender, data4$Payment)
## X-squared = 3.5758, df = 2, p-value = 0.1673
\[ \left\{ \begin{array}{ll} H_0: & \text{Giới tính và phương thức thanh toán là độc lập}\\ H_1: & \text{Giới tính và phương thức thanh toán có liên quan} \end{array} \right. \] Mức ý nghĩa 5%.
Ta thấy giá trị thống kê kiểm định là \(\chi^2 = 3{.}576\) với 2 bậc tự do và giá trị p là \(p\text{-value} = 0{.}1673\). Vì \(p > 0.05\), không đủ bằng chứng để bác bỏ giả thuyết không.
Vậy, giới tính và phương thức thanh toán là độc lập với nhau tại mức ý nghĩa 5%. Nói cách khác, việc khách hàng là nam hay nữ không ảnh hưởng đáng kể đến lựa chọn phương thức thanh toán, và hai biến này không có mối liên hệ rõ ràng về mặt thống kê trong dữ liệu.
Ta thực hiện tạo bảng tần số, tần số biên cho biến đã chọn.
g4 <- table(data4$Gender, data4$City)
addmargins(g4)
##
## Mandalay Naypyitaw Yangon Sum
## Female 184 200 187 571
## Male 148 128 153 429
## Sum 332 328 340 1000
Ta thực hiện tạo bảng tần suất, tần suất biên cho biến đã chọn.
addmargins(prop.table(table(data4$Gender, data4$City)))
##
## Mandalay Naypyitaw Yangon Sum
## Female 0.184 0.200 0.187 0.571
## Male 0.148 0.128 0.153 0.429
## Sum 0.332 0.328 0.340 1.000
ggplot(data4 %>% group_by(Gender, City) %>% summarise(count = n()) %>% ungroup(), aes(x = Gender, y = count, fill = City)) +
geom_col(position = position_dodge()) +
geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5) +
labs(title = "Dòng sản phẩm bán ra theo giới tính", y = "Số lượng sản phẩm", x = "Giới tính")
## `summarise()` has grouped output by 'Gender'. You can override using the
## `.groups` argument.
Nhận xét:
Bảng tần số cho thấy trong tổng số 1.000 khách hàng, có 571 người là nữ (57.1%) và 429 người là nam (42.9%). Khi xét theo thành phố, số lượng nữ giới luôn cao hơn nam giới ở cả ba địa điểm. Cụ thể, tại Naypyitaw, có 200 khách hàng nữ so với 128 nam; ở Yangon, có 187 nữ và 153 nam; còn tại Mandalay, có 184 nữ và 148 nam.
Bảng tần suất cho thấy tỷ lệ khách hàng nữ phân bổ khá đồng đều giữa các thành phố, lần lượt là 18.4% (Mandalay), 20.0% (Naypyitaw) và 18.7% (Yangon). Trong khi đó, tỷ lệ nam giới thấp hơn nữ ở mọi nơi: 14.8%, 12.8% và 15.3% tương ứng. Tổng thể, ba thành phố có tỷ lệ khách gần như ngang nhau, với Naypyitaw chiếm 32.8%, Mandalay 33.2%, và Yangon 34.0%.
Từ các số liệu trên có thể thấy nữ giới chiếm tỷ lệ cao hơn nam tại cả ba thành phố, và sự phân bổ khách hàng giữa các địa điểm là khá đồng đều. Điều này cho thấy siêu thị có mạng lưới khách hàng nữ ổn định và rộng khắp, mở ra cơ hội để triển khai các chiến dịch marketing theo khu vực mà vẫn đảm bảo tiếp cận hiệu quả nhóm khách hàng chính là nữ giới.
chisq.test(table(data4$Gender, data4$City))
##
## Pearson's Chi-squared test
##
## data: table(data4$Gender, data4$City)
## X-squared = 3.0051, df = 2, p-value = 0.2226
\[ \left\{ \begin{array}{ll} H_0: & \text{Giới tính và thành phố là độc lập}\\ H_1: & \text{Giới tính và thành phố có liên quan} \end{array} \right. \] Mức ý nghĩa 5%.
Ta thấy giá trị thống kê kiểm định là \(\chi^2 = 3{.}005\) với 2 bậc tự do và giá trị p là \(p\text{-value} = 0{.}2226\). Vì \(p > 0.05\), không đủ bằng chứng để bác bỏ giả thuyết không.
Vậy, giới tính và thành phố là độc lập với nhau tại mức ý nghĩa 5%. Điều này có nghĩa là việc khách hàng là nam hay nữ không có mối liên hệ thống kê rõ ràng với việc họ mua sắm ở thành phố nào, và hai biến này không ảnh hưởng lẫn nhau trong tập dữ liệu này.
Ta thực hiện tạo bảng tần số, tần số biên cho biến đã chọn.
c3 <- table(data4$`Customer type`, data4$`Product line`)
addmargins(c3)
##
## Electronic accessories Fashion accessories Food and beverages
## Member 90 96 104
## Normal 80 82 70
## Sum 170 178 174
##
## Health and beauty Home and lifestyle Sports and travel Sum
## Member 86 92 97 565
## Normal 66 68 69 435
## Sum 152 160 166 1000
Ta thực hiện tạo bảng tần suất, tần suất biên cho biến đã chọn.
addmargins(prop.table(table(data4$`Customer type`, data4$`Product line`)))
##
## Electronic accessories Fashion accessories Food and beverages
## Member 0.090 0.096 0.104
## Normal 0.080 0.082 0.070
## Sum 0.170 0.178 0.174
##
## Health and beauty Home and lifestyle Sports and travel Sum
## Member 0.086 0.092 0.097 0.565
## Normal 0.066 0.068 0.069 0.435
## Sum 0.152 0.160 0.166 1.000
ggplot(data4 %>% group_by(`Customer type`, `Product line`) %>% summarise(count = n()) %>% ungroup(), aes(x = `Customer type` , y = count, fill = `Product line`)) +
geom_col(position = position_dodge()) +
geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5) +
labs(title = "Phương thức thanh toán theo loại khách hàng", y = "Số lần thanh toán ", x = "Loại khách hàng")
## `summarise()` has grouped output by 'Customer type'. You can override using the
## `.groups` argument.
Nhận xét:
ảng tần số cho thấy trong tổng số 1.000 khách hàng, có 565 là thành viên (Member) và 435 là khách thường (Normal). Nhìn chung, số lượng đơn hàng của nhóm thành viên luôn cao hơn nhóm khách thường ở tất cả các dòng sản phẩm. Cụ thể, nhóm thành viên mua 104 đơn hàng dòng Food and beverages, trong khi nhóm khách thường chỉ mua 70 đơn hàng; tương tự, với dòng Fashion accessories, số đơn hàng của thành viên là 96, còn khách thường là 82. Ở các dòng khác như Health and beauty hay Sports and travel, thành viên cũng chiếm ưu thế hơn với lần lượt 86 và 97 đơn hàng, so với 66 và 69 của khách thường.
Bảng tần suất phản ánh rõ hơn tỷ lệ này: khách hàng thành viên có tỷ lệ mua cao hơn trong tất cả các dòng sản phẩm, nổi bật như Food and beverages (10.4% vs. 7.0%) và Health and beauty (8.6% vs. 6.6%). Tổng tỷ lệ mua theo từng nhóm là 56.5% thuộc về thành viên và 43.5% thuộc về khách thường, phù hợp với số lượng quan sát.
Từ đó có thể thấy khách hàng là thành viên có xu hướng mua sắm nhiều hơn trong hầu hết các dòng sản phẩm, đặc biệt ở các nhóm như thực phẩm, làm đẹp, và phụ kiện. Điều này cho thấy chương trình thành viên đang phát huy hiệu quả trong việc gia tăng giá trị giao dịch và giữ chân khách hàng. Doanh nghiệp có thể tiếp tục phát triển các chương trình ưu đãi riêng cho thành viên để khai thác tối đa giá trị từ nhóm khách hàng trung thành này.
chisq.test(table(data4$`Customer type`, data4$`Product line`))
##
## Pearson's Chi-squared test
##
## data: table(data4$`Customer type`, data4$`Product line`)
## X-squared = 2.4286, df = 5, p-value = 0.7872
\[ \left\{ \begin{array}{ll} H_0: & \text{Loại khách hàng và dòng sản phẩm là độc lập}\\ H_1: & \text{ Loại khách hàng và dòng sản phẩm có liên quan} \end{array} \right. \]
Mức ý nghĩa 5%.
Ta thấy giá trị thống kê kiểm định là \(\chi^2 = 2{.}429\) với 5 bậc tự do và giá trị p là \(p\text{-value} = 0{.}7872\). Vì \(p > 0.05\), không đủ bằng chứng để bác bỏ giả thuyết không.
Vậy, loại khách hàng và dòng sản phẩm là độc lập với nhau tại mức ý nghĩa 5%. Điều này cho thấy việc một khách hàng là “Member” hay “Normal” không ảnh hưởng đáng kể đến lựa chọn dòng sản phẩm, và hai biến này không có mối liên hệ thống kê rõ ràng trong dữ liệu hiện có.
Ta thực hiện tạo bảng tần số, tần số biên cho biến đã chọn.
c1 <- table(data4$`Customer type`, data4$Payment)
addmargins(c1)
##
## Cash Credit card Ewallet Sum
## Member 192 187 186 565
## Normal 152 124 159 435
## Sum 344 311 345 1000
Ta thực hiện tạo bảng tần suất, tần suất biên cho biến đã chọn.
addmargins(prop.table(table(data4$`Customer type`, data4$Payment)))
##
## Cash Credit card Ewallet Sum
## Member 0.192 0.187 0.186 0.565
## Normal 0.152 0.124 0.159 0.435
## Sum 0.344 0.311 0.345 1.000
ggplot(data4 %>% group_by(`Customer type`, Payment) %>% summarise(count = n()) %>% ungroup(), aes(x = `Customer type` , y = count, fill = Payment)) +
geom_col(position = position_dodge()) +
geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5) +
labs(title = "Phương thức thanh toán theo loại khách hàng", y = "Số lần thanh toán ", x = "Loại khách hàng")
## `summarise()` has grouped output by 'Customer type'. You can override using the
## `.groups` argument.
Nhận xét:
Bảng thể hiện phân phối số lượng giao dịch và tỷ lệ tương ứng theo loại khách hàng (Member và Normal) cùng phương thức thanh toán (Cash, Credit card, Ewallet).
Tổng cộng có 1000 giao dịch, trong đó khách hàng là Member chiếm 56.5% (565 giao dịch) và khách hàng Normal chiếm 43.5% (435 giao dịch).
Về phương thức thanh toán, phương thức phổ biến nhất là Ewallet (34.5%), tiếp đến là Cash (34.4%) và Credit card (31.1%).
Đối với khách hàng Member, các phương thức thanh toán được sử dụng khá đồng đều: khoảng 19.2% chọn Cash, 18.7% chọn Credit card, và 18.6% chọn Ewallet. Điều này cho thấy khách hàng thành viên đa dạng trong lựa chọn hình thức thanh toán.
Khách hàng Normal có xu hướng thanh toán bằng Ewallet (15.9%) cao hơn so với dùng Cash (15.2%) và Credit card (12.4%). Đây có thể là dấu hiệu cho thấy nhóm khách hàng này ưa thích sử dụng ví điện tử hơn so với các hình thức truyền thống.
So sánh tỷ lệ thanh toán giữa hai nhóm, khách hàng Member có tỷ lệ sử dụng Credit card cao hơn đáng kể (18.7% so với 12.4%) so với khách hàng Normal, phản ánh khả năng và thói quen chi tiêu có thể khác biệt giữa hai nhóm.
Tổng thể, bảng cho thấy sự phân bố phương thức thanh toán khá cân bằng giữa hai nhóm khách hàng, với sự ưu tiên nhẹ cho phương thức Ewallet và Cash trong cả hai nhóm. Những thông tin này có thể hỗ trợ siêu thị trong việc xây dựng chiến lược marketing, chương trình khuyến mãi hoặc phát triển các phương thức thanh toán phù hợp với từng nhóm khách hàng.
chisq.test(table(data4$`Customer type`, data4$`Payment`))
##
## Pearson's Chi-squared test
##
## data: table(data4$`Customer type`, data4$Payment)
## X-squared = 2.6714, df = 2, p-value = 0.263
\[ \left\{ \begin{array}{ll} H_0: & \text{Loại khách hàng và phương thức thanh toán là độc lập}\\ H_1: & \text{ Loại khách hàng và phương thức thanh toán có liên quan} \end{array} \right. \]
Mức ý nghĩa 5%.
Ta thấy p_value=0.263>0.05, không đủ bằng chứng để bác bỏ H0. Vậy loại khách hàng và phương thức thanh toán là độc lập tại mức ý nghĩa 5%.
Ta thực hiện tạo bảng tần số, tần số biên cho biến đã chọn.
c1 <- table(data4$`Customer type`, data4$City)
addmargins(c1)
##
## Mandalay Naypyitaw Yangon Sum
## Member 181 194 190 565
## Normal 151 134 150 435
## Sum 332 328 340 1000
Ta thực hiện tạo bảng tần suất, tần suất biên cho biến đã chọn.
addmargins(prop.table(table(data4$`Customer type`, data4$City)))
##
## Mandalay Naypyitaw Yangon Sum
## Member 0.181 0.194 0.190 0.565
## Normal 0.151 0.134 0.150 0.435
## Sum 0.332 0.328 0.340 1.000
ggplot(data4 %>% group_by(`Customer type`, City) %>% summarise(count = n()) %>% ungroup(), aes(x = `Customer type` , y = count, fill = City)) +
geom_col(position = position_dodge()) +
geom_text(aes(label = count), position = position_dodge(width = 0.9), vjust = -0.5) +
labs(title = "Phương thức thanh toán theo loại khách hàng", y = "Số lần thanh toán ", x = "Loại khách hàng")
## `summarise()` has grouped output by 'Customer type'. You can override using the
## `.groups` argument.
Nhận xét:
Bảng tần số cho thấy trong tổng số 1.000 khách hàng, có 565 là thành viên (Member) và 435 là khách thường (Normal). Nhìn chung, số lượng thành viên luôn cao hơn khách thường ở cả ba thành phố. Cụ thể, tại Mandalay, có 181 thành viên so với 151 khách thường; ở Naypyitaw, là 194 thành viên so với 134 khách thường; tại Yangon, thành viên là 190 và khách thường là 150.
Bảng tần suất phản ánh tỷ lệ tương đối giữa các nhóm: trong từng thành phố, thành viên luôn chiếm tỷ lệ cao hơn, nổi bật ở Naypyitaw (19.4% so với 13.4%) và Mandalay (18.1% so với 15.1%). Tổng tỷ lệ khách hàng theo thành phố là khá đồng đều: Yangon chiếm 34.0%, Mandalay 33.2%, và Naypyitaw 32.8%.
Từ những quan sát trên, có thể thấy chương trình thành viên được duy trì hiệu quả ở cả ba thành phố, đặc biệt là tại Naypyitaw, nơi tỷ lệ thành viên cao nhất. Điều này gợi ý rằng doanh nghiệp có thể tiếp tục củng cố chương trình thành viên hiện tại, đồng thời xem xét mở rộng các hoạt động chăm sóc khách hàng ở từng khu vực, tận dụng sự hiện diện đồng đều của khách hàng trên toàn hệ thống.
chisq.test(table(data4$`Customer type`, data4$City))
##
## Pearson's Chi-squared test
##
## data: table(data4$`Customer type`, data4$City)
## X-squared = 1.518, df = 2, p-value = 0.4681
\[ \left\{ \begin{array}{ll} H_0: & \text{Loại khách hàng và thành phố là độc lập}\\ H_1: & \text{ Loại khách hàng và phương thức thanh toán có liên quan} \end{array} \right. \]
Mức ý nghĩa 5%.
Ta thấy giá trị thống kê kiểm định là \(\chi^2 = 1{.}518\) với 2 bậc tự do và giá trị p là \(p\text{-value} = 0{.}4681\). Vì \(p > 0.05\), không đủ bằng chứng để bác bỏ giả thuyết không.
Vậy, loại khách hàng và thành phố là độc lập với nhau tại mức ý nghĩa 5%. Điều này có nghĩa là việc khách hàng là thành viên hay khách thường không có mối liên hệ thống kê rõ ràng với thành phố mà họ mua sắm, hai biến này không ảnh hưởng lẫn nhau trong dữ liệu.
Quan tâm đến nhóm khách hàng là nam (Male) và là khách hàng thường (Normal).
v1 <-table(data4$Gender, data4$`Customer type`)
print(v1)
##
## Member Normal
## Female 356 215
## Male 209 220
library(epitools)
riskratio(v1)
## $data
##
## Member Normal Total
## Female 356 215 571
## Male 209 220 429
## Total 565 435 1000
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 1.361956 1.183832 1.566882
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 1.754614e-05 2.052252e-05 1.687688e-05
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét: Theo bảng kết quả ta nhận Female là nhóm tham chiếu RR=1.000. Ta thấy Male có RR=1.1362, nghĩa là khách hàng thường là nam khoảng 1.1362 lần so với nữ. Khoảng ước lượng là (1.184;1.567) với độ tin cậy 95%.
Quan tâm đến nhóm khách hàng là nam (Male) và là khách hàng thành viên (Member).
riskratio(v1, rev = 'c')
## $data
##
## Normal Member Total
## Female 215 356 571
## Male 220 209 429
## Total 435 565 1000
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Female 1.0000000 NA NA
## Male 0.7814031 0.6957219 0.8776362
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 1.754614e-05 2.052252e-05 1.687688e-05
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét: Theo bảng kết quả ta nhận Female là nhóm tham chiếu RR=1.000. Ta thấy Male có RR=0.7814, nghĩa là khách hàng thành viên là nam khoảng 0.7814 lần so với nữ. Khoảng ước lượng là (0.6957;0.8776) với độ tin cậy 95%.
Quan tâm đến nhóm khách hàng là nữ (Female) và là khách hàng thường (Normal).
v2 <-table(data4$`Customer type`, data4$Gender)
riskratio(v2, rev = 'c')
## $data
##
## Male Female Total
## Member 209 356 565
## Normal 220 215 435
## Total 429 571 1000
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Member 1.0000000 NA NA
## Normal 0.7844182 0.6998056 0.8792612
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Member NA NA NA
## Normal 1.754614e-05 2.052252e-05 1.687688e-05
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét: Theo bảng kết quả ta nhận Member là nhóm tham chiếu RR=1.000. Ta thấy Normal có RR=0.7844, nghĩa là khách hàng thường là nữ khoảng 0.7844 lần so với nam. Khoảng ước lượng là (0.6998;0.8793) với độ tin cậy 95%.
Quan tâm đến nhóm khách hàng là nữ (Female) và là khách hàng thành viên (Member).
riskratio(v1, rev = 'b')
## $data
##
## Normal Member Total
## Male 220 209 429
## Female 215 356 571
## Total 435 565 1000
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Male 1.000000 NA NA
## Female 1.279749 1.139424 1.437356
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 1.754614e-05 2.052252e-05 1.687688e-05
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét: Theo bảng kết quả ta nhận Male là nhóm tham chiếu RR=1.000. Ta thấy Female có RR=1.2797, nghĩa là khách hàng thành viên là nam khoảng 1.2797 lần so với nam. Khoảng ước lượng là (1.1394;1.4374) với độ tin cậy 95%.
oddsratio(v1)
## $data
##
## Member Normal Total
## Female 356 215 571
## Male 209 220 429
## Total 565 435 1000
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.000000 NA NA
## Male 1.741705 1.351496 2.247298
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 1.754614e-05 2.052252e-05 1.687688e-05
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét: Khách hàng là nữ giới có khả năng trở thành khách hàng thành viên cao hơn 1.74 lần so với khách hàng nam.
oddsratio(v1, rev = 'c')
## $data
##
## Normal Member Total
## Female 215 356 571
## Male 220 209 429
## Total 435 565 1000
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.0000000 NA NA
## Male 0.5741262 0.4449787 0.7399206
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 1.754614e-05 2.052252e-05 1.687688e-05
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét: Khách hàng là nữ giới có khả năng trở thành khách hàng thường khoảng hơn 0.574 lần so với khách hàng nam.
oddsratio(v1, rev = 'r')
## $data
##
## Member Normal Total
## Male 209 220 429
## Female 356 215 571
## Total 565 435 1000
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Male 1.0000000 NA NA
## Female 0.5741262 0.4449787 0.7399206
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 1.754614e-05 2.052252e-05 1.687688e-05
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét: Khách hàng là nam giới có khả năng trở thành khách hàng thành viên khoảng hơn 0.574 lần so với khách hàng nữ.
oddsratio(v1, rev = 'b')
## $data
##
## Normal Member Total
## Male 220 209 429
## Female 215 356 571
## Total 435 565 1000
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Male 1.000000 NA NA
## Female 1.741705 1.351496 2.247298
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 1.754614e-05 2.052252e-05 1.687688e-05
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét: Khách hàng là nam giới có khả năng trở thành khách hàng thường khoảng hơn 1.74 lần so với khách hàng nữ.
Phần này sẽ thực hiện hồi quy xác suất tuyến tính giữa biến độc lập là giới tính và biến phụ thuộc là loại khách hàng. Tuy nhiên, ta cần tiếp tục mã hóa lại biến phụ thuộc loại khách hàng thành biến nhị phân, với giá trị 1 tương ứng với “Member” và giá trị 0 tương ứng với “Normal”, để phù hợp với yêu cầu của mô hình hồi quy tuyến tính nhị phân. Biến giới tính được đưa vào mô hình dưới dạng biến phân loại, với hai mức “Male” và “Female”, trong đó “Female” được chọn làm mức tham chiếu. Mô hình cho phép đánh giá sự khác biệt về xác suất trở thành khách hàng thành viên giữa hai giới tính.
data4$cust_type_bin <- ifelse(data4$`Customer type` %in% c("Member"), 1, 0)
data4$Gender <- relevel(as.factor(data4$Gender), ref = "Female")
glm1 <- glm(cust_type_bin ~ Gender, data = data4)
summary(glm1)
##
## Call:
## glm(formula = cust_type_bin ~ Gender, data = data4)
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.62347 0.02057 30.303 < 2e-16 ***
## GenderMale -0.13629 0.03141 -4.339 1.58e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for gaussian family taken to be 0.2417084)
##
## Null deviance: 245.77 on 999 degrees of freedom
## Residual deviance: 241.23 on 998 degrees of freedom
## AIC: 1421.9
##
## Number of Fisher Scoring iterations: 2
Ta có kết quả mô hình hồi quy như sau:
\[ \hat{\pi} = 0.62347 - 0.13629 \cdot \text{Gender}_{\text{Male}} \]
Tất cả các hệ số đều có giá trị \(p\) nhỏ hơn mức ý nghĩa \(\alpha = 0.05\), ngụ ý rằng các biến trong mô hình có ảnh hưởng ý nghĩa thống kê đến xác suất khách hàng trở thành Member.
Hệ số \(\hat{\beta}_0 = 0.62347\) cho thấy rằng nếu khách hàng là nữ \((\text{Gender} = 0)\) thì xác suất trở thành Member là 62.35%.
Hệ số \(\hat{\beta}_1 = -0.13629\) cho thấy rằng nếu khách hàng là nam \((\text{Gender} = 1)\) thì xác suất trở thành Member giảm 13.63 phần trăm so với nữ.
Điều này cho thấy rằng giới tính là một yếu tố có ảnh hưởng thống kê đến loại khách hàng, với nữ giới có khả năng trở thành Member cao hơn nam giới.
# Tạo dữ liệu mới với từng giới tính cần dự báo
ndat <- data.frame(Gender = c("Female", "Male"))
# Ước lượng xác suất trở thành Member cho từng giới tính
predict(glm1, newdata = ndat, type = "response")
## 1 2
## 0.6234676 0.4871795
Nhận xét kết quả dự báo xác suất:
Dựa trên mô hình hồi quy xác suất tuyến tính, ta tiến hành dự báo xác suất trở thành khách hàng thành viên (Member) theo từng giới tính. Kết quả như sau:
Nếu khách hàng là nữ (Gender = “Female”), xác suất trở thành Member là 62.35%.
Nếu khách hàng là nam (Gender = “Male”), xác suất này là 48.72%.
Như vậy, sự khác biệt giữa hai giới tính là 13.63 điểm phần trăm, cho thấy nữ giới có xu hướng trở thành Member cao hơn nam giới một cách rõ rệt.
Điều này phù hợp với kết quả hồi quy trước đó, trong đó hệ số cho giới tính nam là âm và có ý nghĩa thống kê. Như vậy, giới tính là một yếu tố ảnh hưởng đáng kể đến hành vi trở thành khách hàng thành viên.
data4$cust_type_bin <- ifelse(data4$`Customer type` == "Member", 1, 0)
data4$Gender <- relevel(as.factor(data4$Gender), ref = "Female")
logit_gender <- glm(cust_type_bin ~ Gender, data = data4, family = binomial(link = "logit"))
summary(logit_gender)
##
## Call:
## glm(formula = cust_type_bin ~ Gender, family = binomial(link = "logit"),
## data = data4)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.50429 0.08637 5.839 5.26e-09 ***
## GenderMale -0.55559 0.12958 -4.288 1.81e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1369.3 on 999 degrees of freedom
## Residual deviance: 1350.8 on 998 degrees of freedom
## AIC: 1354.8
##
## Number of Fisher Scoring iterations: 4
Ta có kết quả mô hình hồi quy như sau:
\[ \hat{\pi} = \Phi(0.50429 - 0.55559 \cdot \text{Gender}_{\text{Male}}) \]
Hệ số chặn là 0.50429 và có ý nghĩa thống kê khi giá trị p-value nhỏ hơn mức ý nghĩa 5%. Điều này có nghĩa là khi không có sự tác động của biến độc lập (tức là khách hàng là nữ), thì xác suất để khách hàng trở thành Member là \(\Phi(0.50429)\).
Hệ số \(\hat{\beta}_1 = -0.55559\) có ý nghĩa là trong trường hợp các yếu tố khác không đổi, thì chênh lệch tỷ lệ trở thành Member giữa nhóm khách hàng nam và nhóm khách hàng nữ là \(\Phi(-0.55559)\).
Từ kết quả trên, tôi sẽ thực hiện dự báo cho tỷ lệ khách hàng trở thành Member theo từng giới tính. Kết quả được trình bày trong bảng bên dưới.
# Tạo dữ liệu mới với từng giới tính cần dự báo
ndat1 <- data.frame(Gender = c("Female", "Male"))
# Ước lượng xác suất trở thành Member cho từng giới tính
predict(logit_gender, newdata = ndat1, type = "response")
## 1 2
## 0.6234676 0.4871795
Nhận xét kết quả dự báo xác suất:
Dựa trên mô hình hồi quy xác suất tuyến tính, ta tiến hành dự báo xác suất trở thành khách hàng thành viên (Member) theo từng giới tính. Kết quả như sau:
Nếu khách hàng là nữ (Gender = “Female”), xác suất trở thành Member là 62.35%.
Nếu khách hàng là nam (Gender = “Male”), xác suất này là 48.72%.
Như vậy, sự khác biệt giữa hai giới tính là 13.63 điểm phần trăm, cho thấy nữ giới có xu hướng trở thành Member cao hơn nam giới một cách rõ rệt.
Điều này phù hợp với kết quả hồi quy trước đó, trong đó hệ số cho giới tính nam là âm và có ý nghĩa thống kê. Như vậy, giới tính là một yếu tố ảnh hưởng đáng kể đến hành vi trở thành khách hàng thành viên.
Tiếp tục, thay vì sử dụng mô hình logit, ta có thể thay thế bằng mô hình probit để dự đoán xác suất của một sự kiện xảy ra. Mô hình probit sử dụng hàm phân phối tích lũy chuẩn chuẩn (standard normal cumulative distribution function).
Trong đó, hàm liên kết có dạng:
\[ \text{probit}(\pi) = \Phi^{-1}(\pi) \]
và hàm xác suất là:
\[ \pi(x) = \Phi(\beta_0 + \beta_1 X + \beta_2 X_2 + \dots + \beta_n X_n) \]
probit_gender <- glm(cust_type_bin ~ Gender, data = data4, family = binomial(link = "probit"))
summary(probit_gender)
##
## Call:
## glm(formula = cust_type_bin ~ Gender, family = binomial(link = "probit"),
## data = data4)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.31460 0.05340 5.891 3.84e-09 ***
## GenderMale -0.34674 0.08071 -4.296 1.74e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1369.3 on 999 degrees of freedom
## Residual deviance: 1350.8 on 998 degrees of freedom
## AIC: 1354.8
##
## Number of Fisher Scoring iterations: 4
Giải thích kết quả:
Ta có kết quả mô hình hồi quy như sau:
\[ \hat{\pi} = \Phi(0.31460 - 0.34674 \times \text{Gender}_{\text{Male}}) \]
Hệ số chặn là 0.31460 và có ý nghĩa thống kê khi giá trị p-value nhỏ hơn mức ý nghĩa 5%. Điều này có nghĩa là khi không có sự tác động của biến độc lập (tức là khách hàng là nữ – nhóm tham chiếu), thì xác suất trở thành khách hàng thành viên là \(\Phi(0.31460)\) .
Hệ số \(\hat{\beta}_1 = -0.34674\) có ý nghĩa là trong trường hợp các yếu tố khác không đổi, thì chênh lệch tỷ lệ trở thành khách hàng thành viên giữa nhóm nam giới so với nữ giới là \(\Phi(-0.34674)\).
Từ kết quả trên, tôi sẽ thực hiện dự báo cho tỷ lệ trở thành khách hàng thành viên theo giới tính. Kết quả được trình bày trong bảng bên dưới:
# Ước lượng xác suất trở thành Member cho từng giới tính
predict(probit_gender, newdata = ndat1, type = "response")
## 1 2
## 0.6234676 0.4871795
Giải thích kết quả dự báo:
Dựa vào kết quả, ta có thể nhận thấy xác suất dự báo để trở thành khách hàng thành viên đối với nhóm khách hàng nữ (1) là khoảng 62.35%. Điều này có nghĩa là một khách hàng nữ có xác suất trở thành Member là khá cao, khoảng 62%.
Bên cạnh đó, đối với nhóm khách hàng nam (2), xác suất trở thành Member là 48.72%, thấp hơn đáng kể so với nhóm nữ. Điều này cho thấy khách hàng nam có xác suất trở thành Member thấp hơn so với nữ giới.
Từ kết quả trên có thể thấy, giới tính có ảnh hưởng đến hành vi trở thành khách hàng thành viên, trong đó nữ giới có xu hướng trở thành Member cao hơn nam giới.
Tiếp tục, thay vì sử dụng mô hình logit, ta có thể thay thế bằng mô hình cloglog để dự đoán xác suất của một sự kiện xảy ra. Mô hình cloglog sử dụng hàm liên kết không đối xứng, phù hợp trong các trường hợp sự kiện xảy ra hiếm hoặc gần như chắc chắn.
Trong đó, hàm liên kết có dạng:
\[ \text{cloglog}(\pi) = \log(-\log(1 - \pi)) \]
và ngược lại, hàm xác suất là:
\[ \pi(x) = 1 - \exp(-\exp(\beta_0 + \beta_1 X + \beta_2 X_2 + \dots + \beta_n X_n)) \]
cloglog_gender <- glm(cust_type_bin ~ Gender, data = data4, family = binomial(link = "cloglog"))
summary(cloglog_gender)
##
## Call:
## glm(formula = cust_type_bin ~ Gender, family = binomial(link = "cloglog"),
## data = data4)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.02352 0.05513 -0.427 0.67
## GenderMale -0.38020 0.08947 -4.250 2.14e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1369.3 on 999 degrees of freedom
## Residual deviance: 1350.8 on 998 degrees of freedom
## AIC: 1354.8
##
## Number of Fisher Scoring iterations: 4
Giải thích kết quả:
\[ \hat{\pi} = 1 - \exp\left(-\exp(-0.02352 - 0.38020 \times \text{Gender}_{\text{Male}})\right) \]
Hệ số chặn là −0.02352 và không có ý nghĩa thống kê (p-value > 0.05). Điều này cho thấy khi không có tác động của biến độc lập (tức là khách hàng nữ – nhóm tham chiếu), thì xác suất trở thành khách hàng thành viên không khác biệt rõ rệt so với 0.5 ở mức ý nghĩa 5%.
Hệ số \(\hat{\beta}_1 = -0.38020\) mang dấu âm và có ý nghĩa thống kê ở mức 1% (p-value < 0.001). Điều này cho thấy trong điều kiện các yếu tố khác không đổi, khách hàng nam có xác suất trở thành Member thấp hơn khách hàng nữ.
Từ kết quả trên, tôi sẽ thực hiện dự báo cho tỷ lệ trở thành khách hàng thành viên theo giới tính. Kết quả được trình bày trong bảng bên dưới:
# Ước lượng xác suất trở thành Member cho từng giới tính
predict(cloglog_gender, newdata = ndat1, type = "response")
## 1 2
## 0.6234676 0.4871795
Dựa vào kết quả, ta có thể nhận thấy xác suất dự báo để trở thành khách hàng thành viên đối với nhóm khách hàng nữ (1) là khoảng 62.35%. Điều này có nghĩa là một khách hàng nữ có xác suất trở thành Member là khá cao, khoảng 62%.
Bên cạnh đó, đối với nhóm khách hàng nam (2), xác suất trở thành Member là 48.72%, thấp hơn đáng kể so với nhóm nữ. Điều này cho thấy khách hàng nam có xác suất trở thành Member thấp hơn so với nữ giới.
Từ kết quả trên có thể thấy, giới tính có ảnh hưởng đến hành vi trở thành khách hàng thành viên, trong đó nữ giới có xu hướng trở thành Member cao hơn nam giới.
Tác giả tiến hành đánh giá dựa trên chỉ số AIC
AIC(glm1)
## [1] 1421.852
AIC(logit_gender)
## [1] 1354.832
AIC(probit_gender)
## [1] 1354.832
AIC(cloglog_gender)
## [1] 1354.832
Nhận xét: Chỉ số AIC của mô hình hồi quy tuyến tính là 1421.852, trong khi chỉ số AIC của mô hình logit, probit, cloglog là 1354.832. Do đó, mô hình Logit, probit, cloglog phù hợp hơn mô hình xác suất tuyến tính trong việc giải thích mối quan hệ giữa giới tính và khả năng trở thành khách hàng Member, vì mô hình này có AIC thấp hơn đáng kể