Đọc dữ liệu

library(tidyverse)
a <- read.csv(file = "C:/Users/Khanh Hoa/Downloads/Supermarket Transactions.csv", header = T) # load data
a <- select(a,"Gender","MaritalStatus","Homeowner","AnnualIncome","City","StateorProvince","Country","ProductFamily","ProductDepartment", "ProductCategory")

Thống kê mô tả đơn biến trong tập Supermarket Transactions.csv

1. Gender

thong_ke_dinh_tinh <- function(data, var_name) {
  # Check if variable exists in data
  if (!var_name %in% names(data)) {
    stop("Variable does not exist in data")
  }
  
  # Convert to factor if needed
  variable <- as.factor(data[[var_name]])
  
  # freq
  freq <- table(variable)
  percent <- prop.table(freq) * 100
  
  # result
  result <- data.frame(
    Gia_tri = names(freq),
    Tan_so = as.vector(freq),
    Tan_suat = round(as.vector(percent), 2)
  )
  return(result)
}
library(ggplot2)
thong_ke_dinh_tinh(a, 'Gender')
##   Gia_tri Tan_so Tan_suat
## 1       F   7170       51
## 2       M   6889       49
ggplot(data = a, aes(x = Gender)) +
  geom_bar(fill = "#DFC000FF") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5) +
  labs(title = "Giới tính khách hàng",
       x = "Giới tính", y = "Tần số") +
  theme_minimal()

Phân bố giới tính ở các đơn mua khá cân bằng, chỉ chênh lệch nhẹ giữa nữ (F) và nam (M).

Đ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.

2. MaritalStatus

thong_ke_dinh_tinh(a,'MaritalStatus')
##   Gia_tri Tan_so Tan_suat
## 1       M   6866    48.84
## 2       S   7193    51.16

Gần một nửa đơn mua là độc thân, còn lại là đã kết hôn.

Tỷ lệ này cũng tương đối cân bằng, giúp so sánh hành vi theo tình trạng hôn nhân mà không lo thiên lệch dữ liệu.

ggplot(data = a, aes(x = "", fill = MaritalStatus)) +
  geom_bar(width = 1) +
  coord_polar("y") +
  labs(title = "Tỷ lệ độc thân") +
  theme_void()

3. Homeowner

thong_ke_dinh_tinh(a, 'Homeowner')
##   Gia_tri Tan_so Tan_suat
## 1       N   5615    39.94
## 2       Y   8444    60.06

Phần lớn đơn mua được thực hiện bởi những khách hàng sở hữu nhà (chiếm ~60%).

Điều này có thể ảnh hưởng đến thói quen chi tiêu hoặc ưu tiên mua sắm, là một đặc điểm quan trọng để phân khúc khách hàng.

ggplot(data = a, aes(x = Homeowner)) +
  geom_bar(fill = "#ABE0AF") +
  geom_text(stat = "count", aes(label = ..count..), vjust = -0.5) +
  labs(title = "Sở hữu nhà",
       x = "Có hoặc không", y = "Tần số") +
  theme_minimal()

4. AnnualIncome

thong_ke_dinh_tinh(a, 'AnnualIncome')
##         Gia_tri Tan_so Tan_suat
## 1   $10K - $30K   3090    21.98
## 2 $110K - $130K    643     4.57
## 3 $130K - $150K    760     5.41
## 4       $150K +    273     1.94
## 5   $30K - $50K   4601    32.73
## 6   $50K - $70K   2370    16.86
## 7   $70K - $90K   1709    12.16
## 8  $90K - $110K    613     4.36

$30K - $50K chiếm hơn 1/3 (32.73%) tổng số quan sát → là nhóm đông nhất. Kết hợp với $10K - $30K, ta có khoảng 55% người thuộc nhóm dưới $50K cho thấy mức thu nhập trung bình hoặc thấp là phổ biến.

Nhóm thu nhập cao (trên $90K) Gồm $90K - $110K, $110K - $130K, $130K - $150K, $150K+. Tổng tần suất chỉ khoảng 16.28% cho thấy nhóm thu nhập cao khá nhỏ.

Kết quả này cho thấy đa số đơn mua được thực hiện bởi các khách hàng có mức thu nhập trung bình hoặc thấp.

ggplot(a, aes(x = AnnualIncome)) +
  geom_bar(fill = "lightgreen", color = "black") +
  labs(x = "Khoảng thu nhập", y = "Tần suất", title = "Biểu đồ tần suất thu nhập hàng năm") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

5. City

thong_ke_dinh_tinh(a,'City')
##          Gia_tri Tan_so Tan_suat
## 1       Acapulco    383     2.72
## 2     Bellingham    143     1.02
## 3  Beverly Hills    811     5.77
## 4      Bremerton    834     5.93
## 5        Camacho    452     3.22
## 6    Guadalajara     75     0.53
## 7        Hidalgo    845     6.01
## 8    Los Angeles    926     6.59
## 9         Merida    654     4.65
## 10   Mexico City    194     1.38
## 11       Orizaba    464     3.30
## 12      Portland    876     6.23
## 13         Salem   1386     9.86
## 14    San Andres    621     4.42
## 15     San Diego    866     6.16
## 16 San Francisco    130     0.92
## 17       Seattle    922     6.56
## 18       Spokane    875     6.22
## 19        Tacoma   1257     8.94
## 20     Vancouver    633     4.50
## 21      Victoria    176     1.25
## 22   Walla Walla    160     1.14
## 23        Yakima    376     2.67

Salem có tần số cao nhất (1386 lần xuất hiện, chiếm 9.86). Tiếp theo là Tacoma (1257 lần, 8.94%).

Guadalajara có tần số thấp nhất (75 lần, chỉ 0.53%).

Nhìn chung, số lượng khách hàng ở các thành phố phân bố khá chênh lệch, điều này có thể dẫn đến những kết quả thiên lệch trong việc phân tích và so sánh giữa các thành phố.

ggplot(a, aes(x = City)) +
  geom_bar(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))

6. StateorProvince

thong_ke_dinh_tinh(a,'StateorProvince')
##      Gia_tri Tan_so Tan_suat
## 1         BC    809     5.75
## 2         CA   2733    19.44
## 3         DF    815     5.80
## 4   Guerrero    383     2.72
## 5    Jalisco     75     0.53
## 6         OR   2262    16.09
## 7   Veracruz    464     3.30
## 8         WA   4567    32.48
## 9    Yucatan    654     4.65
## 10 Zacatecas   1297     9.23

WA (Washington) chiếm tỷ lệ áp đảo (32.48%, 4567 lần xuất hiện), CA (California) đứng thứ hai (19.44%, 2733 lần), OR (Oregon) đứng thứ ba (16.09%, 2262 lần). => Ba bang này thuộc Tây Bắc Thái Bình Dương của Hoa Kỳ chiếm tổng cộng 68.01% dữ liệu

Các tỉnh Mexico (DF, Guerrero, Jalisco, Veracruz, Yucatan, Zacatecas) có tần suất thấp hơn nhiều. Tổng cộng các tỉnh Mexico chỉ chiếm khoảng 26.23% dữ liệu

Kết quả này cho thấy sự tập trung địa lý rõ rệt trong tập dữ liệu, với phần lớn dữ liệu đến từ ba bang phía Tây Bắc Hoa Kỳ.

ggplot(a, aes(x = StateorProvince)) +
  geom_bar(fill = "#FFCC99", 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))

7. Country

thong_ke_dinh_tinh(a,'Country')
##   Gia_tri Tan_so Tan_suat
## 1  Canada    809     5.75
## 2  Mexico   3688    26.23
## 3     USA   9562    68.01

Dữ liệu cho thấy sự phân bố không đồng đều giữa các quốc gia, với Hoa Kỳ (USA) chiếm tỷ lệ áp đảo (68.01%, 9.562 lần xuất hiện), tiếp theo là Mexico (26.23%, 3.688 lần) và Canada (5.75%, 809 lần). Điều này cho thấy tập dữ liệu chủ yếu tập trung vào thị trường Mỹ, có thể do dữ liệu được thu thập từ nguồn ưu tiên các giao dịch hoặc sự kiện tại Hoa Kỳ.

ggplot(a, aes(x = Country)) +
  geom_bar(fill = "#00FFCC", 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 = 45, hjust = 1))

8. ProductFamily

thong_ke_dinh_tinh(a,'ProductFamily')
##          Gia_tri Tan_so Tan_suat
## 1          Drink   1250     8.89
## 2           Food  10153    72.22
## 3 Non-Consumable   2656    18.89

Dữ liệu cho thấy sản phẩm thực phẩm (Food) chiếm tỷ lệ áp đảo (72.22%, 10.153 lần xuất hiện), trong khi nhóm đồ uống (Drink) chỉ chiếm 8.89% và sản phẩm không tiêu dùng (Non-Consumable) chiếm 18.89%. Sự chênh lệch rõ rệt này (Food gấp 8 lần Drink và gần 4 lần Non-Consumable) phản ánh trọng tâm của tập dữ liệu chủ yếu tập trung vào các sản phẩm thực phẩm.

ggplot(a, aes(x = ProductFamily)) +
  geom_bar(fill = "#CCFF66", color = "black") +
  labs(x = "Sản phẩm", y = "Tần số", title = "Phân khúc sản phẩm khách hàng mua") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

9. ProductDepartment

thong_ke_dinh_tinh(a,'ProductDepartment')
##                Gia_tri Tan_so Tan_suat
## 1  Alcoholic Beverages    356     2.53
## 2          Baked Goods    425     3.02
## 3         Baking Goods   1072     7.63
## 4            Beverages    680     4.84
## 5      Breakfast Foods    188     1.34
## 6         Canned Foods    977     6.95
## 7      Canned Products    109     0.78
## 8             Carousel     59     0.42
## 9             Checkout     82     0.58
## 10               Dairy    903     6.42
## 11                Deli    699     4.97
## 12                Eggs    198     1.41
## 13        Frozen Foods   1382     9.83
## 14  Health and Hygiene    893     6.35
## 15           Household   1420    10.10
## 16                Meat     89     0.63
## 17         Periodicals    202     1.44
## 18             Produce   1994    14.18
## 19             Seafood    102     0.73
## 20         Snack Foods   1600    11.38
## 21              Snacks    352     2.50
## 22       Starchy Foods    277     1.97

Tập trung vào thực phẩm tươi và đồ gia dụng: Hai nhóm Produce và Household chiếm tổng cộng gần 25% dữ liệu, cho thấy đây có thể là các mặt hàng chủ lực.

Sự thiếu cân đối rõ rệt: Trong khi một số nhóm như Produce chiếm tới 14.18% thì nhiều nhóm khác như Meat, Seafood lại chiếm chưa tới 1%.

ggplot(a, aes(x = ProductDepartment)) +
  geom_bar(fill = "#99CC99", 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))

10. ProductCategory

thong_ke_dinh_tinh(a,'ProductCategory')
##                 Gia_tri Tan_so Tan_suat
## 1          Baking Goods    484     3.44
## 2     Bathroom Products    365     2.60
## 3         Beer and Wine    356     2.53
## 4                 Bread    425     3.02
## 5       Breakfast Foods    417     2.97
## 6               Candles     45     0.32
## 7                 Candy    352     2.50
## 8      Canned Anchovies     44     0.31
## 9          Canned Clams     53     0.38
## 10       Canned Oysters     35     0.25
## 11      Canned Sardines     40     0.28
## 12        Canned Shrimp     38     0.27
## 13          Canned Soup    404     2.87
## 14          Canned Tuna     87     0.62
## 15 Carbonated Beverages    154     1.10
## 16    Cleaning Supplies    189     1.34
## 17        Cold Remedies     93     0.66
## 18                Dairy    903     6.42
## 19        Decongestants     85     0.60
## 20               Drinks    135     0.96
## 21                 Eggs    198     1.41
## 22           Electrical    355     2.53
## 23      Frozen Desserts    323     2.30
## 24       Frozen Entrees    118     0.84
## 25                Fruit    765     5.44
## 26             Hardware    129     0.92
## 27        Hot Beverages    226     1.61
## 28              Hygiene    197     1.40
## 29     Jams and Jellies    588     4.18
## 30     Kitchen Products    217     1.54
## 31            Magazines    202     1.44
## 32                 Meat    761     5.41
## 33        Miscellaneous     42     0.30
## 34  Packaged Vegetables     48     0.34
## 35       Pain Relievers    192     1.37
## 36       Paper Products    345     2.45
## 37                Pizza    194     1.38
## 38     Plastic Products    141     1.00
## 39 Pure Juice Beverages    165     1.17
## 40              Seafood    102     0.73
## 41          Side Dishes    153     1.09
## 42          Snack Foods   1600    11.38
## 43            Specialty    289     2.06
## 44        Starchy Foods    277     1.97
## 45           Vegetables   1728    12.29

Dữ liệu cho thấy Snack Foods (11.38%) và Vegetables (12.29%) là hai danh mục phổ biến nhất, chiếm tổng cộng gần 1/4 dữ liệu. Các danh mục đáng chú ý khác bao gồm Dairy (6.42%), Fruit (5.44%), và Meat (5.41%), trong khi nhiều danh mục như đồ hải sản đóng hộp (Canned Oysters 0.25%, Canned Shrimp 0.27%) hoặc các sản phẩm ít phổ biến (Candles 0.32%, Miscellaneous 0.30%) có tần suất rất thấp. Sự phân bố này phản ánh tập trung chính vào các mặt hàng tiêu dùng nhanh và thực phẩm tươi sống, trong khi các sản phẩm đặc biệt hoặc ít phổ biến chỉ chiếm tỷ lệ nhỏ.

ggplot(a, aes(x = ProductCategory)) +
  geom_bar(fill = "#66CC99", 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))