← Retour aux projets

Faut-il vraiment déployer cette nouvelle version de l'application ?

#Python#DuckDB#SQL#Matplotlib
Taux d'échec par niveau — v10.2 vs v11.0

Contexte

Analyse de données sur un jeu mobile hyper-casual. Deux builds sont déployées en parallèle : la v10.2 (référence) et la v11.0 (rollout progressif). Objectif : déterminer si la nouvelle build est saine, ou s'il faut mettre en pause le rollout 100%.

Deux angles d'analyse :

  • Angle Produit / Publishing — v11.0 est-elle meilleure, équivalente, ou pire que v10.2 ? Focus sur la rétention et l'engagement.
  • Angle Game Design — si v11.0 sous-performe, pourquoi ? Le problème est-il global, ou concentré sur un niveau spécifique ?

Données

Deux extraits préagrégés couvrant les 90 derniers jours d'installations Android. Ci-dessous les 5 premières lignes de chaque table, pour montrer le grain réel des données.

user_activity — activité quotidienne par cohorte

~85K lignes. Une ligne par date d'install × version × pays × réseau × package × jour de cohorte. Les KPIs de rétention, sessions et temps de jeu se calculent sur cette table.

d_install_dates_app_names_app_versions_oss_countrys_acquisition_networks_installing_pckg_groupi_cohort_groupsf_playtimei_active_usersi_count_sessions
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending0105410.242116
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending164774.02566
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending246151.41344
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending310524.5816
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending426027.9825

progression — funnel niveau par niveau par cohorte

~530K lignes. Même grain, plus i_level : démarrages, complétions, échecs et temps de jeu pour chaque niveau. Le fail rate et le temps de jeu par niveau viennent d'ici.

d_install_dates_app_names_app_versions_oss_countrys_acquisition_networks_installing_pckg_groupi_cohort_groupsi_leveli_level_startedi_level_completedi_level_failedi_usersf_play_time
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending0143412428151.4
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending0244404408306.7
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending0333330334650.9
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending0426233232850.0
2026-02-02Wonders Kingdom10.2androidBRAppLovincom.android.vending0512111111728.7

Métriques clés

v10.2 vs v11.0

v10.2 en bleu foncé, v11.0 en rouge.

Rétention D1
55%51%
-4.1 pp
Rétention D3
32%26%
-6 pp
Rétention D7
20%16%
-4.5 pp
Sessions / user
2.642.29
-13.4 %
Temps de jeu / user
44 min32 min
-28.2 %

La v11.0 sous-performe sur toutes les métriques clés : la rétention perd 4 à 6 points à chaque jalon (D1, D3, D7), et l'engagement s'effondre — –13% de sessions par utilisateur et –28% de temps de jeu. Le détail des métriques suit ci-dessous.

Méthodologie

  • Stack : Python + DuckDB pour l'agrégation SQL, Matplotlib/Seaborn pour la viz.
  • Cohortes : une cohorte est le groupe d'utilisateurs ayant installé l'application le même jour (d_install_date), avec la même version d'app, le même pays, le même réseau d'acquisition et le même package d'installation — cette combinaison de colonnes définit une cohorte, et chaque ligne appartient à une.
  • Rétention : SUM(active_DN) / SUM(d0_users). Le dénominateur D0 est dynamique : seuls les segments ayant encore une activité au jour N entrent au numérateur et au dénominateur, pour éviter de diluer la rétention par des cohortes déjà mortes.
  • Taux d'échec : SUM(i_level_failed) / SUM(i_level_started) par version × niveau.
  • Engagement : SUM(sessions) / SUM(active_users) et SUM(playtime) / SUM(active_users).
  • Fenêtre d'observation : tous les KPIs sont calculés sur les jours 0 à 7 après l'installation — i_cohort_groups BETWEEN 0 AND 7, où D0 est le jour d'install et D7 sept jours plus tard.

Rétention

Rétention globale D0–D7

Part des utilisateurs actifs à chaque jour de cohorte.

v10.2v11.0

La chute est continue depuis le D1 — pas un drop isolé mais une dégradation systémique, qui suggère un problème structurel de la build plutôt qu'un bug ponctuel.

Focus US vs Global

Rétention : US (pointillés) vs Global (plein)

Vérifier si la régression est géographique ou globale.

v10.2 — Globalv10.2 — USv11.0 — Globalv11.0 — US

Les US sont le premier marché, et suivent la même tendance que le global. Pas de disparité régionale marquée — le problème n'est pas géographique. Si dégradation il y a, elle est liée à la build elle-même, pas à un mix d'acquisition.

Engagement

Engagement global par utilisateur (D0–D7)

Sessions ouvertes par utilisateur actif et temps de jeu cumulé par utilisateur.

Sessions par utilisateur

Temps de jeu par utilisateur

v10.2v11.0

Chaque utilisateur v11.0 ouvre 13% de sessions en moins (2.29 vs 2.64) et accumule 28% de temps de jeu en moins (31 min vs 44 min). La baisse d'engagement indique soit que les utilisateurs se sont ennuyés, soit qu'ils ont été découragés par le niveau de difficulté.

Sessions & temps de jeu par jour de cohorte

Engagement journalier par utilisateur (D0–D7)

Évolution jour par jour — pour voir si la chute s'installe à un moment précis.

Sessions / user / jour

Temps de jeu / user / jour

v10.2v11.0

La chute d'engagement est là dès le D0 (jour d'installation) et reste constante jour après jour — les users v11.0 ouvrent moins de sessions et jouent moins chaque jour, pas seulement au fil du temps.

Focus US vs Global

Engagement : US vs Global

Comparaison directe des deux régions par build.

Sessions / user

Temps de jeu / user

Taux d'échec par niveau

Taux d'échec par niveau (Global)

Part des tentatives échouées sur le total des tentatives à chaque niveau (1–30).

v10.2v11.0

Marqueur vertical au niveau 7 — point de divergence critique entre les deux builds.

Le Niveau 7 est le point de divergence critique. Taux d'échec : 14.2% (v10.2) → 60.4% (v11.0) — soit +46 pp et un taux 4.2× plus élevé. C'est le seul niveau avec une telle cassure — et il intervient tôt dans le funnel, juste après l'onboarding. Les niveaux 1 à 6 sont quasi identiques entre les builds ; à partir de L8, la pénalité de fail rate reste dans la fourchette +8 à +18 pp jusqu'à L20+. Conclusion : la v11.0 a globalement durci la difficulté, avec un spike catastrophique au L7.

Top 10 des écarts de difficulté (v11.0 − v10.2)

NiveauFail rate v10.2Fail rate v11.0Écart (pp)
Level 714.2%60.4%+46.1 pp
Level 2752.5%70.8%+18.3 pp
Level 2960.0%71.4%+11.5 pp
Level 2343.6%54.7%+11.1 pp
Level 2444.5%53.5%+9.0 pp
Level 1019.7%28.6%+8.9 pp
Level 1833.2%42.1%+8.9 pp
Level 1424.3%32.9%+8.6 pp
Level 1322.9%31.4%+8.4 pp
Level 2139.3%47.7%+8.4 pp

Niveau 7 domine largement (+46 pp) — seul point de divergence critique. Les 9 autres niveaux cumulent +8 à +18 pp.

Focus US vs Global

Taux d'échec : US (pointillés) vs Global (plein)

Vérifier si la dégradation de difficulté se retrouve à l'identique aux US.

v10.2 — Globalv10.2 — USv11.0 — Globalv11.0 — US

Les US suivent la tendance globale partout jusqu'au L20, avec une volatilité plus forte après — cohérent avec un échantillon US plus réduit. Le spike du L7 est présent partout, ce qui confirme un problème de design du niveau, pas un mix d'acquisition.

Temps de jeu par niveau

Temps de jeu moyen par utilisateur et par niveau (Global)

Temps passé par utilisateur actif, par niveau — pour identifier où le playtime se perd.

v10.2v11.0

Le temps de jeu par niveau reste globalement constant dans les deux builds. Les spikes marquent les niveaux plus difficiles (les users réessayent, donc chaque niveau prend plus de temps) : le spike du L7 en v11.0 reflète son taux d'échec de 60%, et les spikes L27–L29 montrent que la difficulté monte sur les derniers niveaux. La différence est la forme : la v10.2 progresse régulièrement à mesure que les niveaux avancent, tandis que la v11.0 saute irrégulièrement — suivant sa courbe de difficulté plus heurtée.

Recommandations

Product

Équipe Publishing

  • Mettre en pause le rollout 100% de v11.0 — elle sous-performe sur tous les KPIs (rétention D1/D3/D7, engagement).
  • Attendre un fix pour le Niveau 7, puis lancer un A/B test avant de repousser le rollout.
  • Re-exécuter l'analyse post-fix pour confirmer l'amélioration des métriques clés (D1, D3 surtout, signaux de rollout les plus fiables).
Engineering

Équipe Game Design

  • Restaurer le Niveau 7 à sa version v10.2 — c'est la cause racine principale de la chute de rétention.
  • Rééquilibrer la courbe de difficulté sur L8–L20+ : la progression des niveaux doit être une ligne fluide plutôt que des à-coups de difficulté allant de +8 à +18 pp. La progression de difficulté idéale à intégrer dans chaque niveau doit être réévaluée.