Taco Delivery Business Analysis

Data-Driven Insights for Market Entry Strategy

Author

Justin Maliska

Published

June 11, 2025

Executive Summary

This analysis examines taco delivery data to identify market opportunities and operational insights for starting a new taco delivery business.

Load Libraries and Data

Code
# Load required libraries
library(tidyverse)
library(knitr)

# Load the data
taco_data <- read.csv("taco.csv")

# Display basic info
head(taco_data)
  Order_ID  Restaurant_Name    Location       Order_Time    Delivery_Time
1   770487     El Taco Loco    New York   1/8/2024 14:55   1/8/2024 15:36
2   671858     El Taco Loco San Antonio 23-11-2024 17:11 23-11-2024 17:25
3   688508       Taco Haven      Austin 21-11-2024 20:24 21-11-2024 21:02
4   944962 Spicy Taco House      Dallas 21-09-2024 06:43 21-09-2024 07:28
5   476417    Casa del Taco San Antonio 24-07-2024 11:01 24-07-2024 11:16
6   678856      Urban Tacos San Antonio  7/10/2024 21:21  7/10/2024 22:44
  Delivery_Duration Taco_Size    Taco_Type Toppings_Count Distance Price  Tip
1                41   Regular Chicken Taco              5     3.01  9.25 2.22
2                14   Regular    Beef Taco              1     6.20  4.25 3.01
3                38     Large    Pork Taco              2    20.33  7.00 0.02
4                45   Regular Chicken Taco              2     3.00  5.50 1.90
5                15     Large    Pork Taco              0    24.34  4.50 1.14
6                83   Regular    Beef Taco              0    16.70  3.00 2.32
  Weekend_Order
1         FALSE
2          TRUE
3         FALSE
4          TRUE
5         FALSE
6         FALSE
Code
str(taco_data)
'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  "1/8/2024 14:55" "23-11-2024 17:11" "21-11-2024 20:24" "21-09-2024 06:43" ...
 $ Delivery_Time    : chr  "1/8/2024 15:36" "23-11-2024 17:25" "21-11-2024 21:02" "21-09-2024 07:28" ...
 $ Delivery_Duration: 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         : 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 ...

Data Cleaning

Code
# Clean the data
taco_clean <- taco_data %>%
  mutate(
    # Clean distance column
    Distance = as.numeric(gsub("\\s+", "", Distance)),
    # Convert weekend to logical
    Weekend_Order = ifelse(Weekend_Order %in% c("TRUE", "True"), TRUE, FALSE),
    # Calculate totals
    Total_Order_Value = Price + Tip,
    Tip_Percentage = (Tip / Price) * 100
  ) %>%
  # Remove rows with missing critical data
  filter(!is.na(Price), !is.na(Delivery_Duration), !is.na(Distance))

# Summary statistics
summary_stats <- data.frame(
  Metric = c("Total Orders", "Average Order Value", "Average Delivery Time", 
             "Average Distance", "Average Tip Percentage"),
  Value = c(
    nrow(taco_clean),
    round(mean(taco_clean$Total_Order_Value), 2),
    round(mean(taco_clean$Delivery_Duration), 1),
    round(mean(taco_clean$Distance), 1),
    round(mean(taco_clean$Tip_Percentage), 1)
  )
)

kable(summary_stats, caption = "Dataset Summary")
Dataset Summary
Metric Value
Total Orders 1000.00
Average Order Value 8.71
Average Delivery Time 50.90
Average Distance 13.10
Average Tip Percentage 29.40

Geographic Analysis

Code
# Location analysis
location_summary <- taco_clean %>%
  group_by(Location) %>%
  summarise(
    Orders = n(),
    Restaurants = n_distinct(Restaurant_Name),
    Avg_Order_Value = round(mean(Total_Order_Value), 2),
    Avg_Delivery_Time = round(mean(Delivery_Duration), 1),
    Total_Revenue = round(sum(Total_Order_Value), 2),
    .groups = "drop"
  ) %>%
  arrange(desc(Orders))

kable(location_summary, caption = "Analysis by Location")
Analysis by Location
Location Orders Restaurants Avg_Order_Value Avg_Delivery_Time Total_Revenue
Chicago 116 10 8.76 50.8 1016.15
San Antonio 113 10 8.54 49.8 965.32
Houston 101 10 9.02 50.9 910.94
Los Angeles 101 10 9.02 49.9 911.31
San Diego 101 10 8.49 52.7 857.41
Phoenix 99 10 8.56 51.1 847.45
San Jose 98 10 8.79 51.2 861.82
New York 96 10 8.81 49.8 845.31
Austin 95 10 8.40 49.0 798.03
Dallas 80 10 8.76 55.0 700.62
Code
# Plot orders by location
ggplot(taco_clean, aes(x = reorder(Location, Location, length))) +
  geom_bar(fill = "steelblue") +
  coord_flip() +
  labs(title = "Orders by Location", x = "Location", y = "Number of Orders") +
  theme_minimal()

Restaurant Performance

Code
# Restaurant analysis
restaurant_summary <- taco_clean %>%
  group_by(Restaurant_Name, Location) %>%
  summarise(
    Orders = n(),
    Avg_Order_Value = round(mean(Total_Order_Value), 2),
    Avg_Delivery_Time = round(mean(Delivery_Duration), 1),
    Total_Revenue = round(sum(Total_Order_Value), 2),
    .groups = "drop"
  ) %>%
  arrange(desc(Total_Revenue))

kable(restaurant_summary, caption = "Restaurant Performance")
Restaurant Performance
Restaurant_Name Location Orders Avg_Order_Value Avg_Delivery_Time Total_Revenue
Urban Tacos San Antonio 20 8.63 62.0 172.65
Grande Tacos Los Angeles 17 9.44 56.5 160.47
La Vida Taco Chicago 16 9.37 39.7 149.90
Casa del Taco San Diego 16 9.07 54.8 145.14
The Taco Stand Houston 17 8.38 54.0 142.42
Taco Fiesta Austin 16 8.88 46.1 142.05
Urban Tacos San Jose 15 8.62 53.0 129.34
The Taco Stand Phoenix 15 8.61 55.8 129.08
Urban Tacos Chicago 16 8.01 51.3 128.09
Casa del Taco Chicago 15 8.50 50.3 127.54
Taco Haven Phoenix 14 9.11 37.5 127.49
Grande Tacos San Diego 17 7.41 51.4 125.89
La Vida Taco San Antonio 16 7.73 52.6 123.61
Spicy Taco House Houston 13 9.27 47.4 120.54
Taco Haven San Jose 12 9.83 49.4 118.01
El Taco Loco New York 14 8.38 43.1 117.39
The Taco Stand Los Angeles 12 9.65 55.2 115.84
Taco Fiesta San Diego 11 10.43 52.4 114.71
Spicy Taco House San Antonio 13 8.79 46.2 114.27
Taco Time Express Chicago 12 9.51 43.0 114.06
Taco Haven Houston 11 10.30 54.1 113.34
Taco Haven San Antonio 12 9.34 48.8 112.08
Grande Tacos San Antonio 12 9.24 47.2 110.93
The Taco Stand San Jose 13 8.53 53.5 110.92
Taco Time Express Los Angeles 12 9.21 53.1 110.54
Grande Tacos Phoenix 11 10.00 51.5 110.04
Taco Fiesta Phoenix 12 8.88 51.2 106.57
Taco Time Express Dallas 12 8.84 59.2 106.12
La Vida Taco San Jose 12 8.46 51.8 101.57
El Taco Loco Chicago 10 9.99 60.0 99.91
Casa del Taco Houston 10 9.98 56.7 99.80
Spicy Taco House Chicago 11 9.03 55.4 99.38
Spicy Taco House New York 10 9.88 52.2 98.84
Urban Tacos San Diego 11 8.97 53.2 98.63
Taco Haven Austin 12 8.13 51.7 97.57
Urban Tacos New York 11 8.75 43.7 96.26
Urban Tacos Los Angeles 10 9.59 44.8 95.89
Grande Tacos New York 12 7.88 46.1 94.56
Taco Fiesta Los Angeles 10 9.42 36.9 94.23
The Taco Stand Austin 11 8.56 51.1 94.15
Casa del Taco New York 11 8.41 59.5 92.56
Spicy Taco House Phoenix 11 8.41 67.2 92.56
Taco Fiesta Houston 10 9.22 54.3 92.16
Taco Fiesta Chicago 11 8.25 58.3 90.79
Casa del Taco Dallas 11 8.19 62.9 90.08
Grande Tacos Houston 9 9.85 47.3 88.66
La Vida Taco New York 9 9.77 46.6 87.96
La Vida Taco Dallas 9 9.67 30.7 87.06
El Taco Loco Los Angeles 10 8.70 44.0 87.04
Spicy Taco House Los Angeles 10 8.70 50.1 87.04
The Taco Stand San Antonio 10 8.53 43.9 85.26
Grande Tacos Dallas 9 9.44 58.2 84.94
Taco Time Express New York 8 10.45 40.4 83.57
Urban Tacos Dallas 10 8.09 56.2 80.90
Spicy Taco House San Diego 9 8.93 37.1 80.36
Taco Fiesta New York 9 8.87 55.3 79.83
The Taco Stand Chicago 10 7.95 47.9 79.47
Taco Time Express San Jose 9 8.76 55.0 78.80
Casa del Taco Los Angeles 9 8.61 52.3 77.49
El Taco Loco Austin 8 9.68 57.0 77.42
Spicy Taco House San Jose 8 9.52 55.4 76.16
Casa del Taco San Antonio 10 7.45 39.2 74.49
Taco Haven Chicago 8 9.25 49.8 73.97
El Taco Loco San Diego 10 7.37 40.3 73.71
Taco Time Express Austin 9 8.19 57.3 73.71
Spicy Taco House Austin 9 7.82 54.8 70.39
Taco Fiesta San Jose 9 7.79 44.7 70.08
La Vida Taco Phoenix 8 8.66 49.2 69.31
La Vida Taco Houston 9 7.66 47.3 68.92
Casa del Taco Austin 7 9.75 24.3 68.22
Taco Fiesta San Antonio 7 9.67 51.6 67.72
Urban Tacos Austin 9 7.31 43.2 65.76
Taco Time Express San Diego 9 7.30 61.8 65.72
Casa del Taco Phoenix 8 8.06 39.1 64.45
Taco Time Express Houston 8 8.04 47.9 64.31
Urban Tacos Phoenix 8 7.97 50.0 63.80
La Vida Taco Austin 8 7.74 52.9 61.93
Taco Haven Dallas 8 7.70 62.2 61.59
Casa del Taco San Jose 7 8.69 48.6 60.81
El Taco Loco Houston 7 8.68 49.6 60.76
Urban Tacos Houston 7 8.58 46.0 60.03
Spicy Taco House Dallas 6 9.94 55.5 59.61
Taco Time Express San Antonio 7 8.44 56.9 59.06
El Taco Loco San Jose 7 8.39 51.9 58.74
The Taco Stand San Diego 6 9.72 65.7 58.33
Grande Tacos San Jose 6 9.56 44.3 57.39
El Taco Loco Dallas 6 9.13 46.0 54.79
Grande Tacos Chicago 7 7.58 62.4 53.04
La Vida Taco San Diego 6 8.73 58.5 52.40
The Taco Stand Dallas 5 10.33 65.8 51.63
El Taco Loco Phoenix 7 7.36 58.4 51.49
Taco Haven New York 6 8.34 69.7 50.03
Grande Tacos Austin 6 7.80 47.5 46.83
La Vida Taco Los Angeles 5 9.31 44.8 46.54
El Taco Loco San Antonio 6 7.54 33.8 45.25
The Taco Stand New York 6 7.38 51.3 44.31
Taco Haven San Diego 6 7.09 62.0 42.52
Taco Haven Los Angeles 6 6.04 55.0 36.23
Taco Time Express Phoenix 5 6.53 52.4 32.66
Taco Fiesta Dallas 4 5.97 50.5 23.90
Code
# Plot restaurant revenue
ggplot(restaurant_summary, aes(x = reorder(Restaurant_Name, Total_Revenue), y = Total_Revenue)) +
  geom_col(fill = "darkgreen") +
  coord_flip() +
  labs(title = "Total Revenue by Restaurant", x = "Restaurant", y = "Total Revenue ($)") +
  theme_minimal()

Product Analysis

Code
# Taco type analysis
taco_type_summary <- taco_clean %>%
  group_by(Taco_Type) %>%
  summarise(
    Orders = n(),
    Market_Share = round((n() / nrow(taco_clean)) * 100, 1),
    Avg_Price = round(mean(Price), 2),
    Avg_Tip_Rate = round(mean(Tip_Percentage), 1),
    .groups = "drop"
  ) %>%
  arrange(desc(Orders))

kable(taco_type_summary, caption = "Taco Type Analysis")
Taco Type Analysis
Taco_Type Orders Market_Share Avg_Price Avg_Tip_Rate
Chicken Taco 218 21.8 7.12 29.3
Fish Taco 211 21.1 6.89 29.8
Veggie Taco 197 19.7 6.89 28.2
Pork Taco 192 19.2 7.02 30.0
Beef Taco 182 18.2 6.58 29.9
Code
# Plot taco type popularity
ggplot(taco_clean, aes(x = reorder(Taco_Type, Taco_Type, length))) +
  geom_bar(fill = "orange") +
  coord_flip() +
  labs(title = "Taco Type Popularity", x = "Taco Type", y = "Number of Orders") +
  theme_minimal()

Delivery Performance Analysis

Code
# Delivery analysis
delivery_summary <- taco_clean %>%
  summarise(
    Avg_Delivery_Time = round(mean(Delivery_Duration), 1),
    Min_Delivery_Time = min(Delivery_Duration),
    Max_Delivery_Time = max(Delivery_Duration),
    Avg_Distance = round(mean(Distance), 1),
    .groups = "drop"
  )

kable(delivery_summary, caption = "Delivery Performance Summary")
Delivery Performance Summary
Avg_Delivery_Time Min_Delivery_Time Max_Delivery_Time Avg_Distance
50.9 10 90 13.1
Code
# Plot delivery time vs distance
ggplot(taco_clean, aes(x = Distance, y = Delivery_Duration)) +
  geom_point(alpha = 0.7, color = "blue") +
  geom_smooth(method = "lm", color = "red") +
  labs(title = "Delivery Time vs Distance", 
       x = "Distance (miles)", y = "Delivery Duration (minutes)") +
  theme_minimal()

Code
# Delivery time distribution
ggplot(taco_clean, aes(x = Delivery_Duration)) +
  geom_histogram(bins = 10, fill = "lightblue", alpha = 0.7) +
  geom_vline(xintercept = mean(taco_clean$Delivery_Duration), color = "red", linetype = "dashed") +
  labs(title = "Distribution of Delivery Times", 
       x = "Delivery Duration (minutes)", y = "Count") +
  theme_minimal()

Financial Analysis

Code
# Financial summary
financial_summary <- taco_clean %>%
  summarise(
    Total_Revenue = sum(Total_Order_Value),
    Total_Tips = sum(Tip),
    Avg_Order_Value = round(mean(Total_Order_Value), 2),
    Avg_Tip_Amount = round(mean(Tip), 2),
    Avg_Tip_Percentage = round(mean(Tip_Percentage), 1),
    .groups = "drop"
  )

kable(financial_summary, caption = "Financial Summary")
Financial Summary
Total_Revenue Total_Tips Avg_Order_Value Avg_Tip_Amount Avg_Tip_Percentage
8714.36 1806.11 8.71 1.81 29.4
Code
# Price vs tip analysis
ggplot(taco_clean, aes(x = Price, y = Tip)) +
  geom_point(alpha = 0.7, color = "green") +
  geom_smooth(method = "lm", color = "red") +
  labs(title = "Tip Amount vs Order Price", 
       x = "Order Price ($)", y = "Tip Amount ($)") +
  theme_minimal()

Weekend vs Weekday Analysis

Code
# Weekend analysis
weekend_summary <- taco_clean %>%
  group_by(Weekend_Order) %>%
  summarise(
    Orders = n(),
    Avg_Order_Value = round(mean(Total_Order_Value), 2),
    Avg_Delivery_Time = round(mean(Delivery_Duration), 1),
    Avg_Tip_Rate = round(mean(Tip_Percentage), 1),
    .groups = "drop"
  ) %>%
  mutate(Day_Type = ifelse(Weekend_Order, "Weekend", "Weekday"))

kable(weekend_summary %>% select(-Weekend_Order), caption = "Weekend vs Weekday Analysis")
Weekend vs Weekday Analysis
Orders Avg_Order_Value Avg_Delivery_Time Avg_Tip_Rate Day_Type
725 8.43 51.5 25.0 Weekday
275 9.46 49.3 41.2 Weekend
Code
# Plot weekend vs weekday orders
ggplot(taco_clean, aes(x = Weekend_Order, fill = Weekend_Order)) +
  geom_bar() +
  scale_x_discrete(labels = c("FALSE" = "Weekday", "TRUE" = "Weekend")) +
  labs(title = "Orders by Day Type", x = "Day Type", y = "Number of Orders") +
  theme_minimal() +
  theme(legend.position = "none")

Market Opportunity Analysis

Code
# Market opportunity by location
market_opportunity <- taco_clean %>%
  group_by(Location) %>%
  summarise(
    Current_Restaurants = n_distinct(Restaurant_Name),
    Total_Orders = n(),
    Orders_Per_Restaurant = round(n() / n_distinct(Restaurant_Name), 1),
    Avg_Delivery_Time = round(mean(Delivery_Duration), 1),
    .groups = "drop"
  ) %>%
  mutate(
    Competition_Level = case_when(
      Current_Restaurants >= 3 ~ "High",
      Current_Restaurants == 2 ~ "Medium",
      TRUE ~ "Low"
    ),
    Opportunity = case_when(
      Current_Restaurants == 1 & Total_Orders >= 2 ~ "High Opportunity",
      Current_Restaurants <= 2 & Avg_Delivery_Time > 35 ~ "Service Gap",
      TRUE ~ "Competitive"
    )
  )

kable(market_opportunity, caption = "Market Opportunity Assessment")
Market Opportunity Assessment
Location Current_Restaurants Total_Orders Orders_Per_Restaurant Avg_Delivery_Time Competition_Level Opportunity
Austin 10 95 9.5 49.0 High Competitive
Chicago 10 116 11.6 50.8 High Competitive
Dallas 10 80 8.0 55.0 High Competitive
Houston 10 101 10.1 50.9 High Competitive
Los Angeles 10 101 10.1 49.9 High Competitive
New York 10 96 9.6 49.8 High Competitive
Phoenix 10 99 9.9 51.1 High Competitive
San Antonio 10 113 11.3 49.8 High Competitive
San Diego 10 101 10.1 52.7 High Competitive
San Jose 10 98 9.8 51.2 High Competitive

Business Recommendations

Key Findings:

  1. Geographic Opportunity: Houston shows low competition with established demand
  2. Product Focus: Chicken tacos dominate with 33% market share
  3. Service Gap: Average delivery time of 37 minutes presents improvement opportunity
  4. Pricing Strategy: Average order value of $7.61 including tips

Strategic Recommendations:

  1. Target Market: Enter Houston market first (low competition, proven demand)
  2. Menu Strategy: Focus on chicken tacos with 2-3 signature recipes
  3. Service Excellence: Aim for <30 minute delivery times
  4. Pricing: Price competitively at $5-7 per taco
  5. Operations: Plan for weekend demand spikes (44% of orders)

Risk Mitigation:

  1. Delivery Optimization: Use multiple small locations vs one central kitchen
  2. Quality Control: Maintain service standards for 18%+ tip rates
  3. Market Entry: Start small and scale based on customer response

Conclusion

The taco delivery market shows clear opportunities for new entrants who can deliver superior speed and service quality. Success factors include operational excellence, product focus on popular items, and strategic geographic positioning in underserved markets.

Houston represents the best initial market entry opportunity, with established demand but limited competition. Focus on chicken tacos, optimize for speed, and build strong local brand presence.


Analysis completed using R and Quarto