Corpus 1 · le marché

Collecte des avis d'applications mHealth

Ce qu'on a fait pour constituer le corpus, et ce qu'on a obtenu. Périmètre : États-Unis, Google Play + Apple App Store.

Datasheet · 2026-07-08 21:56

AppendiceLe marché

1 801apps mHealth
9 344 646avis collectés
2008–2026couverture temporelle
182produits sur 2 stores
6 395 507textes d'avis distincts

Le pipeline de collecte

Sept étapes, toutes scriptées et reproductibles

  1. Découverte multi-source des apps
    Google Play (recherche mots-clés + boule-de-neige d'apps similaires) et Apple App Store (recherche iTunes + classements par genre). → 3 178 apps candidates.
    en savoir plus
    01_discover.py. Côté Google Play : recherche HTML par lexique santé maison (fitness, sleep, glucose, therapy…), puis expansion en boule de neige par le graphe « apps similaires » de chaque fiche — on suit les recommandations du store jusqu'à épuisement. Côté Apple : API de recherche iTunes sur les mêmes mots-clés + flux RSS des classements par genre (Health & Fitness, Medical). Chaque app garde sa méthode de découverte en base (colonne method) :
    · Google Play — recherche par mots-clés + boule-de-neige (apps similaires) — 2 356
    · App Store — classements par genre (flux RSS) — 520
    · App Store — recherche iTunes (mots-clés) — 302
  2. Enrichissement des métadonnées (niveau app)
    Description complète, éditeur, note, installs, dates ; permissions déclarées (Play) et étiquettes de confidentialité (Apple).
    en savoir plus
    04_scrape_appmeta.py. Pour chaque app : fiche complète (description, résumé, éditeur, genre, prix, classification d'âge, dates de sortie/MAJ, notes de version), permissions déclarées (Google Play, permissions_json) et étiquettes de confidentialité (Apple, privacy_json : données collectées, liées à l'identité, servant au pistage). Les métriques volatiles (note, nombre d'avis, installs) sont instantanéisées à chaque passage (table app_metrics) plutôt qu'écrasées.
  3. Filtrage « est-ce une app mHealth ? » — automatique
    Classification sémantique par embeddings contrastifs (sans se fier au genre du store). → 1 801 retenues, 1 377 écartées. Reproductible et réversible.
    en savoir plus
    02_classify_mhealth.py + 03_resolve_scope.py. Le genre déclaré du store est faillible (des jeux se rangent en « Health & Fitness ») : on classe donc par similarité sémantique contrastive — la description de chaque app est comparée à des textes-concepts « santé mobile » vs « non-santé », et le différentiel décide. Le seuil est figé dans in_scope (réversible, rien n'est supprimé). Puis audit manuel complet de la frontière (07/08_curate_scope*.py) : 109 faux positifs retirés (jeux, réveils, prépa d'examens, vétérinaire…), 33 faux négatifs repêchés (grossesse, santé mentale, nutrition), chaque décision tracée avec sa raison (apps.scope_reason).
  4. Liaison inter-stores
    Cascade : domaine inversé → éditeur+nom → similarité de nom → similarité de description. → 182 produits présents sur les deux stores.
    en savoir plus
    link_stores.py + 05_resolve_links.py. Cascade du plus sûr au plus flou : 1) domaine inversé du site éditeur (déterministe — même domaine des deux côtés = même produit) ; 2) éditeur + nom normalisés ; 3) similarité de nom ; 4) similarité de description par embeddings pour départager les ambigus. Les liens incertains passent par une UI de validation manuelle (validate_links.py). Bilan : 561 liens évalués, 338 confirmés, 182 produits présents sur les deux stores — ce qui permet les comparaisons Play/Apple à produit constant.
  5. Scraping exhaustif des avis
    Google Play (bibliothèque patchée) + Apple (client amp-api maison). Reprenable, résilient, mono-instance (verrou).
    en savoir plus
    06_scrape_reviews.py. Les bibliothèques publiques étant cassées, la collecte repose sur une bibliothèque Google Play patchée (le search() upstream ne fonctionnait plus) et un client Apple amp-api maison (jeton public du site web App Store). Le scraper est reprenable (curseur de pagination persisté), résilient aux erreurs réseau (backoff), et protégé par un verrou mono-instance. Ordre de passage : apps jamais scrapées d'abord, puis rafraîchissement des plus anciennes. ⚠ Apple a changé l'acquisition du jeton mi-2026 : les 196 086 avis App Store déjà collectés sont conservés, la collecte Apple est en pause.
  6. Rétention du brut (Fields of Gold)
    Chaque réponse d'API archivée compressée (74 732 réponses), horodatée, avec journal (74 735 requêtes) et versions d'outils (16 runs).
    en savoir plus
    Schéma db.py, calqué sur les recommandations de Boegershausen et al. (2022) : 74 732 réponses d'API brutes conservées verbatim (compressées zlib) pour pouvoir re-parser et trianguler ; 74 735 requêtes journalisées (URL, horodatage, statut HTTP — repérage des 429/échecs) ; 16 runs avec snapshot de config et versions d'outils ; déduplication non destructive des avis (first_seen/last_seen/ times_seen) pour détecter éditions et suppressions entre extractions. Chaque ligne parsée porte sa provenance (run, URL, méthode, rang).
  7. Vectorisation des avis
    Dédup → 6 395 507 textes distincts → 4 modèles d'embeddings de familles indépendantes (réplication croisée).
    en savoir plus
    09_embed_reviews.py. Déduplication exacte des textes (casse/espaces neutralisés) : 6 395 507 textes distincts (68 % des avis — le reste est dupliqué, typiquement des avis courts identiques). Encodage par 4 modèles de familles indépendantes (architectures et équipes différentes) pour la réplication croisée :
    · Qwen/Qwen3-Embedding-4B — Qwen3 (decoder-LLM) · dim 1024 · 13.2 Go
    · BAAI/bge-m3 — BGE (BAAI) · dim 1024 · 13.2 Go
    · intfloat/e5-large — E5 (XLM-R) · dim 1024 · 13.2 Go
    · sentence-transformers/all-MPNet-base-v2 — MPNet / SBERT · dim 768 · 9.9 Go
    Stockage en matrices float16 mémap. QC : vecteurs unitaires, aucune corruption, voisinages sémantiques cohérents sur sondes manuelles.

L'entonnoir de sélection

De 3 178 apps candidates à 1 801 apps mHealth

Le filtrage mHealth est automatique (classification sémantique) — traçable et réversible, pas de tri manuel arbitraire.

Apps découvertes (toutes sources)3 178
Classées « mHealth » (retenues)1 801
Avec au moins un avis1 678

Détail par store — Google Play : 2 356 → 1 067 · Apple : 822 → 734.

Sources de découverte
Google Play — recherche par mots-clés + boule-de-neige (apps similaires)2 356
App Store — classements par genre (flux RSS)520
App Store — recherche iTunes (mots-clés)302

Détail du corpus

Cliquez pour déplier chaque volet.

Complétude au niveau app 1 801 apps · couverture par champ

Champs « cœur »

ChampCouverture
Nom
100.0 % — 1 801/1 801
Éditeur
100.0 % — 1 801/1 801
Description
100.0 % — 1 801/1 801
Genre / catégorie
100.0 % — 1 801/1 801
Version courante
100.0 % — 1 801/1 801
Classification d'âge
100.0 % — 1 801/1 801
Prix
99.7 % — 1 795/1 801
Date de sortie
99.3 % — 1 788/1 801
Dernière MAJ
90.8 % — 1 635/1 801
Note moyenne
90.9 % — 1 638/1 801
Nb d'avis (compteur store)
94.0 % — 1 693/1 801

Champs spécifiques à un store

Permissions = Google Play ; confidentialité = Apple. Couverture rapportée par rapport au store concerné.

ChampStoreCouverture
Permissions déclaréesGoogle Play
97.4 % — 1 039/1 067
Résumé court (summary)Google Play
100.0 % — 1 067/1 067
Nb d'installations réelGoogle Play
100.0 % — 1 067/1 067
Étiquettes de confidentialitéApple App Store
98.8 % — 725/734
Notes de version (si publiées)les deux stores
40.1 % — 723/1 801

Liaison inter-stores : 1 801/1 801 apps rattachées à un identifiant produit ; 182 produits sur les deux stores.

Complétude au niveau avis 9 344 646 avis · 1 678 apps
9 148 560avis Google Play
196 086avis Apple
1 678apps avec avis (sur 1 801)
90.3 %des avis dans le top 10 % des apps
Avis par app — les 1 678 apps ayant ≥ 1 avis
1–9 avis
187 apps · 11 %
10–49 avis
236 apps · 14 %
50–199 avis
277 apps · 17 %
200–999 avis
597 apps · 36 %
1 000–9 999 avis
247 apps · 15 %
10 000+ avis
134 apps · 8 %
Total ≥ 1 avis1 678

Médiane 385 · moyenne 5 568 · max 663 184 (MyFitnessPal).

Repères
Couverture temporelle2008-07-31 → 2026-07-06
Textes distincts (dédup)6 395 507 (68 %)
Apps sans aucun avis123 / 1 801
Percentiles (p25/p75/p90)49 / 723 / 7 021

Asymétrie assumée : Apple plafonne les avis (~500/app/pays) → volume Apple faible (2.1 % du total). L'analyse de texte portera surtout sur Google Play.

Provenance & reproductibilité tout le brut est conservé
Élément conservéVolume
Réponses d'API brutes conservées (compressées)74 732
Requêtes journalisées (URL, horodatage, statut)74 735
Runs de collecte (config + versions d'outils)16
Instantanés de métriques d'apps3 910
Liens inter-stores évalués (dont 338 confirmés)561

Chaque donnée exploitée remonte à sa réponse d'API d'origine (compressée, horodatée). Base : 11.1 Go. Aucune donnée brute écrasée.

Vectorisation (fondation d'analyse) 6 395 507 textes × 4 familles

Familles indépendantes (architectures/équipes différentes) pour une réplication croisée. QC validé (vecteurs unitaires, voisinages cohérents).

ModèleFamilleDim.Taille
Qwen/Qwen3-Embedding-4BQwen3 (decoder-LLM)102413.2 Go
BAAI/bge-m3BGE (BAAI)102413.2 Go
intfloat/e5-largeE5 (XLM-R)102413.2 Go
sentence-transformers/all-MPNet-base-v2MPNet / SBERT7689.9 Go
Limites connues périmètre, biais, plafonds
  • Périmètre US — collecte en anglais ; multilingue (FR) prévu (embeddings choisis multilingues).
  • Biais de survie — seules les apps encore présentes sont observées ; les apps mortes sont invisibles.
  • Plafond Apple — ~500 avis/app/pays → volume Apple à traiter comme complément.
  • Scraping App Store interrompu (mi-2026) — jeton d'API Apple modifié ; les 196 086 avis déjà collectés sont conservés.
  • Frontière de tri auditée — recensement complet : 109 faux positifs retirés + 33 faux négatifs repêchés, chaque décision tracée (apps.scope_reason).
  • Longue traîne — 423 apps ont < 50 avis ; pondérer pour éviter la domination des mastodontes.
  • Instantané — descriptions/notes reflètent l'état au moment du scrape (mi-2026).