Having been able to walk or bike to theatres, jobs, restaurants and a wealth of other amenities for the last 10 years, the 15-minute city resonates strongly with me. However, it seems important to challenge the concept with some hard numbers - lest it become just another buzzword.

The main tenant of the 15-minute city is to create liveable neighbourhoods where work, socialization and leisure are all a few minutes away. This series of posts specifically considers proximity to grocery stores. These types of amenities are interesting, because they remain essential local services that reveal defining neighbourhoods facets.

This first article surveys grocery store location in Montreal and Quebec City. It shows that while some very walkable areas have an incredibly rich produce offering, the 15 minute city seems like a far cry from the current state for most car-centric areas.

Where do you buy groceries?

See the methodological section below for details on how the data was obtained and classified.

By considering the spatial distribution of stores in both cities, we immediately notice some intuitive, yet interesting patterns. First, ultra large Costco-syle stores are present in smaller numbers, are more evenly spread out, are usually close to highways and are more prevalent in suburban areas. On the other hand, medium-sized stores like Intermarché are present almost exclusively downtown.

For both cities, it seems clear that large IGA-like stores are both the most prevalent in absolute numbers as well as having the broadest geographical distribution.

The importance of density

Considering the population density around each store further reinforces the idea that different kind of stores cluster in different neighbourhoods. As the figure below highlights, there seems to be a negative linear relationship between store size and population density on average.

The population density and location of grocery stores are likely important indicators of transportation mode. It is therefore interesting to merge census and store data to get an idea of the population served by each location in order to estimate the share of the population that can walk of bike to get groceries.

Using the simplifying assumption that customers only visit the nearest as-the-crow-flies store, this becomes relatively straightforward by intersecting store voronoi polygons and census dissemination blocks. This results in the following spider plots, where the length of the edges represents the distance travelled to stores:

Spider plot - Montreal - Color intensity of edges and nodes reflects the relative population serve by grocery stores.

Spider plot - Montreal - Color intensity of edges and nodes reflects the relative population serve by grocery stores.

Areas with a high number of stores also have high population density. In these dense neighbourhoods, citizens are not only closer to stores on average, they also have access to a greater variety of chains. This can be seen by comparing the few markets in the suburbs with large geographical coverage with the numerous smaller stores dowtown. A similar picture also emerges in Quebec City.

Spider plot -Quebec City

Spider plot -Quebec City

Walking to Walmart?

Using voronoi polygons to estimate population served relies on a key assumption: that individuals visit their nearest store. While this seems probable in urban areas when walking is more convenient than driving, it might break down in sparser neighbourhoods where driving 100 meters does not make a material difference.

Nonetheless, this limitation itself reveals some interesting findings. For instance, if individuals only visited their nearest grocery store, then the Walmart in Côte-Vertu, Montreal - shown in the map below - would service a huge area having a population of only roughly 400 people. This is extremely unlikely and corroborates the hypothesis that:

  • Walmarts are generally located in low-density areas
  • People do not generally walk to Walmarts.
  • Distance to store is not the main driver for Walmart visits

In Quebec City, large stores located next to busy highways in low-density areas also unrealistically have some of the least populated catchments. Once again, this shows people are driving to these stores since they likely serve a large number of clients in reality. The stores servicing the largest populations also rely on car traffic since they cover a huge and sparse area in the periphery of the city.

Considering that individuals only visit their nearest grocery store is an obvious oversimplification since price, variety of product offerings, idiosyncratic store characteristics and other factors also come into play. However, this exercise remains interesting since it reveals that many individuals rely on their car for grocery shopping.


Achieving the 15-minute city seems difficult in many suburbs where the heavy reliance on cars has made it possible to purchase large quantities of food in a few trips. In turn, this has enabled the advent of large low-margin stores like Costco and Walmart in low-density areas near highways by attracting high volume from far-flung regions.

Increasing density seems key to improving proximity to groceries. Denser urban areas have access to a greater variety of smaller stores located close by. In fact, local neighbourhood shops and smaller chains play a vital role in improving accessibility to a diversified set of products.

While this post focused on stores; the next article will quantify grocery store offerings by neighbourhood. It will try to identify food deserts and areas with high accessibility to groceries by foot.

Methodological details

Web scraping

The grocery stores where scraped from the websites of all chains present in Quebec using the following R code, which leverages the rvest package.

Important note: Out of laziness, I copy-pasted the entire html contents of dynamic websites like IGA’s onto S3 buckets to avoid javascript issues and having to use tools like selenium.

I used the following classification scheme:

  • Ultra large (warehouse type): Costco, Walmart
  • Large (‘typical’ suburban grocery store): IGA, Metro, Maxi, Super C, Provigo
  • Specialized (‘ethnic’ and ‘healthy’ foods): Avril, Rachel Béry, Adonis
  • Medium (smaller urban stores): Intermarché, Marché Tradition, Marché Richelieu, Bonichoix

Code here

Voronoi catchments

To get the estimated population served for each store, the following steps are carried out:

  • Compute voronoi polygons (using ggvoronoi in R)
  • Get census data at the dissemination block level (with cancensus)
  • Intersect both geometries
  • Perform spatial interpolation of census population to the intersected layer (with areal)

Note: Since dissemination blocks are small, the voronoi intersection recipe laid out above yields similar results to the ones obtained by taking the distance between the dissemination block centroid and the store with nngeo::st_nn() and then evaluating the nearest store.

Code here


The heatmaps were obtained by:

  • Filtering the stores by type
  • Computing the 2D kernel density estimate to obtain a 3D grid approximation
  • Extracting contour lines and converting them to polygons

Code here and here