Consigne donnée au modèle pour la commande Run All Correlations : à partir des Données Exploitables, calculer la base de corrélations qui alimentera l'écran Corrélations automatiques.
Le but final n'est pas un coefficient — c'est une corrélation (terminologie V2 : on ne dit pas « règle », on dit « corrélation »), de la forme :
« Lorsque Facteur A, Facteur B, Facteur C et Facteur D pendant 48 heures, et seulement en l'absence totale de Facteur E, alors le 3ᵉ jour, dans 100 % des cas, on observe Facteur F et Facteur G. »
Le moteur travaille donc en deux couches :
Pearson ne peut pas, par construction, produire un « toujours/jamais » — il produit un degré. C'est la couche 2 qui produit les corrélations ; la couche 1 lui sert d'éclaireur.
On compare deux facteurs en réduisant chacun à une série de scores datés, puis en corrélant les deux séries. Le cas le plus simple et le plus lisible : deux facteurs en oui/non.
« booléen » = un facteur qui vaut seulement oui ou non (codé 1 ou 0) — ex. « Manger Didi », « Colon irritable ». « booléen × booléen » = mesurer le lien entre deux facteurs oui/non : quand l'un est à oui, l'autre a-t-il tendance à être à oui aussi ?
Deux facteurs oui/non → 4 combinaisons possibles chaque jour. On compte les jours dans chaque case (exemple : Didi × Colon le lendemain, n = 9) :
| Colon oui | Colon non | |
|---|---|---|
| Didi oui | a = 5 | b = 1 |
| Didi non | c = 0 | d = 3 |
La table = 4 chiffres ; phi les résume en un seul nombre entre −1 et +1 :
Numérateur a·d − b·c = concordances moins contradictions. Lecture :
phi, c'est exactement le coefficient de Pearson appliqué à des 0/1. Donc la même mesure (Pearson) marche partout — sur des oui/non (phi) comme sur des nombres (heures de sommeil). La table 2×2 n'est que la forme lisible de ce calcul quand les deux facteurs sont des oui/non.
Pearson (sous ses trois formes) n'est qu'un comparateur. Ce qui fait la validité d'une enquête, ce sont les couches autour. Distinction clé : un garde-fou = un avertissement à l'utilisateur (allégeable pour un test) ; un pilier de validité = ce qui détermine si le chiffre est vrai ou faux (non négociable). Les piliers ci-dessous relèvent de la validité.
Chaque facteur brut doit être transformé en une variable intelligible avant Pearson : optimum (distance à l'idéal), sens des catégoriels, asymétrie (Fadi inerte → seul Didi compte), fenêtre délai vs cumul. Source : le registre User Beliefs (croyances de l'utilisateur, a priori révisables).
Risque si ignoré : Pearson compare des variables mal posées et sort des liens faux ou nuls (ex. optimum au milieu → il s'annule).
Reco v2 : acté — c'est le registre par facteur qu'on construit (type · optimum · fenêtre · sens attendu).
Tester des milliers de paires × lags × combinaisons fait apparaître des centaines de liens forts par pur hasard (5 000 tests → ~250 « phi > 0,5 » fortuits).
Risque si ignoré : l'outil devient une machine à coïncidences présentées comme des découvertes.
Reco v2 : séparer confirmatoire (hypothèse pré-posée = fort) et exploratoire (piste) ; afficher n ; exiger la réplication. La pré-enregistration passe par le carnet d'hypothèses.
Les jours ne sont pas indépendants (le mauvais sommeil s'enchaîne, les symptômes persistent) → la significativité usuelle surestime la confiance. Et un facteur caché fabrique de faux liens (week-end → plus de gens vus ET plus de Didi → faux « Social × Didi » ; une tendance lente fait tout corréler avec tout).
Risque si ignoré : des corrélations « fortes » qui ne sont que du calendrier ou une tendance.
Décision v2 (06/07) : la neutralisation jour-de-semaine / tendance n'est PAS faite en v2 (hors sujet pour l'instant) — [ROADMAP v3] : elle sera proposée avec un choix utilisateur pour l'activer ou non. En v2 : l'analyse conditionnelle (méthode C) débusque les confusions, et prudence sur le mot « significatif ».
On a posé « Non renseigné = paire jetée ». Mais si les bons jours sont moins loggés (tout va bien → pas d'entrée), le manque n'est pas aléatoire — le jeter biaise les résultats.
Risque si ignoré : l'outil voit la vie « pire » qu'elle n'est, et invente des liens.
Reco v2 : se poser la question (le manque est-il lié au ressenti ?) et contextualiser par la complétude (déjà affichée au Récap : « n / jours déclarés »).
La preuve la plus forte pour des données perso n'est pas une corrélation dans le passé, mais : l'outil prédit (« prochain jour chaud + Didi → attends-toi à des douleurs »), puis confirme sur des jours neufs.
Risque si ignoré : on ne distingue jamais une vraie règle d'une coïncidence rétrospective.
Reco v2 : la boucle hypothèse posée → nouvelles données → confirmation, portée par le carnet d'hypothèses (statut posée / confirmée / infirmée / affinée).
Décision : tous les piliers sont tenus en v2 — la v2 est le MVP du moteur qui fonctionne.
La couche qui produit les corrélations « quand …, alors … dans X % des cas ». Famille technique des règles d'association (type Apriori) : on énumère les combinaisons de conditions réellement présentes dans l'historique — jamais les 2²⁶ combinaisons théoriques — et on mesure pour chacune trois grandeurs.
| Grandeur | Définition | Lecture |
|---|---|---|
| Support (n) | nombre de jours où la combinaison de conditions s'est produite | la solidité de la base d'observation |
| Confiance | proportion de ces jours où l'effet a suivi | les corrélations « 100 % » = confiance = 1 |
| Lift | combien de fois plus souvent que le hasard l'effet suit la condition | écarte les effets déjà fréquents partout |
Expressivité des conditions — chaque condition d'une corrélation peut être :
Élagage (ce qui rend la recherche faisable) : si une combinaison {A, B} est trop rare (support sous le seuil), aucune de ses extensions {A, B, C…} n'est testée. On explore ainsi en profondeur uniquement là où les données existent. La couche 1 (dépistage Pearson) sert d'éclaireur pour prioriser les facteurs prometteurs.
L'historique contiendra des centaines de corrélations à confiance 100 % — la plupart par coïncidence (plus une corrélation a de conditions, moins elle matche de jours ; sur 2-3 jours, 100 % ne prouve rien). D'où la règle de statut :
Une corrélation 100 % à faible support est une CANDIDATE, pas une découverte. Sortie du moteur = toutes les corrélations à haute confiance, classées par support ; seuil : candidate sérieuse = observée au moins 3 fois (n ≥ 3).
Promotion : chaque candidate entre au carnet d'hypothèses (statut « posée par le moteur ») → elle est re-testée sur les jours futurs (validation prospective, pilier 4) → si elle tient, elle devient corrélation confirmée. C'est la boucle rétrospectif → prospectif qui transforme une coïncidence en savoir.
En plus de la base de corrélations, le Run produit une liste de besoins (data-needs_<id>.json) : les données manquantes qui bloquent le plus d'analyses, et les questions conditionnelles nécessaires à la validation prospective des corrélations candidates (« SI Didi aujourd'hui → demander demain matin : colon irritable ? »). Cette liste alimente le moteur de sollicitation de l'app — détail des trois niveaux dans l'Extraction Schema § Sollicitations.
Le premier run de toutes les paires éligibles, dans les deux sens, produit un résultat par paire dirigée, sauvegardé dans correlations_<id>.json et restitué dans l'onglet Corrélations automatiques.
Éligible = les facteurs retenus par le profilage J−3 des Bad Days (North Star : Brain fog = oui ET Fatiguée = oui) — le moteur regarde ce qui est sur-représenté dans les 3 jours précédant chaque Bad Day, et les paires ne tournent que sur ces facteurs. Repli : s'il n'existe aucun Bad Day dans l'historique, le run couvre TOUTES les paires — cas surtout attendu chez les utilisateurs en début d'usage. Dans tous les cas, les paires disqualifiées par l'utilisateur (sens exclus déclarés dans User Beliefs § Paires disqualifiées — ex. Eau → Vie sociale) sont retirées du périmètre avant le run et n'apparaissent pas au tableau. Arrondis : r (le coefficient de Pearson stocké dans le fichier et affiché au tableau) à 2 décimales, |r| arrondi au plafond, signe conservé — 0,591 → 0,60 et −0,591 → −0,60 (la force n'est jamais sous-estimée) ; le statut est déterminé sur la valeur arrondie (fichier et écran racontent la même chose).
Affiché par défaut en tête de l'onglet, repliable (collapse/expand) : une ligne par paire dirigée (A → B et B → A sont deux lignes), avec face à chaque nom de paire son statut parmi les 7 cas ci-dessous, plus le détail (r, fenêtre, n) quand il est calculable.
Filtres (08/07) : en tête du tableau, un filtre par statut (liste des 7 cas) et une search box de facteur — au clic, le menu de suggestions apparaît ; taper filtre la liste ; la sélection se fait obligatoirement dans la liste (simple select) et affiche toutes les paires contenant ce facteur, en déclencheur comme en effet.
États du tableau (08/07) : en mode replié, l'en-tête affiche le nombre de paires dirigées + la plage (« Calculé sur XX entrées au journal, structurées en YYYY données, depuis le JJ/MM/AAAA. ZZ corrélations fortes observées. ») — ces infos disparaissent en mode déplié, où un lien flottant « Replier le tableau ↑ » (sticky en bas de section) permet de refermer.
| Code | Statut | Condition mathématique |
|---|---|---|
| 1 | Données insuffisantes | n < 3 jours appariés |
| 2 | Facteur constant — incalculable | variance nulle d'un des deux facteurs sur les jours communs (σ = 0) |
| 3 | Pas de corrélation claire | n ≥ 3 et |r| < 0,35 — les deux varient indépendamment |
| 4 | Corrélation possible, même sens | 0,35 ≤ r < 0,6 — montent/descendent ensemble, modérément |
| 5 | Corrélation possible, inversée | −0,6 < r ≤ −0,35 — l'un monte quand l'autre descend |
| 6 | Corrélation forte, même sens | r ≥ 0,6 |
| 7 | Corrélation forte, inversée | r ≤ −0,6 |
Format de sauvegarde (la partie « dépistage » de la base de corrélations) :
{
"version": "2.0",
"meta": { "lastRunAt": "…", "model": "…", "daysAnalyzed": ["2026-06-22", "…"] },
"pairs": [
{ "from": "food.didi", // déclencheur (catégorie.KPI)
"to": "symptoms.colonMorning", // effet
"window": "0d", // fenêtre testée = celle déclarée du déclencheur
"status": 6, // code 1–7 du tableau ci-dessus
"r": 0.79, "n": 9 } // absents si status 1 ou 2
]
}
Le run tourne sur tout l'historique, sans limite de temps. L'écran lit ce fichier tel quel — aucune statistique n'est recalculée côté app.
La combinaison North Star (Brain fog = oui ET Fatiguée = oui) est traitée comme un méta-facteur — un nouveau format de facteur agrégé, nommé « Bad Day » : une série booléenne à part entière (oui les jours où la condition est remplie). Ce sont les corrélations qui précèdent ce méta-facteur qui sont investiguées — il joue le rôle d'effet dans toute la machinerie (paires dirigées, statuts, encarts), sans mécanique nouvelle.
| Temps | Action |
|---|---|
| 1 | Périmètre d'éligibilité = un premier run de paires dirigées chaque facteur → Bad Day (le méta-facteur), chacun à sa fenêtre déclarée, regard sur J−3. Les facteurs qui en ressortent sont les qualifiés — souvent des états d'écart fournis par l'encodage (« eau < 3 L », « pas de sport », « mauvais sommeil »). Aucun Bad Day dans l'historique → tous les facteurs sont qualifiés. |
| 2 | Disqualification : retrait des sens de paires déclarés sans pertinence (User Beliefs § Paires disqualifiées). |
| 3 | Run des paires : simple, 2 facteurs à 2, dans les deux sens (fenêtre du déclencheur), sur tout l'historique. |
| 4 | Tableau des résultats par paire (statuts 1–7) — c'est la phase exploratoire, affichée repliable dans l'onglet. |
| 5 | Run combinatoire (l'intérêt de l'IA) : sur les facteurs appartenant à des paires ayant donné les statuts 3, 4 ou 5 (pas de corrélation claire · possible même sens · possible inversée), tester toutes les combinaisons faisables — et pour chaque facteur d'une combinaison, tester AVEC et SANS (présence ET absence : {Didi = oui, Sport = non} → Bad Day est une combinaison distincte de {Didi = oui, Sport = oui} → Bad Day ; c'est le « seulement en l'absence totale de Facteur E » de la phrase-objectif). Une combinaison = conjonction de déclencheurs (chacun à sa fenêtre déclarée) → une seule série testée contre l'effet → mêmes statuts, mêmes seuils, même arrondi. Tranché (07/07) : PAS de limite au nombre de facteurs par combinaison — c'est le cœur de l'outil. Seul garde-fou : l'élagage par support (une sous-combinaison sans 3 occurrences n'est pas étendue) — il borne naturellement la profondeur : une grande combinaison ne survit que si elle a réellement ≥ 3 occurrences complètes. |
| 6 | Restitution : l'onglet Corrélations automatiques présente toutes les combinaisons (paires ET complexes) de statut 4, 5, 6 ou 7 — en encarts (ci-dessous). |
Tout verrou reste une série booléenne — donc c'est toujours le même Pearson/phi. Deux mécanismes complémentaires :
1. Construction par verrouillage (greedy, l'idée d'Elena) : on étudie Bad Day × manque d'eau la veille → on verrouille → la conjonction {manque d'eau ET Didi} devient une nouvelle série → re-Pearson contre Bad Day → on garde le verrou si r monte et si le support reste ≥ 3 → on continue avec le facteur suivant. Rapide (k×F tests au lieu de 2^F) et narratif (la chaîne des verrous se lit comme une histoire).
2. Énumération élaguée (le filet exhaustif) : toutes les combinaisons faisables avec/sans, coupées par le support — elle attrape ce que le greedy rate structurellement : les synergies pures (deux facteurs muets séparément, forts ensemble — aucun premier verrou n'améliore, donc le greedy s'arrête avant). Sur le volume de données visé, elle est calculable.
[ROADMAP] le verrouillage généralisé = un arbre de décision ; à explorer après la v2.
Période avec 10 Bad Days. Le run d'éligibilité (chaque facteur → Bad Day) puis le retrait des paires disqualifiées donnent 6 facteurs qualifiés : Didi = oui · Eau insuffisante · pas de Sport · mauvais Sommeil · pas de Mouvements/Étirements · Colon irritable le même matin. Le run combinatoire teste alors toutes les combinaisons faisables de ces 6 facteurs, chacun avec et sans, chaque combinaison → Bad Day, avec élagage par support (≥ 3 occurrences complètes) — sortie en statuts 1–7, restitution des 4/5/6/7 en encarts.
Étiquettes : « association faible/modérée » (V1) est remplacé par « Corrélation possible » (statuts 4-5) et « Corrélation forte » (statuts 6-7).
Phrase-titre — décrit la relation en mentionnant : les facteurs, la chronologie (issue des fenêtres — ex. « le repas Didi précède les intestins irritables le lendemain »), et le sens (« plus X augmente, plus Y diminue — corrélation inversée »).
Doublons : si plusieurs corrélations sont des doublons et donnent les mêmes résultats, leurs infos sont agrégées et un seul encart est affiché.
Occurrences : « 4 occurrences de combinaison de ces facteurs » = sur toute la période de données, les facteurs de cette corrélation ont été présents ensemble, observables, 4 fois (= n) — et sur ces 4 fois ils évoluent ensemble, d'où le statut.
| Constante | Valeur | Lecture |
|---|---|---|
| Support minimal (n) | 3 observations | une corrélation devient « candidate sérieuse » si la condition a été observée au moins 3 fois ; en dessous : « données insuffisantes » |
| Bandes de force | forte ≥ 0,6 · possible ≥ 0,35 · sinon pas de corrélation claire | seuils V1 conservés « pour l'instant » (|r| ou phi) |
| Fenêtre testée par paire | celle déclarée du facteur DÉCLENCHEUR (paires dirigées, évolution 07/07) | chaque direction d'une paire est testée sur la fenêtre User Beliefs de son déclencheur (ex. Eau→Social : journée même ; Social→Eau : 2 jours). Balayage 0–3 j uniquement pour un déclencheur sans fenêtre déclarée (exploratoire) ; les fenêtres voisines ne servent qu'à l'affinage, jamais au résultat rapporté |
| Neutralisation calendrier / tendance | NON en v2 | [ROADMAP v3] — avec choix utilisateur (activer ou non) |
Une paire A × B est deux questions distinctes : « A agit-il sur B ? » et « B agit-il sur A ? ». Chacune est testée avec la fenêtre déclarée de SON déclencheur dans User Beliefs : pour l'impact de l'eau sur la vie sociale, l'eau agit sur la journée même → on teste à J ; pour l'impact de la vie sociale sur l'eau, le social porte sur 2 jours → on teste sur J et J+1 (agrégat sur la fenêtre, pas des lags séparés). Un cumul déclaré (Didi, durée de sommeil) → la condition est la somme/fenêtre glissante. Le résultat rapporté (r, fenêtre, n) est donc celui de la fenêtre déclarée — les voisines confirment/affinent au carnet, elles ne remplacent pas le résultat.
Terminologie V2 : le produit de la couche 2 s'appelle une corrélation (jamais « règle ») ; « règles métier » reste réservé à l'encodage des facteurs (pilier 0, registre User Beliefs).
Le contrat complet donné au modèle reste à écrire. Points déjà défreichés en discussion :
meta). Réglé le 07/07 : format JSON du dépistage (section « Sortie du Run ») + restitution en tableau repliable dans l'onglet Corrélations automatiques. Réglés le 07/07 : éligibilité (facteurs du profilage J−3 des Bad Days ; aucun Bad Day → toutes les paires) et arrondis (r à 2 décimales). Couche 2 réglée le 07/07 : run combinatoire (statuts 3-5 → combinaisons, mêmes statuts/seuils, n = occurrences de la combinaison) — le fichier étend `pairs` avec des entrées `{factors[], to, windows[], status, r, n}`. Garde-fous tranchés : pas de limite de taille des combinaisons, élagage par support seul ; doublons à résultats identiques agrégés en un encart.