David Madore's WebLog: Harmonisation de notes : variations sur un thème

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]

↓Entry #2724 [older| permalink|newer] / ↓Entrée #2724 [précédente| permalien|suivante] ↓

(jeudi)

Harmonisation de notes : variations sur un thème

Contrairement à ce que le titre de cette entrée peut laisser entendre, il n'est pas question ici de musique mais de comment corriger des copies. (Dans une certaine mesure, ce billet fait suite à celui-ci et dans une moindre mesure celui-là, mais je vais en redire les points importants.) Mais comme il est question de notes, je vais mettre beaucoup de notes dans ce billet. Et je vais, surtout, partir dans des digressions mathématiques franchement gratuites donc, préparez-vous.

Je suis responsable d'un enseignement de première année à Télécom Paris qui (comme quasiment tous les enseignements de première année) concerne l'ensemble de la promotion (soit ~200 élèves) : ils sont répartis en 6 groupes d'enseignement, chacun pris en charge pour cours+TD par un enseignant différent, mais au bout du compte, tout le monde passe le même contrôle de connaissances, qui est ce dont je veux parler ici : les copies de ce contrôle sont réparties aléatoirement[#][#2] entre les enseignants, et chacun va corriger un tas.

[#] Enfin, aléatoirement est peut-être un peu ambitieux. Je demande au service de l'enseignement de répartir les copies en six tas de taille à peu près égale, mais pas en suivant les groupes d'enseignement, et de me fournir la liste des noms de chaque tas. La manière exacte dont est faite cette répartition m'échappe, et il faut dire que c'est le genre de choses qui, en pratique, est un peu pénible, si on a une pile de ~200 copies (physiques) et un tableau de noms, pour faire une répartition en 6 groupes aléatoires et produire à la fois les six tas physiques et le tableau avec la répartition des noms. Si vous avez des astuces à proposer pour y arriver efficacement que je puisse expliquer sans mal au service de l'enseignement, n'hésitez pas à proposer.

[#2] On peut imaginer que chaque enseignant corrige les copies du groupe auquel il a fait cours (l'idée étant qu'il le connaît mieux), mais je trouve que c'est plus équitable d'avoir pour commencer une répartition aléatoire. En tout cas, c'est important pour l'harmonisation que je veux évoquer ici (à cause de leur construction, on ne peut pas faire l'hypothèse que les groupes d'enseignement sont de même niveau, alors qu'une répartition aléatoire l'est statistiquement).

Corriger, ici, ça veut dire remplir un tableau indiquant, pour chaque copie d'élève (λ, en ligne) et chaque question[#3] du contrôle (i, en colonne), une note (un nombre réel) xλ,i entre 0 et 1 [#4], où la note 0 signifie la question n'a pas été traitée ou est tellement fausse qu'il n'y a rien à en tirer et la note 1 signifie la question est traitée de façon parfaite et irréprochable, toute autre valeur étant à l'appréciation du correcteur.

[#3] Évidemment, s'il y a des sous-questions, je vais essayer de demander une note pour chaque sous-question, mais il y a une limite à la résolution atteignable. Grosso modo, je délimite 12 à 20 questions notées pour un contrôle.

[#4] Pour être plus précis, comme certains n'aiment pas noter sur 1, mon tableau de correction offre la possibilité de noter sur autre chose, par exemple sur 100, ce qui correspond simplement à diviser par le maximum en question. Mais comme cette possibilité ne change rien mathématiquement à ce que je veux raconter, ne fait que compliquer mes formules LibreOffice, et d'ailleurs de toute façon aucun correcteur ne s'en sert (pourtant c'est bien suite à des râleries de leur part que j'ai introduit la possibilité), autant ne pas en parler et convenir que la note de chaque question est entre 0 et 1. Ça simplifiera toutes les formules d'harmonisation dans la suite en évitant de diviser et de remultiplier.

Ensuite, bien sûr, toutes les questions n'ont pas la même valeur, c'est-à-dire qu'il y a un barème : chacune reçoit un poids pi, et la note de l'élève λ au contrôle est proportionnelle[#5] à la somme des pi · xλ,i pour toutes les questions i du contrôle.

[#5] J'écris est proportionnelle, parce que pour avoir 20/20 il n'est pas forcément nécessaire d'avoir 1 à toutes les questions (le contrôle est souvent noté sur plus que 20, les notes dépassant 20, s'il y en a, étant tronquées à 20). Donc la note de la copie λ est plutôt donnée par Nλ := Nmax · ∑i(pi·xλ,i)/∑i(pi) où Nmax vaut quelque chose comme 21 ou 22 ; ou, en fait, c'est min(Nλ,20) arrondi au 0.1 supérieur, ou quelque chose de ce goût-là. Je n'entre pas dans ces détails qui n'ont rien à voir avec ce que je veux évoquer ici. (Cf. le billet précédent pour plus de précisions.)

Seulement, voilà : tous les correcteurs ne notent pas aussi sévèrement. Cela se voit au fait que si je fais la moyenne des notes de chaque tas de copies, je devrais[#6] trouver plus ou moins la même chose si les tas ont été constitués aléatoirement, mais en fait je trouve des moyennes allant de 10.0 à 12.5 (disons, pour donner un ordre de grandeur) d'un correcteur à l'autre.

[#6] Pas exactement, bien sûr. Mais si l'écart-type des notes « justes » est de, disons, 3 points, alors moyenné sur 32 copies il devrait tomber à 3/√32 ≈ 0.5 points. Autrement dit, des fluctuations aléatoires entre moyennes des différents tas de copies de l'ordre d'un demi-point sont à attendre, mais quand c'est beaucoup plus, il devient pertinent d'harmoniser.

Comment harmoniser entre correcteurs, donc ? (Quand l'enjeu est vraiment important, on met en place une double correction, c'est le cas notamment à l'Agrégation ; mais on ne va pas faire ça pour les enseignements d'une grande école.) Les responsables de certains enseignements ignorent simplement le problème (ils considèrent par exemple que la répartition aléatoire des copies est une forme suffisante d'équité, ce qui se défend). D'autres appliquent un coefficient multiplicatif rendant égales toutes les moyennes (typiquement, on prend la plus haute moyenne d'un tas de copies, et on multiplie les notes de tous les autres par le bon coefficient par tas pour que chaque tas ait cette même moyenne). C'est simple, mais je trouve ça un peu insatisfaisant : une copie qui a traité parfaitement la moitié des questions et n'a pas du tout touché aux autres devrait avoir la même note quel que soit le correcteur qui l'a corrigée.

Mon idée générale est plutôt d'harmoniser les notes telles qu'elles m'ont été renvoyées, autrement dit, d'appliquer une fonction φ par correcteur : remplacer chaque note xλ,i par yλ,i := φ(xλ,i), où φ est choisi une fois pour chaque correcteur (mais ne dépend ni de la copie λ ni de la question i), et ensuite de faire le calcul sur les yλ,i comme si c'étaient ces notes-là qu'on m'avait fournies. (Et bien sûr, les fonctions d'harmonisation φ de chaque correcteur doivent être choisies de manière à donner au moins approximativement la même moyenne à leurs tas de copies respectives.)

Mais quelle fonction φ choisir ? Ou plus précisément, dans quelle famille de fonctions choisir les φ ? On veut au minimum une fonction croissante [0;1]→[0;1] (puisque les notes de chaque question sont dans l'intervalle [0;1] et qu'évidemment si un même correcteur a mis une note plus élevée ça doit se refléter en un résultat plus élevé), et certainement continue (parce que les effets de seuil sont merdiques).

Je pars aussi du principe suivant : on doit avoir φ(0)=0 et φ(1)=1. Autrement dit, si le correcteur a mis 0 ou 1 à la question, je pars du principe que cela doit rester tel quel. Ce principe est sans doute contestable (la solution d'harmonisation consistant à multiplier toutes les notes par un même facteur c par correcteur revient à prendre φ(x) = c·x, ce qui préserve 0 mais pas 1, par exemple), mais je justifie mon principe en disant que si le correcteur a trouvé la question parfaite, ou au contraire totalement insauvable, tout autre correcteur devrait être d'accord avec ce jugement[#7] — ce sont les notes strictement intermédiaires entre 0 et 1 qui sont sujettes à plus de variations subjectives. (Les graphes tracés ci-dessous rendront peut-être plus claire l'idée de ce que je veux dire, mais grosso modo, une question 0% juste ou 100% juste on devrait être d'accord, alors qu'une question 30% juste peut-être qu'un autre correcteur la trouvera 50% juste ou 20% juste.)

[#7] Bon, encore faut-il que les correcteurs aient joué le jeu de suivre la consigne que je demande de ne mettre 0 que quand il n'y a rien, absolument rien à sauver à la question, et 1 que quand c'est absolument parfait, ce qui n'est pas forcément gagné, et de fait, je vois — et je mets moi-même ! — beaucoup plus de 0 et de 1 dans le tableau qu'il n'est raisonnable de penser qu'il y a de questions insauvables ou parfaites. Mais faisons semblant d'y croire.

Bref, c'est là que je commence à mettre ma casquette de matheux : on cherche des familles de fonctions continues croissantes, et même strictement croissantes, [0;1]→[0;1] fixant 0 et 1. Cela laisse encore énormément de possibilités ! Je vais m'imposer deux ou trois contraintes supplémentaires pour limiter sérieusement les choses :

  • D'abord, je vais chercher une famille à un paramètre de fonctions. Je ne vais pas définir ça rigoureusement, mais l'idée est que je cherche à appliquer une rectification unique par correcteur, sur la base d'un seul paramètre (pour harmoniser les moyennes de chaque tas) : je ne veux pas qu'il y ait trente-six paramètres à régler, en vertu de l'adage bien connu attribué à von Neumann : With four parameters I can fit an elephant, and with five I can make him wiggle his trunk. Donc : un seul paramètre d'harmonisation par correcteur (à la rigueur on peut envisager deux si je peux défendre très sérieusement cette idée, mais certainement pas plus), pour éviter de cacher un éléphant dans mes copies.
  • Ensuite, je veux que ma famille de fonctions d'harmonisations forme un groupe. Ceci signifie grosso modo que si on applique une fonction d'harmonisation (de la famille choisie) puis une autre, le résultat doit encore être une fonction d'harmonisation de la famille choisie. Cette exigence n'est pas évidente à justifier (à part pour son élégance mathématique), mais l'idée très vague est qu'aucun correcteur ne doit être privilégié : si on dispose d'une fonction qui ramène l'échelle des valeurs intermédiaires du correcteur X à celles du correcteur Y et une qui ramène l'échelle des valeurs intermédiaires du correcteur Y à celles du correcteur Z, on doit pouvoir les appliquer[#8] successivement pour ramener l'échelle des valeurs intermédiaires du correcteur X à celles du correcteur Z. Et aussi (cela fait aussi partie de l'exigence de constituer un groupe), si on dispose fonction qui ramène l'échelle des valeurs intermédiaires du correcteur X à celles du correcteur Y on doit pouvoir l'inverser (l'appliquer à l'envers) pour ramener l'échelle des valeurs intermédiaires du correcteur Y à celles du correcteur X.
  • Par ailleurs, on veut sans doute imposer que 0 et 1 soient les seuls points fixes de φ, ce qui revient à demander que soit φ(x)<x pour tout 0<x<1 (fonction appliquée pour un correcteur trop peu sévère), soit φ(x)>x pour tout 0<x<1 (fonction appliquée pour un correcteur trop sévère). Peut-être même qu'on veut imposer dans le premier cas que φ soit convexe et dans le second qu'elle soit concave, ou d'autres choses de ce genre.

[#8] Les théoriciens des catégories pourraient me faire remarquer que je demande plutôt, en fait, que mes fonctions d'harmonisation sont un groupoïde (une catégorie dont les objets sont les correcteurs et les morphismes sont les fonctions d'harmonisation). Ignorons-les.

Je suis donc amené à chercher des objets mathématiques déjà nettement plus limités : des groupes à un paramètre d'homéomorphismes croissants [0;1]→[0;1] (un homéomorphisme croissant [0;1]→[0;1] est la même chose qu'une fonction continue strictement croissante [0;1]→[0;1] fixant 0 et 1).

[Graphes des fonctions x ↦ x^γ sur [0;1]]Le choix que j'ai fait jusqu'à présent (c'est-à-dire, jusqu'à cette année incluse), consiste à utiliser la famille de fonctions x ↦ xγ d'élévation à une puissance γ (comprise au sens strict entre 0 et +∞). Le graphe de différents éléments de cette famille de fonctions d'harmonisation (régulièrement espacées[#9] dans le groupe à un paramètre) est tracé ci-contre à droite. Imaginez donc qu'en abscisse vous avez la note que le correcteur a choisie, et en ordonnée la note « harmonisée » (la courbe la plus basse correspond à un correcteur trop généreux dont il faut diminuer les notes, et la plus haute correspond à un correcteur trop sévère dont il faut augmenter les notes ; la courbe médiane est l'identité, c'est-à-dire, le segment diagonale ; et si on applique plusieurs fois la fonction juste au-dessus de l'identité, on obtient les fonctions successives au-dessus, tandis que leur inverse donne les fonctions successives en-dessous : c'est en gros ça le concept de groupe à un paramètre dont on a représenté des éléments régulièrement espacés).

[#9] Il faudrait expliquer exactement ce que régulièrement espacées veut dire ici : cela signifie que j'ai pris les puissances r-ièmes, pour r parcourant les entiers de −10 à 10 inclus, d'un même élément du groupe, autrement dit, j'ai tracé les x ↦ xγr où, en fait, γ₀ a été choisi valant exp(1/10), c'est-à-dire qu'il s'agit des graphes de x ↦ xexp(r/10) pour r∈{−10,…,10}. (Cela peut sembler bizarre d'avoir une exponentielle en exposant, mais c'est logique quand on pense que composer des fonctions puissances multiplie les exposants, donc des fonctions puissances régulièrement espacées dans le groupe sont des exposants qui sont multiplicativement régulièrement espacées, c'est-à-dire qui sont eux-mêmes des exponentielles de réels additivement régulièrement espacés.)

Le choix de x ↦ xγ se défend par ce qu'il est particulièrement simple : élever à une puissance γ est quelque chose qu'on peut faire facilement dans un tableur, notamment, et c'est aussi sans doute la première idée qui viendra à l'esprit de quelqu'un qui a compris le problème et cherche un homéomorphisme croissant [0;1]→[0;1]. (Au moins dans le domaine du graphisme, quand il s'agit d'harmoniser la réponse de moniteurs à un signal d'entrée, cela porte d'ailleurs un nom habituel : une correction gamma.)

Maintenant, ce qui saute aussi aux yeux sur ce graphique (surtout quand on est comme moi obsédé par la symétrie), c'est qu'il n'est pas très symétrique. Je veux dire, les notes proches de 0 et les notes proches de 1 ne subissent pas du tout le même effet sous l'opération de cette famille de fonctions d'harmonisation : l'effet de l'harmonisation est beaucoup plus prononcé[#10] sur les notes proches de 0. Peut-être est-ce souhaitable : peut-être que la différence de sévérité entre correcteurs va surtout se faire sentir sur les notes proches de 0 que sur celles proches de 1. (On peut bien sûr lire le graphique à l'envers, et imaginer qu'en abscisse on a une note de référence de la question et en ordonnée la note que met un correcteur plus ou moins sévère, selon l'échelle de sévérité corrigée par cette famille-là de fonctions d'harmonisation.) Peut-être bien, effectivement, que la différence de sévérité est plus liée à l'inclinaison à repérer une bribe d'idée dans une réponse presque entièrement fausse qu'à l'envie de sanctionner de petites imperfections dans une réponse presque parfaite. Est-ce le cas ? Je n'en sais rien. Mais faute d'information, je préfère partir de l'idée qu'on veut harmoniser de façon symétrique les notes proches de 0 et proches de 1. (Parce que, sinon, pourquoi utiliser x ↦ xγ plutôt que sa symétrique x ↦ 1−(1−x)γ ?)

[#10] Ceci est lié au fait que la dérivée de x ↦ xγ en 0 est nulle ou infinie selon que γ>1 ou γ<1, autrement dit, l'effet n'est pas du tout linéaire dans ce domaine — il est écrasant. Alors qu'en 1, la dérivée vaut simplement γ, donc on a un effet linéaire.

[Graphes des fonctions x ↦ x/((1−d)x+d) sur [0;1]][Graphes des fonctions x ↦ ½(1+erf(erfinv(2x−1)−e/√2)) sur [0;1]][Graphes des fonctions x ↦ (2/π)·arctan(tan(πx/2)/a) sur [0;1]]On peut tout à fait trouver des familles de fonctions d'harmonisation qui soient symétriques entre 0 et 1. La plus simple est donnée par la fonction rationnelle (homographie) x ↦ x/((1−d)x+d), où d est le paramètre dans la famille, qui est de nouveau multiplicatif (c'est-à-dire que composer deux telles fonctions multiplie les valeurs de d), que j'ai tracées en bleu ci-contre de façon régulièrement espacées[#11]. Ces fonctions sont encore assez simples à écrire et à calculer ; on peut les définir comme la famille des homographies qui envoient 0 sur 0 et 1 sur 1 (une homographie est le rapport entre deux fonctions affines non proportionnelles). La dérivée de la fonction vaut 1/d en 0 et d en 1, ce qui signifie que les notes très proches de 0 sont divisées par d tandis que l'écart à 1 des notes très proches de 1 est multiplié par d. La famille est complètement symétrique entre 0 et 1 en ce sens que symétriser la courbe par rapport au centre du carré (ce qui revient à conjuguer la fonction par x ↦ 1−x) donne la fonction inverse (c'est-à-dire la fonction correspondant au paramètre 1/d). Tout ça est assez satisfaisant pour l'esprit.

[#11] Là aussi, elles sont régulièrement espacées au sens où le paramètre d a été choisi comme valant exp(r × 3/20) pour r∈{−10,…,10}. La raison du 3/20 est qu'il fournit le même espacement, en aire, pour r petit, que le 1/10 du graphe précédent. (Plus exactement[#11b] : l'intégrale de xγ moins ½ vaut (1−γ)/4 à l'ordre 1, tandis que l'intégrale de x/((1−d)x+d) moins ½ vaut (1−d)/6 à l'ordre 1, donc une valeur de d de exp((3/2)·ε) est à comparer à une valeur de γ de exp(ε) en termes d'aire de l'écart à l'identité, ou coefficient de Gini si vous voulez.)

[#11b] Bon, puisque vous êtes apparemment du genre à lire les notes sur les notes, c'est que vous voulez vraiment les détails archi-précis, donc voici la normalisation que je fais : si (uφu) est un morphisme de (ℝ,+) vers le groupe des homéomorphismes croissants [0;1]→[0;1], de sorte que φ₀=id[0;1], si j'appelle G(u) la valeur 1 − 2∫φu(x)·dx (coefficient de Gini de φu), je reparamètre u (en le multipliant par une constante) de manière à avoir G′(0) = 1. Alors, avec cette convention, mes graphes sont tracés, dans chacun des trois cas, pour u allant de −½ à +½ par intervalles équidistants de 1/20. (Dans le premier cas (en rouge), γ = exp(2u), dans le second (en bleu), d = exp(3u), dans le troisième (en vert), e = (√π)·u, et dans le quatrième (en violet) a = exp((π²/4)·u).)

Les fonctions de cette famille x ↦ x/((1−d)x+d) peuvent aussi s'interpréter de la façon suivante : ce sont des décalages horizontaux[#12] sur le graphe d'une fonction logistique. Il y a toutes sortes de façons de redire ça[#13], par exemple en termes de variables aléatoires : on interprète (fictivement !) la note mise par un correcteur comme la probabilité qu'une certaine variable aléatoire, en l'occurrence distribuée selon une distribution logistique, soit inférieure à une certaine valeur, et en translatant la variable aléatoire en question (i.e., en décalant la valeur), on obtient la famille de fonctions que je viens de dire. C'est peut-être une façon bien compliquée de parler de x ↦ x/((1−d)x+d), mais l'intérêt est que cela suggère d'essayer d'autres distributions de variables aléatoires, d'autres fonctions « sigmoïdes », que la logistique.

[#12] Si on interprète x comme une valeur de la fonction logistique standard 1/(1+exp(t)), i.e., l'ordonnée d'un point (t,x) sur son graphe, alors x/((1−d)x+d) est l'ordonnée du point d'abscisse t + log(d), c'est-à-dire que translater l'abscisse de log(d) a l'effet de la fonction x ↦ x/((1−d)x+d) sur l'ordonnée.

[#13] En voici une : la fonction logistique fournit un homéomorphisme [−∞;+∞]→[0;1], et en conjuguant par cette homéomorphisme les translations sur [−∞;+∞], on obtient une famille d'homéomorphismes de [0;1], qui est celle que j'ai tracée en bleu. Mes autres familles s'obtiennent aussi[#13b] en conjuguant les translations par différents homéomorphismes [−∞;+∞]→[0;1] (qu'on peut préférer voir comme des fonctions de répartition de différentes variables aléatoires).

[#13b] Il n'est pas vrai en général qu'un groupe à un paramètre d'homéomorphismes [0;1]→[0;1] s'obtienne de la sorte : tout simplement parce que les translations n'ont pas de point fixe sur ℝ donc on obtient des familles d'homéomorphismes sans point fixe autre que 0 et 1. Je pense que des hypothèses tout à fait légères doivent permettre de conclure qu'un groupe à un paramètre d'homéomorphismes [0;1]→[0;1] sans point fixe autre que 0 et 1 s'obtient par conjugaison des translations par un homéomorphisme [−∞;+∞]→[0;1], mais je n'ai pas réfléchi précisément à quelles hypothèses.

En vert ci-contre j'ai utilisé la distribution normale (gaussienne). Précisément, les courbes vertes sont les courbes de la famille x ↦ ½(1+erf(erfinv(2x−1)−e/√2)) où e est le paramètre[#14] que je fais varier, et erf la fonction d'erreur (et erfinv son inverse) ; si on préfère, ces courbes vertes correspondent à faire un décalage horizontal sur le graphe de la fonction d'erreur alors que les courbes bleues étaient un décalage horizontal sur le graphe de la fonction logistique. Je suis sûr que ceci a une interprétation probabiliste assez naturelle.

(Il est par ailleurs intéressant que la dérivée en 0 — et aussi en 1 par symétrie — de ces fonctions est nulle ou infinie, même si c'est visuellement beaucoup moins frappant que pour la famille rouge. Et ce n'est pas complètement évident à voir ; cf. ce fil.)

[#14] Le √2 est complètement arbitraire ici, c'est juste pour dire que je translate la loi normale de e écarts-types. La note #11b en dit un peu plus sur la manière dont j'ai choisi, pour mes graphiques, de paramétrer les familles de façon comparable entre elles.

Quant aux courbes violettes, elles correspondent à la famille x ↦ (2/π)·arctan(tan(πx/2)/a), qu'on peut voir soit comme une homothétie sur la fonction tangente (sur la valeur d'une distribution de Cauchy, si on préfère), soit comme un décalage sur la fonction log-tangente[#15].

[#15] Non, ce n'est pas quelque chose d'aussi bizarre qu'il paraît : la fonction log-tangente apparaît en beaucoup d'endroits (par exemple dans l'ordonnée de la projection de Mercator). Le décalage de la tangente, lui, ne donnait pas quelque chose de convexe-ou-concave, c'est pour ça que je ne l'ai pas représenté.

[Graphes décrits dans le texte]On peut évidemment trouver d'autres familles de fonctions remplissant mes conditions, mais je pense que celles que j'ai tracées sont les plus simples et naturelles. Pour ce qui est de comparer ces familles, on peut par exemple tracer la différence à l'identité de la correction infinitésimale (i.e., la différentielle en l'identité de la famille[#16]) : c'est ce que j'ai fait ci-contre à droite[#17], ce qui permet de visualiser comment une toute petite correction affecte les notes, sur tout l'intervalle, dans chacune de ces quatre familles.

[#16] Elle-même normalisée pour être d'intégrale, disons, −½ pour correspondre à la normalisation donnée dans la note #11b.

[#17] Les fonctions tracées sont, précisément, 2x·log(x) en rouge, 3x(x−1) en bleu, −exp(−erfinv(2x−1)²)/√2 en vert, et −(π/4)·sin(πx) en violet.

Ajout () : voir aussi cette question sur MathOverflow relative à l'existence d'itérées fractionnaires de la fonction x ↦ √(1−x²) (dont le graphe est un quart de cercle), ce qui fournirait un autre groupe à un paramètre de bijections croissantes [0;1]→[0;1] possiblement intéressantes (peut-être même meilleur que tous mes autres exemples donnés ici, parce qu'on n'impose pas l'existence de dérivées en 0 et 1, c'est-à-dire que la fonction peut être « écrasante » ou « éclatante »), mais qui sont problématiques à calculer, certainement dans un tableau LibreOffice/Excel, et d'ailleurs je ne sais pas leur appliquer la même normalisation que mes exemples précédents (faute de savoir calculer le coefficient de Gini infinitésimal, cf. la note #11b), donc je ne les représente pas.

Bref, je me suis laissé emporter à de longues digressions qui sont assez caricaturales du mathématicien (qui, partant de la question de comment noter des copies de façon efficace, en arrive à se demander comment on classifie les groupes à un paramètre d'homéomorphismes [0;1]→[0;1]), mais je me pose quand même vraiment la question pratique de si je devrais changer ma formule x ↦ xγ pour, disons, x ↦ x/((1−d)x+d) (ou autre chose), et le cas échéant, comment l'implémenter avec un tableur (LibreOffice) sans que ce soit trop lourd[#18].

[#18] Je crois que le langage merdique des formules LibreOffice (enfin, je suppose qu'il est copié sur celui d'Excel) n'a pas de concept de variable locale : il semble que je ne peux pas écrire let x=[expression compliquée] in [autre formule compliquée], il faut soit dupliquer l'expression de x, ce qui rend la formule abominable, soit utiliser une case du tableau pour la calculer, ce qui impose d'étendre le tableau par plein de cases fictives moches qui ne serviront qu'à stocker des valeurs intermédiaires, soit enfin utiliser un langage de macros (LibreOfffice Basic), ce qui imposera sans doute d'autoriser l'exécution des macros à chaque fois qu'on ouvre le fichier et ce qui cassera certainement la compatibilité avec Excel. Bref, toutes les solutions sont pourries.

↑Entry #2724 [older| permalink|newer] / ↑Entrée #2724 [précédente| permalien|suivante] ↑

[Index of all entries / Index de toutes les entréesLatest entries / Dernières entréesXML (RSS 1.0) • Recent comments / Commentaires récents]