Phần 1: Giới thiệu tổng quan bộ dữ liệu bán bánh Taco (Taco Sales)

Bộ dữ liệu Taco Sales mô phỏng dữ liệu bán hàng Taco của các nhà hàng trên nhiều thành phố Hoa Kỳ từ ngày 01/01/2024 đến ngày 25/05/2025. Bộ dữ liệu được thu thập và công bố tại https://www.kaggle.com/datasets/atharvasoundankar/taco-sales-dataset-20242025

# Tải và đọc file dữ liệu
sl <- read.csv("D:/AnhThu/DATA_DT/Taco Sales.csv")
sl
# Xem cấu trúc của bộ dữ liệu
str(sl)
## 'data.frame':    1000 obs. of  13 variables:
##  $ Order.ID               : int  770487 671858 688508 944962 476417 678856 183667 379946 771088 694731 ...
##  $ Restaurant.Name        : chr  "El Taco Loco" "El Taco Loco" "Taco Haven" "Spicy Taco House" ...
##  $ Location               : chr  "New York" "San Antonio" "Austin" "Dallas" ...
##  $ Order.Time             : chr  "01-08-2024 14:55" "23-11-2024 17:11" "21-11-2024 20:24" "21-09-2024 06:43" ...
##  $ Delivery.Time          : chr  "01-08-2024 15:36" "23-11-2024 17:25" "21-11-2024 21:02" "21-09-2024 07:28" ...
##  $ Delivery.Duration..min.: int  41 14 38 45 15 83 45 31 17 73 ...
##  $ Taco.Size              : chr  "Regular" "Regular" "Large" "Regular" ...
##  $ Taco.Type              : chr  "Chicken Taco" "Beef Taco" "Pork Taco" "Chicken Taco" ...
##  $ Toppings.Count         : int  5 1 2 2 0 0 1 3 2 1 ...
##  $ Distance..km.          : num  3.01 6.2 20.33 3 24.34 ...
##  $ Price....              : num  9.25 4.25 7 5.5 4.5 3 5.75 6.75 5.5 5.75 ...
##  $ Tip....                : num  2.22 3.01 0.02 1.9 1.14 2.32 0.63 2.97 0.33 1.23 ...
##  $ Weekend.Order          : logi  FALSE TRUE FALSE TRUE FALSE FALSE ...

Bộ dữ liệu là data frame, bao gồm 1000 quan sát và 13 biến. Bộ dữ liệu bao gồm các biến sau:

  • Order.ID: Mã đơn hàng,

  • Restaurant.Name: Tên nhà hàng Taco,

  • Location: Nơi đặt hành,

  • Order.Time: Thời điểm đặt hàng,

  • Delivery.Time: Thời điểm giao hàng,

  • Delivery.Duration.min: Thời gian giao hàng (phút),

  • Taco.Size: Kích cỡ bánh Taco,

  • Taco.Type: Loại bánh Taco,

  • Toppings.Count: Số lượng topping được thêm vào Taco,

  • Distance (km): Khoảng cách từ nhà hàng đến khách hàng,

  • Price ($): Giá bánh Taco,

  • Tip ($): Số tiền khách hành boa,

  • Weekend.Order: Đơn đặt hàng vào cuối tuần.

Ở bài này, các biến định tính được lựa chọn để phân tích, bao gồm: Restaurant.Name, Location, Taco.Size, Taco.Type và Weekend.Order. Ta tiến hành kiểm tra xem có giá trị bị thiếu (NA) trong các biến định tính.

# Rút trích các dữ liệu định tính
sales <- select(sl, c("Restaurant.Name", "Location", "Taco.Size", "Taco.Type", "Weekend.Order"))

# Kiểm tra số lượng giá trị bị thiếu (NA)
sum(is.na(sales))
## [1] 0
  • Kết quả hàm is.na() tạo ra một bảng giá trị TRUE nếu giá trị bị thiếu (NA), FALSE nếu không bị NA. Kết quả sum() cho biết số lượng TRUE, tức là đếm số ô bị thiếu dữ liệu.

Dựa vào kết quả kiểm tra = 0, cho thấy không có giá trị bị thiếu (NA) trong các biến định tính của bộ dữ liệu.

Phần 2: Phân tích bộ dữ liệu

2.1. Thống kê mô tả

2.1.1. Biến Restaurant.Name

Bảng tần số thể hiện nhà hàng Taco:

# Đếm số lượng các nhà hàng 
table(sales$Restaurant.Name)
## 
##     Casa del Taco      El Taco Loco      Grande Tacos      La Vida Taco 
##               104                85               106                98 
##  Spicy Taco House       Taco Fiesta        Taco Haven Taco Time Express 
##               100                99                95                91 
##    The Taco Stand       Urban Tacos 
##               105               117
# Trực quan hóa dữ liệu
sales %>% group_by(Restaurant.Name) %>% summarise(n = n()) %>% 
  ggplot(aes(x = Restaurant.Name, y = n)) +
  geom_col(fill='pink') +
  coord_flip() +
  labs(x = "Nhà hàng", y = "Số lượng đơn hàng", title = "Phân bổ số lượng đơn hàng theo nhà hàng")

Nhận xét:

Dựa vào bảng tần số và biểu đồ cho thấy sự chênh lệch đáng kể về số lượng đơn hàng giữa các nhà hàng ở Hoa Kỳ. Cụ thể:

Trong số 1000 quan sát, tương ứng với 1000 đơn hàng, có 104 đơn hàng từ nhà hàng Casa del Taco, 85 đơn từ El Taco Loco, 106 đơn từ Grande Tacos, 98 đơn từ La Vida Taco, 100 đơn từ Spicy Taco House, 99 đơn từ Taco Fiesta, 95 đơn từ Taco Haven, 91 đơn từ Taco Time Express, 105 đơn từ The Taco Stand và 117 đơn từ Urban Tacos.

“Urban Tacos”, “Grande Tacos”, “The Taco Stand” và “Casa del Taco” lần lượt là những chuỗi nhà hàng có hoạt động tích cực, số lượng đơn hàng lớn so với các nhà hàng còn lại, điều này có thể phản ánh chất lượng và dịch vụ của nhà hàng. Trong khi đó, nhà hàng “El Taco Loco” có đơn hàng ít nhất, cho thấy nhà hàng có quy mô nhỏ hơn, hoặc ít phổ biến trong khu vực. Các nhà hàng còn lại có số lượng đơn hàng tương đối ổn định, ở mức trung bình.

2.1.2. Biến Location

Bảng tần số thể hiện nơi đặt hàng:

# Đếm số lượng địa chỉ đặt hàng
table(sales$Location)
## 
##      Austin     Chicago      Dallas     Houston Los Angeles    New York 
##          95         116          80         101         101          96 
##     Phoenix San Antonio   San Diego    San Jose 
##          99         113         101          98
# Trực quan hóa dữ liệu
sales %>% group_by(Location) %>% summarise(n = n()) %>% 
  ggplot(aes(x = Location, y = n)) +
  geom_col(fill = 'orange') +
  coord_flip() +
  labs(x = "Thành phố", y = "Số lượng đơn hàng", title = "Số lượng đơn hàng phân bổ theo nơi đặt hàng")

Nhận xét:

Dựa vào bảng tần số và biểu đồ cho thấy: Trong số 1000 quan sát, tương ứng 1000 đơn hàng, có 95 đơn hàng ở Austin, 116 đơn hàng ở Chicago, 80 đơn ở Dallas, 101 đơn hàng ở Houston, San Diego và Los Angeles, 96 đơn hàng ở New York, 99 đơn hàng ở Phoenix San, 113 đơn hàng ở San Diego, và 98 đơn hàng ở San Jose.

Chicago và San Antonio là hai thị trường lớn nhất, với số lượng đơn hàng vượt trội so với các thành phố khác. Theo sau đó, lần lượt là các thành phố Houston, San Diego và Los Angeles, Phoenix San, San Jose, New York, Austin, Dallas.

2.1.3. Biến Taco.Size

Bảng tần số kích cỡ Taco:

# Bảng tần số
table(sales$Taco.Size)
## 
##   Large Regular 
##     498     502
# Bảng tần suất kích cỡ Taco
table(sales$Taco.Size)/sum(nrow(sales))
## 
##   Large Regular 
##   0.498   0.502
# Trực quan hóa dữ liệu
sales %>% group_by(Taco.Size) %>% summarise(n = n()) %>% 
  mutate(pc = paste0(round(n/sum(n)*100, 2),"%")) %>% 
  ggplot(aes(x = "", y = n, fill = Taco.Size)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  geom_text(aes(label = pc), position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn thể hiện tần suất kích cỡ Taco") +
  theme_void()

Nhận xét:

Taco bán ở Hoa Kỳ có 2 kích cỡ, trong đó có 498 đơn hàng bánh cỡ lớn (Large) và 502 đơn hàng bánh cỡ thường (Regular). Như vậy, tỷ lệ 2 loại kích cỡ tương đương nhau, số lượng phân bổ khá đồng đều, có 49,8% là Taco cỡ lớn và 50,2% Taco cỡ thường.

2.1.4. Biến Taco.Type

Bảng tần số loại Taco:

# Bảng tần số
table(sales$Taco.Type)
## 
##    Beef Taco Chicken Taco    Fish Taco    Pork Taco  Veggie Taco 
##          182          218          211          192          197
# Trực quan hóa dữ liệu
ggplot(sales, aes(x = Taco.Type, fill = Taco.Type)) +
  geom_bar() +
  labs(x = "Loại Taco", y = "Số lượng đơn hàng", title = "Biểu đồ tần số các loại Taco")

Nhận xét:

Các loại Taco được bán bao gồm: Beef Taco (182 đơn hàng), Chicken Taco (218 đơn hàng), Fish Taco (211 đơn hàng), Pork Taco (192 đơn hàng) và Veggie Taco (197 đơn). Biểu đồ tần số cho thấy sự phân bổ đồng đều giữa các loại Taco, trong đó Chicken Taco là loại phổ biến nhất.

2.1.5. Biến Weekend.Order

Bảng tần số đơn hàng cuối tuần và trong tuần:

# Bảng tần số
table(sales$Weekend.Order)
## 
## FALSE  TRUE 
##   725   275
# Bảng tần suất
table(sales$Weekend.Order)/sum(nrow(sales))
## 
## FALSE  TRUE 
## 0.725 0.275
# Trực quan hóa dữ liệu
sales %>% group_by(Weekend.Order) %>% summarise(n = n()) %>% 
  mutate(pc = paste0(round(n/sum(n)*100, 2),"%")) %>% 
  ggplot(aes(x = "", y = n, fill = Weekend.Order)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  geom_text(aes(label = pc), position = position_stack(vjust = 0.5)) +
  labs(title = "Biểu đồ tròn thể hiện tần suất đơn đặt hàng của 1 tuần") +
  theme_void()

Nhận xét:

Biến Weekend.Order thể hiện đơn đặt hàng của mỗi tuần, trong đó TRUE thể hiện có đơn đặt hàng vào cuối tuần và FALSE là đơn đặt hàng trong tuần. Dựa vào bảng tần suất và biểu đồ, ta thấy số lượng đơn hàng trong tuần gấp 2,6 lần đơn đặt hàng vào cuối tuần. Trong bộ dữ liệu này, số lượng đơn hàng vào cuối tuần (TRUE) chiếm khoảng 27,5% và 72,5% còn lại là các đơn hàng trong tuần.

2.2. Ước lượng khoảng và kiểm định giả thuyết (1 biến)

2.2.1. Hạng mục “Los Angeles” của biến Location

Với độ tin cậy 95%, tỷ lệ của hạng mục “Los Angeles” trong tổng thể được thể hiện như sau:

# Số lượng địa điểm đặt hàng là Los Angeles
Los <- sum(sales$Location == "Los Angeles")

# Tổng số đơn hàng
total <- nrow(sales)

# Ước lượng khoảng tin cậy 95%
prop.test(Los, total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  Los out of total, null probability 0.5
## X-squared = 635.21, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.08336666 0.12176842
## sample estimates:
##     p 
## 0.101

Ý nghĩa: Tỷ lệ địa điểm đặt hàng là Los Angeles trong tập đơn hàng là 10,1%. Với độ tin cậy 95%, tỷ lệ địa điểm đặt hàng trong toàn bộ đơn hàng nằm trong khoảng 8,34% đến 12,18%.

Kiểm định giả thuyết:

Đặt giả thuyết:

  • H0: p = 0.2

  • H1: p ≠ 0.2

prop.test(Los, total, p = 0.2, alternative = "two.sided")
## 
##  1-sample proportions test with continuity correction
## 
## data:  Los out of total, null probability 0.2
## X-squared = 60.639, df = 1, p-value = 6.856e-15
## alternative hypothesis: true p is not equal to 0.2
## 95 percent confidence interval:
##  0.08336666 0.12176842
## sample estimates:
##     p 
## 0.101

Diễn giải: Kết quả kiểm định cho thấy giá trị p_value = 6.856e - 15 < 0.05 . Vậy giả thuyết H0 bị bác bỏ, khẳng định tỷ lệ Los Angeles không phải là 20% mà là nằm trong khoảng tin cậy [8,34%, 12,18%].

Hạng mục “Chicken Taco” của biến Taco.Type

Với độ tin cậy 95%, tỷ lệ của hạng mục “Chicken Taco” trong tổng thể được thể hiện như sau:

# Số lượng địa điểm đặt hàng là Los Angeles
chicken <- sum(sales$Taco.Type == "Chicken Taco")

# Ước lượng khoảng tin cậy 95%
prop.test(chicken, total, conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  chicken out of total, null probability 0.5
## X-squared = 316.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.1930378 0.2451626
## sample estimates:
##     p 
## 0.218

Ý nghĩa: Tỷ lệ taco loại Chicken Taco trong tập đơn hàng là 21,8%. Với độ tin cậy 95%, tỷ lệ Chicken Taco trong toàn bộ đơn hàng nằm trong khoảng 19,3% đến 24,52%.

Kiểm định giả thuyết:

Đặt giả thuyết:

  • H0: p = 0.5

  • H1: p ≠ 0.5

prop.test(chicken, total, p = 0.5, alternative = "two.sided")
## 
##  1-sample proportions test with continuity correction
## 
## data:  chicken out of total, null probability 0.5
## X-squared = 316.97, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.1930378 0.2451626
## sample estimates:
##     p 
## 0.218

Diễn giải: Kết quả kiểm định cho thấy giá trị p_value = 2.2e - 16 < 0.05 . Vậy giả thuyết H0 bị bác bỏ, khẳng định tỷ lệ Chicken Taco không phải là 50% mà là nằm trong khoảng tin cậy [19,3%, 24,52%].

Phần 3: Phân tích mối quan hệ giữa 2 biến định tính

3.1. Thống kê mô tả 2 biến Location và Taco.Size

Hai biến Location và Taco.Size được lựa chọn để phân tích lựa chọn kích cỡ Taco có sự khác biệt gì giữa các thành phố hay không.

Bảng tần suất thể hiện tỷ lệ kích cỡ Taco theo từng thành phố như sau:

# Bảng tần số Kích cỡ và thành phố
table_loc_size <- table(sales$Location, sales$Taco.Size)

# Tính tỷ lệ % theo từng thành phố
tyle <- round(prop.table(table_loc_size, margin = 1)*100,2)
tyle
##              
##               Large Regular
##   Austin      38.95   61.05
##   Chicago     56.03   43.97
##   Dallas      42.50   57.50
##   Houston     52.48   47.52
##   Los Angeles 62.38   37.62
##   New York    50.00   50.00
##   Phoenix     46.46   53.54
##   San Antonio 50.44   49.56
##   San Diego   40.59   59.41
##   San Jose    55.10   44.90

Diễn giải kết quả: Bảng tần suất cho biết, tại mỗi thành phố cụ thể có bao nhiêu % đơn hàng là cỡ lớn và cỡ thường. Dựa vào bảng tần suất có sự khác biệt giữa các thành phố. Los Angeles nổi bật với 62,38% đơn hàng là Taco cỡ lớn, trong khi đó khách hàng ở Austin ưa thích Taco cỡ thường hơn (chỉ 38,95% đơn hàng cỡ lớn).

Biểu đồ thể hiện tỷ lệ kích cỡ Taco với Location

ggplot(sales, aes(x = Location, fill = Taco.Size)) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(title = "Tỷ lệ kích thước Taco theo thành phố", x = "Thành phố", y = "Tỷ lệ phần trăm") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Giải thích câu lệnh:

Thành phần Ý nghĩa
aes(x = Location, fill = Taco.Size) Chia cột theo kích thước taco ở từng địa điểm
geom_bar(position = "fill") Biểu đồ cột tỷ lệ (mỗi cột cao 100%)
scale_y_continuous(labels = percent_format()) Hiển thị trục y dưới dạng phần trăm

3.2. Kiểm tra tính độc lập

Để kiểm tra mối quan hệ giữa Location và Taco.Size, ta sử dụng kiểm định Chi-square test để khẳng định mối quan hệ này.

Đặt giả thuyết:

  • H0: Location và Taco.Size độc lập,

  • H1: Location và Taco.Size có liên quan

chisq.test(table_loc_size)
## 
##  Pearson's Chi-squared test
## 
## data:  table_loc_size
## X-squared = 19.65, df = 9, p-value = 0.0202

Kết luận thống kê: Giá trị p_value = 0.0202 < 0.05 nên ta bác bỏ giả thuyết H0. Vậy địa chỉ đặt hàng Location và kích cỡ Taco Taco.Size có mối liên hệ với nhau.

3.3. Relative Risk

Vì Relative Risk chỉ thực hiện được cho 2 biến định tính nhị phân, hay dữ liệu bảng 2x2. Do đó, ta tiến hành xét thành phố Los Angeles, New Yorkkích cỡ Large/Regular

# Lọc dữ liệu
sales_2x2 <- sales %>% filter(Location == "Los Angeles"| Location == "New York")

# Bảng tần số chéo
table_2x2 <- table(sales_2x2$Location, sales_2x2$Taco.Size)
table_2x2
##              
##               Large Regular
##   Los Angeles    63      38
##   New York       48      48
# Tính rủi ro tương đối chọn Taco cỡ lớn giữa 2 thành phố
RelRisk(table_2x2)
## [1] 1.247525

Diễn giải: Kết quả tính toán Relative Risk (RR) giữa 2 thành phố L.A, New York và 2 kích cỡ Large, Regular cho thấy RR = 1,24725. Nghĩa là tỷ lệ Taco cỡ lớn ở Los Angeles cao hơn khoảng 1,25 lần so với ở New York hay người ở Los Angeles có xu hướng chọn Taco cỡ lớn nhiều hơn so với người ở New York.

# Tính relative risk chọn Taco cỡ thường đối với 2 thành phố
riskratio(table_2x2)
## $data
##              
##               Large Regular Total
##   Los Angeles    63      38   101
##   New York       48      48    96
##   Total         111      86   197
## 
## $measure
##              risk ratio with 95% C.I.
##               estimate     lower   upper
##   Los Angeles 1.000000        NA      NA
##   New York    1.328947 0.9640028 1.83205
## 
## $p.value
##              two-sided
##               midp.exact fisher.exact chi.square
##   Los Angeles         NA           NA         NA
##   New York    0.08290087   0.08650859 0.08000065
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Kết quả:

  • Tỷ lệ chọn Taco cỡ thường tại New York cao hơn tại L.A với RR = 1,3289. Nghĩa là khách hàng ở New York có xu hướng chọn Taco cỡ thường cao hơn khoảng 32.89% so với khách hàng ở Los Angeles.

  • Khoảng tin cậy 95% của RR nằm trong khoảng [0.964; 1,832], bao gồm giá trị 1.

  • Kết quả kiểm định mid-p exact, Fisher’s exact test và kiểm định Chi-squared đều cho ra kết quả p_value > 0.05

Ý nghĩa: Kết quả cho thấy khách hàng ở New York có xu hướng chọn Taco cỡ Regular nhiều hơn so với Los Angeles, nhưng sự khác biệt này không có ý nghĩa thống kê, do đó chưa đủ cơ sở khẳng định có mối liên hệ rõ ràng giữa địa điểm và kích thước Taco ưa thích.

3.4. Tỷ lệ chênh (Odds Ratio)

oddsratio(table_2x2)
## $data
##              
##               Large Regular Total
##   Los Angeles    63      38   101
##   New York       48      48    96
##   Total         111      86   197
## 
## $measure
##              odds ratio with 95% C.I.
##               estimate     lower    upper
##   Los Angeles 1.000000        NA       NA
##   New York    1.652192 0.9368725 2.933679
## 
## $p.value
##              two-sided
##               midp.exact fisher.exact chi.square
##   Los Angeles         NA           NA         NA
##   New York    0.08290087   0.08650859 0.08000065
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Kết quả:

  • Tỷ lệ chênh Odds Ratio = 1,652, tức là tỷ lệ bánh Taco loại lớn (so với loại thường) ở New York cao hơn ở Los Angeles khoảng 65,2%.

  • Khoảng tin cậy 95% nằm trong khoảng [0.934; 2,934]. Tuy nhiên khoảng tin cậy 95% bao gồm giá trị 1, nên sự khác biệt tỷ lệ không có ý nghĩa thống kê ở mức ý nghĩa 0.05.

  • Kết quả kiểm định mid-p exact, Fisher’s exact test và kiểm định Chi-squared đều cho ra kết quả p_value > 0.05.

Ý nghĩa: Kết quả cho thấy tỷ lệ khách hàng ở New York có xu hướng chọn Taco cỡ Large (so với cỡ Regular) nhiều hơn so với Los Angeles, nhưng sự khác biệt này không có ý nghĩa thống kê, do đó chưa đủ cơ sở khẳng định rằng có sự khác biệt thực sự về tỷ lệ lựa chọn taco cỡ lớn giữa hai thành phố.