# Đọc dữ liệu từ file tmp.csv
df <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", stringsAsFactors = FALSE)
# Hiển thị cấu trúc của dữ liệu
str(df)
## 'data.frame': 14059 obs. of 16 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PurchaseDate : chr "12/18/2007" "12/20/2007" "12/21/2007" "12/21/2007" ...
## $ 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(df)
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1 12/18/2007 7223 F S Y 2
## 2 2 12/20/2007 7841 M M Y 5
## 3 3 12/21/2007 8374 F M N 2
## 4 4 12/21/2007 9619 M M Y 3
## 5 5 12/22/2007 1900 F S Y 3
## 6 6 12/22/2007 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(df)
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14054 14054 12/29/2009 2032 F M N 3
## 14055 14055 12/29/2009 9102 F M Y 2
## 14056 14056 12/29/2009 4822 F M Y 3
## 14057 14057 12/31/2009 250 M S Y 1
## 14058 14058 12/31/2009 6153 F S N 4
## 14059 14059 12/31/2009 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
# Kiểm tra giá trị thiếu ở các cột
colSums(is.na(df))
## X PurchaseDate CustomerID Gender
## 0 0 0 0
## MaritalStatus Homeowner Children AnnualIncome
## 0 0 0 0
## City StateorProvince Country ProductFamily
## 0 0 0 0
## ProductDepartment ProductCategory UnitsSold Revenue
## 0 0 0 0
# Chuyển các biến định tính sang factor nếu chưa là factor
df$Gender <- as.factor(df$Gender)
df$MaritalStatus <- as.factor(df$MaritalStatus)
df$Homeowner <- as.factor(df$Homeowner)
df$AnnualIncome <- as.factor(df$AnnualIncome)
# Các biến sản phẩm và địa lý
df$ProductFamily <- as.factor(df$ProductFamily)
df$ProductDepartment <- as.factor(df$ProductDepartment)
df$ProductCategory <- as.factor(df$ProductCategory)
df$City <- as.factor(df$City)
df$StateorProvince <- as.factor(df$StateorProvince)
df$Country <- as.factor(df$Country)
# Tạo bảng tần suất và tỷ lệ phần trăm cho các biến định tính
categorical_vars <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory")
# Lặp qua từng biến định tính để hiển thị bảng tần suất và tỷ lệ phần trăm
for (var in categorical_vars) {
cat("\n### Biến:", var, "\n")
freq <- table(df[[var]])
percent <- prop.table(freq) * 100
print(freq)
print(round(percent, 2))
}
##
## ### Biến: Gender
##
## F M
## 7170 6889
##
## F M
## 51 49
##
## ### Biến: MaritalStatus
##
## M S
## 6866 7193
##
## M S
## 48.84 51.16
##
## ### Biến: Homeowner
##
## N Y
## 5615 8444
##
## N Y
## 39.94 60.06
##
## ### Biến: AnnualIncome
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 21.98 4.57 5.41 1.94 32.73
## $50K - $70K $70K - $90K $90K - $110K
## 16.86 12.16 4.36
##
## ### Biến: 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
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 2.72 1.02 5.77 5.93 3.22
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 0.53 6.01 6.59 4.65 1.38
## Orizaba Portland Salem San Andres San Diego
## 3.30 6.23 9.86 4.42 6.16
## San Francisco Seattle Spokane Tacoma Vancouver
## 0.92 6.56 6.22 8.94 4.50
## Victoria Walla Walla Yakima
## 1.25 1.14 2.67
##
## ### Biến: StateorProvince
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 5.75 19.44 5.80 2.72 0.53 16.09 3.30 32.48
## Yucatan Zacatecas
## 4.65 9.23
##
## ### Biến: Country
##
## Canada Mexico USA
## 809 3688 9562
##
## Canada Mexico USA
## 5.75 26.23 68.01
##
## ### Biến: ProductFamily
##
## Drink Food Non-Consumable
## 1250 10153 2656
##
## Drink Food Non-Consumable
## 8.89 72.22 18.89
##
## ### Biến: 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
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 2.53 3.02 7.63 4.84
## Breakfast Foods Canned Foods Canned Products Carousel
## 1.34 6.95 0.78 0.42
## Checkout Dairy Deli Eggs
## 0.58 6.42 4.97 1.41
## Frozen Foods Health and Hygiene Household Meat
## 9.83 6.35 10.10 0.63
## Periodicals Produce Seafood Snack Foods
## 1.44 14.18 0.73 11.38
## Snacks Starchy Foods
## 2.50 1.97
##
## ### Biến: 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
##
## Baking Goods Bathroom Products Beer and Wine
## 3.44 2.60 2.53
## Bread Breakfast Foods Candles
## 3.02 2.97 0.32
## Candy Canned Anchovies Canned Clams
## 2.50 0.31 0.38
## Canned Oysters Canned Sardines Canned Shrimp
## 0.25 0.28 0.27
## Canned Soup Canned Tuna Carbonated Beverages
## 2.87 0.62 1.10
## Cleaning Supplies Cold Remedies Dairy
## 1.34 0.66 6.42
## Decongestants Drinks Eggs
## 0.60 0.96 1.41
## Electrical Frozen Desserts Frozen Entrees
## 2.53 2.30 0.84
## Fruit Hardware Hot Beverages
## 5.44 0.92 1.61
## Hygiene Jams and Jellies Kitchen Products
## 1.40 4.18 1.54
## Magazines Meat Miscellaneous
## 1.44 5.41 0.30
## Packaged Vegetables Pain Relievers Paper Products
## 0.34 1.37 2.45
## Pizza Plastic Products Pure Juice Beverages
## 1.38 1.00 1.17
## Seafood Side Dishes Snack Foods
## 0.73 1.09 11.38
## Specialty Starchy Foods Vegetables
## 2.06 1.97 12.29
# Vẽ biểu đồ cột cho các biến định tính
library(ggplot2)
for (var in categorical_vars) {
cat("\n### Biểu đồ cột cho biến:", var, "\n")
print(
ggplot(df, aes_string(x = var)) +
geom_bar(fill = "steelblue") +
labs(title = paste("Biểu đồ tần suất -", var), x = var, y = "Tần suất") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
)
}
##
## ### Biểu đồ cột cho biến: Gender
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
##
## ### Biểu đồ cột cho biến: MaritalStatus
##
## ### Biểu đồ cột cho biến: Homeowner
##
## ### Biểu đồ cột cho biến: AnnualIncome
##
## ### Biểu đồ cột cho biến: City
##
## ### Biểu đồ cột cho biến: StateorProvince
##
## ### Biểu đồ cột cho biến: Country
##
## ### Biểu đồ cột cho biến: ProductFamily
##
## ### Biểu đồ cột cho biến: ProductDepartment
##
## ### Biểu đồ cột cho biến: ProductCategory
# Biểu đồ tròn cho một số biến phù hợp (ví dụ: Gender, Homeowner)
selected_vars <- c("Gender", "Homeowner")
for (var in selected_vars) {
cat("\n### Biểu đồ tròn cho biến:", var, "\n")
pie_data <- as.data.frame(table(df[[var]]))
names(pie_data) <- c("Category", "Count")
pie_data$Percent <- round(pie_data$Count / sum(pie_data$Count) * 100, 2)
pie_data$Label <- paste0(pie_data$Category, " (", pie_data$Percent, "%)")
print(
ggplot(pie_data, aes(x = "", y = Count, fill = Label)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y") +
labs(title = paste("Biểu đồ tròn -", var), fill = var) +
theme_void()
)
}
##
## ### Biểu đồ tròn cho biến: Gender
##
## ### Biểu đồ tròn cho biến: Homeowner
Tổng hợp Nhận xét Các Biến Định Tính:
Gender (Giới tính) Biểu đồ tròn cho thấy tỷ lệ giới tính nữ (F)
chiếm khoảng 51% và nam (M) chiếm 49%, gần như ngang nhau.
Việc phân bố giới tính đồng đều giúp việc phân tích không bị thiên
lệch.
MaritalStatus (Tình trạng hôn nhân) Hầu hết khách hàng là độc
thân (Single) hoặc đã kết hôn (Married).
Nhóm độc thân có xu hướng chiếm tỷ lệ cao hơn một chút, cho thấy nhiều
khách hàng có thể là người trẻ tuổi, chưa lập gia đình.
Homeowner (Có sở hữu nhà hay không) Biểu đồ tròn cho thấy 60%
khách hàng có sở hữu nhà (Y) và 40% không sở hữu nhà (N).
Phần lớn khách hàng đã ổn định chỗ ở, điều này có thể ảnh hưởng đến thói
quen tiêu dùng như mua sắm cho gia đình, đầu tư dài hạn.
AnnualIncome (Thu nhập hàng năm) Khách hàng có thu nhập tập trung
nhiều ở nhóm $50K–$60K.
Các nhóm thu nhập từ $30K đến $70K cũng khá phổ biến, cho thấy phần lớn
là người có thu nhập trung bình.
City (Thành phố) Một số thành phố như San Diego, San Jose và
Phoenix có số lượng khách hàng cao hơn hẳn các thành phố còn lại.
Điều này cho thấy hoạt động mua sắm tập trung chủ yếu ở một vài đô thị
lớn.
StateorProvince (Bang/Tỉnh) WA (Washington), CA (California) và
ON (Ontario) là những nơi có số lượng khách hàng cao nhất.
Dữ liệu phân bố chủ yếu ở các bang của Mỹ và một phần Canada, trong khi
các tỉnh ở Mexico ít hơn.
Country (Quốc gia) USA chiếm phần lớn khách hàng trong tập dữ
liệu, tiếp theo là Mexico và ít nhất là Canada.
Điều này cho thấy thị trường chính của hệ thống siêu thị là tại Hoa
Kỳ.
ProductDepartment (Phòng ban sản phẩm) Produce (nông sản), Snack
Foods (đồ ăn vặt) và Breakfast Foods (bữa sáng) là những nhóm sản phẩm
được mua nhiều nhất.
Một số nhóm như Greeting Cards hoặc Canned Products có lượng mua rất ít,
có thể là do nhu cầu thấp.
ProductCategory (Loại sản phẩm) Vegetables và Snack Foods là hai
danh mục có số lượt mua cao nhất.
Ngược lại, một số mặt hàng như Oysters, Canned Sardines có rất ít người
mua. Siêu thị có thể xem xét tối ưu lại nhóm sản phẩm.
# Số nữ và tổng số
n_female <- sum(df$Gender == "F")
n_total_gender <- length(df$Gender)
# Ước lượng và kiểm định giả thuyết (H0: p = 0.5)
gender_result <- prop.test(x = n_female, n = n_total_gender, p = 0.5, alternative = "two.sided", conf.level = 0.95)
gender_result
##
## 1-sample proportions test with continuity correction
##
## data: n_female out of n_total_gender, 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
Diễn giải:
Khoảng tin cậy 95% cho tỷ lệ nữ trong tổng thể nằm trong khoảng được
hiển thị bên trên.
Dựa vào p-value, nếu nhỏ hơn 0.05 thì ta bác bỏ giả thuyết tỷ lệ nữ =
50%.
Ngược lại, nếu p-value lớn hơn 0.05 thì chưa đủ bằng chứng để kết luận
tỷ lệ nữ khác 50%.
Nhận xét: Tỷ lệ nữ trong dữ liệu là khoảng 50.99% và nằm trong khoảng tin cậy 95% từ 50.17% đến 51.89%. Vì p-value = 0.0182 < 0.05 nên nói tỷ lệ nữ khác 50% một cách có ý nghĩa thống kê.
# Số người có nhà và tổng số
n_homeowner <- sum(df$Homeowner == "Y")
n_total_homeowner <- length(df$Homeowner)
# Ước lượng và kiểm định giả thuyết (H0: p = 0.5)
homeowner_result <- prop.test(x = n_homeowner, n = n_total_homeowner, p = 0.5, alternative = "two.sided", conf.level = 0.95)
homeowner_result
##
## 1-sample proportions test with continuity correction
##
## data: n_homeowner out of n_total_homeowner, 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
Diễn giải:
Ta kiểm định xem tỷ lệ khách hàng có nhà có khác 50% hay không.
Khoảng tin cậy và p-value giúp ta kết luận liệu giả thuyết H0 có bị bác
bỏ hay không.
Nhận xét: Tỷ lệ khách hàng sở hữu nhà là khoảng 60.06%, với khoảng tin cậy 95% từ 59.25% đến 60.87%. Vì p-value < 2.2e-16 (rất nhỏ hơn 0.05), vậy đồng nghĩa rằng tỷ lệ sở hữu nhà khác 50% một cách rất rõ ràng và có ý nghĩa thống kê.
# Số sản phẩm thuộc phòng ban "Produce"
n_produce <- sum(df$ProductDepartment == "Produce")
n_total_proddept <- length(df$ProductDepartment)
# Ước lượng và kiểm định giả thuyết (H0: p >= 0.2)
prod_result <- prop.test(x = n_produce, n = n_total_proddept, p = 0.2, alternative = "greater", conf.level = 0.95)
prod_result
##
## 1-sample proportions test with continuity correction
##
## data: n_produce out of n_total_proddept, null probability 0.2
## X-squared = 296.95, df = 1, p-value = 1
## alternative hypothesis: true p is greater than 0.2
## 95 percent confidence interval:
## 0.137025 1.000000
## sample estimates:
## p
## 0.1418309
Diễn giải:
Ta kiểm định giả thuyết: tỷ lệ sản phẩm thuộc phòng ban “Produce” có lớn
hơn hoặc bằng 20% không.
Nếu p-value < 0.05 → có bằng chứng rằng “Produce” chiếm nhiều hơn
20%.
Nếu p-value ≥ 0.05 → không đủ bằng chứng để kết luận như vậy.
Nhận xét: Nhóm sản phẩm “Produce” là mặt hàng thiết yếu, thường xuyên tiêu dùng và đóng vai trò thu hút khách hàng của siêu thị. Do đó, ta đặt giả thuyết kỳ vọng rằng nhóm “Produce” nên chiếm ít nhất 20% tổng số sản phẩm – đây là một mốc hợp lý trong ngành bán lẻ thực phẩm. Kết quả kiểm định cho thấy tỷ lệ sản phẩm thuộc nhóm Produce là khoảng 14.18%, với khoảng tin cậy 95% là từ 13.70% đến 100% .Kết quả p-value = 1 > 0.05 nên không có bằng chứng thống kê để cho thấy tỷ lệ thực tế lớn hơn 20% như kỳ vọng ban đầu.
Gender và ProductFamilyMaritalStatus và HomeownerStateorProvince và ProductFamily# Tạo bảng tần suất chéo và phần trăm
table1 <- table(df$Gender, df$ProductFamily)
table1
##
## Drink Food Non-Consumable
## F 669 5149 1352
## M 581 5004 1304
prop.table(table1, margin = 1) # theo hàng
##
## Drink Food Non-Consumable
## F 0.09330544 0.71813110 0.18856346
## M 0.08433735 0.72637538 0.18928727
# Biểu đồ cột chồng theo tỷ lệ
ggplot(df, aes(x = Gender, fill = ProductFamily)) +
geom_bar(position = "fill") +
labs(title = "Tỷ lệ ProductFamily theo Gender", x = "Gender", y = "Tỷ lệ") +
theme_minimal()
# Kiểm định Chi-bình phương
chisq.test(table1)
##
## Pearson's Chi-squared test
##
## data: table1
## X-squared = 3.5185, df = 2, p-value = 0.1722
Nhận xét: Ta có thể thấy mối quan hệ giữa giới tính (Gender) và loại sản phẩm (ProductFamily) cho thấy cả nam và nữ đều có xu hướng mua nhiều nhất là nhóm sản phẩm Food, chiếm khoảng 72% trong tổng số lượt mua của mỗi giới. Hai nhóm còn lại là Drink và Non-Consumable có tỷ lệ tương đối thấp và gần như tương đương nhau giữa hai giới. Kết quả kiểm định Chi-bình phương cho p-value = 0.1722, lớn hơn mức ý nghĩa 0.05, nghĩa là không có bằng chứng thống kê cho thấy giới tính và loại sản phẩm có mối liên hệ với nhau. ## 4.2.Biến MaritalStatus và Homeowner
# Tạo bảng tần suất chéo giữa MaritalStatus và Homeowner
table2 <- table(df$MaritalStatus, df$Homeowner)
table2
##
## N Y
## M 1719 5147
## S 3896 3297
prop.table(table2, margin = 1) # Tính tỷ lệ theo hàng
##
## N Y
## M 0.2503641 0.7496359
## S 0.5416377 0.4583623
# Biểu đồ cột chồng thể hiện mối quan hệ giữa MaritalStatus và Homeowner
library(ggplot2)
ggplot(df, aes(x = MaritalStatus, fill = Homeowner)) +
geom_bar(position = "fill") +
labs(
title = "Tỷ lệ Homeowner theo MaritalStatus",
x = "Tình trạng hôn nhân",
y = "Tỷ lệ"
) +
theme_minimal()
# Kiểm định Chi-bình phương cho MaritalStatus và Homeowner
chisq.test(table2)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table2
## X-squared = 1241.2, df = 1, p-value < 2.2e-16
Nhận xét: Dựa vào kết quả phân tích ta có thể thấy mối quan hệ giữa tình trạng hôn nhân (MaritalStatus) và quyền sở hữu nhà (Homeowner) cho thấy có sự khác biệt rõ rệt giữa hai nhóm. Cụ thể, trong nhóm đã kết hôn (M), khoảng 75% khách hàng có sở hữu nhà, trong khi nhóm độc thân (S) thì phần lớn không sở hữu nhà (chiếm khoảng 54%). Kiểm định Chi-bình phương cho kết quả p-value < 2.2e-16, rất nhỏ hơn 0.05, cho thấy mối liên hệ giữa tình trạng hôn nhân và quyền sở hữu nhà là có ý nghĩa thống kê.
# Bảng tần suất chéo giữa StateorProvince và ProductFamily
table3 <- table(df$StateorProvince, df$ProductFamily)
table3
##
## Drink Food Non-Consumable
## BC 69 580 160
## CA 258 1974 501
## DF 65 598 152
## Guerrero 41 272 70
## Jalisco 5 57 13
## OR 199 1629 434
## Veracruz 44 322 98
## WA 399 3287 881
## Yucatan 48 494 112
## Zacatecas 122 940 235
prop.table(table3, margin = 1) # Tính tỷ lệ theo từng bang/tỉnh
##
## 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
# Biểu đồ cột chồng thể hiện tỷ lệ ProductFamily theo từng bang/tỉnh
ggplot(df, aes(x = StateorProvince, fill = ProductFamily)) +
geom_bar(position = "fill") +
labs(
title = "Tỷ lệ ProductFamily theo Bang/Tỉnh",
x = "Bang/Tỉnh",
y = "Tỷ lệ"
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 60, hjust = 1))
# Kiểm định Chi-bình phương giữa StateorProvince và ProductFamily
chisq.test(table3)
##
## Pearson's Chi-squared test
##
## data: table3
## X-squared = 12.3, df = 18, p-value = 0.8314
Nhận xét: Dựa vào kkết quả phân tích mối quan hệ giữa bang/tỉnh (StateorProvince) và loại sản phẩm (ProductFamily) cho thấy, tại hầu hết các địa phương, khách hàng đều có xu hướng lựa chọn nhóm sản phẩm Food là chủ yếu, chiếm tỷ lệ trên 70%. Trong khi đó, hai nhóm còn lại là Drink và Non-Consumable có tỷ lệ thấp hơn và phân bố khá đồng đều giữa các tỉnh thành. Mặc dù có một số khác biệt nhỏ giữa các khu vực, kết quả kiểm định Chi-bình phương với p-value = 0.8314 (lớn hơn 0.05) cho thấy k mối liên hệ thống kê có ý nghĩa giữa địa phương và loại sản phẩm được mua là không cao
Qua phân tích cho thấy hầu hết khách hàng có thu nhập trung bình, mua nhiều sản phẩm thuộc nhóm Food và chủ yếu sống ở Mỹ. Tỷ lệ nữ và tỷ lệ người sở hữu nhà đều khác đáng kể so với giả thiết ban đầu, còn nhóm sản phẩm “Produce” không đạt mức kỳ vọng 20%. Trong các cặp biến được phân tích, chỉ có tình trạng hôn nhân và việc sở hữu nhà là có mối liên hệ rõ ràng. Giới tính và nơi sống không ảnh hưởng nhiều đến loại sản phẩm mà khách hàng chọn mua. Tuy nhiên dữ liệu chỉ phản ánh hành vi mua sắm trong một khoảng thời gian nhất định và tại một hệ thống siêu thị, chưa đại diện cho toàn bộ thị trườnG nên đây là một bài phân tích nhỏ của cá nhân dưới góc độ sinh viên
Bảng tần số chéo Bảng tần số chéo là công cụ thống kê mô tả sự phân phối đồng thời của hai biến phân loại. Mỗi ô trong bảng thể hiện số lượng quan sát rơi vào một tổ hợp cụ thể của hai biến.
Kiểm định Chi-bình phương về tính độc lập được sử dụng để kiểm tra xem hai biến phân loại có quan hệ thống kê với nhau hay không. Đây là phương pháp suy diễn thống kê thường dùng trong phân tích bảng tần số chéo (contingency table).
Giả thuyết kiểm định:
Thống kê kiểm định:
Thống kê Chi-bình phương được tính bằng công thức:
\[ \chi^2 = \sum_{i=1}^{r} \sum_{j=1}^{c} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Trong đó: - \(O_{ij}\): tần số quan sát tại ô \((i,j)\). - \(E_{ij}\): tần số kỳ vọng tại ô \((i,j)\), được tính bởi:
\[ E_{ij} = \frac{(Tổng hàng i) \cdot (Tổng cột j)}{Tổng số quan sát} \] Bậc tự do:
\[ df = (r - 1)(c - 1) \]
Trong đó: - \(r\): số hàng (số mức của biến thứ nhất). - \(c\): số cột (số mức của biến thứ hai).
Diễn giả : - Nếu \(p\text{-value} < \alpha\) (thường chọn \(\alpha = 0.05\)):
→ Bác bỏ giả thuyết \(H_0\) → có mối liên hệ thống kê giữa hai biến.
Nếu \(p\text{-value} \geq \alpha\):
→ Không bác bỏ \(H_0\) → không đủ bằng chứng thống kê để kết luận hai biến có liên hệ.
ý nghĩa:
Kiểm định Chi-bình phương thường được dùng trong các nghiên cứu xã hội, y tế, kinh tế để phân tích mối quan hệ giữa hai đặc điểm phân loại như giới tính, tình trạng sức khỏe, hành vi tiêu dùng
Relative Risk (RR) – hay còn gọi là Tỷ số nguy cơ – là một thước đo thống kê dùng để so sánh xác suất xảy ra một hiện tượng (sự kiện) giữa hai nhóm (ví dụ: nhóm tiếp xúc và nhóm không tiếp xúc).
RR thường được sử dụng trong các nghiên cứu đoàn hệ (cohort studies) và thử nghiệm thực nghiệm có thể đo lường xác suất thực sự trong từng nhóm.
Giả sử có bảng tần số chéo dạng 2×2 như sau:
| Sự kiện xảy ra | Không xảy ra | Tổng số | |
|---|---|---|---|
| Nhóm 1 | a | b | a + b |
| Nhóm 2 | c | d | c + d |
Tỷ số nguy cơ được tính như sau:
\[ RR = \frac{a / (a + b)}{c / (c + d)} \]
Trong đó: - \(a / (a + b)\): Xác suất xảy ra sự kiện ở nhóm 1. - \(c / (c + d)\): Xác suất xảy ra sự kiện ở nhóm 2.
library(epitools)
marital_homeowner <- table(df$MaritalStatus, df$Homeowner)
addmargins(marital_homeowner)
##
## N Y Sum
## M 1719 5147 6866
## S 3896 3297 7193
## Sum 5615 8444 14059
riskratio(marital_homeowner)
## $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
Dựa trên kết quả từ hàm riskratio(), ta thu được bảng
tần số chéo giữa hai biến phân loại: MaritalStatus
(Married, Single) và Homeowner (Yes, No). Cụ thể, có tổng
cộng 6866 người đã kết hôn và 7193 người độc thân trong mẫu khảo sát.
Trong đó, 5147 người kết hôn và 3297 người độc thân sở hữu nhà.
Kết quả phân tích tỷ số nguy cơ (Relative Risk - RR) cho thấy:
Điều này có nghĩa là nguy cơ sở hữu nhà của người độc thân chỉ bằng khoảng 61.1% so với người đã kết hôn, và sự khác biệt này là có ý nghĩa thống kê vì khoảng tin cậy không chứa 1.
Các kiểm định thống kê đi kèm (midp, Fisher exact, chi-square) đều cho giá trị p gần bằng 0 (ví dụ: Fisher’s exact = 1.82 × 10⁻²⁷⁷), cho thấy sự khác biệt về tỷ lệ sở hữu nhà giữa hai nhóm là rất đáng tin cậy về mặt thống kê.
Tóm lại, kết quả này cho thấy tình trạng hôn nhân có mối liên hệ chặt chẽ với khả năng sở hữu nhà, trong đó người đã kết hôn có nguy cơ cao hơn đáng kể so với người độc thân.