---
title: "Résumé minimal du script AFC_PresidUSA16_v1.R pour les AFC sur les élections présidentielles américaines en 2016 (nombre de voies)"
author: "Vincent GODARD"
date: "31/12/2020 - V2"
output: 
  html_document: 
    toc: yes
    keep_md: yes
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(message = TRUE)
```

Analyse factorielles de correspondances binaires (AFC) avec R et FactoMineR sur les données brutes (effectifs) des élections présidentielles américaines en 2016 (nombre de voies) (Sources : https://en.wikipedia.org/wiki/2016_United_States_presidential_election#Results_by_state)


Pour aller plus loin :

- http://factominer.free.fr/factomethods/analyse-factorielle-des-correspondances.html

- http://www.sthda.com/french/articles/38-methodes-des-composantes-principales-dans-r-guide-pratique/74-afc-analyse-factorielle-des-correspondances-avec-r-l-essentiel/#r-code-to-comput-ca


## Résumé des principales étapes du code R

- Import des données ;
- Module AFC ;
- Gérer les "outliers"
- Valeurs propres et vecteurs propres ;
- Coordonnées ;
- Contributions ;
- Qualités (COS2) ;
- Aide à l’interprétation ;
- Edition des rapports.


## 1. Import des données

Avec mes fichiers exemples, préférez les paramètres nord-américains ("." séparateur de décimales, "," séparateur de miliers).

Salle C210, identifiant => "geographie2" !

```{r}
### setwd("D:/Users/geographie2/vgodard/ADD/presidUSA16ation/R")
### respecter ce cheminement si "geographie2"
### getwd()

# Remove all objects
rm(list = ls() )
```

## 2. Lecture des données

```{r}
presidUSA16 <- read.csv("presidUSA16.csv",
                      sep = ";",
                      dec =".",### Si param. régio. non US, remplacer le "." par une ","
                      stringsAsFactors = FALSE) # si stringsAsFactors = FALSE on perd les modalités si qualitative

head(presidUSA16)

```



## 3. Graphe, table de contingence et khi-deux

### 3.1 Graphe

Installer et exécuter préalablement la librairie "gplots"

```{r message = FALSE}
### Avec la librairie gplots
## install.packages("gplots") ## si pas déjà installé !
 library("gplots")
```

Quand la table de contingence ne contient pas trop de variables ou d'individus, il est possible de représenter les relations entre eux. Ici, ce n'est pas le cas.

```{r message = FALSE}

# 1. Convertion des données en table
#dt <- as.table(as.matrix(presidUSA16))

# 2. Graphe
#balloonplot(t(dt), main ="presidUSA16", xlab ="", ylab="",
#            label = FALSE, show.margins = FALSE)


```

### 3.2 Khi-deux


Pour une petite table de contingence, il est possible de tester la significativité du lien de dépendance à l'aide d'un test du khi-deux.


```{r message = FALSE}

# Calcul de la statistique du Chi-square (Khi-deux)
chisq <- chisq.test(presidUSA16[,2:7])
chisq

# Calcul de la valeur du Khi-deux
chisq$statistic

# Calcul du degrés de liberté (Degree of freedom)
df <- (nrow(presidUSA16[, 2:7]) - 1) * (ncol(presidUSA16[, 2:7]) - 1)
df

# Calcul de la P-value
pval <- pchisq(chisq$statistic, df = df, lower.tail = FALSE)
pval

# ou
chisq$p.value





```

Au risque 5% (communément admis), on rejette l’hypothèse nulle d’indépendance entre les lignes et les colonnes. 

Sur les grosses tables, il est pratiquement toujours significatif (p-value < 0.05)



## 4. Module AFC

Installer et exécuter préalablement les librairies "FactoMineR", "factoextra", puis les charger

```{r message = FALSE}
### Avec la librairie FactoMineR et factoextra
## install.packages(c("FactoMineR", "factoextra")) ## si pas déjà installés !

library("FactoMineR")
library("factoextra")


```



### 4.1 AFC avec toutes les variables


L'AFC avec tous les éléments actifs (51 lignes et 7 variables)

*-* CA est le nom de l'AFC dans Factominer 

*-* CA fonctionne a minima avec :

+ x : le data frame (la table de contingence) ;

+ ncp : nb de dimensions gardé dans le résultat final ;

+ graph : le graphe par défaut (pour ne pas afficher le graphe graph = FALSE) ;

*-* Si le nom des stations est en première colonne :

+ le tableau "utile" va de la deuxième colonne à la 8ème [,2:8] ;

+ il n'y a pas de variables quantitatives supplémentaires ;

+ la variable qualitative (supplémentaire) est la dernière et exprime, pour l'élection présidentielle de 2012, quel est le parti vainqueur.

```{r}
res.presidUSA16.ca <- CA(presidUSA16[,2:8],
                       col.sup = NULL,
                       row.sup = NULL,
                       quali.sup=7,
                       axes = 1:2,
                       ncp = 6,
                       graph = TRUE)

```

Le graphique avec la fonction Biplot (cf. infra) apporte un net gain de lisibilité.

McMullin est un candidat indépendant résidant dans l'Utah (n°51). Faut-il traiter cet état ou ce candidat en "supplémentaire" (car ayant un comportement d'outlier) ? Si oui (cf. infra), les mettre en fin de tableaux pour faciliter leur désignation comme colonne ou ligne supplémentaire.


### 4.2 AFC sans la variable "outlier" (traitée en illustrative)


```{r}
res.presidUSA16.ca <- CA(presidUSA16[,2:8],
                       col.sup = 6,
                       row.sup = NULL,
                       quali.sup=7,
                       axes = 1:2,
                       ncp = 5,
                       graph = TRUE)

```

La suite du tutoriel se fera avec McMullin en variable illustrative (col.sup). Si vous ne le souhaitez pas, à des fins de comparaisons par exemple, relancez l'exécution en mettant en commantaires la section 4.2.


## 5. Les sorties de la fonction CA

Si ce n'est déjà fait, installer le package "factoextra", puis le charger.

```{r message = FALSE}
## install.packages("factoextra")

library("factoextra")
```

Si on veut connaître tous les résultats de la fonction CA dans Factominer et/ou factoextra :

```{r}

### Listage des résultats

print(res.presidUSA16.ca)
```


### 5.1. Les *eigenvalues* ou valeurs propres

La somme des *eigenvalues* égale le nombre d'axes (ici 5).

Contrairement à l'ACP *eigenvalue* n'est jamais supérieure à 1.

```{r}
eig.val <- get_eigenvalue(res.presidUSA16.ca)
eig.val


```

Il est aussi possible d'apprécier les ruptures dans la succession des *eigenvalues*.

```{r}
 # Visualisation des eigenvalues
fviz_eig(res.presidUSA16.ca, addlabels = TRUE, ylim = c(0, 40)) # calibrer le ylim avec la lecture du tableau précédent




```

Il n'y a pas de règles pour choisir le nombre d'axes. Eventuellement, retenir les axes qui ont une *eigenvalues* d'une valeur supérieure à :

- 1/(nrow(presidUSA16)-1 = 1/51 soit environ 1.9%)
ou

- 1/(ncol(presidUSA16[, 2:7])-1 = 1/4 soit environ 25%)
Sources : http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/113-ca-correspondence-analysis-in-r-essentials/#r-code-to-compute-ca (According to M. T. Bendixen 1995)



```{r}
 # Visualisation des eigenvalues
sp <- fviz_eig(res.presidUSA16.ca,addlabels = TRUE, ylim = c(0, 62)) # calibrer le ylim avec la lecture du tableau précédent
         
sp + geom_hline (yintercept = 25, linetype = 2, color = "red") # tracer le yintercept avec la valeur de la *eigenvalues* moyenne 
        


```

Cel laisse supposer qu'on pourrait presque se passer de l'axe 2 !

Les paramètres les plus utiles :

```{r}

get_ca_row(res.presidUSA16.ca)

```



### 5.2. Coordonnées des variables et des individus sur les axes

Interprétation des coordonnées des variables sur les axes factoriels (les colonnes : col).

```{r}
res.presidUSA16.ca$col$coord ### [toutes les lignes ; colonnes 1 à 4, cf résultats *eigenvalue*]
```

Valeur des coordonnées des variables quantitatives supplémentaires (les cols.).

```{r}
res.presidUSA16.ca$col.sup$coord  ## coord. for the supplementary columns            

```


Valeur des coordonnées des variables qualitatives.

```{r}
res.presidUSA16.ca$quali.sup$coord  ##   "coord. for supplementary categorical var."
```

Interprétation des coordonnées des individus sur les axes factoriels

```{r}
res.presidUSA16.ca$row$coord ### [ligne 1 à 51 ; colonnes 1 à 5, mais 4 dimensions !]

```
### 5.3. Contribution des variables et des individus sur les axes

Interprétation des contributions des variables sur les axes factoriels.

```{r}
res.presidUSA16.ca$col$contrib ### [toutes les lignes ; colonnes toutes, cf résultats *eigenvalue*] pour rechercher les plus contributives dans un tableur.
```

Interprétation des contributions des individus sur les axes factoriels.

```{r}
res.presidUSA16.ca$row$contrib ### [ligne toutes ; colonnes toutes] pour rechercher les plus contributifs dans un tableur.
```

### 5.4. Qualité de la représentation (COS2) des variables et des individus sur les axes

Interprétation des COS2 des variables sur les axes factoriels.

```{r}
res.presidUSA16.ca$col$cos2 ### [toutes les lignes ; colonnes toutes, cf résultats *eigenvalue*] pour rechercher les mieux représentées dans un tableur.
```

Interprétation des COS2 des variables quantitatives supplémentaires sur les axes factoriels.

```{r}
res.presidUSA16.ca$col.sup$cos2 ### [toutes les lignes ; colonnes toutes, cf résultats *eigenvalue*] pour rechercher les mieux représentées dans un tableur.
```

Interprétation des COS2 des variables qualitatives supplémentaires sur les axes factoriels.

```{r}
res.presidUSA16.ca$quali.sup$cos2 ### [toutes les lignes ; colonnes toutes, cf résultats *eigenvalue*] pour rechercher les mieux représentées dans un tableur.
```

Interprétation des qualités de représentation des individus sur les axes factoriels.

```{r}
res.presidUSA16.ca$row$cos2 ### [ligne toutes ; colonnes toutes] pour rechercher les mieux représentées dans un tableur.
```

## 6. Aide à l'interprétation

### 6.1. Graphiques de la contribution


-  des variables

```{r}

          fviz_ca_col(res.presidUSA16.ca,
                  col.col = "contrib",
                  axes = 1:2,
                  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))
                  


```

- des individus

```{r}
          fviz_ca_row(res.presidUSA16.ca,
                      col.row = "contrib",
                      axes = 1:2,
                      gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))
```


### 6.2. Graphiques de la qualité


-  des variables


```{r}

          fviz_ca_col(res.presidUSA16.ca,
                  col.col = "cos2",
                  axes = 1:2,
                  gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))
                  


```

- des filtrages sont possibles

-- en fonction du Cos2

```{r}
          ## Lignes avec un cos2 > 0.8
          fviz_ca_row(res.presidUSA16.ca,
                      select.row = list(cos2 = 0.8),
                      col.row = "cos2",
                      axes = 1:2,
                      gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"))
```

-- en fonction des contributions

```{r}
          ## Top 5 des contributions lignes et colonnes
          fviz_ca_biplot(res.presidUSA16.ca,
                      select.row = list(contrib = 5), 
                      #select.col = list(contrib = 5), # si on veut toutes les variables
                      arrow = c (TRUE, TRUE), # pour mieux voir la proximité avec les axes
                      axes = 1:2,
                      repel = TRUE, # pour éviter les chevauchements dans biplot
                      )
```

Il est possible de faire des Biplots asymétriques, où les coordonnées sont pondérées par le poids de la valeur propre (en fait la racine carrée de la valeur propre *eigenvalue*).
- Voir : Biplot asymétrique in : http://www.sthda.com/french/articles/38-methodes-des-composantes-principales-dans-r-guide-pratique/74-afc-analyse-factorielle-des-correspondances-avec-r-l-essentiel/#r-code-to-comput-ca


### 6.3. Aide à la description et à l'interprétation


Identification des variables les plus remarquables (moins efficace que dans PCA car **pas significatives** en l'absence de test) par composante. Simple tri ds coordonnées.

```{r}
### fonction dimdesc() [in FactoMineR]

res.desc <- dimdesc(res.presidUSA16.ca, axes = c(1,2))


```
- Aide sur l'axe 1

-- Pour les lignes (pour nous, les individus)

```{r}
### Description de la dimension 1 pour 4 lignes
head(res.desc[[1]]$row, 4)


```
-- Pour les colonnes (pour nous, les variables)

```{r}
### Description de la dimension 1 pour 4 colonnes

head(res.desc[[1]]$col, 6)

```

- Aide sur l'axe 2

-- Pour les lignes (pour nous, les individus)

```{r}
### Description de la dimension 2 pour toutes les lignes
res.desc[[2]]$row


```
-- Pour les colonnes (pour nous, les variables)

```{r}
### Description de la dimension 2 pour toutes les colonnes

res.desc[[2]]$col

```

### 6.4 Exporter des résultats

- Exporter des pdf ou des png

-- En premier, création des graphes

```{r message = FALSE}
# Scree plot
scree.plot <- fviz_eig(res.presidUSA16.ca)

# Biplot of row and column variables
biplot.ca <- fviz_ca_biplot(res.presidUSA16.ca)


```

-- En second, export des graphes

```{r message = FALSE}

library(ggpubr)

## Export d'un pdf (un graphe par page)
ggexport(plotlist = list(scree.plot, biplot.ca), 
         filename = "res.presidUSA16.ca.pdf")

## Export d'un png par graphe
ggexport(plotlist = list(scree.plot, biplot.ca), 
         filename = "res.presidUSA16.ca.png")


```
- Exporter des résultats en txt ou csv

A l'aide de write.table() [package FactoMineR], write.infile semble inaccessible à la date de rédaction !

```{r message = FALSE}
# Export into a TXT file de la qualité de représentation des variables
write.table(res.presidUSA16.ca$col$cos2, "res.presidUSA16.ca$col$cos2.txt", sep = "\t")

# Export into a CSV file des contributions des individus
write.table(res.presidUSA16.ca$row$contrib, file="res.presidUSA16.ca$row$contrib.csv", col.names=TRUE, sep = ";")

# Export into a CSV file des coordonnées des individus
write.table(res.presidUSA16.ca$row$coord, file="res.presidUSA16.ca$row$coord.csv", col.names=TRUE, sep = ";")


```           


## 7. Le couteau suisse

Le package FactoInvestigate décrit et interprète automatiquement les résultats de votre analyse factorielle (ACP, AFC ou ACM) en choisissant les graphes les plus appropriés pour le rapport (sources :  http://factominer.free.fr/reporting/index_fr.html, mais ce package semble inaccessible à la date de rédaction !)

```{r message = FALSE}
# install.packages("FactoInvestigate")

# library("FactoInvestigate")

Investigate(res.presidUSA16.ca)
```




