Bộ dữ liệu “Supermarket Transactions” phản ánh các giao dịch mua hàng của khách hàng tại một siêu thị trong một khoảng thời gian cụ thể. Mỗi dòng dữ liệu tương ứng với một giao dịch, bao gồm thông tin nhân khẩu học (giới tính, loại thành viên, chi nhánh), đặc điểm sản phẩm (loại sản phẩm, kênh thanh toán), và các yếu tố hành vi tiêu dùng (thời gian mua sắm, mức độ hài lòng, giá trị đơn hàng,…). Tập dữ liệu gồm 14.059 quan sát và 16 biến, cung cấp nền tảng chi tiết để phân tích hành vi khách hàng và hiệu quả kinh doanh của siêu thị.
# Đọc file
library("csv")
## Warning: package 'csv' was built under R version 4.4.3
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
# Hiển thị cấu trúc dữ liệu
str(data)
## '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 ...
# Hiển thị vài dòng đầu và cuối
head(data)
## 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(data)
## 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
# Chuyển các biến định tính phù hợp sang factor
factor <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory")
# Kiểm tra biến nào tồn tại trong data
factor <- intersect(factor, names(data))
# Chuyển sang factor
data[factor] <- lapply(data[factor], as.factor)
# Kiểm tra lại cấu trúc
str(data)
## '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 : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
## $ MaritalStatus : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
## $ Homeowner : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
## $ Children : int 2 5 2 3 3 3 2 2 3 1 ...
## $ AnnualIncome : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
## $ City : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
## $ StateorProvince : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
## $ Country : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ ProductFamily : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
## $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
## $ ProductCategory : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...
## $ 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 ghi lại thông tin về các giao dịch mua hàng của khách hàng, bao gồm thông tin nhân khẩu học, thông tin sản phẩm, số lượng bán ra và doanh thu. Dữ liệu bao gồm 14059 quan sát và 16 biến. Dưới đây là mô tả chi tiết các biến có trong bộ dữ liệu:
Tên Biến | Ý Nghĩa |
---|---|
PurchaseDate | Ngày giao dịch mua hàng diễn ra (định dạng ngày/tháng/năm). |
CustomerID | Mã định danh duy nhất cho mỗi khách hàng. |
Gender | Giới tính của khách hàng: M (Nam), F (Nữ). |
MaritalStatus | Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn). |
Homeowner | Tình trạng sở hữu nhà: Y (Có), N (Không). |
Children | Số lượng con cái của khách hàng. |
AnnualIncome | Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K). |
City | Thành phố nơi khách hàng thực hiện giao dịch. |
StateorProvince | Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon). |
Country | Quốc gia. |
ProductFamily | Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng). |
ProductDepartment | Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v. |
ProductCategory | Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine. |
UnitsSold | Số lượng đơn vị sản phẩm đã bán trong giao dịch đó. |
Revenue | Doanh thu từ giao dịch (tính theo USD). |
Trước khi tiến hành thống kê mô tả các biến trong bộ dữ liệu, ta tiến hành phân loại dữ liệu thành 2 nhóm bao gồm: dữ liệu định tính và dữ liệu định lượng như sau:
Phân loại biến theo kiểu dữ liệu:
Dữ liệu Định tính:
Tên Biến | Ý Nghĩa |
---|---|
Gender | Giới tính của khách hàng: M (Nam), F (Nữ). |
MaritalStatus | Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn). |
Homeowner | Tình trạng sở hữu nhà: Y (Có), N (Không). |
AnnualIncome | Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K). |
City | Thành phố nơi khách hàng thực hiện giao dịch. |
StateorProvince | Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon). |
Country | Quốc gia. |
ProductFamily | Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng). |
ProductDepartment | Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v. |
ProductCategory | Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine. |
Dữ liệu Định lượng:
Tên Biến | Ý Nghĩa |
---|---|
Children | Số lượng con cái của khách hàng. |
UnitsSold | Số lượng đơn vị sản phẩm đã bán trong giao dịch đó. |
Revenue | Doanh thu từ giao dịch (tính theo USD). |
Trước khi tiến hành phân tích dữ liệu, chúng ta cần kiểm tra và xử lý các giá trị bị thiếu nhằm đảm bảo độ chính xác và tính toàn vẹn của kết quả phân tích.
sum(is.na(data))
## [1] 0
which(is.na(data))
## integer(0)
Cả hai lệnh đều trả về kết quả cho thấy không tồn tại giá trị thiếu:
sum(is.na(data)) trả về 0, nghĩa là không có giá trị NA nào.
which(is.na(data)) trả về integer(0), nghĩa là không có vị trí nào chứa NA.
Điều này cho phép chúng ta tiếp tục các bước xử lý dữ liệu và phân tích mà không cần thực hiện bước xử lý giá trị thiếu.
dataDT <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory")
dataDT <- data[,dataDT]
str(dataDT)
## 'data.frame': 14059 obs. of 10 variables:
## $ Gender : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
## $ MaritalStatus : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
## $ Homeowner : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
## $ AnnualIncome : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
## $ City : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
## $ StateorProvince : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
## $ Country : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ ProductFamily : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
## $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
## $ ProductCategory : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...
#Bảng tần số
table(dataDT$Gender)
##
## F M
## 7170 6889
#Bảng tần suất
table(dataDT$Gender)/sum(table(dataDT$Gender))
##
## F M
## 0.5099936 0.4900064
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 objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Tạo bảng tần số
freq1 <- table(dataDT$Gender)
# Chuyển thành data frame
Gender <- as.data.frame(freq1)
colnames(Gender) <- c("Gender", "Count")
# Vẽ biểu đồ cột
ggplot(Gender, aes(x = Gender, y = Count, fill = Gender)) +
geom_col(color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black") +
scale_fill_manual(values = c("M" = "#6495ED", "F" = "#F08080")) +
labs(
title = "Gender")+
theme_minimal()+
theme(plot.title = element_text(hjust = 0.5))
# Vẽ biểu đồ tròn
pie(freq1,
labels = paste0(names(freq1), " (", round(100 * freq1 / sum(freq1), 1), "%)"),
col = c("#F08080", "#6495ED"), # màu tùy chọn
main = "Gender")
Nhận xét:
#Bảng tần số
table(dataDT$MaritalStatus)
##
## M S
## 6866 7193
#Bảng tần suất
table(dataDT$MaritalStatus)/sum(table(dataDT$MaritalStatus))
##
## M S
## 0.4883704 0.5116296
# Tạo bảng tần số
freq2 <- table(dataDT$MaritalStatus)
# Chuyển thành data frame
MaritalStatus <- as.data.frame(freq2)
colnames(MaritalStatus) <- c("MaritalStatus", "Count")
# Vẽ biểu đồ cột
ggplot(MaritalStatus, aes(x = MaritalStatus, y = Count, fill = MaritalStatus)) +
geom_col(color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black") +
scale_fill_manual(values = c("S" = "#FC8D62", "M" = "#66C2A5")) +
labs(
title = "MaritalStatus"
) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
# Vẽ biểu đồ tròn
pie(freq2,
labels = paste0(names(freq2), " (", round(100 * freq2 / sum(freq2), 1), "%)"),
col = c("#66C2A5", "#FC8D62"), # màu tùy chọn
main = "MaritalStatus")
Nhận xét:
Dựa vào bảng tần số và tần suất, ta thấy trong tập dữ liệu có 7193 khách hàng thuộc nhóm độc thân (Single) và 6866 khách hàng thuộc nhóm đã kết hôn (Married). Tỷ lệ tương ứng là 51.16% độc thân và 48.84% đã kết hôn.
Biểu đồ cột minh họa rõ ràng rằng số lượng khách hàng độc thân
nhỉnh hơn một chút so với nhóm đã kết hôn. Biểu đồ tròn cũng cho thấy sự
phân bố khá cân bằng giữa hai nhóm tình trạng hôn nhân.
Điều này cho thấy dữ liệu có tính đại diện tốt cho cả hai nhóm, tránh
được tình trạng thiên lệch mẫu trong nghiên cứu.
#Bảng tần số
table(dataDT$Homeowner)
##
## N Y
## 5615 8444
#Bảng tần suất
table(dataDT$Homeowner)/sum(table(dataDT$Homeowner))
##
## N Y
## 0.3993883 0.6006117
# Tạo bảng tần số
freq3 <- table(dataDT$Homeowner)
# Chuyển thành data frame
homeowner <- as.data.frame(freq3)
colnames(homeowner) <- c("Homeowner", "Count")
# Vẽ biểu đồ cột
ggplot(homeowner, aes(x = Homeowner, y = Count, fill = Homeowner)) +
geom_col(color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black") +
scale_fill_manual(values = c("N" = "#FDB462", "Y" = "#80B1D3")) +
labs(
title = "Homeowner") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
# Vẽ biểu đồ tròn
pie(freq3,
labels = paste0(names(freq3), " (", round(100 * freq3 / sum(freq3), 1), "%)"),
col = c("#FDB462", "#80B1D3"), # màu tùy chọn
main = "Homeowner")
Nhận xét:
#Bảng tần số
table(dataDT$AnnualIncome)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
#Bảng tần suất
table(dataDT$AnnualIncome)/sum(table(dataDT$AnnualIncome))
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 0.21978804 0.04573583 0.05405790 0.01941817 0.32726367
## $50K - $70K $70K - $90K $90K - $110K
## 0.16857529 0.12155914 0.04360196
# Tạo bảng tần số
freq4 <- table(dataDT$AnnualIncome)
# Chuyển thành data frame
AnnualIncome <- as.data.frame(freq4)
colnames(AnnualIncome) <- c("AnnualIncome", "Count")
# Vẽ biểu đồ cột
ggplot(AnnualIncome, aes(x = AnnualIncome, y = Count)) +
geom_col(fill = "#F08080", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black")
Nhận xét:
Dựa vào bảng tần số, nhóm thu nhập phổ biến nhất là từ 30K – 50K USD/năm, với 4601 người, chiếm khoảng 32.73% theo bảng tần suất. Theo sau là nhóm 10K – 30K USD/năm với 3090 người (~21.98%).
Ngược lại, các nhóm thu nhập cao như $150K+ hoặc $110K – $130K chiếm tỷ trọng rất nhỏ trong bộ dữ liệu (chỉ khoảng NA% và 4.57%), cho thấy nhóm khách hàng chính nằm trong phân khúc thu nhập trung bình.
Biểu đồ cột giúp hình dung rõ sự phân bố thu nhập, cho thấy phân khúc dưới 90K chiếm phần lớn, đặc biệt là 2 nhóm 30K – 50K và 10K – 30K.
#Bảng tần số
table(dataDT$City)
##
## 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
#Bảng tần suất
table(dataDT$City)/sum(table(data$City))
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 0.027242336 0.010171420 0.057685468 0.059321431 0.032150224
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 0.005334661 0.060103848 0.065865282 0.046518245 0.013798990
## Orizaba Portland Salem San Andres San Diego
## 0.033003770 0.062308841 0.098584537 0.044170994 0.061597553
## San Francisco Seattle Spokane Tacoma Vancouver
## 0.009246746 0.065580767 0.062237712 0.089408920 0.045024539
## Victoria Walla Walla Yakima
## 0.012518671 0.011380610 0.026744434
library(ggplot2)
library(patchwork)
## Warning: package 'patchwork' was built under R version 4.4.3
# Bảng tần suất -> data frame
freq5 <- as.data.frame(table(dataDT$City))
colnames(freq5) <- c("City", "Count")
# Sắp xếp giảm dần
freq5 <- freq5[order(-freq5$Count), ]
# Chia đôi danh sách thành phố
n <- nrow(freq5)
mid <- ceiling(n / 2)
# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top <- head(freq5, mid)
plot1 <- ggplot(top, aes(x = City, y = Count)) +
geom_col(fill = "#DB7093", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom <- tail(freq5, n - mid)
plot2 <- ggplot(bottom, aes(x = City, y = Count)) +
geom_col(fill = "#F08080", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
# Ghép hai biểu đồ
plot1 + plot2
Nhận xét:
Dựa vào bảng tần số, thành phố xuất hiện phổ biến nhất là Salem với 1386 người, chiếm khoảng 9.86% theo bảng tần suất.Theo sau là Tacoma và Portland với lần lượt 1257 người (~8.94%) và 876 người (~6.23%).
Ngược lại, các thành phố như Guadalajara hoặc Victoria có số lượng rất ít, chỉ lần lượt 75 và 176 người, chiếm chưa đến 0.53% và 1.25% trong toàn bộ dữ liệu.
Biểu đồ cột giúp trực quan hóa sự phân bố thành phố, cho thấy một số thành phố như Salem, Tacoma và Portland chiếm tỷ lệ vượt trội, trong khi phần lớn các thành phố còn lại có tần suất thấp. Điều này cho thấy dữ liệu tập trung vào một số khu vực địa lý nhất định thay vì phân bố đồng đều.
#Bảng tần số
table(dataDT$StateorProvince)
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
#Bảng tần suất
table(dataDT$StateorProvince)/sum(table(dataDT$StateorProvince))
##
## BC CA DF Guerrero Jalisco OR
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378
## Veracruz WA Yucatan Zacatecas
## 0.033003770 0.324845295 0.046518245 0.092254072
# Tạo bảng tần số
freq6 <- table(dataDT$StateorProvince)
# Chuyển thành data frame
StateorProvince <- as.data.frame(freq6)
colnames(StateorProvince) <- c("StateorProvince", "Count")
# Vẽ biểu đồ cột
ggplot(StateorProvince, aes(x = StateorProvince, y = Count)) +
geom_col(fill = "#F08080", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black")
Nhận xét:
#Bảng tần số
table(dataDT$Country)
##
## Canada Mexico USA
## 809 3688 9562
#Bảng tần suất
table(dataDT$Country)/sum(table(dataDT$Country))
##
## Canada Mexico USA
## 0.05754321 0.26232307 0.68013372
# Tạo bảng tần số
freq7 <- table(dataDT$Country)
# Chuyển thành data frame
Country <- as.data.frame(freq7)
colnames(Country) <- c("Country", "Count")
# Vẽ biểu đồ cột
ggplot(Country, aes(x = Country, y = Count)) +
geom_col(fill = "#FDB462", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black")
# Vẽ biểu đồ tròn
pie(freq7,
labels = paste0(names(freq7), " (", round(100 * freq7 / sum(freq7), 1), "%)"),
col = c("#89CFF0", "#F4A460", "#F08080"), # màu tùy chọn
main = "Country")
Nhận xét:
#Bảng tần số
table(dataDT$ProductFamily)
##
## Drink Food Non-Consumable
## 1250 10153 2656
#Bảng tần suất
table(dataDT$ProductFamily)/sum(table(dataDT$ProductFamily))
##
## Drink Food Non-Consumable
## 0.08891102 0.72217085 0.18891813
# Tạo bảng tần số
freq8 <- table(dataDT$ProductFamily)
# Chuyển thành data frame
ProductFamily <- as.data.frame(freq8)
colnames(ProductFamily) <- c("ProductFamily", "Count")
# Vẽ biểu đồ cột
ggplot(ProductFamily, aes(x = ProductFamily, y = Count)) +
geom_col(fill = "#6495ED", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black")
# Vẽ biểu đồ tròn
pie(freq8,
labels = paste0(names(freq8), " (", round(100 * freq8 / sum(freq8), 1), "%)"),
col = c("#89CFF0", "#F4A460", "#F08080"), # màu tùy chọn
main = "ProductFamily")
Nhận xét:
#Bảng tần số
table(dataDT$ProductDepartment)
##
## 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
#Bảng tần suất
table(dataDT$ProductDepartment)/sum(table(dataDT$ProductDepartment))
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 0.025321858 0.030229746 0.076250089 0.048367594
## Breakfast Foods Canned Foods Canned Products Carousel
## 0.013372217 0.069492852 0.007753041 0.004196600
## Checkout Dairy Deli Eggs
## 0.005832563 0.064229319 0.049719041 0.014083505
## Frozen Foods Health and Hygiene Household Meat
## 0.098300021 0.063518031 0.101002916 0.006330464
## Periodicals Produce Seafood Snack Foods
## 0.014368020 0.141830856 0.007255139 0.113806103
## Snacks Starchy Foods
## 0.025037343 0.019702682
# Bảng tần suất -> data frame
freq9 <- as.data.frame(table(dataDT$ProductDepartment))
colnames(freq9) <- c("ProductDepartment", "Count")
# Sắp xếp giảm dần
freq9 <- freq9[order(-freq9$Count), ]
# Chia đôi danh sách thành phố
n1 <- nrow(freq9)
mid1 <- ceiling(n1 / 2)
# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top1 <- head(freq9, mid1)
plot11 <- ggplot(top1, aes(x = ProductDepartment, y = Count)) +
geom_col(fill = "#DB7093", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom1 <- tail(freq9, n1 - mid1)
plot22 <- ggplot(bottom1, aes(x = ProductDepartment, y = Count)) +
geom_col(fill = "#6495ED", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
# Ghép hai biểu đồ
plot11 + plot22
Nhận xét:
Dựa vào bảng tần số, nhóm sản phẩm phổ biến nhất là Produce với 1994 sản phẩm, chiếm khoảng 14.18% tổng số quan sát. Theo sau là các nhóm Snack Foods (1600, ~11.38%), Household (1420), và Frozen Foods (1382).
Ngược lại, các nhóm ít xuất hiện nhất trong dữ liệu gồm Carousel (59 sản phẩm), Checkout (82), và Eggs (198).
Biểu đồ cột bên trái thể hiện rõ sự áp đảo của nhóm Produce, vượt trội hẳn về số lượng so với các nhóm còn lại. Biểu đồ cột bên phải bổ sung thêm các nhóm có tần số thấp hơn, cho thấy mức độ phân tán rộng giữa các nhóm sản phẩm.
Tổng thể, dữ liệu nghiêng mạnh về các mặt hàng thực phẩm tươi sống và ăn nhẹ, trong khi các nhóm như sản phẩm đặc biệt (Carousel, Checkout) chiếm tỷ trọng rất nhỏ. Điều này phản ánh cơ cấu hàng hóa tập trung vào các mặt hàng tiêu dùng phổ biến.
#Bảng tần số
table(dataDT$ProductCategory)
##
## 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
#Bảng tần suất
table(dataDT$ProductCategory)/sum(table(dataDT$ProductCategory))
##
## Baking Goods Bathroom Products Beer and Wine
## 0.034426346 0.025962017 0.025321858
## Bread Breakfast Foods Candles
## 0.030229746 0.029660716 0.003200797
## Candy Canned Anchovies Canned Clams
## 0.025037343 0.003129668 0.003769827
## Canned Oysters Canned Sardines Canned Shrimp
## 0.002489508 0.002845153 0.002702895
## Canned Soup Canned Tuna Carbonated Beverages
## 0.028736041 0.006188207 0.010953837
## Cleaning Supplies Cold Remedies Dairy
## 0.013443346 0.006614980 0.064229319
## Decongestants Drinks Eggs
## 0.006045949 0.009602390 0.014083505
## Electrical Frozen Desserts Frozen Entrees
## 0.025250729 0.022974607 0.008393200
## Fruit Hardware Hot Beverages
## 0.054413543 0.009175617 0.016075112
## Hygiene Jams and Jellies Kitchen Products
## 0.014012376 0.041823743 0.015434953
## Magazines Meat Miscellaneous
## 0.014368020 0.054129028 0.002987410
## Packaged Vegetables Pain Relievers Paper Products
## 0.003414183 0.013656732 0.024539441
## Pizza Plastic Products Pure Juice Beverages
## 0.013798990 0.010029163 0.011736254
## Seafood Side Dishes Snack Foods
## 0.007255139 0.010882709 0.113806103
## Specialty Starchy Foods Vegetables
## 0.020556227 0.019702682 0.122910591
# Bảng tần suất -> data frame
freq10 <- as.data.frame(table(dataDT$ProductCategory))
colnames(freq10) <- c("ProductCategory", "Count")
# Sắp xếp giảm dần
freq10 <- freq10[order(-freq10$Count), ]
# Chia đôi danh sách thành phố
n2 <- nrow(freq10)
mid2 <- ceiling(n2 / 2)
# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top2 <- head(freq10, mid2)
plot12 <- ggplot(top2, aes(x = ProductCategory, y = Count)) +
geom_col(fill = "#F4A460", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))
# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom2 <- tail(freq10, n2 - mid2)
plot21 <- ggplot(bottom2, aes(x = ProductCategory, y = Count)) +
geom_col(fill = "#89CFF0", color = "black") +
geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))
# Ghép hai biểu đồ
plot12 + plot21
Nhận xét:
Tổng quan, dữ liệu tập trung chủ yếu vào các mặt hàng rau củ, đồ ăn nhẹ và thực phẩm tươi sống, phản ánh xu hướng tiêu dùng chính. Những nhóm còn lại tuy nhiều về chủng loại nhưng chiếm tỷ trọng không lớn trong tập dữ liệu.
Thực hiện kiểm định để xác định xem tỷ lệ nữ trong tập dữ liệu có khác biệt so với 50% hay không.
Dữ liệu và biến quan tâm
Gender
"F"
(Female)# Số lượng nữ trong dữ liệu
sumF <- sum(dataDT$Gender == "F")
# Tổng số cá thể trong dữ liệu
sumGender <- length(dataDT$Gender)
Giả thuyết kiểm định:
# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumF, n = sumGender, p = 0.5, conf.level = 0.95, correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: sumF out of sumGender, 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 luận:
Với mức ý nghĩa 5%, vì p-value = 0.0182 < 0.05, ta bác bỏ giả thuyết H0.Kết luận rằng tỷ lệ nữ trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê.
Thực hiện kiểm định để xác định xem tỷ lệ khách hàng đã kết hôn (Married) trong tập dữ liệu có khác biệt so với 50% hay không.
Dữ liệu và biến quan tâm
MaritalStatus
"M"
(Married)# Số lượng khách hàng đã kết hôn trong dữ liệu
sumM <- sum(dataDT$MaritalStatus == "M")
# Tổng số khách hàng trong dữ liệu
sumMarital <- length(dataDT$MaritalStatus)
Giả thuyết kiểm định:
# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumM, n = sumMarital, p = 0.5, conf.level = 0.95, correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: sumM out of sumMarital, null probability 0.5
## X-squared = 7.5593, df = 1, p-value = 0.00597
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.4800765 0.4966708
## sample estimates:
## p
## 0.4883704
Kết luận:
Với mức ý nghĩa 5% (α = 0.05), vì p-value = 0.00597 < 0.05, ta bác bỏ giả thuyết H0. Điều này cho thấy rằng tỷ lệ khách hàng đã kết hôn trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê. Cụ thể, tỷ lệ kết hôn trong mẫu là khoảng 48.84%, thấp hơn 50%.
Thực hiện kiểm định để xác định xem tỷ lệ khách hàng có nhà (Homeowner = “Y”) có khác biệt so với 50% hay không.
Dữ liệu và biến quan tâm
Homeowner
"Y"
(Có nhà)# Số lượng khách hàng có nhà
sumY <- sum(dataDT$Homeowner == "Y")
# Tổng số khách hàng
sumHomeowner <- length(dataDT$Homeowner)
Giả thuyết kiểm định:
# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumY, n = sumHomeowner, p = 0.5, conf.level = 0.95, correct = TRUE)
##
## 1-sample proportions test with continuity correction
##
## data: sumY out of sumHomeowner, 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
Giá trị thống kê Chi-squared là 568.86, với 1 bậc tự do.
Giá trị p-value < 2.2e-16, rất nhỏ hơn nhiều so với mức ý nghĩa thông thường 0.05.
Khoảng tin cậy 95% cho tỷ lệ khách hàng có nhà là (0.5925, 0.6087).
Ước lượng tỷ lệ khách hàng có nhà trong mẫu là 0.6006 (tức khoảng 60.06%).
Kết luận
Với mức ý nghĩa 5% (α = 0.05), vì p-value < 2.2e-16 < 0.05, ta bác bỏ giả thuyết H0.Điều này cho thấy rằng tỷ lệ khách hàng sở hữu nhà trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê.Cụ thể, tỷ lệ sở hữu nhà trong mẫu là khoảng 60.06%, cao hơn 50%.
marital_homeowner <- table(dataDT$MaritalStatus, dataDT$Homeowner)
marital_homeowner
##
## N Y
## M 1719 5147
## S 3896 3297
Nhận xét
Khách hàng đã kết hôn (M): Có tới 5147 người sở hữu nhà ở, chiếm phần lớn trong nhóm này, trong khi chỉ có 1719 người không sở hữu nhà.
Khách hàng độc thân (S): Ngược lại, nhóm này có xu hướng không sở hữu nhà ở cao hơn với 3896 người, trong khi số người sở hữu nhà chỉ là 3297 người.
So sánh giữa hai nhóm:
Nhóm đã kết hôn có tỷ lệ sở hữu nhà ở cao hơn đáng kể so với nhóm độc thân.
Nhóm độc thân có số lượng không sở hữu nhà ở vượt trội, cho thấy xu hướng chưa ổn định về tài chính hoặc cuộc sống gia đình.
prop.table(marital_homeowner)
##
## N Y
## M 0.1222704 0.3661000
## S 0.2771179 0.2345117
Nhận xét
Nhóm khách hàng đã kết hôn sở hữu nhà chiếm tỷ trọng lớn nhất trong toàn bộ dữ liệu (36.61%), cho thấy đây là nhóm có xu hướng ổn định về tài chính và chỗ ở.
Khách hàng độc thân không sở hữu nhà cũng chiếm tỷ trọng khá lớn (27.71%), phản ánh phần nào sự chưa ổn định về tài sản hoặc giai đoạn đầu trong chu kỳ sống cá nhân.
Nhìn chung, dữ liệu cho thấy mối liên hệ đáng chú ý giữa tình trạng hôn nhân và quyền sở hữu nhà ở, trong đó việc đã kết hôn thường đi kèm với tỷ lệ sở hữu nhà cao hơn.
library(ggplot2)
library(dplyr)
# Chuyển đổi dữ liệu sang dạng data frame
df_marital_homeowner <- as.data.frame(marital_homeowner)
colnames(df_marital_homeowner) <- c("MaritalStatus", "Homeowner", "Count")
# Vẽ biểu đồ cột nhóm
ggplot(df_marital_homeowner, aes(x = Homeowner, y = Count, fill = MaritalStatus)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Số lượng khách hàng theo Homeowner và Marital Status",
x = "Tình trạng sở hữu nhà", y = "Số lượng") +
theme_minimal()+
theme(plot.title = element_text(hjust = 0.5))
Nhận xét
Khác biệt giữa hai nhóm hôn nhân: Khách hàng đã
kết hôn (M
) có số lượng sở hữu nhà (Y
) vượt
trội (hơn 5000 người), trong khi khách hàng độc thân (S
)
lại chủ yếu thuộc nhóm không sở hữu nhà (N
), với khoảng
3900 người.
Xu hướng ổn định tài chính khi kết hôn: Nhóm đã kết hôn có tỷ lệ sở hữu nhà cao, phản ánh sự ổn định về tài chính hoặc nhu cầu ổn định nơi ở cho gia đình. Ngược lại, nhóm độc thân có tỷ lệ không sở hữu nhà cao hơn, có thể do ưu tiên linh hoạt, chưa ổn định cuộc sống.
Sự chênh lệch trong nhóm không sở hữu nhà: Trong
nhóm không sở hữu nhà (N
), số lượng khách hàng độc thân gần
gấp đôi so với khách hàng đã kết hôn.
Mối liên hệ tiềm năng: Biểu đồ cho thấy tình trạng hôn nhân có thể liên quan đến việc sở hữu nhà – người đã kết hôn có xu hướng sở hữu nhà nhiều hơn.
Biểu đồ gợi ý rằng tình trạng hôn nhân có thể ảnh hưởng đến quyền sở hữu nhà. Tuy nhiên, để xác định mối liên hệ này có ý nghĩa thống kê hay không, cần thực hiện thêm kiểm định Chi-bình phương.
Giả thuyết kiểm định::
H0: Hai biến MaritalStatus và Homeowner độc lập
H1: Hai biến MaritalStatus và Homeowner có mối liên hệ
Thực hiện kiểm định Chi- bình phương
chisq_result1 <- chisq.test(marital_homeowner)
chisq_result1
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: marital_homeowner
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
Giá trị thống kê Chi-bình phương: X-squared = 1241.2
Bậc tự do: df = 1
Giá trị p: p-value < 2.2e-16
Vì giá trị p rất nhỏ (p < 0.05), ta bác bỏ giả thuyết không H0. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và tình trạng sở hữu nhà.
Kết quả kiểm định củng cố cho nhận định trước đó từ biểu đồ: khách hàng đã kết hôn có xu hướng sở hữu nhà nhiều hơn so với khách hàng độc thân. Mối quan hệ này có thể phản ánh các yếu tố kinh tế – xã hội như:
Những người đã kết hôn thường có nhu cầu ổn định nơi ở và khả năng tài chính cao hơn (do thu nhập hộ gia đình gộp lại).
Người độc thân có thể ưu tiên tính linh hoạt, hoặc đang trong giai đoạn chưa ổn định sự nghiệp hay thu nhập.
gender_family <- table(dataDT$Gender, dataDT$ProductFamily)
gender_family
##
## Drink Food Non-Consumable
## F 669 5149 1352
## M 581 5004 1304
Nhận xét
Cả nam và nữ đều có xu hướng tiêu dùng tương tự nhau, trong đó nhóm sản phẩm Food là được lựa chọn nhiều nhất.
Khách hàng nữ (F) mua 5149 sản phẩm thuộc nhóm Food, cao nhất trong ba nhóm, tiếp theo là Non-Consumable (1352) và thấp nhất là Drink (669).
Khách hàng nam (M) cũng có xu hướng tương tự với 5004 lượt mua Food, tiếp đến là Non-Consumable (1304) và Drink (581).
Nhìn chung, nhóm Food chiếm tỷ lệ lớn nhất ở cả hai giới, cho thấy đây là nhóm sản phẩm phổ biến nhất. Trong khi đó, nhóm Drink có số lượt mua thấp nhất, phản ánh mức độ quan tâm hoặc nhu cầu tiêu dùng thấp hơn đối với loại sản phẩm này. Sự khác biệt nhỏ giữa hai giới cho thấy hành vi lựa chọn sản phẩm theo giới tính có thể tồn tại một số khác biệt nhẹ, cần được kiểm chứng bằng phân tích thống kê tiếp theo.
prop.table(gender_family)
##
## Drink Food Non-Consumable
## F 0.04758518 0.36624226 0.09616616
## M 0.04132584 0.35592859 0.09275197
Nhận xét
Kết quả trong bảng tần suất chéo cho thấy:
Trong tổng số khách hàng mua hàng, khoảng 4.76% là khách hàng nữ (F) mua sản phẩm nhóm Drink, và khoảng 4.13% là khách hàng nam (M) mua nhóm này.
Nhóm sản phẩm Food là nhóm được mua nhiều nhất, chiếm khoảng 36.62% tổng số giao dịch từ nữ và 35.59% từ nam.
Nhóm Non-Consumable chiếm khoảng 9.62% tổng số giao dịch từ nữ và 9.28% từ nam.
Như vậy, nhóm sản phẩm Food chiếm tỷ lệ lớn nhất trong tổng thể số lượt mua của cả hai giới, phản ánh sự phổ biến và nhu cầu cao đối với nhóm sản phẩm này. Mức độ mua hàng của nam và nữ ở các nhóm sản phẩm có sự tương đồng khá lớn, cho thấy hành vi tiêu dùng giữa hai giới trong các nhóm sản phẩm này tương đối đồng đều. Tuy nhiên, nhóm Drink có tỷ lệ thấp nhất trong tổng thể lượt mua, cho thấy nhóm sản phẩm này ít được lựa chọn hơn.
# Chuyển đổi dữ liệu sang dạng data frame
df_gender_family <- as.data.frame(gender_family)
colnames(df_gender_family) <- c("Gender", "ProductFamily", "Count")
# Vẽ biểu đồ cột nhóm
ggplot(df_gender_family, aes(x = ProductFamily, y = Count, fill = Gender)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Số lượt mua theo ProductFamily và Gender",
x = "Product Family", y = "Số lượt mua") +
theme_minimal()
Nhận xét
Xu hướng tiêu dùng tương đồng: Biểu đồ cho thấy cả nam và nữ đều có xu hướng tiêu dùng tương tự nhau. Ở mỗi nhóm sản phẩm, chiều cao cột của hai giới gần bằng nhau, cho thấy mức độ mua sắm giữa hai giới không chênh lệch đáng kể.
Nhóm sản phẩm Food được ưa chuộng nhất: Đây là nhóm sản phẩm có số lượt mua cao vượt trội so với hai nhóm còn lại ở cả nam và nữ. Điều này phản ánh nhu cầu tiêu dùng thực phẩm là chủ yếu trong tổng thể các giao dịch.
Drink là nhóm ít được mua nhất: Số lượt mua nhóm Drink thấp nhất ở cả hai giới, điều này có thể cho thấy mức độ ưu tiên thấp hơn của khách hàng đối với đồ uống trong danh sách tiêu dùng.
Sự khác biệt giới tính nhỏ: Trong từng nhóm sản phẩm, nữ có số lượt mua nhỉnh hơn nam một chút, nhưng không đáng kể. Điều này gợi ý rằng giới tính không phải là yếu tố chi phối mạnh hành vi tiêu dùng theo nhóm sản phẩm, mặc dù có thể có những xu hướng nhỏ.
Biểu đồ trực quan hỗ trợ kết luận rằng hai biến định tính “Giới tính” và “Nhóm sản phẩm” có mối quan hệ tương đối ổn định và tương đồng, không có sự khác biệt lớn giữa nam và nữ trong hành vi chọn loại sản phẩm. Tuy nhiên, để khẳng định mối liên kết có ý nghĩa thống kê hay không, cần thực hiện thêm các kiểm định như kiểm định Chi-bình phương (Chi-square test).
Giả thuyết kiểm định:
H0: Hai biến Gender và ProductFamily độc lập
H1: Hai biến Gender và ProductFamily có mối liên hệ
Thực hiện kiểm định Chi- bình phương
chisq_result2 <- chisq.test(gender_family)
chisq_result2
##
## Pearson's Chi-squared test
##
## data: gender_family
## X-squared = 3.5185, df = 2, p-value = 0.1722
Kết quả kiểm định:
Giá trị thống kê Chi-bình phương: X-squared = 3.5185
Bậc tự do: df = 2
Giá trị p: p-value = 0.1722
Với mức ý nghĩa α = 0.05, ta không đủ bằng chứng để bác bỏ giả thuyết không vì giá trị p = 0.1722 > 0.05.
Điều này có nghĩa là chưa có đủ bằng chứng thống kê để khẳng định rằng giới tính có ảnh hưởng đến loại sản phẩm được chọn. Nói cách khác, hai biến Gender và ProductFamily có thể được xem là độc lập trong dữ liệu này.
Mặc dù kiểm định thống kê không phát hiện mối quan hệ có ý nghĩa giữa hai biến, nhưng qua bảng tần suất chéo và biểu đồ minh họa, ta vẫn có thể quan sát được một số xu hướng nhỏ như:
Cả nam và nữ đều chọn nhóm sản phẩm Food nhiều nhất, tiếp theo là Non-Consumable, và ít nhất là Drink.
Số lượt mua giữa nam và nữ ở từng nhóm sản phẩm có sự chênh lệch nhẹ, tuy nhiên, mức độ khác biệt này chưa đủ lớn để trở nên có ý nghĩa thống kê.
Do đó, mặc dù kết quả kiểm định cho thấy tính độc lập giữa hai biến, nhưng việc khám phá xu hướng hành vi tiêu dùng theo giới tính vẫn có thể hữu ích khi phân tích sâu hơn hoặc mở rộng mẫu dữ liệu trong các nghiên cứu tiếp theo.
home_income <- table(dataDT$Homeowner, dataDT$AnnualIncome)
home_income
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
## N 1359 119 136 48 2087 1063
## Y 1731 524 624 225 2514 1307
##
## $70K - $90K $90K - $110K
## N 686 117
## Y 1023 496
Nhận xét:
Kết quả thể hiện số lượng người sở hữu nhà (Homeowner = Y) và không sở hữu nhà (Homeowner = N) theo các nhóm thu nhập hằng năm. Từ đó, ta có thể rút ra một số nhận xét quan trọng:
Nhóm thu nhập $10K – $30K là nhóm có số lượng cá nhân khá lớn. Đáng chú ý, số người sở hữu nhà (1.731) vượt qua số người không sở hữu (1.359), điều này cho thấy rằng ở nhóm thu nhập thấp nhất, việc sở hữu nhà có thể đến từ các yếu tố phi thu nhập như hỗ trợ từ gia đình hoặc chi phí nhà ở thấp.
Nhóm $30K – $50K có sự chênh lệch đáng kể với 2.514 người sở hữu nhà so với 2.087 người không sở hữu, cho thấy khi thu nhập tăng lên mức trung bình thấp, khả năng sở hữu nhà tăng đáng kể, có thể nhờ tích lũy tài chính hoặc khả năng tiếp cận tín dụng.
Ở nhóm thu nhập $50K – $70K, xu hướng tiếp tục được duy trì với 1.307 người sở hữu và 1.063 người không sở hữu, cho thấy thu nhập từ mức trung bình trở lên đã bắt đầu giúp đa số cá nhân sở hữu nhà.
Nhóm thu nhập $70K – $90K cho thấy tỷ lệ sở hữu nhà tiếp tục tăng mạnh, với 1.023 người sở hữu so với 686 người không sở hữu, tương đương khoảng 60% cá nhân trong nhóm này đã sở hữu nhà.
Ở mức $90K – $110K, xu hướng sở hữu nhà trở nên rõ rệt, khi có tới 496 người sở hữu nhà và chỉ 117 người không sở hữu, tương đương tỷ lệ sở hữu nhà khoảng 80%.
Trong nhóm $110K – $130K, có tới 524 người sở hữu nhà so với 119 người không sở hữu, cho thấy thu nhập cao hơn tiếp tục gia tăng xác suất sở hữu bất động sản.
Nhóm $130K – $150K thể hiện tỷ lệ sở hữu nhà vượt trội với 624 người có nhà và chỉ 136 người không có, phản ánh rằng tại mức thu nhập này, việc sở hữu nhà đã trở thành chuẩn mực phổ biến.
Cuối cùng, nhóm thu nhập trên $150K có 225 người sở hữu nhà và chỉ 48 người không sở hữu, tương đương tỷ lệ sở hữu trên 82%, cho thấy rằng ở mức thu nhập rất cao, việc sở hữu nhà gần như là mặc định.
Từ những phân tích trên, có thể thấy rằng mức thu nhập hằng năm có mối quan hệ thuận chiều với tỷ lệ sở hữu nhà. Khi thu nhập tăng, khả năng sở hữu bất động sản tăng lên rõ rệt. Tuy nhiên, việc một số nhóm thu nhập thấp vẫn có tỷ lệ sở hữu nhà cao cũng gợi ý rằng các yếu tố ngoài thu nhập như thừa kế, giá nhà ở thấp hoặc các chương trình hỗ trợ nhà ở có thể đóng vai trò quan trọng.
prop.table(home_income)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
## N 0.096664059 0.008464329 0.009673519 0.003414183 0.148445835 0.075609930
## Y 0.123123978 0.037271499 0.044384380 0.016003983 0.178817839 0.092965360
##
## $70K - $90K $90K - $110K
## N 0.048794367 0.008322071
## Y 0.072764777 0.035279892
Nhận xét
Bảng tỷ lệ phần trăm tổng thể cho thấy xu hướng rất rõ ràng về mối quan hệ giữa thu nhập và quyền sở hữu nhà ở. Cụ thể:
Ở nhóm thu nhập $10K – $30K, tỷ lệ người sở hữu nhà chiếm 12.31%, cao hơn so với 9.66% người không sở hữu. Điều này cho thấy rằng ngay cả ở mức thu nhập thấp nhất, vẫn có một bộ phận lớn người dân có khả năng sở hữu nhà, có thể nhờ các yếu tố hỗ trợ như tài sản thừa kế hoặc chi phí nhà ở thấp.
Khi thu nhập tăng lên nhóm $30K – $50K, tỷ lệ người sở hữu nhà tăng lên 17.88%, vượt khá xa so với 14.84% người không sở hữu. Đây có thể là giai đoạn nhiều người bắt đầu có khả năng tích lũy hoặc tiếp cận các khoản vay mua nhà.
Nhóm thu nhập $50K – $70K tiếp tục phản ánh xu hướng này, với 9.30% người sở hữu nhà so với 7.50% người không sở hữu.
Ở các nhóm thu nhập trung bình cao như $70K – $90K và $90K – $110K, chênh lệch trở nên rõ rệt hơn. Tỷ lệ người sở hữu nhà lần lượt là 7.28% và 3.53%, so với tỷ lệ không sở hữu chỉ là 4.87% và 0.83%. Đây là minh chứng rõ ràng cho việc thu nhập cao giúp nâng cao khả năng sở hữu nhà.
Từ mức thu nhập $110K – $130K trở đi, khoảng cách giữa hai nhóm tăng mạnh. Người sở hữu nhà chiếm 3.73%, cao gấp hơn 4 lần so với 0.84% người không sở hữu.
Với nhóm $130K – $150K, tỷ lệ người sở hữu nhà lên tới 4.44%, trong khi không sở hữu nhà chỉ chiếm 0.97%. Điều này cho thấy rằng ở mức thu nhập này, việc sở hữu nhà gần như trở thành chuẩn mực phổ biến.
Cuối cùng, nhóm thu nhập trên $150K có tỷ lệ người sở hữu nhà là 1.60%, cao gấp gần 5 lần so với 0.34% người không sở hữu. Tức là, tại mức thu nhập rất cao, quyền sở hữu nhà gần như là mặc định*.
Nhìn chung, dữ liệu phản ánh một mối quan hệ thuận chiều rất rõ ràng giữa thu nhập hằng năm và tỷ lệ sở hữu nhà. Khi thu nhập tăng lên, khả năng sở hữu bất động sản cũng tăng theo một cách đáng kể. Tuy nhiên, cũng cần lưu ý rằng ở nhóm thu nhập thấp, tỷ lệ sở hữu nhà vẫn không hề nhỏ. Điều này cho thấy rằng thu nhập không phải là yếu tố duy nhất quyết định, và các yếu tố khác như thừa kế, giá bất động sản vùng, hay hỗ trợ chính sách nhà ở cũng có thể đóng vai trò quan trọng.
# Chuyển bảng tần suất chéo sang data frame
df_home_income <- as.data.frame(home_income)
colnames(df_home_income) <- c("Homeowner", "AnnualIncome", "Count")
# Vẽ biểu đồ cột nhóm
ggplot(df_home_income, aes(x = AnnualIncome, y = Count, fill = Homeowner)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Số lượng người sở hữu và không sở hữu nhà theo nhóm thu nhập",
x = "Nhóm thu nhập hằng năm",
y = "Số lượng cá nhân") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Nhận xét:
Tỷ lệ sở hữu nhà tăng theo thu nhập: Biểu đồ cho
thấy xu hướng rất rõ ràng: khi nhóm thu nhập tăng, số lượng người sở hữu
nhà (Y) cũng tăng đáng kể, đặc biệt rõ ràng ở nhóm
$30K – $50K
và $50K – $70K
.
Nhóm thu nhập $30K – $50K chiếm ưu thế rõ rệt: Đây là nhóm có số lượng người sở hữu nhà cao nhất trong toàn bộ biểu đồ, vượt trội hơn hẳn so với nhóm không sở hữu trong cùng phân khúc. Điều này cho thấy đây có thể là mức thu nhập trung bình phổ biến, đủ để người dân bắt đầu tiếp cận thị trường bất động sản.
Người thu nhập thấp vẫn có khả năng sở hữu nhà:
Ở nhóm thu nhập $10K – $30K
, số lượng người sở hữu nhà vẫn
cao hơn người không sở hữu. Điều này có thể phản ánh sự hỗ trợ từ các
yếu tố khác như tài sản thừa kế, nhà giá rẻ vùng nông thôn hoặc hỗ trợ
xã hội.
Tỷ lệ không sở hữu nhà giảm ở các nhóm thu nhập
cao: Từ nhóm $70K – $90K
trở đi, số người không sở
hữu nhà (N) giảm mạnh, trong khi người sở hữu nhà vẫn duy trì số lượng
ổn định. Điều này phản ánh rằng thu nhập cao gắn liền với khả năng sở
hữu nhà gần như mặc định.
Chênh lệch rõ rệt giữa hai nhóm sở hữu: Ở các
nhóm thu nhập cao hơn ($90K – $110K
,
$110K – $130K
và trên $150K
), số người sở hữu
nhà tuy có xu hướng giảm nhẹ về số tuyệt đối, nhưng vẫn vượt xa số người
không sở hữu, cho thấy mức độ phổ biến của việc sở hữu nhà ở nhóm thu
nhập cao.
Biểu đồ cho thấy mối quan hệ thuận chiều mạnh mẽ giữa thu nhập hằng năm và khả năng sở hữu nhà. Càng có thu nhập cao, người dân càng có xu hướng sở hữu nhà nhiều hơn. Tuy nhiên, sự hiện diện đáng kể của chủ sở hữu nhà trong nhóm thu nhập thấp cũng cho thấy thu nhập không phải yếu tố duy nhất, và cần xét thêm đến các yếu tố khác như chính sách nhà ở, môi trường sống, hoặc hỗ trợ tài chính từ gia đình. Để khẳng định rõ ràng hơn về mối liên hệ này, có thể cần thực hiện thêm kiểm định thống kê (như Chi-squared test).
Giả thuyết kiểm định
Thực hiện kiểm định Chi-bình phương
chisq_result3<- chisq.test(home_income)
chisq_result3
##
## Pearson's Chi-squared test
##
## data: home_income
## X-squared = 546.37, df = 7, p-value < 2.2e-16
Giá trị thống kê Chi-bình phương: X-squared = 546.37
Bậc tự do: df = 7
Giá trị p: p-value < 2.2e-16
Với giá trị p rất nhỏ (p < 0.05), ta bác bỏ giả thuyết không H0. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa thu nhập hằng năm và việc sở hữu nhà.
Kết quả kiểm định này củng cố các nhận xét mô tả và trực quan hóa trước đó:
Thu nhập hằng năm là yếu tố quan trọng ảnh hưởng đến khả năng sở hữu nhà.
Mức thu nhập càng cao thì tỷ lệ sở hữu nhà càng lớn, phản ánh xu hướng tích lũy tài sản hoặc khả năng tiếp cận các nguồn tài chính mua nhà thuận lợi hơn.
Tỷ lệ sở hữu nhà trong các nhóm thu nhập thấp vẫn không nhỏ, cho thấy ngoài thu nhập còn có các yếu tố hỗ trợ như thừa kế, chính sách nhà ở, hoặc điều kiện thị trường bất động sản vùng miền.
Để hiểu rõ hơn về mối quan hệ này, có thể tiếp tục nghiên cứu bằng các mô hình hồi quy đa biến hoặc phân tích sâu hơn.
Qua các phân tích định tính, ta rút ra được những hiểu biết quan trọng như sau:
Mối quan hệ giữa tình trạng hôn nhân và việc sở hữu nhà
(MaritalStatus – Homeowner):
Kết quả kiểm định Chi-bình phương cho thấy có sự khác biệt đáng kể giữa
các nhóm tình trạng hôn nhân về tỷ lệ sở hữu nhà. Điều này cho thấy nhóm
khách hàng đã kết hôn có xu hướng sở hữu nhà cao hơn so với những người
độc thân hoặc chưa kết hôn, phản ánh đặc điểm tài chính và ổn định hơn
của nhóm này.
Mối quan hệ giữa việc sở hữu nhà và thu nhập hàng năm
(Homeowner – AnnualIncome):
Khách hàng sở hữu nhà thường có mức thu nhập cao hơn so với khách hàng
thuê nhà hoặc chưa sở hữu. Mối quan hệ này phản ánh mức độ khả năng tài
chính và sự ổn định của khách hàng, có thể ảnh hưởng đến khả năng chi
tiêu và lựa chọn sản phẩm cao cấp hơn.
Những phát hiện này cung cấp một cái nhìn toàn diện về các nhóm khách hàng chính dựa trên các đặc điểm định tính, giúp doanh nghiệp nắm bắt được phân khúc khách hàng, nhu cầu và xu hướng tiêu dùng để từ đó tối ưu hóa chiến lược kinh doanh.
Giới hạn phân tích biến định tính: Việc chỉ tập trung phân tích các biến định tính mà không kết hợp các biến định lượng (như tuổi, số lần mua hàng, chi tiêu trung bình…) có thể làm giảm độ sâu và tính toàn diện của phân tích hành vi khách hàng.
Kích thước mẫu không đồng đều: Một số hạng mục con trong các biến định tính có thể có số lượng mẫu rất nhỏ, ảnh hưởng đến độ tin cậy của kết quả kiểm định và khả năng tổng quát hóa.
Không xem xét yếu tố thời gian: Phân tích tĩnh, không theo dõi biến đổi hành vi theo thời gian có thể bỏ lỡ các xu hướng thay đổi trong hành vi khách hàng.
Chiến lược marketing theo phân khúc: Dựa trên sự khác biệt về sở thích sản phẩm theo giới tính và tình trạng hôn nhân, doanh nghiệp nên phát triển các chiến dịch marketing được cá nhân hóa, nhắm đúng nhóm khách hàng mục tiêu.
Phân loại sản phẩm phù hợp: Cần tập trung phát triển các dòng sản phẩm phù hợp với từng nhóm khách hàng đặc trưng, ví dụ sản phẩm cao cấp cho nhóm khách hàng thu nhập cao và sở hữu nhà, sản phẩm giá cả phải chăng hơn cho nhóm khách hàng thu nhập thấp.
Nhắm mục tiêu khách hàng ổn định tài chính: Khách hàng sở hữu nhà và có thu nhập cao là nhóm khách hàng tiềm năng để phát triển các chương trình chăm sóc và khuyến mãi đặc biệt nhằm tăng tỷ lệ giữ chân và giá trị vòng đời khách hàng.
Phân tích kết hợp biến định tính và định lượng: Liệu việc tích hợp các biến định lượng như tuổi, số lần mua hàng, chi tiêu trung bình sẽ giúp hiểu rõ hơn về hành vi và giá trị khách hàng?
Phân tích hành vi theo thời gian: Có những xu hướng thay đổi nào trong sở thích sản phẩm hoặc đặc điểm khách hàng theo thời gian (ví dụ theo mùa hoặc theo năm)?
Tác động của các yếu tố xã hội khác: Liệu các yếu tố như vùng địa lý, trình độ học vấn, nghề nghiệp có ảnh hưởng như thế nào đến hành vi mua sắm của khách hàng?
Ứng dụng mô hình dự đoán: Có thể xây dựng các mô hình dự đoán hành vi khách hàng dựa trên các đặc điểm định tính và định lượng đã phân tích để tối ưu hóa chiến lược marketing và bán hàng?
Gọi:
Ta kiểm định giả thuyết:
Giả thuyết không (H₀): \[ H_0: p_{\text{Mexico}} = p_{\text{Canada}} \] (Tỷ lệ khách từ Mexico bằng với Canada)
Giả thuyết đối (H₁): \[ H_1: p_{\text{Mexico}} > p_{\text{Canada}} \] (Tỷ lệ khách từ Mexico với Canada)
# Số khách từ mỗi nước
x <- c(3688, 809) # Mexico, Canada
n <- c(3688 + 809 + 9562, 3688 + 809 + 9562) # Tổng khách từ tất cả các nước
# Kiểm định giả thuyết
result <- prop.test(x = x, n = n, correct = TRUE)
print(result)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: x out of n
## X-squared = 2192.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.1964812 0.2130785
## sample estimates:
## prop 1 prop 2
## 0.26232307 0.05754321
Tuần này, chúng ta đi sâu vào suy diễn thống kê trên bảng ngẫu nhiên (Contingency Table), đặc biệt tập trung vào:
Đọc dữ liệu và khám phá
library("csv")
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
str(data)
## '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 ...
Đầu tiên, ta sẽ sử dụng 2 biến định tính: Gender (Giới tính) và Homeowner (Có sở hữu nhà hay không) để tiến hành đưa ra ví dụ cũng như phân tích.
Bảng ngẫu nhiên (contingency table) là công cụ thống kê dùng để trình bày tần số của các biến phân loại. Trong trường hợp đơn giản nhất – bảng 2x2 – bảng có dạng:
Biến B = Yes | Biến B = No | |
---|---|---|
Biến A = Yes | a | b |
Biến A = No | c | d |
Trong phân tích thống kê, bảng 2x2 thường dùng để:
Bảng có thể sinh ra từ các phân phối như:
Các bước thực hiện trong R
table_gender_homeowner <- table(data$Gender, data$Homeowner)
table_gender_homeowner
##
## N Y
## F 2826 4344
## M 2789 4100
Lý thuyết: Kiểm định Chi-square
Dùng để kiểm tra xem hai biến phân loại có độc lập thống kê không.
Chỉ số kiểm định: \[ X^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Trong đó:
Nếu p-value < 0.05, ta có đủ cơ sở để bác bỏ H₀ → Có bằng chứng về sự phụ thuộc giữa hai biến.
Các bước thực hiện trong R
chisq.test(table_gender_homeowner, correct = FALSE)
##
## Pearson's Chi-squared test
##
## data: table_gender_homeowner
## X-squared = 1.6788, df = 1, p-value = 0.1951
Khái niệm: Relative Risk (RR) là tỷ lệ giữa xác suất xảy ra sự kiện ở nhóm tiếp xúc so với nhóm không tiếp xúc.
Công thức:
\[ RR = \frac{\frac{a}{a+b}}{\frac{c}{c+d}} \]
Diễn giải:
Khái niệm: Odds Ratio (OR) là tỷ lệ giữa odds xảy ra sự kiện ở nhóm tiếp xúc so với nhóm không tiếp xúc.
Công thức:
\[ OR = \frac{\frac{a}{b}}{\frac{c}{d}} = \frac{a \times d}{b \times c} \]
Diễn giải:
Các bước thực hiện trên R
# Lấy số liệu
a <- table_gender_homeowner["F", "Y"]
b <- table_gender_homeowner["F", "N"]
c <- table_gender_homeowner["M", "Y"]
d <- table_gender_homeowner["M", "N"]
# Tính Odds
odds_female <- a / b
odds_male <- c / d
# Odds Ratio (OR)
or <- odds_female / odds_male
# Relative Risk (RR)
risk_female <- a / (a + b)
risk_male <- c / (c + d)
rr <- risk_female / risk_male
list(
odds_female = odds_female,
odds_male = odds_male,
OR = or,
RR = rr
)
## $odds_female
## [1] 1.537155
##
## $odds_male
## [1] 1.470061
##
## $OR
## [1] 1.04564
##
## $RR
## [1] 1.017989
Khoảng tin cậy 95% cho Odds Ratio
Do OR không phân phối chuẩn, nên lấy log(OR) để xây dựng khoảng tin cậy:
\[ CI_{log(OR)} = \log(OR) \pm Z \cdot SE_{log(OR)} \]
Với: \[ SE = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}} \]
Chuyển về thang OR bằng hàm mũ: \(e^{CI}\).
Các bước thực hiện trên R
se_log_or <- sqrt(1/a + 1/b + 1/c + 1/d)
z <- 1.96 # hệ số cho 95%
ci_lower <- exp(log(or) - z * se_log_or)
ci_upper <- exp(log(or) + z * se_log_or)
c(ci_lower, ci_upper)
## [1] 0.9773755 1.1186731
Nhận xét:
Kết luận cần đi kèm với kiểm định Chi-square và khoảng tin cậy, không nên chỉ nhìn vào OR/RR.
Đây là một ví dụ điển hình cho việc sử dụng Odds Ratio trong kinh tế/xã hội học để mô tả mối liên hệ giữa hai đặc điểm phân loại.
Tạo bảng tần số
# Bảng tần số chéo giữa MaritalStatus và Homeowner
tbl <- table(data$MaritalStatus, data$Homeowner)
tbl
##
## N Y
## M 1719 5147
## S 3896 3297
Nhận xét
Khách hàng đã kết hôn (M): Có tới 5147 người sở hữu nhà ở, chiếm phần lớn trong nhóm này, trong khi chỉ có 1719 người không sở hữu nhà.
Khách hàng độc thân (S): Ngược lại, nhóm này có xu hướng không sở hữu nhà ở cao hơn với 3896 người, trong khi số người sở hữu nhà chỉ là 3297 người.
Kiểm định Chi-square
chi_test <- chisq.test(tbl)
chi_test
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tbl
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
Kết quả kiểm định:
Giá trị thống kê Chi-bình phương: X-squared = 1241.2
Bậc tự do: df = 1
Giá trị p: p-value < 2.2e-16
Kết luận:
Tính Odds Ratio và Relative Risk
# Lọc dữ liệu: chỉ lấy Married và Single
data2 <- subset(data, MaritalStatus %in% c("M", "S"))
# Tạo bảng 2x2
tbl2 <- table(data2$MaritalStatus, data2$Homeowner)
tbl2
##
## N Y
## M 1719 5147
## S 3896 3297
# Tính toán Odds Ratio và Relative Risk
library(epiR)
## Warning: package 'epiR' was built under R version 4.4.3
## Loading required package: survival
## Package epiR 2.0.84 is loaded
## Type help(epi.about) for summary information
## Type browseVignettes(package = 'epiR') to learn how to use epiR for applied epidemiological analyses
##
epi_result <- epi.2by2(tbl2, method = "cohort.count", conf.level = 0.95)
epi_result
## Outcome+ Outcome- Total Inc risk *
## Exposure+ 1719 5147 6866 25.04 (24.02 to 26.08)
## Exposure- 3896 3297 7193 54.16 (53.00 to 55.32)
## Total 5615 8444 14059 39.94 (39.13 to 40.75)
##
## Point estimates and 95% CIs:
## -------------------------------------------------------------------
## Inc risk ratio 0.46 (0.44, 0.48)
## Inc odds ratio 0.28 (0.26, 0.30)
## Attrib risk in the exposed * -29.13 (-30.67, -27.59)
## Attrib fraction in the exposed (%) -116.34 (-126.59, -106.62)
## Attrib risk in the population * -14.22 (-15.63, -12.82)
## Attrib fraction in the population (%) -35.62 (-35.74, -35.46)
## -------------------------------------------------------------------
## Uncorrected chi2 test that OR = 1: chi2(1) = 1242.432 Pr>chi2 = <0.001
## Fisher exact test that OR = 1: Pr>chi2 = <0.001
## Wald confidence limits
## CI: confidence interval
## * Outcomes per 100 population units
Bảng chéo tần suất giữa MaritalStatus và Homeowner
Marital Status | Không sở hữu nhà (N) | Có sở hữu nhà (Y) | Tổng cộng |
---|---|---|---|
Married (M) | 1,719 | 5,147 | 6,866 |
Single (S) | 3,896 | 3,297 | 7,193 |
Tổng cộng | 5,615 | 8,444 | 14,059 |
Tỷ lệ hiện mắc (Incidence Risk)
Những người độc thân có xác suất không sở hữu nhà cao hơn gấp đôi so với người đã kết hôn.
Relative Risk (RR)
Nguy cơ không sở hữu nhà ở nhóm đã kết hôn chỉ bằng 46% so với nhóm độc thân.
Odds Ratio (OR)
Xác suất không sở hữu nhà ở nhóm đã kết hôn thấp hơn 72% so với nhóm độc thân.
Risk Difference và Attribution
Điều này cho thấy rằng việc kết hôn có thể giúp giảm đáng kể rủi ro không sở hữu nhà ở cấp độ cá nhân lẫn dân số.
Kiểm định ý nghĩa thống kê
Kết quả kiểm định cho thấy mối liên hệ giữa tình trạng hôn nhân và việc sở hữu nhà là rất có ý nghĩa thống kê (p < 0.001).
Kết luận:
Trong hoạt động này, chúng ta sẽ sử dụng dữ liệu Supermarket Transactions để phân tích mối liên hệ giữa các biến nhị phân. Mục tiêu là:
Bộ dữ liệu “Supermarket Transactions” phản ánh các giao dịch mua hàng của khách hàng tại một siêu thị trong một khoảng thời gian cụ thể. Mỗi dòng dữ liệu tương ứng với một giao dịch, bao gồm thông tin nhân khẩu học (giới tính, loại thành viên, chi nhánh), đặc điểm sản phẩm (loại sản phẩm, kênh thanh toán), và các yếu tố hành vi tiêu dùng (thời gian mua sắm, mức độ hài lòng, giá trị đơn hàng,…). Tập dữ liệu gồm 14.059 quan sát và 16 biến, cung cấp nền tảng chi tiết để phân tích hành vi khách hàng và hiệu quả kinh doanh của siêu thị.
# Đọc file
library("csv")
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
# Hiển thị cấu trúc dữ liệu
str(data)
## '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 ...
# Hiển thị vài dòng đầu và cuối
head(data)
## 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(data)
## 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
# Chuyển các biến định tính phù hợp sang factor
factor <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory")
# Kiểm tra biến nào tồn tại trong data
factor <- intersect(factor, names(data))
# Chuyển sang factor
data[factor] <- lapply(data[factor], as.factor)
# Kiểm tra lại cấu trúc
str(data)
## '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 : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
## $ MaritalStatus : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
## $ Homeowner : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
## $ Children : int 2 5 2 3 3 3 2 2 3 1 ...
## $ AnnualIncome : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
## $ City : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
## $ StateorProvince : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
## $ Country : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ ProductFamily : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
## $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
## $ ProductCategory : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...
## $ UnitsSold : int 5 5 3 4 4 3 4 6 1 2 ...
## $ Revenue : num 27.38 14.9 5.52 4.44 14 ...
Giải thích các biến
Bộ dữ liệu ghi lại thông tin về các giao dịch mua hàng của khách hàng, bao gồm thông tin nhân khẩu học, thông tin sản phẩm, số lượng bán ra và doanh thu. Dữ liệu bao gồm 14059 quan sát và 16 biến. Dưới đây là mô tả chi tiết các biến có trong bộ dữ liệu:
Tên Biến | Ý Nghĩa |
---|---|
PurchaseDate | Ngày giao dịch mua hàng diễn ra (định dạng ngày/tháng/năm). |
CustomerID | Mã định danh duy nhất cho mỗi khách hàng. |
Gender | Giới tính của khách hàng: M (Nam), F (Nữ). |
MaritalStatus | Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn). |
Homeowner | Tình trạng sở hữu nhà: Y (Có), N (Không). |
Children | Số lượng con cái của khách hàng. |
AnnualIncome | Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K). |
City | Thành phố nơi khách hàng thực hiện giao dịch. |
StateorProvince | Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon). |
Country | Quốc gia. |
ProductFamily | Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng). |
ProductDepartment | Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v. |
ProductCategory | Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine. |
UnitsSold | Số lượng đơn vị sản phẩm đã bán trong giao dịch đó. |
Revenue | Doanh thu từ giao dịch (tính theo USD). |
table_gender_home <- table(data$Gender, data$Homeowner)
table_gender_home
##
## N Y
## F 2826 4344
## M 2789 4100
Dựa vào bảng trên:
Nữ (F) có tổng cộng 7170 người, trong đó 4344 người sở hữu nhà, chiếm khoảng 60.6%.
Nam (M) có tổng cộng 6889 người, với 4100 người sở hữu nhà, tương ứng khoảng 59.5%.
Nhận xét:
Tỷ lệ sở hữu nhà của nữ có vẻ nhỉnh hơn một chút so với nam (khoảng
60.6% so với 59.5%), tuy nhiên sự khác biệt này là khá nhỏ.
Để đánh giá rõ ràng hơn về mức độ liên hệ giữa hai biến, ta sẽ tiếp tục
tính các chỉ số định lượng như:
Hiệu hai tỷ lệ (Difference in Proportions), Relative Risk (RR), Odds
Ratio (OR).
prop_table <- prop.table(table_gender_home, margin = 1)
prop_table
##
## N Y
## F 0.3941423 0.6058577
## M 0.4048483 0.5951517
diff_prop <- prop_table[1, "Y"] - prop_table[2, "N"]
diff_prop
## [1] 0.2010094
Tỷ lệ sở hữu nhà:
Ở nữ là 0.6059 (tức là 60.6%)
Ở nam là 0.5952 (tức là 59.5%)
Hiệu hai tỷ lệ giữa nữ và nam là 0.201, tương đương 20.1 điểm phần trăm.
Kết luận:
Tỷ lệ nữ sở hữu nhà cao hơn nam khoảng 1.00%, tuy nhiên mức chênh lệch này khá nhỏ và chưa thể kết luận có ý nghĩa thống kê nếu chưa tính khoảng tin cậy (confidence interval) hoặc thực hiện các kiểm định thống kê chính thức như kiểm định z hoặc chi bình phương.
library(epitools)
##
## Attaching package: 'epitools'
## The following object is masked from 'package:survival':
##
## ratetable
rr_result <- riskratio(table_gender_home)
rr_result$measure
## risk ratio with 95% C.I.
## estimate lower upper
## F 1.0000000 NA NA
## M 0.9823291 0.9561812 1.009192
Dựa vào kết quả ta thấy Relative Risk (RR) của nam so với nữ là 0.9823. Khoảng tin cậy 95% của RR nằm trong khoảng từ 0.9562 đến 1.0092.
Kết luận:
RR < 1 cho thấy nam có tỷ lệ sở hữu nhà thấp hơn nữ một chút (chỉ còn
khoảng 98.23% so với nữ). Tuy nhiên, vì khoảng tin cậy 95% bao gồm giá
trị 1.0, nên không có bằng chứng đủ mạnh để kết luận sự khác biệt này có
ý nghĩa thống kê. Nói cách khác, tỷ lệ sở hữu nhà giữa nam và nữ có thể
coi là tương đương.
library(epitools)
or_result <- oddsratio(table_gender_home)
or_result
## $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"
or_result$conf.int
## NULL
Phân tích bảng thì giữa hai nhóm giới tính (F và M) cho thấy:
Do tất cả các giá trị p đều lớn hơn mức ý nghĩa thông thường (α = 0.05), không có sự khác biệt có ý nghĩa thống kê giữa nhóm nam và nữ về biến được phân tích.
Như vậy, kết quả cho thấy không có mối liên quan rõ rệt giữa giới tính và biến, theo phân tích odds ratio và các kiểm định xác suất tương ứng.