Minkowski distance to perform cannibalization analysis

Requirements

To run this example you'll need:

  • The latest version of the Analytics Toolbox Core Native App installed in your Snowflake database

  • Optional: An active CARTO organization to visualize the results in a map

Example

In this example we are going to showcase how to use the Minkowski distance to evaluate cannibalization across Starbucks stores in Los Ángeles, assuming that the ratio of cannibalization depends on the nearby store sizes and the distance to them. As we do not have real data concerning of the store, for the sake of simplicity we are going to use a randomly generated value: starbucks_size.

The first step consists of cross joining the data in order to extract the different Starbucks combinations. Then, we use ST_MINKOWSKIDISTANCE to compute the distances between the different geometries. Notice that since this function returns a matrix, we are using GET to get the position [0, 1] from this matrix.

WITH starbucks AS
(
  SELECT geog,
  ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) - 1 AS id,
  uniform(1, 10, random()) AS starbucks_size
  FROM CARTO_ANALYTICS_TOOLBOX_CORE.PUBLIC.STARBUCKS_LOCATIONS_USA
  WHERE CITY = 'Los Angeles' AND geog IS NOT NULL
  ORDER BY id
),
crossjoined_starbucks AS
(
  SELECT t1.id AS t1_id, t1.geog AS t1_geog, t2.geog AS t2_geog, t1.starbucks_size AS t1_starbucks_size, t2.starbucks_size AS t2_starbucks_size
  FROM starbucks t1
  CROSS JOIN starbucks t2
  WHERE t1.id != t2.id
),
business_impact AS(
  SELECT t1_id, SUM(t2_starbucks_size * GET(GET(CARTO_ANALYTICS_TOOLBOX_CORE.CARTO.ST_MINKOWSKIDISTANCE(ARRAY_CONSTRUCT(ST_ASGEOJSON(t1_geog)::STRING,ST_ASGEOJSON(t2_geog)::STRING)), 0), 1)) AS received_cannibalization
  FROM crossjoined_starbucks
  GROUP BY t1_id
)
SELECT geog AS geom, starbucks_size, received_cannibalization
FROM starbucks t1
INNER JOIN business_impact t2
ON t1.id = t2.t1_id

In the following visualization the size of the dots represent the size of the Starbucks stores and the color represents the level of cannibalization by other stores. It can be identified at first sight how those stores that are surrounded by other big stores appear in darker color than the isolated ones.