Traiter les résultats d'une enquête par R

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Vincent BONNAL
Messages : 12
Enregistré le : 17 Déc 2004, 10:07
Contact :

Traiter les résultats d'une enquête par R

Messagepar Vincent BONNAL » 03 Avr 2007, 14:07

Bonjour,

Toujours dans la série des questions simples, en voici un petit groupe qui est digne de questions de cas d’école qui pourraientt être transposées à une enquête agro de terrain :

Dans le cadre du Plan de Déplacement Entreprise (PDE) Agropolis, j’aimerai tenter de traiter par R (histoire de m’entraîner et de mettre cet outil en avant) les résultats de l’enquête en ligne menée ces derniers jours

J’ai mis en ligne un extrait des résultats : http://ecotrop.cirad.fr/temp/test.csv (12 questions et 50 enregistrements)

Chaque colonne est une question, chaque ligne l’ensemble des réponses d’un internaute.
La dernière colonne (fin) est primordiale car elle m’indique que l’internaute est allé jusqu’à la fin du questionnaire (dans ce cas, fin=1).
Je ne veux pas virer tous les fin=0 car des internautes peuvent avoir rempli partiellement leurs questionnaires, je traiterai un jour ces résultats là de façon particulière plus tard.

Sachant que je débute sous R, j’aimerai bien qu’on me guide un peu par rapport à ce que je veux sortir de cette enquête.

Voici mon script pour récupérer les données du fichier, pour le reste, je galère sérieusement…

Code : Tout sélectionner

don<-read.table("http://ecotrop.cirad.fr/temp/test.csv",header=TRUE,sep=";",quote="",dec=",")
don
# nb de réponse
length(don[,1])
# nb de réponse complete
length(don[,1][don["fin"]==1])
# nb de réponse incomplete
length(don[,1][don["fin"]==0])

# lister les X1_1 (en virant les NA et les fin==0)
x1_1<-as.matrix(na.omit(don["X1_1"][don["fin"]==1]))
x1_1
# Comment grouper par classe de réponse à X1_1???


Voici mes questions typiques, j’arriverai rapidement à traiter toutes les questions (y’en a plus de 50) sur cette base:

Pour X1_1, quel est le pourcentage de réponse par classe (de 1 à 6) pour ceux qui sont allés jusqu’à la fin du questionnaire (fin==1) en ignorant les NA
Par exemple : X1_1=1 sont 10%, X1_1=2 sont 30%, X1_1=3 sont 27%, …

Pour X1_3, quel est le taux de réponse avec la valeur 1, avec la valeur 2 pour ceux qui sont allés jusqu’à la fin du questionnaire (fin==1)
Par exemple : X1_3=1 sont 65%, X1_3=2 sont 30% et X1_3=NA sont 5%


Pour toutes les tranches de X10_1, quel est le pourcentage de réponse par tranche de X2_1 (pour ceux qui sont allés jusqu’à la fin du questionnaire (fin==1) )
Par exemple :
Pour X10_1=4, x% ont X2_1=4, y% ont X2_1=5, z% ont X2_1=6,…
Pour X10_1=5, t% ont X2_1=4, u% ont X2_1=5, v% ont X2_1=6,…

Pour X10_1=NA, a% ont X2_1=4, b% ont X2_1=5, c% ont X2_1=6,…


Je sais que j’abuse un peu de poser ce genre de question, mais je suis sûr que c’est relativement simple pour certains d’entre vous alors que ça me parait être une montagne pour moi… en tout cas, je m’use sur ces détails…. :cry:
Vincent BONNAL
CIRAD Bios - UPR 59 Ecotrop

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 03 Avr 2007, 16:28

Bonjour,

Je te propose le code suivant :

Code : Tout sélectionner

apply(don[don$fin!=0,],2,function(x) table(x)/sum(!is.na(x))*100)
# et ça te donne ça :
$X1_1
x
        1         2         3         4         5
 4.761905  4.761905  2.380952 14.285714 73.809524

$X1_1_1
x
       1        3
85.71429 14.28571

$X1_2
x
   1    2    4
27.5 55.0 17.5

$X1_2_1
x
   1    2    3
47.5  2.5 50.0

$t_1_2_2_r01h
x
       7        8        9
45.45455 36.36364 18.18182

$t_1_2_2_r01m
x
       0       30       40       50
45.45455 18.18182 18.18182 18.18182

$t_1_2_2_r02h
x
      16       17       18       19
 9.09091 45.45455 27.27273 18.18182

$t_1_2_2_r02m
x
    0     1     2    10    20    30    40
25.00 12.50 18.75 12.50 12.50 12.50  6.25

$X1_3
x
       1        2
55.55556 44.44444

$X2_1
x
        3         4         5         7         8
 2.439024  2.439024 12.195122 80.487805  2.439024

$X10_1
x
       2        3        4        5
14.28571 38.09524 35.71429 11.90476

$fin
x
  1
100


Voila j'espère avoir aider un peu.

Maxime

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 03 Avr 2007, 18:30

Re,

Tu peux aussi utiliser ça :

Code : Tout sélectionner

co <- combn(ncol(don)-1,2) # toutes les combinaisons de variables 2 à 2
res <- list()
for (i in 1:ncol(co)){
auxi <- table(don[don$fin!=0,co[,i]])
class(auxi) <- "matrix"
auxi <- auxi[apply(auxi,1,function(x) any(x>0)),,drop=FALSE]
res[[i]] <- t(apply(auxi,1,function(t) t/sum(t)*100))
res[[i]] <- cbind(res[[i]],apply(auxi,1,sum))
colnames(res[[i]])[ncol(res[[i]])] <- "effectif"
}
names(res) <- apply(co,2,function(x) paste(colnames(don)[x[1]]," - ",colnames(don)[x[2]],sep=""))

Avec ça tu vas récupérer dans une liste les proportions de réponses de la variable 2 pour chaque variable 1 :

Code : Tout sélectionner

res[1]
$`X1_1 - X1_1_1`
          1        3 effectif
3 100.00000  0.00000        1
4  83.33333 16.66667        6

donc tu as 100% des gens qui ont répondus 3 à X1_1 qui ont répondus 1 à la question X1_1_1, tu as 83.3% des personnes qui ont répondus 1 et 16,6% des personnes qui ont répondus 3 à la variable X1_1_1 et qui avaient répondus 4 à la variable X1_1. Donc j'ai 83.3% des gens qui ont répondus 1 à X1_1_1 sachant que les gens avaient répondus 3 à X1_1.

En espérant t'avoir aidé un peu.

Maxime

Vincent BONNAL
Messages : 12
Enregistré le : 17 Déc 2004, 10:07
Contact :

Messagepar Vincent BONNAL » 04 Avr 2007, 07:09

Ok, merci, je regarde et j'essaye de comprendre ton code.

Je vous tiendrai au courant.

Vincent.
Vincent BONNAL

CIRAD Bios - UPR 59 Ecotrop

Eric Pagot
Messages : 195
Enregistré le : 15 Fév 2007, 17:10

Messagepar Eric Pagot » 04 Avr 2007, 07:16

A mon avis, la fenêtre de Rcmdr est plus conviviale. Il suffit d'importer les données et de faire les tableaux croisés correspondants. (ici fin et la variable choisie).
Vétérinaire CTPA

Vincent BONNAL
Messages : 12
Enregistré le : 17 Déc 2004, 10:07
Contact :

Messagepar Vincent BONNAL » 04 Avr 2007, 10:10

Logez Maxime a écrit :Bonjour,
Je te propose le code suivant :

Code : Tout sélectionner

apply(don[don$fin!=0,],2,function(x) table(x)/sum(!is.na(x))*100)
# et ça te donne ça :
$X1_1

Maxime

J'ai comme qui dirait, un petit problème avec ton $

Je suis un vrai (de ce qu'il y a de plus vrai) débutant et je ne percute pas comment utiliser ton code...
si je tape

Code : Tout sélectionner

apply(don[don$fin!=0,],2,function(x) table(x)/sum(!is.na(x))*100)
$X1_1

j'ai un joli "Erreur : erreur de syntaxe dans "$""
heu.. tu peux m'expliquer l'usage de ton code... (je sens que je me transforme en boulet....)
Vincent BONNAL

CIRAD Bios - UPR 59 Ecotrop

Nicolas Péru
Messages : 1408
Enregistré le : 07 Aoû 2006, 08:13

Messagepar Nicolas Péru » 04 Avr 2007, 10:34

il faut juste mettre ça :

Code : Tout sélectionner

apply(don[don$fin!=0,],2,function(x) table(x)/sum(!is.na(x))*100)


car le $X1_1 donné dans le code de Maxime c'est déjà le début de la sortie par R. :)

le symbole '$' sert à désigner un sous élément d'un objet. Par exemple dans un tableau nommé tab qui aurait pour première colonne 'col1'
si tu tapes :

tab$col1


cela appellera toutes les valeurs de la colonne col1 de tab.

En espérant avoir été clair, bon courage pour tes débuts sous R ;)

Vincent BONNAL
Messages : 12
Enregistré le : 17 Déc 2004, 10:07
Contact :

Messagepar Vincent BONNAL » 04 Avr 2007, 11:50

sic.... j'ai compris... en fait, mon égarement a commencé parce que j'ai repris le code de Maxime, mais directement avec les résultats complèts de l'enquête, soit 120 colonnes (donc 120 résultats de question) par 1819 réponse d'internaute....

L'affichage du résultat de ce code dans R se faisant de façon tronqué dans l'interface de R (on ne récupère que les X dernières lignes) et je récupérais sur l'interface que les résultats traités de la dernière question... la dernière question étant des numéros de téléphones, on a des tuples tous différents, ce qui me faisait un affichage très bizare...

Bon, je retourne à l'exploitation même des résultats (et je vais plus sereinement regarder le second code de Maxime ;-) )

NB: j'ai chargé et tenté d'utiliser Rcmdr, et même s'il on est bien assisté sur la création de la matrice des données, c'est à mon avis assez compliqué pour un débutant comme moi... (d'autant que je ne maîtrise pas trop les techniques et terminologies statistiques): par exemple, ok pour une analyse croisée... mais comment ça se fait sous Rcmdr...
Vincent BONNAL

CIRAD Bios - UPR 59 Ecotrop

Eric Pagot
Messages : 195
Enregistré le : 15 Fév 2007, 17:10

Messagepar Eric Pagot » 04 Avr 2007, 12:19

Solution avec Rcommander :
- Importer les données (fichier xls, le plus simple)
- Gérer les variables dans le jeu de données
convertir les variables numériques en facteurs (écrit en anglais)
- Statistiques
Table de contingence
Choisir les variables intéressantes (fin et X...)
Cocher pourcentage de colonnes
Les pourcentages sont calculés ainsi que le chi-deux

NB : j'ai remanié tous ces menus pour avoir des choix multiples...
Vétérinaire CTPA

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 04 Avr 2007, 16:16

Bonjour,

Désolé de ne pas avoir pu répondre plus tôt à ta question. Le apply du promier post te permet de récupérer le pourcentage de chaque modalité de chaque réponse. Le résultat est généré sous forme de liste car toutes tes questions n'ont pas le même nombre de réponses donc si tu veux savoir comment les gens ont répondus à la question X1_2 il te suffit de faire comme suit :

Code : Tout sélectionner

reponse <- apply(don[don$fin!=0,],2,function(x) table(x)/sum(!is.na(x))*100)
reponse$X1_2
x
   1    2    3
47.5  2.5 50.0
Pareil pour les autres questions. don[don$fin!=0,] permet de travailler que sur le tableau ou les gens sont allés au bout du questionnaire. Le fonction(x) table(x)/sum(!is.na(x))*100) permet pour chaque colonne d'avoir le nombre de fois ou les gens ont répondus 1,2 ou je ne sais quoi à la question, diviser par le nombre de réponse qui est donnée par le sum(!is.na(x)) ou on compte le nombre de valeurs qui sont différentes de NA et *100 pour revenir a des pourcentages. Tu peux voir que la somme pour chaque question fait bien 100. Le deuxième post te permet de récupérer le pourcentage de gens qui ont répondus 1,2, ... à la question 2, sachant qu'ils avaient répondus X à la quesion 1.

En espérant t'avoir éclairé un peu plus.

Maxime

Vincent BONNAL
Messages : 12
Enregistré le : 17 Déc 2004, 10:07
Contact :

Messagepar Vincent BONNAL » 05 Avr 2007, 06:23

Eclairé, c'est peu dire... ;-)
J'ai bien compris ta première méthode. La seconde est déjà plus avancée dans l'algorythme... c'est (beaucoup) plus difficile pour un gars avec mon niveau sous R.

Bon, question subsidiaire: dans le cas où je souhaiterai filtrer un peu plus les réponses (tout comme tu fais pour don$fin!=0), comment appliquer cette fonction sur:
1- fin=1 (je précise donc don$fin==1 ou don$fin!=0 : ça c'est aquis),
2- X2_1=7 (par exemple)
... et ceci en même temps?

Dois-je écrire quelque chose du style

Code : Tout sélectionner

apply(don[don$fin!=0 & don$X2_1==7,] ,2,...


Question subsidiare n°2
Pour ton second code, comment sortir le contenu de res[i] dans un fichier texte (ou un tableur comme Excel):

Code : Tout sélectionner

for (i in 1:length(res))
  {
  write(res[[i]],file=paste("Resultats_",as.character(i),".txt"),sep="")
  }

ça, ça me fait bien les fichiers, mais ils sont vides (en plus, je préfèrerais avoir tout ça dans un seul fichier....)

Code : Tout sélectionner

for (i in 1:length(res))
  {
  write(res[[i]],"Res.txt",ncolumns=length(res[[i]]), append = TRUE,sep="\t")
  }

et ça, ça ne marche pas (je suppose que c'est à cause du format de res qui n'est pas une matrice...

Dans tous les cas, merci à vous deux, vos idées et codes m'ont bien aidé.
Vincent BONNAL

CIRAD Bios - UPR 59 Ecotrop

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 05 Avr 2007, 17:00

Re,

Tu peux tout exporter dans un fichier texte que tu pourras ouvrir dans excel ensuite avec ce script (ya pas mal de trucs qui ne servent qu'a la mise en forme dans le ficher texte) :

Code : Tout sélectionner

for (i in 1:length(res)){
  if (i<2){
    sink("resultat.txt",append=FALSE)
    cat(names(res)[i],"\n")
    }
  else {
    sink("resultat.txt",append=TRUE)
    cat("\n","\n",names(res)[i],"\n")
    }
  cat("\t")
  sink()
  write.table(res[[i]],file="resultat.txt",append=TRUE,sep="\t",col.names=TRUE,row.names=TRUE)
  }


Maxime


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité