
Pour un de nos clients de l'industrie pharmaceutique, j'ai créé un ensemble de tableaux de bords permettant de suivre le recrutement des sites participants et des patients lors du suivi d'une étude clinique. Nous avons convenu ensemble que pour le recrutement des patients, un arbre de décision serait une représentation visuelle intéressante.
L'arbre de décision n'est pas une visualisation native dans Tableau. Après avoir effectué des recherches, j'ai compris que l'arbre de décision était en fait une adaptation d'un Sankey chart et que la structure des données utilisées devait suivre un schéma très spécifique.
Considérons que l'arbre de décision que nous devons créer est le suivant :

Cet arbre représente le cheminement des patients recrutés dans une étude clinique, voici quelques éléments de terminologie :
- Screened : les patients participent à une visite de 'screening' pendant laquelle une série de tests sont réalisés afin de vérifier s'ils remplissent les critères d'inclusion et d'exclusion de l'étude.
- Screen failed : Si les patients rencontrent au moins un critère d'exclusion lors de la visite de screening, ils sont 'Screen Failed', et ne sont donc pas inclus dans l'étude.
- Randomized : Les patients ont satisfait à tous les critères lors de la visite de screening, et sont donc inclus dans l'étude. Ils reçoivent un numéro de traitement de manière aléatoire, sans savoir s'il s'agit du traitement de l'étude ou un placebo.
- Early terminated : Les patients ayant été randomisés sortent finalement de l'étude avant d'avoir commencé le traitement, ou après l'avoir commencé, mais sans l'avoir suivi en entier (en raison de la survenue d'un événement indésirable).
- Treated : Les patients randomisés commencent le traitement.
- Completed : Les patients ont suivi leur traitement au complet, comme prévu par le protocole de l'étude.
- Screen failed : Si les patients rencontrent au moins un critère d'exclusion lors de la visite de screening, ils sont 'Screen Failed', et ne sont donc pas inclus dans l'étude.
- Randomized : Les patients ont satisfait à tous les critères lors de la visite de screening, et sont donc inclus dans l'étude. Ils reçoivent un numéro de traitement de manière aléatoire, sans savoir s'il s'agit du traitement de l'étude ou un placebo.
- Early terminated : Les patients ayant été randomisés sortent finalement de l'étude avant d'avoir commencé le traitement, ou après l'avoir commencé, mais sans l'avoir suivi en entier (en raison de la survenue d'un événement indésirable).
- Treated : Les patients randomisés commencent le traitement.
- Completed : Les patients ont suivi leur traitement au complet, comme prévu par le protocole de l'étude.
Cet arbre représente donc visuellement, parmi tous les patients ayant participé à la visite de screening initiale, quelle proportion suit le chemin prévu de l'étude jusqu'au bout.
La structure des données

Avec A1, A2, B1, B2, C1, C2 les codes de chaque branche de l'arbre :
La source de données doit être structurée en fonction de ces branches de l'arbre : chaque ligne de la source de données correspond à une branche.
La table principale
Description des champs nécessaires :
Field name | Description |
---|---|
Study | Nom de l'étude |
Site | Nom du site (hôpital) |
PathCode | Identification de la branche de l'arbre (A1, A2, B1, B2, ...) |
Level 1 | Etiquette du point haut de la branche |
Level 2 | Etiquette du point bas de la branche |
Nb patients | Nombre de patients dans le Level 2 de la branche, pour chaque site |
Position 1 | Position du point haut de la branche sur l'axe des abscisses |
Position 2 | Position du point bas de la branche sur l'axe des abscisses |
Pour les champs Position 1 et Position 2 , les chiffres sont choisis de la manière suivante :
Le haut de l'arbre est placé au milieu d'un axe ayant une amplitude de 10 unités, et toutes les autres positions sont réparties autour, de manière symétrique.

Voici un exemple de structure de table, pour 2 études (une avec un level randomized et un level treated, et une avec uniquement un level randomized) et 2 sites.
Study | Site | PathCode | Level 1 | Level 2 | Nb patients | Position 1 | Position 2 |
---|---|---|---|---|---|---|---|
A | 1 | A2 | Screened | Randomized | 25 | 5 | 7.5 |
A | 2 | A2 | Screened | Randomized | 20 | 5 | 7.5 |
A | 1 | A1 | Screened | Screen failed | 5 | 5 | 2.5 |
A | 2 | A1 | Screened | Screen failed | 10 | 5 | 2.5 |
A | 1 | B2 | Randomized | Treated | 20 | 7.5 | 9 |
A | 2 | B2 | Randomized | Treated | 15 | 7.5 | 9 |
A | 1 | B1 | Randomized | Early terminated | 5 | 7.5 | 6 |
A | 2 | B1 | Randomized | Early terminated | 5 | 7.5 | 6 |
A | 1 | C2 | Treated | Completed | 15 | 9 | 10 |
A | 2 | C2 | Treated | Completed | 10 | 9 | 10 |
A | 1 | C1 | Treated | Early terminated | 5 | 9 | 8 |
A | 2 | C1 | Treated | Early terminated | 5 | 9 | 8 |
B | 1 | A2 | Screened | Randomized | 30 | 5 | 7.5 |
B | 2 | A2 | Screened | Randomized | 25 | 5 | 7.5 |
B | 1 | A1 | Screened | Screen failed | 5 | 5 | 2.5 |
B | 2 | A1 | Screened | Screen failed | 5 | 5 | 2.5 |
B | 1 | B2 | Randomized | Completed | 20 | 7.5 | 9 |
B | 2 | B2 | Randomized | Completed | 20 | 7.5 | 9 |
B | 1 | B1 | Randomized | Early terminated | 10 | 7.5 | 6 |
B | 2 | B1 | Randomized | Early terminated | 5 | 7.5 | 6 |
La table T
Une autre table est nécessaire, contenant uniquement un champ T :
Le champ T est composé de 49 valeurs, de -6 à 6, avec une intervalle de 0.25 entre les valeurs (Le nombre de valeurs et l'incrément peuvent varier).
Ce champ est utilisé pour construire la courbe des branches de l'arbre.
T |
-6 |
-5.75 |
-5.5 |
-5.25 |
-5 |
... |
0 |
0.25 |
0.5 |
0.75 |
1 |
... |
5.25 |
5.5 |
5.75 |
6 |
Produit cartésien
Les deux tables sont jointes à l'aide d'un produit cartésien (définition Wikipedia), chaque ligne de la table principale sera donc répétée 49 fois.
L'utilisation dans Tableau
Une fois la source de données créée, il est nécessaire de créer des champs calculés dans Tableau.
Les champs calculés
Positionnement
Les champs suivants sont nécessaires au bon positionnement des informations sur l'arbre de décision.
Nom du champ | Code | Commentaires |
T2 | IF [PathCode] = 'A1' OR [PathCode] = 'A2' THEN [T] ELSEIF [PathCode] = 'B1' OR [PathCode] = 'B2' THEN [T]+12 ELSEIF [PathCode] = 'C1' OR [PathCode] = 'C2' THEN [T]+24 END | Ce champ est utile pour répartir les branches sur l'axe des ordonnées, selon le niveau auquel elles appartiennent |
Sigmoid | 1/(1+EXP(1)^-[T]) | Ce champ permet de créer l'arrondi des branches de l'arbre |
Curve | [Position 1]+(([Position 2]-[Position 1])*[Sigmoid]) | Ce champ permet de créer les courbes des branches en positionnant chacun des 49 points sur l'axe des abscisses. |
Points | if LAST()=0 OR FIRST()=0 AND ATTR([PathCode]) = 'A2' THEN sum([T2]) end | Ce champ permet de positionner les nœuds de l'arbre sur l'axe des ordonnées. Ce champ contient des calculs de table. |
Etiquette
Les champs suivants sont utiles pour définir le contenu de chaque étiquette.
Nom du champ | Code | Commentaires |
Patients screened | {FIXED [Study],[Site]:SUM({INCLUDE [PathCode]: MAX(CASE [Level 1] WHEN 'Screened' THEN [Nb patients] ELSE NULL END )} )} | Pour chaque étude et chaque site, on calcule le nombre de patients screened, qui correspond à la somme des patients ayant été randomisés et de ceux ayant été screen failed. |
Nb patients to be display | IF AVG([T2]) = SUM({FIXED [Study]:MIN([T2])}) THEN SUM([Patients screened]) ELSE SUM([Nb patients]) END | Ce champ permet de choisir quelle information afficher en fonction de la position sur l'arbre : Nombre de patients screenés en haut de l'arbre, Nombre de patients du level 2 dans les autres cas. |
% of screened | [Nb patients to be display]/SUM([Patients screened]) | Calcul du pourcentage du nombre de patients à chaque niveau par rapport au nombre de patients screened au départ du recrutement. |
Color | if AVG([T2])= -6 then ATTR([Level 1]) elseif AVG([T2])= 6 then ATTR([Level 2]) elseif AVG([T2])= 18 then ATTR([Level 2]) elseif AVG([T2])= 30 then ATTR([Level 2]) end | Ce champ permet de choisir le label à afficher : level 1 ou level 2 en fonction de la position sur l'arbre. |
Construction de la vue
Afin de construire la vue, les champs calculés relatifs au positionnement vont être utilisés en Lignes et en Colonnes, les autres champs vont être utilisés sur l'étagère des repères.

Le champ T2 va permettre de positionner l'ensemble des 49 points constituant les branches sur l'axe des ordonnées.
Le champ Points va permettre de positionner uniquement les points aux extrémités des branches. Ce champ contient un calcul de table qui est calculé au moyen des dimensions spécifiques (pour chaque branche de l'arbre, au long des valeurs de T):

Les champs T2 et Points forment un axe double.
Le premier axe est utilisé pour représenter les branches de l'arbre, le type de repère est donc Ligne. Les branches sont plus ou moins épaisses en fonction du nombre de patients comptés en fin de branche : SOMME(Nb patients) est sur Taille. PathCode et T sont en Détail de la vue, afin de créer un repère pour chacun des 49 points de chaque branche.

Le deuxième axe permet de représenter les extrémités des branches. Les étiquettes vont donc être définies sur son étagère des repères, avec les champs Color, % of Screened et Nb patients to be display.
Color est également mis en Couleur.

Conclusion
Il n'est pas si compliqué de créer une arbre de décision avec Tableau. Le tout est d'avoir la bonne structure de données.
Références
Mon arbre sur Tableau public : Decision tree clinical trial | Tableau Public, vous pouvez télécharger le classeur.
Les arbres qui m'ont inspirée :
Node Link Tree Diagram Example | Tableau Public
Decision Tree | Tableau Public
La courbe sigmoïde : Définition de Wikipedia