S'abonner à un site qui n'affiche ni pub ni articles "sponsorisés", ne vend pas vos emails ou vos profils n’est pas une option, c’est la seule solution pour que demain il existe encore ! Soutenez MedShake, abonnez-vous ou faites un don ! [message masqué aux abonnés]

MedShake's Village People

Publiée le par

logo billet
logo billet
Comment l'idée de remplir de dossiers une version de démo de votre logiciel de gestion patients vous amène à produire un script qui génère des individus et des généalogies basés sur la statistique officielle du pays ...

Update du 29 octobre : le script est publié sous licence AGPL sur le dépôt GitHub de MedShake.
Si vous ne le savez pas, j'édite depuis quelques années maintenant MedShakeEHR, logiciel libre de gestion de cabinet médical / paramédical (mais pas que, loin de là ...).
Le problème avec ce genre de chose, c'est qu'on en présente régulièrement des démos et qu'on souhaite les remplir de données sans avoir à le faire à la main. Et puis on veut aussi pouvoir tester le comportement du logiciel en charge et ses limites.

Quoi de mieux que de pouvoir peupler en quelques clics le logiciel de données fictives ? Ici elles commencent par des informations patient de base : un nom, un prénom, une date de naissance, une adresse, un téléphone ... et puis quelques données morphologiques aussi : une taille, un poids ...

Dites comme cela les choses ont l'air plutôt simple : tirer ces données de base au hasard ne demande pas 400 lignes de programmation. Oui, mais voilà, je ne vous ai pas parlé d'un léger détail : MedShakeEHR s'adresse aux libéraux : un médecin généraliste, une gynécologue ...
Ces professionnels suivent souvent, en particulier pour les premiers en milieu rural ou semi rural, une population gouvernée par tout un tas de liens familiaux. MedShakeEHR consacre d’ailleurs un onglet du dossier patient à ces liens familiaux et permet de relier les dossiers entre eux par lien de parenté.
Alors le script à créer doit générer des individus, oui, mais pas que, il doit aussi relier ces individus entre eux.

Commençons !

Au début il n'y a rien. Dieu (moi ou celui qui fera tourner le script ou le modifiera - j'ai trop joué à Populous dans ma jeunesse pour éviter la blague !) décide combien de personnes sont à créer. On (le script de la création du Monde selon Dieu) initialise un premier individu.

On lui attribue un sexe. À cette étape Dieu est binaire. Il n'a pas encore intégré toutes les données modernes possibles sur le sujet ;-). Il ne laisse que 2 choix à On.

On lui attribue une date de naissance. Et si tu crois déjà lecteur que cette seconde étape est facile, eh bien non ! D'abord On lui attribue un âge. Dieu a dès le départ fixé les âges qui bornent la population à créer. On va respecter ces bornes. Oui, mais pas que...
Ça serait trop simple. Dieu sait combien dans une population il y a de personnes de chaque âge. Comment il le sait ? Il a consulté la Bibl ... l’Insee. Alors On va choisir aléatoirement un âge à ce premier individu en pondérant l'aléa en fonction. Ça, c'est fait !

Ensuite Dieu a décidé que toute personne qui vient au monde a un nom de naissance. Dieu connaît tous les noms de famille dans sa population. Comment il le sait ? Il a (re)consulté la Bibl ... l'Insee. Crois-tu vraiment qu'il a autorisé On à taper au hasard dans la liste pour attribuer un nom à ce 1er individu ? Non (toi lecteur, tu commences à comprendre ...). Cette randomisation est pondérée en fonction du nombre de fois où est porté le nom dans la population de référence.

Dieu dit "chaque individu aura aussi un prénom". On va s'exécuter. Lecteur, je te vois venir avec tes gros sabots : tu vas me dire "j'ai compris ton coup de la pondération, tu vas nous le refaire pour le prénom". Oui ... mais non. Enfin pas de la même façon Dieu sait tout (il a vraiment beaucoup consulté la Bibl... l'Insee). Dieu connaît donc les 100 prénoms les plus donnés par sexe et année de naissance. Dieu a donc décidé qu'On devait pondérer par : sexe, décennie de naissance et fréquence du prénom parmi les autres dans la décennie (Dieu aurait pu demander qu'On le fasse par année et pas par décennie, mais il a considéré que 24 copier-coller étaient plus simples à faire pour On que 236).

Oui, je sais, à cet instant nous n'avons juste qu'un nom, un prénom et une date de naissance pour notre 1er individu. Ça pourrait être long...

On poursuit. Il doit fournir une adresse postale à l'individu. Dieu n'est pas très exigeant là dessus. On se base uniquement sur un fichier annexe qui contient une liste de villes avec leur code postal respectif et une liste de rue. On tape cette fois purement au hasard. Si Dieu devient plus exigeant par la suite, ça pourra être amendé simplement.

Dieu dit : "fonder un couple ne serait pas mal". On va s’exécuter encore et encore, c'est que le début d'abord d'accord. Seulement voilà. Si ton individu a 3 ans, le couple ... S'il en a 20 ... S'il en a 40 ... Lecteur tu le sens venir le coup de la pondération, je sais. Dieu a donc encore consulté l'Insee. On s'exécute donc (pondération par décade). Notez qu'ici aussi Dieu n'a pas encore intégré non plus toutes les données modernes sur le modèle du couple.
Notre individu est donc maintenant en couple ou pas, mais juste sur le papier. Mais même sur le papier, ça ne suffit pas à Dieu. Dieu veut savoir si cet individu est marié ou pas. Faut-il vous expliquer qu'On va pondérer la réponse en fonction de l'âge de l'individu et du nombre de mariés dans la population de référence ? Trop tard, c'est dit.

Bien, c'est beau d'être en couple, mais il faut encore savoir avec qui. Dieu demande donc la création du partenaire. On va bosser un peu.
Sexe du partenaire : opposé à celui de l'individu (Dieu n'est pas moderne, c'est déjà dit)
Âge du partenaire : pas de prise de tête pour Dieu, il randomise basiquement à -5 +5 autour de l'âge de l'individu
Nom de famille : là, c'est vous qui allez bosser ! Réfléchissez : si l'individu est féminin ou masculin, si le couple est marié ou pas : concluez qui dans un schéma traditionnel (la modernité de Dieu, épisode ...) va adopter le nom de qui et quels noms vont devoir être attribués ou générés pour compléter l'état civil de chacun.
Adresse : Dieu est basique, On exécute : un couple vit sous le même toit.

Fumée blanche ! Ève et Adam sont là. Eh bien non, patatras tout peut s'effondrer. Si l'âge du cap... si l'âge du partenaire est supérieur à l'âge maximum demandé par Dieu, le partenaire devient un spectre : il a virtuellement existé quelque millième de seconde et puis c'est tout. Mais l'individu reste lui avec le statut en couple activé et +/- marié. Le partenaire est juste éjecté pour mauvais critère d'âge et On n'essayera pas d'en générer un autre. Un autre critère fait que le partenaire n'existera pas : si la population a déjà atteint le nombre maximal d'individus demandé par Dieu.

Il faut que je vous avoue une chose : Dieu ici ne croit pas à la genèse. On doit impérativement générer une mère et un père à l'individu. Les seules raisons pour qu'On n'aboutisse pas sont les mêmes que pour la création d'un partenaire. Bien sûr quand On va créer mère et père, On na va pas le faire n'importe comment ! La vraie question est : "À quel âge maman a eu bébé ?" (so cute ...). Dieu a bien sûr une réponse : il propose qu'On randomise sur le taux de natalité par âge. Et pour l'âge du cap ... du père ? Dieu a pris une pause à ce moment-là. On a réfléchi et a brillamment conclu que Dieu lui dirait de faire comme pour le partenaire : randomisé à -5 ou +5 par rapport à l'âge maternel.
Pour le reste entre père et mère, c'est un savant échange de flui ... de données qui se base avant tout sur l'individu initial. On fait remonter le nom ... et la fameuse adresse postale ! Et pour ça, Dieu a décidé un truc tout à fait arbitraire : il y aura un âge fixé dès le départ où l'individu a son propre toit. Donc si l'âge de l'individu est supérieur à cet âge arbitraire gravé dans les Tables de la loi (au format yaml), alors ses parents ont leur propre adresse postale.

Revenons à notre mou... notre individu. Il a maintenant des parents. Il est temps de décider s'il a une fratrie. Et là ça ne rigole plus. Dieu c'est bien gratté les ... la tête avant de proposer une solution. D'abord combien d'enfants dans la fratrie ? Vous connaissez la musique : Insee ... blabla ... random ... blabla ... pondération. Bref, On tombe sur un chiffre entre 1 et 5 (Dieu veut bien faire plus, mais la Bibl .. l'Insee ne contient pas à première vue d'éléments à ce sujet).
Toi lecteur qui suit parfaitement, tu as déjà tout compris : si la fratrie se compose d'un seul élément, il n'y a rien à faire ! Mais au-delà ... mazette ...
Dieu a un (gros) problème : la répartition des naissances dans la fratrie. Un truc de malade. Si On osait, il dirait que Dieu est proche de ses limites. Mais On n'ose pas, car Dieu le dit souvent à ses enfants : "On c'est juste un con". Dieu a attendu que les données tombent du ciel. Mais rien n'est venu. Dieu a donc dit à On de pondérer sur le taux de natalité par âge pour extraire autant d'âges maternels qu'il y a d'éléments à générer dans la fratrie. Pour éviter les incohérences, On retire bien sûr les âges supérieurs à l'âge maternel et les âges déjà pris aux random précédents. Dieu sait que ça solution n'est pas idéale : la dispersion des naissances dans la fratrie est parfois curieuse. Pour le reste, concernant l'état civil, les adresses postales de ce petit monde, On agit comme pour l’individu lui-même (propre toit ou pas en fonction de son age).

Un individu, un conjoint, des parents, une fratrie. Soyons fous : et si On donnait des enfants à notre individu ? Dieu dit "On donne des enfants". En gros cette étape est construite à partir des éléments dont On possède déjà la logique dans les explications précédentes. Rien de bien complexe en plus, mais toujours cette problématique de cohérence de la dispersion des naissances.

Enfin Dieu demande qu'On attribue des caractéristiques personnelles à l'individu. Certaines choses sont aléatoires mais pondérées en fonction de la population générale (taille / poids), d'autres parfaitement aléatoires (job, même si on féminise le nom si besoin) ...

Voilà. À cette étape On a déjà mis en fiche toutes les personnes évoquées : l'individu de départ (n°1), le conjoint (n°2), les parents (n°3 et 4), les frères et sœurs (par exemple n°5,6,7), les enfants (par exemple n°8 et 9).
L'individu n°1 est 100% bouclé. Par définition, il est passé par toutes les étapes. Les autres ne le sont pas. On va donc lancer le processus sur l'individu n°2 (conjoint de 1) qui va lui même créer les personnes manquantes (ses propres parents). Et puis on va passer au n°3, n°4 ....
On va boucler ainsi jusqu'à aboutir à la fiche correspondante au nombre maximal d'individus demandé par Dieu.

Quelques secondes ou quelques minutes plus tard, Dieu aura sa population.

Elle n’est pas belle la vie ?

Voilà pour ce qui a bien occupé ma fin de semaine dernière. Je ne sais pas encore ce que je vais faire de ce script. J'avoue être un peu las des contacts générés par la mise en ligne de code sous licence GPL. La plupart des intéressés n'ont qu'un but : vous demander comment récupérer votre travail pour le privatiser sous leur nom. Et beaucoup d'autres se contentent de piller sans faire le moindre retour (quand ils prennent la peine de répondre au second mail, c'est déjà beaucoup ...). Alors si je publie ici ce billet, c'est d'abord pour faire savoir que ce script existe. Si certains expriment un besoin, on verra ce que j'en fais !

Fichier CSV exemple portant sur la génération automatique de 500 individus : Fichier CSV