# Construction de l’indice de concurrence spatiale

L’indice mesure combien de concurrents sont accessibles à pied autour d’une boutique, en donnant davantage de poids aux plus proches. Il décrit une exposition concurrentielle potentielle, conditionnelle aux magasins recensés. Il ne mesure ni les ventes ni le pouvoir de marché.

## 1. Fixer deux populations différentes

La population étudiée pour les prix comprend les boutiques de thé dans la limite administrative de Taipei, présumées indépendantes sauf chaîne clairement identifiée. Seuls les dossiers complets entrent dans la régression. La population des concurrents comprend aussi les chaînes, les indépendants incomplets et les enseignes non résolues. Un prix manquant chez un voisin ne l’empêche pas de concurrencer la boutique étudiée.

Le repérage croise l’inventaire OSM/Foodpanda de juillet 2026, le catalogue public [Nidin](https://order.nidin.shop/) du 13 septembre 2026 et les recherches nominatives. Le catalogue initial comprend 2 166 entrées à 30 km, avant filtrage du marché et du territoire. Ce croisement n’est pas un recensement exhaustif. Les cafés, restaurants et vendeurs de feuilles seuls sont hors du marché étroit ; les commerces mixtes nécessitent une vérification de leur offre.

Les identifiants, noms, adresses et coordonnées servent à rapprocher les sources. Deux pages du même établissement ne font qu’un concurrent. Deux succursales actives distinctes comptent chacune, même sous la même enseigne. Les doublons documentés et les activités hors marché sont exclus. Les fermetures permanentes ou temporaires signalées par une fiche Google correctement rapprochée sont exclues de l’exposition courante, avec leur source et leur date. Les commerces dont l’activité reste inconnue demeurent identifiables comme incertains ; une page de livraison inactive seule n’établit pas une fermeture physique.

## 2. Appliquer la frontière sans couper les concurrents voisins

L’appartenance à Taipei est déterminée par inclusion du point, bord compris, dans la [limite officielle des douze districts](https://data.taipei/dataset/detail?id=1601ef3a-c253-4988-b047-943d9e786143). Leur union est calculée en TWD97 / EPSG:3826, puis convertie en WGS84. Les minuscules trous internes de raccordement inférieurs à 10 m² sont comblés, sans modifier le contour extérieur. La géométrie disponible est datée du 15 septembre 2022, avec ressource mise à jour en septembre 2024.

Une boutique étudiée doit être dans Taipei ; un concurrent peut se trouver de l’autre côté de sa frontière. La recherche conserve donc une bande extérieure de 1 km. Les concurrents de cette bande ont le même poids que les autres à temps de marche égal. Le champ `competitor_within_taipei` permet de les identifier dans le tableau des voisins.

## 3. Calculer des trajets sur le réseau piéton

Pour chaque boutique i, on présélectionne tous les autres points j à au plus 1 000 m géodésiques, puis on interroge une matrice de trajets dirigés i → j. La présélection économise des calculs ; elle n’est pas la distance utilisée dans l’indice.

La matrice utilise **Valhalla 3.5.1**, le réseau OSM disponible sur le serveur, le mode `pedestrian`, le type `foot` et une vitesse de base de **5,1 km/h**. Les paramètres exacts, l’état du moteur et son horodatage de tuiles sont publiés dans `routing_parameters.json`. L’horodatage des tuiles n’est pas une garantie de mise à jour de chaque rue. Les réponses brutes et les coordonnées sont archivées ; leur empreinte lie la matrice à cette version précise des points et des options. Toute correction de coordonnées impose un nouveau calcul. Voir la [documentation des matrices](https://valhalla.github.io/valhalla/api/matrix/) et le [code du modèle piéton utilisé](https://github.com/valhalla/valhalla/blob/3.5.1/src/sif/pedestriancost.cc).

Le moteur peut prendre en compte des passages, détours, pentes et certaines traversées présents dans son réseau. Son champ `time` représente des secondes estimées, distinctes de ses coûts de préférence. L’itinéraire retenu par le moteur n’est pas nécessairement le plus court en mètres. Les sens i → j et j → i sont conservés séparément. Les temps ne sont pas mesurés sur le terrain et ne reflètent pas les attentes réelles aux feux, la foule, la météo ou un escalier fermé non cartographié.

Cette version ne possède pas d’option d’exclusion stricte des ferries. Tous les points sont contrôlés pour ne pas démarrer sur un segment de ferry ; le coût d’embarquement est fixé à 3 600 secondes, au-delà des seuils étudiés. Ainsi aucun trajet empruntant un ferry ne peut avoir un poids positif. Le protocole porte sur la marche, sans métro ni vélo.

## 4. Contrôler le rattachement au réseau

Un point commercial peut être rattaché à une rue légèrement décalée. Pour éviter un temps artificiellement très faible, on retient :

`walk_s(i,j) = max(raw_walk_s(i,j), straight_m(i,j) × 3,6 / 6)`

La borne de 6 km/h est volontairement plus rapide que le maximum permis par le modèle piéton vérifié pour cette version, y compris ses gains en descente. Elle est un contrôle de cohérence, pas la vitesse utilisée pour convertir toutes les distances en durées. Ensuite : **tᵢⱼ = walk_s(i,j) / 60**, en minutes. Les champs `raw_walk_s`, `walk_s`, `walk_min` et `time_guard_applied` permettent de contrôler cette correction.

Avec cette borne, une distance géodésique de 1 km exige au moins 10 minutes. Un magasin au-delà de 1 km ne peut donc pas recevoir de poids positif aux seuils de 3, 5 ou 10 minutes. C’est pourquoi la présélection et la bande extérieure de 1 km suffisent **pour cette définition de l’indice**. Elles ne prouvent pas que tous les magasins de cette zone ont été trouvés.

## 5. Pondérer puis additionner

Pour un seuil T exprimé en minutes :

**CIᵢ(T) = Σⱼ≠ᵢ max(0, 1 − tᵢⱼ / T)**

Le poids d’un concurrent est donc 1 à temps nul, décroît linéairement, et vaut zéro à T ou au-delà. Le seuil principal est **T = 5 minutes**. Le seuil de cinq minutes est une hypothèse de concurrence locale fixée avant toute estimation ; il ne provient pas d’une enquête de déplacements des clients. Les calculs à **3 et 10 minutes** sont les tests de sensibilité prévus, sans choisir ensuite celui qui donne le résultat le plus significatif.

| Exemple illustratif, pas un relevé réel | Temps à pied | Poids à 5 min |
|---|---:|---:|
| Chaîne A | 1 min | 1 − 1/5 = 0,80 |
| Indépendant B au dossier incomplet | 2,5 min | 1 − 2,5/5 = 0,50 |
| Chaîne C située hors Taipei | 4 min | 1 − 4/5 = 0,20 |
| Boutique D | 6 min | 0 |
| **Total** | | **1,50** |

L’indice n’est pas divisé par le nombre de magasins. Une moyenne des poids pourrait masquer l’arrivée de nouveaux concurrents. Ici, ajouter un voisin proche augmente l’exposition ; éloigner un voisin la réduit. Une valeur de 1,50 représente une somme de poids équivalant à 1,5 concurrent à temps nul, et non un effectif réel de 1,5 magasin. Le nombre brut de concurrents de poids positif est exporté séparément.

Une chaîne et un indépendant reçoivent le même poids à temps égal. Ce choix garde une définition purement spatiale : la note, le nombre d’avis, le prix et la gamme du voisin ne sont pas réinjectés dans l’indice. Les contributions des chaînes, des indépendants documentés et des enseignes non résolues sont néanmoins exportées séparément et leur somme reproduit le total. La présence commune d’une enseigne ne crée pas de pondération supplémentaire.

## 6. Traiter les manques et les zéros

Un voisin routé situé au-delà du seuil reçoit un poids nul. En revanche, l’absence de temps pour un voisin pouvant être dans le seuil selon la borne de 6 km/h rend l’indice **manquant**, et non égal à une somme incomplète. Un magasin sans voisin pertinent et avec couverture de calcul complète a un indice de zéro sur l’inventaire observé. Ce zéro ne prouve pas l’absence de concurrents non recensés.

Les filtres de carte, le choix de la boutique et l’admission à l’échantillon ne modifient jamais la population J du calcul. La précision complète des temps est utilisée avant arrondi ; le total public est arrondi à quatre décimales. Il peut différer légèrement de la somme de poids déjà arrondis affichés à l’écran.

## 7. Vérifier un magasin et reproduire les résultats

Dans le module, sélectionner une boutique et ouvrir **Voisins et contributions**. Le tableau donne les noms, les temps et les poids au seuil choisi. Les traits de la carte relient les magasins ; ils ne dessinent pas les itinéraires réels.

Dans le classeur, filtrer l’onglet **Voisins** sur `shop_id`, puis additionner `weight_5min`. Comparer au champ `ci_5min` de **Candidats**. Le même contrôle s’applique aux colonnes `weight_3min` et `weight_10min`. Les colonnes de sources, d’activité et de frontière documentent chaque voisin. Les données comprennent aussi les voisins de poids nul dans la fenêtre de présélection.

Pour reproduire toutes les valeurs des candidats avec Python, télécharger `candidates.csv`, `competition_neighbors.csv` et `recompute_competition.py` dans le même dossier, puis exécuter :

```sh
python3 recompute_competition.py
```

Le script utilise uniquement la bibliothèque standard, reproduit le traitement des manques et contrôle les totaux contre les valeurs publiées. Il ne contacte aucun service. Reproduire les **trajets eux-mêmes** exige en plus les mêmes tuiles de réseau et la même version du moteur : l’export des temps permet de vérifier l’arithmétique, pas de recréer un réseau routier perdu.

## 8. Ce que l’indice permet de conclure

La comparaison économétrique oppose un modèle avec les contrôles de produit, de boutique et de quartier à ce même modèle augmenté de CI, sur exactement les mêmes dossiers complets. Le coefficient de CI et le gain de pouvoir explicatif décrivent une association conditionnelle. Une forte densité commerciale peut aussi signaler une forte demande : un coefficient positif ou négatif n’identifie pas, à lui seul, un effet causal de la concurrence. Voir [Bresnahan et Reiss (1991)](https://www.journals.uchicago.edu/doi/10.1086/261786) sur l’interprétation conjointe de l’entrée et de la taille du marché.

La robustesse doit couvrir les seuils, le nombre brut de voisins, les composantes chaînes/autres, le retrait des boutiques de frontière et la restriction aux concurrents dont l’activité est récente. Cette dernière restriction peut sous-estimer la concurrence parce que les commerces absents des plateformes sont moins documentés. Les erreurs de recensement, d’adresse, de réseau et de date doivent rester visibles ; l’indice est une mesure de travail reproductible, pas une certification d’exhaustivité.
