Comme nous l’avons déjà analysé, la colonne de ‘VCL’ représente des mots anglais conçus pour évaluer la littéracie des participants du test. Avec ces données, nous allons tenter de les analyser à nouveau afin de distinguer un locuteur natif anglais. En général, un locuteur natif a une meilleure connaissance des mots anglais, mais il existe également des mots faciles que beaucoup de non-locuteurs connaissent déjà. En examinant les résultats de cette analyse, nous pourrions déterminer quels mots contribuent le plus à distinguer un locuteur natif anglais.
© National Trust Images / James Dobson
Pour dire simplement, l’arbre de décision (‘Decision tree’) divise les variables selon une condition spécifique. La variable la plus importante se situe en haut et on l’appelle ‘Nœud racine’ (‘Root node’). Si les nœuds se situent au-dessus des autres nœuds, ils s’appellent ‘Nœud parent’ (‘Parent node’) et ceux qui sont en dessous de chaque nœud parental s’appellent ‘Nœud enfant’ (‘Child node’). Les nœuds qui se situent le plus bas sont appelés ‘Nœud feuille’ (‘Leaf node’), et ‘Nœud interne’ (‘Internal node’) signifie les nœuds qui ne sont pas un ‘Nœud feuille’. L’importance de chaque nœud, c’est-à-dire la position de chaque nœud, est décidée par le gain d’information (‘Information gain’). Le gain d’information est calculé par la valeur d’entropie. Si la valeur d’entropie est élevée, cela signifie que les variables sont bien mélangées de manière arbitraire, mais si la valeur est zéro, c’est-à-dire que les variables sont toutes les mêmes.
data_complot_eng <- data_complot %>% filter(engnat != '0')
En premier, on supprime les lignes montrant zéro dans la colonne ‘engnat’. Il n’y a que deux choix pour cette question : ‘Yes (1)’ ou ‘Non (2)’. Etant donnée que la valeur ‘0’ indique que la réponse n’est pas cochée, on ne veut pas les voir dans le graphique d’arbre qu’on va faire.
data_complot_eng$engnat <- as.factor(data_complot_eng$engnat)
Ensuite, on convertit les variables de la colonne ‘engnat (natif anglais)’ en variables catégorielles. Pour cette analyse, ce que l’on veut voir, c’est si les gens sont locuteurs natifs anglais ou non. Ainsi, les données doivent être ‘Yes (1)’ ou ‘Non (2)’. Si les données sont analysées comme les variables continues, on aurait les variables telles que ‘1.7’, qui ne sont pas pertinentes pour notre but.
complot_eng_train <- data_complot_eng %>% slice_sample(prop = 0.8)
complot_eng_test <- data_complot_eng %>% anti_join(complot_eng_train)
Pour effectuer l’analyse d’arbre, on divise les données en deux parties : les données d’entraînement et les données de validation. Avec les données d’entraînement (test), on peut entraîner la machine sans limite de fois pour faire plusieurs modèles, contrairement aux données de validation avec lesquelles on ne peut effectuer qu’un seule test pour valider notre modèle. Normalement, on utilise 80% des données pour l’entraînement et le reste pour la validation.
arbre_1 <- rpart(engnat~ VCL1+VCL2+VCL3+VCL4+VCL5+VCL6+VCL7+VCL8+VCL9+VCL10+VCL11+VCL12+VCL13+VCL14+VCL15+VCL16,
data = complot_eng_train)
prp(arbre_1, type = 1,extra=1, box.palette = "Blues")
Vu qu’un nœud qui se situe le plus haut est le plus important, VCL 13 (‘abysmal’) est le mot le plus crucial pour identifier un locuteur natif. Le chiffre ‘1’ représente ‘Yes’ pour la question qui demande si la personne est un locuteur natif. En dessous de ce chiffre dans le même nœud, le nombre à gauche indique le nombre de personnes ayant choisi ‘Yes (1)’, tandis que celui à droite indique le nombre de personnes ayant choisi ‘No (2)’. On peut constater ainsi qu’il y avait environ trois fois plus de personnes ayant répondu qu’elles sont des locuteurs natifs. Le deuxième mot le plus important est VCL8 (‘epistemology’). Les autres VCLs changent à chaque étape de l’entraînement.
En voyant les derniers nœuds (‘Child nodes’), dans un nœud où le numéro 1 est marqué, il y a plus de personnes qui ont choisi ‘1’, et l’inverse pour le nœud avec le numéro 2. C’est-à-dire que les branches sont bien divisées pour classifier les variables.
rpart.plot(arbre_1)
Avec ce codage, on peut également voir l’arbre avec le pourcentage. Le
chiff
classe_prevue <- predict(arbre_1,
complot_eng_train, type = "class")
table(classe_prevue, complot_eng_train$engnat)
##
## classe_prevue 1 2
## 1 1474 438
## 2 23 54
Sur cette matrice de confusion (‘confusion matrix’), nous avons eu 1 459 vrais positifs (Prédiction : ‘Yes’, Réponse actuelle : ‘Yes’) et 397 faux positifs (Prédiction : ‘Yes’, Réponse actuelle : ‘No’). Pour celles que la machine a prédites comme ayant une réponse ‘No’, nous avons eu 49 faux négatifs (Prédiction : ‘No’, Réponse actuelle : ‘Yes’) et 84 vrais négatifs (Prédiction : ‘No’, Réponse actuelle : ‘No’).
classe_prevue_test <- predict(arbre_1,
complot_eng_test,
type = "class")
table(classe_prevue_test, complot_eng_test$engnat)
##
## classe_prevue_test 1 2
## 1 373 110
## 2 5 10
Comme le résultat de validation sur les données train, la prédiction de machine est globalement correcte. Cependant, il y a aussi pas mal de variables qui sont mal prévues. Par conséquent, on peut faire plus ou moins la confiance sur ce classement.
data_complot_age <- data_complot %>% filter(age != '0') %>% filter(age < 300)
complot_age_train <- data_complot_age %>% slice_sample(prop = 0.8)
complot_age_test <- data_complot_age %>% anti_join(complot_age_train)
arbre_2 <- rpart(age~ Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15,
data = complot_age_train)
rpart.plot(arbre_2)
연속형은 나이로? Q+age? #```{r echo=TRUE} moyenne_prevue <- predict(arbre_1, complot_eng_train) residus <- complot_eng_trainn$engnat - moyenne_prevue # erreurs mean(residus ^ 2) # moyenne des résidus carrés
moyenne_prevue_test <- predict(arbre_1, complot_eng_test) residus <- complot_eng_train$engnat - moyenne_prevue_test # erreurs mean(residus ^ 2)
bien prévu
Forêt
```r
foret_1 <- randomForest(engnat ~ VCL1+VCL2+VCL3+VCL4+VCL5+VCL6+VCL7+VCL8+VCL9+VCL10+VCL11+VCL12+VCL13+VCL14+VCL15+VCL16,
complot_eng_train)
foret_1
##
## Call:
## randomForest(formula = engnat ~ VCL1 + VCL2 + VCL3 + VCL4 + VCL5 + VCL6 + VCL7 + VCL8 + VCL9 + VCL10 + VCL11 + VCL12 + VCL13 + VCL14 + VCL15 + VCL16, data = complot_eng_train)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 4
##
## OOB estimate of error rate: 22.93%
## Confusion matrix:
## 1 2 class.error
## 1 1424 73 0.0487642
## 2 383 109 0.7784553
varImpPlot(foret_1)
On peut voir que VCL13 est le plus important pour chercher un locuteur natif anglais.
분석의 목적 과정 결과 해석
nombre
data_complot_gen <- data_complot %>% filter(gender != '0')
data_complot_gen$gender <- as.factor(data_complot_gen$gender)
complot_gen_train <- data_complot_gen %>% slice_sample(prop = 0.8)
complot_gen_test <- data_complot_gen %>% anti_join(complot_gen_train)
## Joining, by = c("Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10",
## "Q11", "Q12", "Q13", "Q14", "Q15", "E1", "E2", "E3", "E4", "E5", "E6", "E7",
## "E8", "E9", "E10", "E11", "E12", "E13", "E14", "E15", "introelapse",
## "testelapse", "surveyelapse", "TIPI1", "TIPI2", "TIPI3", "TIPI4", "TIPI5",
## "TIPI6", "TIPI7", "TIPI8", "TIPI9", "TIPI10", "VCL1", "VCL2", "VCL3", "VCL4",
## "VCL5", "VCL6", "VCL7", "VCL8", "VCL9", "VCL10", "VCL11", "VCL12", "VCL13",
## "VCL14", "VCL15", "VCL16", "education", "urban", "gender", "engnat", "age",
## "hand", "religion", "orientation", "race", "voted", "married", "familysize",
## "major")
arbre_2 <- rpart(gender ~ TIPI1+TIPI2+TIPI3+TIPI4+TIPI5+TIPI6+TIPI7+TIPI8+TIPI9+TIPI10,
data = complot_gen_train)
rpart.plot(arbre_2,box.palette = "Blues")
moyenne_prevue_2 <- predict(arbre_2,
complot_gen_train)
residus_2 <- complot_gen_train$education - moyenne_prevue_2 # erreurs
mean(residus_2 ^ 2) # moyenne des résidus carrés
## [1] 4.877134
### validation sur les données test
moyenne_prevue_test_2 <- predict(arbre_2,
complot_gen_test)
residus_2 <- complot_gen_test$education - moyenne_prevue_test_2 # erreurs
mean(residus_2 ^ 2)
## [1] 5.050512
bien prévu
Forêt #```{r echo=TRUE} foret_2 <- randomForest(gender ~ TIPI1+TIPI2+TIPI3+TIPI4+TIPI5+TIPI6+TIPI7+TIPI8+TIPI9+TIPI10, data_complot_train) foret_2
varImpPlot(foret_2) ``` Q10 est plus important ?
data_complot_tipi_clust <- complot_tipi_hcpc$data.clust
data_complot_r <- data_complot %>% mutate(religion = factor(religion)) modele_religion <- lm(religion ~ Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15, data = data_complot_r) summary(modele_religion)
data_complot_r %>% add_predictions(modele_religion) %>% ggplot() + aes(Q3, Q8, col = religion) + geom_point() + geom_smooth(aes(y = pred), method = “lm”)
data_complot_r <- data_complot %>% mutate(religion = factor(religion)) %>% mutate(Q_mean = rowMeans(select(., Q1:Q15))) modele_religion <- lm(Q_mean~religion, data = data_complot_r) summary(modele_religion)
data_complot_r %>% add_predictions(modele_religion) %>% ggplot() + aes(Q1, Q3, col = religion) + geom_point() + geom_smooth(aes(y = pred), method = “lm”)
Après avoir selectionné 15 colonnes de questions, on peut voir la corrélation entre elles par le test PCA. Il semble que les question sont regroupé par 3 ou 4 : Q3,Q8,Q13 (ET) / Q15,Q11,Q1,Q6 (cacher la verité) / Q2,Q7,Q12 (minorité qui réelement contrôle le monde) / Q10,Q5,Q14 Q4,Q9 (tech, la maladie) En voyant la distance entre les flèches sur le plot de PCA et en analysant des catégories des questions à point de vue humaine, on peut prévoir que les clusters seront divisés par 4 groupes.
Mais, au contraire à mon hypothèse, la machine a automatiquement divisé les clusters par 4. Pour analyser son avis :
complot_q_hcpc <- HCPC(pca_q, nb.clust = -1) complot_q_hcpc$desc.var
Selon l’analyse de ‘v.test’, on peut bien voir les questions d’ET (Q3,Q8,Q13) dans le cluster 1. Dans le deuxième cluster, on voit des question à propos d’informations cachées (Q15,Q1,Q11,Q6) et Q10(new tech hidden) est aussi inclus ici au contraire de notre prévention. Les question qui sont les plus liées au cluster sont Q13 et Q3 qui sont également liées au cluster 1. Bien que les autres question (Q2,Q4,Q5,Q7,Q9,Q12,Q14) sont sur la liste, ça ne semble pas faire distinguer les question d’ET du cluster 1. On va essayer de mettre 4 pour clusterise.