Partie 7 Analyse d’enquêtes

  • Mise en place : Télécharger le dossier exo7 et décompressez le sur votre ordinateur. Puis ouvrez le projet R exo6.Rproj dans Rstudio.

7.1 Introduction

On propose ici une démarche simplifiée de l’analyse d’enquête utilisant les fonctions R-base et quelques fonctions supplémentaires issues du package questionR qui permettent de simplifier l’écriture des programmes. Les explications détaillées se trouvent dans le très beau site web analyse-R auquel ont notamment contribué Julien Barnier et Joseph Larmarange.

https://larmarange.github.io/analyse-R/

ce programme suffit pour des analyses simples de questionnaires. Mais pour des analyses plus avancées, il faudra utiliser des packages plus avancés comme survey.

7.2 Préparation des données

7.2.1 Importation du fichier au format .RDS

don<-readRDS("resources/data/pew/Pew_2007_2017.Rdata")
str(don)
#> tibble [62,060 × 10] (S3: tbl_df/tbl/data.frame)
#>  $ survey      : Factor w/ 2 levels "Spring2007","Spring2017": 1 1 1 1 1 1 1 1 1 1 ...
#>  $ country     : Factor w/ 30 levels "Argentina","Brazil",..: 5 5 5 5 5 5 5 5 5 5 ...
#>  $ sex         : Factor w/ 2 levels "Male","Female": 1 2 1 1 2 1 1 1 1 2 ...
#>  $ age         : num [1:62060] 50 79 43 74 78 36 42 61 21 41 ...
#>  $ today       : Factor w/ 5 levels "1.Typical","2.Particularly good",..: 1 1 1 1 1 1 1 1 1 1 ...
#>  $ use_internet: Factor w/ 4 levels "1.Yes","2.No",..: 1 2 1 2 2 1 1 2 1 1 ...
#>  $ opi_USA     : Factor w/ 6 levels "1.Very favorable",..: 3 2 3 1 2 1 2 2 2 2 ...
#>  $ opi_CHN     : Factor w/ 6 levels "1.Very favorable",..: 3 2 3 3 3 2 2 3 2 2 ...
#>  $ opi_RUS     : Factor w/ 6 levels "1.Very favorable",..: 3 2 2 3 3 2 2 3 3 2 ...
#>  $ weight      : num [1:62060] 1.009 0.954 0.996 0.989 0.982 ...
#>   ..- attr(*, "label")= chr "Weighting factor"
#>   ..- attr(*, "format.spss")= chr "F9.6"
#>   ..- attr(*, "display_width")= int 10

7.2.2 (simplifiée) des variables

Les données sont issues de deux vagues de la Global attitude Survey réalisée par le Pew Research Center en 2007 et 2017. Nous avons conservé uniquement des variables communes aux deux enquêtes et posées de façon identique.

  • survey : date d’enquête (2007 ou 2017)
  • country : lieu d’enquête (pays présents aux deux dates)
  • sex : sexe de l’individu
  • age : âge de l’individu
  • today : état d’esprit du jour (typique, très bon, très mauvais)
  • use_internet: usage d’internet
  • opi_USA : opinion sur les USA
  • opi_CHN : opinion sur la Chine
  • opi_RUS : opinion sur la Russie
  • weight : poids de l’individu pour les redressements

7.2.3 Résumé des variables (tri à plat)

summary(don)
#>         survey               country          sex             age       
#>  Spring2007:28061   India        : 4499   Male  :30125   Min.   :18.00  
#>  Spring2017:33999   United States: 3472   Female:31935   1st Qu.:28.00  
#>                     Lebanon      : 2552                  Median :40.00  
#>                     Jordan       : 2548                  Mean   :42.59  
#>                     South Africa : 2295                  3rd Qu.:55.00  
#>                     Nigeria      : 2202                  Max.   :97.00  
#>                     (Other)      :44492                                 
#>                  today             use_internet  
#>  1.Typical          :36554   1.Yes       :32385  
#>  2.Particularly good:20216   2.No        :25892  
#>  3.Particularly bad : 4775   3.Don't know:  232  
#>  4.Don't know       :  419   4.Refused   :   69  
#>  5.Refused          :   96   NA's        : 3482  
#>                                                  
#>                                                  
#>                    opi_USA                        opi_CHN     
#>  1.Very favorable      :10081   1.Very favorable      : 8002  
#>  2.Somewhat favorable  :21725   2.Somewhat favorable  :21860  
#>  3.Somewhat unfavorable:14502   3.Somewhat unfavorable:15097  
#>  4.Very unfavorable    :10629   4.Very unfavorable    : 8402  
#>  5.Don't know          : 4718   5.Don't know          : 8183  
#>  6.Refused             :  405   6.Refused             :  516  
#>                                                               
#>                    opi_RUS          weight        
#>  1.Very favorable      : 5650   Min.   : 0.02301  
#>  2.Somewhat favorable  :18105   1st Qu.: 0.65138  
#>  3.Somewhat unfavorable:16806   Median : 1.00000  
#>  4.Very unfavorable    :10144   Mean   : 1.00032  
#>  5.Don't know          :10719   3rd Qu.: 1.11834  
#>  6.Refused             :  636   Max.   :18.74950  
#> 

7.2.4 Tailles des échantillons par pays et par date

On examine la taille des échantillons collectés dans les différents pays

table(don$country,don$survey)
#>                 
#>                  Spring2007 Spring2017
#>   Argentina             800       1012
#>   Brazil               1000       1007
#>   Canada                982       1000
#>   Chile                 800        987
#>   France               1004        996
#>   Germany              1000        995
#>   Ghana                 707       1129
#>   India                2040       2459
#>   Indonesia             995        996
#>   Israel                887       1050
#>   Italy                 501        899
#>   Japan                 762       1009
#>   Jordan               1000       1548
#>   Kenya                 997       1117
#>   Lebanon              1000       1552
#>   Mexico                828       1000
#>   Nigeria              1092       1110
#>   Peru                  800        998
#>   Poland                504       1142
#>   Russia                991       1002
#>   Senegal               700       1083
#>   South Africa         1000       1295
#>   South Korea           718       1010
#>   Spain                 500        995
#>   Sweden                996        996
#>   Tanzania              702       1061
#>   Turkey                971       1050
#>   United Kingdom        982       1028
#>   United States        1999       1473
#>   Venezuela             803       1000

7.2.5 Sélection d’un échantillon

On décide par exemple d’analyser l’échantillon des réponses françaises en 2017 :

fra17<-don[don$country =="France" & don$survey=="Spring2017",]
source <- "Source : Pew Research Center, Global Attitude Survey, 2017, France"
summary(fra17)
#>         survey         country        sex           age       
#>  Spring2007:  0   France   :996   Male  :502   Min.   :18.00  
#>  Spring2017:996   Argentina:  0   Female:494   1st Qu.:40.00  
#>                   Brazil   :  0                Median :54.00  
#>                   Canada   :  0                Mean   :52.55  
#>                   Chile    :  0                3rd Qu.:66.00  
#>                   Germany  :  0                Max.   :94.00  
#>                   (Other)  :  0                               
#>                  today           use_internet                   opi_USA   
#>  1.Typical          :685   1.Yes       :868   1.Very favorable      : 45  
#>  2.Particularly good:245   2.No        :127   2.Somewhat favorable  :383  
#>  3.Particularly bad : 54   3.Don't know:  1   3.Somewhat unfavorable:353  
#>  4.Don't know       : 12   4.Refused   :  0   4.Very unfavorable    :190  
#>  5.Refused          :  0                      5.Don't know          : 25  
#>                                               6.Refused             :  0  
#>                                                                           
#>                    opi_CHN                      opi_RUS        weight      
#>  1.Very favorable      : 47   1.Very favorable      : 40   Min.   :0.1830  
#>  2.Somewhat favorable  :360   2.Somewhat favorable  :309   1st Qu.:0.3459  
#>  3.Somewhat unfavorable:381   3.Somewhat unfavorable:385   Median :0.6281  
#>  4.Very unfavorable    :168   4.Very unfavorable    :241   Mean   :0.9987  
#>  5.Don't know          : 40   5.Don't know          : 21   3rd Qu.:1.1900  
#>  6.Refused             :  0   6.Refused             :  0   Max.   :4.1079  
#> 

7.2.6 Recodage des modalités

Si l’on souhaite rendre un rapport en français, on va recoder les modalités des variables qui nous intéressent et en profiter pour déclarer manquantes les valeurs correspondant à des non-réponses ou des refus de répondre.


levels(fra17$sex)<-c("Homme","Femme")
levels(fra17$today)<-c("Typique","Très Bon","Très Mauvais",NA,NA)
levels(fra17$use_internet)<-c("Oui","Non",NA,NA)
levels(fra17$opi_USA)<-c("Trés Fav.","Fav.","Défav.","Très Déf.",NA,NA)
levels(fra17$opi_RUS)<-c("Trés Fav.","Fav.","Défav.","Très Déf.",NA,NA)
levels(fra17$opi_CHN)<-c("Trés Fav.","Fav.","Défav.","Très Déf.",NA,NA)

7.2.7 Découpage de variables quantitatives en classes

On peut transformer la variable quantitative âge en variable qualitative (factor) à l’aide de la fonction cut(). La question va évidemment être de décider :

  • combien on fait de classes ?
  • selon quels seuils ?
  • avec quels noms ?

On peut décider de créer cinq classesd’âge à l’aide des quintiles de la distribution :

fra17$age5<-cut(fra17$age, breaks = quantile(fra17$age,c(0,0.2,0.4,0.6,0.8, 1)), include.lowest = T)
levels(fra17$age5) <-c("18-36 ans","37-49 ans","50-59 ans","60-68 ans","69-94-ans")

Mais on peut aussi décider qu’on veut travailler sur les générations en choisissant les dates de 1949, 1969 et 1989

fra17$gen<-2017-fra17$age
fra17$gen4<-cut(fra17$gen, breaks=c(min(fra17$gen), 1949, 1969, 1989, max(fra17$gen)), include.lowest = T)
levels(fra17$gen4)<-c(" 1950< ","1950-69","1970-89","> 1990")

7.2.8 Sélection

On ne garde que les variable qui nous intéressent pour l’analyse.

sel<-fra17[,c("sex","age5","gen4","opi_USA","weight")]
summary(sel)
#>     sex             age5          gen4          opi_USA        weight      
#>  Homme:502   18-36 ans:212    1950< :218   Trés Fav.: 45   Min.   :0.1830  
#>  Femme:494   37-49 ans:187   1950-69:407   Fav.     :383   1st Qu.:0.3459  
#>              50-59 ans:199   1970-89:264   Défav.   :353   Median :0.6281  
#>              60-68 ans:203   > 1990 :107   Très Déf.:190   Mean   :0.9987  
#>              69-94-ans:195                 NA's     : 25   3rd Qu.:1.1900  
#>                                                            Max.   :4.1079

7.3 Opinion USA

7.3.1 la fonction table()

Le dénombrement des modalités d’une variable se fait généralement avec la fonction table() qui permet de croiser une ou plusieurs variables. Ci-dessous on donne des exemples de croisement à une, deux ou trois variables

t1<-table(sel$opi_USA)
kable(t1)
Var1 Freq
Trés Fav. 45
Fav. 383
Défav. 353
Très Déf. 190
t2<-table(sel$opi_USA,sel$sex)
kable(t2)
Homme Femme
Trés Fav. 27 18
Fav. 204 179
Défav. 164 189
Très Déf. 97 93
t3<-table(sel$opi_USA,sel$sex,sel$gen4)
kable(t3)
Var1 Var2 Var3 Freq
Trés Fav. Homme 1950< 5
Fav. Homme 1950< 39
Défav. Homme 1950< 37
Très Déf. Homme 1950< 31
Trés Fav. Femme 1950< 2
Fav. Femme 1950< 26
Défav. Femme 1950< 41
Très Déf. Femme 1950< 31
Trés Fav. Homme 1950-69 9
Fav. Homme 1950-69 78
Défav. Homme 1950-69 71
Très Déf. Homme 1950-69 33
Trés Fav. Femme 1950-69 7
Fav. Femme 1950-69 73
Défav. Femme 1950-69 82
Très Déf. Femme 1950-69 43
Trés Fav. Homme 1970-89 7
Fav. Homme 1970-89 57
Défav. Homme 1970-89 40
Très Déf. Homme 1970-89 25
Trés Fav. Femme 1970-89 6
Fav. Femme 1970-89 51
Défav. Femme 1970-89 55
Très Déf. Femme 1970-89 15
Trés Fav. Homme > 1990 6
Fav. Homme > 1990 30
Défav. Homme > 1990 16
Très Déf. Homme > 1990 8
Trés Fav. Femme > 1990 3
Fav. Femme > 1990 29
Défav. Femme > 1990 11
Très Déf. Femme > 1990 4

7.3.2 Visualisation avec plot ou barplot

Les objets de type table à une ou deux dimensions s’affichent facilement avec barplot()

barplot(t1, main="Opinion sur les USA")

barplot(t2, main = "Opinion sur les USA et Sexe")

7.3.3 Recodage

On peut regrouper des modalités entre elle en leur donnant le même nom et en éliminer d’autres en leur donnant la modalité NA.

sel$opi_USA2<-sel$opi_USA
levels(sel$opi_USA2)
#> [1] "Trés Fav." "Fav."      "Défav."    "Très Déf."
levels(sel$opi_USA2)<-c("Favorable","Favorable","Défavorable","Défavorable",NA,NA)

t<-table(sel$opi_USA2)
t
#> 
#>   Favorable Défavorable 
#>         428         543
prop.table(t)
#> 
#>   Favorable Défavorable 
#>   0.4407827   0.5592173
barplot(100*t/sum(t))

A ce stade, on a certes établi le fait qu’il y a une proportion plus grande d’opinion défavorables (56%) que favorables (44%) mais il faut établir un intervalle de confiance pour savoir si cela est simplement dû au biais d’écdhantillonage.

7.3.4 Calcul de l’intervalle de confiance

On va conduire un test pour trancher entre trois possibilités :

  • opinion majoritairement favorable aux USA
  • opinion majoritairement défavorable aux USA
  • opinion partagée sans majorité claire

On se fixe un intervalle de confiance de 95% (risque d’erreur de 5%)

On se reportera pour plus de détails à :

https://larmarange.github.io/analyse-R/intervalles-de-confiance.html

prop.test(t)
#> 
#>  1-sample proportions test with continuity correction
#> 
#> data:  t, null probability 0.5
#> X-squared = 13.384, df = 1, p-value = 0.0002538
#> alternative hypothesis: true p is not equal to 0.5
#> 95 percent confidence interval:
#>  0.4093399 0.4726998
#> sample estimates:
#>         p 
#> 0.4407827

Il semble donc que l’on puisse conclure que les français sont majoritairement défavorables aux USA puisque la proportion d’opinion favorbales est de 44% avec un intervalle de confiance compris entre 40.9 et 47.3 d’opinion favorable (pour un risque d’erreur p<0.05)

7.3.5 Prise en compte de la variable de redressement.

On a toutefois oublié de tenir compte de la variable de redressement (poids) qui tient compte du fit que l’échantillonage obtenu comportait des sur et sous-représentations de certaines cétégories de population. Du coup, il faut réécrire l’ensemble du programme en utilisant l’instruction wtd.table du package questionr.

t<-wtd.table(sel$opi_USA2, weights=sel$weight)
t
#>   Favorable Défavorable 
#>    462.4494    510.0442
prop.table(t)
#>   Favorable Défavorable 
#>   0.4755295   0.5244705
prop.test(t)
#> 
#>  1-sample proportions test with continuity correction
#> 
#> data:  t, null probability 0.5
#> X-squared = 2.2325, df = 1, p-value = 0.1351
#> alternative hypothesis: true p is not equal to 0.5
#> 95 percent confidence interval:
#>  0.4437896 0.5074651
#> sample estimates:
#>         p 
#> 0.4755295

On voit que la proportion d’opinion favorable est plus élevée après redressement (47.6%) ce qui du coup modifie l’intervalle de confiance (44.4% à 50.7%) et ne permet plus d’exclure l’hypothèse que l’opinion favorable soit en fait majoritaire. On concluera donc que L’opinion des français sur les USA en 2017 est partagée.

7.4 Opinion USA / Sexe

On choisit d’analyser la relation entre l’avis sur les USA et le sexe et on pose H0 : il n’y a pas de relation entre les deux variables.

7.4.1 tableau de contingence

On commence par recoder les deux variables puis par créer le tableau de contingence pondéré par la variable de pondération. On l’affiche en ajoutant les sommes en ligne et en colonnes avec addmargins()

levels(sel$sex) <- c("Homme","Femme")
tabcont<-wtd.table(sel$sex,sel$opi_USA2, weights = sel$weight)
tabcont
#>       Favorable Défavorable
#> Homme  238.0424    231.8120
#> Femme  224.4070    278.2321
addmargins(tabcont)
#>       Favorable Défavorable      Sum
#> Homme  238.0424    231.8120 469.8544
#> Femme  224.4070    278.2321 502.6391
#> Sum    462.4494    510.0442 972.4936

7.4.2 Pourcentages

On peut calculer trois tableaux de pourcentage différents à l’aide des fonctions lprop, cprop et prop du package questionr. On se contentera d’afficher le tableau des % en lignes pusique c’est celui qui donne la répartition des avis défavorables eyt favorables pour chaque sexe.

lprop(tabcont)
#>       Favorable Défavorable Total
#> Homme  50.7      49.3       100.0
#> Femme  44.6      55.4       100.0
#> All    47.6      52.4       100.0
  • Commentaire : On constate que les femmes sont a priori moins favorables aux USA (44.6%) que les hommes (50.7%) mais il est difficile d’affirmer à ce stade que la relation est significative.

7.4.3 Première visualisation

Onpeut visualiser notre table avec plot()

plot(tabcont, col=c("lightyellow","lightblue"), 
 #    main=titre, 
     sub=source, 
     )

7.4.4 test du chi-2

On réalise le test du chi-2 avec la fonction chisq.test() qui crée un objet complexe qui rappelle celui qui est créé par lm() pour la régression.

toto<-chisq.test(tabcont)
toto
#> 
#>  Pearson's Chi-squared test with Yates' continuity correction
#> 
#> data:  tabcont
#> X-squared = 3.2885, df = 1, p-value = 0.06977

Ici, la relation est presque significative (p = 0.07). On ne peut pas rejeter H0 avec un risque d’erreur inférerieur à 5% mais on pourrait le faire pour un risque d’erreur de 10%.

7.4.5 Analyse des résidus

Lorsque la relation est significative, l’analyse des résidus permet de voir quelles sont les cases présentent des anomalies significatives. On peut pour cela imprimer quatre tableaux correspondant aux valeurs observées, aux valeurs attendues, aux écarts entre les deux (résidus bruts) et à un test sur les écarts les plus significatifs (résidus standardisés).

ce que l’on peut aussi faire graphiquement

kable(toto$observed,caption = "Valeurs observées")
Table 7.1: Valeurs observées
Favorable Défavorable
Homme 238.0424 231.8120
Femme 224.4070 278.2321
kable(toto$expected,  caption = "Valeurs attendues")
Table 7.1: Valeurs attendues
Favorable Défavorable
Homme 223.4296 246.4248
Femme 239.0198 263.6194
kable(tabcont-toto$expected, caption = "Résidus bruts")
Table 7.1: Résidus bruts
Favorable Défavorable
Homme 14.61274 -14.61274
Femme -14.61274 14.61274
kable(toto$stdres, caption= "Résidus standardisés")
Table 7.1: Résidus standardisés
Favorable Défavorable
Homme 1.877656 -1.877656
Femme -1.877656 1.877656

On peut aussi visualiser graphiquement les résidus standardisés avec avec mosaicplot() et l’option shade=T. Seules les cases ayant des résidus standardisés supérieures à +2 ou inférieurs à -2 seront colorées, ce qui revient à visualiser uniquement les anomalies significatives avec un risque d’erreur p< 0.05.

mosaicplot(tabcont,shade=T)

7.5 Opinion USA / Âge

Supposons qu’on veuille analyser la relation entre l’opinion sur les USA et l’effet des classes d’âge ou des génération. Les deux variables age5 et gen4 sont issuesde la même variable mais elle n’ont pas le même sens d’un point de vue thématique

7.5.1 Effet de génération

tabcont<-wtd.table(sel$gen4,sel$opi_USA2, weights=sel$poids)
#> Warning: Unknown or uninitialised column: `poids`.
#> Warning in wtd.table(sel$gen4, sel$opi_USA2, weights = sel$poids): no weights
#> argument given, using uniform weights of 1
round(addmargins(tabcont),1)
#>         Favorable Défavorable Sum
#>  1950<         72         140 212
#> 1950-69       167         229 396
#> 1970-89       121         135 256
#> > 1990         68          39 107
#> Sum           428         543 971
lprop(tabcont)
#>         Favorable Défavorable Total
#>  1950<   34.0      66.0       100.0
#> 1950-69  42.2      57.8       100.0
#> 1970-89  47.3      52.7       100.0
#> > 1990   63.6      36.4       100.0
#> All      44.1      55.9       100.0
plot(tabcont, col=c("lightyellow","lightblue"), 
     main="Opinion sur les USA selon la génération", 
     sub=source, 
     )

On remarque que l’opinion sur les USA semble de plus en plus positive au fur et à mesure des générations. Mais il faut tester pour voir si cet effet est significatif.

titi<-chisq.test(tabcont)
titi
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  tabcont
#> X-squared = 26.901, df = 3, p-value = 6.175e-06

On obtient donc une relation très significative (Chi-2 = 26.9 , degrés de liberté =3, p < 0.001) entre la génération des personnes et leur opinion sur les USA. L’étude des résidus standardisés montre que cette relation est liée au fait que les générations récentes sont beaucoup plus favorables aux USA que les générations anciennes. On peut visualiser la relation avec la fonction mosaicplot(shaded=T)

mosaicplot(tabcont, shade = T)

7.5.2 Effet d’âge

Aurions nous tiré les mêmes conclusions en prenant un âge en 5 classes ?

tabcont<-wtd.table(sel$age5,sel$opi_USA2, weights=sel$poids)
#> Warning: Unknown or uninitialised column: `poids`.
#> Warning in wtd.table(sel$age5, sel$opi_USA2, weights = sel$poids): no weights
#> argument given, using uniform weights of 1
round(addmargins(tabcont),1)
#>           Favorable Défavorable Sum
#> 18-36 ans       123          87 210
#> 37-49 ans        80         101 181
#> 50-59 ans        84         109 193
#> 60-68 ans        75         120 195
#> 69-94-ans        66         126 192
#> Sum             428         543 971
lprop(tabcont)
#>           Favorable Défavorable Total
#> 18-36 ans  58.6      41.4       100.0
#> 37-49 ans  44.2      55.8       100.0
#> 50-59 ans  43.5      56.5       100.0
#> 60-68 ans  38.5      61.5       100.0
#> 69-94-ans  34.4      65.6       100.0
#> All        44.1      55.9       100.0
plot(tabcont, col=c("lightyellow","lightblue"), 
     main="Opinion sur les USA selon l'âge", 
     sub=source, 
     )

titi<-chisq.test(tabcont)
titi
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  tabcont
#> X-squared = 27.75, df = 4, p-value = 1.402e-05

On voit que la relation serait tout aussi significative et montrerait une variation continue de l’avius sur les USA avec l’âge, mais avec une opposition particulière des moins de 36 ans et des plus de 68 ans.

mosaicplot(tabcont, shade = T)

7.6 Opinion USA / Age & Sexe

On va se limiter au cas où l’on veut étudier la relation entre X et Y toutes choses égales quant à l’effet d’une troisième variable Z qui sert de variable de contrôle.

Par exemple, on veut savoir s’il existe un lien entre l’âge (X) et l’avis sur les USA (Y) demeure valable aussi bien pour les hommes que pour les femmes (Z).

7.6.1 Sous-échantillon des hommes

hom<-sel[sel$sex=="Homme",]
tabcont<-wtd.table(hom$age5,hom$opi_USA2)
#> Warning in wtd.table(hom$age5, hom$opi_USA2): no weights argument given, using
#> uniform weights of 1
round(addmargins(tabcont),0)
#>           Favorable Défavorable Sum
#> 18-36 ans        65          49 114
#> 37-49 ans        46          49  95
#> 50-59 ans        39          46  85
#> 60-68 ans        40          58  98
#> 69-94-ans        41          59 100
#> Sum             231         261 492
lprop(tabcont)
#>           Favorable Défavorable Total
#> 18-36 ans  57.0      43.0       100.0
#> 37-49 ans  48.4      51.6       100.0
#> 50-59 ans  45.9      54.1       100.0
#> 60-68 ans  40.8      59.2       100.0
#> 69-94-ans  41.0      59.0       100.0
#> All        47.0      53.0       100.0
chisq.test(tabcont)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  tabcont
#> X-squared = 7.6622, df = 4, p-value = 0.1048

Dans le sous échantillon des 492 hommes, on n’observe pas de relation significative entre l’avis sur les USA et l’âge (Chi-2 = 7.6 pour 4 degré de liberté, p > 0.10)

7.6.2 Sous-échantillon des femmes

fem<-sel[sel$sex=="Femme",]
tabcont<-wtd.table(fem$age5,fem$opi_USA2)
#> Warning in wtd.table(fem$age5, fem$opi_USA2): no weights argument given, using
#> uniform weights of 1
round(addmargins(tabcont),0)
#>           Favorable Défavorable Sum
#> 18-36 ans        58          38  96
#> 37-49 ans        34          52  86
#> 50-59 ans        45          63 108
#> 60-68 ans        35          62  97
#> 69-94-ans        25          67  92
#> Sum             197         282 479
lprop(tabcont)
#>           Favorable Défavorable Total
#> 18-36 ans  60.4      39.6       100.0
#> 37-49 ans  39.5      60.5       100.0
#> 50-59 ans  41.7      58.3       100.0
#> 60-68 ans  36.1      63.9       100.0
#> 69-94-ans  27.2      72.8       100.0
#> All        41.1      58.9       100.0
chisq.test(tabcont)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  tabcont
#> X-squared = 23.273, df = 4, p-value = 0.0001117

Dans le sous échantillon des 479 femmes, on observe en revanche une relation très significative entre l’avis sur les USA et l’âge (Chi-2 = 23.3 pour 4 degré de liberté, p < 0.001)

7.6.3 Régression logistique

La suite logique des analyses bivariées de variables qualitatives est la régression logistique qui permet de modéliser une variable qualitative binaire (Y) par un ensemble dr’autres variables qualitatives ou quantitatives (X1, X2, X3, …). Par exemple, on peut se demander si le fait d’être favorable ou très favorable aux USA (Y) dépend simultanément du sexe (X1) et de l’âge (X2).

sel$opi_USA_fav<-sel$opi_USA2=="Favorable"
toto<-glm(sel$opi_USA_fav ~  sel$sex + sel$age5 , family = "binomial")
anova(toto,test = "Chisq")
#> Analysis of Deviance Table
#> 
#> Model: binomial, link: logit
#> 
#> Response: sel$opi_USA_fav
#> 
#> Terms added sequentially (first to last)
#> 
#> 
#>          Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
#> NULL                       970     1332.4              
#> sel$sex   1   3.3421       969     1329.1   0.06753 .  
#> sel$age5  4  27.4485       965     1301.7 1.613e-05 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(toto)
#> 
#> Call:
#> glm(formula = sel$opi_USA_fav ~ sel$sex + sel$age5, family = "binomial")
#> 
#> Coefficients:
#>                   Estimate Std. Error z value Pr(>|z|)    
#> (Intercept)         0.4517     0.1532   2.949  0.00319 ** 
#> sel$sexFemme       -0.2281     0.1317  -1.732  0.08328 .  
#> sel$age537-49 ans  -0.5771     0.2053  -2.811  0.00494 ** 
#> sel$age550-59 ans  -0.5853     0.2024  -2.892  0.00383 ** 
#> sel$age560-68 ans  -0.8097     0.2035  -3.978 6.94e-05 ***
#> sel$age569-94-ans  -0.9910     0.2070  -4.788 1.69e-06 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> (Dispersion parameter for binomial family taken to be 1)
#> 
#>     Null deviance: 1332.4  on 970  degrees of freedom
#> Residual deviance: 1301.6  on 965  degrees of freedom
#>   (25 observations deleted due to missingness)
#> AIC: 1313.6
#> 
#> Number of Fisher Scoring iterations: 4

Au bout du compte, l’effet principal demeure bien celui de l’âge. L’effet du sexe devient non significatif lorsque l’onb contrôle l’âge (p>0.05). Les femmes sont moins favorables aux USA mais cet effet s’explique en partie au moins par leur plus grande longévité.