library(tidyverse)
library(DT)
library(scales)
library(psych)
library(knitr)
library(kableExtra)
Bộ dữ liệu Supermarket Transactions gồm 14059 quan sát, mỗi số liệu đại diện cho một giao dịch tại siêu thị. Dữ liệu bao gồm 16 cột với thông tin như sau: PurchaseDate (Ngày mua hàng), CustomerID (Mã khách hàng), Gender (Giới tính), MaritalStatus (Tình trạng hôn nhân), Homeowner (Tình trạng sở hữu nhà), Children (Số con), AnnualIncome (Thu nhập hàng năm), City (Thành phố), StateorProvince (Bang hoặc tỉnh), Country (Quốc gia), ProductFamily (Nhóm sản phẩm), ProductDepartment (Bộ phận sản phẩm), ProductCategory (Danh mục sản phẩm), UnitsSold (Số lượng bán ra), và Revenue (Doanh thu).
d<- read.csv("D:/HK2_PTDLDT_TMT/Supermarket Transactions.csv", header=T)
datatable(d,options = list(scrollX = TRUE))
names(d)
## [1] "X" "PurchaseDate" "CustomerID"
## [4] "Gender" "MaritalStatus" "Homeowner"
## [7] "Children" "AnnualIncome" "City"
## [10] "StateorProvince" "Country" "ProductFamily"
## [13] "ProductDepartment" "ProductCategory" "UnitsSold"
## [16] "Revenue"
Bộ dữ liệu với các biến định tính
Ta thực hiện tạo1 dataframe mới chỉ chứa các biến định tính, ta gán data mới này vào object với tên d_cat.
cat<- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
d_cat<-d[, cat]
datatable(d_cat,options = list(scrollX = TRUE))
Để có cái nhìn tổng quan về cấu trúc của bộ dữ liệu, bao gồm số lượng quan sát, số lượng biến, kiểu dữ liệu của từng biến và một số giá trị điển hình, ta sử dụng hàm str() như sau:
str(d) #Cấu trúc trong dữ liệu
## '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 ...
Qua kết quả của hàm str(), ta thấy bộ dữ liệu bao gồm 14059 dòng dữ liệu tương ứng với các quan sát và 16 cột thông tin tương ứng với các biến. Mục đích của phân tích là sử dụng các phương pháp thống kê mô tả và thống kê suy diễn để tìm hiểu đặc điểm khách hàng và hành vi mua sắm của họ. Phân tích sẽ tập trung vào các biến định tính, bao gồm:
Gender: Giới tính (F – Nữ, M – Nam)
MaritalStatus: Tình trạng hôn nhân (S – Độc thân, M – Đã kết hôn)
Homeowner: Sở hữu nhà (Y – Có nhà, N – Không có nhà)
AnnualIncome: Thu nhập hàng năm (dạng phân loại theo khoảng)
City, StateorProvince, Country: Thông tin địa lý nơi cư trú của khách hàng
ProductFamily, ProductDepartment, ProductCategory: Các mức phân loại sản phẩm mà khách hàng đã mua
Nhằm có được cái nhòn tổng quan vvềbooj dữ liệu ta sử dụng hàm head() và taid() để xem một số dòng đầu và dòng cuối của bộ dữ liệu Supermarket Transactions:
head(d) #hiển thị vài dòng đầu
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1 2007-12-18 7223 F S Y 2
## 2 2 2007-12-20 7841 M M Y 5
## 3 3 2007-12-21 8374 F M N 2
## 4 4 2007-12-21 9619 M M Y 3
## 5 5 2007-12-22 1900 F S Y 3
## 6 6 2007-12-22 6696 F M Y 3
## AnnualIncome City StateorProvince Country ProductFamily
## 1 $30K - $50K Los Angeles CA USA Food
## 2 $70K - $90K Los Angeles CA USA Food
## 3 $50K - $70K Bremerton WA USA Food
## 4 $30K - $50K Portland OR USA Food
## 5 $130K - $150K Beverly Hills CA USA Drink
## 6 $10K - $30K Beverly Hills CA USA Food
## ProductDepartment ProductCategory UnitsSold Revenue
## 1 Snack Foods Snack Foods 5 27.38
## 2 Produce Vegetables 5 14.90
## 3 Snack Foods Snack Foods 3 5.52
## 4 Snacks Candy 4 4.44
## 5 Beverages Carbonated Beverages 4 14.00
## 6 Deli Side Dishes 3 4.37
tail(d) #hiển thị vào dòng cuối
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14054 14054 2009-12-29 2032 F M N 3
## 14055 14055 2009-12-29 9102 F M Y 2
## 14056 14056 2009-12-29 4822 F M Y 3
## 14057 14057 2009-12-31 250 M S Y 1
## 14058 14058 2009-12-31 6153 F S N 4
## 14059 14059 2009-12-31 3656 M S N 3
## AnnualIncome City StateorProvince Country ProductFamily
## 14054 $10K - $30K Yakima WA USA Non-Consumable
## 14055 $10K - $30K Bremerton WA USA Food
## 14056 $10K - $30K Walla Walla WA USA Food
## 14057 $30K - $50K Portland OR USA Drink
## 14058 $50K - $70K Spokane WA USA Drink
## 14059 $50K - $70K Portland OR USA Non-Consumable
## ProductDepartment ProductCategory UnitsSold Revenue
## 14054 Household Paper Products 5 14.50
## 14055 Baking Goods Baking Goods 3 9.64
## 14056 Frozen Foods Vegetables 3 7.45
## 14057 Beverages Pure Juice Beverages 4 3.24
## 14058 Dairy Dairy 2 4.00
## 14059 Household Electrical 5 25.53
Nhằm đảm bảo chất lượng dữ liệu và tránh sai lệch trong quá trình phân tích, ta cần kiểm tra xem bộ dữ liệu có chứa giá trị thiếu (NA) hay không. Điều này giúp xác định liệu có cần xử lý hoặc làm sạch dữ liệu trước khi tiếp tục phân tích:
if (any(is.na(d))) {
cat("Có giá trị thiếu trong dữ liệu.\n")
} else {
cat("Không có giá trị thiếu trong dữ liệu.\n")
}
## Không có giá trị thiếu trong dữ liệu.
Với đoạn code trên nếu trong bộ dữ liệu có bất kì ddữlieuej nnàobij thiếu tthìkeets quả sẽ nhận được là có giá trị thiếu trong dữ liệu và ngược lại.
Với bộ dữ liệu được gán cho d nhận được kết quả là Không có giá trị thiếu trong dữ liệu. Điều này cho thấy dữ liệu không có ô trống hay giá trị bị thiếu trong toàn bộ bộ dữ liệu. Đây là điều kiện để tiến hành các phân tích tiếp theo mà không cần thực hiện bước xử lý giá trị thiếu.
Sau khi tìm hiểu sơ bộ về bộ dữ liệu, bước tiếp theo là chuyển các biến định tính sang kiểu dữ liệu factor. Việc này giúp các công cụ phân tích trong R hiểu rõ hơn về bản chất phân loại của các biến này, đồng thời hỗ trợ thực hiện các phân tích thống kê phù hợp.
d[cat] <- lapply(d_cat, factor) #Đưa dữ liệu về dạng factor
factor_check<-sapply(d[cat], is.factor) # Kiểm tra từng cột có phải là factor hay không
# Tạo bảng kết quả
factor_table <- data.frame(
Biến = names(factor_check),
Factor = as.logical(factor_check)
)
# Hiển thị bảng căn giữa
kable(factor_table, caption = "Kiểm tra kiểu Factor cho các biến định tính", align = "c") %>%
kable_styling(position = "center", full_width = FALSE)
| Biến | Factor |
|---|---|
| Gender | TRUE |
| MaritalStatus | TRUE |
| Homeowner | TRUE |
| AnnualIncome | TRUE |
| City | TRUE |
| StateorProvince | TRUE |
| Country | TRUE |
| ProductFamily | TRUE |
| ProductDepartment | TRUE |
| ProductCategory | TRUE |
Trong bảng trên ta nhận thấy các biến định tính đều đưa ra kết quả là TRUE tức là đều đã được chuyển đổi thành công sang kiểu dữ liệu factor.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến Gender được kết quả như sau
Gender_1<-table(d_cat$Gender)
Gender_1
##
## F M
## 7170 6889
Gender_2<-table(d_cat$Gender)/sum(nrow(d_cat))*100 #tần suất
Gender_2
##
## F M
## 50.99936 49.00064
Trực quan hóa dữ liệu
c <- as.data.frame(table(d_cat$Gender))
colnames(c) <- c("Gender", "Count")
ggplot(c, aes(x = Gender, y = Count, fill = Gender)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ biểu thị giới tính khách hàng", x = "Giới tính", y = "Số lượng") +
theme_minimal() +
theme(text = element_text(family = "sans"))
pie(Gender_2,
labels = paste(names(Gender_2), round(Gender_2, 2), "%"),
main = "Tỷ lệ giới tính")
Nhận xét
Biểu đồ thể hiện số lượng khách hàng theo giới tính gồm hai nhóm: F (nữ) và M (nam).
Số lượng khách hàng nữ (F) nhỉnh hơn so với khách hàng nam (M), tuy nhiên sự chênh lệch không lớn cho thấy siêu thị thu hút khách hàng từ cả hai nhóm giới tính.Điều này cho thấy dữ liệu có tính đại diện giới tương đối tốt, tránh được thiên lệch giới tính.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến MaritalStatus được kết quả như sau:
MaritalStatusr_1<-table(d_cat$MaritalStatus)
MaritalStatusr_1
##
## M S
## 6866 7193
MaritalStatus_2<-table(d_cat$MaritalStatus)/sum(nrow(d_cat))*100
MaritalStatus_2
##
## M S
## 48.83704 51.16296
Trực quan hóa dữ liệu
c1 <- as.data.frame(table(d_cat$MaritalStatus))
colnames(c1) <- c("MaritalStatus", "Count")
ggplot(c1, aes(x = MaritalStatus, y = Count, fill = MaritalStatus)) +
geom_bar(stat = "identity") +
labs(title = "Biểu đồ biểu thị tình trạng hôn nhân khách hàng", x = "Tinh trạng hôn nhân", y = "Số lượng") +
theme_minimal()
Nhận xét
Kết quả cho thấy biến MaritalStatus có trạng thái hôn nhân độc thân (S) chiếm tỷ lệ cao hơn một chút với 51.16% tổng thể, tương ứng 7193 người. Trong khi đó, nhóm đã kết hôn (M) chiếm 48.84%, tương ứng 6866 người. Như vậy, dân số trong mẫu được phân bố tương đối đều giữa hai nhóm độc thân và đã kết hôn, với số người độc thân nhỉnh hơn một chút. Điều này giúp cân bằng trong các phân tích liên quan đến trạng thái hôn nhân.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến Homeowner được kết quả như sau:
Homeowner_1<-table(d_cat$Homeowner)
Homeowner_1
##
## N Y
## 5615 8444
Homeowner_2<-table(d_cat$Homeowner)/sum(nrow(d_cat))*100#tần suất
Homeowner_2
##
## N Y
## 39.93883 60.06117
Trực quan hóa dữ liệu
pie(Homeowner_2,
labels = paste(names(Homeowner_2), round(Homeowner_2, 2), "%"),
main = "Tỷ lệ có hoặc không sở hữu nhà")
Nhận xét
Dựa vào kết quả thống kê, trong tổng số quan sát, có 8,444 người là chủ sở hữu nhà (Homeowner = Y) chiếm khoảng 60.06% tổng thể, trong khi 5,615 người không phải là chủ sở hữu nhà chiếm khoảng 39.94%. Điều này cho thấy đa số khách hàng trong dữ liệu là những người sở hữu nhà, điều này có thể ảnh hưởng tích cực đến hành vi tiêu dùng hoặc khả năng chi trả của họ trong các phân tích tiếp theo.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến AnnualIncome được kết quả như sau:
AnnualIncome_1<-table(d_cat$AnnualIncome)
AnnualIncome_1
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
AnnualIncome_2<-table(d_cat$AnnualIncome)/sum(nrow(d_cat))*100#tần suất
AnnualIncome_2
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 21.978804 4.573583 5.405790 1.941817 32.726367
## $50K - $70K $70K - $90K $90K - $110K
## 16.857529 12.155914 4.360196
Trực quan hóa dữ liệu
c4_1 <- d_cat |>
group_by(AnnualIncome) |>
summarise(freq = n()) |>
mutate(per = freq / sum(freq),
label = paste0(freq, " (", round(per * 100, 1), "%)"))
ggplot(c4_1 , aes(x = "", y = per, fill = AnnualIncome)) +
geom_col(width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(per*100, 2), "%")),
position = position_stack(vjust = 0.5),
size = 2.5) +
scale_fill_brewer(palette = "Pastel2") + # Bạn có thể chọn Set1, Set2...
labs(title = "Tỷ lệ thu nhập hằng năm của khách hàng", fill = "Thu nhập") +
theme_void()
Nhận xét
Nhóm thu nhập $30K - $50K chiếm hơn 1/3 tổng số quan sát với 32.73%, là nhóm đông nhất trong dữ liệu. Khi kết hợp với nhóm $10K - $30K, tổng tỷ lệ lên đến khoảng 55%, cho thấy đa số khách hàng thuộc nhóm có thu nhập trung bình hoặc thấp, phản ánh mức thu nhập phổ biến trong mẫu. Ngược lại, nhóm thu nhập cao trên $90K, bao gồm các khoảng $90K - $110K, $110K - $130K, $130K - $150K và $150K+, chỉ chiếm khoảng 16.28% tổng số, thể hiện nhóm thu nhập cao tương đối nhỏ. Kết quả này cho thấy phần lớn các đơn mua hàng được thực hiện bởi khách hàng có mức thu nhập trung bình hoặc thấp.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến City được kết quả như sau:
City_1<-table(d$City)
City_1
##
## 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
City_2<-table(d$City)/sum(nrow(d))*100#tần suất
City_2
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 2.7242336 1.0171420 5.7685468 5.9321431 3.2150224
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 0.5334661 6.0103848 6.5865282 4.6518245 1.3798990
## Orizaba Portland Salem San Andres San Diego
## 3.3003770 6.2308841 9.8584537 4.4170994 6.1597553
## San Francisco Seattle Spokane Tacoma Vancouver
## 0.9246746 6.5580767 6.2237712 8.9408920 4.5024539
## Victoria Walla Walla Yakima
## 1.2518671 1.1380610 2.6744434
Trực quan hóa dữ liệu
c5 <- as.data.frame(City_1)
colnames(c5) <- c("City", "Count")
ggplot(c5, aes(x = City, y = Count, fill = City)) +
geom_col(fill = "lightgreen", color = "black") +
labs(x = "Thành phố", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các thành phố") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Nhận xét
Dựa trên dữ liệu, địa điểm Salem có tần số cao nhất với 1386 với 9.86% tổng thể, tiếp theo là Tacoma và Los Angeles cũng có chỉ số rất lớn, lần lượt nằm trong nhóm cao nhì. Ngược lại, các thành phố như Mexico City, Guadalajara và San Francisco có số lượng khách thấp nhất, cho thấy sự khác biệt rõ rệt về mức độ hoặc chỉ số giữa các khu vực. Nhìn chung, có sự phân bố không đồng đều của các các thành phố.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến StateorProvince được kết quả như sau:
StateorProvince_1<- table(d_cat$StateorProvince)
StateorProvince_1
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
StateorProvince_2<-table(d_cat$StateorProvince)/sum(nrow(d_cat))*100 #tần suất
StateorProvince_2
##
## BC CA DF Guerrero Jalisco OR Veracruz
## 5.7543211 19.4395049 5.7969984 2.7242336 0.5334661 16.0893378 3.3003770
## WA Yucatan Zacatecas
## 32.4845295 4.6518245 9.2254072
Trực quan hóa dữ liệu
c6 <- as.data.frame(StateorProvince_1)
colnames(c6) <- c("StateorProvince", "Count")
ggplot(c6, aes(x = StateorProvince, y = Count, fill = City)) +
geom_col(fill = "skyblue", color = "black") +
labs(x = "Bang", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các bang") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
c6_1 <- d_cat |>
group_by(StateorProvince) |>
summarise(freq = n()) |>
mutate(per = freq / sum(freq),
label = paste0(freq, " (", round(per * 100, 1), "%)"))
ggplot(c6_1 , aes(x = "", y = per, fill = StateorProvince)) +
geom_col(width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(per*100, 2), "%")),
position = position_stack(vjust = 0.5),
size = 2.5) +
scale_fill_brewer(palette = "Pastel1") + # Bạn có thể chọn Set1, Set2...
labs(title = "Tỷ lệ mua hàng ở các ban", fill = "Bang") +
theme_void()
Nhận xét
Dữ liệu này cho thấy sự phân bố địa lý rất rõ ràng, với ba bang WA (Washington), CA (California) và OR (Oregon) thống trị tuyệt đối – lần lượt chiếm 32.48%, 19.44% và 16.09%. Ba bang này, đều nằm ở khu vực Tây Bắc Thái Bình Dương của Hoa Kỳ, cộng lại chiếm tới 68.01% tổng dữ liệu.
Trong khi đó, các bang của Mexico như DF, Guerrero, Jalisco, Veracruz, Yucatan và Zacatecas chỉ chiếm tỷ trọng nhỏ hơn, tổng cộng chỉ chiếm khoảng 26.23% dữ liệu.
Như vậy, dữ liệu cho thấy sự thiên lệch mạnh mẽ về mặt địa lý, chủ yếu tập trung vào ba bang phía Tây Bắc Hoa Kỳ, trong khi các tỉnh của Mexico chỉ góp phần khiêm tốn.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến Country được kết quả như sau:
Country_1<- table(d_cat$Country)
Country_1
##
## Canada Mexico USA
## 809 3688 9562
Country_2<-table(d_cat$Country)/sum(nrow(d_cat))*100
Country_2
##
## Canada Mexico USA
## 5.754321 26.232307 68.013372
Trực quan hóa dữ liệu
c7 <- as.data.frame(Country_1)
colnames(c7) <- c("Country", "Count")
ggplot(c7, aes(x = Country, y = Count, fill = Country)) +
geom_col(fill = "#07575B", color = "black") +
labs(x = "Quốc gia", y = "Tần số", title = "Biểu đồ tần số khách hàng ở các quốc gia") +
theme(axis.text.x = element_text(angle = 0, hjust = 1))
c7_1 <- d_cat |>
group_by(Country) |>
summarise(freq = n()) |>
mutate(per = freq / sum(freq),
label = paste0(freq, " (", round(per * 100, 1), "%)"))
ggplot(c7_1 , aes(x = "", y = per, fill = Country)) +
geom_col(width = 1, color = "white") +
coord_polar("y") +
geom_text(aes(label = paste0(round(per*100, 2), "%")),
position = position_stack(vjust = 0.5),
size = 2.5) +
scale_fill_brewer(palette = "Spectral") + # Bạn có thể chọn Set1, Set2...
labs(title = "Tỷ lệ ở các quốc gia", fill = "Quốc gia") +
theme_void()
Nhận xét
Kết quả tần số cho biến Country cho thấy rằng phần lớn khách hàng (68%) đến từ Mỹ (USA), trong khi Canada và Mexico chiếm tỷ lệ lần lượt là khoảng 5.75% và 26.23%. Điều này cho thấy sự phân bổ không đồng đều của dữ liệu giữa ba quốc gia, với Mỹ là thị trường trọng tâm.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến ProductFamily được kết quả như sau:
ProductFamily_1<- table(d_cat$ProductFamily)
ProductFamily_1
##
## Drink Food Non-Consumable
## 1250 10153 2656
ProductFamily_2<-table(d_cat$ProductFamily)/sum(nrow(d_cat))*100
ProductFamily_2
##
## Drink Food Non-Consumable
## 8.891102 72.217085 18.891813
Trực quan hóa dữ liệu
c8 <- as.data.frame(ProductFamily_1)
colnames(c8) <- c("ProductFamily", "Count")
ggplot(c8, aes(x = ProductFamily, y = Count, fill = ProductFamily)) +
geom_col(fill = "lightpink", color = "black") +
labs(x = "Sản phẩm gia đình", y = "Tần số", title = "Biểu đồ biểu thị nhóm sản phẩm khách hàng mua") +
theme(axis.text.x = element_text(angle = 0, hjust = 1))
Nhận xét
Kết quả tần số cho thấy nhóm thực phẩm (Food) chiếm áp đảo với hơn 72% tổng số mặt hàng, trong khi đồ uống (Drink) chỉ chiếm gần 9% và các mặt hàng phi thực phẩm (Non-Consumable) chiếm khoảng 19%. Sự chênh lệch này phản ánh rõ tầm quan trọng và nhu cầu cao của thực phẩm trong danh sách mua sắm hàng ngày, so với các loại đồ uống và sản phẩm phi thực phẩm khác.
Thống kê tần suất
Ta thực hiện thống kê tần số và tần suất cho biến ProductDepartment được kết quả như sau:
ProductDepartment_1<- table(d_cat$ProductDepartment)
ProductDepartment_1
##
## 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
ProductDepartment_2<-table(d_cat$ProductDepartment)/sum(nrow(d_cat))*100
ProductDepartment_2
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 2.5321858 3.0229746 7.6250089 4.8367594
## Breakfast Foods Canned Foods Canned Products Carousel
## 1.3372217 6.9492852 0.7753041 0.4196600
## Checkout Dairy Deli Eggs
## 0.5832563 6.4229319 4.9719041 1.4083505
## Frozen Foods Health and Hygiene Household Meat
## 9.8300021 6.3518031 10.1002916 0.6330464
## Periodicals Produce Seafood Snack Foods
## 1.4368020 14.1830856 0.7255139 11.3806103
## Snacks Starchy Foods
## 2.5037343 1.9702682
Trực quan hóa dữ liệu
c9 <- as.data.frame(ProductDepartment_1)
colnames(c9) <- c("ProductDepartment", "Count")
ggplot(c9, aes(x = ProductDepartment, y = Count, fill = ProductDepartment)) +
geom_col(fill = "lightpink", color = "black") +
labs(x = "Sản phẩm", y = "Tần số", title = "Bộ phận sản phẩm khách hàng mua") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Nhận xét
Dữ liệu cho thấy sự phân bổ rõ rệt trong thói quen mua sắm: các mặt hàng tươi sống và đồ gia dụng chiếm phần lớn, với Produce (14.18%) và Household (10.1%) cộng lại gần 25% tổng số mặt hàng. Điều này phản ánh sự ưu tiên tiêu dùng các sản phẩm thiết yếu hàng ngày.
Ngược lại, sự thiếu cân đối thể hiện ở các nhóm như Meat và Seafood, khi chỉ chiếm chưa tới 1% tổng số mặt hàng, cho thấy nhu cầu của các mặt hàng này ít hơn đáng kể so với các nhóm khác. Điều này có thể xuất phát từ thói quen ăn uống hoặc đặc điểm nguồn cung cấp của cửa hàng.
Thống tần suất
Ta thực hiện thống kê tần số và tần suất cho biến ProductCategory được kết quả như sau:
ProductCategory_1<- table(d_cat$ProductCategory)
ProductCategory_1
##
## 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
ProductCategory_2<-table(d_cat$ProductCategory)/sum(nrow(d_cat))*100
ProductCategory_2
##
## Baking Goods Bathroom Products Beer and Wine
## 3.4426346 2.5962017 2.5321858
## Bread Breakfast Foods Candles
## 3.0229746 2.9660716 0.3200797
## Candy Canned Anchovies Canned Clams
## 2.5037343 0.3129668 0.3769827
## Canned Oysters Canned Sardines Canned Shrimp
## 0.2489508 0.2845153 0.2702895
## Canned Soup Canned Tuna Carbonated Beverages
## 2.8736041 0.6188207 1.0953837
## Cleaning Supplies Cold Remedies Dairy
## 1.3443346 0.6614980 6.4229319
## Decongestants Drinks Eggs
## 0.6045949 0.9602390 1.4083505
## Electrical Frozen Desserts Frozen Entrees
## 2.5250729 2.2974607 0.8393200
## Fruit Hardware Hot Beverages
## 5.4413543 0.9175617 1.6075112
## Hygiene Jams and Jellies Kitchen Products
## 1.4012376 4.1823743 1.5434953
## Magazines Meat Miscellaneous
## 1.4368020 5.4129028 0.2987410
## Packaged Vegetables Pain Relievers Paper Products
## 0.3414183 1.3656732 2.4539441
## Pizza Plastic Products Pure Juice Beverages
## 1.3798990 1.0029163 1.1736254
## Seafood Side Dishes Snack Foods
## 0.7255139 1.0882709 11.3806103
## Specialty Starchy Foods Vegetables
## 2.0556227 1.9702682 12.2910591
Trực quan hóa dữ liệu
c10 <- as.data.frame(ProductCategory_1)
colnames(c10) <- c("ProductCategory", "Count")
ggplot(c10, aes(x = ProductCategory, y = Count, fill = ProductCategory)) +
geom_col(fill = "lightblue", color = "black") +
labs(x = "Sản phẩm", y = "Tần số", title = "Danh mục sản phẩm khách hàng mua") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Nhận xét
Dữ liệu tần số của các danh mục sản phẩm cho thấy rằng các mặt hàng thiết yếu và phổ biến nhất như rau củ (1.728), đồ ăn vặt (1.600), sữa (903), trái cây (765) và thịt (761) có tần suất cao nhất. Điều này phản ánh nhu cầu sử dụng hằng ngày của các gia đình. Ngược lại, các sản phẩm như cá cơm đóng hộp (44), hàu đóng hộp (35), tôm đóng hộp (38) và nến (45) lại có tần suất thấp nhất, cho thấy đây là những mặt hàng ít phổ biến hoặc chỉ được sử dụng trong những trường hợp nhất định. Tóm lại, sự phân bố tần số này phản ánh rõ ràng xu hướng tiêu dùng và mức độ phổ biến của từng loại sản phẩm.
Xác định hạng mục quan tâm
Hạng mục được quan tâm ở đây là giới tính nữ (Female) trong biến giới tính (Gender).
x1 <- sum(d_cat$Gender == "F") # Số lượng Female
n1<- length(d_cat$Gender) # Tổng số mẫu
Ước lượng Khoảng Tin cậy
Ta ước lượng khoảng tin cậy 95% cho tỷ lệ nữ trong tổng thể bằng:
prop.test(x1, n1, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: x1 out of n1, 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
Kết quả nhận được với mức tin cậy 95%, tỷ lệ của giới tính nữ của tổng thể nằm trong khoảng [50.17%, 51.83%].
Kiểm định giả thuyết
Giả thuyết:
\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ nữ trong tổng thể là bằng 50%} \\\\ H_1: & \text{Tỷ lệ nữ trong tổng thể là khác 50%} \ \end{array} \right. \]
prop.test(x1, n1, p = 0.5, alternative = "two.sided")
##
## 1-sample proportions test with continuity correction
##
## data: x1 out of n1, 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
Với mức ý nghĩa 5% p_value = 2.2e-16 < 0.05, ta bác bỏ giả thuyết không (\(H_0\)).Như vậy, có bằng chứng thống kê cho thấy tỷ lệ khách hàng nữ khác 50% trong tổng thể.
Xác định hạng mục quan tâm
Hạng mục được quan tâm ở đây là việc có sở hữu nhà (Y) trong biến sở hữu nhà (Homeowner).
x2 <- sum(d_cat$Homeowner == "Y")
n2 <- length(d_cat$Homeowner)
Ước lượng Khoảng Tin cậy và kiểm định giả thuyết
Ta ước lượng khoảng tin cậy 95% cho tỷ lệ nữ trong tổng thể bằng:
prop.test(x2, n2, conf.level = 0.95)
##
## 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
Kết quả nhận được với mức tin cậy 95%, tỷ lệ sở hữu nhà của tổng thể nằm trong khoảng [59.25%, 60.87%].
Kiểm định giả thuyết
Giả thuyết:
\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ sở hữu nhà trong tổng thể là bằng 50%} \\\\ H_1: & \text{Tỷ lệ sở hữu nhà trong tổng thể là khác 50%} \ \end{array} \right. \]
prop.test(x2, n2, p = 0.5, alternative = "two.sided", conf.level = 0.95)
##
## 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
Với mức ý nghĩa 5% p_value = 0.8891 > 0.05, ta bác bỏ giả thuyết không (\(H_0\)). Như vậy, có bằng chứng thống kê cho thấy tỷ lệ sở hữu nhà khác 50% trong tổng thể.
Xác định hạng mục quan tâm
Hạng mục được quan tâm ở đây là nhóm thức ăn (Food) trong biến sở hữu nhà (ProductFamily).
x3 <- sum(d_cat$ProductFamily == "Food") # Số lượng Female
n3 <- length(d_cat$ProductFamil) # Tổng số mẫu
Ước lượng Khoảng Tin cậy
Ta ước lượng khoảng tin cậy 95% cho tỷ lệ nữ trong tổng thể bằng:
prop.test(x3, n3, conf.level = 0.95)
##
## 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
Kết quả nhận được với mức tin cậy 95%, tỷ lệ nhóm Food của tổng thể nằm trong khoảng [71.47%, 72.95%]
kiểm định giả thuyết
Giả thuyết:
\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ nhóm Food trong tổng thể là bằng 50%} \\\\ H_1: & \text{Tỷ lệ nhóm Food trong tổng thể là khác 50%} \ \end{array} \right. \]
prop.test(x3, n3, p = 0.5, alternative = "two.sided", conf.level = 0.95)
##
## 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
Với mức ý nghĩa 5% p_value = 2.2e-16 < 0.05, ta bác bỏ giả thuyết không (\(H_0\)). Như vậy, có bằng chứng thống kê cho thấy tỷ lệ nhóm Food khác 50% trong tổng thể.
Bảng tổng hợp kết quả trên
| Biến | Hạng_mục | Tỷ_lệ_quan_sát | CI_95 | H_0 | p_value | Kết_luận |
|---|---|---|---|---|---|---|
| Gender | Female | 0.50999 | [ 0.5017, 0.5183] | p = 0.5 | 0 | Bác bỏ \(H_0\) |
| Homeowner | Y | 0.60060 | [0.5925, 0.6087] | p = 0.5 | 0 | Bác bỏ \(H_0\) |
| ProductFamily | Food | 0.72220 | [0.7147, 0.7295] | p = 0.5 | 0 | Bác bỏ \(H_0\) |
Để hiểu rõ hơn mối quan hệ giữa giới tính (Gender) và nhóm sản phẩm (ProductFamily), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của các nhóm sản phẩm theo từng giới tính, giúp quan sát dễ dàng sự khác biệt và xu hướng tiêu dùng giữa các nhóm.
Bảng tần suất chéo và trực quan hóa
Bảng tần suất chéo
d1 <- table(d_cat$Gender,d_cat$ProductFamily) #tạo bảng chéo đếm số lần xuất hiện của từng kết hợp giữa (Gender) và (ProductFamily).
addmargins(d1) #Thêm tổng hàng và tổng cột vào bảng
##
## Drink Food Non-Consumable Sum
## F 669 5149 1352 7170
## M 581 5004 1304 6889
## Sum 1250 10153 2656 14059
Bảng tần suất chéo theo tỷ lệ hàng
prop.table(d1, margin = 1)
##
## Drink Food Non-Consumable
## F 0.09330544 0.71813110 0.18856346
## M 0.08433735 0.72637538 0.18928727
Trực quan hóa
barplot(d1, beside = TRUE, legend = TRUE, #Vẽ các cột cạnh nhau
col = c("skyblue", "lightgreen"),
main = "Biểu đồ tần suất giữa Gender và ProductFamily",
xlab = "Gender",
ylab = "Tần suất",
names.arg = c("Drink", "Food", "Non-Consumable"))
Nhận xét
Dựa vào kết quả trên ta nhận thấy trong nhóm giới tính nữ có 669 (9.33%) người mua nước, 5149 (71.81%) người mua thức ăn và 1352 (18.86%) hàng hóa không tiêu thụ nhanh; có 581 (8.43%) người mua nước, 5004 (72.64%) người mua thức ăn và 1304 (18.93%) hàng hóa không tiêu thụ nhanh là nam.
Cả nữ (F) và nam (M) đều dành phần lớn ngân sách mua hàng cho nhóm Food, chiếm lần lượt 71.81% và 72.64% tổng số mặt hàng mua của mỗi giới tính. Điều này cho thấy nhóm Food là nhóm sản phẩm chủ lực, rất quan trọng và phổ biến trong thói quen tiêu dùng của cả hai giới.
Nhóm hàng hóa Non-Consumable chiếm khoảng 18.86% ở nữ và 18.93% ở nam. Tỷ lệ rất gần nhau, cho thấy cả hai giới đều quan tâm đến việc mua sắm các sản phẩm lâu bền hoặc sử dụng lâu dài.
Nhóm Drink chỉ chiếm dưới 10% trong tổng số hàng mua của mỗi giới, cụ thể là 9.33% ở nữ và 8.43% ở nam.Nữ mua nhóm này nhiều hơn nam một chút, có thể do sở thích hoặc thói quen tiêu dùng đồ uống khác nhau giữa hai giới.
Qua đó ta nhận thấy mối quan hệ giữa 2 biến Gender và ProductFamily là không mạnh vì sự phân bố tỷ lệ mua hàng khá giống nhau giữa nam và nữ, có thể kết luận rằng giới tính không phải là yếu tố quyết định mạnh mẽ trong việc lựa chọn nhóm sản phẩm.
Kiểm định thống kê (Kiểm định Chi-bình phương)
Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là Gender và ProductFamily hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).
# Kiểm định
chisq_result <- chisq.test(d1)
# In kết quả
chisq_result
##
## Pearson's Chi-squared test
##
## data: d1
## X-squared = 3.5185, df = 2, p-value = 0.1722
Giả thuyết:
\[ \left\{ \begin{array}{ll} H_0: & \text{Biến Gender và biến ProductFamily không có mối quan hệ.} \\\\ H_1: & \text{Biến Gender và biến ProductFamily có mối quan hệ.} \ \end{array} \right. \]
Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.1722 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Vậy giữa biến Gender và biến ProductFamily không tồn tại mối quan hệ.
Nhằm hiểu rõ hơn mối quan hệ giữa tình trạng hôn nhân (MaritalStatus) và việc sở hữu nhà (Homeowner), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của việc sở hữu nhà theo tình trạng hôn nhân, giúp quan sát dễ dàng sự khác biệt.
Bảng tần suất chéo và trực quan hóa
Bảng tần suất chéo
d2 <- table(d_cat$MaritalStatus,d_cat$Homeowner)
addmargins(d2)
##
## N Y Sum
## M 1719 5147 6866
## S 3896 3297 7193
## Sum 5615 8444 14059
Bảng tần suất chéo theo tỷ lệ hàng
prop.table(d2, margin = 1)
##
## N Y
## M 0.2503641 0.7496359
## S 0.5416377 0.4583623
Trực quan hóa
# Chuyển sang data frame
d2_df <- as.data.frame(d2)
colnames(d2_df) <- c("MaritalStatus", "Homeowner", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(d2_df, aes(x = MaritalStatus, y = Frequency, fill = Homeowner)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Biểu đồ tần suất giữa MaritalStatus và Homeowner",
x = "MaritalStatus",
y = "Tần suất"
) +
theme_minimal()
Nhận xét
Dựa vào kết quả trên, ta nhận thấy trong nhóm người đã kết hôn (M) có 1719 người (25.04%) không sở hữu nhà và 5147 người (74.96%) sở hữu nhà. Còn nhóm người độc thân (S) có 3896 người (54.16%) không sở hữu nhà và 3297 người (45.84%) sở hữu nhà.
Qua đó ta nhận thấy mối quan hệ tích cực giữa việc kết hôn và sở hữu nhà. Người đã kết hôn có xu hướng ổn định hơn về mặt chỗ ở, có thể do điều kiện tài chính hoặc ưu tiên đầu tư lâu dài hơn so với người độc thân.
Xu hướng chung là kết hôn thường đi kèm với khả năng sở hữu nhà cao hơn, phản ánh mức độ ổn định và cam kết tài chính lâu dài hơn trong cuộc sống.
Kiểm định thống kê (Kiểm định Chi-bình phương)
Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là MaritalStatus và Homeowner hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).
# Kiểm định
chisq_result <- chisq.test(d2)
# In kết quả
chisq_result
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: d2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
Giả thuyết:
\[ \left\{ \begin{array}{ll} H_0: & \text{Biến MaritalStatus và biến Homeowner không có mối quan hệ.} \\\\ H_1: & \text{ Biến MaritalStatus và biến Homeowner có mối quan hệ.} \ \end{array} \right. \]
Kết quả kiểm định: Với mức ý nghĩa 0.0 với p-value = 2.2e-16 < 0.05, bác bỏ giả thuyết \(H_0\) tức là chấp nhận giả thuyết \(H_1\). Vậy giữa biến MaritalStatus và biến Homeowner có tồn tại mối quan hệ.
Nhằm hiểu rõ hơn mối quan hệ giữa nhóm sản phẩm (ProductFamily) và thu nhập hằng năm (AnnualIncome), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của danh mục sản phẩm theo thu nhập hằng năm, giúp quan sát dễ dàng sự khác biệt.
Bảng tần suất chéo
d3 <- table(d_cat$ProductFamily, d_cat$AnnualIncome)
addmargins(d3)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## Drink 267 59 56 25 421
## Food 2232 468 556 199 3340
## Non-Consumable 591 116 148 49 840
## Sum 3090 643 760 273 4601
##
## $50K - $70K $70K - $90K $90K - $110K Sum
## Drink 193 156 73 1250
## Food 1705 1221 432 10153
## Non-Consumable 472 332 108 2656
## Sum 2370 1709 613 14059
Bảng tần suất chéo theo tỷ lệ hàng
prop.table(d3, margin = 1)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## Drink 0.21360000 0.04720000 0.04480000 0.02000000 0.33680000
## Food 0.21983650 0.04609475 0.05476214 0.01960012 0.32896681
## Non-Consumable 0.22251506 0.04367470 0.05572289 0.01844880 0.31626506
##
## $50K - $70K $70K - $90K $90K - $110K
## Drink 0.15440000 0.12480000 0.05840000
## Food 0.16793066 0.12026002 0.04254900
## Non-Consumable 0.17771084 0.12500000 0.04066265
Trực quan hóa
# Chuyển sang data frame
d3_df <- as.data.frame(d3)
colnames(d3_df) <- c("AnnualIncome", "ProductFamily", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(d3_df, aes(x = AnnualIncome, y = Frequency, fill = ProductFamily)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Biểu đồ tần suất giữa ProductFamily và AnnualIncome",
x = "ProductFamily",
y = "Tần suất"
) +
theme_minimal()
Nhận xét
Dựa vào kết quả trên ta nhận thấy nhóm Food chiếm có tần suất lớn nhất ở tất cả các nhóm thu nhập, chiếm phần lớn trong tổng số cho thấy đây là nhóm sản phẩm phổ biến nhất. Còn lại nhóm Drink và Non-Consumable có tần suất thấp hơn, nhưng phân bố khá đồng đều qua các nhóm thu nhập.
Dựa trên số liệu tỷ lệ phần trăm khá đồng đều qua các nhóm thu nhập, dường như không có sự liên kết mạnh mẽ giữa nhóm thu nhập và loại sản phẩm được lựa chọn.Các nhóm sản phẩm được mua tương đối đồng đều trên các nhóm thu nhập khác nhau.
Xu hướng nhóm Food luôn chiếm phần lớn trong mọi nhóm thu nhập, cho thấy đây là nhóm được ưu tiên mua nhiều nhất bất kể mức thu nhập.
Kiểm định thống kê (Kiểm định Chi-bình phương)
Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là ProductFamily và AnnualIncome hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).
# Kiểm định
chisq_result <- chisq.test(d3)
# In kết quả
chisq_result
##
## Pearson's Chi-squared test
##
## data: d3
## X-squared = 14.84, df = 14, p-value = 0.3892
Giả thuyết:
\[ \left\{ \begin{array}{ll} H_0: & \text{Biến ProductFamily và biến AnnualIncome không có mối quan hệ.} \\\\ H_1: & \text{Biến ProductFamily và biến AnnualIncome có mối quan hệ. } \ \end{array} \right. \]
Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.3892 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Vậy giữa biến ProductFamily và biến AnnualIncome không tồn tại mối quan hệ.
Để hiểu rõ hơn mối quan hệ giữa các bang (StateorProvince) và nhóm sản phẩm (ProductFamily), chúng ta sẽ xây dựng bảng tần suất chéo thể hiện số lượng từng kết hợp giữa hai biến này. Sau đó, biểu đồ cột sẽ được sử dụng để trực quan hóa sự phân bố của nhóm sản phẩm theo các bang, giúp quan sát dễ dàng sự khác biệt.
Bảng tần suất chéo
d4 <- table(d_cat$StateorProvince,d_cat$ProductFamily)
addmargins(d4)
##
## Drink Food Non-Consumable Sum
## BC 69 580 160 809
## CA 258 1974 501 2733
## DF 65 598 152 815
## Guerrero 41 272 70 383
## Jalisco 5 57 13 75
## OR 199 1629 434 2262
## Veracruz 44 322 98 464
## WA 399 3287 881 4567
## Yucatan 48 494 112 654
## Zacatecas 122 940 235 1297
## Sum 1250 10153 2656 14059
Bảng tần suất chéo theo tỷ lệ hàng
prop.table(d4, margin = 1)
##
## Drink Food Non-Consumable
## BC 0.08529048 0.71693449 0.19777503
## CA 0.09440176 0.72228321 0.18331504
## DF 0.07975460 0.73374233 0.18650307
## Guerrero 0.10704961 0.71018277 0.18276762
## Jalisco 0.06666667 0.76000000 0.17333333
## OR 0.08797524 0.72015915 0.19186561
## Veracruz 0.09482759 0.69396552 0.21120690
## WA 0.08736589 0.71972849 0.19290563
## Yucatan 0.07339450 0.75535168 0.17125382
## Zacatecas 0.09406322 0.72474942 0.18118736
Trực quan hóa
# Chuyển sang data frame
d4_df <- as.data.frame(d4)
colnames(d4_df) <- c("StateorProvince", "ProductFamily", "Frequency")
# Vẽ biểu đồ từ bảng tần suất
ggplot(d4_df, aes(x = StateorProvince, y = Frequency, fill = ProductFamily)) +
geom_bar(stat = "identity", position = "dodge") +
labs(
title = "Biểu đồ tần suất giữa StateorProvince và ProductFamily",
x = "StateorProvince",
y = "Tần suất"
) +
theme_minimal()
Nhận xét
Dựa vào kết quả trên ta nhận thấy Food luôn là nhóm sản phẩm được mua nhiều nhất luốn chiếm hơn 70%, tiếp theo là nhóm sản phẩm Non-Consumable dao động từ 17%-20% và cuối cùng là nhóm Drink chiếm 6-10%.
Đặc biệt là đối với bang WA (Washington) có tần suất cao đối với 3 nhóm sản phẩm này và Jalisco thì ngược lại có tần suất thấp nhất trong các bang.
Mối quan hệ giữa bang và nhóm sản phẩm được mua cho thấy sự phân bố tỷ lệ khá ổn định, với nhóm Food chiếm ưu thế ở tất cả các bang. Mặc dù có một số biến động nhẹ ở tỷ lệ mua nhóm Drink và Non-Consumable giữa các khu vực, nhưng xu hướng chung cho thấy khu vực ảnh hưởng nhẹ đến lựa chọn nhóm sản phẩm của khách hàng.
Xu hướng chính là sự ưu tiên chọn mua nhóm Food ở mọi khu vực, chiếm phần lớn tỷ lệ tiêu dùng.
Kiểm định thống kê (Kiểm định Chi-bình phương)
Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là StateorProvince và ProductFamily không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).
# Kiểm định
chisq_result <- chisq.test(d4)
# In kết quả
chisq_result
##
## Pearson's Chi-squared test
##
## data: d4
## X-squared = 12.3, df = 18, p-value = 0.8314
Giả thuyết:
\[ \left\{ \begin{array}{ll} H_0: & \text{Biến ProductFamily và biến StateorProvince không có mối quan hệ.} \\\\ H_1: & \text{Biến ProductFamily và biến StateorProvince có mối quan hệ. } \ \end{array} \right. \]
Kết quả kiểm định: Với mức ý nghĩa 0.05, vì p-value = 0.8314 > 0.05, không đủ bằng chứng để bác bỏ giả thuyết \(H_0\). Vậy giữa Biến ProductFamily và biến StateorProvince không có mối quan hệ.
Phát hiện về mối quan hệ giữa 2 biến Gender và ProductFamily
Kết quả phân tích cho thấy nam và nữ đều chủ yếu mua sản phẩm thuộc nhóm Food (trên 70%), tiếp đến là Non-Consumable (khoảng 18-19%), và cuối cùng là Drink (dưới 10%). Tỷ lệ mua Drink của nữ cao hơn nam một chút. Nhìn vào kết quả này, có vẻ như nam và nữ có xu hướng mua sắm khá giống nhau, không có sự khác biệt rõ rệt về sở thích sản phẩm. Tuy nhiên, kiểm định Chi-bình phương cho thấy p-value = 0.1722 (> 0.05), không đủ bằng chứng để kết luận rằng có mối quan hệ có ý nghĩa thống kê giữa giới tính và nhóm sản phẩm.
Suy ra: Mặc dù có sự khác biệt nhỏ trong tỷ lệ, kết luận cuối cùng là không có mối liên hệ thống kê đáng kể giữa hai biến này.
Phát hiện về mối quan hệ giữa 2 biến MaritalStatus và Homeowner
Kết quả cho thấy người đã kết hôn có tỷ lệ sở hữu nhà lên đến 75%, trong khi người độc thân chỉ khoảng 46%. Con số này phản ánh một xu hướng rõ rệt: người đã kết hôn có xu hướng ổn định tài chính hơn, dễ sở hữu nhà hơn so với người độc thân. Kiểm định Chi-bình phương cho mối quan hệ này cho kết quả p-value < 2.2e-16, nhỏ hơn rất nhiều so với mức ý nghĩa 0.05.
Suy ra: có thể khẳng định mối quan hệ giữa tình trạng hôn nhân và việc sở hữu nhà có ý nghĩa thống kê.
Phát hiện về mối quan hệ giữa 2 biến ProductFamily và AnnualIncome
Phân tích phân bố nhóm sản phẩm theo các mức thu nhập cho thấy nhóm Food luôn chiếm tỷ lệ cao nhất (hơn 70%) ở mọi mức thu nhập, còn nhóm Drink và Non-Consumable có phân bố khá tương đồng và không có chênh lệch đáng kể. Dựa vào kết quả này, có thể suy ra rằng mức thu nhập không phải là yếu tố quyết định rõ ràng cho việc mua loại sản phẩm nào.
Phát hiện về mối quan hệ giữa 2 biến StateorProvince và ProductFamily
Nhóm sản phẩm Food luôn chiếm tỷ lệ cao nhất ở tất cả các bang, dao động trên 70%. Tiếp theo là nhóm Non-Consumable, dao động khoảng 17-20%, và nhóm Drink chiếm tỷ lệ thấp nhất, khoảng 6-10%. Đáng chú ý, bang Washington (WA) có tần suất mua cao nhất ở cả ba nhóm sản phẩm, trong khi bang Jalisco có tần suất thấp nhất. Mặc dù có sự khác biệt nhỏ giữa các bang, xu hướng chung cho thấy tỷ lệ ưu tiên chọn mua nhóm Food luôn vượt trội, còn tỷ lệ của các nhóm còn lại khá ổn định giữa các khu vực. Tuy nhiên, kiểm định Chi-bình phương cho kết quả p-value = 0.8314 (> 0.05).
Suy ra: dù có sự biến động nhỏ trong tỷ lệ mua sắm giữa các bang, nhưng không có mối quan hệ thống kê đáng kể giữa hai biến này.
Tóm lại: qua phân tích thì chỉ có MaritalStatus và Homeowner cho thấy mối quan hệ, các cặp biến còn lại thì không tồn tttạimooisquan hệ giữa các biến.
Đầu tiên, phân tích chỉ giới hạn ở biến định tính: Phân tích hiện tại chủ yếu tập trung vào các biến định tính như Gender, MaritalStatus, Homeowner, AnnualIncome và v.v. Các biến định lượng quan trọng như Revenue, UnitsSold hoặc số lượng Children chưa được phân tích sâu, dẫn đến các phát hiện mới chỉ mô tả đặc điểm phân loại của khách hàng mà chưa phản ánh được giá trị kinh tế hay mức độ tiêu dùng thực tế.
Ngoài ra, hiện nay phân tích chỉ dừng lại ở mức quan hệ đơn giản giữa hai biến không thể hiện được sự khách quan bởi vì không phải chỉ có 2 biến tác đọng lẫn nhau mà còn phụ thuộc vào nhiều biến khác nhau.
Để khắc phục các hạn chế trên, nghiên cứu trong tương lai nên mở rộng phân tích sang các biến định lượng quan trọng như Doanh thu (Revenue), số lượng sản phẩm bán ra (UnitsSold) và số lượng con cái (Children) nhằm cung cấp cái nhìn toàn diện và sâu sắc hơn về giá trị kinh tế và hành vi tiêu dùng thực tế của khách hàng.
Bên cạnh đó, nên áp dụng các phương pháp phân tích đa biến (multivariate analysis) để đồng thời xem xét ảnh hưởng tương tác giữa nhiều yếu tố, thay vì chỉ phân tích quan hệ giữa hai biến. Điều này giúp phát hiện các mối quan hệ phức tạp và sự tác động qua lại giữa các đặc điểm khách hàng như giới tính, thu nhập, quốc gia và các yếu tố khác đến hành vi mua sắm, từ đó nâng cao độ chính xác và tính khách quan của kết quả nghiên cứu.
Ngoài ra, cần mở rộng quy mô mẫu nghiên cứu để đảm bảo tính đại diện và giảm thiểu sai lệch do các nhóm con có kích thước nhỏ, qua đó cải thiện khả năng khái quát hóa kết quả ra toàn bộ tập khách hàng mục tiêu.
Mở rộng phạm vi phân tích bằng cách kết hợp cả các biến định lượng như doanh thu, số lượng sản phẩm bán ra và số lượng con cái để đánh giá sâu hơn về giá trị kinh tế cũng như mức độ tiêu dùng thực tế của khách hàng.
Ngoài ra, nghiên cứu cũng có thể mở rộng xem xét các yếu tố môi trường bên ngoài như xu hướng thị trường, ảnh hưởng văn hóa hay các chiến dịch marketing để đánh giá toàn diện hơn về hành vi mua sắm.
library(tidyverse)
library(DT)
library(scales)
library(psych)
library(knitr)
library(kableExtra)
library(DescTools)
library(epitools)
library(AER)
d<- read.csv("D:/HK2_PTDLDT_TMT/Supermarket Transactions.csv", header=T)
cat<- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
d_cat<-d[, cat]
datatable(d_cat,options = list(scrollX = TRUE))
1.1 Bảng tần số chéo
Bảng tần suất chéo
d2 <- table(d_cat$MaritalStatus,d_cat$Homeowner)
addmargins(d2)
##
## N Y Sum
## M 1719 5147 6866
## S 3896 3297 7193
## Sum 5615 8444 14059
Bảng tần suất chéo theo tỷ lệ hàng
prop.table(d2, margin = 1)
##
## N Y
## M 0.2503641 0.7496359
## S 0.5416377 0.4583623
Nhận xét
Dựa vào kết quả trên, ta nhận thấy trong nhóm người đã kết hôn (M) có 1719 người (25.04%) không sở hữu nhà và 5147 người (74.96%) sở hữu nhà. Còn nhóm người độc thân (S) có 3896 người (54.16%) không sở hữu nhà và 3297 người (45.84%) sở hữu nhà.
Qua đó ta nhận thấy mối quan hệ tích cực giữa việc kết hôn và sở hữu nhà. Người đã kết hôn có xu hướng ổn định hơn về mặt chỗ ở, có thể do điều kiện tài chính hoặc ưu tiên đầu tư lâu dài hơn so với người độc thân.
Xu hướng chung là kết hôn thường đi kèm với khả năng sở hữu nhà cao hơn, phản ánh mức độ ổn định và cam kết tài chính lâu dài hơn trong cuộc sống.
1.2 Kiểm định thống kê (Kiểm định Chi-bình phương)
Để đánh giá xem có mối liên hệ có ý nghĩa thống kê giữa hai biến phân loại là MaritalStatus và Homeowner hay không, sẽ sử dụng kiểm định Chi-bình phương (Chi-square test).
# Kiểm định
chisq_result <- chisq.test(d2)
# In kết quả
chisq_result
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: d2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
Giả thuyết:
\[ \left\{ \begin{array}{ll} H_0: & \text{Biến MaritalStatus và biến Homeowner không có mối quan hệ.} \\\\ H_1: & \text{ Biến MaritalStatus và biến Homeowner có mối quan hệ.} \ \end{array} \right. \]
Kết quả kiểm định: Với mức ý nghĩa 0.0 với p-value = 2.2e-16 < 0.05, bác bỏ giả thuyết \(H_0\) tức là chấp nhận giả thuyết \(H_1\). Vậy giữa biến MaritalStatus và biến Homeowner có tồn tại mối quan hệ.
1.3 Relative Risk
e1 <- table(d_cat$Homeowner, d_cat$MaritalStatus)
addmargins(e1)
##
## M S Sum
## N 1719 3896 5615
## Y 5147 3297 8444
## Sum 6866 7193 14059
RelRisk(e1)
## [1] 0.5022503
table(d$Homeowner,d$MaritalStatus)
##
## M S
## N 1719 3896
## Y 5147 3297
m <- matrix(c(1719,5147,3896,3297),nrow = 2)
RelRisk(m, conf.level = .95)
## rel. risk lwr.ci upr.ci
## 0.5022503 0.4810315 0.5241410
riskratio(e1, rev = 'b') #đưa chữ y lên trên
## $data
##
## S M Total
## Y 3297 5147 8444
## N 3896 1719 5615
## Total 7193 6866 14059
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Y 1.0000000 NA NA
## N 0.5022503 0.4811506 0.5242752
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Y NA NA NA
## N 0 1.822183e-277 3.663022e-272
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Tỷ số rủi ro (Relative Risk) được ước tính là 0.5023, với khoảng tin cậy 95% từ 0.4810 đến 0.5241. Điều này cho thấy những người không sở hữu nhà có khả năng đã kết hôn thấp hơn khoảng 50% so với những người có sở hữu nhà. Khoảng tin cậy 95% cho biết rằng, với độ tin cậy 95%, giá trị thực của tỷ số rủi ro nằm trong khoảng từ 0.4810 đến 0.5241. Vì khoảng này không chứa giá trị 1, sự khác biệt giữa hai nhóm được xem là có ý nghĩa thống kê.
2.1 Cấu trúc xác suất của bảng ngẫu nhiên
Phân phối Poisson
Phân phối Poisson là một xác suất rời rạc lý thuyết và cũng được gọi là hàm khối lượng xác suất phân phối Poisson. Nó được sử dụng để tìm xác suất của một sự kiện độc lập xảy ra trong một khoảng thời gian cố định và có tỷ lệ trung bình không đổi.
Ký hiệu: X∼Poisson(λ)
Hàm xác suất:Xác suất để có đúng \(k\) sự kiện xảy ra trong một khoảng thời gian (hoặc không gian) nhất định được cho bởi:
\[ P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!} \]
Trong đó:
Đặc điểm quan trọng của phân phối Poisson
Kỳ vọng (Mean):
\[ \mathbb{E}(X) = \lambda \]
Phương sai (Variance):
\[ \mathrm{Var}(X) = \lambda \]
Khi \(\lambda\) nhỏ (ví dụ: λ < 5), phân phối bị lệch phải, tập trung nhiều ở phía trái.
Khi \(\lambda\) tăng lên (đặc biệt \(\lambda \geq 20\)), phân phối Poisson có thể được xấp xỉ tốt bằng phân phối Chuẩn:
\[ X \sim \mathcal{N}(\lambda, \lambda) \] Phân phối Muultinomial
Phân phối Multinomial là một mở rộng của phân phối nhị thức (Bernoulli) cho nhiều hơn hai kết quả. Phân phối này mô tả xác suất của các kết quả đếm được trong \(n\) lần thử, trong đó mỗi lần thử có thể rơi vào một trong \(k\) loại (categories) với xác suất tương ứng.
Phân phối được ký hiệu là:
\[ \mathbf{Y} \sim \text{Multinomial}(n, \mathbf{p}) \]
Trong đó:
\(\mathbf{Y} = (Y_1, Y_2, \dots, Y_k)\) là vector số đếm cho từng loại.
\(n\) là tổng số lần thử (hay tổng số đếm): \(n = \sum_{i=1}^{k} Y_i\).
\(\mathbf{p} = (p_1, p_2, \dots, p_k)\) là vector xác suất, với \(p_i \ge 0\) và \(\sum_{i=1}^{k} p_i = 1\).
Hàm xác suất được xác định như sau:
\[ P(Y_1 = y_1, \dots, Y_k = y_k) = \frac{n!}{y_1! \cdots y_k!} \cdot p_1^{y_1} \cdots p_k^{y_k} \]
2.2 So sánh 2 tỷ lệ trong bảng ngẫu nhiên 2x2
Risk Difference - RD
Risk Difference là mức chênh lệch tuyệt đối giữa xác suất xảy ra sự kiện ở hai nhóm.
Cách tính:
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
Ý nghĩa:
RD phản ánh sự khác biệt tuyệt đối giữa nguy cơ xảy ra sự kiện ở hai nhóm.
Nếu:
\(RD > 0\): Nhóm A có nguy cơ cao hơn nhóm B
\(RD < 0\): Nhóm A có nguy cơ thấp hơn nhóm B
Relative Risk - RR
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
Odds Ratio - OR
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
2.3 Khoảng tin cậy cho các tham số đo mối liên hệ
Khi ước lượng Odds Ratio (OR) do OR không phân bố chuẩn ta thường biến đổi logarit để làm việc trên thang log(OR), sau đó tính khoảng tin cậy (CI) và lấy mũ để chuyển về thang OR.
Sai số chuẩn (Standard Error - SE)
Công thức:
\[ SE(\log(\hat{\theta})) = \sqrt{ \frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}} } \]
Trong đó:
| Sự kiện (+) | Không sự kiện (−) | |
|---|---|---|
| Nhóm 1 | \(n_{11}\) | \(n_{12}\) |
| Nhóm 2 | \(n_{21}\) | \(n_{22}\) |
Khoảng tin cậy 95% cho log(OR)
\[ \log(\hat{\theta}) \pm z_{1 - \alpha/2} \cdot SE(\log(\hat{\theta})) \]
Với \(z_{1 - \alpha/2} = 1.96\) cho mức tin cậy 95%.
Khoảng tin cậy 95% cho OR
Chuyển về thang OR:
\[ CI_{OR} = \left[ \exp \left( \log(\hat{\theta}) - 1.96 \cdot SE \right),\ \exp \left( \log(\hat{\theta}) + 1.96 \cdot SE \right) \right] \]
Nhận xét
Nếu khoảng tin cậy không chứa 1, OR có ý nghĩa thống kê.
Nếu khoảng CI chứa 1 là không đủ bằng chứng thống kê để kết luận khác biệt.
2.4 Ví dụ
Trong ví dụ này, chúng ta sử dụng bộ dữ liệu CreditCard thuộc gói AER để phân tích mối liên hệ giữa tình trạng sở hữu nhà (owner) và quyết định cấp thẻ tín dụng (card). Dữ liệu này bao gồm thông tin về việc một cá nhân có được chấp nhận cấp thẻ tín dụng hay không, cùng với các đặc điểm cá nhân như có sở hữu nhà, thu nhập, trình độ học vấn, Chúng ta sẽ tập trung vào hai biến phân loại owner và card, từ đó xây dựng bảng 2×2 và tính tỷ số chênh Odds Ratio (OR) để đánh giá xem sở hữu nhà có ảnh hưởng đến khả năng được cấp thẻ hay không.
# Tải dữ liệu
data("CreditCard")
h1<- CreditCard
# Thay đổi giá trị của biến `card`và owner
library(dplyr)
h1$card <- dplyr::recode(h1$card, "yes" = "chapnhan", "no" = "tuchoi")
h1$owner <- dplyr::recode(h1$owner, "yes" = "conha", "no" = "khongconha")
h2 <- table(h1$card,h1$owner) #tạo bảng chéo đếm số lần xuất hiện của từng kết hợp giữa (Gender) và (ProductFamily).
addmargins(h2)#Thêm tổng hàng và tổng cột vào bảng
##
## khongconha conha Sum
## tuchoi 206 90 296
## chapnhan 532 491 1023
## Sum 738 581 1319
prop.table(h2, margin = 1)
##
## khongconha conha
## tuchoi 0.6959459 0.3040541
## chapnhan 0.5200391 0.4799609
library(epitools)
OddsRatio(h2)
## [1] 2.11249
oddsratio(h2)
## $data
##
## khongconha conha Total
## tuchoi 206 90 296
## chapnhan 532 491 1023
## Total 738 581 1319
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## tuchoi 1.00000 NA NA
## chapnhan 2.10957 1.60448 2.791356
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## tuchoi NA NA NA
## chapnhan 5.738991e-08 6.417142e-08 7.928759e-08
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Dựa vào kết quả trên ta thấy những người có nhà có tỷ lệ được chấp nhận thẻ tín dụng cao hơn 2.11 lần so với những người không có nhà. Khoảng tin cậy 95% là (1.60; 2.79), không chứa giá trị 1 cho thấy sự khác biệt là có ý nghĩa thống kê. Giá trị p rất nhỏ (< 0.005), cho thấy chúng ta bác bỏ giả thuyết không rằng khả năng được cấp thẻ là như nhau giữa người có nhà và không có nhà.
d5 <- table(d_cat$Gender,d_cat$Homeowner) #tạo bảng chéo đếm số lần xuất hiện của từng kết hợp giữa (Gender) và (ProductFamily).
addmargins(d5) #Thêm tổng hàng và tổng cột vào bảng
##
## N Y Sum
## F 2826 4344 7170
## M 2789 4100 6889
## Sum 5615 8444 14059
prop.table(d5, margin = 1)
##
## N Y
## F 0.3941423 0.6058577
## M 0.4048483 0.5951517
OddsRatio(d5,conf.level = .95)
## odds ratio lwr.ci upr.ci
## 0.9563518 0.8939173 1.0231469
oddsratio(d5)
## $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
Nam giới có odds ratio là 0.9564, với khoảng tin cậy 95% từ 0.8939 đến 1.0232. Điều này có nghĩa là nam giới có odds sở hữu nhà thấp hơn một chút so với nữ giới, tức là tỷ lệ sở hữu nhà ở nam có xu hướng thấp hơn so với nữ, nhưng sự khác biệt là rất nhỏ.
Tuy nhiên, khoảng tin cậy 95% có chứa giá trị 1, cho thấy rằng khác biệt này không có ý nghĩa thống kê. Ngoài ra, các giá trị p tương ứng (midp.exact = 0.1952, fisher.exact = 0.1965, chi.square = 0.1951) đều lớn hơn 0.05, cho thấy không có bằng chứng thống kê đủ mạnh để bác bỏ giả thuyết không.
Việc là Nữ (so với Nam) không làm tăng hay giảm đáng kể odds sở hữu nhà. Mặc dù nữ giới có odds sở hữu nhà cao hơn một chút, nhưng khác biệt này không có ý nghĩa thống kê, nên chúng ta không thể kết luận có mối liên hệ rõ ràng giữa giới tính và khả năng sở hữu nhà trong dữ liệu này.
Khi nhìn vào bảng chéo và chỉ số Relative Risk (RR), chúng ta có thể có cái nhìn đầu tiên về mối liên hệ giữa hai nhóm biến phân loại. RR cho biết khả năng một nhóm có xu hướng xảy ra sự kiện nhiều hay ít hơn nhóm còn lại, nên thường được dùng để so sánh mức độ “nguy cơ” giữa hai nhóm.
Tuy nhiên, việc sử dụng bảng chéo và RR cũng có những mặt hạn chế. Trước hết, bảng chéo chỉ cho thấy số liệu đếm và tỷ lệ đơn giản — nó không cung cấp thông tin về độ chắc chắn của kết quả hay xem xét đến ảnh hưởng của các yếu tố khác. RR thì chỉ thực sự phù hợp nếu dữ liệu được thu thập từ nghiên cứu dọc, tức là theo dõi các nhóm theo thời gian. Trong trường hợp dữ liệu được lấy theo cách ngẫu nhiên hay điều tra cắt ngang, RR đôi khi có thể gây hiểu nhầm.
Ngoài ra, nếu sự kiện đang xét là hiếm, RR và Odds Ratio (OR) sẽ khá giống nhau. Nhưng nếu không hiếm, sự khác biệt giữa hai chỉ số này có thể lớn, dẫn đến kết luận không chính xác nếu không chú ý. Đặc biệt, cả hai cách làm này chưa kiểm soát được những yếu tố khác có thể ảnh hưởng đến mối liên hệ giữa hai biến chính, nên nếu muốn phân tích sâu và chính xác hơn, chúng ta cần dùng đến các phương pháp hồi quy như hồi quy logistic.
Khi tạo bảng ngẫu nhiên (ví dụ: bảng 2x2), thực chất là chúng ta đang mô tả phân bố xác suất của hai biến phân loại. Mỗi ô trong bảng thể hiện xác suất chung (joint probability) của hai biến cùng xảy ra. Chẳng hạn, trong bảng 2x2 với biến A (có/không) và biến B (nam/nữ), thì ô ở hàng “có” và cột “nam” cho biết xác suất (hoặc tần suất quan sát được) của những người vừa có đặc điểm A, vừa là nam.
Mục tiêu:
Hiểu rằng những con số trong bảng không chỉ là đếm đơn thuần, mà có thể xem như kết quả của một quá trình ngẫu nhiên có quy luật xác suất. Dựa vào đó, chúng ta có thể:
Tính các xác suất biên (xác suất xảy ra của từng biến riêng lẻ),
Tính xác suất có điều kiện (xác suất xảy ra của một biến khi biết biến còn lại),
Và từ đó phát triển các chỉ số như Tỷ số rủi ro (Relative Risk) hay Tỷ số chênh (Odds Ratio).
Chọn một cặp MaritalStatus và Homeowner biến nhị phân khác từ bộ dữ liệu Supermarket Transactions
r1 <- table(d_cat$MaritalStatus,d_cat$Homeowner)
r1
##
## N Y
## M 1719 5147
## S 3896 3297
prop_table <- prop.table(r1, margin = 1)
prop_table
##
## N Y
## M 0.2503641 0.7496359
## S 0.5416377 0.4583623
Nhận xét: Dựa vào kết quả trên, ta nhận thấy trong nhóm người đã kết hôn (M) có 1719 người (25.04%) không sở hữu nhà và 5147 người (74.96%) sở hữu nhà. Còn nhóm người độc thân (S) có 3896 người (54.16%) không sở hữu nhà và 3297 người (45.84%) sở hữu nhà.
RD<- prop_table[1, "Y"] - prop_table[2, "N"]
RD
## [1] 0.2079982
Tỷ lệ những người đã kết hôn (M) sở hữu nhà là cao hơn so với tỷ lệ người độc thân (S) không sở hữu nhà, với chênh lệch khoảng 20.8%.
RR <- riskratio(r1)
RR
## $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 Relative Risk (RR) cho thấy tỷ lệ người độc thân sở hữu nhà khoảng 61.1% so với người đã kết hôn avf sở hữu nahf, với khoảng tin cậy 95% từ 59.4% đến 62.9%. Khoảng tin cậy không chứa giá trị 1, cho thấy sự khác biệt này có ý nghĩa thống kê rất rõ ràng. Giá trị p rất nhỏ (gần bằng 0) khẳng định mối liên hệ giữa tình trạng hôn nhân và khả năng sở hữu nhà không phải do ngẫu nhiên. Điều này cho thấy 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 trong dữ liệu khảo sát.
or <- oddsratio(r1)
or
## $data
##
## N Y Total
## M 1719 5147 6866
## S 3896 3297 7193
## Total 5615 8444 14059
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## M 1.000000 NA NA
## S 0.282673 0.2630995 0.3036164
##
## $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] "median-unbiased estimate & mid-p exact CI"
Nhận xét: Kết quả phân tích Odds Ratio (OR) cho thấy nhóm người độc thân có tỷ số chênh lệch odds sở hữu nhà chỉ bằng khoảng 0.28 lần so với nhóm người đã kết hôn, với khoảng tin cậy 95% từ 0.26 đến 0.30. Khoảng tin cậy này không bao gồm giá trị 1, chứng tỏ sự khác biệt là có ý nghĩa thống kê rất mạnh. Giá trị p gần bằng 0 cũng cho thấy mối liên hệ này không phải do ngẫu nhiên. Điều này đồng nghĩa với việc người đã kết hôn có odds sở hữu nhà cao hơn đáng kể so với người độc thân, phản ánh rõ sự khác biệt về khả năng sở hữu nhà giữa hai nhóm.