Package à utiliser
A Vérifier s’ils sont déjà téléchargés:
library(dplyr); library(tidyr) ; library(readxl); library(ggplot2)
Installez les packages si besoin à l’aide de install.packages()
install.packages("ggplot2")
Ici on ne traite pas les données qualitatives qui alors seront enlevées de la base de données
kable(head(db_econfin_TP_u[,c(1,16)],2))
code | Pourquoi ? |
---|---|
2020-04-17_18:00:19 | J’ai peur que cela ne suffise pas pour que l’on change suffisamment nos habitudes pour remédier à la crise écologique… |
2020-04-18_21:07:51 | Je ne suis pas certaine qu’elle engendre à elle seule un changement radical et général des habitudes de production et de consommation |
= db_econfin_TP_u[,-16]
db_econfin_TP_u kable(head(db_econfin_TP_u))
code | day | year | sex | diplôme_plus_élevé | fam_st | Combien_enfants | religion | combien_pièces | liv | Avec_qui_confiné | travaille_confinement | after_COVID | ST_env | LT_env |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2020-04-17_18:00:19 | 1 | 1995 | Féminin | Bac +5 | Célibataire | 0 | Athée | 2 | En zone urbaine | Avec un.e conjoint.e. | Oui, je suis en télétravail | Oui | Plutôt oui | Plutôt non |
2020-04-18_21:07:51 | 2 | 1995 | Féminin | Bac +5 | Célibataire | 0 | NA | 6 | En zone urbaine | Chez vos parents | Oui, je suis en télétravail | Non | Plutôt non | Plutôt non |
2020-04-19_15:01:46 | 3 | 1994 | Féminin | Bac +5 | Célibataire | 0 | Croyant non pratiquant (ex: de culture chrétienne) | 8 | En zone périurbaine | Chez vos parents | Oui, je suis en télétravail | Non | Plutôt oui | Plutôt non |
2020-04-23_13:05:43 | 7 | 1962 | Masculin | Bac +3 | Marié.e | 0 | Bouddhiste | 6 | En zone rurale | Avec un.e conjoint.e. | Oui, je suis en télétravail | Je n’ai pas d’opinion | Plutôt oui | Plutôt non |
2020-04-23_13:10:16 | 7 | 1994 | Féminin | Bac +5 | Célibataire | 0 | Croyant non pratiquant (ex: de culture chrétienne) | 7 | En zone urbaine | Chez vos parents | Oui, je suis en télétravail | Oui | Plutôt oui | Plutôt oui |
2020-04-23_13:31:23 | 7 | 1969 | Féminin | Bac ou bac professionnel | Célibataire | 0 | Agnostique | 2 | En zone urbaine | Seul.e | Oui, je suis sur mon site de travail habituel | Non | Plutôt oui | Plutôt non |
On a déjà re codé les questions à un nom pour qu’ils soient plus faciles à moviliser sur R, example:
“Quel est votre diplôme le plus élevé?” –> diplôme_plus_élevé
Une example d’une variable qui a besoin de recodage pour les analyses:
table(db_econfin_TP_u$diplôme_plus_élevé)
##
## Aucun diplôme
## 16
## Bac +3
## 263
## Bac +5
## 466
## Bac ou bac professionnel
## 248
## Brevet d'étude du premier cycle, CAP, BEP
## 57
## Doctorat et plus
## 41
## DUT, BTS
## 98
On va créer une nouvelle variable ES avec deux modalités; absence (0) et présence (1) de études supérieur.
#diplôme_plus_élevé
= db_econfin_TP_u %>% mutate(ES = case_when(diplôme_plus_élevé == "Bac +3" ~ 1, diplôme_plus_élevé == "Bac +5" ~ 1, diplôme_plus_élevé == "DUT, BTS" ~ 1, diplôme_plus_élevé == "Doctorat et plus" ~ 1, diplôme_plus_élevé == "Aucun diplôme" ~ 0, diplôme_plus_élevé == "Bac ou bac professionnel" ~ 0,diplôme_plus_élevé == "Brevet d'étude du premier cycle, CAP, BEP" ~ 0)) db_econfin_TP_u
On suit le même processus pour les variables statut de la famille (fam_st) et combien des enfants (Combien_enfants).
# status famille
= db_econfin_TP_u %>% mutate(fam = case_when(fam_st == "Célibataire" ~ 0,fam_st == "Veuf.ve" ~ 0,fam_st == "En couple (concubinage)" ~ 1,fam_st == "Marié.e" ~ 1))
db_econfin_TP_u # nombre enfants
= db_econfin_TP_u %>% mutate(chi = case_when(Combien_enfants >= 1 ~ 1,Combien_enfants < 1 ~ 0)) db_econfin_TP_u
db_econfin_TP_rcodage: base de données avec variables déjà recodées
= left_join(db_econfin_TP_u,db_econfin_TP_rcodage, by = "code")
db_econfin_TP_u
= db_econfin_TP_u %>% select(-c(diplôme_plus_élevé,Combien_enfants,fam_st,religion,combien_pièces,Avec_qui_confiné,travaille_confinement)) db_econfin_TP_u
Pour la religion (sur R codé comme rel), travail_confinement (act), confiné_avec_qui et le numéro de chambres ont suit le même procédé. Par exemple, on a crée une variable chambre (room) avec trois modalité: Moins de 3; Entre 3 et 6; Plus de 6.
Pour la religion (rel):on a deux modalités présence ou absence de religion traditionnelle.
On arrive a la base de donnée suivant:
kable(head(db_econfin_TP_u))
code | day | year | sex | liv | after_COVID | ST_env | LT_env | ES | fam | chi | rel | room | act | lon |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2020-04-17_18:00:19 | 1 | 1995 | Féminin | En zone urbaine | Oui | Plutôt oui | Plutôt non | 1 | 0 | 0 | 0 | Moins de 3 | 1 | 0 |
2020-04-18_21:07:51 | 2 | 1995 | Féminin | En zone urbaine | Non | Plutôt non | Plutôt non | 1 | 0 | 0 | NA | Entre 3 et 6 | 1 | 0 |
2020-04-19_15:01:46 | 3 | 1994 | Féminin | En zone périurbaine | Non | Plutôt oui | Plutôt non | 1 | 0 | 0 | 0 | Plus de 6 | 1 | 0 |
2020-04-23_13:05:43 | 7 | 1962 | Masculin | En zone rurale | Je n’ai pas d’opinion | Plutôt oui | Plutôt non | 1 | 1 | 0 | 1 | Entre 3 et 6 | 1 | 0 |
2020-04-23_13:10:16 | 7 | 1994 | Féminin | En zone urbaine | Oui | Plutôt oui | Plutôt oui | 1 | 0 | 0 | 0 | Plus de 6 | 1 | 0 |
2020-04-23_13:31:23 | 7 | 1969 | Féminin | En zone urbaine | Non | Plutôt oui | Plutôt non | 0 | 0 | 0 | 0 | Moins de 3 | 1 | 1 |
Les variables explicatives
table(db_econfin_TP_u$sex,useNA = "ifany")
##
## Agenre Féminin Masculin <NA>
## 1 872 313 4
lapply(db_econfin_TP_u[,c(9:15)],useNA = "ifany",table)
## $ES
##
## 0 1 <NA>
## 321 868 1
##
## $fam
##
## 0 1 <NA>
## 516 623 51
##
## $chi
##
## 0 1 <NA>
## 824 331 35
##
## $rel
##
## 0 1 <NA>
## 955 218 17
##
## $room
##
## Entre 3 et 6 Moins de 3 Plus de 6 <NA>
## 640 189 340 21
##
## $act
##
## 0 1 <NA>
## 370 781 39
##
## $lon
##
## 0 1 <NA>
## 1052 136 2
ggplot(db_econfin_TP_u) + aes(x = sex) + geom_bar() + theme_minimal()
# barplot(table(db_econfin_TP_u$sex,useNA = "ifany")) # not so useful
ggplot(db_econfin_TP_u) + aes(x = liv) + geom_bar() + theme_minimal()
ggplot(db_econfin_TP_u) + aes(x = after_COVID) + geom_bar() + theme_minimal()
table(db_econfin_TP_u$ST_env)
##
## Plutôt non Plutôt oui
## 152 1022
ggplot(db_econfin_TP_u) + aes(x = ST_env) + geom_bar() + theme_minimal()
Représentation des données à l’aide des tableaux:
table(db_econfin_TP_u$ST_env,db_econfin_TP_u$sex,useNA = "ifany")
##
## Agenre Féminin Masculin <NA>
## Plutôt non 1 95 56 0
## Plutôt oui 0 766 252 4
## <NA> 0 11 5 0
test = db_econfin_TP_u %>% group_by(sex) %>% count(ST_env) %>% mutate(total_by_sex = sum(n)) %>% mutate(per = round(n/sum(n)*100,2))) (
## # A tibble: 8 × 5
## # Groups: sex [4]
## sex ST_env n total_by_sex per
## <chr> <chr> <int> <int> <dbl>
## 1 Agenre Plutôt non 1 1 100
## 2 Féminin Plutôt non 95 872 10.9
## 3 Féminin Plutôt oui 766 872 87.8
## 4 Féminin <NA> 11 872 1.26
## 5 Masculin Plutôt non 56 313 17.9
## 6 Masculin Plutôt oui 252 313 80.5
## 7 Masculin <NA> 5 313 1.6
## 8 <NA> Plutôt oui 4 4 100
ggplot(db_econfin_TP_u) + aes(x = LT_env) + geom_bar() + theme_minimal()
#liv
== "En zone rurale"] = "1"
db_econfin_TP_u [db_econfin_TP_u == "En zone périurbaine"] = "2"
db_econfin_TP_u [db_econfin_TP_u == "En zone urbaine"] = "3"
db_econfin_TP_u [db_econfin_TP_u #room
== "Moins de 3"] = "1"
db_econfin_TP_u [db_econfin_TP_u == "Entre 3 et 6"] = "2"
db_econfin_TP_u [db_econfin_TP_u == "Plus de 6"] = "3"
db_econfin_TP_u [db_econfin_TP_u # ST_env et LT_env
== "Plutôt non"] = "0"
db_econfin_TP_u [db_econfin_TP_u == "Plutôt oui"] = "1"
db_econfin_TP_u [db_econfin_TP_u #sex
== "Masculin"] = "0"
db_econfin_TP_u [db_econfin_TP_u == "Féminin"] = "1"
db_econfin_TP_u [db_econfin_TP_u = filter(db_econfin_TP_u, sex != "Agenre")
db_econfin_TP_u #After covid
== "Non"] = "0"
db_econfin_TP_u [db_econfin_TP_u == "Oui"] = "1"
db_econfin_TP_u [db_econfin_TP_u == "Je n'ai pas d'opinion"] = "2" db_econfin_TP_u [db_econfin_TP_u
== "NA"] = NA
db_econfin_TP_u[db_econfin_TP_u <- na.omit(db_econfin_TP_u) db_econfin_TP_u
Les résultats …
kable(head(db_econfin_TP_u))
code | day | year | sex | liv | after_COVID | ST_env | LT_env | ES | fam | chi | rel | room | act | lon |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2020-04-17_18:00:19 | 1 | 1995 | 1 | 3 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
2020-04-19_15:01:46 | 3 | 1994 | 1 | 2 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 3 | 1 | 0 |
2020-04-23_13:05:43 | 7 | 1962 | 0 | 1 | 2 | 1 | 0 | 1 | 1 | 0 | 1 | 2 | 1 | 0 |
2020-04-23_13:10:16 | 7 | 1994 | 1 | 3 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 3 | 1 | 0 |
2020-04-23_13:31:23 | 7 | 1969 | 1 | 3 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
2020-04-23_13:35:29 | 7 | 1996 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 3 | 0 | 0 |
dim(db_econfin_TP_u)
## [1] 1001 15
class(db_econfin_TP_u$sex)
## [1] "character"
#rownames(db_econfin_TP_u) = c(db_econfin_TP_u$...1) ; # db_econfin_TP_u = db_econfin_TP_u[,2:13]
c(4:15)] <- lapply(db_econfin_TP_u[,c(4:15)], factor)
db_econfin_TP_u[,
c(2:3)] <- lapply(db_econfin_TP_u[,c(2:3)], as.numeric) # coercion of year to numeric
db_econfin_TP_u[,
str(db_econfin_TP_u)
## tibble [1,001 × 15] (S3: tbl_df/tbl/data.frame)
## $ code : chr [1:1001] "2020-04-17_18:00:19" "2020-04-19_15:01:46" "2020-04-23_13:05:43" "2020-04-23_13:10:16" ...
## $ day : num [1:1001] 1 3 7 7 7 7 7 7 7 7 ...
## $ year : num [1:1001] 1995 1994 1962 1994 1969 ...
## $ sex : Factor w/ 2 levels "0","1": 2 2 1 2 2 1 2 1 2 1 ...
## $ liv : Factor w/ 3 levels "1","2","3": 3 2 1 3 3 1 1 2 2 3 ...
## $ after_COVID: Factor w/ 3 levels "0","1","2": 2 1 3 2 1 2 1 1 2 1 ...
## $ ST_env : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 1 2 1 ...
## $ LT_env : Factor w/ 2 levels "0","1": 1 1 1 2 1 2 1 1 1 1 ...
## $ ES : Factor w/ 2 levels "0","1": 2 2 2 2 1 2 2 2 2 2 ...
## $ fam : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 2 2 2 1 ...
## $ chi : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 2 2 1 1 ...
## $ rel : Factor w/ 2 levels "0","1": 1 1 2 1 1 1 2 1 1 1 ...
## $ room : Factor w/ 3 levels "1","2","3": 1 3 2 3 1 3 2 2 2 1 ...
## $ act : Factor w/ 2 levels "0","1": 2 2 2 2 2 1 2 1 2 2 ...
## $ lon : Factor w/ 2 levels "0","1": 1 1 1 1 2 1 1 1 1 2 ...
## - attr(*, "na.action")= 'omit' Named int [1:184] 2 30 44 49 54 55 56 59 62 76 ...
## ..- attr(*, "names")= chr [1:184] "2" "30" "44" "49" ...
attach(db_econfin_TP_u)
Jours 1: 2020-04-17
Jours 25: 2020-05-11
hist(db_econfin_TP_u$day)
= db_econfin_TP_u %>% mutate(age = 2021 - year)
db_econfin_TP_u
hist(db_econfin_TP_u$age, xlab="Age")
summary(db_econfin_TP_u$age)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 16.00 24.00 27.00 31.99 34.00 79.00
= db_econfin_TP_u %>% select(1:3,age,4:16) # ordonner base de données
db_econfin_TP_u %>% group_by(sex) %>% dplyr::summarise(n = n(), mean = round(mean(age,na.rm = TRUE),1),median = median(age),min = min(age), max = max(age)) db_econfin_TP_u
## # A tibble: 2 × 6
## sex n mean median min max
## <fct> <int> <dbl> <dbl> <dbl> <dbl>
## 1 0 261 35.9 30 19 79
## 2 1 740 30.6 27 16 77
= db_econfin_TP_u %>% mutate(t_age = case_when(age <= 27 ~ 1,age > 27 & age <= 40 ~ 2, age > 40 ~ 3))
db_econfin_TP_u <- within(db_econfin_TP_u, {t_age<-factor(t_age)})
db_econfin_TP_u ggplot(db_econfin_TP_u) + aes(x = t_age) + geom_bar() + scale_fill_hue() + theme_minimal()
1: <= 27 ; 2 : > 27 et <= 40 ; 3: > 40
Les Khi2
Test de la somme des rangs de Wilcoxon
ACM
Le test du Chi-square test ou Khi2 examine si les lignes et les colonnes d’un tableau de contingence sont significativement associées. Le terme significatif est un élément de jargon statistique qui signifie pas dû au hasard.
La statistique du Khi2:
\[\ X^2=\sum \frac{\ (o-e)^2}{\
e}\]
e effectifs théoriques
o effectifs observés
Degré de Liberté (DF): \[DF\ =\ (\ rows\ – 1) * (columns\ – 1)\]
Exemple de DF de deux variables à deux modalités: \(DF = (2 – 1) * (2 – 1) = 1\)
$expected chisq_a
##
## Non-seule Seule
## Non 509.3936 61.60639
## Oui 269.4166 32.58342
## Pas avis 114.1898 13.81019
\[r\ = \frac{\ o-e}{\ \sqrt{e}}\]
r = round(chisq_a$residuals, 3)) (
##
## Non-seule Seule
## Non 0.426 -1.224
## Oui -0.147 0.423
## Pas avis -0.673 1.935
library(corrplot)
corrplot(chisq_a$residuals, is.cor = FALSE)
Ce qui habitent seuls ont moins de tendance à dire non que prévu et à dire plus j’ai pas d’opinion que prévu.
= table(db_econfin_TP_u$after_COVID, db_econfin_TP_u$room)
tab_room_after <- chisq.test(tab_room_after)) (chisq_b
##
## Pearson's Chi-squared test
##
## data: tab_room_after
## X-squared = 2.2388, df = 4, p-value = 0.6919
chisq_c = chisq.test(table(db_econfin_TP_u$ST_env,db_econfin_TP_u$after_COVID))) (
##
## Pearson's Chi-squared test
##
## data: table(db_econfin_TP_u$ST_env, db_econfin_TP_u$after_COVID)
## X-squared = 4.6835, df = 2, p-value = 0.09616
%>% group_by(after_COVID) %>% count(ST_env) %>% mutate(per = n/sum(n)*100) db_econfin_TP_u
## # A tibble: 6 × 4
## # Groups: after_COVID [3]
## after_COVID ST_env n per
## <fct> <fct> <int> <dbl>
## 1 0 0 77 13.5
## 2 0 1 494 86.5
## 3 1 0 26 8.61
## 4 1 1 276 91.4
## 5 2 0 17 13.3
## 6 2 1 111 86.7
Visualisation graphique: Box plots
boxplot(age ~ ST_env, data = db_econfin_TP_u)
Fonction wilcox.test
wilcox.test(age ~ ST_env, data=db_econfin_TP_u)
##
## Wilcoxon rank sum test with continuity correction
##
## data: age by ST_env
## W = 60031, p-value = 0.01566
## alternative hypothesis: true location shift is not equal to 0
La p-value est au-dessous de niveau de signification (\(\alpha = 0.05\)), ainsi on fait le choix de rejeter H0; la distribution des données diffère selon les deux groupes.
Pour voir la tendance de cette différence il faut revenir à la visualisation graphique; le Box plot.
En conclusion: ceux et celles qui sont moins âgées ont plus de tendance à dire: Plutôt oui (1)
boxplot(day ~ ST_env, data = db_econfin_TP_u)
wilcox.test(day ~ ST_env, data=db_econfin_TP_u)
##
## Wilcoxon rank sum test with continuity correction
##
## data: day by ST_env
## W = 45365, p-value = 0.01105
## alternative hypothesis: true location shift is not equal to 0
Il existe un rapport positif entre jour et Plutôt oui (1).
L’ analyse des correspondances multiples ACM ou MCA (en anglais)
Social variables et les variables de réponse: LT, ST, after_covid
L’ACM contraint les axes d’ordination à être des combinaisons linéaires de variables explicatives.
On ne considère que les variables qualitatives.
Dans le graphique suivant on peut voir la proportion de variances retenues par les différentes dimensions, autrement dit les pourcentages de variances expliqués par chaque dimension de l’ACM. Les deux trois premiers axes/dimensions permettront d expliquer la majorité des différences observées dans l’échantillon.
Contribution des variables aux dimensions de l’ACM.
Corrélation entre les variables et les principales dimensions de l’ACM.
Affichage des coordonnées de chaque catégorie de variables dans chaque dimension.
Dimensions 1 et 2
Dimensions 1 et 3