Projecting the 2026 North American World Cup Host Cities


With the 2018 World Cup (and painful non-qualification) now fully in the mirror, American soccer fans have a lot to look forward to. The 2022 World Cup promises to be a great bounce bounce-back opportunity for the team, which figures to be led by a 23 year old Christian Pulisic. Four years later, the United States, Mexico, and Canada will jointly host a North American World Cup in 2026. At that time, Pulisic will be 27 and a whole new generation of American stars is expected to emerge, with other promising players such as Timothy Weah and Josh Sargent also entering their primes.

2026 World Cup in North America

FIFA’s recent award of the World Cup to the North American coalition was a) a nice change from the years of FIFA and the IOC selecting autocratic host nations and b) not terribly shocking, considering the only other bid was by Morocco. They recently published their evaluation criteria, which is a long breakdown of the host nations’ proposals and scoring based on technical factors (stadiums, transportation, projected costs and revenues) and risks (legal, security, and governmental). It also outlines which cities were proposed as potential hosts for the games, and provides some preliminary scoring metrics on those cities.

From the perspective of an interested fan who would like to attend some of those 2026 matches, I thought it would be intesting to delve into the FIFA scorecards for each city and project which cities will be the eventual hosts.

Nominated Cities

Mexico and Canada each nominated three host cities and are expected to be awarded three cities. However, the United States nominated 17 cities, only 10 of which are expected to be host cities.

Mexico

  • Mexico City
  • Guadalajara
  • Monterrey

Canada

  • Toronto
  • Montreal
  • Edmonton

United States

  • Atlanta
  • Baltimore
  • Boston
  • Cincinnati
  • Dallas
  • Denver
  • Houston
  • Kansas City
  • Los Angeles
  • Miami
  • Nashville
  • New York/New Jersey
  • Orlando
  • Philadephia
  • San Francisco
  • Seattle
  • Washington, DC

Scoring the Cities

Inside the FIFA Evaluation of the North American bid are scores for each city, covering the following categories:

  • Stadium: quality and capacity of each venue for both soccer and the fan experience
  • Accomodations: availability of high quality hotels and housing for players, organizers, and spectators
  • Transit: ease of access to cities and stadiums, both within the city and from host city to host city
  • Fan Fest: how suitable each city is for hosting FIFA Fan Fest and related activities

Scoring Host Cities

Ranking the Host Cities

Before coming up with a final ranking, I gave bonus points to the cities already nominated as potential hosts for the Opener, Semi-Final, and Final rounds of the tournament. I also considered giving bonus points for status as a previous Super Bowl host or Amazon HQ2 finalist (with the implication that the decision to award those cities indicates a pre-existing social bias and level of acclaim towards those cities and stadiums), but ultimately left out those details to focus only on the FIFA-provided information.

Ranking Host Cities

Building the Graphics

library(readxl)
library(readr)
library(reshape2)
library(tidyverse)

# Read input data file
cities <- read_csv("World Cup.csv", 
                   col_types = cols(Latitude = col_number(), 
                                    Longitude = col_number()))

# Rank cities by total points
cities <- cities %>% 
  arrange(desc(cities$`Total Points`)) %>% 
  mutate(rank = dense_rank(desc(cities$`Total Points`)))

# Create color palette mapping potential hosts
pal <- colorFactor(c("tomato", "steelblue"), domain = c("No", "Yes"))

# Create map with hosts/non-hosts mapped and with clickable details
m <- leaflet() %>% addTiles() %>% addCircleMarkers(
  data = cities, 
  color = ~pal(cities$`Projected Host`),
  stroke = FALSE,
  fillOpacity = 0.5, 
  radius = ~`Total Points`, 
  label = ~City, 
  labelOptions = (nohide = TRUE),
  popup = ~paste(
    "<b>", City, "</b><br/>",
    as.character(Stadium), "<br/>",
    "Population: ", as.character(Population), "M", "<br/>",
    "Ranking: ", as.character(rank), " of 17", "<br/>",
    "Projected Host: ", as.character(`Projected Host`), "<br/>",
    sep = "")
  ) %>% addLegend(
    position = "bottomright", 
    colors = c("steelblue", "tomato"), 
    labels = c("Yes", "No"), 
    title = "Projected 2026 World Cup Host City"
    )
m

# Melt dataframe to create variable column
cities.m <- cities %>% 
  melt() %>% 
  filter(variable == "FIFA Stadium Score" | 
           variable == "FIFA Accomodation Score" | 
           variable == "FIFA Transit Score" | 
           variable == "FIFA Fan Fest Score") %>% 
  arrange(City)

# Generate heatmap of cities and FIFA evaluation scores
heatmap <- ggplot(cities.m, aes(x = variable, y = City)) + 
  geom_tile(
    aes(fill = value), 
    color = "white"
    ) + 
  scale_fill_gradient(
    low = "khaki", 
    high = "orangered"
    ) + 
  labs(
    title = "Scoring the Prospective 2026 World Cup Host Cities",
    subtitle = "Utilizing FIFA's city evaluation criteria",
    x = "",
    y = "",
    fill = "Score"
    ) + 
  theme(
    axis.text.x = element_text(angle = 30, hjust = 1, vjust = 1)
    )

heatmap

# Create bar chart of cities by total points ranking
p_city_ranking <- ggplot(
  cities, 
  aes(
    x = reorder(City, -`Total Points`), 
    y = `Total Points`, 
    fill = `Projected Host`)
  ) + 
  geom_col() + 
  scale_fill_manual(
    values = c("tomato", "steelblue"), 
    name= "FIFA Score", 
    guide = guide_legend(reverse = TRUE)
    ) +
  geom_hline(
    yintercept = 19.3, 
    linetype = "dashed", 
    size = 0.25
    ) +
  labs(
    title = "Ranking the Prospective 2026 World Cup Host Cities",
    subtitle = "Utilizing FIFA evaluation criteria with bonus points",
    x = "",
    y = "",
    fill = "Projected Host"
  ) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)
  )

p_city_ranking