Pour terminer, intéressons-nous à l’aspect graphique, qui va nous permettre à la fois d’améliorer l’esthétique et de découvrir certains mécanismes et certaines limites de Tableau.
Nous nous sommes fondés sur une définition stricte de l’hémicycle comme un demi-cercle, autrement dit un périmètre extérieur formant un arc de cercle de 180°. Mais dans la pratique, les assemblées réelles comme leurs représentations graphiques vont souvent dépasser cet angle. À titre d’exemple, l’Assemblée Nationale réelle forme un arc total d’environ 190°.
Sur le principe, cela devrait être assez simple. Il suffit de créer un paramètre pour que l’utilisateur choisisse l’arc souhaité, et de filtrer suffisamment de bouche-trous. La difficulté est donc de transformer une quantité en une sélection.
Si vous avez vraiment besoin de faire une représentation en hémicycle avec un arc supérieur à 180°, la solution la plus simple est d’utiliser Excel ou un autre outil pour ajouter un numéro incrémental sur de fichier de données. Si ensuite vous avez besoin de filtrer 20 bouche-trous, il suffira dans Tableau de filtrer sur « Groupe différent de blanc OU numéro supérieur à 20 » pour éliminer les 20 premiers bouche-trous.
Cet article visant à explorer les possibilités de Tableau, je voudrais décrire ici des solutions purement Tableau, sans modifier le fichier de données.
La première question est donc de savoir s’il est possible de faire cette numérotation dans Tableau.
La difficulté est que toutes les fonctions qui permettent de générer ce type de numérotation (INDEX, RANK, RUNNING_COUNT, WINDOW_COUNT, etc.) reposent sur un calcul de table ; comme nous voulons numéroter des lignes individuelles, le calcul de table devra se faire selon l’identifiant (ou une autre dimension jouant ce rôle, par exemple la combinaison nom/prénom). Comme les calculs de tables se font sur le graphique lui-même, cela nous forcerait donc à inclure l’identifiant dans la représentation graphique (a priori en Détails), avec pour effet de descendre la granularité du graphique au niveau du député. On se retrouverait donc avec une étiquette par député au lieu d’une étiquette par secteur, et il faudrait revoir nos formules d’étiquette pour déterminer celles qui s’affichent parmi les 573 possibles…
On voit que cela n’est pas impossible (on pourrait déterminer le député médian de chaque groupe pour positionner l’étiquette au milieu), mais assez laborieux, et cela ne nous ferait utiliser que des mécanismes que nous avons déjà travaillés.
Je voudrais donc vous proposer deux approches différentes, dont le résultat n’est pas parfait, mais qui vont nous permettre de voir de nouveaux aspects de Tableau. Je vous invite donc à dupliquer votre dernier onglet, afin de pouvoir comparer les deux versions différentes.
Notre hémicycle sans débordement est à 180°, cela correspond au cas où il y a exactement autant de bouche-trous que de députés. Le débordement maximal consisterait à aller jusqu’à 360°, donc un camembert complet, c’est-à-dire aucun bouche-trou.
Il faut bien sûr créer un paramètre avec une plage (range) de 0 à 1 (donc de 0% à 100%), puis l’afficher.
Comme nous avons réglé une plage de validité, l’affichage du paramètre se fait sous la forme d’un curseur :
Pour ceux qui n'auraient jamais utilisé de paramètre, il s'agit de permettre à l'utilisateur de saisir lui-même une donnée numérique,
qui peut être utilisée comme filtre, dans les calculs et/ou comme affichage. Pour obtenir l'écran ci-dessus, faites un clic droit dans le
volet Données et choisissez Créer un paramètre (Create Parameter). Une fois le paramètre créé, mettez-le à disposition des utilisateurs
en faisant un clic droit dessus puis Afficher le paramètre (Show Parameter).
Créez maintenant un champ calculé « Filtre débordement » renvoyant une valeur booléenne, qui doit être Faux pour la proportion souhaitée de bouche-trous ; autrement dit, si l’utilisateur choisit 10% de débordement, votre champ doit être Faux pour 10% des bouche-trous.
La solution que je vous propose consiste à utiliser la fonction PERCENTILE. Pour éliminer 10% des données, il faut les trier par exemple sur l’identifiant, puis déterminer l’identifiant en-dessous duquel il y a 10% de l’effectif… ce qui est exactement la définition du dixième percentile.
Si vous n'êtes pas familier avec la notion de percentile, voici
un peu plus de détails. Le énième percentile est la valeur en-dessous de laquelle
il y a n % de l'échantillon. Dans notre exemple, il y a 573 députés triés selon
leur position gauche-droite. Le dixième percentile (ou centile) est la valeur
qui sépare les 57 premiers députés des 516 suivants. Le 57° député est
Andy Kerbrat (position 20,79413), la suivante est Ségolène Amiot
(position 20,794138), et Tableau calcule le 10° percentile (qui est pour lui
le percentile 0,10) comme étant la valeur 20,7941436, qui se situe bien
entre les positions gauche-droite de Kerbrat et Amiot.
Filtre débordement
Sélectionnez
[Groupe] <> "Blanc"
OR [identifiant] > {PERCENTILE([identifiant], [% débordement])}
Le percentile doit être calculé sur l’ensemble des données, d’où l’utilisation de la LOD abrégée {}.
Il ne reste plus qu’à placer ce champ en filtre pour ne retenir que les données où le booléen est Vrai, et à tester l’effet du curseur :
D'un point de vue graphique, dépasser les 180° permet notamment d'écarter les étiquettes les unes des autres,
et de faciliter ainsi la correspondance entre chaque secteur et son étiquette.
Tout fonctionne, néanmoins, il n’y a pas de correspondance simple entre le % débordement choisi par l’utilisateur et l’angle obtenu. Avec 50% de débordement, l’utilisateur risque de s’attendre intuitivement à obtenir un angle droit, donc 270°. On voit sur la copie écran que l’angle obtenu est plutôt de deux-tiers de cercle, soient 240°.
Y a-t-il une erreur ? Avec 573 députés et 50% de débordement, on obtient 286 bouche-trous (le booléen utilise une supériorité stricte). Les députés représentent donc 573 / (573 + 286), soient environ 66,7% d'un cercle, ce qui correspond bien à 240°.
Mathématiquement, tout est donc correct. Néanmoins, notre système est contre-intuitif, ce qui n’est jamais une bonne chose en dataviz. Idéalement, il faudrait calculer la proportion de bouche-trous à éliminer d’après l’angle souhaité ; néanmoins, la fonction PERCENTILE ne permet pas d’utiliser une valeur calculée comme numéro du percentile ; ça doit être impérativement une constante ou un paramètre. Tant que nous utilisons la méthode du percentile, nous sommes coincés avec notre pourcentage de débordement qui remplit son rôle, mais est peu compréhensible pour l’utilisateur.
Nous allons donc faire un petit tour de passe-passe cognitif : masquer les pourcentages et faire apparaître l’angle obtenu juste en-dessous du curseur.
VI-A-5. Exercice : calculer l’angle obtenu d’après le % débordement**▲
Déterminez la formule à utiliser pour trouver l’angle formé par notre hémicycle, en fonction du % débordement, puis créez un champ calculé « Angle obtenu ».
Faisons une petite équation, juste sur papier. Voici nos variables :
x : l’angle que nous cherchons à calculer, exprimé en degrés ;
n : le nombre de députés réels ;
d : le % de débordement choisi par l’utilisateur, qui est donc un décimal compris entre 0 et 1.
Si on a 10% de débordement, le nombre de bouche-trous sera 90% de n, autrement dit le nombre de bouche-trous est n(1 - d). La portion de camembert occupée par les vrais députés sera donc n / [n + n(1 - d)]. C’est également la portion de camembert occupée par notre angle x, qui vérifie donc l’équation :
n / [n + n(1 - d)] = x / 360
⇔ x / 360 = 1 / (2 - d)
⇔ x = 360 / (2 - d)
Traduisons cela en un champ calculé :
Angle obtenu
Sélectionnez
360 / (2 - [% débordement])
Ce résultat ne doit pas être agrégé, on peut donc le passer en dimension. Il est exprimé en degrés, nous n’avons pas besoin de décimales, vous pouvez donc lui donner le format numérique par défaut 0°.
Masquez le pourcentage tout en conservant le curseur, puis trouvez un moyen d’afficher juste en-dessous l’angle obtenu par le débordement choisi au curseur.
Faire disparaître le pourcentage est un jeu d’enfants, il suffit de Personnaliser (Customize) l’affichage du paramètre et de décocher Afficher les résultats (Show readout). Pensez également à Modifier le titre de la carte affichant le paramètre (Edit title) afin de faire disparaître la notion de %.
Pour afficher l’angle obtenu, faites un clic droit sur le champ calculé et choisissez Afficher filtre (Show Filter). Il ne vous reste plus qu’à personnaliser cette nouvelle carte pour faire disparaître la valeur "Tout" ("All" Value).
La dataviz, c’est de la communication : il faut donc à la fois donner l’information pertinente (l'angle) et éviter qu’elle ne soit polluée par une information moins pertinente (le pourcentage). L’utilisateur peut maintenant piloter son angle avec le curseur, sans s'inquiéter du calcul intermédiaire.
Changeons maintenant de perspective : nous allons vraiment demander à l’utilisateur l’angle qu’il souhaite, et calculer la part de bouche-trous à éliminer. Comme nous avons vu que cela nous interdit d’utiliser la fonction PERCENTILE() pour choisir les victimes, nous allons simplement les tirer au sort !
Cela vous surprendra peut-être, mais les algorithmes de calcul fondés sur des processus aléatoires, plaisamment surnommés Méthode de Monte-Carlo,
forment une technique statistique reconnue, utilisée notamment en physique des particules. L'exemple archétypique consiste à mesurer la surface
d'un lac en tirant une série de boulets de canon sur un carré de terrain englobant le lac : la proportion de boulets tombés à l'eau
indique la proportion de la surface occupée par le lac !
VI-B-3. Exercice : calculer la part de bouche-trous à éliminer*▲
Sur papier, trouvez la formule qui calcule le pourcentage de bouche-trous à filtrer en fonction de l’angle choisi par l’utilisateur. Puis, dans Tableau, créez un champ calculé % élimination qui implémente votre formule.
Il suffit de reprendre l’équation obtenue tout à l’heure, et de chercher maintenant à exprimer d en fonction de x :
x = 360 / (2 - d)
⇔ 360 / x = 2 - d
⇔ d = 2 - 360 / x
Si par exemple, l’utilisateur veut un angle de 240°, il faudra éliminer 2 - 360 / 240 = 0,5, donc 50% des bouche-trous. Cela correspond bien à nos tests précédents.
Cela nous donne dans Tableau :
% élimination
Sélectionnez
2 - 360 / [Angle souhaité]
Comme d'habitude, c'est une valeur constante à convertir en dimension afin d'éviter l'agrégation.
Nous connaissons maintenant le pourcentage de bouche-trous à filtrer. Ce serait assez déloyal de vous demander de deviner la fonction à utiliser pour faire un tirage au sort, car celle-ci est une fonction secrète, ou du moins une fonction non-documentée : elle se nomme RANDOM, n’utilise aucun argument, et a pour effet de générer aléatoirement un nombre décimal compris entre zéro et un.
Créez maintenant un champ calculé Filtre Monte-Carlo, renvoyant Vrai pour les députés réels et la bonne proportion de bouche-trous à garder, et Faux pour la proportion de bouche-trous à éliminer.
Pour éliminer par exemple 10% des bouche-trous, il suffit de poser une condition selon laquelle RANDOM doit être supérieure à 0,1. Comme le nombre aléatoire généré est compris entre zéro et un, ce sera vrai dans environ 90% des cas et faux dans environ 10%.
Filtre Monte-Carlo
Sélectionnez
[Groupe] != "Blanc" OR RANDOM() > [% élimination]
Vous aurez remarqué que non seulement RANDOM n’apparaît pas dans la liste des fonctions Tableau, mais en plus vous devez tapez son nom en entier sans qu’aucune autocomplétion ne vous soit proposée. Par contre, une fois tapée, elle est bien reconnue comme correcte par le vérificateur syntaxique.
Comme d’habitude, le Filtre Monte-Carlo ne doit pas être agrégé, vous pouvez donc le convertir en dimension.
Pourquoi diable la présence de RANDOM() dans Tableau est-elle toujours officieuse ? C’est un mystère qui ne manque pas de titiller l’imagination. Aurait-elle été introduite subrepticement par un développeur têtu qui aurait passé outre le veto indigné de sa hiérarchie ? Ou alors est-ce le résultat d’un compromis boiteux entre partisans et adversaires de la méthode de Monte-Carlo au sein de la direction de l’éditeur ? Toujours est-il que cette fonction s’avère très utile dans les cas où l’on souhaite répartir des données selon une distribution homogène, par exemple pour étaler aléatoirement des points de données de coordonnées identiques, afin qu’ils ne soient pas confondus (voici un exemple sur une boîte à moustaches).
Vous avez maintenant tous les éléments. Repartez de la feuille que vous avez copiée avant d’aborder la méthode des percentiles, et faites en sorte que l’utilisateur puisse choisir son angle et obtienne la visualisation souhaitée.
Il suffit d’afficher le paramètre Angle souhaité, puis de placer le champ Filtre Monte-Carlo en filtre, en choisissant la valeur Vrai.
Et c’est tout ! Voici un exemple de résultat final :
Le tirage aléatoire induit forcément une part d’approximation. Vous pouvez constater, sur votre classeur ou sur la copie écran ci-dessus, un léger décalage entre les secteurs des deux camemberts. Comme notre médiane assure la symétrie, cela peut peut-être passer pour un effet de style ?