library(xlsx)
library(ggplot2)
library(dplyr)
library(csv)
library(scales)
library(DT)

1 Tìm hiểu và chuẩn bị dữ liệu

Nhập dữ liệu

data <- read.csv("D:\\Downloads\\Supermarket Transactions.csv", header = T)

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  "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ị các dòng đầu và dòng cuối của dữ liệu

datatable(head(data),options = list(scrollX = TRUE))
datatable(tail(data),options = list(scrollX = TRUE))

Kiểm tra giá trị thiếu

colSums(is.na(data))
##                 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
# Kiểm tra kiểu dữ liệu của các cột
sapply(data, class)
##                 X      PurchaseDate        CustomerID            Gender 
##         "integer"       "character"         "integer"       "character" 
##     MaritalStatus         Homeowner          Children      AnnualIncome 
##       "character"       "character"         "integer"       "character" 
##              City   StateorProvince           Country     ProductFamily 
##       "character"       "character"       "character"       "character" 
## ProductDepartment   ProductCategory         UnitsSold           Revenue 
##       "character"       "character"         "integer"         "numeric"

2 Phân tích Mô tả Một biến Định tính (Univariate Descriptive Analysis)

2.1 Biến Gender

Thống kê tần suất

## 
##    F    M 
## 7170 6889
## 
##         F         M 
## 0.5099936 0.4900064

Trực quan hóa

gender_count <- data %>%
  count(Gender) %>%
  mutate(prop = n / sum(n),
         label = paste0(Gender, " (", percent(prop)))

gender_percent <- gender_count %>%
  mutate(Percentage = round(prop * 100, 2))

ggplot(gender_percent, aes(x = "", y = Percentage, fill = Gender)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(Percentage, "%")), position = position_stack(vjust = 0.5)) +
  labs(title = "Tỷ lệ khách hàng theo giới tính") +
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) 

Nhận xét: Phân bố giới tính trong tập dữ liệu khá đồng đều, với tỷ lệ nam giới chiếm 50.21% và nữ giới chiếm 49.79%. Sự cân bằng này cho thấy không có thiên lệch đáng kể trong cơ cấu khách hàng theo giới tính.

2.2 Biến MaritalStatus

Thống kê tần suất

## 
##    M    S 
## 6866 7193
## 
##         M         S 
## 0.4883704 0.5116296

Trực quan hóa

marital_count <- data %>%
  count(MaritalStatus) %>%
  mutate(prop = n / sum(n),
         label = paste0(MaritalStatus, " (", scales::percent(prop)))

marital_percent <- marital_count %>%
  mutate(Percentage = round(prop * 100, 2))

ggplot(marital_percent, aes(x = "", y = Percentage, fill = MaritalStatus)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(Percentage, "%")), position = position_stack(vjust = 0.5)) +
  labs(title = "Tỷ lệ khách hàng theo tình trạng hôn nhân") +
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) +
  scale_fill_brewer(palette = "Set2")  

Nhận xét: Nhóm khách hàng độc thân chiếm tỷ lệ 51.16%. Trong khi đó, nhóm đã kết hôn chiếm 48.84%. Như vậy, nhóm độc thân chiếm tỷ lệ cao hơn một chút so với nhóm đã kết hôn. Sự chênh lệch giữa hai nhóm không lớn, chỉ khoảng 2.32%. Điều này cho thấy số lượng khách hàng giữa hai nhóm khá cân bằng, không có nhóm nào chiếm số lượng vượt trội.

2.3 Biến Homeowner

Thống kê tần suất

table(data$Homeowner)
## 
##    N    Y 
## 5615 8444
table(data$Homeowner)/sum(table(data$Homeowner))
## 
##         N         Y 
## 0.3993883 0.6006117

Trực quan hóa

homeowner_count <- data %>%
  count(Homeowner) %>%
  mutate(prop = n / sum(n),
         label = paste0(Homeowner, " (", scales::percent(prop)))

homeowner_percent <- homeowner_count %>%
  mutate(Percentage = round(prop * 100, 2))

ggplot(homeowner_percent, aes(x = "", y = Percentage, fill = Homeowner)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(Percentage, "%")), position = position_stack(vjust = 0.5)) +
  labs(title = "Tỷ lệ khách hàng theo tình trạng sở hữu nhà") +  
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) 

Nhận xét: Khách hàng sở hữu nhà chiếm tỷ lệ 60.06%, trong khi khách hàng không sở hữu nhà chỉ chiếm 39.94%. Như vậy, phần lớn khách hàng trong dữ liệu là người sở hữu nhà. Tỷ lệ giữa hai nhóm có sự chênh lệch rõ rệt, với nhóm có nhà nhiều hơn gần 20% so với nhóm không có nhà.

2.4 Biến AnnualIncome

Thống kê tần suất

table(data$AnnualIncome)
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
table(data$AnnualIncome) / sum(table(data$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

Trực quan hóa

# Tính tỷ lệ % cho các nhóm thu nhập
AnnualIncome_count <- data %>%
  count(AnnualIncome) %>%
  mutate(prop = n / sum(n),
         label = paste0(AnnualIncome, " (", scales::percent(prop)))

AnnualIncome_percent <- AnnualIncome_count %>%
  mutate(Percentage = round(prop * 100, 2))

ggplot(AnnualIncome_percent, aes(x = "", y = Percentage, fill = AnnualIncome)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(Percentage, "%")), position = position_stack(vjust = 0.5), size = 3) +
  labs(title = "Tỷ lệ khách hàng theo thu nhập hàng năm") +  
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold")) 

Nhận xét: nhóm khách hàng có thu nhập $30K – $50K chiếm tỷ trọng lớn nhất, đạt khoảng 32.73%, nhóm tiếp theo là $10K – $30K (21.98%) và $50K – $70K (16.86%). Trong khi đó, các nhóm thu nhập cao như $110K – $130K, $130K – $150K và $150K+ chỉ chiếm lần lượt 4.57%, 5.41% và 1.94%, cho thấy đối tượng khách hàng giàu có chiếm tỷ lệ nhỏ trong tập dữ liệu. Nhóm $90K – $110K cũng chỉ chiếm 4.36%, thấp hơn đáng kể so với các nhóm thu nhập thấp hơn.

2.5 Biến City

Thống kê tần suất

table(data$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
table(data$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

Trưc quan hóa

# Tính tỷ lệ % cho các thành phố
city_count <- data %>%
  count(City) %>%
  mutate(prop = n / sum(n),
         Percentage = round(prop * 100, 1))

# Vẽ biểu đồ cột
ggplot(city_count, aes(x = reorder(City, -Percentage), y = Percentage, fill = City)) +
  geom_col(width = 0.7) +  # Độ rộng cột
  geom_text(aes(label = paste0(Percentage, "%")), 
            vjust = -0.5,  # Đặt nhãn phía trên cột
            size = 2.5) +
  labs(title = "Tỷ lệ khách hàng theo thành phố",
       x = NULL,  # Ẩn nhãn trục x
       y = "Tỷ lệ (%)") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +  # Thêm khoảng trống phía trên
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
        axis.text.x = element_text(angle = 45, hjust = 1, size = 6),  # Xoay nhãn trục x 45 độ
        legend.position = "none")  # Ẩn chú thích

Nhận xét: Khách hàng phân bố không đều giữa các thành phố. Một số khu vực có lượng khách hàng rất cao, trong khi nhiều thành phố khác chỉ chiếm tỷ lệ nhỏ. Cụ thể thành phố Salem chiếm tỷ lệ cao nhất với 9.9%, theo sau là Tacoma với 8.9%. Đây là hai nơi tập trung nhiều khách hàng nhất trong bộ dữ liệu.Các thành phố như Los Angeles, Seattle, Portland, San Diego và Spokane đều có tỷ lệ dao động từ 6.2% – 6.6%, chứng tỏ đây cũng là những khu vực có lượng khách hàng đáng kể.Trong khi đó, Một số thành phố như Yakima, Mexico City, Wenatchee, Walla Walla, Bellingham, San Francisco và Guadalupe có tỷ lệ thấp, chỉ dưới 2%. Guadalupe có tỷ lệ thấp nhất, chỉ 0.5%.

2.6 Biến StateorProvince

Thống kê Tần suất

table(data$StateorProvince)
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
table(data$StateorProvince) / sum(table(data$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

Trục qưan hóa

# Tính toán dữ liệu
state_count <- data %>%
  count(StateorProvince) %>%
  mutate(Percentage = round(n / sum(n) * 100, 2)) %>%
  arrange(-Percentage)  # Sắp xếp giảm dần

# Vẽ biểu đồ cột
ggplot(state_count, aes(x = reorder(StateorProvince, Percentage), 
                       y = Percentage, 
                       fill = Percentage)) +  # Dùng gradient màu theo %
  geom_col(width = 0.7) +
  geom_text(aes(label = paste0(Percentage, "%")), 
            vjust = -0.8, 
            size = 3) + 
  labs(title = "Tỷ lệ khách hàng theo bang",
       x = NULL,
       y = "Tỷ lệ (%)") +
  scale_fill_gradient(low = "lightblue", high = "#08519c") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    legend.position = "none"
  )

Nhận xét: Tỷ lệ khách hàng theo bang cho thấy sự phân bố không đồng đều giữa các khu vực. Bang WA (Washington) chiếm tỷ lệ cao nhất với 32.48%, tiếp theo là CA (California) với 19.44% và OR (Oregon) với 16.09%. Đây là ba bang có lượng khách hàng đông đảo nhất. Trong khi đó, các bang như Zacatecas (9.23%), DF (5.8%) và BC (5.75%) thuộc nhóm trung bình. Các bang còn lại như Yucatan, Veracruz, Guerrero và đặc biệt là Jalisco với chỉ 0.53% có tỷ lệ khách hàng rất thấp. Điều này cho thấy khách hàng tập trung chủ yếu ở một số bang nhất định, đặc biệt là các bang thuộc khu vực phía tây nước Mỹ.

2.7 Biến Country

Thống kê tần suất

table(data$Country)
## 
## Canada Mexico    USA 
##    809   3688   9562
table(data$Country) / sum(table(data$Country))
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372

Trực quan hóa

# Tính toán dữ liệu
country_count <- data %>%
  count(Country) %>%
  mutate(prop = n / sum(n),
         label = paste0(Country, " (", scales::percent(prop)))  # Thêm % vào nhãn

country_percent <- country_count %>%
  mutate(Percentage = round(prop * 100, 2))

# Vẽ biểu đồ tròn
ggplot(country_percent, aes(x = "", y = Percentage, fill = Country)) +
  geom_bar(stat = "identity", width = 1, color = "white") +  # Thêm viền trắng
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(Percentage, "%")), 
            position = position_stack(vjust = 0.5),
            size = 3) +
  labs(title = "Tỷ lệ khách hàng theo quốc gia") +
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
        legend.position = "right") +  # Hiển thị chú thích bên phải
  scale_fill_brewer(palette = "Set2")  # Màu sắc rõ ràng

Nhận xét: Tỷ lệ khách hàng theo quốc gia cho thấy phần lớn khách hàng đến từ Hoa Kỳ (USA) với 68.01%, tiếp theo là Mexico chiếm 26.23% và cuối cùng là Canada với 5.75%. Điều này cho thấy thị trường chủ yếu tập trung ở Mỹ, chiếm hơn 2/3 tổng số khách hàng. Mexico cũng là thị trường tiềm năng với hơn 1/4 khách hàng, trong khi Canada chiếm tỷ lệ thấp nhất.

2.8 Biến ProductFamily

Thống kê tần suất

table(data$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
table(data$ProductFamily) / sum(table(data$ProductFamily))
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813

Trực quan hóa

product_count <- data %>%
  count(ProductFamily) %>%  # Đổi thành ProductFamily
  mutate(prop = n / sum(n),
         label = paste0(ProductFamily, " (", scales::percent(prop)))  

product_percent <- product_count %>%
  mutate(Percentage = round(prop * 100, 2))

ggplot(product_percent, aes(x = "", y = Percentage, fill = ProductFamily)) +  # Đổi fill
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(Percentage, "%")), 
            position = position_stack(vjust = 0.5),
            size = 3) +
  labs(title = "Tỷ lệ khách hàng theo dòng sản phẩm") +  # Đổi tiêu đề
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"))+
    scale_fill_brewer(palette = "Pastel1", direction = -1)

Nhận xét: Dòng sản phẩm được khách hàng lựa chọn nhiều nhất là thực phẩm (Food), chiếm tới 72.22% tổng số khách hàng. Dòng sản phẩm không tiêu dùng (Non-Consumable) đứng thứ hai với 18.89%, trong khi đồ uống (Drink) chiếm tỷ lệ nhỏ nhất chỉ 8.89%. Điều này cho thấy thực phẩm là nhóm sản phẩm chủ lực, được tiêu thụ nhiều hơn hẳn so với hai nhóm còn lại.

2.9 Biến ProductDepartment

Thống kê tần suất

table(data$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
table(data$ProductDepartment) / sum(table(data$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

Trực quan hóa

dept_count <- data %>%
  count(ProductDepartment) %>%
  mutate(Percentage = round(n / sum(n) * 100, 1)) %>%
  arrange(-Percentage)  # Sắp xếp giảm dần

ggplot(dept_count, aes(x = reorder(ProductDepartment, Percentage), 
                       y = Percentage, 
                       fill = Percentage)) +  # Giữ nguyên gradient
  geom_col(width = 0.7) +
  geom_text(aes(label = paste0(Percentage, "%")), 
            vjust = -0.5,
            size = 2.5) + 
  labs(title = "Tỷ lệ khách hàng theo ngành sản phẩm", 
       x = NULL,
       y = "Tỷ lệ (%)") +
  scale_fill_gradient(low = "lightblue", high = "green") +  
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    legend.position = "none",
    axis.text.x = element_text(angle = 45, hjust = 1, size = 6) 
  )

Nhẫn xét: Sự phân bố khách hàng không đồng đều giữa các ngành hàng. Nhóm sản phẩm “Produce” (Rau củ quả) chiếm tỷ lệ cao nhất với 14.2%, cho thấy đây là mặt hàng được ưa chuộng và tiêu dùng thường xuyên nhất. Tiếp theo là “Snack Foods” (11.4%) và “Household” (10.1%), phản ánh nhu cầu lớn đối với đồ ăn vặt và các sản phẩm gia dụng. Các ngành như “Frozen Foods”, “Baking Goods”, “Canned Foods” và “Health and Hygiene” cũng có tỷ lệ khách hàng đáng kể, dao động từ 6.4% đến 9.8%, cho thấy mức tiêu thụ ổn định đối với các mặt hàng thiết yếu. Ngược lại, các ngành như “Check-out”, “Meat”, “Seafood”, “Canned Products” hay “Breakfast Foods” có tỷ lệ rất thấp, dưới 1%, trong đó thấp nhất là “Cheese” với chỉ 0.4%. Điều này phản ánh xu hướng tiêu dùng tập trung nhiều vào các sản phẩm thiết yếu, dễ sử dụng và bảo quản, trong khi các mặt hàng chuyên biệt có mức độ thu hút thấp hơn.

2.10 Biến ProductCategory

Thống kê tần suất

table(data$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
table(data$ProductCategory) / sum(table(data$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

Nhận xét: sự phân bố khách hàng khá đa dạng nhưng không đồng đều giữa các nhóm hàng. Danh mục “Vegetables” chiếm tỷ lệ cao nhất với 12.29%, tiếp theo là “Snack Foods” (11.38%) và “Dairy” (6.42%), phản ánh xu hướng tiêu dùng tập trung vào các sản phẩm thiết yếu và được sử dụng thường xuyên. Những nhóm như “Fruit” (5.44%), “Meat” (5.41%) và “Jams and Jellies” (4.18%) cũng đạt tỷ lệ đáng kể, cho thấy nhu cầu lớn từ phía khách hàng. Ngược lại, các danh mục như “Canned Oysters”, “Canned Sardines”, “Candles” và “Miscellaneous” chỉ dao động quanh mức 0.2% – 0.3%, cho thấy đây là những mặt hàng ít phổ biến và ít được lựa chọn hơn.

3 Ước lượng khoảng và kiểm định giả thuyết cho tỷ lệ (Một biến)

3.1 Biến Homeowner

Ước lượng Khoảng tin cậy 95% cho số khách hàng sở hữu nhà

data_H_Y <- sum(data$Homeowner == "Y")

prop.test(data_H_Y, length(data$Homeowner), conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  data_H_Y out of length(data$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

Tức là với mức tin cậy 95%, tỷ lệ thật khách hàng sở hữu nhà nằm trong khoảng từ 59.25% đến 60.87%

Bài toán kiểm định

\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ sở hữu nhà trong tổng số khách hàng là 60% } \\\\ H_1: & \text{Tỷ lệ sở hữu nhà trong tổng số khách hàng khác 60%.} \ \end{array} \right. \]

prop.test(data_H_Y,length(data$Homeowner), p = 0.6, alternative = "two.sided", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  data_H_Y out of length(data$Homeowner), null probability 0.6
## X-squared = 0.019445, df = 1, p-value = 0.8891
## alternative hypothesis: true p is not equal to 0.6
## 95 percent confidence interval:
##  0.5924537 0.6087145
## sample estimates:
##         p 
## 0.6006117

Kết quả kiểm định giả thuyết tỷ lệ cho thấy p-value = 0.8891 > 0.05, vì vậy không đủ cơ sở thống kê để bác bỏ giả thuyết H₀ hay với mức ý nghĩa 5% thì tỷ lệ số khách hàng sở hữu nhà là 60%.

3.2 Biến MaritalStatus

Ước lượng Khoảng Tin cậy 95% cho số số khách hàng đã kết hôn

data_M_M <- sum(data$MaritalStatus == "M")

prop.test(data_M_M, length(data$MaritalStatus), conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  data_M_M out of length(data$MaritalStatus), 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

Với độ tin cậy 95%, tỷ lệ người đã kết hôn trong tổng số khách hàng là từ 48.01% đến 49.67%.

Bài toán kiểm định

\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ đã kết hôn trong tổng số khách hàng là ít nhất 50% .} \\\\ H_1: & \text{Tỷ lệ đã kết hôn trong tổng số khách hàng là nhỏ hơn 50% .} \ \end{array} \right. \]

prop.test(data_M_M, length(data$MaritalStatus), p = 0.5, alternative = "less", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  data_M_M out of length(data$MaritalStatus), null probability 0.5
## X-squared = 7.5593, df = 1, p-value = 0.002985
## alternative hypothesis: true p is less than 0.5
## 95 percent confidence interval:
##  0.0000000 0.4953419
## sample estimates:
##         p 
## 0.4883704

Vì p-value < 0.05, ta bác bỏ giả thuyết H₀ hay với mức ý nghĩa 5%, tỷ lệ khách hàng đã kết hôn nhỏ hơn 50% trong tổng số khách hàng.

3.3 Biến ProductFamily

Ước lượng Khoảng Tin cậy 95% cho số khách hàng mua thực phẩm

data_P_F <- sum(data$ProductFamily == "Food")

prop.test(data_P_F, length(data$ProductFamily), conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  data_P_F out of length(data$ProductFamily), null probability 0.5
## X-squared = 2774.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.7146709 0.7295489
## sample estimates:
##         p 
## 0.7221709

Với độ tin cậy 95%, tỷ lệ khách hàng mua hàng thuôc dòng thực phẩm là từ 71.47% đến 72.95%.

Bài toán kiểm định

\[ \left\{ \begin{array}{ll} H_0: & \text{Tỷ lệ khách hàng mua thực phẩm không vượt quá 70% } \\\\ H_1: & \text{Tỷ lệ khách hàng mua thực phẩm lớn hơn 70%} \ \end{array} \right. \]

prop.test(data_P_F, length(data$ProductFamily), p = 0.7, alternative = "greater", conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  data_P_F out of length(data$ProductFamily), null probability 0.7
## X-squared = 32.802, df = 1, p-value = 5.101e-09
## alternative hypothesis: true p is greater than 0.7
## 95 percent confidence interval:
##  0.7158789 1.0000000
## sample estimates:
##         p 
## 0.7221709

Vì p-value < 0.05, ta bác bỏ giả thuyết H₀ hay với mức ý nghĩa 5%, tỷ lệ khách hàng thực phẩm lớn hơn 70% trong tổng số khách hàng.

4 Phân tích mối quan hệ giữa hai biến định tính (Bivariate Analysis)

4.1 MaritalStatus và Homeowner

Bảng tần suất chéo

table(data$MaritalStatus, data$Homeowner)
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297
prop.table(table(data$MaritalStatus, data$Homeowner), margin = 1)
##    
##             N         Y
##   M 0.2503641 0.7496359
##   S 0.5416377 0.4583623

Trực quan hóa

df_MH <- data %>%
  count(MaritalStatus, Homeowner) %>%
  group_by(MaritalStatus) %>%
  mutate(Percent = n / sum(n) * 100)

ggplot(df_MH, aes(x = MaritalStatus, y = Percent, fill = Homeowner)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  geom_text(aes(label = paste0(round(Percent, 2), "%")), 
            position = position_dodge(width = 0.7), 
            vjust = -0.5, size = 3) +
  labs(title = "Tỷ lệ sở hữu nhà theo tình trạng hôn nhân",
       x = "MaritalStatus",
       y = "Tỷ lệ (%)",
       fill = "Homeowner") +
  theme_minimal()+
 theme(
     plot.title = element_text(hjust = 0.6, size = 13, face = "bold")
  )

Nhận xét mô tả

Ở nhóm khách hàng đã kết hôn, phần lớn có sở hữu nhà. Cụ thể, khoảng 74.96% khách hàng trong nhóm này sở hữu nhà, trong khi chỉ 25.04% là không sở hữu. Đây là một tỷ lệ sở hữu nhà khá cao. Ngược lại, ở nhóm khách hàng chưa kết hôn, tỷ lệ sở hữu nhà lại thấp hơn. Chỉ 45.84% khách hàng chưa kết hôn có sở hữu nhà, trong khi phần lớn (54.16%) không sở hữu.

Từ biểu đồ, chúng ta có thể thấy một xu hướng rõ ràng: Khách hàng đã kết hôn có xu hướng sở hữu nhà cao hơn so với khách hàng chưa kết hôn. Điều này có thể phản ánh thực tế rằng người đã lập gia đình thường có nhu cầu và khả năng tài chính ổn định hơn để mua nhà.

Kiểm định Thống kê

\[ \left\{ \begin{array}{ll} H_0: & \text{Tình trạng hôn nhân và tình trạng sở hữu nhà là độc lập nhau} \\\\ H_1: & \text{Tình trạng hôn nhân và tình trạng sở hữu nhà có môi liên quan với nhau.} \ \end{array} \right. \]

chisq.test(table(data$MaritalStatus, data$Homeowner))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$MaritalStatus, data$Homeowner)
## 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: 1241.2

  • Bậc tự do (df): 1

  • Giá trị p: < 2.2e-16

Nhận xét

Vì p-value < 0.05, ta bác bỏ giả thuyết H₀. Điều này cho thấy với mức ý nghĩa 5% thì có mối quan hệ giữa tình trạng hôn nhân và việc sở hữu nhà.

Thảo luận

Kết quả kiểm định khẳng định rằng có mối liên quan giữa việc sở hữu nhà với tình trạng hôn nhân. Điều này phù hợp với kết quả của bảng tần số: tỷ lệ người đã kết hôn sở hữu nhà cao hơn nhiều so với người độc thân. Có thể lý giải rằng người đã kết hôn thường có xu hướng ổn định về nhà ở hơn, hoặc có khả năng tài chính tốt hơn để mua nhà.

4.2 Gender và ProductFamily

Bảng tần suất chéo

table(data$Gender, data$ProductFamily)
##    
##     Drink Food Non-Consumable
##   F   669 5149           1352
##   M   581 5004           1304
prop.table(table(data$Gender, data$ProductFamily), margin = 1)
##    
##          Drink       Food Non-Consumable
##   F 0.09330544 0.71813110     0.18856346
##   M 0.08433735 0.72637538     0.18928727

Trực quan hóa

df_GP <- data %>%
  count(Gender, ProductFamily) %>%
  group_by(Gender) %>%
  mutate(Percent = n / sum(n) * 100)

ggplot(df_GP, aes(x = Gender, y = Percent, fill = ProductFamily)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.7), width = 0.6) +
  geom_text(aes(label = paste0(round(Percent, 2), "%")), 
            position = position_dodge(width = 0.7), 
            vjust = -0.5, size = 3) +
  labs(title = "Tỷ lệ phân bổ dòng sản phẩm theo giới tính",
       x = "Gender",
       y = "Tỷ lệ (%)",
       fill = "ProductFamily") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 13, face = "bold"),
  )

Nhận xét mô tả

Ở nhóm khách hàng nữ, phần lớn mua các sản phẩm thuộc nhóm Food, chiếm tới 71.81%. Nhóm sản phẩm Non-Consumable chiếm tỷ lệ nhỏ hơn (18.86%), trong khi Drink là dòng sản phẩm ít phổ biến nhất với chỉ 9.33%. Điều này cho thấy thực phẩm là nhu cầu mua sắm chủ yếu của khách hàng nữ.

Tương tự, ở nhóm khách hàng nam, sản phẩm Food cũng chiếm ưu thế rõ rệt với tỷ lệ 72.64%. Các sản phẩm Non-Consumable chiếm tỷ lệ tương đương với nhóm nữ (18.93%), còn sản phẩm Drink có tỷ lệ thấp nhất là 8.43%.

Từ biểu đồ, có thể thấy rằng bất kể giới tính, khách hàng đều có xu hướng ưu tiên mua sắm các sản phẩm thuộc dòng Food, trong khi dòng Drink chỉ chiếm một tỷ lệ nhỏ. Tuy nhiên, sự chênh lệch giữa nam và nữ là không đáng kể, cho thấy hành vi tiêu dùng theo dòng sản phẩm khá tương đồng giữa hai giới.

Kiểm định Thống kê

\[ \left\{ \begin{array}{ll} H_0: & \text{Giới tính và dòng sản phẩm là độc lập nhau} \\\\ H_1: & \text{Giới tính và dòng sản phẩm có môi liên quan với nhau.} \ \end{array} \right. \]

chisq.test(table(data$Gender, data$ProductFamily))
## 
##  Pearson's Chi-squared test
## 
## data:  table(data$Gender, data$ProductFamily)
## 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: 3.5185

  • Bậc tự do (df): 2

  • Giá trị p: 0.1722

Nhận xét

Vì p-value > 0.05 nên không đủ điều kiện bác bỏ giả thuyết H₀. Điều này cho thấy không có mối quan hệ giữa giới tính và dòng sản phẩm. Nói cách khác, lựa chọn dòng sản phẩm của khách hàng không khác biệt đáng kể giữa nam và nữ.

Thảo luận

Kết quả kiểm định cho thấy không có mối liên quan có ý nghĩa thống kê giữa giới tính và dòng sản phẩm. Điều này cũng phù hợp với biểu đồ phân bố: tỷ lệ lựa chọn các dòng sản phẩm giữa nam và nữ không có sự khác biệt đáng kể. Dù có một số chênh lệch nhỏ về tỷ lệ, chẳng hạn như nữ có xu hướng mua đồ uống nhiều hơn nam, nhưng mức độ chênh lệch này không đủ lớn để kết luận rằng giới tính ảnh hưởng đến lựa chọn dòng sản phẩm.

4.3 Gender và Homeowner

Bảng tần suất chéo

table(data$AnnualIncome, data$Homeowner)
##                
##                    N    Y
##   $10K - $30K   1359 1731
##   $110K - $130K  119  524
##   $130K - $150K  136  624
##   $150K +         48  225
##   $30K - $50K   2087 2514
##   $50K - $70K   1063 1307
##   $70K - $90K    686 1023
##   $90K - $110K   117  496
prop.table(table(data$AnnualIncome, data$Homeowner), margin = 1)
##                
##                         N         Y
##   $10K - $30K   0.4398058 0.5601942
##   $110K - $130K 0.1850700 0.8149300
##   $130K - $150K 0.1789474 0.8210526
##   $150K +       0.1758242 0.8241758
##   $30K - $50K   0.4535970 0.5464030
##   $50K - $70K   0.4485232 0.5514768
##   $70K - $90K   0.4014043 0.5985957
##   $90K - $110K  0.1908646 0.8091354

Trực quan hóa

df_income_homeowner <- data %>%
  count(AnnualIncome, Homeowner) %>%
  group_by(AnnualIncome) %>%
  mutate(Percent = n / sum(n) * 100)

ggplot(df_income_homeowner, aes(x = AnnualIncome, y = Percent, fill = Homeowner)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.7) +
  geom_text(aes(label = paste0(round(Percent, 2), "%")),
            position = position_dodge(width = 0.8),
            vjust = -0.5, size = 2) +
  labs(title = "Tỷ lệ chủ sở hữu nhà theo nhóm thu nhập",
       x = "Nhóm Thu nhập",
       y = "Tỷ lệ (%)",
       fill = "Homeowner") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.5, size = 13, face = "bold")
  )

Biểu đồ thể hiện tỷ lệ sở hữu nhà ở các nhóm thu nhập khác nhau cho thấy một xu hướng rõ rệt: thu nhập càng cao thì tỷ lệ sở hữu nhà càng lớn. Cụ thể, ở nhóm thu nhập thấp nhất từ $10K - $30K, chỉ có khoảng 56.02% khách hàng sở hữu nhà, trong khi 43.98% không sở hữu. Ngược lại, ở các nhóm thu nhập cao từ $110K trở lên, tỷ lệ sở hữu nhà luôn trên 80%.

Đối với các nhóm thu nhập trung bình từ $30K - $90K, tỷ lệ sở hữu nhà dao động trong khoảng 54% đến 60%, phản ánh một mức độ sở hữu tương đối cân bằng giữa hai nhóm “có” và “không” sở hữu nhà. Trong khi đó, mhóm thu nhập thấp ($10K - $30K) là nhóm duy nhất mà tỷ lệ không sở hữu nhà gần bằng tỷ lệ sở hữu, với 43.98% không sở hữu.

Kiểm định Thống kê

\[ \left\{ \begin{array}{ll} H_0: & \text{Việc sở hữu nhà và thu nhập nhập hàng năm là độc lập với nhau} \\\\ H_1: & \text{Việc sở hữu nhà và thu nhập hàng năm có mối liên quan với nhau.} \ \end{array} \right. \]

chisq.test(table(data$AnnualIncome, data$Homeowner))
## 
##  Pearson's Chi-squared test
## 
## data:  table(data$AnnualIncome, data$Homeowner)
## X-squared = 546.37, df = 7, p-value < 2.2e-16

Kết quả kiểm định

  • Giá trị thống kê Chi-bình phương: 546.37

  • Bậc tự do (df): 2

  • Giá trị p: 2.2e-16

Nhận xét

Vì p-value < 0.05 nên ta bác bỏ giả thuyết H₀. Điều này cho thấy với mức ý nghĩa 5% thì việc sở hữu nhà và mức thu nhập hàng năm có mối liên hệ với nhau.

Thảo luận

Kết quả phân tích cho thấy có mối liên hệ rất rõ ràng giữa mức thu nhập và khả năng sở hữu nhà. Tỷ lệ sở Kết quả cũng cho thấy sự chênh lệch rõ rệt giữa hai nhóm “có” và “không” sở hữu nhà trở nên lớn hơn ở các mức thu nhập cao, trong khi ở nhóm thu nhập thấp, tỷ lệ này tương đối cân bằng. Điều này cho thấy rằng thu nhập là yếu tố then chốt ảnh hưởng đến việc sở hữu nhà ở.

5 Tổng kết và Thảo luận

5.1 Tóm tắt những phát hiện chính

Kết quả phân tích cho thấy phần lớn khách hàng là nữ giới (chiếm khoảng 51%) và cư trú tại Hoa Kỳ (khoảng 68%). Điều này cho thấy thị trường chủ lực của doanh nghiệp đang tập trung ở Mỹ với đối tượng khách hàng chủ yếu là phụ nữ. Dòng sản phẩm “Food” chiếm tỷ trọng vượt trội (hơn 72%), thể hiện nhu cầu cao của người tiêu dùng đối với các sản phẩm thực phẩm. Kết quả kiểm định cũng ghi nhận mối quan hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và việc sở hữu nhà, cũng như giữa thu nhập và khả năng sở hữu nhà. Ngược lại, giới tính và dòng sản phẩm không có mối liên hệ đáng kể, cho thấy lựa chọn sản phẩm ít bị ảnh hưởng bởi yếu tố giới tính. Trong các danh mục cụ thể, nhóm sản phẩm như “Vegetables”, “Snack Foods” và “Dairy” có tỷ lệ tiêu dùng cao, phản ánh xu hướng tiêu dùng thiết yếu và tiện lợi.

5.2 Hạn chế của phân tích

Phân tích mới dừng ở mức mô tả, chưa đi sâu vào mô hình dự đoán hành vi khách hàng.

5.3 Đề xuất cho doanh nghiệp

Doanh nghiệp nên tiếp tục tập trung phát triển nhóm sản phẩm thực phẩm, đặc biệt là các danh mục đang được tiêu thụ nhiều như rau củ, đồ ăn nhẹ và sản phẩm từ sữa. Việc xây dựng các chiến lược marketing dựa trên tình trạng hôn nhân và thu nhập có thể giúp tiếp cận nhóm khách hàng tiềm năng hiệu quả hơn, nhất là với các sản phẩm giá trị cao hoặc dài hạn như gia dụng. Vì giới tính không tạo ra sự khác biệt đáng kể trong hành vi tiêu dùng, nên doanh nghiệp có thể cân nhắc giảm trọng số của yếu tố này trong các chiến dịch quảng cáo hoặc điều chỉnh linh hoạt để tiết kiệm chi phí truyền thông.

5.4 Câu hỏi mở và hướng nghiên cứu tiếp theo

Một số hướng nghiên cứu tiếp theo có thể giúp mở rộng phân tích hiện tại. Chẳng hạn, việc tìm hiểu hành vi tiêu dùng theo mùa vụ hoặc thời điểm trong năm sẽ mang lại thông tin hữu ích để tối ưu hóa hàng tồn kho và chương trình khuyến mãi. Ngoài ra, khai thác thêm dữ liệu về số lần mua hàng, giá trị trung bình mỗi đơn hàng hoặc thời gian giữa các lần mua sẽ giúp doanh nghiệp đánh giá khả năng giữ chân khách hàng và xây dựng chiến lược chăm sóc phù hợp. Các mô hình phân tích nâng cao như dự báo nhu cầu, phân cụm khách hàng hay phân tích giá trị vòng đời khách hàng (CLV) cũng có thể là hướng phát triển tiềm năng trong các nghiên cứu tiếp theo.