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
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(DT)
library(readxl)
data4 <- read_excel("/Users/lengoctuongvy/Downloads/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ẻ.
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"))
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 Product line để 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$`Product line`)
##
## Electronic accessories Fashion accessories Food and beverages
## 170 178 174
## Health and beauty Home and lifestyle Sports and travel
## 152 160 166
table(data4$`Product line`)/sum(nrow(data4))
##
## Electronic accessories Fashion accessories Food and beverages
## 0.170 0.178 0.174
## Health and beauty Home and lifestyle Sports and travel
## 0.152 0.160 0.166
library(dplyr)
library(ggplot2)
data4 %>%
group_by(`Product line`) %>%
summarise(n = n()) %>%
ggplot(aes(x = reorder(`Product line`, 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 = "Dòng sản phẩm", y = "Tần số",
caption = "Biểu đồ tần số các dòng sản phẩm") +
theme_minimal() +
coord_flip() # xoay ngang để dễ đọc nhãn
Bộ dữ liệu ghi nhận tổng cộng 1.000 giao dịch được phân bổ khá đồng đều giữa các dòng sản phẩm tại siêu thị. Trong đó, dòng Fashion accessories chiếm tỷ lệ cao nhất với 178 giao dịch, tương ứng 17.8% tổng số, tiếp theo là Food and beverages với 174 giao dịch (17.4%) và Electronic accessories với 170 giao dịch (17.0%). Các dòng sản phẩm như Sports and travel và Home and lifestyle cũng chiếm tỷ lệ tương đối lớn, lần lượt là 16.6% và 16.0%. Dòng sản phẩm có số lượng giao dịch thấp nhất là Health and beauty, với 152 giao dịch, chiếm 15.2% tổng giao dịch. Sự phân bố đồng đều này cho thấy khách hàng có sự đa dạng trong lựa chọn sản phẩm khi mua sắm tại siêu thị, đồng thời phản ánh khả năng đáp ứng nhu cầu đa dạng của siêu thị. Đây là tín hiệu tích cực giúp duy trì doanh thu ổn định từ nhiều nhóm sản phẩm khác nhau. Tuy nhiên, từ góc độ chiến lược kinh doanh, siêu thị có thể cân nhắc tập trung phát triển các dòng sản phẩm có tiềm năng tăng trưởng hoặc lợi nhuận cao hơn nhằm tối ưu hóa hiệu quả kinh doanh trong tương lai.
Thực hiện thống kê mô tả cho biến Payment để 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$Payment)
##
## Cash Credit card Ewallet
## 344 311 345
table(data4$Payment)/sum(nrow(data4))
##
## Cash Credit card Ewallet
## 0.344 0.311 0.345
# Tính tần số và phần trăm theo từng dòng sản phẩm
tmp <- data4|>
group_by(Payment) |>
summarise(freq = n()) |>
mutate(per = freq / sum(freq))
# Vẽ biểu đồ tròn
ggplot(tmp, aes(x = "", y = per, fill = Payment)) +
geom_col(color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(per * 100, 1), "%")),
position = position_stack(vjust = 0.5), size = 4) +
labs(title = "Tỷ lệ các phương thức thanh toán") +
theme_void() +
theme(legend.title = element_blank())
Biến Payment thể hiện phương thức thanh toán của khách hàng tại siêu thị với ba hình thức chính: Cash, Credit card và Ewallet. Trong tổng số 1.000 giao dịch, phương thức thanh toán bằng Ewallet chiếm số lượng cao nhất với 345 giao dịch, tương đương 34.5% tổng giao dịch. Thanh toán bằng Cash cũng chiếm tỷ lệ tương đương, với 344 giao dịch (34.4%). Trong khi đó, thanh toán qua Credit card chiếm 311 giao dịch, chiếm 31.1%. Kết quả cho thấy sự phân bổ khá đồng đều giữa các hình thức thanh toán, trong đó các phương thức thanh toán không dùng tiền mặt như Ewallet và Credit card chiếm tổng cộng hơn 65% thị phần. Điều này phản ánh xu hướng chuyển dịch sang thanh toán điện tử của khách hàng hiện đại, đồng thời cũng cho thấy phương thức thanh toán tiền mặt vẫn giữ vai trò quan trọng. Đối với siêu thị, việc tiếp tục cải thiện và đa dạng hóa các phương thức thanh toán sẽ góp phần nâng cao trải nghiệm khách hàng và thúc đẩy doanh số bán hàng.
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
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 “Health and beauty” của biến Product line - dòng sản phẩm
Hạng mục “Ewallet” của biến Payment - phương thức thanh toán
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
Kết quả kiểm định tỷ lệ một mẫu cho biến giới tính nhằm kiểm tra giả thuyết \(H_0: p = 0.5\) (tức tỷ lệ nữ bằng 50%) cho thấy giá trị thống kê kiểm định là \(\chi^2 = 19.881\) với 1 bậc tự do, và giá trị p rất nhỏ \(p\text{-value} = 8.242 \times 10^{-6}\). Vì \(p < 0.05\) nên bác bỏ giả thuyết không, tức là có đủ bằng chứng thống kê để kết luận rằng tỷ lệ nữ khác 50%. Khoảng tin cậy 95% cho tỷ lệ nữ nằm trong khoảng từ 0.540 đến 0.602. Tỷ lệ mẫu quan sát được là \(\hat{p} = 0.571\), tức 571 khách hàng nữ trong tổng số 1000 người. Như vậy, có thể thấy nữ giới chiếm tỷ lệ cao hơn đáng kể, và đây là nhóm khách hàng chủ yếu tại siêu thị — một yếu tố quan trọng để doanh nghiệp xây dựng chiến lược tiếp thị phù hợp hơn.
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ữ (Productliner=“Health and beauty”), ta thực hiện như sau:
n_HB <- sum(data4$`Product line` == "Health and beauty")
prop.test(n_HB, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_HB out of n_total, null probability 0.5
## X-squared = 483.02, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.1306143 0.1761088
## sample estimates:
## p
## 0.152
Kết quả kiểm định tỷ lệ một mẫu cho dòng sản phẩm Health and beauty nhằm kiểm tra giả thuyết \(H_0: p = 0.5\) (tức giả định tỷ lệ đơn hàng thuộc dòng này là 50%) cho thấy giá trị thống kê kiểm định là \(\chi^2 = 483.02\) với 1 bậc tự do. Giá trị p rất nhỏ, \(p\text{-value} < 2.2 \times 10^{-16}\), nhỏ hơn nhiều so với mức ý nghĩa 0.05. Do đó, bác bỏ giả thuyết \(H_0\) và kết luận rằng tỷ lệ dòng sản phẩm Health and beauty thực sự khác 50%. Tỷ lệ mẫu quan sát được là \(\hat{p} = 0.152\), với khoảng tin cậy 95% cho tỷ lệ thực tế nằm trong khoảng từ 0.131 đến 0.176. Như vậy, có thể thấy rằng dòng sản phẩm Health and beauty chiếm một phần nhỏ trong tổng số giao dịch, cho thấy đây là nhóm sản phẩm ít phổ biến hơn so với các dòng khác trong siêu thị.
\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ đơn hàng thuộc dòng sản phẩm Health and beauty } = 0.5 \\ H_1: & \text{Tỷ lệ đơn hàng thuộc dòng sản phẩm Health and beauty } \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 hàng thuộc dòng sản phẩm Health and beauty ≠ 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ệ khác 50%.
Ta thấy p-value < 2.2e-16 < 0.05 ⇒ bác bỏ H0.
Vậy tỷ lệ đơn hàng thuộc dòng sản phẩm Health and beauty 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:
n_E <- sum(data4$Payment == "Ewallet")
prop.test(n_E, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_E out of n_total, null probability 0.5
## X-squared = 95.481, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3156925 0.3755139
## sample estimates:
## p
## 0.345
Kết quả kiểm định tỷ lệ một mẫu cho phương thức thanh toán Ewallet nhằm kiểm tra giả thuyết \(H_0: p = 0.5\) (tức giả định tỷ lệ đơn hàng thanh toán bằng Ewallet là 50%) cho thấy giá trị thống kê kiểm định là \(\chi^2 = 95.481\) với 1 bậc tự do. Giá trị p rất nhỏ, \(p\text{-value} < 2.2 \times 10^{-16}\), nhỏ hơn nhiều so với mức ý nghĩa 0.05. Do đó, bác bỏ giả thuyết \(H_0\) và kết luận rằng tỷ lệ đơn hàng thanh toán bằng Ewallet thực sự khác 50%. Tỷ lệ mẫu quan sát được là \(\hat{p} = 0.345\), với khoảng tin cậy 95% cho tỷ lệ thực tế nằm trong khoảng từ 0.316 đến 0.376. Như vậy, có thể thấy rằng phương thức thanh toán Ewallet chiếm một phần vừa phải trong tổng số giao dịch, thấp hơn đáng kể so với tỷ lệ 50% giả định ban đầu.
\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ đơn hàng thanh toán bằng Ewallet } = 0.5 \\ H_1: & \text{Tỷ lệ đơn hàng thanh toán bằng Ewallet } \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 hàng thanh toán bằng Ewallet ≠ 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ệ khác 50%.
Ta thấy p-value < 2.2e-16 < 0.05 ⇒ bác bỏ H0.
Vậy tỷ lệ đơn hàng thanh toán bằng Ewallet trong mẫu khác 0.5 tại mức ý
nghĩa 5%.
Ta chọn 2 cặp biến định tính để Phân tích mối quan hệ giữa Hai biến Định tính (Bivariate Analysis) như sau:
Gender và Productline
Customer type và Payment
Ta thực hiện tạo bảng tần số, tần số biên cho biến đã chọn.
v <- table(data4$Gender, data4$`Product line`)
addmargins(v)
##
## 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
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ị.
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.
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.
v2 <- table(data4$`Customer type`, data4$Payment)
addmargins(v2)
##
## 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
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.
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.
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%.
v1 <-table(data4$Gender, data4$`Customer type`)
print(v1)
##
## Member Normal
## Female 356 215
## Male 209 220
library(epitools)
## Khi có thêm tham số rev = 'c' thì sẽ thực hiện việc
## đổi chỗ 2 cột trong bảng ngẫu nhiên.
riskratio(v1) #package epitools
## $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 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 cao hơn 1.1362 lần so với nữ. Khoảng ước lượng là (1.184;1.567) 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: Odds Ratio = 1.74 có nghĩa là: So với nữ giới, nam giới có tỉ lệ là khách hàng Normal thay vì Member cao hơn 1.74 lần..