Skip to contents

Cette vignette de présentation montre comment utiliser le package.

Avant toute chose, il faut configurer la session R. En effet, certains choix qui sont fait dans les options de R n’arrange pas beaucoup les chercheurs en sciences sociales. la fonction mise_en_place() permet de bien configurer R :

mise_en_place_ACM()
#> 
#> ── Les options générales de la session R ont été modifié.
#>  Les nombres décimaux s'afficheront avec une virgule.
#>  Ils n'afficheront que 3 chiffres après la virgule.
#>  L'écriture scientifique a été désactivé.
#> 
#> 
#> ── Le thème des tableaux produit par gtsummary a été modifié. 
#> 
#>  Ils s'afficheront en français.
#>  En utilisant une virgule pour les nombres décimaux.

Une fois que cela est fait, on peut continuer. Commencez par charger vos données dans R. Pour plus d’information sur comment faire, n’hésitez pas à consulter des guides.

Une fois que vos données sont chargées, avant tout ACM vous allez pouvoir les inspectez. Pour les besoins de la démonstration je prendrais en exemple un jeu de données que j’ai créé pour mon mémoire de M2 sur les créateurs de contenus politiques. Il est inclus avec le package et est stocké dans un objet qui s’appelle createurs_de_contenus_pol.

createurs_de_contenus_pol 
#> # A tibble: 56 × 24
#>    personne  titre orientation orientation2 debut visage_decouvert abonnes genre
#>    <chr>     <chr> <fct>       <fct>        <fct> <fct>            <fct>   <fct>
#>  1 Antoine … Anto… De gauche   Progressiste 2015… Montre son visa… Entre … Homme
#>  2 Salomé S… BLAS… De gauche   Progressiste 2020… Montre son visa… Plus d… Femme
#>  3 Benjamin… Bolc… De gauche   Progressiste 2014… Montre son visa… Entre … Homme
#>  4 Aymric D… Cana… De gauche   Progressiste 2015… Montre son visa… Entre … Homme
#>  5 Cassandr… Cass… De gauche   Progressiste 2020… Montre son visa… 50k ab… Homme
#>  6 Pierre-Y… Cerc… De droite   Conservateur 2015… Montre son visa… Entre … Homme
#>  7 Christop… Chri… De droite   Conservateur 2014… Montre son visa… Entre … Homme
#>  8 Clément … Clém… De gauche   Progressiste 2020… Montre son visa… Entre … Homme
#>  9 Charléli… DANY… De gauche   Progressiste 2020… Montre son visa… Entre … Homme
#> 10 Julien G… Data… De gauche   Progressiste 2014… Ne montre pas s… Entre … Homme
#> # ℹ 46 more rows
#> # ℹ 16 more variables: age <fct>, streamer_plein_temps <fct>, collectif <fct>,
#> #   livre <fct>, podcast <fct>, twitter <fct>, facebook <fct>, instagram <fct>,
#> #   tiktok <fct>, discord <fct>, twitch <fct>, site_perso <fct>, CNC <fct>,
#> #   soutenir <fct>, partenariat_entreprise <fct>, autres_services <fct>

Ce jeu de données se composent de plusieurs colonnes :

Avant de procéder à l’ACM, il est vraiment utile de sortir un tri à plat de toute sa base de donnée. Pour cela, on peut utiliser la fonction tbl_summary() du package gtsummary. N’oubliez pas de retirer les variables qui ne se prêterait pas un tri à plat (dans mon cas la variable personne et titre). Vous pouvez retirez des variables en modifiant le paramètre include comme je le fais plus bas.

createurs_de_contenus_pol |> 
  gtsummary::tbl_summary(
    include = c(-personne, -titre)
    # je retire la variable personne et la variable titre du tableau
  )
Caractéristique N = 561
orientation
    Ne revendique pas d'appartenance 14 (25%)
    De gauche 29 (52%)
    De droite 11 (20%)
    Écologiste 2 (3,6%)
orientation2
    Divers 9 (16%)
    Progressiste 29 (52%)
    Conservateur 18 (32%)
debut
    2000 0 (0%)
    2014 et avant 10 (18%)
    2015 - 2019 29 (52%)
    2020 et après 17 (30%)
visage_decouvert
    Montre son visage 52 (93%)
    Ne montre pas son visage 4 (7,1%)
abonnes
    50k abonnés ou moins 15 (27%)
    Entre 50k et 200k abonnés 13 (23%)
    Entre 200k et 1 million d'abonnés 23 (41%)
    Plus d'un million d'abonnés 5 (8,9%)
genre
    Femme 8 (14%)
    Homme 48 (86%)
age
    25 à 29 ans 7 (13%)
    30 à 34 ans 18 (32%)
    35 à 39 ans 15 (27%)
    40 à 44 ans 6 (11%)
    45 ans et plus 10 (18%)
streamer_plein_temps
    Principalement streameur 16 (29%)
    Principalement youtuber 40 (71%)
collectif
    Chaîne individuelle 39 (70%)
    Chaîne collective 17 (30%)
livre
    Pas de publication de livre 38 (68%)
    Publication de livre 18 (32%)
podcast
    Podcasts 35 (63%)
    Pas de podcasts 21 (38%)
twitter
    Compte Twitter 50 (89%)
    Pas de compte Twitter 6 (11%)
facebook
    Pas de compte Facebook 29 (52%)
    Compte Facebook 27 (48%)
instagram
    Compte Instagram 47 (84%)
    Pas de compte Instagram 9 (16%)
tiktok
    Compte Tik Tok 25 (45%)
    Pas de compte Tik Tok 31 (55%)
discord
    Serveur Discord 10 (18%)
    Pas de serveur Discord 46 (82%)
twitch
    Compte Twitch 34 (61%)
    Pas de compte Twitch 22 (39%)
site_perso
    Pas de site personnel 31 (55%)
    Site personnel 25 (45%)
CNC
    Pas de subvention du CNC 42 (75%)
    Subvention du CNC 14 (25%)
soutenir
    Ne demande pas de financement à l'audience 13 (23%)
    Demande de financement à l'audience 43 (77%)
partenariat_entreprise
    Sponsorisé.e par des entreprises 15 (27%)
    Pas de sponsors d'entrerpises 41 (73%)
autres_services
    Vend ses produits 15 (27%)
    Ne vend pas de produits 41 (73%)
1 n (%)

Vérifiez bien toutes vos variables et vos modalités. Si une modalité concerne moins de 10 % de votre population, cela peut causé des problèmes pour la suite. Il faudra alors sûrement la recoder/la passée en variable supplémentaire. Dans mon cas par exemple : ma base ne compte que 2 écologiste, ce qui est trop peu. Je peux donc soit recoder la variable orientation (comme je l’ai fait avec orientation2), soit la mettre en variable supplémentaire lorsque je réaliserai l’ACM (c’est ce que je vais faire).

Pour réaliser l’ACM, utilisez la fonction… ACM()1. Vous pouvez ensuite renseigner les variables à l’aide de l’argument variables_supplementaires. Mettez-y les variables que vous ne souhaitez pas voir participer à la construction des axes. Mettez-y également les variables qui servent à identifier chacun de vos individus (par exemple une variable nom_prenom ou dans mon cas, la variable personne et titre).

Dans tbl_summary() vous vouliez inclure toutes les colonnes sauf les colonnes titre et personne. Ici, ce sont ces colonnes que vous sélectionnez comme variable supplémentaire, on ne met donc pas de moins devant leur nom :

resultat_acm <- createurs_de_contenus_pol |> 
  ACM(
    variables_supplementaires = c(titre, 
                                  personne, 
                                  orientation,
                                  orientation2)
  )
#> 
#> ── Variables actives
#> L'ACM a été réalisé sur ces variables actives : `debut`, `visage_decouvert`,
#> `abonnes`, `genre`, `age`, `streamer_plein_temps`, `collectif`, `livre`,
#> `podcast`, `twitter`, `facebook`, `instagram`, `tiktok`, `discord`, `twitch`,
#> `site_perso`, `CNC`, `soutenir`, `partenariat_entreprise`, and
#> `autres_services`.
#> 
#> 
#> ── Variables supplémentaires 
#> 
#> Les variables supplémentaires sont les suivantes : `titre`, `personne`,
#> `orientation`, and `orientation2`.

Vous pouvez explorer les résultats de l’ACM avec la fonction du package explor : explor() .

explor::explor(resultat_acm)

Si l’ACM vous convient, passez à la suite, sinon répétez les étapes décrites plus haut jusqu’à ce que le résultat de l’ACM soit satisfaisant pour vous.

Sur ces premiers graphiques, vérifiez que le nuage d’individu est bien équilibré et ne se résume pas à une seule droite. Si c’est le cas, il faut soit recoder votre base, soit penser à mettre les variables qui posent problèmes en variable supplémentaires.

Les résultats de cette opération sont stocké dans un objet (que j’ai ici appelé resultat_acm). Il contient tous les résultats de l’ACM. Mon package propose une manière de sortir ces résultats afin qu’il soit prêt à être publié. La plupart des fonctions présentés par la suite prendront comme premier argument cet objet contenant les résultats pour extraire ceux que vous souhaitez affichez.

Les axes

La première chose que l’on souhaite en général savoir avec une ACM, c’est le taux de variance capturé par les axes. Une idée assez répandu voudrait qu’ils mesurent “l’information capturée” par chaque axe.

Pour afficher un tableau récapitulatif vous pouvez utiliser la fonction extraire_variance() sur l’objet dans lequel vous stockez les résultat de l’ACM :

extraire_variance(resultat_acm)
#>      Axes Valeurs propres % de variance % cumulé de variance
#> 1   Axe 1            0,16        12,5 %               12,5 %
#> 2   Axe 2            0,12         9,5 %               21,9 %
#> 3   Axe 3            0,12         9,2 %               31,1 %
#> 4   Axe 4            0,09         7,2 %               38,4 %
#> 5   Axe 5            0,09         6,8 %               45,2 %
#> 6   Axe 6            0,08         6,5 %               51,7 %
#> 7   Axe 7            0,07         5,2 %               56,9 %
#> 8   Axe 8            0,06         4,9 %               61,8 %
#> 9   Axe 9            0,06         4,7 %               66,4 %
#> 10 Axe 10            0,06         4,4 %               70,8 %

[insérer un commentaire des résultats + la fonction pour obtenir la variance modifié]

Une fois que cela est fait, on veut souvent chercher à décrire les axes. Pour cela, utilisez la fonction caracteriser_axe(). Précisez le numéro de l’axe que vous voulez caractérisé avec l’argument axe.

Par défaut, vous ne souhaiterez peut-être pas afficher toutes les modalités dans ce tableau (surtout si vous en avez beaucoup). L’argument contribution_minimum permet de préciser un seuil de contribution minimum pour filtrer les modalités. Par défaut, il se règle sur la contribution théorique moyenne, c’est-à-dire la contribution de chaque variable si elles contribuaient chacunes également à la construction des axes.

Ainsi quand on lance la fonction sans préciser l’argument contribution_minimum :

resultat_acm |> 
  caracteriser_axe(axe = 1)
#> Vous n'axez pas indiqué de contribution minimum pour afficher les résultats
#> Seules les modalités dont la contribution est supérieur à la moyenne théorique
#> seront affichées.
#>  Si vous souhaitez modifier cela, vous pouvez changer l'argument
#>   contribution_minimum
#> → `contribution_minimum = 0` si vous souhaitez afficher toutes les modalités
#>   par exemple
#> 
#> 
#> ── Contribution moyenne théorique 
#> 
#>  Si toutes les modalités actives contribuaient également à la construction
#> d'un axe, chacune aurait une contribution de 2,17 %.
Modalité1 Contribution Coordonnée2 Cos² V-test Effectif
Coordonnées positives
Vend ses produits 9,2 % 1,06 0,41 4,75 15 (27 %)
Sponsorisé.e par des entreprises 8 % 0,98 0,35 4,41 15 (27 %)
Site personnel 4,7 % 0,59 0,28 3,91 25 (45 %)
2014 et avant 3,7 % 0,82 0,15 2,84 10 (18 %)
Plus d'un million d'abonnés 3,4 % 1,11 0,12 2,57 5 (9 %)
Pas de compte Twitch 3,4 % 0,53 0,18 3,15 22 (39 %)
Compte Facebook 3,1 % 0,46 0,20 3,29 27 (48 %)
Principalement youtuber 3 % 0,37 0,35 4,36 40 (71 %)
Ne demande pas de financement à l'audience 2,9 % 0,64 0,12 2,60 13 (23 %)
Pas de podcasts 2,6 % 0,48 0,14 2,73 21 (38 %)
Coordonnées négatives
50k abonnés ou moins 8,6 % -1,02 0,38 -4,57 15 (27 %)
Principalement streameur 7,6 % -0,93 0,35 -4,36 16 (29 %)
Subvention du CNC 3,8 % -0,71 0,17 -3,02 14 (25 %)
Pas de site personnel 3,8 % -0,47 0,28 -3,91 31 (55 %)
Ne vend pas de produits 3,4 % -0,39 0,41 -4,75 41 (73 %)
Pas de compte Facebook 2,9 % -0,43 0,20 -3,29 29 (52 %)
Pas de sponsors d'entrerpises 2,9 % -0,36 0,35 -4,41 41 (73 %)
2020 et après 2,4 % -0,51 0,11 -2,50 17 (30 %)
Compte Twitch 2,2 % -0,34 0,18 -3,15 34 (61 %)
1 Seules les modalités actives dont la contribution est supérieure à 2,17 % sont représentées.
2 Moyenne des coordonnées des individus partageant la modalité

Si cela ne vous convient et que vous préféreriez un tableau plus synthétique ou plus exhaustif, vous pouvez changer ce seuil :

caracteriser_axe(resultat_acm, axe = 1, contribution_minimum = 4.5)
Modalité1 Contribution Coordonnée2 Cos² V-test Effectif
Coordonnées positives
Vend ses produits 9,2 % 1,06 0,41 4,75 15 (27 %)
Sponsorisé.e par des entreprises 8 % 0,98 0,35 4,41 15 (27 %)
Site personnel 4,7 % 0,59 0,28 3,91 25 (45 %)
Coordonnées négatives
50k abonnés ou moins 8,6 % -1,02 0,38 -4,57 15 (27 %)
Principalement streameur 7,6 % -0,93 0,35 -4,36 16 (29 %)
1 Seules les modalités actives dont la contribution est supérieure à 4,5 % sont représentées.
2 Moyenne des coordonnées des individus partageant la modalité

Pour caractériser l’axe 2, on peut copier et coller le même code en changeant simplement le numéro de l’axe que l’on souhaite décrire :

caracteriser_axe(resultat_acm, axe = 2, contribution_minimum = 4.5)
Modalité1 Contribution Coordonnée2 Cos² V-test Effectif
Coordonnées positives
Chaîne collective 10,7 % 0,93 0,38 4,56 17 (30 %)
Ne montre pas son visage 10 % 1,85 0,26 3,81 4 (7 %)
Subvention du CNC 6,4 % 0,80 0,21 3,41 14 (25 %)
Compte Facebook 5,9 % 0,55 0,28 3,94 27 (48 %)
40 à 44 ans 5,1 % 1,08 0,14 2,79 6 (11 %)
Coordonnées négatives
Vend ses produits 6,1 % -0,75 0,21 -3,36 15 (27 %)
Pas de compte Facebook 5,5 % -0,51 0,28 -3,94 29 (52 %)
Chaîne individuelle 4,7 % -0,41 0,38 -4,56 39 (70 %)
Femme 4,6 % -0,89 0,13 -2,71 8 (14 %)
1 Seules les modalités actives dont la contribution est supérieure à 4,5 % sont représentées.
2 Moyenne des coordonnées des individus partageant la modalité

Visualiser les résultats

Pour visualiser les résultats. Le plus simple restera toujours de faire appel à explor::explor(). Les résultats ne sont cependant pas très joli à mon goût. La section suivante s’adresse donc à

  • Ceux qui souhaite avoir des visualisations de leur données plus esthétiques.

  • Les utilisateurs avancés et moins avancés qui veulent avoir un plus grand contrôle sur les visualisations.

Toutes ces visualisations se basent sur le package ggplot. Jusqu’à maintenant on utilisait directement les résultats de l’ACM pour sortir nos tableaux. Ici, il va falloir les transformer un petit peu. Nous allons donc créer deux objets, un premier objet resultat_individus qui contiendra les coordonnées des individus ainsi que nos données initales et un deuxième objet (que je nomme ici resultat_modalites) qui répertorie les résultats par modalité. Pour extraire ces résultats du résultat de l’ACM, on aura recours à la fonction extraire_individus() et extraire_modalites().

Pour extraire_modalites il suffit de faire passer le resultat de l’ACM à la fonction :

resultat_modalites <- resultat_acm |> extraire_modalites()
resultat_modalites
#> # A tibble: 189 × 21
#>    type    variables modalites     n pourcentage dim1_coord dim1_cos2 dim1_vtest
#>    <chr>   <chr>     <chr>     <int>       <dbl>      <dbl>     <dbl>      <dbl>
#>  1 variab… debut     2014 et …    10        17.9       0.82      0.15       2.84
#>  2 variab… debut     2015 - 2…    29        51.8       0.02      0          0.12
#>  3 variab… debut     2020 et …    17        30.4      -0.51      0.11      -2.5 
#>  4 variab… visage_d… Montre s…    52        92.9       0         0         -0.05
#>  5 variab… visage_d… Ne montr…     4         7.1       0.03      0          0.05
#>  6 variab… abonnes   50k abon…    15        26.8      -1.02      0.38      -4.57
#>  7 variab… abonnes   Entre 50…    13        23.2       0.09      0          0.37
#>  8 variab… abonnes   Entre 20…    23        41.1       0.37      0.1        2.31
#>  9 variab… abonnes   Plus d'u…     5         8.9       1.11      0.12       2.57
#> 10 variab… genre     Femme         8        14.3      -0.6       0.06      -1.81
#> # ℹ 179 more rows
#> # ℹ 13 more variables: dim1_contrib <dbl>, dim2_coord <dbl>, dim2_cos2 <dbl>,
#> #   dim2_vtest <dbl>, dim2_contrib <dbl>, dim3_coord <dbl>, dim3_cos2 <dbl>,
#> #   dim3_vtest <dbl>, dim3_contrib <dbl>, dim4_coord <dbl>, dim4_cos2 <dbl>,
#> #   dim4_vtest <dbl>, dim4_contrib <dbl>

On obtient alors un tableau qui reprend pour chaque modalité et chaque axe leur coordonnée, leur cos², leur vtest et leur contribution.

Pour extraire_individu() on peut procéder de la même manière:

resultat_individus <- resultat_acm |> extraire_individus()
resultat_individus
#> # A tibble: 56 × 39
#>    dim1_coord dim2_coord personne           titre orientation orientation2 debut
#>         <dbl>      <dbl> <chr>              <chr> <chr>       <chr>        <chr>
#>  1    -0.111     -0.283  Antoine Goya       Anto… De gauche   Progressiste 2015…
#>  2    -0.199     -0.0775 Salomé Saqué       BLAS… De gauche   Progressiste 2020…
#>  3     0.168      0.536  Benjamin Patinaud  Bolc… De gauche   Progressiste 2014…
#>  4     0.0551     0.0827 Aymric Dlavo       Cana… De gauche   Progressiste 2015…
#>  5    -0.510     -0.192  Cassandre Begous   Cass… De gauche   Progressiste 2020…
#>  6     0.211      0.355  Pierre-Yves Rouge… Cerc… De droite   Conservateur 2015…
#>  7     0.416     -0.0892 Christopher Lannes Chri… De droite   Conservateur 2014…
#>  8     0.0616     0.300  Clément Viktorovi… Clém… De gauche   Progressiste 2020…
#>  9    -0.478      0.432  Charlélie Jutan    DANY… De gauche   Progressiste 2020…
#> 10     0.0692     0.768  Julien Goetz       Data… De gauche   Progressiste 2014…
#> # ℹ 46 more rows
#> # ℹ 32 more variables: visage_decouvert <chr>, abonnes <chr>, genre <chr>,
#> #   age <chr>, streamer_plein_temps <chr>, collectif <chr>, livre <chr>,
#> #   podcast <chr>, twitter <chr>, facebook <chr>, instagram <chr>,
#> #   tiktok <chr>, discord <chr>, twitch <chr>, site_perso <chr>, CNC <chr>,
#> #   soutenir <chr>, partenariat_entreprise <chr>, autres_services <chr>,
#> #   dim3_coord <dbl>, dim4_coord <dbl>, dim5_coord <dbl>, dim1_contrib <dbl>, …

On retrouve donc le tableau de données que l’on a donné à manger à la fonction ACM() qui a été augmenté de nouvelles colonnes avec notamment les coordonnées des individus.

Le nuage d’individu

Pour faire apparaître le nuage d’individu. Il suffit maintenant d’utiliser les fonctions de ggplot, avec quelques subtilités cependant. Pour ceux qui ne souhaitent pas s’embarrasser des subtilités2, utilisez juste ggacm() à la place vous gagnerez du temps.

library(ggplot2)
resultat_individus |> 
  ggacm() + 
  geom_point()

Il est possible d’améliorer ce graphique de plusieurs manières. Premièrement en modifiant le thème de ggplot, pour qu’il soit plus joli. Le thème theme_acm() qui vient avec le package illustre mes préférences personnelles.

resultat_individus |> 
  ggacm() + 
  geom_point() +
  theme_acm()

Pour éviter de toujours taper + theme_acm(), je vous conseille d’en faire le theme par défaut de votre session R. Cela restera le thème par défaut jusqu’à ce que vous redémarriez R.

Ensuite, il est possible de nommer les axes. Pour cela, la fonction nommer_axes() permet de définir des noms d’axes appropriés. Il suffit de la rajouter au graphique. Elle prend comme premier argument le resultat entier de l’ACM. Si on ne précise rien, les axes sont juste modifié de la manière suivante

resultat_individus |> 
  ggacm() + 
  geom_point() + 
  nommer_axes(resultat_acm)

Vous pouvez précisez au bout des flèches pour aider à l’interprétation du graphique. Pour cela, n’hésitez pas à vous aider des tableaux que vous avez sortis avec caracteriser_axe(). Les modalités au coordonnées négatives pour l’axe 1 sont à gauche, et celles qui sont positives à droite. Pour l’axe 2, les coordonnées négatives sont en bas et les coordonnées positives en haut. Dans mon cas, on peut donner les interprétations suivantes :

resultat_individus |> 
  ggacm() + 
  geom_point() + 
  nommer_axes(resultat_acm,
              a_gauche = "Streameurs",
              a_droite = "Vidéastes entrepreneurs",
              en_bas = "Chaine individuelle",
              en_haut = "Chaine collective")

Ca fait beaucoup de choses à taper à chaque fois… n’hésitez donc pas à stocker ces axes dans un objet pour y avoir recours plus facilement :

axes <- resultat_acm |> 
  nommer_axes(
    a_gauche = "Streameurs",
    a_droite = "Vidéastes entrepreneurs",
    en_bas = "Chaine individuelle",
    en_haut = "Chaine collective"
  )

Vous pouvez maintenant ressortir le graphique :

resultat_individus |> 
  ggacm() + 
  geom_point() + 
  axes

Enfin, peut-être souhaiteriez vous ajouter un titre ou une description ? Dans ce cas-là, utilisez la fonction labs() de ggplot.

resultat_individus |> 
  ggacm() + 
  geom_point() + 
  axes +
  labs(
    title = "Ceci est un titre",
    caption = "Ceci est une description"
  )