#Đọc dữ liệu
a <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv",
header = TRUE, sep = ",")
#cấu trúc của dữ liệu
str(a)
## 'data.frame': 14059 obs. of 16 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PurchaseDate : chr "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
## $ CustomerID : int 7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
## $ Gender : chr "F" "M" "F" "M" ...
## $ MaritalStatus : chr "S" "M" "M" "M" ...
## $ Homeowner : chr "Y" "Y" "N" "Y" ...
## $ Children : int 2 5 2 3 3 3 2 2 3 1 ...
## $ AnnualIncome : chr "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
## $ City : chr "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
## $ StateorProvince : chr "CA" "CA" "WA" "OR" ...
## $ Country : chr "USA" "USA" "USA" "USA" ...
## $ ProductFamily : chr "Food" "Food" "Food" "Food" ...
## $ ProductDepartment: chr "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
## $ ProductCategory : chr "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
## $ UnitsSold : int 5 5 3 4 4 3 4 6 1 2 ...
## $ Revenue : num 27.38 14.9 5.52 4.44 14 ...
Bộ dữ liệu thực hành gồm 14059 quan sát, trong đó bao gồm 16 biến. Cụ thể như sau:
PurchaseDate: Ngày và thời gian thực hiện giao dịch mua sắm, cung cấp thông tin về thời điểm xảy ra mỗi giao dịch.
CustomerID: Mã định danh duy nhất của khách hàng, dùng để theo dõi và phân biệt từng cá nhân trong cơ sở dữ liệu, hỗ trợ phân tích hành vi khách hàng.
Gender: Giới tính của khách hàng (ví dụ: Nam, Nữ), giúp đánh giá sự khác biệt trong sở thích mua sắm giữa các nhóm giới tính.
MaritalStatus: Tình trạng hôn nhân của khách hàng, cung cấp thông tin về ảnh hưởng của trạng thái gia đình đến hành vi tiêu dùng.
Homeowner: Trạng thái sở hữu nhà của khách hàng, có thể liên quan đến khả năng tài chính hoặc nhu cầu mua sắm.
Children: Số lượng con của khách hàng, ảnh hưởng đến nhu cầu mua sắm và phân khúc thị trường.
AnnualIncome: Thu nhập hàng năm của khách hàng, một yếu tố quan trọng để phân tích sức mua và phân khúc khách hàng.
City: Thành phố nơi khách hàng sinh sống, hỗ trợ phân tích địa lý và hành vi mua sắm theo khu vực đô thị.
StateorProvince: Tiểu bang hoặc tỉnh nơi khách hàng sinh sống, cung cấp thông tin chi tiết hơn về khu vực địa lý.
Country: Quốc gia nơi khách hàng sinh sống, hữu ích để phân tích thị trường quốc tế hoặc khu vực.
ProductFamily: Nhóm sản phẩm lớn ), dùng để phân loại các mặt hàng theo danh mục chính.
ProductDepartment: Bộ phận hoặc phân loại chi tiết hơn trong gia đình sản phẩm, hỗ trợ phân tích sâu hơn.
ProductCategory: Loại sản phẩm cụ thể, giúp xác định sở thích chi tiết của khách hàng.
UnitsSold: Số lượng đơn vị sản phẩm được bán trong mỗi giao dịch, phản ánh quy mô mua sắm.
Revenue: Doanh thu từ mỗi giao dịch, thể hiện giá trị tài chính của mỗi lần mua sắm.
head(a)#Hiển thị một vài dòng đầu
tail(a)#Hiển thị một vài dòng cuối
Kết quả trên hiển thị 6 dòng đầu và 6 dòng cuối của dữ liệu.
# Chọn các biến định tính
a1 <- c("Gender","MaritalStatus", "Homeowner","AnnualIncome", "City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory" )
print(a1)
## [1] "Gender" "MaritalStatus" "Homeowner"
## [4] "AnnualIncome" "City" "StateorProvince"
## [7] "Country" "ProductFamily" "ProductDepartment"
## [10] "ProductCategory"
# Tạo bộ dữ liệu mới chỉ chứa các biến định tính
b <- a[, a1]
str(b)
## 'data.frame': 14059 obs. of 10 variables:
## $ Gender : chr "F" "M" "F" "M" ...
## $ MaritalStatus : chr "S" "M" "M" "M" ...
## $ Homeowner : chr "Y" "Y" "N" "Y" ...
## $ AnnualIncome : chr "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
## $ City : chr "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
## $ StateorProvince : chr "CA" "CA" "WA" "OR" ...
## $ Country : chr "USA" "USA" "USA" "USA" ...
## $ ProductFamily : chr "Food" "Food" "Food" "Food" ...
## $ ProductDepartment: chr "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
## $ ProductCategory : chr "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
Trong phạm vi bài làm này, chỉ thực hiện thao tác với các biến định tính bao gồm: Gender, MaritalStatus, Homeowner, AnnualIncome, City, StateorProvince, Country, ProductFamily, ProductDepartment, ProductCategory.
Tiếp theo, em tiến hành Kiểm tra xem có giá trị thiếu (NA) trong các cột định tính hay không.
#Kiểm tra xem có giá trị thiếu (NA) trong các cột định tính
colSums(is.na(b))
## Gender MaritalStatus Homeowner AnnualIncome
## 0 0 0 0
## City StateorProvince Country ProductFamily
## 0 0 0 0
## ProductDepartment ProductCategory
## 0 0
Tất cả các cột định tính trong dataframe b (Gender, MaritalStatus, Homeowner,AnnualIncome, City, StateorProvince, Country, ProductFamily, ProductDepartment, ProductCategory) đều có giá trị 0 cho số lượng giá trị thiếu (NA). Điều này có nghĩa là không có giá trị NA trong các cột định tính của bộ dữ liệu b.
# Xem 6 giá trị đầu của dữ liệu
head(b)
Trước khi tiến hành các phân tích thống kê, việc chuyển đổi các biến định tính từ kiểu ký tự (character) sang kiểu phân loại (factor) là cần thiết nhằm đảm bảo rằng các hàm thống kê và mô hình phân tích sẽ xử lý chúng đúng cách. Trong R, các biến factor không chỉ giúp biểu diễn dữ liệu phân loại một cách chính xác hơn mà còn tối ưu hóa hiệu suất tính toán và cho phép áp dụng các phương pháp phân tích định tính như kiểm định Chi-bình phương hay mô hình hồi quy phân loại. Việc kiểm tra và xử lý kiểu dữ liệu phù hợp là bước tiền xử lý quan trọng, góp phần đảm bảo tính chính xác và hiệu quả của toàn bộ quy trình phân tích.
# Kiểm tra từng cột trong dataframe b
sapply(b, is.factor)
## Gender MaritalStatus Homeowner AnnualIncome
## FALSE FALSE FALSE FALSE
## City StateorProvince Country ProductFamily
## FALSE FALSE FALSE FALSE
## ProductDepartment ProductCategory
## FALSE FALSE
Kết quả là FALSE, vậy các biến cần thiết không phải kiểu factor. Vì vậy, bước tiếp theo em sẽ thực hiện Chuyển đổi các cột character sang factor.
# Chuyển đổi các cột character sang factor
b$Gender <- as.factor(b$Gender)
b$MaritalStatus <- as.factor(b$MaritalStatus)
b$Homeowner <- as.factor(b$Homeowner)
b$AnnualIncome <- as.factor(b$AnnualIncome)
b$City <- as.factor(b$City)
b$StateorProvince <- as.factor(b$StateorProvince)
b$Country <- as.factor(b$Country)
b$ProductFamily <- as.factor(b$ProductFamily)
b$ProductDepartment <- as.factor(b$ProductDepartment)
b$ProductCategory <- as.factor(b$ProductCategory)
#kiểm tra lại
sapply(b, is.factor)
## Gender MaritalStatus Homeowner AnnualIncome
## TRUE TRUE TRUE TRUE
## City StateorProvince Country ProductFamily
## TRUE TRUE TRUE TRUE
## ProductDepartment ProductCategory
## TRUE TRUE
Tất cả các biến sau khi chuyển đổi đều cho kết quả TRUE, nghĩa là việc chuyển đổi thành công và các biến đã sẵn sàng cho phân tích thống kê phù hợp với bản chất định tính của chúng. Điều này đảm bảo độ chính xác và hiệu quả khi áp dụng các phương pháp thống kê phân tích dữ liệu định tính trong các bước tiếp theo.
# Tính tần số và tần suất
Gender_freq <- table(b$Gender)
Gender_prop <- table(b$Gender) / sum(nrow(b))
print(Gender_freq)
##
## F M
## 7170 6889
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Tạo dataframe cho bảng
table_data <- data.frame(
`Giới tính` = c("Nữ", "Nam"),
`Tần số` = as.numeric(Gender_freq),
`Tần suất (%)` = round(Gender_prop * 100, 2)
)
colnames(table_data) <- c("Giới tính", "Tần số", "Kí hiệu", "Tần suất (%)")
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
kable(table_data, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Giới tính | Tần số | Kí hiệu | Tần suất (%) |
|---|---|---|---|
| Nữ | 7170 | F | 51 |
| Nam | 6889 | M | 49 |
Kết quả cho thấy sự phân phối khá cân đối giữa các nhóm. Cụ thể, tỷ lệ khách hàng nam và nữ gần như tương đương, với nữ chiếm 0.5099936 và nam chiếm 0.4900064, chỉ chênh lệch khoảng 0.0199872.
# Tạo biểu đồ cột và lưu vị trí
bar_positions <- barplot(Gender_freq,
main = "Phân phối khách hàng theo giới tính",
xlab = "Giới tính",
ylab = "Số lượng giao dịch",
col = c("#CC99FF", "#FFFF33"),
names.arg = c("Nữ", "Nam"),
ylim = c(0, max(Gender_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions,
y = Gender_freq + 500, # Tăng khoảng cách nhãn lên 500 để hiển thị rõ
labels = Gender_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 1.2) # Kích thước chữ lớn hơn
Biểu đồ cột mang tên “Phân phối khách hàng theo giới tính” được trình bày ở trên cung cấp một cái nhìn sơ bộ về sự phân bố số lượng giao dịch theo hai nhóm giới tính, cụ thể là “Nữ” và “Nam”.Trước hết, biểu đồ cho thấy sự khác biệt về số lượng giao dịch giữa hai nhóm giới tính, với cột đại diện cho “Nữ” được tô màu tím và cột đại diện cho “Nam” được tô màu vàng. Biểu đồ cho thấy số lượng giao dịch của nhóm “Nữ” đạt 7170, vượt nhẹ so với nhóm “Nam” với 6889 giao dịch, trên tổng số 14059 giao dịch trong tập dữ liệu. Do đó, có thể kết luận rằng không tồn tại sự thiên lệch đáng kể nào về giới tính trong hành vi mua sắm tại siêu thị, và sự phân bố này phản ánh một cơ cấu khách hàng khá đa dạng.
# Tính tần số và tần suất
homeowner_freq <- table(b$Homeowner)
homeowner_prop <- table(b$Homeowner) / sum(nrow(b))
# Tính tần số và tần suất
homeowner_freq <- table(b$Homeowner)
homeowner_prop <- table(b$Homeowner) / nrow(b)
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Tạo dataframe cho bảng
table_data2 <- data.frame(
`Tình trạng` = c("Không sở hữu", "Sở hữu"),
`Tần số` = as.numeric(homeowner_freq),
`Tần suất (%)` = round(homeowner_prop * 100, 2)
)
colnames(table_data2) <- c("Tình trạng", "Tần số", "Kí hiệu", "Tần suất (%)")
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
kable(table_data2, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Tình trạng | Tần số | Kí hiệu | Tần suất (%) |
|---|---|---|---|
| Không sở hữu | 5615 | N | 39.94 |
| Sở hữu | 8444 | Y | 60.06 |
Dựa trên bảng thống kê mô tả tình trạng sở hữu nhà (biến Homeowner), ta nhận thấy rằng trong tổng số quan sát, có 5615 cá nhân không sở hữu nhà, chiếm khoảng 39.9388292% tổng thể mẫu. Ngược lại, số lượng cá nhân sở hữu nhà là 8444 người, tương ứng với tỷ lệ 60.0611708%. Tỷ lệ người sở hữu nhà cao hơn đáng kể so với nhóm không sở hữu, cho thấy phần lớn khách hàng trong tập dữ liệu có xu hướng là chủ sở hữu bất động sản. Sự chênh lệch gần 20.1223416% giữa hai nhóm phản ánh một đặc điểm nổi bật trong đặc trưng dân cư của mẫu khảo sát, đồng thời gợi ý rằng yếu tố sở hữu nhà có thể là một biến quan trọng khi phân tích hành vi hoặc đặc điểm tiêu dùng của khách hàng.
# Tính tần số
homeowner_freq <- table(b$Homeowner)
print(homeowner_freq) # Kiểm tra: N: 5615, Y: 8444
##
## N Y
## 5615 8444
# Tạo biểu đồ cột và lưu vị trí
bar_positions2 <- barplot(homeowner_freq,
main = "Phân phối khách hàng theo tình trạng sở hữu nhà",
xlab = "Tình trạng sở hữu nhà",
ylab = "Số lượng giao dịch",
col = c("#99FFFF", "#CCCCFF"),
names.arg = c("Không sở hữu", "Sở hữu"),
ylim = c(0, max(homeowner_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions2,
y = homeowner_freq + 500, # Tăng khoảng cách nhãn lên 500 để hiển thị rõ
labels = homeowner_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 1.2) # Kích thước chữ lớn hơn
Biểu đồ cột trên thể hiện phân phối khách hàng theo tình trạng sở hữu nhà. Từ biểu đồ, ta có thể rút ra một số nhận xét sau: Trước hết, số lượng khách hàng có sở hữu nhà (với 8444 giao dịch) chiếm phần lớn trong tổng số, vượt trội hơn hẳn so với nhóm không sở hữu nhà, vốn chỉ có 5615 giao dịch. Sự chênh lệch này được thể hiện rõ qua chiều cao cột, trong đó cột “Sở hữu” cao hơn đáng kể so với cột “Không sở hữu”. Biểu đồ cột mô tả sự phân phối số lượng giao dịch của khách hàng theo tình trạng sở hữu nhà, bao gồm hai nhóm: “Không sở hữu” và “Sở hữu”. Theo dữ liệu, số lượng giao dịch từ khách hàng không sở hữu nhà là 5615, trong khi con số này ở nhóm sở hữu nhà là 8444.
Như vậy, nhóm khách hàng sở hữu nhà chiếm tỷ trọng cao hơn, tương đương khoảng 60.0611708% tổng số giao dịch, so với 39.9388292% ở nhóm không sở hữu. Sự chênh lệch này cho thấy rằng khách hàng có nhà thường xuyên thực hiện các giao dịch hơn so với nhóm không sở hữu.
Điều này có thể phản ánh một số đặc điểm kinh tế - xã hội đáng chú ý. Cụ thể, việc sở hữu nhà có thể gắn liền với mức thu nhập ổn định và khả năng chi tiêu cao hơn, từ đó dẫn đến tần suất giao dịch nhiều hơn. Đồng thời, đây cũng là dấu hiệu cho thấy nhóm khách hàng sở hữu nhà có thể là một phân khúc tiềm năng để doanh nghiệp hướng đến trong các chiến lược tiếp thị và chăm sóc khách hàng
# Tính tần số và tần suất
Marital_freq <- table(b$MaritalStatus)
Marital_prop <- table(b$MaritalStatus) / sum(nrow(b))
print(Marital_freq)
##
## M S
## 6866 7193
# Tạo dataframe cho bảng
table_data3 <- data.frame(
`Tình trạng` = c("Kết hôn", "Độc thân"),
`Tần số` = as.numeric(Marital_freq),
`Tần suất (%)` = round(Marital_prop * 100, 2)
)
colnames(table_data3) <- c("Tình trạng", "Tần số", "Kí hiệu", "Tần suất (%)")
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
kable(table_data3, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Tình trạng | Tần số | Kí hiệu | Tần suất (%) |
|---|---|---|---|
| Kết hôn | 6866 | M | 48.84 |
| Độc thân | 7193 | S | 51.16 |
Kết quả phân tích mô tả cho thấy số lượng giao dịch từ nhóm khách hàng độc thân chiếm ưu thế hơn so với nhóm đã kết hôn. Cụ thể, có 7193 giao dịch đến từ khách hàng độc thân, chiếm khoảng 51.1629561% tổng số; trong khi đó, nhóm khách hàng đã kết hôn thực hiện 6866 giao dịch, tương đương 48.8370439%.
Mặc dù sự chênh lệch giữa hai nhóm không quá lớn, nhưng kết quả này cho thấy tỷ lệ khách hàng độc thân nhỉnh hơn một chút về mặt số lượng giao dịch. Điều này có thể phản ánh một số xu hướng tiêu dùng đặc thù của nhóm độc thân, chẳng hạn như sự linh hoạt trong chi tiêu, mức độ tự chủ tài chính cao hơn, hoặc đơn giản là nhu cầu mua sắm cho cá nhân nhiều hơn so với nhóm đã lập gia đình.
# Tạo biểu đồ cột và lưu vị trí
bar_positions3 <- barplot(Marital_freq,
main = "Phân phối khách hàng theo tình trạng hôn nhân",
xlab = "Tình trạng hôn nhân",
ylab = "Số lượng giao dịch",
col = c("#0066CC", "#00CC99"),
names.arg = c("Kết hôn", "Độc thân"),
ylim = c(0, max(Marital_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions3,
y = Marital_freq + 500, # Tăng khoảng cách nhãn lên 500 để hiển thị rõ
labels = Marital_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 1.2) # Kích thước chữ lớn hơn
Biểu đồ trên mô tả sự phân bố của khách hàng theo tình trạng hôn nhân, cho thấy mức độ tương đối cân bằng giữa hai nhóm: độc thân và đã kết hôn. Cụ thể, số lượng giao dịch đến từ khách hàng độc thân là 7193, nhỉnh hơn so với 6866 giao dịch từ nhóm đã kết hôn.
Mặc dù sự chênh lệch không đáng kể, kết quả này vẫn cho thấy nhóm khách hàng độc thân có xu hướng tham gia vào hoạt động mua sắm tại siêu thị nhiều hơn. Có thể giả định rằng các cá nhân độc thân thường có lối sống năng động hơn, dễ tiếp cận các sản phẩm tiêu dùng và sẵn sàng chi tiêu hơn, đặc biệt trong các lĩnh vực liên quan đến tiện ích và tiêu dùng nhanh. Ngược lại, khách hàng đã lập gia đình có thể có xu hướng tiêu dùng ổn định và có kế hoạch hơn.
Sự phân bố gần tương đương này cho thấy cả hai nhóm đều đóng vai trò quan trọng trong cấu trúc khách hàng của doanh nghiệp, và do đó, các chiến lược tiếp thị nên được thiết kế linh hoạt để tiếp cận hiệu quả cả hai phân khúc này.
# Tính tần số và tần suất
AnnualIncome_freq <- table(b$AnnualIncome)
AnnualIncome_prop <- table(b$AnnualIncome) / sum(nrow(b))
print(AnnualIncome_freq)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
# Tạo dataframe cho bảng
table_data4 <- data.frame(
`Thu nhập hàng năm` = names(AnnualIncome_freq),
`Tần số` = as.numeric(AnnualIncome_freq),
`Tần suất (%)` = round(AnnualIncome_prop * 100, 2)
)
colnames(table_data4) <- c("Thu nhập hàng năm", "Tần số", "Kí hiệu", "Tần suất (%)")
# Tạo bảng kẻ
# Tạo bảng kẻ
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
library(knitr)
library(kableExtra)
kable(table_data4, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Thu nhập hàng năm | Tần số | Kí hiệu | Tần suất (%) |
|---|---|---|---|
| $10K - $30K | 3090 | $10K - $30K | 21.98 |
| $110K - $130K | 643 | $110K - $130K | 4.57 |
| $130K - $150K | 760 | $130K - $150K | 5.41 |
| $150K + | 273 | $150K + | 1.94 |
| $30K - $50K | 4601 | $30K - $50K | 32.73 |
| $50K - $70K | 2370 | $50K - $70K | 16.86 |
| $70K - $90K | 1709 | $70K - $90K | 12.16 |
| $90K - $110K | 613 | $90K - $110K | 4.36 |
Phân tích dữ liệu về thu nhập hàng năm của khách hàng cho thấy sự phân bố không đồng đều giữa các nhóm thu nhập, với một số phân khúc chiếm tỷ trọng đáng kể hơn hẳn so với phần còn lại. Dễ dàng nhận thấy rằng nhóm có thu nhập từ 30000 đến 50000 đô la là nhóm chiếm ưu thế rõ rệt, với 4601 giao dịch, tương ứng với 32.7263675% tổng số. Kế đến là nhóm 10000 – 30000 đô la, chiếm 21.9788036%, cho thấy một bộ phận lớn khách hàng đến từ tầng lớp thu nhập thấp đến trung bình.
Ở nhóm thu nhập trung bình – khá, cụ thể là từ 50000 – 70000 đô la, tỷ lệ đạt 16.857529%, tiếp theo là nhóm 70000 – 90000 đô la với 12.1559144%. Các phân khúc có thu nhập cao hơn như 90000 – 110000 đô la và 110000 – 130000 đô la chiếm tỷ trọng thấp hơn, lần lượt là 4.3601963% và 4.5735828%. Trong khi đó, những khách hàng có thu nhập trên 150000 đô la chiếm tỷ lệ thấp nhất, chỉ 1.9418166%.
Sự phân bố này phản ánh một thực tế rằng phần lớn khách hàng trong cơ sở dữ liệu thuộc nhóm thu nhập từ thấp đến trung bình. Điều này có thể hàm ý rằng các sản phẩm được cung cấp hoặc chiến lược định giá của siêu thị đang hấp dẫn chủ yếu với những khách hàng có khả năng chi tiêu hạn chế hoặc trung bình. Do đó, các chiến dịch tiếp thị trong tương lai có thể cân nhắc ưu tiên tập trung vào các nhóm khách hàng này để tối ưu hóa hiệu quả tiếp cận và doanh thu, đồng thời nghiên cứu kỹ hơn về hành vi tiêu dùng của nhóm thu nhập cao để mở rộng thị phần nếu cần thiết.
# Tạo biểu đồ cột và lưu vị trí
bar_positions4 <- barplot(AnnualIncome_freq,
main = "Phân phối khách hàng theo thu nhập hàng năm",
xlab = "Thu nhập hàng năm",
ylab = "Số lượng giao dịch",
col = c("#0066CC", "#00CC99", "#FF6699", "#66CC66", "#FF9933", "#9933CC", "#33CCCC", "#CC3366"),
names.arg = names(AnnualIncome_freq), # Sử dụng các mức thu nhập làm nhãn
ylim = c(0, max(AnnualIncome_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions4,
y = AnnualIncome_freq + 500, # Tăng khoảng cách nhãn lên 500 để hiển thị rõ
labels = AnnualIncome_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 1.2) # Kích thước chữ lớn hơn
Biểu đồ cho thấy sự chênh lệch đáng kể trong phân bố số lượng khách hàng theo các mức thu nhập khác nhau. Nhóm thu nhập từ 30000 đến 50000 đô la vượt trội hoàn toàn với 4601 giao dịch, cao hơn hẳn so với các nhóm khác. Mức thu nhập từ 10000 đến 30000 đô la cũng chiếm vị trí đáng kể với 3090 giao dịch, phản ánh rằng phần lớn khách hàng đến từ nhóm thu nhập trung bình – thấp.
Trái lại, các phân khúc có thu nhập cao hơn như 110000 – 130000 đô la, 130000 – 150000 đô la, và đặc biệt là trên 150000 đô la có số lượng khách hàng khá ít, lần lượt là 643, 760 và 273 giao dịch. Những cột này có chiều cao thấp đáng kể, minh họa rõ sự suy giảm mạnh ở nhóm thu nhập cao.
Ngoài ra, biểu đồ cũng cho thấy sự hiện diện vừa phải của khách hàng ở nhóm thu nhập từ 50000 đến 90000 đô la, với hai mức thu nhập lần lượt đạt 2370 và 1709 giao dịch. Điều này gợi ý rằng tuy nhóm trung bình – cao không chiếm ưu thế, nhưng vẫn là một thị phần đáng cân nhắc trong chiến lược marketing.
# Tính tần số và tần suất
City_freq <- table(b$City)
City_prop <- table(b$City) / sum(nrow(b))
print(City_freq)
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 383 143 811 834 452
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 75 845 926 654 194
## Orizaba Portland Salem San Andres San Diego
## 464 876 1386 621 866
## San Francisco Seattle Spokane Tacoma Vancouver
## 130 922 875 1257 633
## Victoria Walla Walla Yakima
## 176 160 376
# Tạo dataframe cho bảng
table_data5 <- data.frame(
`Thành phố` = names(City_freq),
`Tần số` = as.numeric(City_freq),
`Tần suất (%)` = round(City_prop * 100, 2)
)
colnames(table_data5) <- c("Thành phố", "Tần số", "Thành phố", "Tần suất (%)")
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
kable(table_data5, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Thành phố | Tần số | Thành phố | Tần suất (%) |
|---|---|---|---|
| Acapulco | 383 | Acapulco | 2.72 |
| Bellingham | 143 | Bellingham | 1.02 |
| Beverly Hills | 811 | Beverly Hills | 5.77 |
| Bremerton | 834 | Bremerton | 5.93 |
| Camacho | 452 | Camacho | 3.22 |
| Guadalajara | 75 | Guadalajara | 0.53 |
| Hidalgo | 845 | Hidalgo | 6.01 |
| Los Angeles | 926 | Los Angeles | 6.59 |
| Merida | 654 | Merida | 4.65 |
| Mexico City | 194 | Mexico City | 1.38 |
| Orizaba | 464 | Orizaba | 3.30 |
| Portland | 876 | Portland | 6.23 |
| Salem | 1386 | Salem | 9.86 |
| San Andres | 621 | San Andres | 4.42 |
| San Diego | 866 | San Diego | 6.16 |
| San Francisco | 130 | San Francisco | 0.92 |
| Seattle | 922 | Seattle | 6.56 |
| Spokane | 875 | Spokane | 6.22 |
| Tacoma | 1257 | Tacoma | 8.94 |
| Vancouver | 633 | Vancouver | 4.50 |
| Victoria | 176 | Victoria | 1.25 |
| Walla Walla | 160 | Walla Walla | 1.14 |
| Yakima | 376 | Yakima | 2.67 |
Biểu đồ phản ánh mức độ tập trung khách hàng không đồng đều giữa các thành phố. Salem là khu vực dẫn đầu với 1386 giao dịch, tương đương 9.8584537%, cho thấy đây có thể là thị trường trọng điểm của siêu thị. Kế đó là Tacoma (1257) và Los Angeles (926), đều ghi nhận số lượng giao dịch cao, lần lượt chiếm 9.8584537% và 6.5865282% tổng số lượt mua hàng.
Một số thành phố khác cũng có mức độ giao dịch đáng kể như Seattle (922), Portland (876), San Diego (866) và Hidalgo (845) – tất cả đều dao động quanh mức 6%. Những khu vực này có thể được xem là các thị trường tiềm năng cần được duy trì và khai thác thêm.
Ở chiều ngược lại, các thành phố như Guadalajara (75), San Francisco (130), Bellingham (143) hay Victoria (176) có số lượt giao dịch tương đối thấp, chưa đến 2%, phản ánh mức độ hiện diện còn hạn chế của khách hàng tại đây.
Sự phân hóa về tần suất giao dịch giữa các thành phố là khá rõ ràng, gợi ý rằng hoạt động tiếp thị, phân phối và dịch vụ nên được điều chỉnh linh hoạt theo từng khu vực để khai thác tối ưu tiềm năng của từng địa phương.
# Tạo biểu đồ cột
bar_positions5 <- barplot(City_freq,
main = "Phân phối khách hàng theo thành phố",
xlab = "Thành phố",
ylab = "Số lượng giao dịch",
col = rainbow(length(City_freq)), # Sử dụng bảng màu cầu vồng cho nhiều mức
las = 2, # Xoay nhãn trục x 90 độ để dễ đọc
cex.names = 0.7, # Giảm kích thước chữ nhãn trục x
ylim = c(0, max(City_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions5,
y = City_freq + 100, # Tăng khoảng cách nhãn lên 100 để hiển thị rõ
labels = City_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 0.8) # Kích thước chữ nhỏ hơn để tránh chồng lấn
Biểu đồ minh họa sự phân bổ khách hàng giữa các thành phố cho thấy mức độ khác biệt đáng kể. Salem nổi bật là nơi có số lượng giao dịch lớn nhất (1386), cho thấy đây có thể là khu vực tập trung đông đảo khách hàng hoặc hoạt động bán hàng đặc biệt sôi động.
Tiếp đến là Tacoma (1257), Los Angeles (926), Seattle (922) và Portland (876) – đều nằm trong nhóm có lượt giao dịch vượt ngưỡng 850. Điều này phản ánh rằng những đô thị lớn, có mật độ dân cư cao thường có xu hướng tiêu dùng mạnh mẽ hơn.
Ở nhóm giữa, các thành phố như San Diego (866), Spokane (875), Hidalgo (845) và Bremerton (834) cũng ghi nhận tần suất mua sắm đáng kể, tuy không vượt trội nhưng vẫn đóng góp quan trọng vào tổng số giao dịch.
Ngược lại, một số khu vực như Guadalajara (75), San Francisco (130), Bellingham (143) và Walla Walla (160) có số lượt giao dịch khá thấp, dưới 200, thể hiện sự hạn chế về mặt thị trường hoặc mức độ tiếp cận dịch vụ thấp hơn.
Tóm lại, biểu đồ cho thấy hoạt động giao dịch chủ yếu tập trung tại các đô thị lớn hoặc thành phố trung tâm, trong khi các địa phương nhỏ lẻ đóng góp khiêm tốn hơn. Đây có thể là căn cứ quan trọng giúp doanh nghiệp định hướng mở rộng hoặc điều chỉnh chiến lược phân phối phù hợp với từng khu vực.
# Tính tần số và tần suất
StateorProvince_freq <- table(b$StateorProvince)
StateorProvince_prop <- table(b$StateorProvince) / sum(nrow(b))
print(StateorProvince_freq)
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
# Tạo dataframe cho bảng
table_data6 <- data.frame(
`Bang` = names(StateorProvince_freq),
`Tần số` = as.numeric(StateorProvince_freq),
`Tần suất (%)` = round(StateorProvince_prop * 100, 2)
)
colnames(table_data6) <- c("Bang", "Tần số", "Bang ", "Tần suất (%)")
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
kable(table_data6, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Bang | Tần số | Bang | Tần suất (%) |
|---|---|---|---|
| BC | 809 | BC | 5.75 |
| CA | 2733 | CA | 19.44 |
| DF | 815 | DF | 5.80 |
| Guerrero | 383 | Guerrero | 2.72 |
| Jalisco | 75 | Jalisco | 0.53 |
| OR | 2262 | OR | 16.09 |
| Veracruz | 464 | Veracruz | 3.30 |
| WA | 4567 | WA | 32.48 |
| Yucatan | 654 | Yucatan | 4.65 |
| Zacatecas | 1297 | Zacatecas | 9.23 |
Khi xét theo đơn vị bang, dữ liệu cho thấy sự tập trung khách hàng có phần nghiêng rõ về một số khu vực nhất định. Bang Washington (WA) là nơi ghi nhận số lượng giao dịch vượt trội nhất (4567 lượt), chiếm hơn 32.4845295% tổng số giao dịch, cho thấy vai trò trung tâm trong hoạt động tiêu dùng hoặc mạng lưới phân phối.
Theo sau là California (CA) với 2733 giao dịch (19.4395049%), và Oregon (OR) đạt 2262 giao dịch (16.0893378%), cùng thuộc nhóm có quy mô tiêu dùng lớn, phản ánh quy mô dân cư và sức mua tại các bang này.
Đáng chú ý, Zacatecas (1297 lượt) và Distrito Federal - DF (815 lượt) cũng có mức giao dịch khá cao, dù không phải bang lớn nhất. Điều này có thể xuất phát từ những đặc điểm riêng về dân cư, đô thị hóa hoặc các hoạt động kinh tế địa phương.
Ngược lại, Jalisco (75 lượt), Guerrero (383 lượt) và Veracruz (464 lượt) nằm ở nhóm thấp hơn, cho thấy mức độ tham gia thị trường còn khiêm tốn hoặc tiềm năng chưa được khai thác hiệu quả.
Tóm lại, phân phối khách hàng theo bang không đồng đều, với sự áp đảo rõ rệt tại Washington, California và Oregon. Điều này đặt ra tiềm năng phát triển mạnh hơn tại các khu vực hiện có ít giao dịch, đồng thời gợi ý về chiến lược khai thác thị trường theo vùng địa lý.
# Tính tần số của biến StateorProvince
StateorProvince_freq <- table(b$StateorProvince)
# Tạo biểu đồ cột
bar_positions6 <- barplot(StateorProvince_freq,
main = "Phân phối khách hàng theo bang",
xlab = "Bang ",
ylab = "Số lượng giao dịch",
col = rainbow(length(StateorProvince_freq)), # Sử dụng bảng màu cầu vồng
las = 2, # Xoay nhãn trục x 90 độ để dễ đọc
cex.names = 0.8, # Giảm kích thước chữ nhãn trục x
ylim = c(0, max(StateorProvince_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions6,
y = StateorProvince_freq + 200, # Tăng khoảng cách nhãn lên 200 để hiển thị rõ
labels = StateorProvince_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 0.9) # Kích thước chữ
Phân tích biểu đồ cho thấy sự tập trung khách hàng rõ rệt tại một số bang nhất định, nổi bật nhất là WA (Washington) với gần 4.600 giao dịch, bỏ xa các bang còn lại. Điều này có thể cho thấy sự gắn bó cao của khách hàng tại bang này đối với thương hiệu hoặc dịch vụ, hoặc cũng có thể phản ánh hoạt động marketing và phân phối hiệu quả tại khu vực này.
Các bang như CA (California) và OR (Oregon) cũng ghi nhận lượng giao dịch lớn, cho thấy khuynh hướng tiêu dùng mạnh mẽ tại khu vực bờ Tây Hoa Kỳ. Đây có thể là những khu vực đô thị phát triển, với dân số lớn và mức thu nhập trung bình cao – những yếu tố thúc đẩy hoạt động tiêu dùng.
Ngược lại, các bang như Jalisco (75 giao dịch) hay Guerrero (383 giao dịch) chỉ chiếm một tỷ lệ rất nhỏ, có thể hàm ý về thị trường chưa được khai thác đầy đủ hoặc gặp hạn chế về logistics, thói quen tiêu dùng, hoặc khả năng tiếp cận thông tin.
Đáng chú ý, Zacatecas – một bang ở Mexico – lại vượt lên với hơn 1.200 giao dịch, cho thấy tiềm năng đáng kể từ các thị trường không thuộc Hoa Kỳ, mở ra cơ hội phát triển tại khu vực Mỹ Latinh.
# Tính tần số và tần suất
Country_freq <- table(b$Country)
Country_prop <- table(b$Country) / sum(nrow(b))
print(Country_freq)
##
## Canada Mexico USA
## 809 3688 9562
# Tạo dataframe cho bảng
table_data7 <- data.frame(
`Quốc gia` = names(Country_freq),
`Tần số` = as.numeric(Country_freq),
`Tần suất (%)` = round(Country_prop * 100, 2)
)
colnames(table_data7) <- c("Quốc gia", "Tần số", "Quốc gia ", "Tần suất (%)")
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
kable(table_data7, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Quốc gia | Tần số | Quốc gia | Tần suất (%) |
|---|---|---|---|
| Canada | 809 | Canada | 5.75 |
| Mexico | 3688 | Mexico | 26.23 |
| USA | 9562 | USA | 68.01 |
Bảng số liệu cho thấy khách hàng đến từ Hoa Kỳ chiếm tỷ trọng vượt trội với 9562 giao dịch, tương ứng 68.0133722%, cho thấy đây là thị trường trọng điểm trong cơ cấu khách hàng. Sự tập trung cao độ vào một quốc gia như vậy cũng đặt ra vấn đề rủi ro địa lý, khi các biến động chính trị - kinh tế tại Mỹ có thể ảnh hưởng mạnh đến tổng doanh số.
Trong khi đó, Mexico ghi nhận 3.688 giao dịch (26.2323067%), cho thấy đây là thị trường vệ tinh có sức hút khá lớn, góp phần ổn định hoạt động bán hàng. Đáng chú ý, mức đóng góp của Mexico gần gấp 5 lần Canada, chứng tỏ doanh nghiệp có thể đang phát triển theo chiến lược tăng cường hiện diện ở thị trường khu vực Mỹ Latinh thay vì phân bổ đồng đều theo hướng Bắc Mỹ truyền thống.
Canada tuy có nền kinh tế phát triển, nhưng chỉ ghi nhận 809 giao dịch (5.7543211%), cho thấy mức độ tiếp cận thị trường này còn hạn chế. Điều này có thể là do chiến lược tiếp thị chưa phù hợp, thiếu chi nhánh phân phối, hoặc chưa xây dựng được sự hiện diện thương hiệu mạnh tại thị trường này.
# Tạo biểu đồ cột
bar_positions7 <- barplot(Country_freq,
main = "Phân phối khách hàng theo quốc gia",
xlab = "Quốc gia ",
ylab = "Số lượng giao dịch",
col = rainbow(length(Country_freq)), # Sử dụng bảng màu cầu vồng
las = 2, # Xoay nhãn trục x 90 độ để dễ đọc
cex.names = 0.8, # Giảm kích thước chữ nhãn trục x
ylim = c(0, max(Country_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions7,
y = Country_freq + 200, # Tăng khoảng cách nhãn lên 200 để hiển thị rõ
labels = Country_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 0.9) # Kích thước chữ
Biểu đồ cột cho thấy một bức tranh phân hóa rõ rệt giữa ba quốc gia, với Hoa Kỳ chiếm áp đảo cả về quy mô tuyệt đối lẫn tỷ trọng tương đối. Cụ thể, USA đạt 9562 giao dịch, gần gấp 2,6 lần so với Mexico và gấp hơn 11 lần so với Canada.
Đáng chú ý, Mexico – quốc gia láng giềng phía nam của Mỹ – đang nổi lên như một thị trường tiềm năng, khi chiếm tới 26.2323067% tổng giao dịch, cho thấy mức độ tham gia thị trường rất đáng kể dù chưa phải là thị trường chủ lực.
Trong khi đó, Canada – tuy có vị trí địa lý thuận lợi và nền kinh tế phát triển – lại có số giao dịch khá khiêm tốn, chỉ với 809 giao dịch (5.7543211%). Điều này phản ánh có thể còn nhiều dư địa để mở rộng thị trường tại quốc gia này nếu doanh nghiệp điều chỉnh chiến lược tiếp cận phù hợp hơn.
Tổng thể, biểu đồ cho thấy sự mất cân đối trong cơ cấu khách hàng theo quốc gia, đặt ra bài toán cần đa dạng hóa thị trường để giảm rủi ro tập trung và tăng trưởng bền vững trong dài hạn.
# Tính tần số và tần suất
ProductFamily_freq <- table(b$ProductFamily)
ProductFamily_prop <- table(b$ProductFamily) / sum(nrow(b))
print(ProductFamily_freq)
##
## Drink Food Non-Consumable
## 1250 10153 2656
# Tạo dataframe cho bảng
table_data8 <- data.frame(
`Quốc gia` = names(ProductFamily_freq),
`Tần số` = as.numeric(ProductFamily_freq),
`Tần suất (%)` = round(ProductFamily_prop * 100, 2)
)
colnames(table_data8) <- c("Nhóm sản phẩm", "Tần số", "Nhóm sản phẩm ", "Tần suất (%)")
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
kable(table_data8, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Nhóm sản phẩm | Tần số | Nhóm sản phẩm | Tần suất (%) |
|---|---|---|---|
| Drink | 1250 | Drink | 8.89 |
| Food | 10153 | Food | 72.22 |
| Non-Consumable | 2656 | Non-Consumable | 18.89 |
Dữ liệu cho thấy sản phẩm thuộc nhóm thực phẩm (Food) đang là trụ cột chính của hoạt động kinh doanh, chiếm tới hơn 72.2170851% tổng giao dịch, với 10153 lượt – áp đảo so với hai nhóm còn lại.
Nhóm sản phẩm không tiêu dùng (Non-Consumable) tuy đứng thứ hai về số lượng giao dịch (2656 lượt) nhưng chỉ chiếm 18.8918131%, cho thấy đây là nhóm có mức độ tiêu thụ thấp hơn nhiều so với nhóm thực phẩm.
Trong khi đó, đồ uống (Drink) chiếm tỷ lệ thấp nhất ( 8.8911018%) với 1250 giao dịch, điều này có thể phản ánh tần suất mua lặp lại thấp hơn hoặc độ phổ biến chưa cao so với mặt hàng thực phẩm – vốn là mặt hàng thiết yếu hằng ngày.
Từ biểu đồ, có thể thấy sự phụ thuộc lớn vào nhóm thực phẩm, điều này cho thấy doanh nghiệp nên tiếp tục củng cố nhóm này nhưng đồng thời nên nghiên cứu chiến lược kích cầu cho các nhóm sản phẩm còn lại để đa dạng hóa danh mục và phân bổ rủi ro thị
# Tạo biểu đồ cột
bar_positions8 <- barplot(ProductFamily_freq,
main = "Phân phối khách hàng theo nhóm sản phẩm",
xlab = "Nhóm sản phẩm ",
ylab = "Số lượng giao dịch",
col = c("#FF99CC", "#00CC99"),
las = 2, # Xoay nhãn trục x 90 độ để dễ đọc
cex.names = 0.8, # Giảm kích thước chữ nhãn trục x
ylim = c(0, max(ProductFamily_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions8,
y = ProductFamily_freq + 200, # Tăng khoảng cách nhãn lên 200 để hiển thị rõ
labels = ProductFamily_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 0.9) # Kích thước chữ
Biểu đồ thể hiện sự phân phối số lượng giao dịch của khách hàng theo ba nhóm sản phẩm chính: Drink, Food và Non-Consumable. Dễ dàng nhận thấy rằng nhóm Food chiếm ưu thế vượt trội với 1,153 giao dịch, gần gấp bốn lần so với Non-Consumable (2656 giao dịch) và hơn tám lần so với nhóm Drink (1250 giao dịch).
Điều này cho thấy thực phẩm (Food) là nhóm sản phẩm có nhu cầu cao nhất, phản ánh tầm quan trọng của các mặt hàng tiêu dùng thiết yếu trong giỏ mua sắm của khách hàng siêu thị. Ngược lại, Drink là nhóm có lượng giao dịch thấp nhất, cho thấy mức độ quan tâm hoặc tần suất mua các mặt hàng đồ uống chưa cao.
Từ kết quả này, siêu thị nên tiếp tục ưu tiên đầu tư vào nhóm thực phẩm, cả về chủng loại và chất lượng. Đồng thời, có thể xem xét các chiến lược kích cầu đối với nhóm Drink, như tung ra sản phẩm mới (đồ uống chức năng, dinh dưỡng) hoặc triển khai các chương trình quảng bá nhằm gia tăng sự hấp dẫn. Nhóm Non-Consumable, mặc dù thấp hơn Food nhưng vẫn có lượng giao dịch đáng kể, có thể duy trì ở mức đầu tư ổn định và chọn lọc mặt hàng phù hợp.
# Tính tần số và tần suất
ProductDepartment_freq <- table(b$ProductDepartment)
ProductDepartment_prop <- table(b$ProductDepartment) / sum(nrow(b))
print(ProductDepartment_freq)
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 356 425 1072 680
## Breakfast Foods Canned Foods Canned Products Carousel
## 188 977 109 59
## Checkout Dairy Deli Eggs
## 82 903 699 198
## Frozen Foods Health and Hygiene Household Meat
## 1382 893 1420 89
## Periodicals Produce Seafood Snack Foods
## 202 1994 102 1600
## Snacks Starchy Foods
## 352 277
# Tạo dataframe cho bảng
table_data9 <- data.frame(
`Phân khúc sản phẩm` = names(ProductDepartment_freq),
`Tần số` = as.numeric(ProductDepartment_freq),
`Tần suất (%)` = round(ProductDepartment_prop * 100, 2)
)
colnames(table_data9) <- c("Phân khúc sản phẩm", "Tần số", "Phân khúc sản phẩm ", "Tần suất (%)")
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
kable(table_data9, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Phân khúc sản phẩm | Tần số | Phân khúc sản phẩm | Tần suất (%) |
|---|---|---|---|
| Alcoholic Beverages | 356 | Alcoholic Beverages | 2.53 |
| Baked Goods | 425 | Baked Goods | 3.02 |
| Baking Goods | 1072 | Baking Goods | 7.63 |
| Beverages | 680 | Beverages | 4.84 |
| Breakfast Foods | 188 | Breakfast Foods | 1.34 |
| Canned Foods | 977 | Canned Foods | 6.95 |
| Canned Products | 109 | Canned Products | 0.78 |
| Carousel | 59 | Carousel | 0.42 |
| Checkout | 82 | Checkout | 0.58 |
| Dairy | 903 | Dairy | 6.42 |
| Deli | 699 | Deli | 4.97 |
| Eggs | 198 | Eggs | 1.41 |
| Frozen Foods | 1382 | Frozen Foods | 9.83 |
| Health and Hygiene | 893 | Health and Hygiene | 6.35 |
| Household | 1420 | Household | 10.10 |
| Meat | 89 | Meat | 0.63 |
| Periodicals | 202 | Periodicals | 1.44 |
| Produce | 1994 | Produce | 14.18 |
| Seafood | 102 | Seafood | 0.73 |
| Snack Foods | 1600 | Snack Foods | 11.38 |
| Snacks | 352 | Snacks | 2.50 |
| Starchy Foods | 277 | Starchy Foods | 1.97 |
Dữ liệu cho thấy nhóm sản phẩm tươi sống và thiết yếu chiếm ưu thế rõ rệt trong hành vi tiêu dùng:
“Produce” (Rau quả tươi) dẫn đầu toàn bộ phân khúc với 1994 giao dịch, chiếm 14.1830856% – thể hiện rõ vai trò trung tâm của thực phẩm tươi trong rổ hàng tiêu dùng hàng ngày.
Theo sát là “Snack Foods” (Đồ ăn nhẹ) với 1600 lượt, chiếm 11.3806103%, cho thấy nhu cầu cao về sản phẩm tiện lợi, tiêu thụ nhanh, phù hợp với xu hướng sống hiện đại.
Nhóm “Household” (Đồ gia dụng) và “Frozen Foods” (Thực phẩm đông lạnh) cũng có tỷ lệ đáng kể lần lượt là 10.1002916% và 9.8300021%, phản ánh mức độ dự trữ và tiêu dùng theo chu kỳ dài.
Ở chiều ngược lại, các phân khúc như “Carousel”, “Checkout”, “Meat” và “Seafood” có tần suất rất thấp (<1%), cho thấy hoặc mức độ phổ biến thấp, hoặc chỉ đáp ứng nhu cầu rất cụ thể. Đặc biệt, các danh mục như “Canned Products”, “Eggs”, “Breakfast Foods” cũng chỉ dao động quanh mức 1–1.5%.
Một điểm đáng lưu ý là sự phân mảnh khá lớn giữa các phân khúc: ngoài vài nhóm nổi bật, phần lớn còn lại chiếm tỷ trọng nhỏ. Điều này gợi ý rằng chiến lược tập trung vào nhóm chủ lực đồng thời tăng nhận diện và ưu đãi cho các phân khúc ít phổ biến sẽ giúp mở rộng phạm vi tiêu dùng hiệu quả hơn.
# Tạo biểu đồ cột
bar_positions9 <- barplot(ProductDepartment_freq,
main = "Phân phối khách hàng theo phân khúc sản phẩm",
xlab = "Phân khúc sản phẩm",
ylab = "Số lượng giao dịch",
col = rainbow(length(ProductDepartment_freq)), # Sử dụng bảng màu cầu vồng
las = 2, # Xoay nhãn trục x 90 độ để dễ đọc
cex.names = 0.8, # Giảm kích thước chữ nhãn trục x
ylim = c(0, max(ProductDepartment_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions9,
y = ProductDepartment_freq + 200, # Tăng khoảng cách nhãn lên 200 để hiển thị rõ
labels = ProductFamily_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 0.9) # Kích thước chữ
Biểu đồ trực quan về phân phối khách hàng theo phân khúc sản phẩm hé lộ một bức tranh tiêu dùng phong phú, trong đó “Produce” (rau quả tươi) khẳng định vị thế trung tâm với gần hai nghìn lượt giao dịch. Sự ưu tiên mạnh mẽ dành cho nhóm này không chỉ phản ánh xu hướng sống lành mạnh ngày càng gia tăng, mà còn cho thấy nhu cầu mua sắm thực phẩm tươi ngay lập tức, phù hợp với nhịp sống đô thị hiện đại. Tiếp theo, “Snack Foods” và “Household” lần lượt ghi nhận hơn một nghìn giao dịch, minh chứng cho thói quen tiêu thụ tiện lợi và nhu cầu dự trữ các mặt hàng sinh hoạt thiết yếu. Trong khi đó, các phân khúc như “Carousel” hay “Checkout” chỉ chiếm tỷ lệ rất nhỏ, điều này ngụ ý rằng những danh mục này có thể chỉ phục vụ những nhu cầu rất cụ thể hoặc thường xuyên xuất hiện trong quy trình thanh toán mà không phải là mục tiêu mua sắm chính.
Hơn nữa, biểu đồ cũng đặt ra một vấn đề thú vị về cách phân loại: “Snacks” và “Snack Foods”, cùng với “Canned Foods” và “Canned Products”, tuy mang tên tương đồng nhưng lại thể hiện mức độ tiêu thụ khác nhau. Điều này gợi ý rằng, để tối ưu hóa chiến lược tiếp thị và quản lý danh mục, doanh nghiệp cần xem xét việc thống nhất lại hệ thống phân loại, tránh gây nhầm lẫn cho người tiêu dùng và cải thiện hiệu quả phân tích hành vi.
# Tính tần số và tần suất
ProductCategory_freq <- table(b$ProductCategory)
ProductCategory_prop <- table(b$ProductCategory) / sum(nrow(b))
print(ProductCategory_freq)
##
## Baking Goods Bathroom Products Beer and Wine
## 484 365 356
## Bread Breakfast Foods Candles
## 425 417 45
## Candy Canned Anchovies Canned Clams
## 352 44 53
## Canned Oysters Canned Sardines Canned Shrimp
## 35 40 38
## Canned Soup Canned Tuna Carbonated Beverages
## 404 87 154
## Cleaning Supplies Cold Remedies Dairy
## 189 93 903
## Decongestants Drinks Eggs
## 85 135 198
## Electrical Frozen Desserts Frozen Entrees
## 355 323 118
## Fruit Hardware Hot Beverages
## 765 129 226
## Hygiene Jams and Jellies Kitchen Products
## 197 588 217
## Magazines Meat Miscellaneous
## 202 761 42
## Packaged Vegetables Pain Relievers Paper Products
## 48 192 345
## Pizza Plastic Products Pure Juice Beverages
## 194 141 165
## Seafood Side Dishes Snack Foods
## 102 153 1600
## Specialty Starchy Foods Vegetables
## 289 277 1728
# Tạo dataframe cho bảng
table_data10 <- data.frame(
`Danh mục sản phẩm` = names(ProductCategory_freq),
`Tần số` = as.numeric(ProductCategory_freq),
`Tần suất (%)` = round(ProductCategory_prop * 100, 2)
)
colnames(table_data10) <- c("Danh mục sản phẩm", "Tần số", "Danh mục sản phẩm ", "Tần suất (%)")
# Đặt mã hóa UTF-8 để hỗ trợ tiếng Việt
Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "LC_COLLATE=en_US.UTF-8;LC_CTYPE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8"
# Tạo bảng kẻ
library(knitr)
library(kableExtra)
kable(table_data10, format = "markdown", align = c("l", "c", "c")) %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
| Danh mục sản phẩm | Tần số | Danh mục sản phẩm | Tần suất (%) |
|---|---|---|---|
| Baking Goods | 484 | Baking Goods | 3.44 |
| Bathroom Products | 365 | Bathroom Products | 2.60 |
| Beer and Wine | 356 | Beer and Wine | 2.53 |
| Bread | 425 | Bread | 3.02 |
| Breakfast Foods | 417 | Breakfast Foods | 2.97 |
| Candles | 45 | Candles | 0.32 |
| Candy | 352 | Candy | 2.50 |
| Canned Anchovies | 44 | Canned Anchovies | 0.31 |
| Canned Clams | 53 | Canned Clams | 0.38 |
| Canned Oysters | 35 | Canned Oysters | 0.25 |
| Canned Sardines | 40 | Canned Sardines | 0.28 |
| Canned Shrimp | 38 | Canned Shrimp | 0.27 |
| Canned Soup | 404 | Canned Soup | 2.87 |
| Canned Tuna | 87 | Canned Tuna | 0.62 |
| Carbonated Beverages | 154 | Carbonated Beverages | 1.10 |
| Cleaning Supplies | 189 | Cleaning Supplies | 1.34 |
| Cold Remedies | 93 | Cold Remedies | 0.66 |
| Dairy | 903 | Dairy | 6.42 |
| Decongestants | 85 | Decongestants | 0.60 |
| Drinks | 135 | Drinks | 0.96 |
| Eggs | 198 | Eggs | 1.41 |
| Electrical | 355 | Electrical | 2.53 |
| Frozen Desserts | 323 | Frozen Desserts | 2.30 |
| Frozen Entrees | 118 | Frozen Entrees | 0.84 |
| Fruit | 765 | Fruit | 5.44 |
| Hardware | 129 | Hardware | 0.92 |
| Hot Beverages | 226 | Hot Beverages | 1.61 |
| Hygiene | 197 | Hygiene | 1.40 |
| Jams and Jellies | 588 | Jams and Jellies | 4.18 |
| Kitchen Products | 217 | Kitchen Products | 1.54 |
| Magazines | 202 | Magazines | 1.44 |
| Meat | 761 | Meat | 5.41 |
| Miscellaneous | 42 | Miscellaneous | 0.30 |
| Packaged Vegetables | 48 | Packaged Vegetables | 0.34 |
| Pain Relievers | 192 | Pain Relievers | 1.37 |
| Paper Products | 345 | Paper Products | 2.45 |
| Pizza | 194 | Pizza | 1.38 |
| Plastic Products | 141 | Plastic Products | 1.00 |
| Pure Juice Beverages | 165 | Pure Juice Beverages | 1.17 |
| Seafood | 102 | Seafood | 0.73 |
| Side Dishes | 153 | Side Dishes | 1.09 |
| Snack Foods | 1600 | Snack Foods | 11.38 |
| Specialty | 289 | Specialty | 2.06 |
| Starchy Foods | 277 | Starchy Foods | 1.97 |
| Vegetables | 1728 | Vegetables | 12.29 |
Dữ liệu cho thấy danh mục “Vegetables” chiếm tỷ trọng cao nhất (12.2910591%), theo sau là “Snack Foods” (11.3806103%) và “Dairy” (6.4229319%), phản ánh nhu cầu tiêu dùng cao đối với thực phẩm tươi sống và tiện lợi. Các nhóm như “Fruit”, “Meat” và “Jams and Jellies” cũng có tần suất đáng kể, cho thấy xu hướng cân bằng giữa dinh dưỡng và khẩu vị.
Ngược lại, nhiều danh mục như “Canned Shrimp”, “Candles” hay “Canned Oysters” có tần suất dưới 0.5%, cho thấy mức độ tiêu thụ thấp hoặc nhu cầu đặc thù. Ngoài ra, sự phân mảnh trong các danh mục thực phẩm đóng hộp đặt ra vấn đề về tối ưu hóa hệ thống phân loại.
# Tạo biểu đồ cột
bar_positions10 <- barplot(ProductCategory_freq,
main = "Phân phối khách hàng theo danh mục sản phẩm",
xlab = "anh mục sản phẩm",
ylab = "Số lượng giao dịch",
col = rainbow(length(ProductCategory_freq)), # Sử dụng bảng màu cầu vồng
las = 2, # Xoay nhãn trục x 90 độ để dễ đọc
cex.names = 0.8, # Giảm kích thước chữ nhãn trục x
ylim = c(0, max(ProductCategory_freq) * 1.2)) # Mở rộng trục y lên 120%
# Thêm nhãn số trên mỗi cột
text(x = bar_positions10,
y = ProductCategory_freq + 200, # Tăng khoảng cách nhãn lên 200 để hiển thị rõ
labels = ProductCategory_freq, # Giá trị tần suất
pos = 3, # Đặt nhãn phía trên cột
col = "black", # Màu chữ đen
cex = 0.9) # Kích thước chữ
Biểu đồ thể hiện sự phân bố số lượng giao dịch theo từng danh mục sản phẩm đã chỉ ra những chênh lệch đáng kể trong mức độ tiêu thụ giữa các loại hàng hóa. Nổi bật nhất là nhóm Vegetables với 1,728 giao dịch, chiếm vị trí cao nhất trong tất cả các danh mục, tiếp theo là Snack Foods với 1,600 giao dịch và Dairy với 903 giao dịch. Những con số này cho thấy nhu cầu rất lớn đối với các mặt hàng tươi sống, ăn liền và sữa – vốn là những sản phẩm thiết yếu, phục vụ nhu cầu tiêu dùng hàng ngày của đa số khách hàng.
Ngoài ra, các mặt hàng như Fruit (765 giao dịch), Meat (761), và Jams and Jellies (588) cũng đạt lượng tiêu thụ khá cao, phản ánh xu hướng mua sắm thiên về thực phẩm tự nhiên, chế biến sẵn hoặc có thể dùng kèm trong bữa ăn gia đình. Ngược lại, các danh mục như Canned Oysters (35), Candles (45), Miscellaneous (42), và Canned Anchovies (44) lại có tần suất giao dịch rất thấp, dưới 50 giao dịch. Điều này cho thấy sự quan tâm của khách hàng đối với những mặt hàng này còn hạn chế, có thể do không phổ biến trong khẩu vị, công dụng ít thiết yếu, hoặc chưa được quảng bá hiệu quả.
Một số danh mục khác như Canned Soup (404), Canned Tuna (87), Cold Remedies (93), và Frozen Entrees (118) đạt mức trung bình, cho thấy vai trò bổ trợ trong nhu cầu tiêu dùng, đặc biệt trong các tình huống tiện lợi hoặc mùa vụ.
Tóm lại, dữ liệu về tần suất giao dịch cho thấy rằng siêu thị nên tiếp tục ưu tiên đầu tư vào các danh mục có tần suất tiêu thụ cao như Vegetables, Snack Foods, Dairy, đồng thời cân nhắc lại hiệu quả kinh doanh của các danh mục có giao dịch thấp, từ đó quyết định duy trì, cải tiến hoặc loại bỏ phù hợp.
Biểu đồ dưới đây thể hiện top 10 danh mục sản phẩm theo số lượng giao dịch.
# Tính tần số của biến ProductCategory
ProductCategory_freq <- table(b$ProductCategory)
# Sắp xếp tần số giảm dần và lấy top 10
top_10_freq <- sort(ProductCategory_freq, decreasing = TRUE)[1:10]
# Tính tổng tần số của các danh mục còn lại (gộp thành "Khác")
others_freq <- sum(ProductCategory_freq) - sum(top_10_freq)
# Tạo vector mới gồm top 10 và nhóm "Khác"
freq_for_pie <- c(top_10_freq, "Khác" = others_freq)
# Tính tỷ lệ phần trăm
percentages <- round(freq_for_pie / sum(freq_for_pie) * 100, 1)
# Tạo nhãn cho biểu đồ tròn (kết hợp danh mục và tỷ lệ %)
labels <- paste(names(freq_for_pie), " (", percentages, "%)", sep = "")
# Tạo biểu đồ tròn
pie(freq_for_pie,
main = "Top 10 danh mục sản phẩm theo số lượng giao dịch",
labels = labels,
col = rainbow(length(freq_for_pie)), # Sử dụng bảng màu cầu vồng
cex = 0.8) # Giảm kích thước chữ nhãn
# Trích xuất số lượng "Nữ" và tổng số giao dịch
x <- as.numeric(Gender_freq["F"]) # Số lượng "Nữ" (giả định "F" là mã cho Nữ)
n <- sum(Gender_freq) # Tổng số giao dịch
# Tính khoảng tin cậy 95% cho tỷ lệ
result <- prop.test(x, n, conf.level = 0.95)
# Hiển thị kết quả chi tiết
print(result)
##
## 1-sample proportions test with continuity correction
##
## data: x out of n, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5016931 0.5182886
## sample estimates:
## p
## 0.5099936
# Trích xuất và hiển thị khoảng tin cậy
conf_interval <- result$conf.int
cat("Khoảng tin cậy 95% cho tỷ lệ khách hàng 'Nữ': [", round(conf_interval[1], 4), ", ", round(conf_interval[2], 4), "]\n")
## Khoảng tin cậy 95% cho tỷ lệ khách hàng 'Nữ': [ 0.5017 , 0.5183 ]
# Tính và hiển thị tỷ lệ mẫu
p_hat <- x / n
cat("Tỷ lệ mẫu của khách hàng 'Nữ':", round(p_hat, 4), "\n")
## Tỷ lệ mẫu của khách hàng 'Nữ': 0.51
Khoảng tin cậy 95% cho tỷ lệ khách hàng nữ là khoảng từ [ 0.5017 , 0.5183 ]. Điều này có nghĩa là nếu ta lấy nhiều mẫu ngẫu nhiên khác từ cùng một tổng thể khách hàng, thì khoảng 95% trong số các mẫu đó sẽ cho ra tỷ lệ khách hàng nữ nằm trong khoảng này.
Nói cách khác, ta có thể tin tưởng 95% rằng tỷ lệ thực sự của khách hàng nữ trong toàn bộ dân số (chứ không chỉ trong mẫu) nằm đâu đó giữa 50.17% và 51.83%.
Khoảng tin cậy không cho ta một con số chính xác, mà cho thấy mức độ chắc chắn (ở đây là 95%) về khoảng giá trị mà tỷ lệ thật có thể nằm trong đó.
# Thực hiện kiểm định giả thuyết
result <- prop.test(x = x, n = n, p = 0.5, alternative = "two.sided", conf.level = 0.95)
# Hiển thị kết quả
print(result)
##
## 1-sample proportions test with continuity correction
##
## data: x out of n, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5016931 0.5182886
## sample estimates:
## p
## 0.5099936
# Trích xuất giá trị p
p_value <- result$p.value
cat("Giá trị p-value:", round(p_value, 4), "\n")
## Giá trị p-value: 0.0182
Đặt giả thuyết:
H₀: Tỷ lệ khách hàng nữ trong tổng thể là 0.5 (tức 50%)
H₁: Tỷ lệ khách hàng nữ trong tổng thể khác 0.5
Vì p-value = 0.0182 < 0.05, nên chúng ta bác bỏ giả thuyết H₀ tại mức ý nghĩa 5%. Vậy Tỷ lệ khách hàng nữ trong tổng thể khác 0.5
# Trích xuất số lượng "Sở hữu nhà" (Y) và tổng số giao dịch
x2 <- as.numeric(homeowner_freq["Y"])
n2 <- sum(homeowner_freq) # Tổng số giao dịch
# Tính khoảng tin cậy 95% cho tỷ lệ
result2 <- prop.test(x2, n2, conf.level = 0.95)
# Hiển thị kết quả chi tiết
print(result2)
##
## 1-sample proportions test with continuity correction
##
## data: x2 out of n2, null probability 0.5
## X-squared = 568.86, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.5924537 0.6087145
## sample estimates:
## p
## 0.6006117
# Trích xuất và hiển thị khoảng tin cậy
conf_interval2 <- result2$conf.int
cat("Khoảng tin cậy 95% cho tỷ lệ khách hàng 'Sở hữu nhà' (Y): [", round(conf_interval2[1], 4), ", ", round(conf_interval2[2], 4), "]\n")
## Khoảng tin cậy 95% cho tỷ lệ khách hàng 'Sở hữu nhà' (Y): [ 0.5925 , 0.6087 ]
# Tính và hiển thị tỷ lệ mẫu
p_hat2 <- x2 / n2
cat("Tỷ lệ mẫu của khách hàng 'Sở hữu nhà' (Y):", round(p_hat2, 4), "\n")
## Tỷ lệ mẫu của khách hàng 'Sở hữu nhà' (Y): 0.6006
Khoảng tin cậy [0.5925, 0.6087] có nghĩa là chúng ta có 95% độ tin cậy rằng tỷ lệ thực sự của khách hàng sở hữu nhà trong tổng thể (toàn bộ khách hàng của siêu thị) nằm trong khoảng từ 59.25% đến 60.87%.
# Thực hiện kiểm định giả thuyết
result3 <- prop.test(x = x2, n = n2, p = 0.6, alternative = "two.sided", conf.level = 0.95)
# Hiển thị kết quả
print(result3)
##
## 1-sample proportions test with continuity correction
##
## data: x2 out of n2, null probability 0.6
## X-squared = 0.019445, df = 1, p-value = 0.8891
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
## 0.5924537 0.6087145
## sample estimates:
## p
## 0.6006117
# Trích xuất giá trị p
p_value3 <- result3$p.value
cat("Giá trị p-value:", round(p_value3, 4), "\n")
## Giá trị p-value: 0.8891
Đặt giả thuyết:
H₀: Tỷ lệ khách hàng sở hữu nhà trong tổng thể p=0.6
H₁: Tỷ lệ khách hàng sở hữu nhà trong tổng thể p khác 0.6
Với mức ý nghĩa 5%, vì p-value = 0.8891 > 0.05, ta không đủ bằng chứng để bác bỏ giả thuyết không ( H₀).Nói cách khác, tỷ lệ mẫu quan sát được là 60.06% hoàn toàn phù hợp với giả định
# Trích xuất số lượng "Food" và tổng số giao dịch
x3 <- as.numeric( ProductFamily_freq["Food"])
n3 <- sum( ProductFamily_freq) # Tổng số giao dịch
# Tính khoảng tin cậy 95% cho tỷ lệ
result4 <- prop.test(x3, n3, conf.level = 0.95)
# Hiển thị kết quả chi tiết
print(result4)
##
## 1-sample proportions test with continuity correction
##
## data: x3 out of n3, null probability 0.5
## X-squared = 2774.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.7146709 0.7295489
## sample estimates:
## p
## 0.7221709
# Trích xuất và hiển thị khoảng tin cậy
conf_interval4 <- result4$conf.int
cat("Khoảng tin cậy 95% cho tỷ lệ giao dịch 'Food': [",
round(conf_interval4[1], 4), ", ", round(conf_interval4[2], 4), "]\n")
## Khoảng tin cậy 95% cho tỷ lệ giao dịch 'Food': [ 0.7147 , 0.7295 ]
# Trích xuất và hiển thị p-value
p_value4 <- result4$p.value
cat("Giá trị p-value:", round(p_value4, 4), "\n")
## Giá trị p-value: 0
Khoảng tin cậy [0.7147, 0.7295]. Điều này có nghĩa là: Với độ tin cậy 95%, ta ước lượng rằng tỷ lệ giao dịch thuộc nhóm “Food” trong tổng thể nằm trong khoảng từ 71.47% đến 72.95%.
# Thực hiện kiểm định giả thuyết
result5 <- prop.test(x = x3, n = n3, p = 0.7, alternative = "less", conf.level = 0.95)
# Hiển thị kết quả
print(result5)
##
## 1-sample proportions test with continuity correction
##
## data: x3 out of n3, null probability 0.7
## X-squared = 32.802, df = 1, p-value = 1
## alternative hypothesis: true p is less than 0.7
## 95 percent confidence interval:
## 0.0000000 0.7283768
## sample estimates:
## p
## 0.7221709
# Trích xuất giá trị p
p_value5 <- result5$p.value
cat("Giá trị p-value:", round(p_value5, 4), "\n")
## Giá trị p-value: 1
Đặt giả thuyết:
Giả thuyết H₀: p ≥ 0.7 (tỷ lệ giao dịch “Food” trong tổng thể lớn hơn hoặc bằng 70%).
Giả thuyết H₁: p < 0.7 (tỷ lệ giao dịch “Food” trong tổng thể nhỏ hơn 70%, kiểm định một phía).
Với mức ý nghĩa 5%, vì p-value = 1 > 0.05, ta không đủ bằng chứng để bác bỏ giả thuyết H₀. Nói cách khác, tỷ lệ giao dịch “Food” trong tổng thể lớn hơn hoặc bằng 70%.
# Tạo bảng tần suất chéo cho MaritalStatus và Homeowner
contingency_table <- table(b$MaritalStatus, b$Homeowner)
cat("\nBảng tần suất chéo cho MaritalStatus và Homeowner:\n")
##
## Bảng tần suất chéo cho MaritalStatus và Homeowner:
print(contingency_table)
##
## N Y
## M 1719 5147
## S 3896 3297
# Tính tỷ lệ phần trăm theo hàng
contingency_table_prop <- prop.table(contingency_table, margin = 1) * 100
cat("\nTỷ lệ phần trăm theo hàng cho MaritalStatus và Homeowner:\n")
##
## Tỷ lệ phần trăm theo hàng cho MaritalStatus và Homeowner:
print(round(contingency_table_prop, 1))
##
## N Y
## M 25.0 75.0
## S 54.2 45.8
Mục tiêu là so sánh hành vi sở hữu nhà giữa hai nhóm MaritalStatus (Single và Married). Tỷ lệ phần trăm theo hàng cho phép chúng ta thấy rõ sự khác biệt trong tỷ lệ sở hữu nhà giữa những người độc thân và người đã kết hôn.
Kết quả cho thấy có sự khác biệt rõ rệt trong hành vi sở hữu nhà giữa hai nhóm: Người đã kết hôn có xu hướng sở hữu nhà nhiều hơn (75.0%), có thể do nhu cầu ổn định chỗ ở cho gia đình hoặc thu nhập hộ gia đình cao hơn. Người độc thân có xu hướng không sở hữu nhà cao hơn (54.2%), có thể do ít nhu cầu sở hữu nhà hoặc tài chính hạn chế hơn.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(scales)
# Chuyển bảng về data frame
df_prop <- as.data.frame(contingency_table_prop)
colnames(df_prop) <- c("MaritalStatus", "Homeowner", "Percentage")
# Vẽ biểu đồ cột nhóm
ggplot(df_prop, aes(x = MaritalStatus, y = Percentage, fill = Homeowner)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.6) +
geom_text(aes(label = paste0(round(Percentage, 1), "%")),
position = position_dodge(width = 0.8),
vjust = -0.5,
size = 3.8,
color = "black") +
scale_fill_brewer(palette = "Pastel1") +
labs(
title = "Tỷ lệ phần trăm Chủ sở hữu nhà theo Tình trạng hôn nhân",
x = "Tình trạng hôn nhân",
y = "Tỷ lệ (%)",
fill = "Chủ sở hữu nhà"
) +
scale_y_continuous(labels = label_percent(scale = 1)) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 15, hjust = 0.5),
legend.position = "top",
axis.text.x = element_text(angle = 0, vjust = 0.5),
panel.grid.major.x = element_blank()
)
Dựa trên dữ liệu tỷ lệ phần trăm và biểu đồ cột được cung cấp, mối quan hệ giữa tình trạng hôn nhân và việc sở hữu nhà thể hiện một xu hướng đáng chú ý, phản ánh sự khác biệt rõ ràng giữa các nhóm đối tượng được khảo sát. Dựa trên biểu đồ thể hiện tỷ lệ phần trăm chủ sở hữu nhà theo tình trạng hôn nhân, có thể nhận thấy một mối liên kết rõ ràng giữa hai biến: tình trạng hôn nhân và việc sở hữu nhà ở. Cụ thể, nhóm những người đã kết hôn (ký hiệu là M) có tỷ lệ sở hữu nhà cao hơn đáng kể so với nhóm người độc thân (ký hiệu là S). Trong nhóm đã kết hôn, có đến 75% là chủ sở hữu nhà, trong khi chỉ 25% không sở hữu nhà. Trái lại, ở nhóm độc thân, tỷ lệ không sở hữu nhà lại chiếm ưu thế với 54,2%, còn tỷ lệ sở hữu nhà chỉ đạt 45,8%.
Từ những số liệu này, có thể lập luận rằng tình trạng hôn nhân dường như có ảnh hưởng đáng kể đến khả năng hoặc xu hướng sở hữu nhà. Những người đã kết hôn có xu hướng ổn định hơn về mặt tài chính và cuộc sống gia đình, từ đó có nhiều khả năng đầu tư vào các tài sản cố định như nhà ở. Hơn nữa, việc kết hợp thu nhập từ hai cá nhân trong một mối quan hệ hôn nhân cũng có thể tạo điều kiện thuận lợi hơn để tiếp cận các khoản vay mua nhà hoặc các hình thức tài chính khác.
Ngược lại, nhóm độc thân có thể chưa ưu tiên việc mua nhà do những lý do liên quan đến sự linh hoạt trong công việc, đời sống cá nhân, hoặc những ràng buộc tài chính cá nhân chưa đủ vững chắc. Do đó, tỷ lệ không sở hữu nhà trong nhóm này cao hơn là điều dễ hiểu.
Kết quả này gợi ý sự liên kết tích cực giữa hai yếu tố, nhưng cần kiểm định thống kê để khẳng định chắc chắn.
Để xác định xem mối quan hệ giữa MaritalStatus và Homeowner có ý nghĩa thống kê hay không, cần thực hiện thêm kiểm định (như kiểm định Chi-bình phương).
# Thực hiện kiểm định Chi-bình phương
chi_test <- chisq.test(contingency_table)
# Báo cáo kết quả
cat("Giá trị Chi-bình phương:", chi_test$statistic, "\n")
## Giá trị Chi-bình phương: 1241.218
cat("Bậc tự do (df):", chi_test$parameter, "\n")
## Bậc tự do (df): 1
cat("Giá trị p:", chi_test$p.value, "\n")
## Giá trị p: 6.724506e-272
Giả thuyết H₀: Hai biến MaritalStatus và Homeowner độc lập với nhau, tức là không có mối liên hệ.
Giả thuyết H₁: Hai biến MaritalStatus và Homeowner có liên quan với nhau, tức là có mối liên hệ.
Vì p-value ≈ 0 < 0.05, nên Bác bỏ giả thuyết H₀ ở mức ý nghĩa 5%. Vậy Có bằng chứng thống kê rất mạnh để kết luận rằng tình trạng hôn nhân có liên quan đến tình trạng sở hữu nhà. Cụ thể, nhóm khách hàng đã kết hôn có tỷ lệ sở hữu nhà lên đến 75%, trong khi nhóm độc thân chỉ đạt 45.8%. Điều này cho thấy rằng hôn nhân thường đi kèm với nhu cầu ổn định chỗ ở, lên kế hoạch dài hạn và thường là dấu mốc cho các quyết định tài chính lớn như mua nhà. Bên cạnh đó, việc có hai người cùng chia sẻ gánh nặng tài chính có thể giúp gia đình đã kết hôn tiếp cận dễ dàng hơn với các khoản vay mua nhà hoặc tích lũy tài sản.
Ngược lại, nhóm độc thân có tỷ lệ không sở hữu nhà lên đến 54.2%, phản ánh có thể họ còn đang trong giai đoạn đầu sự nghiệp, thu nhập chưa ổn định, hoặc chưa có nhu cầu sở hữu nhà cố định. Một số người trong nhóm này có thể lựa chọn thuê nhà để linh hoạt trong công việc và cuộc sống.
Từ đó, có thể kết luận rằng tình trạng hôn nhân không chỉ liên quan đến yếu tố xã hội mà còn phản ánh sự khác biệt đáng kể về hành vi tài chính và nhu cầu sở hữu tài sản. Đây là một mối quan hệ hai chiều, nơi hành vi tiêu dùng và tình trạng hôn nhân tương tác lẫn nhau một cách rõ rệt. Các doanh nghiệp bất động sản, tổ chức tài chính hoặc nhà hoạch định chính sách có thể tận dụng thông tin này để xây dựng các sản phẩm, chính sách hoặc chiến lược tiếp cận phù hợp với từng nhóm dân cư.
# Tạo bảng tần suất chéo cho Gender và ProductFamily
contingency_table <- table(b$Gender, b$ProductFamily)
cat("\nBảng tần suất chéo choGender và ProductFamily:\n")
##
## Bảng tần suất chéo choGender và ProductFamily:
print(contingency_table)
##
## Drink Food Non-Consumable
## F 669 5149 1352
## M 581 5004 1304
# Tính tỷ lệ phần trăm theo hàng
contingency_table_prop <- prop.table(contingency_table, margin = 1) * 100
cat("\nTỷ lệ phần trăm theo hàng cho Gender và ProductFamily:\n")
##
## Tỷ lệ phần trăm theo hàng cho Gender và ProductFamily:
print(round(contingency_table_prop, 1))
##
## Drink Food Non-Consumable
## F 9.3 71.8 18.9
## M 8.4 72.6 18.9
Ở cả hai nhóm giới tính là nam (M) và nữ (F), nhóm sản phẩm Food (thực phẩm) chiếm tỷ lệ cao nhất, với 71.8% ở nữ và 72.6% ở nam. Điều này cho thấy rằng thực phẩm là nhóm sản phẩm phổ biến và được tiêu dùng chủ yếu bất kể giới tính, phản ánh một nhu cầu cơ bản và có tính chất thiết yếu trong tiêu dùng hằng ngày.
Đối với nhóm sản phẩm Drink (đồ uống), phụ nữ có xu hướng tiêu dùng nhiều hơn nam giới, với 9.3% so với 8.4%. Tuy chênh lệch này là nhỏ, nhưng cũng phần nào phản ánh sự khác biệt nhẹ trong thói quen tiêu dùng đồ uống giữa hai giới. Có thể giả định rằng phụ nữ quan tâm nhiều hơn đến các sản phẩm thuộc nhóm đồ uống, chẳng hạn như nước giải khát, đồ uống dinh dưỡng hoặc các sản phẩm có yếu tố chăm sóc sức khỏe.
Ngược lại, đối với nhóm Non-Consumable (sản phẩm không tiêu dùng, như đồ gia dụng, vật dụng bền…), cả nam và nữ đều có tỷ lệ bằng nhau là 18.9%, cho thấy không có sự khác biệt đáng kể theo giới tính trong việc tiêu dùng nhóm sản phẩm này. Điều này có thể phản ánh rằng các sản phẩm không tiêu dùng phục vụ cho nhu cầu chung của hộ gia đình và không phụ thuộc quá nhiều vào yếu tố giới.
library(ggplot2)
library(dplyr)
library(scales)
# Tạo bảng chéo và tính tỷ lệ phần trăm theo Gender
contingency_table <- table(b$Gender, b$ProductFamily)
contingency_table_prop <- prop.table(contingency_table, 1) * 100 # Tỷ lệ % theo hàng (Gender)
# Chuyển bảng tỷ lệ thành data frame
df_prop <- as.data.frame(contingency_table_prop)
colnames(df_prop) <- c("Gender", "ProductFamily", "Percentage")
# Vẽ biểu đồ cột nhóm
ggplot(df_prop, aes(x = Gender, y = Percentage, fill = ProductFamily)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.6) +
geom_text(aes(label = paste0(round(Percentage, 1), "%")),
position = position_dodge(width = 0.8),
vjust = -0.5,
size = 3.8,
color = "black") +
scale_fill_brewer(palette = "Pastel1") +
labs(
title = "Tỷ lệ phần trăm Gia đình sản phẩm theo Giới tính",
x = "Giới tính",
y = "Tỷ lệ (%)",
fill = "Gia đình sản phẩm"
) +
scale_y_continuous(labels = label_percent(scale = 1)) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 15, hjust = 0.5),
legend.position = "top",
axis.text.x = element_text(angle = 0, vjust = 0.5),
panel.grid.major.x = element_blank()
)
Biểu đồ thể hiện tỷ lệ phần trăm của ba nhóm sản phẩm — Drink, Food và Non-Consumable — theo giới tính cho thấy một mối quan hệ khá rõ ràng giữa giới tính và xu hướng tiêu dùng sản phẩm. Cụ thể, ở cả hai giới, sản phẩm thuộc nhóm “Food” chiếm tỷ trọng cao vượt trội, với tỷ lệ lần lượt là 71.8% ở nữ và 72.6% ở nam. Sự đồng thuận này cho thấy rằng thực phẩm là mặt hàng thiết yếu, chiếm phần lớn trong hành vi tiêu dùng của cả hai nhóm giới, và yếu tố giới tính không tạo ra sự khác biệt đáng kể trong nhu cầu đối với loại sản phẩm này.
Tuy nhiên, khi xét đến nhóm sản phẩm “Drink”, có một sự chênh lệch nhỏ nhưng đáng lưu ý. Tỷ lệ tiêu dùng đồ uống ở nữ là 9.3%, nhỉnh hơn một chút so với nam là 8.4%. Dù khoảng cách không lớn, điều này vẫn có thể gợi mở giả thuyết rằng nữ giới có thể quan tâm nhiều hơn đến các sản phẩm đồ uống, có thể liên quan đến các yếu tố như sở thích cá nhân, nhu cầu sức khỏe, hoặc thói quen tiêu dùng hằng ngày.
Đối với nhóm “Non-Consumable”, tỷ lệ tiêu dùng tương đương ở cả nam và nữ, đều ở mức 18.9%. Điều này cho thấy sản phẩm không tiêu dùng ngay – chẳng hạn như đồ gia dụng hoặc vật dụng lâu bền – được tiêu dùng một cách đồng đều bởi cả hai giới. Có thể lý giải rằng đây là các mặt hàng phục vụ mục tiêu sử dụng chung trong hộ gia đình nên giới tính không phải là yếu tố phân biệt hành vi tiêu dùng.
Tổng thể, biểu đồ phản ánh rằng có sự liên kết giữa giới tính và hành vi tiêu dùng, nhưng mối liên kết này chủ yếu biểu hiện ở những nhóm sản phẩm có mức độ tiêu dùng thấp hơn như “Drink”. Ngược lại, đối với nhóm sản phẩm chủ đạo là “Food”, xu hướng tiêu dùng là gần như tương đồng giữa hai giới. Như vậy, giới tính có ảnh hưởng nhất định đến hành vi tiêu dùng, nhưng ảnh hưởng này không quá mạnh và mang tính tương đối tùy theo từng loại sản phẩm.
# Thực hiện kiểm định Chi-bình phương
chi_test <- chisq.test(contingency_table)
# Báo cáo kết quả
cat("Giá trị Chi-bình phương:", chi_test$statistic, "\n")
## Giá trị Chi-bình phương: 3.51849
cat("Bậc tự do (df):", chi_test$parameter, "\n")
## Bậc tự do (df): 2
cat("Giá trị p:", chi_test$p.value, "\n")
## Giá trị p: 0.1721748
Giả thuyết H₀: Hai biến Gender và ProductFamily độc lập với nhau, tức là không có mối liên hệ.
Giả thuyết H₁: Hai biến Gender và ProductFamily có liên quan với nhau, tức là có mối liên hệ.
Vì p-value ≈ 0.1721748 > 0.05, ta không có đủ bằng chứng để bác bỏ giả thuyết không (H₀) tại mức ý nghĩa thông thườngNói cách khác, chưa có bằng chứng thống kê đủ mạnh để khẳng định rằng hai biến “Giới tính” (Gender) và “Nhóm sản phẩm” (ProductFamily) có mối liên hệ với nhau trong tổng thể. Điều này hàm ý rằng trong mẫu dữ liệu hiện tại, xu hướng lựa chọn nhóm sản phẩm không khác biệt rõ ràng giữa nam và nữ. Tỷ lệ phân phối các nhóm sản phẩm có thể tương đối đồng đều giữa hai giới tính, hoặc bất kỳ sự khác biệt nào quan sát được cũng chỉ mang tính ngẫu nhiên.
Để khám phá xem có sự khác biệt về phân phối thu nhập giữa nam và nữ trong số các khách hàng em chọn cặp biến này để phân tích.
# Tạo bảng tần suất chéo cho Gender và AnnualIncome
contingency_table <- table(b$Gender, b$AnnualIncome)
cat("\nBảng tần suất chéo cho Gender và AnnualIncome:\n")
##
## Bảng tần suất chéo cho Gender và AnnualIncome:
print(contingency_table)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
## F 1587 307 390 140 2243 1224
## M 1503 336 370 133 2358 1146
##
## $70K - $90K $90K - $110K
## F 959 320
## M 750 293
# Tính tỷ lệ phần trăm theo hàng
contingency_table_prop <- prop.table(contingency_table, margin = 1) * 100
cat("\nTỷ lệ phần trăm theo hàng cho Gender và ProductFamily:\n")
##
## Tỷ lệ phần trăm theo hàng cho Gender và ProductFamily:
print(round(contingency_table_prop, 1))
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
## F 22.1 4.3 5.4 2.0 31.3 17.1
## M 21.8 4.9 5.4 1.9 34.2 16.6
##
## $70K - $90K $90K - $110K
## F 13.4 4.5
## M 10.9 4.3
Trước hết, ta có thể quan sát rằng ở khoảng thu nhập thấp từ $10K đến $30K, tỷ lệ phụ nữ (22.1%) và nam giới (21.8%) gần như tương đương nhau. Đây là mức thu nhập phổ biến nhất ở cả hai giới, phản ánh rằng một bộ phận đáng kể của cả nam và nữ rơi vào nhóm thu nhập thấp nhất trong tập dữ liệu.
Đối với nhóm thu nhập từ $30K đến $50K, tỷ lệ cũng tương đối cao, đặc biệt là ở nam giới (34.2%) so với nữ (31.3%). Điều này cho thấy một tỷ lệ lớn người tiêu dùng – đặc biệt là nam giới – đang nằm trong nhóm thu nhập trung bình thấp, ngay trên ngưỡng thu nhập thấp nhất.
Từ nhóm $50K đến $70K, tỷ lệ có xu hướng giảm xuống, tuy nhiên vẫn duy trì mức tương đối ổn định, với 17.1% ở nữ và 16.6% ở nam. Điều này gợi ý rằng đây cũng là một nhóm thu nhập khá phổ biến, đặc biệt là khi kết hợp với hai nhóm thu nhập thấp hơn tạo thành một cụm chiếm ưu thế trong cơ cấu phân bố.
Khi tiến lên các mức thu nhập cao hơn như $70K–$90K, $90K–$110K, và $110K–$130K, ta bắt đầu thấy sự giảm mạnh về tỷ lệ ở cả hai giới. Tuy nhiên, điều thú vị là trong khoảng $70K–$90K, nữ giới chiếm tỷ lệ cao hơn (13.4%) so với nam giới (10.9%), cho thấy có thể có một bộ phận phụ nữ có thu nhập khá nổi bật trong nhóm này. Ở các mức cao hơn như $110K–$130K và $130K–$150K, tỷ lệ giữa hai giới bắt đầu cân bằng hơn, nhưng vẫn duy trì ở mức thấp (khoảng 4–5%).
Ở mức thu nhập cao nhất ($150K+), cả nam và nữ đều chiếm tỷ lệ rất nhỏ – 2.0% ở nữ và 1.9% ở nam – cho thấy rằng nhóm có thu nhập cao vượt trội là tương đối hiếm trong cả hai giới, và không có sự khác biệt đáng kể về giới trong phân khúc này.
Tóm lại, dữ liệu cho thấy rằng phân bố thu nhập giữa nam và nữ có nhiều điểm tương đồng, đặc biệt ở các nhóm thu nhập thấp và trung bình. Tuy nhiên, ở một số nhóm thu nhập cụ thể (như $70K–$90K), nữ giới có xu hướng chiếm tỷ lệ cao hơn, trong khi nam giới lại chiếm ưu thế ở nhóm $30K–$50K. Sự chênh lệch không quá lớn, nhưng có thể phản ánh một số khác biệt nhẹ trong điều kiện kinh tế hoặc ngành nghề giữa hai giới.
library(ggplot2)
library(dplyr)
library(scales)
# Tạo bảng chéo và tính tỷ lệ phần trăm theo Gender
# Chuyển bảng tỷ lệ thành data frame
df_prop <- as.data.frame(contingency_table_prop)
colnames(df_prop) <- c("Gender", "IncomeGroup", "Percentage")
# Vẽ biểu đồ cột nhóm
ggplot(df_prop, aes(x = Gender, y = Percentage, fill = IncomeGroup)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.6) +
geom_text(aes(label = paste0(round(Percentage, 1), "%")),
position = position_dodge(width = 0.8),
vjust = -0.5,
size = 3.8,
color = "black") +
scale_fill_brewer(palette = "Pastel1") +
labs(
title = "Tỷ lệ phần trăm Nhóm thu nhập theo Giới tính",
x = "Giới tính",
y = "Tỷ lệ (%)",
fill = "Nhóm thu nhập",
caption = paste("p-value kiểm định chi-bình phương:", round(chi_test$p.value, 4))
) +
scale_y_continuous(labels = label_percent(scale = 1), limits = c(0, 100)) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 15, hjust = 0.5),
plot.caption = element_text(size = 10, hjust = 0),
legend.position = "top",
axis.text.x = element_text(angle = 0, vjust = 0.5),
panel.grid.major.x = element_blank()
)
Biểu đồ thể hiện tỷ lệ phần trăm của ba nhóm sản phẩm — Drink, Food và Non-Consumable — theo giới tính cho thấy một mối quan hệ khá rõ ràng giữa giới tính và xu hướng tiêu dùng sản phẩm. Cụ thể, ở cả hai giới, sản phẩm thuộc nhóm “Food” chiếm tỷ trọng cao vượt trội, với tỷ lệ lần lượt là 71.8% ở nữ và 72.6% ở nam. Sự đồng thuận này cho thấy rằng thực phẩm là mặt hàng thiết yếu, chiếm phần lớn trong hành vi tiêu dùng của cả hai nhóm giới, và yếu tố giới tính không tạo ra sự khác biệt đáng kể trong nhu cầu đối với loại sản phẩm này.
Tuy nhiên, khi xét đến nhóm sản phẩm “Drink”, có một sự chênh lệch nhỏ nhưng đáng lưu ý. Tỷ lệ tiêu dùng đồ uống ở nữ là 9.3%, nhỉnh hơn một chút so với nam là 8.4%. Dù khoảng cách không lớn, điều này vẫn có thể gợi mở giả thuyết rằng nữ giới có thể quan tâm nhiều hơn đến các sản phẩm đồ uống, có thể liên quan đến các yếu tố như sở thích cá nhân, nhu cầu sức khỏe, hoặc thói quen tiêu dùng hằng ngày.
Đối với nhóm “Non-Consumable”, tỷ lệ tiêu dùng tương đương ở cả nam và nữ, đều ở mức 18.9%. Điều này cho thấy sản phẩm không tiêu dùng ngay – chẳng hạn như đồ gia dụng hoặc vật dụng lâu bền – được tiêu dùng một cách đồng đều bởi cả hai giới. Có thể lý giải rằng đây là các mặt hàng phục vụ mục tiêu sử dụng chung trong hộ gia đình nên giới tính không phải là yếu tố phân biệt hành vi tiêu dùng.
Tổng thể, biểu đồ phản ánh rằng có sự liên kết giữa giới tính và hành vi tiêu dùng, nhưng mối liên kết này chủ yếu biểu hiện ở những nhóm sản phẩm có mức độ tiêu dùng thấp hơn như “Drink”. Ngược lại, đối với nhóm sản phẩm chủ đạo là “Food”, xu hướng tiêu dùng là gần như tương đồng giữa hai giới. Như vậy, giới tính có ảnh hưởng nhất định đến hành vi tiêu dùng, nhưng ảnh hưởng này không quá mạnh và mang tính tương đối tùy theo từng loại sản phẩm.
# Thực hiện kiểm định Chi-bình phương
chi_test <- chisq.test(contingency_table)
# Báo cáo kết quả
cat("Giá trị Chi-bình phương:", chi_test$statistic, "\n")
## Giá trị Chi-bình phương: 30.88325
cat("Bậc tự do (df):", chi_test$parameter, "\n")
## Bậc tự do (df): 7
cat("Giá trị p:", chi_test$p.value, "\n")
## Giá trị p: 6.533308e-05
Giả thuyết H₀: Hai biến Gender và ProductFamily độc lập với nhau, tức là không có mối liên hệ.
Giả thuyết H₁: Hai biến Gender và ProductFamily có liên quan với nhau, tức là có mối liên hệ.
Vì p-value ≈ 6.533308e-05 < 0.05, ta có đủ bằng chứng để bác bỏ giả thuyết H₀. Điều này đồng nghĩa với việc dữ liệu thu được cho thấy có mối liên hệ có ý nghĩa thống kê giữa giới tính (Gender) và thu nhập hằng năm (AnnualIncome).
Nói cách khác, sự phân bố thu nhập không giống nhau giữa các nhóm giới tính. Mặc dù biểu đồ trực quan trước đó cho thấy sự khác biệt giữa các nhóm thu nhập là không quá lớn, kết quả kiểm định thống kê lại chỉ ra rằng những khác biệt nhỏ đó là đáng kể khi xét trên toàn bộ phân phối dữ liệu. Do đó, ta có thể kết luận rằng giới tính có ảnh hưởng đến thu nhập trong mẫu khảo sát này
Dựa trên các phân tích biến định tính và mối quan hệ giữa các cặp biến từ dữ liệu “Supermarket Transactions.csv”, sau đây là những hiểu biết quan trọng nhất về đặc điểm khách hàng và hành vi mua sắm:
Giới tính (Gender):Phân phối giới tính khá cân bằng, với nữ (51%, 7170 giao dịch) nhỉnh hơn nam (49%, 6889 giao dịch). Khoảng tin cậy 95% cho tỷ lệ nữ là [50.17%, 51.83%], và kiểm định cho thấy tỷ lệ nữ khác 50% (p-value = 0.0182). Điều này cho thấy khách hàng siêu thị đa dạng về giới tính, không thiên lệch đáng kể.
Tình trạng sở hữu nhà (Homeowner): 60.06% khách hàng sở hữu nhà (8444 giao dịch) so với 39.94% không sở hữu (5615 giao dịch). Khoảng tin cậy 95% cho tỷ lệ sở hữu nhà là [59.25%, 60.87%], và tỷ lệ mẫu 60.06% phù hợp với giả định 60% (p-value = 0.8891). Điều này gợi ý phần lớn khách hàng có tài sản ổn định, có thể liên quan đến thu nhập hoặc nhu cầu tiêu dùng gia đình.
Tình trạng hôn nhân (MaritalStatus): Khách hàng độc thân (51.16%, 7193 giao dịch) nhỉnh hơn đã kết hôn (48.84%, 6866 giao dịch). Sự chênh lệch nhỏ cho thấy cả hai nhóm đều quan trọng, với độc thân có xu hướng tiêu dùng linh hoạt hơn.
Thu nhập hàng năm (AnnualIncome): Phân phối thu nhập tập trung ở mức thấp đến trung bình: $30K - $50K: 32.73% (4601 giao dịch). $10K - $30K: 21.98% (3090 giao dịch). $50K - $70K: 16.86% (2370 giao dịch). Nhóm thu nhập cao ($90K+): ~16.28%. Điều này cho thấy khách hàng chủ yếu thuộc tầng lớp trung bình-thấp, phù hợp với sản phẩm giá cả phải chăng.
Khu vực địa lý:
Quốc gia (Country): Hoa Kỳ chiếm 68.01% (9562 giao dịch), Mexico 26.23% (3688), Canada 5.75% (809). Sự tập trung vào Mỹ cho thấy đây là thị trường chính, nhưng Mexico là thị trường vệ tinh tiềm năng.
Bang (StateorProvince): Washington (WA, 32.48%, 4567 giao dịch), California (CA, 19.44%, 2733), Oregon (OR, 16.09%, 2262) dẫn đầu. Zacatecas (Mexico, 9.23%) nổi bật trong các bang Mexico.
Thành phố (City): Salem (9.86%, 1386 giao dịch), Tacoma (8.94%, 1257), Los Angeles (6.59%, 926) có số giao dịch cao nhất, cho thấy các đô thị lớn là trọng điểm.
Nhóm sản phẩm (ProductFamily): Thực phẩm (Food) chiếm 72.22% (10153 giao dịch), vượt xa đồ uống (Drink, 8.89%, 1250) và không tiêu dùng (Non-Consumable, 18.89%, 2656). Khoảng tin cậy 95% cho tỷ lệ Food là [71.47%, 72.95%], và kiểm định cho thấy tỷ lệ Food ≥ 70% (p-value = 1). Điều này nhấn mạnh thực phẩm là mặt hàng thiết yếu.
Phân khúc sản phẩm (ProductDepartment): Produce (14.18%, 1994 giao dịch), Snack Foods (11.38%, 1600), Household (10.10%, 1420), Frozen Foods (9.83%, 1382) là các nhóm chủ đạo, phản ánh nhu cầu về thực phẩm tươi, tiện lợi và đồ gia dụng.
Danh mục sản phẩm (ProductCategory): Vegetables (12.29%, 1728 giao dịch), Snack Foods (11.38%, 1600), Dairy (6.42%, 903) dẫn đầu, cho thấy ưu tiên thực phẩm tươi và tiện lợi. Các danh mục như Canned Shrimp, Candles (<0.5%) có nhu cầu thấp.
MaritalStatus và Homeowner: Có mối quan hệ mạnh (p-value ≈ 0). Người đã kết hôn sở hữu nhà nhiều hơn (75%) so với độc thân (45.8%). Điều này cho thấy hôn nhân liên quan đến nhu cầu ổn định nhà ở và tài chính.
Gender và ProductFamily: Không có mối quan hệ đáng kể (p-value = 0.1722). Cả nam và nữ ưu tiên Food (~71.8-72.6%), với nữ mua Drink nhiều hơn nam (9.3% vs. 8.4%), nhưng sự khác biệt không thống kê đáng kể.
-Gender và AnnualIncome: Có mối quan hệ thống kê (p-value = 6.53e-05). Nữ chiếm tỷ lệ cao hơn ở $70K - $90K (13.4% vs. 10.9%), nam ở $30K - $50K (34.2% vs. 31.3%). Tuy nhiên, phân phối tổng thể khá tương đồng, với nhóm thu nhập thấp-trung bình chiếm ưu thế.
Phân tích dữ liệu giao dịch trong nghiên cứu này, mặc dù mang lại nhiều phát hiện hữu ích, vẫn tồn tại một số hạn chế cần được lưu ý nhằm đảm bảo tính chính xác và khái quát hóa của kết luận.
Thứ nhất, về chất lượng dữ liệu, bản chất của tập dữ liệu dựa trên các giao dịch riêng lẻ chứ không phải khách hàng duy nhất (CustomerID), dẫn đến khả năng một cá nhân thực hiện nhiều giao dịch. Điều này có thể làm sai lệch tỷ lệ và xu hướng, đồng thời gây hiểu nhầm khi giả định mỗi giao dịch là một khách hàng riêng biệt. Việc tái cấu trúc dữ liệu theo từng khách hàng duy nhất sẽ giúp mang lại cái nhìn chính xác hơn về hành vi tiêu dùng. Ngoài ra, một số biến, như ProductCategory, có sự phân mảnh không nhất quán (ví dụ, “Snacks” và “Snack Foods”), gây khó khăn trong việc phân loại và so sánh.
Thứ hai, kích thước mẫu của một số hạng mục còn hạn chế. Ví dụ, nhóm thu nhập $150K+ chỉ có 273 giao dịch, danh mục Canned Oysters có 35 giao dịch, hay một số địa phương như Guadalajara chỉ ghi nhận 75 giao dịch. Những con số này là quá nhỏ để đưa ra các kết luận thống kê đáng tin cậy.
Cuối cùng, giới hạn về phạm vi địa lý cần được cân nhắc. Với 68.01% giao dịch đến từ Hoa Kỳ, các xu hướng tại Mexico và Canada có thể bị lu mờ, đặc biệt khi Canada chỉ chiếm 5.75% tổng mẫu. Phân tích sâu hơn ở từng khu vực địa lý có thể bị ảnh hưởng do cỡ mẫu không đủ lớn, từ đó làm giảm độ tin cậy của các kết luận chi tiết theo quốc gia hoặc bang.
Dựa trên các phân tích dữ liệu hiện có, một chiến lược kinh doanh toàn diện nên được xây dựng xoay quanh đặc điểm của nhóm khách hàng có thu nhập thấp đến trung bình (từ $10K đến $50K), vốn chiếm khoảng 54.7% tổng số giao dịch. Đây là phân khúc có tiềm năng mua sắm cao nếu được kích cầu đúng cách. Do đó, việc triển khai các chương trình khuyến mãi, thẻ thành viên hay giảm giá sản phẩm thiết yếu như Produce và Snack Foods sẽ góp phần thúc đẩy tiêu dùng trong nhóm này.
Bên cạnh đó, yếu tố tình trạng hôn nhân cũng đóng vai trò quan trọng trong việc xác định hành vi mua sắm. Nhóm đã kết hôn – chiếm đa số trong số người sở hữu nhà (75%) – thường có xu hướng tiêu dùng các sản phẩm phục vụ cho gia đình như Household, Dairy và Vegetables. Ngược lại, nhóm độc thân – chiếm 54.2% trong nhóm không sở hữu nhà – có xu hướng ưa chuộng các sản phẩm tiện lợi như Snack Foods và Drinks, phù hợp với lối sống nhanh gọn. Về yếu tố giới tính, do không tồn tại sự khác biệt đáng kể trong hành vi mua sắm giữa nam và nữ, nên có thể áp dụng chiến lược tiếp thị chung. Tuy nhiên, dữ liệu cũng gợi ý rằng nữ giới có tỷ lệ mua Drinks cao hơn, từ đó mở ra cơ hội triển khai các chiến dịch quảng cáo đồ uống hướng đến đối tượng này.
Về danh mục sản phẩm, cần tiếp tục ưu tiên các nhóm có tỷ lệ mua cao như Produce (14.18%), Vegetables (12.29%) và Snack Foods (11.38%). Song song đó, doanh nghiệp cần đổi mới dòng sản phẩm – chẳng hạn như phát triển thực phẩm hữu cơ – để duy trì sức cạnh tranh. Các danh mục có doanh số thấp như Canned Oysters hay Candles có thể được tiếp thị thông qua chương trình combo hoặc khuyến mãi. Ngoài ra, nên rà soát danh mục để tránh sự trùng lặp gây nhầm lẫn, đặc biệt giữa “Snacks” và “Snack Foods”.
Về mặt địa lý, Hoa Kỳ tiếp tục là thị trường trọng điểm, đặc biệt tại các bang như Washington, California và các thành phố như Tacoma, Los Angeles. Đồng thời, Mexico – nơi chiếm 26.23% giao dịch – là thị trường đầy tiềm năng, đặc biệt ở các bang như Zacatecas. Tại đây, siêu thị nên tập trung vào các mặt hàng mang tính địa phương như Vegetables hoặc Canned Foods. Canada, tuy mới chiếm 5.75% thị phần, cũng có thể trở thành thị trường phát triển nếu được đầu tư tiếp thị phù hợp tại các khu vực như Vancouver hoặc Victoria.
Cuối cùng, từ góc độ tài chính, việc hợp tác với các tổ chức tín dụng để đưa ra các gói vay mua nhà hoặc tiết kiệm dành riêng cho khách hàng độc thân không sở hữu nhà có thể mang lại tác động tích cực kép: vừa hỗ trợ khách hàng cải thiện điều kiện sống, vừa thúc đẩy tiêu dùng các sản phẩm liên quan đến gia đình như Household và Non-Consumable.
Một hướng nghiên cứu tiếp theo đầy tiềm năng là phân tích xu hướng mua sắm theo thời gian, tập trung vào mối quan hệ giữa các danh mục sản phẩm như ProductFamily và ProductDepartment với PurchaseDate. Câu hỏi đặt ra là: Hành vi tiêu dùng thay đổi như thế nào theo mùa, theo tháng hoặc trong các dịp lễ đặc biệt? Việc khám phá tính thời vụ trong mua sắm không chỉ có ý nghĩa học thuật mà còn mang lại giá trị thực tiễn cho chiến lược kinh doanh của siêu thị.
Thực tế cho thấy, thói quen tiêu dùng chịu ảnh hưởng lớn từ yếu tố thời gian, đặc biệt trong các mùa cao điểm hoặc kỳ nghỉ lễ. Ví dụ, nhóm sản phẩm Drinks hoặc Beverages có thể ghi nhận mức tiêu thụ cao vào mùa hè do nhu cầu giải khát, trong khi các sản phẩm thuộc nhóm Snack Foods hoặc Household có thể gia tăng mạnh vào dịp Giáng sinh để phục vụ các buổi tiệc gia đình. Tương tự, Frozen Foods có thể được ưa chuộng hơn vào mùa đông, tạo cơ hội cho việc điều chỉnh tồn kho và tối ưu hóa chương trình khuyến mãi.
Bên cạnh đó, yếu tố địa lý và văn hóa cũng góp phần tạo nên sự khác biệt đáng kể trong xu hướng tiêu dùng theo thời gian. Với tỷ trọng khách hàng chủ yếu đến từ Mỹ (68.01%), Mexico (26.23%) và Canada (5.75%), các sự kiện như Thanksgiving ở Mỹ, Día de los Muertos ở Mexico hay Tết Nguyên Đán ở cộng đồng châu Á tại Canada có thể làm thay đổi đáng kể nhu cầu đối với một số nhóm sản phẩm đặc thù, chẳng hạn như Canned Foods hoặc Baking Goods.
Vì vậy, trong các nghiên cứu tiếp theo, việc kết hợp phân tích chuỗi thời gian với dữ liệu danh mục sản phẩm và địa lý có thể mang lại những phát hiện quan trọng, giúp siêu thị cá nhân hóa chiến dịch tiếp thị, dự báo nhu cầu chính xác hơn và triển khai các chiến lược tối ưu hóa chuỗi cung ứng theo mùa. Đây không chỉ là bước phát triển tự nhiên của nghiên cứu hiện tại mà còn mở ra không gian rộng lớn cho các ứng dụng trong thực tiễn kinh doanh và phân tích hành vi người tiêu dùng.
Tỷ số rủi ro (RR) là tỷ lệ giữa xác suất xảy ra sự kiện ở nhóm phơi nhiễm so với nhóm không phơi nhiễm. Nó thể hiện mức tăng (hoặc giảm) tương đối về nguy cơ.
Cách tính:
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
Ý nghĩa:
\(RR = 1\): Không có sự khác biệt nguy cơ giữa hai nhóm
\(RR > 1\): Nhóm A có nguy cơ cao hơn
\(RR < 1\): Nhóm A có nguy cơ thấp hơn
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.4.3
library(epitools)
cross_table <- table(b$MaritalStatus, b$Homeowner)
addmargins(cross_table)#Thêm tổng số quan sát cho từng hàng, từng cột, thêm tổng chung cho toàn bộ bảng
##
## N Y Sum
## M 1719 5147 6866
## S 3896 3297 7193
## Sum 5615 8444 14059
# In bảng chéo
print(cross_table)
##
## N Y
## M 1719 5147
## S 3896 3297
#Tính rủi ro tương đối (relative risk).
## Lệnh này tính relativerisk cho vị trí 12 và 22 (so sánh tỷ lệ "thành công" (ở đây là sở hữu nhà) giữa hai nhóm, với nhóm đầu tiên (M) làm tham chiếu.)
RelRisk(cross_table)
## [1] 0.4622354
riskratio(cross_table) #Tính RR cho vị trí 22 và 12,
## $data
##
## N Y Total
## M 1719 5147 6866
## S 3896 3297 7193
## Total 5615 8444 14059
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## M 1.0000000 NA NA
## S 0.6114466 0.5942071 0.6291862
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## M NA NA NA
## S 0 1.822183e-277 3.663022e-272
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Nhận xét
Kết quả phân tích cho thấy tình trạng hôn nhân có mối liên hệ rõ rệt với khả năng sở hữu nhà ở. Trong nhóm người đã kết hôn (M), có 5147 người sở hữu nhà trên tổng số 6866 người, chiếm khoảng 75%. Trong khi đó, ở nhóm người độc thân (S), chỉ có 3297 người sở hữu nhà trên tổng số 7193 người, tương đương khoảng 46%. Khi so sánh giữa hai nhóm, tỷ số nguy cơ (Relative Risk – RR) cho thấy người độc thân có nguy cơ sở hữu nhà thấp hơn khoảng 39% so với người đã kết hôn, với RR = 0,61 và khoảng tin cậy 95% từ 0,594 đến 0,629. Đồng thời, các kiểm định thống kê đều cho kết quả p-value gần bằng 0, cho thấy sự khác biệt giữa hai nhóm là có ý nghĩa thống kê. Nói cách khác, người đã kết hôn có khả năng sở hữu nhà cao hơn đáng kể so với người độc thân, và mối liên hệ này là đáng tin cậy, không phải do ngẫu nhiên.
Khái niệm
Odds (Tỷ lệ cược) của một sự kiện là tỉ số giữa xác suất sự kiện xảy ra với xác suất sự kiện không xảy ra.
Odd Ratio (Tỷ số chênh) là một thước đo được sử dụng phổ biến trong thống kê, đặc biệt là trong nghiên cứu dịch tễ học, để đánh giá mối liên hệ giữa phơi nhiễm và kết quả.
Cách tính:
\[ OR = \frac{a/b}{c/d} = \frac{a \cdot d}{b \cdot c} \]
Ý nghĩa:
\(OR = 1\): Không có sự khác biệt odds giữa hai nhóm
\(OR > 1\): Odds xảy ra sự kiện ở nhóm A cao hơn
\(OR < 1\): Odds ở nhóm A thấp hơn
Bảng ngẫu nhiên (contingency table), đặc biệt bảng 2x2, thường được sử dụng trong thống kê y sinh, xã hội học và các lĩnh vực nghiên cứu định lượng khác để mô tả mối liên hệ giữa hai biến phân loại.
Một bảng ngẫu nhiên 2x2 có cấu trúc:
# Tạo bảng dưới dạng character matrix với các ký hiệu
table_general <- matrix(c("a", "c", "a + c",
"b", "d", "b + d",
"a + b", "c + d", "n"),
nrow = 3, byrow = TRUE)
# Gán tên hàng và cột
dimnames(table_general) <- list(
Outcome = c("Yes", "No", "Total"),
Exposure = c("Exposed", "Unexposed", "Total")
)
# In bảng
table_general
## Exposure
## Outcome Exposed Unexposed Total
## Yes "a" "c" "a + c"
## No "b" "d" "b + d"
## Total "a + b" "c + d" "n"
Các phân phối xác suất sinh ra bảng ngẫu nhiên
Tùy theo điều kiện và thiết kế của nghiên cứu, bảng ngẫu nhiên có thể được sinh ra từ một trong các mô hình phân phối xác suất sau:
Nếu tổng số mẫu \(n\) là cố định và
mỗi cá thể rơi vào một trong 4 ô của bảng 2x2 với xác suất \(p_{ij}\),
thì số lượng đếm \((a, b, c, d)\) có
thể được mô hình hóa theo phân phối đa thức:
\[ (a, b, c, d) \sim \text{Multinomial}(n; p_{11}, p_{12}, p_{21}, p_{22}) \]
Khi mỗi ô trong bảng là kết quả của một quá trình ngẫu nhiên độc lập,
đặc biệt trong các nghiên cứu quan sát với tần suất hiếm gặp,
thì các ô có thể được mô hình hóa bởi phân phối Poisson:
\[ \begin{aligned} a &\sim \text{Poisson}(\lambda_1) \\ b &\sim \text{Poisson}(\lambda_2) \\ c &\sim \text{Poisson}(\lambda_3) \\ d &\sim \text{Poisson}(\lambda_4) \end{aligned} \]
Phân phối Poisson thường được sử dụng trong các phân tích hồi quy log-linear.
2. So sánh hai tỷ lệ trong bảng ngẫu nhiên 2x
Hai tỷ lệ được xác định như sau:
Tỷ lệ ở nhóm exposed: \[ p_1 = \frac{a}{a + b} \]
Tỷ lệ ở nhóm unexposed: \[ p_2 = \frac{c}{c + d} \]
Hiệu tỷ lệ: \[ \Delta p = p_1 - p_2 = \frac{a}{a + b} - \frac{c}{c + d} \]
Tỷ số nguy cơ là tỷ lệ giữa xác suất xảy ra ở nhóm exposed và nhóm unexposed:
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
Tỷ số chênh là tỷ lệ giữa odds của hai nhóm:
Odds ở nhóm exposed: \[ \frac{a}{b} \]
Odds ở nhóm unexposed: \[ \frac{c}{d} \]
Công thức OR: \[ OR = \frac{a / b}{c / d} = \frac{a \cdot d}{b \cdot c} \]
Ghi chú: OR đặc biệt hữu ích trong các nghiên cứu bệnh-chứng (case-control), nơi RR không thể ước lượng trực tiếp.
3. Khoảng tin cậy cho các tham số đo mối liên hệ
Vì phân phối của OR là lệch, nên thường lấy logarit để chuẩn hóa. Khi đó:
\[ \log(OR) = \log\left(\frac{a \cdot d}{b \cdot c}\right) \]
Phương sai ước lượng của \( \log(OR) \):
\[ \text{Var}[\log(OR)] = \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} \]
Khoảng tin cậy 95% cho \( \log(OR) \):
\[ \log(OR) \pm 1.96 \cdot \sqrt{\text{Var}[\log(OR)]} \]
Suy ra khoảng tin cậy 95% cho OR:
\[ \left[ \exp(\log(OR) - 1.96 \cdot V), \; \exp(\log(OR) + 1.96 \cdot V) \right] \]
Trong đó \( V = \sqrt{\text{Var}[\log(OR)]} \). “)
library(sos)
## Warning: package 'sos' was built under R version 4.4.3
## Loading required package: brew
## Warning: package 'brew' was built under R version 4.4.3
##
## Attaching package: 'sos'
## The following object is masked from 'package:dplyr':
##
## matches
## The following object is masked from 'package:utils':
##
## ?
library(DescTools)
# Tạo bảng chéo giữa Gender và Homeowner
d <- table(b$Gender, b$Homeowner)
# Hiển thị bảng với tổng hàng và cột
addmargins(d)
##
## N Y Sum
## F 2826 4344 7170
## M 2789 4100 6889
## Sum 5615 8444 14059
# Tính tỷ lệ theo từng hàng (giới tính)
prop.table(d, margin = 1)
##
## N Y
## F 0.3941423 0.6058577
## M 0.4048483 0.5951517
# Tính Odds Ratio và khoảng tin cậy 95%
OddsRatio(d,conf.level = .95)
## odds ratio lwr.ci upr.ci
## 0.9563518 0.8939173 1.0231469
oddsratio(d)
## $data
##
## N Y Total
## F 2826 4344 7170
## M 2789 4100 6889
## Total 5615 8444 14059
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## F 1.000000 NA NA
## M 0.956381 0.8938974 1.023169
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## F NA NA NA
## M 0.195158 0.1964833 0.1950884
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Nhận xét
Kết quả phân tích cho thấy odds ratio (OR) là 1.0456, nghĩa là odds (tỷ lệ cược) của nữ sở hữu nhà so với không sở hữu cao hơn khoảng 4.56% so với nam, với nam được đặt làm mức tham chiếu (OR của nam = 1).Nói cách khác, việc là nữ có xu hướng làm tăng nhẹ odds sở hữu nhà. Tuy nhiên, khoảng tin cậy 95% của OR là [0.977, 1.119] bao gồm giá trị 1, và p-value ≈ 0.195 (> 0.05), điều này cho thấy sự tăng này không có ý nghĩa thống kê. Do đó, không có đủ bằng chứng để kết luận rằng việc là nữ làm tăng đáng kể odds sở hữu nhà so với nam, và sự khác biệt nhỏ có thể chỉ là ngẫu nhiên.