#xuất hiện câu lệnh, không xuất hiện kết quả
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
library(psych)
## Warning: package 'psych' was built under R version 4.3.3
##
## Attaching package: 'psych'
##
## The following objects are masked from 'package:scales':
##
## alpha, rescale
##
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
d <- read.csv('D:/HK2_PTDLDT_TMT/Supermarket Transactions.csv',header = T)
cat<- c("MaritalStatus", "Homeowner", "City", "StateorProvince", "Country", "ProductFamily", "ProductDepartment", "ProductCategory")
d_cat<-d[, cat] #lấy tất cả các hàng và các biến trong cat
datatable(d_cat,options = list(scrollX = TRUE))
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html
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
## < table of extent 0 >
Gender_2<-table(d$Gender)/sum(nrow(d))*100 #tần suất
Gender_2
##
## F M
## 50.99936 49.00064
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$Homeowner)/sum(nrow(d))*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
## < table of extent 0 >
AnnualIncome_2<-table(d$AnnualIncome)/sum(nrow(d))*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 |>
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$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$StateorProvince)/sum(nrow(d))*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 |>
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$Country)
Country_1
##
## Canada Mexico USA
## 809 3688 9562
Country_2<-table(d$Country)/sum(nrow(d))*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 |>
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$ProductFamily)
ProductFamily_1
##
## Drink Food Non-Consumable
## 1250 10153 2656
ProductFamily_2<-table(d$ProductFamily)/sum(nrow(d))*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$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$ProductDepartment)/sum(nrow(d))*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$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$ProductCategory)/sum(nrow(d))*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.