Résumés progressifs des 11 séances pour l'unité libre (2007)
Analyses statistiques et informatique
Séance 1
Les statistiques descriptives servent à synthétiser les valeurs numériques censées réprésenter "la" réalité. Pour l'unité libre, on s'intéresse seulement aux variables QT (unités sommables) et aux QL (codes arbitraires). Les fichiers de données doivent présenter ces variables en colonnes homogènes. Les données doivent être suffisamment documentées via un fichier descriptif pour qu'on puisse comprendre que représentent les unités et les codes.
Séance 2
L'analyse d'une QL se nomme tri à plat. L'analyse de deux QL se nomme tri croisé. Dans ces analyses, on fournit les tableaux de comptage et de fréquences, les histogrammes associés et on rédige un texte pour rendre compte de chaque analyse. Les manipulations sont faites d'abord avec Excel puis avec le logiciel R.
Séance 3
Le logiciel R, gratuit et programmable, s'utilise en mode interactif ou "batch". R dispose de fonctions générales, des fonctions statistiques et de fonctions graphiques. Les programmes du fichier statgh.r permettent d'automatiser les calculs et de les afficher "à la française"... Nous avons vu les fonctions length, table, sum, rbinom, round ainsi que min, max, mean, cat, print. L'indexation se fait avec des crochets en une ou deux dimensions.
Séance 4
L'analyse d'une QT se fait au travers de résumés comme la moyenne, l'écart-type, le coefficient de variation, les quantiles... Pour deux variables QT, on étudie la dépendance linéaire exprimée via le coefficient de corrélation linéaire. Pour ces analyses, la représentation en tige feuille, en courbe des données triées puis en boite à moustaches permet de visualiser les données. La rédaction associée essaie de décrire la tendance centrale et la variation des valeurs autour de la moyenne. Les manipulations sont faites d'abord avec Excel puis avec le logiciel R. Il manque à Excel certains calculs et graphiques de bases pour les QT.
Séance 5
Il existe plusieurs variances (la variance de l'échantillon, la variance de la population) et plusieurs façons de calculer la variance (moyenne du carré des écarts à la moyenne, différence entre moyenne des carrés et carré de la moyenne). Le calcul et la programmation de ces différentes notions sous R et sous Excel avec des données d'ordre de grandeur très différents peut aboutir à des résultats faux, principalement sous Excel.
Séance 6
L'analyse de la dépendance entre deux variables quantitatives X et Y définies pour les mêmes individus se nomme régression. Comme on s'intéresse principalement au modèle linéaire qui est le plus simple, on calcule ρ (rho) qui caractérise cette liaison : ce coefficient de corrélation linéaire est compris entre -1 et 1. S'il est proche de 1 en valeur absolue, il y a bien liaison linéaire et le calcul de a et b (toujours possible) pour le modèle Y = aX + b prend alors tout son sens. Pour n variables QT, tous les rho sont regroupés dans la matrice de corrélation qui est en fait la matrice de tous les coefficients de corrélation linéaire. La définition mathématique de rho ne correspond pas forcément à "la" réalité car corrélation et causalité sont des notions différentes. De plus, la transitivité faible (variables externes corrélées aux variables présentes dans l'analyse) peut rendre difficile l'interprétation des résultats.
Séance 7
La maitrise des calculs et des graphiques en R passe par l'approfondissement de la notion de fonction, de paramètre, de liste et de filtrage. En R, les fonctions peuvent avoir des paramètres par défaut, comme par exemple read.table et plot. On accède aux noms des éléments de liste avec names(x) où est la variable concernée. C'est le cas avec les résultats de la fonction lm et anova. Pour produire des sous-ensembles de données, il suffit souvent de filtrer les lignes ou les colonnes de données par des filtres logiques.
Séance 8
Même pour des fonctions comme allQT il est possible d'automatiser encore les traitements afin de gagner du temps surl'essentiel : la réflexion et le commentaire. On essaiera de produire le plus vite possible les calculs QT univariés et bivariés pour vins.dbf, ronfleqt.dbf, chu825qt.dbf et logement.dbf : on reprendra ensuite les calculs QL en univarié et bivarié pour ronfleql.dbf puis pour les questions Q7 à Q12 de pbio. Les modèles classiques de pièce, d'urne, de loterie... correspondent à des lois classiques comme la loi de bernoulli, la loi binomiale, la loi de poisson. La théorie des probabilités offre un cadre théorique, des formules et des démonstrations pour ces lois qui modèlisent divers types de "hasard". Excel comme R connait la plupart de ces lois.
Séance 9
Pour comparer des proportions, des moyennes, le cadre général est celui des tests d'hypothèses. On commence par définir une hypothèse nulle, on calcule ensuite la statistique d'écart associée et l'on compare à une valeur maximale autorisée liée à un risque de première espèce ou on utilise une "p-value" ("probabilité critique") pour déterminer si on rejette ou non l'hypothèse nulle. Excel est très incomplet pour ce genre de test alors que R est très complet.
Manipulations Excel et expressions R à connaitre
Excel Fichier / Ouvrir (format Dbase) Fichier / Enregistrer sous (format Dbase) Edition / Copier [ valeur, formule, style... ] Edition / Coller Edition / Collage spécial | Transposé Affichage / Zoom Insertion / Fonction | statistiques Insertion / Caractères spéciaux Insertion / Graphiques | Nuage de points Ajouter une Courbe de tendance | Options -> Afficher l'équation... Edition / Supprimer [colonne] Edition / Supprimer [ligne] Format / Mise en Forme Automatique Format / Cellule | Nombre | Nombre de décimales Outils / Options | Général | Style de référence L1C1 Données / Trier Données / Filtrer | Filtre automatique Données / Rapport de tableau croisé dynamique | Disposition | Nombre de | Somme | Options [ afficher % du total ] Données / Convertir | Fichier délimité | espaces multiples Onglet : insérer, supprimer, déplacer, renommer =somme(C2:C100) =moyenne(C2:C100) =ecartypep(C2:C100) =ecartype(C2:C100) =mediane(C2:100) =centile( C2:100 ; 0.5) =coefficient.correlation(D2:D19;E2:E19) =coefficient.determination(D2:D19;E2:E19) =loi.normale.standard.inverse(1-Alpha/2) Utilisation du modèle ASGQT.XLT Logiciel R (refcard) quit x <- 1 x+2 print(x) cat(" valeur = ", x , "\n") y <- 0:10 y*y y**4 length(y) sum(y) mean(y) var(y) sd(y) cv <- function(x) { sd(x)/mean(x) } cv(y) help.start() rbinom(10,5,0.5) sim <- function(n) { rbinom(n,5,0.5) } sim(100) table( sim(500) ) summary( y ) fivenum( y ) str( y ) ls() source("k:/stat_ad/statgh.r") elfdata <- read.dbf("d:/elf.dbf")$dbf attach(elfdata) head(elfdata) tail(elfdata,n=5) str( elfdata ) ag <- AGE decritQT(" AGE ", ag, "ans ") decritQT(" AGE ", ag, "ans ", TRUE) decritQT(" AGE ", ag, "ans ", TRUE ," d:/elf_age.png") sx <- SEXE table(sx) table(sx)/sum(sx) round( table(sx)/sum(sx) ) decritQL(" SEXE ",sx, "homme femme") decritQL(" SEXE ",sx, "homme femme",TRUE) detach(elfdata) agehom <- ag[ sx==0 ] agehomjeune <- ag[ sx==0 & ag < 30 ] head(ag) head(ag,n=10) tail(ag) mean(ag) sort(ag) order(ag) stem(ag) plot(ag) plot(ag,main="Tracé de l'AGE (dossier ELF) ") plot(ag,pch=19,col="blue") boxplot(ag) boxplot(ag ~ sx) png("elf_sexe.png",width=800,height=600) coul <- c("blue","red") csex <- coul[1+sx] plot(1:length(ag),sort(ag),xlab="individu",ylab="age", col=csex,bg=csex,pch=21) text(-10,0.90,pos=4,"couleurs pour sx ") text(-05,0.85,pos=4,"homme=bleu femme=rouge") dev.off() nomficg <- paste("graph",i,".png",sep="") vinsdata <- read.dbf("d:/vins.dbf")$dbf attach(vinsdata) vinsdata <- vinsdata[ , -1 ] cbind( mean(vinsdata), sd(vinsdata) ) plot(RFA) par(new=TRUE) points(CANADA) cor(x,y) lm(y~x) anova( lm(y~x) ) summary(vins) cor( vins ) pairs( vins ) data() data(iris) demo("graphics") plot(ag) plot(ag,type="p") plot(ag,type="p",pch=19) plot(sort(ag),type="p",col="blue",pch=19,bg="orange", main="Age (dossier ELF)",ylim=c(0,100)) source("~/Bin/statgh.r") elf <- read.dar("elf.dar") attach(elf) sx <- SEXE ag <- AGE sy <- sx sy[sx==0] <- "H" sy[sx==1] <- "F" co <- sy co[sx==0] <- "blue" co[sx==1] <- "red" idr <- order(ag) plot(1:99,ag[idr],pch=sy[idr],col=co) plot(1:99,ag[idr],type="p",col="blue",pch=19, bg="orange", main="Age (dossier ELF)",ylim=c(0,100)) plot(1:99,ag[idr],type="p",col="blue",pch=sy, bg="orange", main="Age (dossier ELF)",ylim=c(0,100)) par(mfrow=c(2,1)) plot(...) numéro 1 plot(...) numéro 2 par(mfrow=c(1,1)) plot(...) par(mfrow=c(2,2)) plot(...) numéro 1 plot(...) numéro 2 plot(...) numéro 3 plot(...) numéro 4 boxplot(ag,col="yellow",main="Boite à moustaches d'AGE pour ELF") ma <- mean(ag) sa <- sd(ag) abline(h=median(ag),col="green",lwd=2) abline(h=ma,col="red",lwd=2) abline(h=ma-sa,col="blue",lwd=1.5) abline(h=ma+sa,col="blue",lwd=1.5) bam <- function(x,titre) { boxplot(x,main=titre,col="yellow") mx <- mean(x) ex <- sd(x) abline(h=median(x),col="green",lwd=2) abline(h=mx,col="red",lwd=2) abline(h=mx-ex,col="blue",lwd=1) abline(h=mx+ex,col="blue",lwd=1) } # fin de fonction bam(ag,titre="Boite à moustaches d'AGEpour ELF") agh <- ag[sy=="H"] bam(agh,titre="Boite à moustaches d'AGE Homme pour ELF") agf <- ag[sy=="F"] bam(agf,titre="Boite à moustaches d'AGE Femme pour ELF") boxplot(ag~sx,main="Hommes/Femmes pour AGE dans ELF",col="yellow") rect(0,0,3,100,col=rgb(red=180/256,green=210/256,blue=190/256)) par(new=TRUE) boxplot(ag~sx,main="Hommes/Femmes pour AGE dans ELF", col="yellow",xaxt="n") axis(1,at=c(1,2),labels=c("Homme","Femme")) box() par(mfrow=c(2,1)) vins <- read.dbf("vins.dbf")$dbf head(vins) attach(vins) vins <- vins[,-1] boxplot(vins,col="yellow") boxplot(vins,col="yellow",ylim=c(0,30000)) par(mfrow=c(1,1)) hist(sx) hist(sx,freq=TRUE) hist(sx,freq=TRUE,col="blue") hist(sx,freq=TRUE,col="blue",xaxt="n",ylim=c(0,100)) axis(1,at=c(0.05,0.95),labels=c("Homme","Femme")) box() barplot(table(sx),ylim=c(0,100),col="blue") barplot(100*table(sx)/length(sx),ylim=c(0,100),col="blue") traceQL("SEXE, dossier ELF",sx,"Homme Femme") uk <- UK rf <- RFA rl <- lm(uk~rf) # régression linéaire cm <- anova(rl) # comparaison de moyennes names(rl) names(cm) ir <- order(rf) plot(rf[ir],uk[ir],pch=19,col="blue") abline(rl,col="red",lwd=2) plot(resid(rl)) abline(h=0,col="green",lwd=2) cor(rf,uk) rfo <- rf[ir] uko <- uk[ir] nld <- length(rfo)-2 rfo <- rfo[1:nld] uko <- uko[1:nld] rlo <- lm(uko~rfo) plot(rfo,uko,pch=19,col="blue") abline(rlo,col="red",lwd=2) res <- rl$residuals plot(res,pch=15,col="black") plot(res,pch=15,col="black") plot(uk,vaj,pch=15,col="black") abline(0,1,col="red",lwd=2) plot(rl) detach(elf) options(width=450) ronf <- read.dar("ronfle.dar") attach(ronf) head(ronf) ageronf <- AGE length(agelf) length(ageronf) ages <- c(agelf,ageronf) rep(1,10) dos <- c( rep(1,length(agelf)),rep(2,length(ageronf)) ) rect(0,0,3,100,col=rgb(red=180/256,green=210/256,blue=190/256)) par(new=TRUE) boxplot(age~dos,col="yellow",xaxt="n",main="Age ELF vs RONFLE") axis(1,at=c(1,2),labels=c("ELF","RONFLE")) lines(c(0.6,1.4),rep(mean(agelf),2),col="red",lwd=2) lines(c(0.6,1.4),rep(median(agelf),2),col="blue",lwd=2) lines(c(1.6,2.4),rep(mean(ageronf),2),col="red",lwd=2) lines(c(1.6,2.4),rep(median(ageronf),2),col="blue",lwd=2) cbind( length(agelf),mean(agelf),sd(agelf) ) cbind( length(ageronf),mean(ageronf),sd(ageronf) ) compMoyData("AGE Elf vs Ronfle",agelf,ageronf) rbind( cbind( length(agelf),mean(agelf),sd(ageronf) ), cbind( length(ageronf),mean(ageronf),sd(ageronf) ) ) -> mdr colnames(mdr) <- c("Taille","Moyenne","Ecart-type") row.names(mdr) <- c("Elf","Ronfle") mdr tapply(ag,sx,mean) elf <- read.dar("elf.dar") attach(elf) sx <- SEXE ag <- AGE sx <- as.factor(sx) levels(sx) <- c("homme","femme") boxplot(ag~sx) barplot(table(sx)) vins <- read.dbf("vins.dbf")$dbf vins <- vins[,-1] nomcol <- colnames(vins) unites <- rep("hl",length(nomcol)) allQT(vins,nomcol,unites) allqtdbf <- function(nomdbf,unites="???") { nomficdbf <- paste(nomdbf,".dbf",sep="") data <- read.dbf(nomficdbf)$dbf data <- data[,-1] nomcol <- colnames(data) if (length(unites)==1) { unites <- rep(unites,length(nomcol)) } # fin de si allQT(data,nomcol,unites) } # fin fonction allqtdbf unites <- rep("hl",8) allqtdbf("vins",unites) allqtdbf("vins","hl") allqtdbf("vins") allqtdbf("chu825qt") allqtdbf("chu825qt",chaineEnListe("G/l UI/l mmo/l mug/l % mg/dl an")) ronfle <- read.dbf("ronfleql.dbf")$dbf ronfcol <- 2:4 ronfqlm <- matrix(nrow=3,ncol=3) ronfqlm[1,1] <- "SEXE" ronfqlm[1,2] <- c(" Sexe de la personne ?") ronfqlm[1,3] <- lstMod(c("homme","femme")) ronfqlm[2,1] <- "RONFLE" ronfqlm[2,2] <- c(" Ronfleur ou pas ?") ronfqlm[2,3] <- lstMod(c("non","oui")) ronfqlm[3,1] <- "TABAC" ronfqlm[3,2] <- c(" Fumeur ou pas ?") ronfqlm[3,3] <- lstMod(c("oui","non")) print(ronfqlm) allQL(ronfle,ronfqlm,ronfcol) ronfqlm[1,3] <- lstMod("homme femme") allQL(ronfle,ronfqlm,ronfcol) rbinom(100,5,0.2) dbinom(1,5,0.2) dbinom(0:5,5,0.2) qbinom(0.5,5,0.2) si <- rbinom(100,5,0.5) table(si) barlplot( table(si) ) xi <- 0:5 ni <- table(si) pi <- ni/sum(ni) sum(pi*xi) sum(pi*xi**2) sqrt(sum(pi*xi**2)-sum(xi*pi)**2) t.test(x,y) compMoyData(" age H vs F ",ageh,agef) prop.test(c(ia,ib),c(na,nb)) compPourc(" Prop Hom/Fem ",10,80,30,70) rnorm(30) qnorm(0.975) qnorm(1-alpha/2) # fonctions sur chaines de caractères # avec le logiciel R modc <- unlist(strsplit(tabmoda,"!")) debutit <- substr(titrelong,1,10) sprintf("%-10s",intit) formatC(odl[nnt,1],format="d",width=3,dig=0) paste(formatC(valc,format="f",width=3,dig=0)," %") paste(paste(chMod,"!"),collapse="") paste("Voici les 10 premières lignes de données (il y en a ",nbl," en tout)",sep="") longueurChaine <- nchar( laChaine ) substr(x, start, stop) substring(text, first, last = 1000000) substr(x, start, stop) <- value substring(text, first, last = 1000000) <- value strtrim(x, width) deparse(args(lm)) strwidth(s, units = "user", cex = NULL) strheight(s, units = "user", cex = NULL) all.lett <- c(letters, LETTERS) chartr(old, new, x) tolower(x) toupper(x) casefold(x, upper = FALSE) # inclassables ? options(width=180) library(foreign) lbw <- read.dbf("lbw.dbf") # attention, homonyme de read.dbf ! sink("lbw.sor") lbw sink() library(gdata) dataCNV <- read.xls("s29.xls")
Retour à la page principale de (gH)