diff --git a/APP/Rstudio.lnk b/APP/Rstudio.lnk new file mode 100644 index 0000000..fa8877e Binary files /dev/null and b/APP/Rstudio.lnk differ diff --git a/Visual Studio Code.lnk b/APP/Visual Studio Code.lnk similarity index 100% rename from Visual Studio Code.lnk rename to APP/Visual Studio Code.lnk diff --git a/INSA/AnaDonn b/INSA/AnaDonn new file mode 160000 index 0000000..223c582 --- /dev/null +++ b/INSA/AnaDonn @@ -0,0 +1 @@ +Subproject commit 223c58299348a8c76c78502cc7c098fe214946a3 diff --git a/INSA/TP anadon/.RData b/INSA/TP anadon/.RData new file mode 100644 index 0000000..1f60d9a Binary files /dev/null and b/INSA/TP anadon/.RData differ diff --git a/INSA/TP anadon/.Rhistory b/INSA/TP anadon/.Rhistory new file mode 100644 index 0000000..d91b83a --- /dev/null +++ b/INSA/TP anadon/.Rhistory @@ -0,0 +1,171 @@ +setwd("C:/Users/PC/Desktop/INSA/anadonn") +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=FALSE, +eval=FALSE, +cache=FALSE, +prompt=FALSE, +tidy=TRUE, +comment=NA, +message=FALSE, +warning=FALSE, +class.source="badCode") +opts_knit$set(width=75) +donnees <- read.table("DataProjet3MIC-2425.txt",header=TRUE, sep=";") +str(donnees) +summary(donnees) +ggplot(data = donnees)+ +geom_point(aes(x=ExpT1,y=T1_1H_R1)) +library(corrplot) +library(ggplot2) +library(gridExtra) +library(forcats) +library(reshape2) +library(BioStatR) +library(FactoMineR) +library(factoextra) +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=FALSE, +eval=FALSE, +cache=FALSE, +prompt=FALSE, +tidy=TRUE, +comment=NA, +message=FALSE, +warning=FALSE, +class.source="badCode") +opts_knit$set(width=75) +donnees <- read.table("DataProjet3MIC-2425.txt",header=TRUE, sep=";") +head(donnees,200) +str(donnees) +summary(donnees) +ggplot(data = donnees)+ +geom_point(aes(x=ExpT1,y=T1_1H_R1)) +apply(donnees[,1:36],2,var) +apply(donnees[,1:36],2,mean) +hist(donnees$T1_1H_R1) +ggplot(donnees,aes(x=T1_1H_R1))+geom_boxplot() +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=TRUE, +cache=FALSE, +prompt=FALSE, +tidy=TRUE, +comment=NA, +message=FALSE, +warning=FALSE, +class.source="badCode") +opts_knit$set(width=75) +library(corrplot) +library(ggplot2) +library(gridExtra) +library(forcats) +library(reshape2) +library(BioStatR) +dim(wine) +nrow(wine) +ncol(wine) +head(wine) +wine <- read.table("wine.txt",header=TRUE) +head(wine) +dim(wine) +nrow(wine) +ncol(wine) +is.data.frame(wine) +names(wine) +colnames(wine) +str(wine) +wine$Qualite<-as.factor(wine$Qualite) +wine$Type<-factor(wine$Type,labels=c("blanc","rouge")) +head(wine) +summary(wine) +gEx <- ggplot(data=wine) +summary(gEx) +names(gEx) +gEx$layers +ggplot(data=wine,aes(x=Densite,y=Alcool))+ +geom_point() +ggplot(data=wine)+ +geom_point(aes(x=Densite,y=Alcool,color=Type)) +ggplot(data=wine)+ +geom_point(aes(x=Densite,y=Alcool),color="blue") +# A COMPLETER +summary(wine$Type) +levels(wine$Type +) +table(wine$Type) +g1<-ggplot(wine, aes(x=Type))+ +geom_bar()+ +ylab("")+ggtitle("Effectifs") +g2<-ggplot(wine, aes(x = Type)) + +geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences") +df <- data.frame(group = levels(wine$Type), +value = as.vector(table(wine$Type))/nrow(wine)) +g3<-ggplot(df, aes(x="", y=value, fill=group))+ +geom_bar(width = 1, stat = "identity")+ +coord_polar("y", start=0)+ +theme(legend.position="bottom") +grid.arrange(g3,g1,g2,ncol=3) +wine$Qualite <- fct_relevel(wine$Qualite,"bad","medium","good") +EffQual=as.vector(table(wine$Qualite)) +FreqQual= data.frame(Eff = EffQual, Freq = EffQual/length(wine$Qualite), FreqCumul=cumsum(EffQual)/length(wine$Qualite)) +rownames(FreqQual)=levels(wine$Qualite) +knitr::kable(FreqQual, caption = 'Description de la variable Qualite',booktabs = TRUE,digits=3) +df <- data.frame(Qualite = levels(wine$Qualite), value = table(wine$Qualite), +valuecumul = 100 * cumsum(prop.table(table(wine$Qualite)))) +df$Qualite <- fct_relevel(df$Qualite, "bad", "medium", "good") +df <- data.frame(df, freq = df$value.Freq/nrow(wine)) +g1 <- ggplot(wine) + geom_bar(aes(x = Qualite)) + ggtitle("Effectifs")+xlab("Qualite") +g2 <- ggplot(wine) + geom_bar(aes(x = Qualite, y = ..prop.., group = 1)) + ggtitle("Frequences")+xlab("Qualite") +g3 <- ggplot(df, aes(x = Qualite, y = valuecumul)) + geom_bar(stat = "identity") + +ggtitle("Fréquences cumulées") +g4 <- ggplot(df, aes(x = "", y = freq, fill = Qualite)) + geom_bar(width = 1, stat = "identity") + +coord_polar("y", start = 0) +grid.arrange(g1, g2, g3, g4, ncol = 2) +mean(wine$Alcool) +median(wine$Alcool) +var(wine$Alcool) +sd(wine$Alcool) +range(wine$Alcool) +summary(wine$Alcool) +quantile(wine$Alcool,0.75,names=FALSE)-quantile(wine$Alcool,0.25,names = FALSE) +quantile(wine$Alcool) +H<-hist(wine$Alcool) +ggplot(wine,aes(y=Alcool))+geom_boxplot() +wineaux<-melt(wine[,-c(1,2)]) +ggplot(wineaux,aes(x=variable,y=value))+ +geom_boxplot() +B<-boxplot(wine$Alcool) +print('Correlation') +cor(wine[,-c(1,2)]) +print('Covariance') +cov(wine[,-c(1,2)]) +help(corrplot) +corrplot(cor(wine[,-c(1,2)]),method = "ellipse") +ggplot(data=wine)+ +geom_point(aes(x=Alcool,y=Densite))+ +geom_smooth(aes(x=Alcool,y=Densite),method="lm") +donneesaux<-melt(donnees[,-(37:39)]) +ggplot(donneesaux,aes(x=variable,y=value))+ +geom_boxplot() +donneesaux<-melt(donnees[,(1:18)]) +ggplot(donneesaux,aes(x=variable,y=value))+ +geom_boxplot() +don_R1<-melt(donnees[,(1:18)]) +gR1=ggplot(don_R1,aes(x=variable,y=value))+ +geom_boxplot() +don_R2<-melt(donnees[,(19:36)]) +gR2=ggplot(don_R2,aes(x=variable,y=value))+ +geom_boxplot() +grid.arrange(gR1, gR2, ncol = 2) +don_R1<-melt(donnees[,(1:18)]) +gR1=ggplot(don_R1,aes(x=variable,y=value))+ +geom_boxplot() +don_R2<-melt(donnees[,(19:36)]) +gR2=ggplot(don_R2,aes(x=variable,y=value))+ +geom_boxplot() +grid.arrange(gR1, gR2, nrow = 2) diff --git a/INSA/TP anadon/Ozone.txt b/INSA/TP anadon/Ozone.txt new file mode 100644 index 0000000..0be6e3d --- /dev/null +++ b/INSA/TP anadon/Ozone.txt @@ -0,0 +1,113 @@ +"maxO3" "T9" "T12" "T15" "Ne9" "Ne12" "Ne15" "Vx9" "Vx12" "Vx15" "maxO3v" "vent" "pluie" +"20010601" 87 15.6 18.5 18.4 4 4 8 0.6946 -1.7101 -0.6946 84 "Nord" "Sec" +"20010602" 82 17 18.4 17.7 5 5 7 -4.3301 -4 -3 87 "Nord" "Sec" +"20010603" 92 15.3 17.6 19.5 2 5 4 2.9544 1.8794 0.5209 82 "Est" "Sec" +"20010604" 114 16.2 19.7 22.5 1 1 0 0.9848 0.3473 -0.1736 92 "Nord" "Sec" +"20010605" 94 17.4 20.5 20.4 8 8 7 -0.5 -2.9544 -4.3301 114 "Ouest" "Sec" +"20010606" 80 17.7 19.8 18.3 6 6 7 -5.6382 -5 -6 94 "Ouest" "Pluie" +"20010607" 79 16.8 15.6 14.9 7 8 8 -4.3301 -1.8794 -3.7588 80 "Ouest" "Sec" +"20010610" 79 14.9 17.5 18.9 5 5 4 0 -1.0419 -1.3892 99 "Nord" "Sec" +"20010611" 101 16.1 19.6 21.4 2 4 4 -0.766 -1.0261 -2.2981 79 "Nord" "Sec" +"20010612" 106 18.3 21.9 22.9 5 6 8 1.2856 -2.2981 -3.9392 101 "Ouest" "Sec" +"20010613" 101 17.3 19.3 20.2 7 7 3 -1.5 -1.5 -0.8682 106 "Nord" "Sec" +"20010614" 90 17.6 20.3 17.4 7 6 8 0.6946 -1.0419 -0.6946 101 "Sud" "Sec" +"20010615" 72 18.3 19.6 19.4 7 5 6 -0.8682 -2.7362 -6.8944 90 "Sud" "Sec" +"20010616" 70 17.1 18.2 18 7 7 7 -4.3301 -7.8785 -5.1962 72 "Ouest" "Pluie" +"20010617" 83 15.4 17.4 16.6 8 7 7 -4.3301 -2.0521 -3 70 "Nord" "Sec" +"20010618" 88 15.9 19.1 21.5 6 5 4 0.5209 -2.9544 -1.0261 83 "Ouest" "Sec" +"20010620" 145 21 24.6 26.9 0 1 1 -0.342 -1.5321 -0.684 121 "Ouest" "Sec" +"20010621" 81 16.2 22.4 23.4 8 3 1 0 0.3473 -2.5712 145 "Nord" "Sec" +"20010622" 121 19.7 24.2 26.9 2 1 0 1.5321 1.7321 2 81 "Est" "Sec" +"20010623" 146 23.6 28.6 28.4 1 1 2 1 -1.9284 -1.2155 121 "Sud" "Sec" +"20010624" 121 20.4 25.2 27.7 1 0 0 0 -0.5209 1.0261 146 "Nord" "Sec" +"20010625" 146 27 32.7 33.7 0 0 0 2.9544 6.5778 4.3301 121 "Est" "Sec" +"20010626" 108 24 23.5 25.1 4 4 0 -2.5712 -3.8567 -4.6985 146 "Sud" "Sec" +"20010627" 83 19.7 22.9 24.8 7 6 6 -2.5981 -3.9392 -4.924 108 "Ouest" "Sec" +"20010628" 57 20.1 22.4 22.8 7 6 7 -5.6382 -3.8302 -4.5963 83 "Ouest" "Pluie" +"20010629" 81 19.6 25.1 27.2 3 4 4 -1.9284 -2.5712 -4.3301 57 "Sud" "Sec" +"20010630" 67 19.5 23.4 23.7 5 5 4 -1.5321 -3.0642 -0.8682 81 "Ouest" "Sec" +"20010701" 70 18.8 22.7 24.9 5 2 1 0.684 0 1.3681 67 "Nord" "Sec" +"20010702" 106 24.1 28.4 30.1 0 0 1 2.8191 3.9392 3.4641 70 "Est" "Sec" +"20010703" 139 26.6 30.1 31.9 0 1 4 1.8794 2 1.3681 106 "Sud" "Sec" +"20010704" 79 19.5 18.8 17.8 8 8 8 0.6946 -0.866 -1.0261 139 "Ouest" "Sec" +"20010705" 93 16.8 18.2 22 8 8 6 0 0 1.2856 79 "Sud" "Pluie" +"20010706" 97 20.8 23.7 25 2 3 4 0 1.7101 -2.7362 93 "Nord" "Sec" +"20010707" 113 17.5 18.2 22.7 8 8 5 -3.7588 -3.9392 -4.6985 97 "Ouest" "Pluie" +"20010708" 72 18.1 21.2 23.9 7 6 4 -2.5981 -3.9392 -3.7588 113 "Ouest" "Pluie" +"20010709" 88 19.2 22 25.2 4 7 4 -1.9696 -3.0642 -4 72 "Ouest" "Sec" +"20010710" 77 19.4 20.7 22.5 7 8 7 -6.5778 -5.6382 -9 88 "Ouest" "Sec" +"20010711" 71 19.2 21 22.4 6 4 6 -7.8785 -6.8937 -6.8937 77 "Ouest" "Sec" +"20010712" 56 13.8 17.3 18.5 8 8 6 1.5 -3.8302 -2.0521 71 "Ouest" "Pluie" +"20010713" 45 14.3 14.5 15.2 8 8 8 0.684 4 2.9544 56 "Est" "Pluie" +"20010714" 67 15.6 18.6 20.3 5 7 5 -3.2139 -3.7588 -4 45 "Ouest" "Pluie" +"20010715" 67 16.9 19.1 19.5 5 5 6 -2.2981 -3.7588 0 67 "Ouest" "Pluie" +"20010716" 84 17.4 20.4 21.4 3 4 6 0 0.3473 -2.5981 67 "Sud" "Sec" +"20010717" 63 15.1 20.5 20.6 8 6 6 2 -5.3623 -6.1284 84 "Ouest" "Pluie" +"20010718" 69 15.1 15.6 15.9 8 8 8 -4.5963 -3.8302 -4.3301 63 "Ouest" "Pluie" +"20010719" 92 16.7 19.1 19.3 7 6 4 -2.0521 -4.4995 -2.7362 69 "Nord" "Sec" +"20010720" 88 16.9 20.3 20.7 6 6 5 -2.8191 -3.4641 -3 92 "Ouest" "Pluie" +"20010721" 66 18 21.6 23.3 8 6 5 -3 -3.5 -3.2139 88 "Sud" "Sec" +"20010722" 72 18.6 21.9 23.6 4 7 6 0.866 -1.9696 -1.0261 66 "Ouest" "Sec" +"20010723" 81 18.8 22.5 23.9 6 3 2 0.5209 -1 -2 72 "Nord" "Sec" +"20010724" 83 19 22.5 24.1 2 4 6 0 -1.0261 0.5209 81 "Nord" "Sec" +"20010725" 149 19.9 26.9 29 3 4 3 1 -0.9397 -0.6428 83 "Ouest" "Sec" +"20010726" 153 23.8 27.7 29.4 1 1 4 0.9397 1.5 0 149 "Nord" "Sec" +"20010727" 159 24 28.3 26.5 2 2 7 -0.342 1.2856 -2 153 "Nord" "Sec" +"20010728" 149 23.3 27.6 28.8 4 6 3 0.866 -1.5321 -0.1736 159 "Ouest" "Sec" +"20010729" 160 25 29.6 31.1 0 3 5 1.5321 -0.684 2.8191 149 "Sud" "Sec" +"20010730" 156 24.9 30.5 32.2 0 1 4 -0.5 -1.8794 -1.2856 160 "Ouest" "Sec" +"20010731" 84 20.5 26.3 27.8 1 0 2 -1.3681 -0.6946 0 156 "Nord" "Sec" +"20010801" 126 25.3 29.5 31.2 1 4 4 3 3.7588 5 84 "Est" "Sec" +"20010802" 116 21.3 23.8 22.1 7 7 8 0 -2.3941 -1.3892 126 "Sud" "Pluie" +"20010803" 77 20 18.2 23.6 5 7 6 -3.4641 -2.5981 -3.7588 116 "Ouest" "Pluie" +"20010804" 63 18.7 20.6 20.3 6 7 7 -5 -4.924 -5.6382 77 "Ouest" "Pluie" +"20010805" 54 18.6 18.7 17.8 8 8 8 -4.6985 -2.5 -0.8682 63 "Sud" "Pluie" +"20010806" 65 19.2 23 22.7 8 7 7 -3.8302 -4.924 -5.6382 54 "Ouest" "Sec" +"20010807" 72 19.9 21.6 20.4 7 7 8 -3 -4.5963 -5.1962 65 "Ouest" "Pluie" +"20010808" 60 18.7 21.4 21.7 7 7 7 -5.6382 -6.0622 -6.8937 72 "Ouest" "Pluie" +"20010809" 70 18.4 17.1 20.5 3 6 3 -5.9088 -3.2139 -4.4995 60 "Nord" "Pluie" +"20010810" 77 17.1 20 20.8 4 5 4 -1.9284 -1.0261 0.5209 70 "Nord" "Sec" +"20010811" 98 17.8 22.8 24.3 1 1 0 0 -1.5321 -1 77 "Ouest" "Pluie" +"20010812" 111 20.9 25.2 26.7 1 5 2 -1.0261 -3 -2.2981 98 "Ouest" "Sec" +"20010813" 75 18.8 20.5 26 8 7 1 -0.866 0 0 111 "Nord" "Sec" +"20010814" 116 23.5 29.8 31.7 1 3 5 1.8794 1.3681 0.6946 75 "Sud" "Sec" +"20010815" 109 20.8 23.7 26.6 8 5 4 -1.0261 -1.7101 -3.2139 116 "Sud" "Sec" +"20010819" 67 18.8 21.1 18.9 7 7 8 -5.3623 -5.3623 -2.5 86 "Ouest" "Pluie" +"20010820" 76 17.8 21.3 24 7 5 5 -3.0642 -2.2981 -3.9392 67 "Ouest" "Pluie" +"20010821" 113 20.6 24.8 27 1 1 2 1.3681 0.8682 -2.2981 76 "Sud" "Sec" +"20010822" 117 21.6 26.9 28.6 6 6 4 1.5321 1.9284 1.9284 113 "Sud" "Pluie" +"20010823" 131 22.7 28.4 30.1 5 3 3 0.1736 -1.9696 -1.9284 117 "Ouest" "Sec" +"20010824" 166 19.8 27.2 30.8 4 0 1 0.6428 -0.866 0.684 131 "Ouest" "Sec" +"20010825" 159 25 33.5 35.5 1 1 1 1 0.6946 -1.7101 166 "Sud" "Sec" +"20010826" 100 20.1 22.9 27.6 8 8 6 1.2856 -1.7321 -0.684 159 "Ouest" "Sec" +"20010827" 114 21 26.3 26.4 7 4 5 3.0642 2.8191 1.3681 100 "Est" "Sec" +"20010828" 112 21 24.4 26.8 1 6 3 4 4 3.7588 114 "Est" "Sec" +"20010829" 101 16.9 17.8 20.6 7 7 7 -2 -0.5209 1.8794 112 "Nord" "Pluie" +"20010830" 76 17.5 18.6 18.7 7 7 7 -3.4641 -4 -1.7321 101 "Ouest" "Sec" +"20010831" 59 16.5 20.3 20.3 5 7 6 -4.3301 -5.3623 -4.5 76 "Ouest" "Pluie" +"20010901" 78 17.7 20.2 21.5 5 5 3 0 0.5209 0 59 "Nord" "Pluie" +"20010902" 76 17.3 22.7 24.6 4 5 6 -2.9544 -2.9544 -2 78 "Ouest" "Pluie" +"20010903" 55 15.3 16.8 19.2 8 7 5 -1.8794 -1.8794 -2.3941 76 "Ouest" "Pluie" +"20010904" 71 15.9 19.2 19.5 7 5 3 -6.1284 0 -1.3892 55 "Nord" "Pluie" +"20010905" 66 16.2 18.9 19.3 2 5 6 -1.3681 -0.8682 1.7101 71 "Nord" "Pluie" +"20010906" 59 18.3 18.3 19 7 7 7 -3.9392 -1.9284 -1.7101 66 "Nord" "Pluie" +"20010907" 68 16.9 20.8 22.5 6 5 7 -1.5 -3.4641 -3.0642 59 "Ouest" "Pluie" +"20010908" 63 17.3 19.8 19.4 7 8 8 -4.5963 -6.0622 -4.3301 68 "Ouest" "Sec" +"20010912" 78 14.2 22.2 22 5 5 6 -0.866 -5 -5 62 "Ouest" "Sec" +"20010913" 74 15.8 18.7 19.1 8 7 7 -4.5963 -6.8937 -7.5175 78 "Ouest" "Pluie" +"20010914" 71 15.2 17.9 18.6 6 5 1 -1.0419 -1.3681 -1.0419 74 "Nord" "Pluie" +"20010915" 69 17.1 17.7 17.5 6 7 8 -5.1962 -2.7362 -1.0419 71 "Nord" "Pluie" +"20010916" 71 15.4 17.7 16.6 4 5 5 -3.8302 0 1.3892 69 "Nord" "Sec" +"20010917" 60 13.7 14 15.8 4 5 4 0 3.2139 0 71 "Nord" "Pluie" +"20010918" 42 12.7 14.3 14.9 8 7 7 -2.5 -3.2139 -2.5 60 "Nord" "Pluie" +"20010919" 65 14.8 16.3 15.9 7 7 7 -4.3301 -6.0622 -5.1962 42 "Ouest" "Pluie" +"20010920" 71 15.5 18 17.4 7 7 6 -3.9392 -3.0642 0 65 "Ouest" "Sec" +"20010921" 96 11.3 19.4 20.2 3 3 3 -0.1736 3.7588 3.8302 71 "Est" "Pluie" +"20010922" 98 15.2 19.7 20.3 2 2 2 4 5 4.3301 96 "Est" "Sec" +"20010923" 92 14.7 17.6 18.2 1 4 6 5.1962 5.1423 3.5 98 "Nord" "Sec" +"20010924" 76 13.3 17.7 17.7 7 7 6 -0.9397 -0.766 -0.5 92 "Ouest" "Pluie" +"20010925" 84 13.3 17.7 17.8 3 5 6 0 -1 -1.2856 76 "Sud" "Sec" +"20010927" 77 16.2 20.8 22.1 6 5 5 -0.6946 -2 -1.3681 71 "Sud" "Pluie" +"20010928" 99 16.9 23 22.6 6 4 7 1.5 0.8682 0.8682 77 "Sud" "Sec" +"20010929" 83 16.9 19.8 22.1 6 5 3 -4 -3.7588 -4 99 "Ouest" "Pluie" +"20010930" 70 15.7 18.6 20.7 7 7 7 0 -1.0419 -4 83 "Sud" "Sec" diff --git a/INSA/TP anadon/RData b/INSA/TP anadon/RData new file mode 100644 index 0000000..3343960 Binary files /dev/null and b/INSA/TP anadon/RData differ diff --git a/INSA/TP anadon/Rhistory b/INSA/TP anadon/Rhistory new file mode 100644 index 0000000..03bca53 --- /dev/null +++ b/INSA/TP anadon/Rhistory @@ -0,0 +1,20 @@ +setwd("~/Bureau/Ana_donn/TP2") +install.packages(c("gridExtra", "forcats", "reshape2", "BioStatR")) +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=TRUE, +cache=FALSE, +prompt=FALSE, +tidy=TRUE, +comment=NA, +message=FALSE, +warning=FALSE, +class.source="badCode") +opts_knit$set(width=75) +library(corrplot) +library(ggplot2) +library(gridExtra) +library(forcats) +library(reshape2) +library(BioStatR) diff --git a/INSA/TP anadon/Rhistory (1) b/INSA/TP anadon/Rhistory (1) new file mode 100644 index 0000000..720e32e --- /dev/null +++ b/INSA/TP anadon/Rhistory (1) @@ -0,0 +1,290 @@ +install.packages("FactoMineR") +install.packages("factoextra") +setwd("~/Bureau/Ana_donn/TP3") +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=TRUE, +cache=FALSE, +prompt=FALSE, +tidy=TRUE, +comment=NA, +message=FALSE, +warning=FALSE, +class.source="badCode") +opts_knit$set(width=75) +library(corrplot) +library(ggplot2) +library(gridExtra) +library(FactoMineR) +library(factoextra) +library(reshape2) +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=TRUE, +cache=FALSE, +prompt=FALSE, +tidy=TRUE, +comment=NA, +message=FALSE, +warning=FALSE, +class.source="badCode") +opts_knit$set(width=75) +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=TRUE, +cache=FALSE, +prompt=FALSE, +tidy=TRUE, +comment=NA, +message=FALSE, +warning=FALSE, +class.source="badCode") +opts_knit$set(width=75) +library(corrplot) +library(ggplot2) +library(gridExtra) +library(FactoMineR) +library(factoextra) +library(reshape2) +Ozone<-read.table("Ozone.txt",header=T) +Ozone$pluie<-as.factor(Ozone$pluie) +Ozone$vent<-as.factor(Ozone$vent) +Ozone<-Ozone[,-11] +summary(Ozone) +dim(Ozone) +ggplot(melt(Ozone[,-c(11,12)]),aes(x=variable,y=value))+geom_boxplot() +g1<-ggplot(Ozone,aes(x=maxO3))+geom_density() +g2<-ggplot(melt(Ozone[,c(2:4)]),aes(x=value,color=variable))+geom_density() +g3<-ggplot(melt(Ozone[,c(5:7)]),aes(x=value,color=variable))+geom_density() +g4<-ggplot(melt(Ozone[,c(8:10)]),aes(x=value,color=variable))+geom_density() +grid.arrange(g1,g2,g3,g4,ncol=2) +ggplot(Ozone, aes(x = pluie)) + +geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences") +quan <- as.vector(table(Ozone$vent))/nrow(Ozone) +df <- data.frame(group = levels(Ozone$vent),value = quan) +ggplot(df, aes(x="", y=value, fill=group))+ +geom_bar(width = 1, stat = "identity")+ coord_polar("y", start=0)+ theme(legend.position="bottom") +corrplot(cor(Ozone[,-c(1,2)]),method = "ellipse") +corrplot(cor(Ozone[,-c(9,10)]),method = "ellipse") +corrplot(cor(Ozone[,-(9:10)]),method = "ellipse") +corrplot(cor(Ozone[,-(9,10)]),method = "ellipse") +corrplot(cor(Ozone[,-c(9,10)]),method = "ellipse") +corrplot(cor(Ozone[,-c(9,10)]),method = "ellipse") +dim(Ozone) +corrplot(cor(Ozone[,-c(11,12)]),method = "ellipse") +help("scale") +OzoneC<-scale(Ozone[,-c(11,12)],scale=FALSE) # A COMPLETER +apply(OzoneC,2,mean) +n=112 +p=10 +W<-diag(1/n,nrow=n,ncol=n) +M<- diag(1,nrow = p, ncol = p) +Gamma<- t(OzoneC)%*%W%*%OzoneC # A COMPLETER +A<-eigen(Gamma +Gamma<- t(OzoneC)%*%W%*%OzoneC # A COMPLETER +A<-eigen(Gamma) +Gamma<- t(OzoneC)%*%W%*%OzoneC # A COMPLETER +A<-eigen(Gamma) +A +n=112 +p=10 +W<- diag(1/n,nrow(OzoneC)) +M<- diag(1,ncol(OzoneC)) +n=nrow(OzoneC) +p=ncol(OzoneC) +W<- diag(1/n,n) +M<- diag(1,p) +Gamma<- t(OzoneC)%*%W%*%OzoneC # A COMPLETER +A<-eigen(Gamma) +A$values +A$values +"La trace de gamma est l'inertie de Ozone" +sum(A$values) +dim(OzoneC) +dim(W) +dim(M) +A$values +"La trace de gamma est l'inertie de Ozone" +sum(A$values) +mean(OzoneC**2) +A$values +"La trace de gamma est l'inertie de Ozone" +sum(A$values) +sum(OzoneC**2)/n +A$values +"La trace de gamma est l'inertie de Ozone" +sum(A$values) +sum(OzoneC**2)/n +sum(A$values)==sum(OzoneC**2)/n +A$values +"La trace de gamma est l'inertie de Ozone" +sum(A$values) +sum(OzoneC**2)/n +sum(A$values)===sum(OzoneC**2)/n +A$values/sum(A$values) +A$values/sum(A$values) +cumsum(A$values)/sum(A$values) +A$values/sum(A$values) +B=cumsum(A$values)/sum(A$values) +hist(B) +B=A$values/sum(A$values) +C=cumsum(A$values)/sum(A$values) +hist(B) +hist(C) +A$values/sum(A$values) +cumsum(A$values)/sum(A$values) +C=OzoneC%*%A$vectors +C=OzoneC%*%A$vectors +C +dim(C) +C=OzoneC%*%A$vectors +C +dim(C) +boxplot(OzoneC) +respca<-PCA(Ozone,quali.sup=c(11,12),scale.unit = F,graph=F) +respca$eig +fviz_eig(respca) +respca$ind$coord$ +2 +respca<-PCA(Ozone,quali.sup=c(11,12),scale.unit = F,graph=F) +respca$eig +fviz_eig(respca) +fviz_pca_ind(respca,geom=c("point")) +fviz_pca_ind(respca,geom=c("point")) +fviz_pca_ind(respca,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca,geom=c("point"),select.ind = list(cos2=0.95)) +fviz_pca_ind(respca,habillage=11,geom=c("point")) +fviz_pca_ind(respca,habillage=12,geom=c("point")) +plot(respca,choix="varcor") +corrplot(respca$var$cor,method="ellipse") +s<-sqrt((n-1)*apply(OzoneC,2,var)/n) +OzoneCR<-OzoneC%*%diag(1/s) +s<-sqrt((n-1)*apply(OzoneC,2,var)/n) +OzoneCR<-OzoneC%*%diag(1/s) +OzoneCR +scale(Ozone[,-c(11,12)]) +Gamma2<- t(OzoneCR)%*%W%*%OzoneCR # A COMPLETER +B<-eigen(Gamma2) +Gamma2<- t(OzoneCR)%*%W%*%OzoneCR # A COMPLETER +B<-eigen(Gamma2) +B +sum(B$values) +Gamma2<- t(OzoneCR)%*%W%*%OzoneCR # A COMPLETER +B<-eigen(Gamma2) +B +n=nrow(OzoneC) +p=ncol(OzoneC) +W<- diag(1/n,n) +M<- diag(1,p) +M +n=nrow(OzoneC) +p=ncol(OzoneC) +W<- diag(1/n,n) +M<- diag(1,p) +sum(B$values) +Gamma2<- t(OzoneC)%*%W%*%OzoneC +B<-eigen(Gamma2) +B +Gamma2<- t(OzoneC)%*%W%*%OzoneC +B<-eigen(Gamma2) +B +Gamma2 +Gamma2<- t(OzoneCR)%*%W%*%OzoneCR +B<-eigen(Gamma2) +B +Gamma2 +M2<-diag(1/apply(OzoneC,2,var)) +GammaM=Gamma%*%M2 +eigen(Gamma2) +eigen(GammaM) +M2<-diag(1/apply(OzoneC,2,var)) +GammaM=Gamma%*%M2 +G=eigen(Gamma2) +GM=eigen(GammaM) +G$values +GM$values +M2<-diag(1/apply(OzoneC,2,var)) +GammaM=Gamma%*%M2 +G=eigen(Gamma2) +GM=eigen(GammaM) +sum(G$values) +sum(GM$values) +M2<-diag(1/apply(OzoneC,2,var)) +GammaM=Gamma%*%M2 +G=eigen(Gamma2) +GM=eigen(GammaM) +sum(G$values) +sum(GM$values) +G$vectors +GM$vectors +M2<-diag(1/(apply(OzoneC,2,var)*(n-1)/n)) +GammaM=Gamma%*%M2 +G=eigen(Gamma2) +GM=eigen(GammaM) +sum(G$values) +sum(GM$values) +G$vectors +GM$vectors +respca2<-PCA(Ozone,quali.sup=c(11,12),scale.unit=T,graph=F) +respca2$eig +fviz_eig(respca2) +fviz_pca_ind(respca2,geom=c("point")) +fviz_pca_ind(respca2,geom=c("point")) +fviz_pca_var(respca2) +corrplot(OzoneCR) +corrplot(OzoneCR([,-c(11,12)])) +corrplot(respca2$var$cor,method="ellipse") +fviz_pca_ind(respca2,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca2,geom=c("point"),select.ind = list(cos2=0.95)) +fviz_pca_ind(respca2,habillage=11,geom=c("point")) +fviz_pca_ind(respca2,habillage=12,geom=c("point")) +fviz_pca_ind(respca2,geom=c("point")) +fviz_pca(respca2) +fviz_pca_ind(respca2,geom=c("point")) +fviz_pca(respca2,geom=c("point")) +g1<-fviz_pca_ind(respca2,geom=c("point")) +g2<-fviz_pca_var(respca2) +library(gridExtra) +grid.arrange(g1,g2,ncol=2) +fviz_pca_ind(respca2,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca2,geom=c("point"),select.ind = list(cos2=0.95)) +fviz_pca_ind(respca2,habillage=11,geom=c("point")) +fviz_pca_ind(respca2,habillage=11,geom=c("point")) +fviz_pca_ind(respca2,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca2,geom=c("point"),select.ind = list(cos2=0.95)) +fviz_pca_ind(respca2,habillage=11,geom=c("point")) +fviz_pca_ind(respca2,habillage=12,geom=c("point")) +g1<-fviz_pca_ind(respca2,geom=c("point"),habillage = 11) +g2<-fviz_pca_var(respca2) +library(gridExtra) +grid.arrange(g1,g2,ncol=2) +g1<-fviz_pca_ind(respca2,geom=c("point")) +g2<-fviz_pca_var(respca2,habillage = 11) +library(gridExtra) +grid.arrange(g1,g2,ncol=2) +g1<-fviz_pca_ind(respca2,geom=c("point")) +g2<-fviz_pca_var(respca2) +library(gridExtra) +grid.arrange(g1,g2,ncol=2) +fviz_pca_ind(respca2,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca2,geom=c("point"),select.ind = list(cos2=0.95)) +fviz_pca_ind(respca2,habillage=11,geom=c("point")) +fviz_pca(respca2,habillage=12,geom=c("point")) +fviz_pca_ind(respca2,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca2,geom=c("point"),select.ind = list(cos2=0.95)) +g3=fviz_pca_ind(respca2,habillage=11,geom=c("point")) +g4=fviz_pca(respca2,habillage=12,geom=c("point")) +grid.arrange(g3,g4,newpage=FALSE) +fviz_pca_ind(respca2,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca2,geom=c("point"),select.ind = list(cos2=0.95)) +g3=fviz_pca_ind(respca2,habillage=11,geom=c("point")) +g4=fviz_pca_ind(respca2,habillage=12,geom=c("point")) +grid.arrange(g3,g4,newpage=FALSE) +fviz_pca_ind(respca2,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca2,geom=c("point"),select.ind = list(cos2=0.95)) +g3=fviz_pca_ind(respca2,habillage=11,geom=c("point")) +g4=fviz_pca_ind(respca2,habillage=12,geom=c("point")) +grid.arrange(g3,g4) diff --git a/INSA/TP anadon/TP1-InitR.Rmd b/INSA/TP anadon/TP1-InitR.Rmd new file mode 100644 index 0000000..ec45e2d --- /dev/null +++ b/INSA/TP anadon/TP1-InitR.Rmd @@ -0,0 +1,954 @@ +--- +title: "TP 1 : Initiation au langage R. Découverte de Rstudio et Rmarkdown" +date : "3MIC - 2024-2025" +output: + html_document: + toc: true + toc_float: true + number_sections: true +--- +```{css,echo=F} +.badCode { +background-color: #C9DDE4; +} +``` + +```{r setup, echo=FALSE, cache=FALSE} +library(knitr) +## Global options +opts_chunk$set(echo=TRUE, + cache=TRUE, + prompt=FALSE, + tidy=TRUE, + comment=NA, + message=FALSE, + warning=FALSE, + class.source="badCode") +``` + +**Objectif** + +Les objectifs de cette séance sont + ++ une première prise en main du logiciel R avec la présentation de commandes de base ++ se familiariser avec RStudio ++ débuter dans la rédaction de documents en Rmarkdown + + +# Introduction + +## Pourquoi R ? + +Le logiciel R sous licence GNU est facile à installer à partir de la page du [CRAN](https://cran.r-project.org/index.html){target="_blank"} (ou d'un site miroir). Le CRAN contient toutes les ressources nécessaires à l'utilisateur de R, débutant ou expérimenté : fichiers d'installation, mises à jour, librairies, FAQ, newsletter, documentation... R est un logiciel très utilisé dans la communauté statistique. + +Dans sa structure, R est un langage de programmation d'une syntaxe voisine à celle du langage C et capable de manipuler des objets complexes sous forme de matrice, scalaire, vecteur, liste, facteur et aussi data frame. Il dispose également d'une très riche librairie de quasiment toutes les procédures et méthodes statistiques de la littérature. Plus précisément, toutes les recherches récentes sont d'abord développées et diffusées à l'aide de ce +logiciel par la communauté scientifique. + +## Présentation de Rstudio + +Nous allons utiliser [RStudio](https://rstudio.com/){target="_blank"} durant les TP d'Analyse de Données. RStudio n’est pas qu’une interface graphique pour R, il s’agit d’un environnement de développement intégré, proposant des outils et facilite l’écriture de scripts et l’utilisation de R. La version gratuite de RStudio étant déjà très riche en fonctionnalités, elle est suffisante pour les enseignements. Elle est disponible pour Linux, Windows et MacOS. + +Sur les ordinateurs en salle TP, sous linux, + +- à partir d'un terminal, placez vous dans le répertoire de travail et tapez la commande `rstudio` +- par le menu déroulant, allez dans Applications/Programmation/RStudio + +Si vous souhaitez travailler sur votre propre ordinateur, installez tout d'abord la dernière version du logiciel R (voir [CRAN](https://cran.r-project.org/index.html){target="_blank"}) puis installez la version gratuite de Rstudio adaptée à votre OS. + +### Description des fenêtres de RStudio + +A chaque ouverture de RStudio, l'écran est découpé en quatre grandes zones : + +- En bas à gauche c'est la **Console**, on peut y lire au lancement la version de R que RStudio a chargé. Après le texte d'entrée, la ligne commence par `>` qui est l'invite de commande. RStudio est prêt à recevoir votre première commande. On peut se servir de R comme d'une calculatrice. Vous pouvez par exemple taper `> 2+3` et taper `Entrée`. Le résultat apparait alors dans la console. + +- En haut à droite, on peut voir dans **Environnement** la liste des objets et fonctions créés au fur et à mesure du travail. On a également accès à l'historique des commandes dans **History**. + +- En bas à droite, on trouve plusieurs onglets : + + + **Files** : permet de voir le contenu du répertoire de travail + + **Plots** : permet de visualiser les graphiques créés + + **Packages** : liste les packages installés pour les charger, mettre à jour, en installer d'autres + + **Help** : permet d'accéder à l'aide en ligne + +- En haut à gauche, c'est la zone d'**Edition** pour gérer les scripts, les executer, .... + +Lorsque vous quittez RStudio, on vous demande si vous souhaiter sauvegarder l'environnement de travail. Si vous y répondez favorablement, un fichier de sauvegarde ` .RData` est enregistré dans le répertoire courant. + +### Types de documents avec RStudio + +En allant dans `File -> New File` ou en cliquant sur la flèche à côté de l'icone de *New File* (en haut à gauche), RStudio propose de nombreux types de document. Vous pouvez noter que l'on peut utiliser RStudio également pour faire du python, du C++, ... Nous allons ici ne parler que de quelques types de fichiers que l'on utilisera par la suite. + +Pour créer un script R, il suffit de sélectionner `R Script`. Ce script peut être enregistré à tout moment dans un fichier avec l'extension " .R" *(ex. monScript.R)* dans le répertoire courant en cliquant sur l'icône de disquette ou par `File->Save`. Vous pouvez l'ouvrir à tout moment grâce au menu `File –> Open file...`, à l'icône dossier ou en double cliquant sur le fichier *monScript.R*. Il est également possible d'executer un script directement depuis la console grâce à la commande `source("monScript.R")`. + +On peut également créer des documents de type rapport, slides, ... contenant du texte, du code, des images, des formules mathématiques en latex, .... + ++ à l'aide de `RMarkdown` en sélectionnant `R markdown ...`. Le document créé sera sauvegardé avec l'extension " .Rmd". On reviendra plus précisément sur les possibilités offertes par Rmarkdown et les commandes principales pour débuter la rédaction d'un rapport dans la section suivante. + ++ à l'aide de `quarto` en sélectionnant `Quarto Document ...` ou `Quarto Presentation ...` pour la création de présentation, rapports, ... Par exemple les slides du cours d'Analyse de Données ont été générés en quarto. La syntaxe est assez proche de celle de Rmarkdown. + +## Environnement + +### Répertoire de travail + +Pour pouvoir récupérer des données, maîtriser la sauvegarde des scripts, des résultats, ... il est important de connaitre le répertoire de travail c'est-à-dire le répertoire sous lequel les divers résultats seront sauvegardés par défaut. Ce dernier s'obtient à l'aide de la commande `> getwd()`. + +Pour changer de répertoire de travail, on peut + +- utiliser la commande `setwd()` dans la Console. +A noter que R ne reconnaît que le caractère "/" pour spécifier le chemin d'accès d'un répertoire (même sous Windows). +- passer par `Session -> Set Working Directory -> Choose Directory`. + +

Exercice :

+ +> Créer un dossier de travail pour ce TP dans votre home (en dehors de RStudio!) +> Dans RStudio, placez-vous dans ce dossier de travail pour le TP. + +### Les librairies pour R + +R est un logiciel libre, il s'enrichit grâce au développement de librairies par la communauté. La plupart des extensions sont développées et maintenues par la communauté des utilisateurs de R, et diffusées via le [CRAN (Comprehensive R Archive Network)](https://cran.r-project.org/){target="_blank"}. On peut également trouver des packages déposés sur *github* par exemple. + +A la première ouverture de RStudio sur les ordinateurs de salle TP, un dossier `R/libs` est créé dans votre `home` pour l'installation des librairies. + +Pour installer une librairie disponible sur le CRAN, vous avez plusieurs manières de le faire, dont + ++ passer par le menu `Tools-> Install Packages ...` , sélectionner un site miroir du CRAN et demander la librairie souhaitée ++ aller dans l'onglet *Packages* dans la fenêtre en bas à droite et cliquer sur *Install*. ++ utiliser la fonction `install.packages()` directement dans la console en précisant la librairie souhaitée + +Toutes les librairies ne sont pas chargées automatiquement au lancement de R. Pour charger une librairie, on utilise la commande `library()`. + +

Exercice :

+ +> 1. Installez la librairie *corrplot* +> 2. Chargez la librairie *corrplot* + +### L'aide de R + +On peut à tout moment faire appel à l'aide intégrée de R (et surtout avant d'appeler l'enseignant-e !) pour avoir les détails comme les arguments d'une fonction. +On peut accéder à l'aide pour une fonction (ex pour la fonction *plot*) en passant le nom de la fonction dans `help()` (ex `> help(plot)`) ou en utilisant le raccourci `> ?plot`. +Ces deux commandes permettent d'afficher une page de description (en anglais) de la fonction, ses paramètres, son résultat, d'exemples, ... Dans RStudio, les pages d'aide en ligne s'ouvriront par défaut dans la zone en bas à droite, sous l'onglet **Help**. Un clic sur l'icône en forme de maison vous affichera la page d'accueil de l'aide. Vous pouvez aussi taper directement le nom de la fonction recherchée dans la zone de recherche dans l'onglet **Help**. + +

Exercice :

+ +> Accédez à l'aide de la fonction `rnorm` + +## Editer des rapports avec Rmarkdown + +L'extension [**Rmarkdown**](https://rmarkdown.rstudio.com/index.html){target="_blank"} permet de créer des documents dans différents formats (html, pdf, docx, slides, ...) qui contiennent du texte, du code (en R mais pas que!), les résultats, ... +Par exemple, les sujets de TP de ce cours sont rédigés en Rmarkdown. +Vous devrez également rédiger le rapport de votre projet en Rmarkdown. +Nous allons donner ici des éléments de base pour la création de documents avec Rmarkdown. Pour plus de détails, vous pouvez consulter l'aide mémoire de Rmarkdown (accessible via `Help -> Cheatsheets -> Rmarkdown Cheat Sheet`) et le livre en ligne [R Markdown: The Definitive Guide](https://bookdown.org/yihui/rmarkdown/){target="_blank"} de Y. Xie, J. J. Allaire, G. Grolemund. + +### Etapes de création d'un document + +Un document Rmarkdown est un fichier enregistré avec l'extension `.Rmd`. Pour créer un nouveau document, allez dans `File-> NewFile-> Rmarkdown...` (ou cliquez sur l'icone nouveau document et choisissez Rmarkdown). + +

Exercice :

+ +> Créez un nouveau document Rmarkdown au format pdf avec le titre et l'auteur de votre choix. +> Vous pouvez constater qu'un nouveau document prérempli vient de s'ouvrir dans RStudio. +> Nous allons maintenant détailler le contenu de ce document. + +Un document Rmarkdown débute toujours par **l'en-tête** qui est encadré par 3 tirets `---`. +Cet en-tête contient au moins les métadonnées du document suivantes : le titre, l'auteur, la date, le format de sortie (`output`). +On peut préciser des options au document final en ajoutant des sous-options à droite du `output`. Il est également possible de spécifier des options différentes selon les formats. +Voici une liste avec quelques éléments : + ++ `number_section : true` permet de numéroter les sections ++ `highlight` permet de spécifier le style syntaxique (par ex `default`, `tango`, `pygments`, `kate`, ...). ++ on peut ajouter son propre fichier de style .css avec l'option `css` ++ on peut préciser des options concernant les figures avec `fig_width`, `fig_height`, `fig_caption`, `dev`, ... ++ on peut ajouter une bibliographie à partir d'un fichier `.bib` avec l'option `bibliography` + +On a ensuite le corps du document qui peut contenir + ++ du texte selon la syntaxe markdown ++ des blocs de code (appelés *chunks*) en R, Python, ... ++ des formules mathématiques (écrites en latex entre `$ ... $`) ++ des images, tableaux, références, .... + +Vous pouvez compiler à tout moment le document Rmarkdown en cliquant sur le bouton `Knit`. Un onglet R Markdown s’ouvre alors dans la même zone que l'onglet *Console* pour indiquer la progression de la compilation et les messages d'erreur éventuels. Une fois la compilation effectuée, le document obtenu s'ouvre et vous pouvez admirer le rendu. + +**Remarque**: Pour la compilation d'un document en pdf, il est nécessaire d'avoir installé un compilateur de Latex sur son ordinateur. + +

Exercice :

+ +> Modifiez les options dans l'en-tête de votre fichier Rmarkdown puis compilez le document pour constater l'impact sur le document généré. + + +### Quelques éléments markdown {#sectMarkdown} + +Le texte d'un document Rmarkdown est régi par le langage markdown. +Regardez les quelques éléments de syntaxe et de mise en forme +disponible [ici](https://rstudio.github.io/cheatsheets/html/rmarkdown.html?_gl=1*1t61k1h*_ga*MTY5MTU0NjIwNS4xNzI5MDc4NDE1*_ga_2C0WZ1JHG0*MTcyOTA3ODQxNC4xLjEuMTcyOTA3ODQzMC4wLjAuMA..#write-with-markdown){target="_blank"} ou consulter l'aide mémoire de Rmarkdown (accessible via `Help -> Cheatsheets -> Rmarkdown Cheat Sheet`). + +**Remarque: ** Si vous avez organisé votre document avec des sections / sous-sections en faisant débuter une ligne par un ou plusieurs `#`, alors vous pouvez cliquer sur l'icone `Outline` à droite de la barre d'outils associée au fichier R Markdown pour visualiser la table des matières générée automatiquement qui vous permet de naviguer facilement dans le document. + +Pour insérer du code dans un document Rmarkdown, on utilise des blocs appelés **chunk**. Pour cela, il suffit de cliquer sur l'icone d'insertion d'un chunk dans la barre d'outils d'un document Rmarkdown. Il est possible d'insérer un chunk de code R mais pas seulement (par exemple on peut insérer du code Python). Pour du code R, un chunk de la forme $\textrm{```{r} .... ```}$ s'insère alors dans le document. +On peut alors saisir du code R dans ce chunk. On peut ajouter un nom à un bloc et préciser des options dans les accolades `{r nomdubloc, ....}`, par exemple + ++ eval (TRUE par défaut, ou FALSE) : détermine si le code R doit être évalué ou non, ++ echo (TRUE par défaut, ou FALSE) : détermine si le code R doit être affiché ou non, ++ results ('markup' par défaut, 'hide', 'hold' ou 'asis') : détermine comment les sorties doivent être affichées, ++ error (FALSE par défaut, ou TRUE) : détermine si les messages d'erreur doivent être affichée, ++ warning (TRUE par défaut, ou FALSE) : détermine si les messages d'avertissement doivent être affichées. + +Ces options peuvent être modifiées manuellement ou en utilisant l'interface graphique (en cliquant sur l'icone d'engrenage situé en haut à droite de chaque bloc). + +

Exercice :

+ +> - Ajoutez `# Titre 1` avant `## RMarkdown` +> - Modifiez ```{r cars}``` en ```{r cars, eval=F}``` +> - Compilez le document pour voir les différences + + +De manière générale, il est recommandé de + + - travailler dans le document R Markdown (en lançant balise R par balise +R, avec la petite flèche verte en haut à droite de chaque bloc, ou en +lançant la ligne de code contenant le curseur en tapant Ctrl Enter), + - commenter les résultats obtenus (en dehors des balises R) au fur et à +mesure, + - ne compiler le document (Knit) qu’à la fin. + +**Pour la suite du TP, récupérez sur moodle le document "TP1-InitR.Rmd", sauvegardez-le dans votre dossier de travail et ouvre-le dans RStudio. C'est le document .Rmd qui a généré cet énoncé de TP et que vous allez compléter dans la suite.** + + +# Structure des objets en R + +Sous R, les éléments de base sont des objets : des données (vecteurs, +matrices, ...), des fonctions, des graphiques, ... +Ces objets se différencient par leur mode décrivant leur contenu, et leur classe décrivant leur structure. Les classes d'objets les plus courantes sont : **vector, matrix, array, factor, data.frame, list.** +On peut avoir des vecteurs, matrices, tableaux, ... de mode **null** (objet vide), **logical** (TRUE, FALSE, NA), **numeric**, **complex**, **character**. Par contre +les listes et les tableaux peuvent être composés d'éléments hétérogènes. On utilise la commande `class()` pour connaître la classe d'un objet et `str()`pour connaitre la nature des éléments composant l'objet. + +Nous allons dans ce TP présenter certains de ces objets, les opérations et manipulations basiques que l'on peut faire, ... + +Remarque : On stocke un objet dans une variable *a* à l'aide de `a<- ...` ou `a= ...`. Pour lister les variables actuellement disponibles dans la session de travail, on utilise la fonction `ls()`. Pour effacer une ou plusieurs variables, on utilise la fonction `rm()`. La commande `rm(list=ls())` permet d'effacer toutes les variables en mémoire. + + +## Opération sur les scalaires {.tabset} + +### Opérations +Les opérations élémentaires sur les scalaires sont `*`,`-`, `+`, `/`, `^`.\ + +Executez les commandes suivantes. Vous chercherez en particulier à bien identifier les différents types de données : +```{r, echo=T,eval=F} +2+2 +exp(10) +a = log(2) +a +b =cos(10) +b +a - b +a*b +d <- 2 < 3 +d +dd <- FALSE +dd - d +dd + d +e<- "toto" +class(e) +str(e) +``` + +```{r,echo=F} +rm(a,b,d,dd,e) +``` + +### `is.xxx()/as.xxx()` +Pour tester si un objet *obj* est de type *xxx*, on utilise la commande +`is.xxx(obj)`. On peut aussi contraindre si possible l'objet *obj* au type *xxx* avec la commande `as.xxx(obj)`. + +```{r} +a = 4.3 +is.numeric(a) +is.complex(a) +is.character(a) +as.character(a) +b<- "toto" +is.numeric(b) +as.list(b) +``` + +```{r,echo=F} +rm(a,b) +``` + +### Arrondir +Pour obtenir des valeurs arrondies sur des valeurs numériques, vous pouvez utiliser l'une des commandes suivantes `round()`, `ceiling()`, `floor()`, `trunc()` ou `signif()` (voir l'aide `?round`). +Comparez les codes suivantes: + +```{r} +a=1.3579 +floor(a) +ceiling(a) +round(a,digits=2) +signif(a,digits=2) +is.integer(floor(a)) +is.numeric(floor(a)) +``` + + +## Booléens et opérations logiques {.tabset} + +En R, un booléen est représenté par *TRUE* ou *FALSE*. Les opérations logiques, `<`, `>`, `<=`, `>=`, `!=` (différent), `==` (égal) retournent *TRUE* ou *FALSE*. On peut définir plusieurs conditions à remplir avec les opérateurs `&` (ET) et `|` (OU). + +Attention, R considère que le booléen *FALSE* vaut $0$ et le booléen *TRUE* vaut $1$. Il est donc capable d'évaluer ` TRUE + 5` bien qu'en toute logique, cela n'a aucun sens! + +Voici quelques exemples de manipulation des booléens pour comprendre : + +```{r} +a = 3 +b = 6 +a<=b +a!=b +(b-3==a) & (b>=a) +(b==a) | (b>=a) +``` + +```{r,echo=F} +rm(a,b) +``` + +## Vecteurs *(vector)*{.tabset} + +Un vecteur est un ensemble ordonné d'éléments de même nature (numérique, logique ou alphanumérique). La création d'un vecteur peut se faire par la commande `c(e1,e2,...)`. On peut également générer une séquence avec la commande `seq(a,b,t)` où $a$ est le premier terme, le dernier terme est $\leq b$ et le pas est $t$. Pour créer un vecteur constitué de l'élément $x$ répété $n$ fois, on utilise la commande `rep(x,n)`. + + +On donne ici quelques exemples à tester sous R pour vous familiariser avec les vecteurs. En particulier, vous pouvez découvrir des fonctions utiles avec les vecteurs comme `length()`, `sum()`, `sort()`, ... , les opérations usuelles, l'extraction d'éléments d'un vecteur, ... + +### Commande `c(...)` +```{r} +d <- c(2,3,5,8,4,6) +d +is.vector(d) +c(2,5,"toto") +1:10 +``` + +### Commande `seq(...)` +```{r} +seq(1,10) +seq(from=1,to=20,by=2) +seq(1,20,by=5) +seq(1,20,length=5) +``` + +### Commande `rep(...)` +```{r} +rep(5,times=10) +rep(c(1,2),3) +rep(c(1,1,2,18),each=3) +``` + +### Extraire des éléments +```{r} +d +d[2] +d[2:3] +d[c(1,3,6)] +d[-3] +d[-(1:2)] +``` + +### Opérations + +Additionner ou soustraire un scalaire d'un vecteur +```{r} +d+4 +d-4 +``` +Multiplier ou diviser un vecteur par un scalaire +```{r} +2*d +d/3 +``` +Multiplier/ diviser deux vecteurs terme à terme +```{r} +e<- rep(2,6) +d*e +d/e +``` + +### Fonctions usuelles +```{r} +d = c(2,3,5,8,4,6) +d +``` + +Longueur d'un vecteur +```{r} +length(d) +``` +Somme des termes d'un vecteur numérique +```{r} +sum(d) +``` +Somme des termes cumulés d'un vecteur numérique +```{r} +cumsum(d) +``` +Différence des termes successifs d'un vecteur numérique +```{r} +diff(d) +``` +Vérifier si *d* est un vecteur +```{r} +is.vector(d) +``` + +Autres fonctions intéressantes avec les vecteurs : `abs()`, `sort()`, `order()`, `which()`, ... +```{r} +a<-c(3,-1,5,2,-7,3,9) +abs(a) +sort(a) +order(a) +which(a<0) +``` + +On peut appliquer une fonction à tous les éléments d'un vecteur facilement. + +```{r} +cos(a) +``` + +```{r,echo=F} +rm(a) +``` + +### Exercice +> Construire +> +> + le vecteur $a$ constitué des entiers pairs jusqu'à 30 +> + le vecteur $b$ contenant 6 nombres compris entre 4 et 30 avec un intervalle constant. +> + le vecteur $c$ contenant la somme des éléments de $b$, la longueur de $a$ et 5 fois le chiffre 3. +> +> Extraire du vecteur $c$ le +> +> + le quatrième élément +> + tous les éléments sauf le quatrième +> + tous les éléments supérieurs à 10 + + +```{r} +a<-seq( from =0, to=30,by=2) +b<-seq(from=4,to=30,length=6) +c<-c(sum(b),length(a),rep(3,times=5)) +c[4] +c[-4] +c[which(c>10)] +``` + + +## Matrices (*matrix*){.tabset} + +Comme les vecteurs, les matrices sont de mode quelconque mais ne contiennent que des éléments de même nature. Pour créer une matrice, on utilise la commande `matrix(vec,nrow=n,ncol=p)` où *vec* est le vecteur contenant les éléments de la matrice de taille $n$ par $p$, qui seront rangés en colonne sauf si l'option *byrow=T* est utilisée. + +On donne ici quelques exemples à tester sous R pour vous familiariser avec les matrices. En particulier, vous pouvez découvrir des fonctions utiles avec les matrices comme `dim()`, `t()`, `cbind()`, `rbind()`... , les opérations usuelles dont la différence entre `A*B` et `A%*%B`, l'extraction d'éléments d'une matrice, ... + +### `matrix()` +```{r} +A = matrix(1:15,ncol=5) +A + +B = matrix(1:15,nc=5,byrow=T) +B2 = B +B2[1,1]="toto" +B2 +``` + +```{r} +rownames(A)=c(paste("ligne",1:3,sep="")) +A +``` + +### Extraire +```{r} +A +A[1,3] +A[,2] +A[2,] +A[1:3,c(2,5)] +A[1:3,-c(2,5)] +``` + +### `cbind() / rbind()` +Pour concaténer deux matrices, on peut utiliser les fonctions `rbind()` ou `cbind()`. + +```{r} +A +B +cbind(A,B) +rbind(A,B) +``` + +### Fonctions utiles + +Dimension d'une matrice +```{r} +dim(A) +``` +Nombre de lignes et de colonnes +```{r} +nrow(A) +ncol(A) +``` +Transposée et déterminant d'une matrice +```{r} +t(A) +det(A[,3:5]) +``` + +Matrice diagonale et diagonale d'une matrice +```{r} +diag(A) +diag(1:5) +``` + +Matrice de booléens +```{r} +A>5 +A[A<5]<-0 +A +``` + +Quelques autres fonctions sur les matrices +```{r} +colSums(A) +apply(A,2,sum) +rowSums(A) +apply(A,1,sum) +rowMeans(A) +apply(A,1,mean) +apply(A,1,max) +``` + +Remarque : on reverra dans la section [Programmation](#secProg) la fonction `apply()` qui permet en particulier d'éviter les boucles *for*.\ + +### Opérations + +Attention à la multiplication matricielle `%*%` et la multiplication terme à terme `*`! + +Opérations terme à terme de 2 matrices +```{r} +A+B +A*B +``` + +Multiplication de matrices +```{r} +t(B) %*%A + +``` + +Multiplication par un scalaire +```{r} +5*A +``` + +### Exercice + +> 1. Créer la matrice $A=\left(\begin{array}{c c c } 3 & 3 & 3\\ 4 & 4 & 4\\ 5 & 5 & 5\end{array}\right).$ +> 2. Ajouter 2 à tous les éléments de $A$. +> 3. Créer la matrice $B$ en ajoutant la ligne $(1,2,3)$ à $A$, puis la colonne $(1,1,1,1)'$. Déterminer la dimension de $B$. +> 4. Extraire de $B$ la sous-matrice $C$ composée des deux premières colonnes et des deux dernières lignes. Calculer la transposée et le déterminant de $C$. + + +```{r} +A<-matrix(rep(c(3,4,5),each=3), ncol=3,byrow=TRUE) +A+2 +B= +``` + + +## Listes *(list)* {.tabset #secList} + +Une liste est une collection ordonnée d'objets qui peuvent être de nature différente. Les listes sont +en particulier utilisées par certaines fonctions (cf section [Programmation](#secProg)) pour renvoyer des résultats complexes sous +forme d'un seul objet. +On utilise la fonction `list(nom1=el1,nom2=el2,...)` (l'utilisation +des noms étant facultative) pour générer une liste. On peut accéder à chaque élément de la liste à l'aide +de son index entre double crochets ` [[...]]`, ou par son nom précédé du signe `$`. + + +### `list(...)` +```{r} +x = list("toto",1:8) +x +``` + +Création d'une liste avec des noms aux éléments +```{r} +y = list(matrice=matrix(1:15,ncol=5), + vecteur=seq(1,20,by=5), + texte="toto",scalaire=8) +y +``` + +### Extraction +Extraction d'un élément par son numéro +```{r} +x[[1]] +``` + +Attention, cette commande n'est pas possible: +```{r, eval=F} +x[[1]]+1 +``` + +par contre celle-ci est possible +```{r} +x[[2]]+10 +``` + +```{r} +y[[1]] +y$matrice +y$vec +y[c("texte","scalaire")] +``` + +### Fonctions utiles + +```{r} +names(y) +length(y) +length(y$vecteur) +cos(y$scal)+y[[2]][1] +summary(y) +``` + + +### Exercice + +> 1. Créer une liste contenant le nom de trois matières, les notes de 5 élèves pour chacune de ces matières, l'âge des 5 élèves et la filière (PO) d'appartenance de ces 5 élèves. +> 2. Récupérer les notes du 4ème élève +> 3. Créer une matrice contenant les notes et l'âge des 5 élèves. + +```{r} +# A COMPLETER POUR REPONDRE A L'EXERCICE +``` + +## Data frames {.tabset} +Sous R, un data.frame est analogue à une matrice mais le contenu des colonnes +peut être ici hétérogène. Un tableau de données est un ensemble de vecteurs rangés colonne par colonne, chaque colonne correspondant à une variable, chaque ligne à un individu. En particulier, lors d'études statistiques, les données à étudier sont souvent représentées par un data.frame sous R. Pour créer un tableau de données, on peut regrouper des variables de même longueur à +l'aide de la commande `data.frame(nom1=var1,nom2=var2,...)`. On peut par exemple transformer une matrice en un tableau de données en utilisant la commande `as.data.frame(mat)`. + + +On donne ici quelques exemples à tester sous R pour vous familiariser avec les data.frames. En particulier, vous pouvez découvrir des fonctions utiles dont `summary()` et `head()`. + +### `data.frame()` +```{r} +# Création du data.frame H +taille = runif(12,150,180) +masse = runif(12,50,90) +sexe = rep(c("M","F","F","M"),3) +H = data.frame(taille,masse,sexe) +H +class(H) +``` + +### `summary()/head()` +La fonction `summary()` permet de résumer le contenu des différentes colonnes d'un data.frame. +```{r} +summary(H) +``` +La fonction `head()` permet de visualiser les premières lignes d'un data.frame +```{r} +head(H) +``` + +### data.frame / list/matrix +Au travers de ces quelques commandes, vous pouvez voir les analogies entre data.frame, list et matrix mais restez prudent sur la nature de l'objet que vous manipulez! +```{r} +H[1,] +H$taille +H$sexe +is.data.frame(H) +is.matrix(H) +MH = as.matrix(H) +MH +summary(MH) +as.list(H) +``` + + +### Exercice + +> On reprend le data.frame $H$. +> +>1. Extraire la masse des individus dont la taille est supérieure à 160. +>2. Extraire la masse et le sexe de ces mêmes individus. +>3. Extraire la taille des individus de sexe masculin dont la masse est inférieure à 80 (c'est possible en une seule ligne avec `&`). + + +```{r} +# A COMPLETER POUR REPONDRE A L'EXERCICE +``` + +# Les graphiques avec R + +R contient de base des fonctions dédiées aux graphiques. +Les fonctions graphiques principales comme `plot()` ouvrent une nouvelle fenêtre à l'execution. Les fonctions graphiques secondaires permettent d'ajouter des éléments à un graphique. Une présentation succinte des graphiques de base avec R est disponible [ici (tutoriel "Premiers Graphiques")](https://cmaugis.github.io/TutorielsR/Part2-InitR.html#premiers-graphiques){target="_blank"}. + +Maintenant il est plus usuel d'utiliser la librairie `ggplot2` pour faire des graphiques sous R. On découvrira les graphiques avec ggplot dans le TP2. + + +# Programmation avec R {#secProg} + +Cette partie est consacrée à la création des fonctions, les instructions de contrôle, la syntaxe des itérations et la fonction `apply()` (et ses dérivées). + +## Créer une fonction +Il est possible sous R de construire ses propres fonctions. De manière générale, la définition d'une nouvelle fonction passe par l'expression suivante : + +```{r,eval=F} +nomfonction=function(arg1[=exp1],arg2[=exp2],...){ + bloc d instructions + sortie = ... + return(sortie) +} +``` + +Les accolades signalent le début et la fin du code source de la fonction, les crochets indiquent le caractère facultatif des valeurs par défaut des arguments. +L'objet *sortie* contient le ou les résultats retournés par la fonction, on peut en particulier utiliser une liste pour retourner plusieurs résultats. + +Voici quelques exemples : + +```{r} +MaFonction=function(x){x+2} +MaFonction(3) +``` + +```{r} +Fonction2=function(a,b=7){a+b} +Fonction2(2,b=3) +Fonction2(5) +``` + +Fonction retournant le périmètre et la surface d'un cercle à partir de son rayon : +```{r} +CalculsCercle=function(r){ + p=2*pi*r + s=pi*r*r + resultats = list(perimetre=p,surface=s) + return(resultats) +} +res=CalculsCercle(3) +res +res$surf +``` + +## Structures de contrôle et itérations + +### Instructions conditionnelles +La syntaxe `if(condition){instructions}` permet de calculer les instructions uniquement si la condition est vraie. +Le code `if(condition){ A }else { B }` calcule les instructions A si la condition est vraie et les instructions B sinon. On peut également utiliser `ifelse`. + +Dans l'exemple suivant, les deux commandes sont équivalentes : + +```{r,eval=F} +if(x>0){y=x*log(x)}else{ y=0} +y=ifelse(x>0,x*log(x),0) +``` + + +### Itérations +On utilise les boucles pour exécuter plusieurs fois une instruction ou un bloc d'instructions. Les trois types de boucle sont : + +- la boucle **for** : + `for(var in seq){ commandes }` +- la boucle **while** : + `while(cond){ commandes }` +- la boucle **repeat** : + `repeat { commandes ; if (cond) break }` + +Pour illustrer les trois types de boucles, on a codé de trois façons différentes la somme des éléments d'un vecteur `x` ce qui correspond à la fonction `sum()` de R. + +```{r} +# Exemple boucle for +somme1=function(x){ +t = 0 +for (i in 1:length(x)){ + t = t+x[i] +} +return(t) +} + +x = seq(1:10) +somme1(x) +sum(x) +``` + +```{r} +# Exemple boucle while +somme2=function(x){ +t = 0 +i = 1 +while (i<=length(x)){ +t = t+x[i] +i = i+1 +} +return(t) +} +somme2(x) +``` + + +```{r} +# Exemple repeat +somme3=function(x){ +t = 0 +i = 1 +repeat{ +t = t+x[i] +i = i+1 +if (i> length(x)) break +} +return(t) +} +somme3(x) +``` + +

Exercice :

+ +> 1. Écrire une fonction *ma.var* qui calcule la variance empirique corrigée pour un vecteur $x = (x_1, . . . , x_n)$. Quelle est la variance de la variable "Taille" dans le data.frame $H$ ? Comparez avec la fonction prédéfinie `var()`. +> 2. Écrire une fonction qui calcule les $n$ premiers termes de la suite de Fibonacci ($u_1=0, u_2=1, \forall n>2, u_n=u_{n-1}+u_{n-2}$) + + +```{r} +# A COMPLETER POUR REPONDRE A L'EXERCICE +``` + +## `apply()` et ses variantes + +Il est recommandé d'éviter les boucles très chronophages. On peut utiliser pour cela la fonction `apply()` et ses variantes `sapply()`, `lapply()`, `tapply()` sur des vecteurs ou matrices. + +La fonction `apply()` permet d'appliquer la même fonction *FUN* sur toutes +les lignes *(MARGIN=1)* ou les colonnes *(MARGIN=2)* d'une matrice *MAT* : `apply(MAT , MARGIN, FUN)`. + +Les fonctions `lapply()` et `sapply()` calculent la même fonction sur tous les éléments d'un vecteur ou d'une liste. +La commande `lapply(X,FUN, ARG.COMMUN)` permet d'appliquer la fonction *FUN* à tous les éléments du vecteur ou de la liste *X*. Les valeurs de *X* sont affectées au premier argument de la fonction *FUN*. Si la fonction *FUN* a plusieurs paramètres d'entrée, ils sont spécifiés dans *ARG.COMMUN*. Cette fonction retourne le résultat sous la forme de listes. `sapply()` est une fonction similaire à `lapply()` mais le résultat est retourné sous forme de vecteurs, si possible. + +La fonction `tapply()` applique une fonction *FUN* sur les sous-groupes d'un +vecteur *X* définis par une variable de type factor *GRP* : `tapply(X,GRP,FUN,...)`. + +Voici quelques exemples : + +```{r} +data(iris) +head(iris) +apply(iris[,1:4],2,sum) +apply(iris[,1:4],1,sum) +lapply(iris[,1:4],sum) +sapply(iris[,1:4],sum) +tapply(iris[,1],iris[,5],sum) +``` + +

Exercice :

+ +Soit la fonction suivante : +```{r,eval=F} +Exo1=function(M){ + res=rep(0,5) + for (i in 1:5){ + tmp=0 + for (j in 1:4) {tmp = tmp + M[i,j]} + res[i]=tmp + } +return(res) +} + +M=matrix(1:20,nrow=5,ncol=4) +Exo1(M) +``` + +> Proposez une fonction équivalente sans aucune boucle. + +```{r} +# A COMPLETER +``` + +# Lois de probabilité sous R + +Le logiciel R permet d’effectuer des calculs avec toutes les lois de probabilité +usuelles, et aussi de simuler des échantillons issus de ces lois. +Pour chaque distribution, quatre commandes préfixées par une des lettres **d**, **p**, **q**, **r** et suivi du nom de la distribution (`nomdist`) sont disponibles : + +- dnomdist : fonction de densité $f_X(.)$ + pour une loi continue ou fonction de probabilité $\mathbb P(X=k)$ + pour une loi discrète +- pnomdist : fonction de répartition $F_X(.)=\mathbb P(X\leq .)$𝐹 +- qnomdist : quantiles +- rnomdist : génère des réalisations aléatoires indépendantes de la distribution nomdist. + +Voici une liste non exhaustive de lois de probabilité disponibles : + +```{r,echo=F} +df<-data.frame(Loi=c("Gaussienne","Binomiale","Poisson","Uniforme continue","Exponentielle","Student","Khi-deux","Fisher"), + nomdist=c("norm","binom","pois","unif","exp","t","chisq","f")) +knitr::kable(df,align="ll") +``` + +

Exercice :

+ +> Simulez un échantillon de $n=1000$ variables aléatoires gaussiennes de moyenne $10$ et de variance $4$ +> Calculez la moyenne et la variance de l'échantillon. + +```{r} +# A COMPLETER +``` + + +# Entrée / Sortie + +## Importation d'un jeu de données + +Pour importer un tableau de données contenu dans un fichier en un data.frame, on utilise la fonction `read.table()`. Par exemple, pour un fichier nommé “Tableau.txt”, on utilisera la commande `Tab1 <- read.table("Tableau.txt")` qui crée un data.frame `Tab1`. La commande read.table() admet des options dont + +- `header` : indique si la première ligne contient des noms de variables. Par défaut, la valeur de cette option est FALSE. +- `sep` : précise le séparateur de champ dans le fichier entre guillemets (" " par défaut). +- `dec` : le caractère utilisé pour les décimales ("." par défaut). + +Les fonctions `read.csv()` et `read.csv2()` sont utilisées pour la lecture de fichiers de données au format `.csv`. + +## Exportation + +### Exportation en un fichier de données + +Si maintenant on désire sauvegarder un jeu de données, on utilise la commande `write.table()`. Les principales options de cette fonction sont : + +- `file` : nom du fichier dans lequel écrire (vérifier le répertoire courant) +- `append` : prend une valeur logique. Si TRUE, R ajoute les données dans le fichier concerné sans effacer les précédentes. La valeur par défaut est FALSE. +- `sep` : précise le séparateur à utiliser. +- `dec` : précise le caractère à utiliser pour les décimales. + +

Exercice :

+ +> Chargez le jeu de données ìris`disponible dans R avec la commande `data(iris) +> Sauvegardez le jeu de données dans un fichier intitulé `SauvIris.txt` avec des ";" pour séparateurs. +> Importez les données du fichier `SauvIris.txt` + +```{r} +# A COMPLETER +``` + + +### Sauvegarde d'un / des objets R + +R permet d’enregistrer des objets entiers, en conservant à la fois les données contenues dans les objets et les structures des objets. + +La fonction `save.image()` peut être utilisée à tout moment pour enregistrer une image de session, c’est à dire l’ensemble des objets dans l’environnement de travail d’une session R. La sauvegarde d’une image de la session vous est également proposée lors de la fermeture de R. + +La fonction `save()` permet d’enregistrer spécifiquement un ou des objets dans un fichier de format .RData. Ce fichier peut être à tout moment rechargé sous R avec la fonction `load()`. Voici un exemple : + +```{r} +x <- runif(20) +y <- list(a = 1, b = TRUE, c = "oops") +save(x, y, file = "xy.RData") +load("xy.RData") +``` + +On peut aussi enregistrer un seul objet, sans inclure le nom de l'objet, à l'aide de la fonction `saveRDS()`. L'objet, sauvegardé au format `.rds` peut être rechargé avec la fonction `readRDS()`. + + diff --git a/INSA/TP anadon/TP1-InitR.html b/INSA/TP anadon/TP1-InitR.html new file mode 100644 index 0000000..81f3bcc --- /dev/null +++ b/INSA/TP anadon/TP1-InitR.html @@ -0,0 +1,3066 @@ + + + + + + + + + + + + + +TP 1 : Initiation au langage R. Découverte de Rstudio et Rmarkdown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ +
+ + + + + + + + +

Objectif

+

Les objectifs de cette séance sont

+
    +
  • une première prise en main du logiciel R avec la présentation de +commandes de base
  • +
  • se familiariser avec RStudio
  • +
  • débuter dans la rédaction de documents en Rmarkdown
  • +
+
+

1 Introduction

+
+

1.1 Pourquoi R ?

+

Le logiciel R sous licence GNU est facile à installer à partir de la +page du CRAN (ou d’un site miroir). Le CRAN contient toutes +les ressources nécessaires à l’utilisateur de R, débutant ou expérimenté +: fichiers d’installation, mises à jour, librairies, FAQ, newsletter, +documentation… R est un logiciel très utilisé dans la communauté +statistique.

+

Dans sa structure, R est un langage de programmation d’une syntaxe +voisine à celle du langage C et capable de manipuler des objets +complexes sous forme de matrice, scalaire, vecteur, liste, facteur et +aussi data frame. Il dispose également d’une très riche librairie de +quasiment toutes les procédures et méthodes statistiques de la +littérature. Plus précisément, toutes les recherches récentes sont +d’abord développées et diffusées à l’aide de ce logiciel par la +communauté scientifique.

+
+
+

1.2 Présentation de +Rstudio

+

Nous allons utiliser RStudio durant les TP d’Analyse de Données. RStudio +n’est pas qu’une interface graphique pour R, il s’agit d’un +environnement de développement intégré, proposant des outils et facilite +l’écriture de scripts et l’utilisation de R. La version gratuite de +RStudio étant déjà très riche en fonctionnalités, elle est suffisante +pour les enseignements. Elle est disponible pour Linux, Windows et +MacOS.

+

Sur les ordinateurs en salle TP, sous linux,

+
    +
  • à partir d’un terminal, placez vous dans le répertoire de travail et +tapez la commande rstudio
  • +
  • par le menu déroulant, allez dans +Applications/Programmation/RStudio
  • +
+

Si vous souhaitez travailler sur votre propre ordinateur, installez +tout d’abord la dernière version du logiciel R (voir CRAN) +puis installez la version gratuite de Rstudio adaptée à votre OS.

+
+

1.2.1 Description des +fenêtres de RStudio

+

A chaque ouverture de RStudio, l’écran est découpé en quatre grandes +zones :

+
    +
  • En bas à gauche c’est la Console, on peut y lire +au lancement la version de R que RStudio a chargé. Après le texte +d’entrée, la ligne commence par > qui est l’invite de +commande. RStudio est prêt à recevoir votre première commande. On peut +se servir de R comme d’une calculatrice. Vous pouvez par exemple taper +> 2+3 et taper Entrée. Le résultat apparait +alors dans la console.

  • +
  • En haut à droite, on peut voir dans +Environnement la liste des objets et fonctions créés au +fur et à mesure du travail. On a également accès à l’historique des +commandes dans History.

  • +
  • En bas à droite, on trouve plusieurs onglets :

    +
      +
    • Files : permet de voir le contenu du répertoire de +travail
    • +
    • Plots : permet de visualiser les graphiques +créés
    • +
    • Packages : liste les packages installés pour les +charger, mettre à jour, en installer d’autres
    • +
    • Help : permet d’accéder à l’aide en ligne
    • +
  • +
  • En haut à gauche, c’est la zone d’Edition pour +gérer les scripts, les executer, ….

  • +
+

Lorsque vous quittez RStudio, on vous demande si vous souhaiter +sauvegarder l’environnement de travail. Si vous y répondez +favorablement, un fichier de sauvegarde .RData est +enregistré dans le répertoire courant.

+
+
+

1.2.2 Types de documents +avec RStudio

+

En allant dans File -> New File ou en cliquant sur la +flèche à côté de l’icone de New File (en haut à gauche), +RStudio propose de nombreux types de document. Vous pouvez noter que +l’on peut utiliser RStudio également pour faire du python, du C++, … +Nous allons ici ne parler que de quelques types de fichiers que l’on +utilisera par la suite.

+

Pour créer un script R, il suffit de sélectionner +R Script. Ce script peut être enregistré à tout moment dans +un fichier avec l’extension ” .R” (ex. monScript.R) dans le +répertoire courant en cliquant sur l’icône de disquette ou par +File->Save. Vous pouvez l’ouvrir à tout moment grâce au +menu File –> Open file..., à l’icône dossier ou en +double cliquant sur le fichier monScript.R. Il est également +possible d’executer un script directement depuis la console grâce à la +commande source("monScript.R").

+

On peut également créer des documents de type rapport, slides, … +contenant du texte, du code, des images, des formules mathématiques en +latex, ….

+
    +
  • à l’aide de RMarkdown en sélectionnant +R markdown .... Le document créé sera sauvegardé avec +l’extension ” .Rmd”. On reviendra plus précisément sur les possibilités +offertes par Rmarkdown et les commandes principales pour débuter la +rédaction d’un rapport dans la section suivante.

  • +
  • à l’aide de quarto en sélectionnant +Quarto Document ... ou Quarto Presentation ... +pour la création de présentation, rapports, … Par exemple les slides du +cours d’Analyse de Données ont été générés en quarto. La syntaxe est +assez proche de celle de Rmarkdown.

  • +
+
+
+
+

1.3 Environnement

+
+

1.3.1 Répertoire de +travail

+

Pour pouvoir récupérer des données, maîtriser la sauvegarde des +scripts, des résultats, … il est important de connaitre le répertoire de +travail c’est-à-dire le répertoire sous lequel les divers résultats +seront sauvegardés par défaut. Ce dernier s’obtient à l’aide de la +commande > getwd().

+

Pour changer de répertoire de travail, on peut

+
    +
  • utiliser la commande setwd() dans la Console. A noter +que R ne reconnaît que le caractère “/” pour spécifier le chemin d’accès +d’un répertoire (même sous Windows).
  • +
  • passer par +Session -> Set Working Directory -> Choose Directory.
  • +
+

+ +

+Exercice : +

+
+

+
+

Créer un dossier de travail pour ce TP dans votre home (en dehors de +RStudio!) Dans RStudio, placez-vous dans ce dossier de travail pour le +TP.

+
+
+
+

1.3.2 Les librairies pour +R

+

R est un logiciel libre, il s’enrichit grâce au développement de +librairies par la communauté. La plupart des extensions sont développées +et maintenues par la communauté des utilisateurs de R, et diffusées via +le CRAN +(Comprehensive R Archive Network). On peut également trouver des +packages déposés sur github par exemple.

+

A la première ouverture de RStudio sur les ordinateurs de salle TP, +un dossier R/libs est créé dans votre home +pour l’installation des librairies.

+

Pour installer une librairie disponible sur le CRAN, vous avez +plusieurs manières de le faire, dont

+
    +
  • passer par le menu Tools-> Install Packages ... , +sélectionner un site miroir du CRAN et demander la librairie +souhaitée
  • +
  • aller dans l’onglet Packages dans la fenêtre en bas à +droite et cliquer sur Install.
  • +
  • utiliser la fonction install.packages() directement +dans la console en précisant la librairie souhaitée
  • +
+

Toutes les librairies ne sont pas chargées automatiquement au +lancement de R. Pour charger une librairie, on utilise la commande +library().

+

+ +

+Exercice : +

+
+

+
+
    +
  1. Installez la librairie corrplot
  2. +
  3. Chargez la librairie corrplot
  4. +
+
+
+
+

1.3.3 L’aide de R

+

On peut à tout moment faire appel à l’aide intégrée de R (et surtout +avant d’appeler l’enseignant-e !) pour avoir les détails comme les +arguments d’une fonction. On peut accéder à l’aide pour une fonction (ex +pour la fonction plot) en passant le nom de la fonction dans +help() (ex > help(plot)) ou en utilisant le +raccourci > ?plot. Ces deux commandes permettent +d’afficher une page de description (en anglais) de la fonction, ses +paramètres, son résultat, d’exemples, … Dans RStudio, les pages d’aide +en ligne s’ouvriront par défaut dans la zone en bas à droite, sous +l’onglet Help. Un clic sur l’icône en forme de maison +vous affichera la page d’accueil de l’aide. Vous pouvez aussi taper +directement le nom de la fonction recherchée dans la zone de recherche +dans l’onglet Help.

+

+ +

+Exercice : +

+
+

+
+

Accédez à l’aide de la fonction rnorm

+
+
+
+
+

1.4 Editer des rapports +avec Rmarkdown

+

L’extension Rmarkdown permet de créer des +documents dans différents formats (html, pdf, docx, slides, …) qui +contiennent du texte, du code (en R mais pas que!), les résultats, … Par +exemple, les sujets de TP de ce cours sont rédigés en Rmarkdown.
+Vous devrez également rédiger le rapport de votre projet en Rmarkdown. +Nous allons donner ici des éléments de base pour la création de +documents avec Rmarkdown. Pour plus de détails, vous pouvez consulter +l’aide mémoire de Rmarkdown (accessible via +Help -> Cheatsheets -> Rmarkdown Cheat Sheet) et le +livre en ligne R Markdown: The Definitive Guide de Y. Xie, J. J. +Allaire, G. Grolemund.

+
+

1.4.1 Etapes de création +d’un document

+

Un document Rmarkdown est un fichier enregistré avec l’extension +.Rmd. Pour créer un nouveau document, allez dans +File-> NewFile-> Rmarkdown... (ou cliquez sur l’icone +nouveau document et choisissez Rmarkdown).

+

+ +

+Exercice : +

+
+

+
+

Créez un nouveau document Rmarkdown au format pdf avec le titre et +l’auteur de votre choix. Vous pouvez constater qu’un nouveau document +prérempli vient de s’ouvrir dans RStudio. Nous allons maintenant +détailler le contenu de ce document.

+
+

Un document Rmarkdown débute toujours par l’en-tête +qui est encadré par 3 tirets ---. Cet en-tête contient au +moins les métadonnées du document suivantes : le titre, l’auteur, la +date, le format de sortie (output). On peut préciser des +options au document final en ajoutant des sous-options à droite du +output. Il est également possible de spécifier des options +différentes selon les formats. Voici une liste avec quelques éléments +:

+
    +
  • number_section : true permet de numéroter les +sections
  • +
  • highlight permet de spécifier le style syntaxique (par +ex default, tango, pygments, +kate, …).
  • +
  • on peut ajouter son propre fichier de style .css avec l’option +css
  • +
  • on peut préciser des options concernant les figures avec +fig_width, fig_height, +fig_caption, dev, …
  • +
  • on peut ajouter une bibliographie à partir d’un fichier +.bib avec l’option bibliography
  • +
+

On a ensuite le corps du document qui peut contenir

+
    +
  • du texte selon la syntaxe markdown
  • +
  • des blocs de code (appelés chunks) en R, Python, …
  • +
  • des formules mathématiques (écrites en latex entre +$ ... $)
  • +
  • des images, tableaux, références, ….
  • +
+

Vous pouvez compiler à tout moment le document Rmarkdown en cliquant +sur le bouton Knit. Un onglet R Markdown s’ouvre alors dans +la même zone que l’onglet Console pour indiquer la progression +de la compilation et les messages d’erreur éventuels. Une fois la +compilation effectuée, le document obtenu s’ouvre et vous pouvez admirer +le rendu.

+

Remarque: Pour la compilation d’un document en pdf, +il est nécessaire d’avoir installé un compilateur de Latex sur son +ordinateur.

+

+ +

+Exercice : +

+
+

+
+

Modifiez les options dans l’en-tête de votre fichier Rmarkdown puis +compilez le document pour constater l’impact sur le document généré.

+
+
+
+

1.4.2 Quelques éléments +markdown

+

Le texte d’un document Rmarkdown est régi par le langage markdown. +Regardez les quelques éléments de syntaxe et de mise en forme disponible +ici ou consulter l’aide mémoire de Rmarkdown +(accessible via +Help -> Cheatsheets -> Rmarkdown Cheat Sheet).

+

Remarque: Si vous avez organisé votre document avec +des sections / sous-sections en faisant débuter une ligne par un ou +plusieurs #, alors vous pouvez cliquer sur l’icone +Outline à droite de la barre d’outils associée au fichier R +Markdown pour visualiser la table des matières générée automatiquement +qui vous permet de naviguer facilement dans le document.

+

Pour insérer du code dans un document Rmarkdown, on utilise des blocs +appelés chunk. Pour cela, il suffit de cliquer sur +l’icone d’insertion d’un chunk dans la barre d’outils d’un document +Rmarkdown. Il est possible d’insérer un chunk de code R mais pas +seulement (par exemple on peut insérer du code Python). Pour du code R, +un chunk de la forme \(\textrm{```{r} .... +```}\) s’insère alors dans le document. On peut alors saisir du +code R dans ce chunk. On peut ajouter un nom à un bloc et préciser des +options dans les accolades {r nomdubloc, ....}, par +exemple

+
    +
  • eval (TRUE par défaut, ou FALSE) : détermine si le code R doit être +évalué ou non,
  • +
  • echo (TRUE par défaut, ou FALSE) : détermine si le code R doit être +affiché ou non,
  • +
  • results (‘markup’ par défaut, ‘hide’, ‘hold’ ou ‘asis’) : détermine +comment les sorties doivent être affichées,
  • +
  • error (FALSE par défaut, ou TRUE) : détermine si les messages +d’erreur doivent être affichée,
  • +
  • warning (TRUE par défaut, ou FALSE) : détermine si les messages +d’avertissement doivent être affichées.
  • +
+

Ces options peuvent être modifiées manuellement ou en utilisant +l’interface graphique (en cliquant sur l’icone d’engrenage situé en haut +à droite de chaque bloc).

+

+ +

+Exercice : +

+
+

+
+
    +
  • Ajoutez # Titre 1 avant ## RMarkdown
  • +
  • Modifiez {r cars} en {r cars, eval=F}
  • +
  • Compilez le document pour voir les différences
  • +
+
+

De manière générale, il est recommandé de

+
    +
  • travailler dans le document R Markdown (en lançant balise R par +balise R, avec la petite flèche verte en haut à droite de chaque bloc, +ou en lançant la ligne de code contenant le curseur en tapant Ctrl +Enter),
  • +
  • commenter les résultats obtenus (en dehors des balises R) au fur et +à mesure,
  • +
  • ne compiler le document (Knit) qu’à la fin.
  • +
+

Pour la suite du TP, récupérez sur moodle le document +“TP1-InitR.Rmd”, sauvegardez-le dans votre dossier de travail et +ouvre-le dans RStudio. C’est le document .Rmd qui a généré cet énoncé de +TP et que vous allez compléter dans la suite.

+
+
+
+
+

2 Structure des objets en +R

+

Sous R, les éléments de base sont des objets : des données (vecteurs, +matrices, …), des fonctions, des graphiques, … Ces objets se +différencient par leur mode décrivant leur contenu, et leur classe +décrivant leur structure. Les classes d’objets les plus courantes sont : +vector, matrix, array, factor, data.frame, list. On +peut avoir des vecteurs, matrices, tableaux, … de mode +null (objet vide), logical (TRUE, +FALSE, NA), numeric, complex, +character. Par contre les listes et les tableaux +peuvent être composés d’éléments hétérogènes. On utilise la commande +class() pour connaître la classe d’un objet et +str()pour connaitre la nature des éléments composant +l’objet.

+

Nous allons dans ce TP présenter certains de ces objets, les +opérations et manipulations basiques que l’on peut faire, …

+

Remarque : On stocke un objet dans une variable a à l’aide +de a<- ... ou a= .... Pour lister les +variables actuellement disponibles dans la session de travail, on +utilise la fonction ls(). Pour effacer une ou plusieurs +variables, on utilise la fonction rm(). La commande +rm(list=ls()) permet d’effacer toutes les variables en +mémoire.

+
+

2.1 +Opération sur les scalaires

+
+

2.1.1 Opérations

+

Les opérations élémentaires sur les scalaires sont +*,-, +, /, +^.
+

+

Executez les commandes suivantes. Vous chercherez en particulier à +bien identifier les différents types de données :

+
2 + 2
+exp(10)
+a = log(2)
+a
+b = cos(10)
+b
+a - b
+a * b
+d <- 2 < 3
+d
+dd <- FALSE
+dd - d
+dd + d
+e <- "toto"
+class(e)
+str(e)
+
+
+

2.1.2 +is.xxx()/as.xxx()

+

Pour tester si un objet obj est de type xxx, on +utilise la commande is.xxx(obj). On peut aussi contraindre +si possible l’objet obj au type xxx avec la commande +as.xxx(obj).

+
a = 4.3
+is.numeric(a)
+
[1] TRUE
+
is.complex(a)
+
[1] FALSE
+
is.character(a)
+
[1] FALSE
+
as.character(a)
+
[1] "4.3"
+
b <- "toto"
+is.numeric(b)
+
[1] FALSE
+
as.list(b)
+
[[1]]
+[1] "toto"
+
+
+

2.1.3 Arrondir

+

Pour obtenir des valeurs arrondies sur des valeurs numériques, vous +pouvez utiliser l’une des commandes suivantes round(), +ceiling(), floor(), trunc() ou +signif() (voir l’aide ?round). Comparez les +codes suivantes:

+
a = 1.3579
+floor(a)
+
[1] 1
+
ceiling(a)
+
[1] 2
+
round(a, digits = 2)
+
[1] 1.36
+
signif(a, digits = 2)
+
[1] 1.4
+
is.integer(floor(a))
+
[1] FALSE
+
is.numeric(floor(a))
+
[1] TRUE
+
+
+
+

2.2 +Booléens et opérations logiques

+

En R, un booléen est représenté par TRUE ou FALSE. +Les opérations logiques, <, >, +<=, >=, != (différent), +== (égal) retournent TRUE ou FALSE. On +peut définir plusieurs conditions à remplir avec les opérateurs +& (ET) et | (OU).

+

Attention, R considère que le booléen FALSE vaut \(0\) et le booléen TRUE vaut \(1\). Il est donc capable d’évaluer +TRUE + 5 bien qu’en toute logique, cela n’a aucun sens!

+

Voici quelques exemples de manipulation des booléens pour comprendre +:

+
a = 3
+b = 6
+a <= b
+
[1] TRUE
+
a != b
+
[1] TRUE
+
(b - 3 == a) & (b >= a)
+
[1] TRUE
+
(b == a) | (b >= a)
+
[1] TRUE
+
+
+

2.3 +Vecteurs (vector)

+

Un vecteur est un ensemble ordonné d’éléments de même nature +(numérique, logique ou alphanumérique). La création d’un vecteur peut se +faire par la commande c(e1,e2,...). On peut également +générer une séquence avec la commande seq(a,b,t)\(a\) est le premier terme, le dernier terme +est \(\leq b\) et le pas est \(t\). Pour créer un vecteur constitué de +l’élément \(x\) répété \(n\) fois, on utilise la commande +rep(x,n).

+

On donne ici quelques exemples à tester sous R pour vous familiariser +avec les vecteurs. En particulier, vous pouvez découvrir des fonctions +utiles avec les vecteurs comme length(), +sum(), sort(), … , les opérations usuelles, +l’extraction d’éléments d’un vecteur, …

+
+

2.3.1 Commande +c(...)

+
d <- c(2, 3, 5, 8, 4, 6)
+d
+
[1] 2 3 5 8 4 6
+
is.vector(d)
+
[1] TRUE
+
c(2, 5, "toto")
+
[1] "2"    "5"    "toto"
+
1:10
+
 [1]  1  2  3  4  5  6  7  8  9 10
+
+
+

2.3.2 Commande +seq(...)

+
seq(1, 10)
+
 [1]  1  2  3  4  5  6  7  8  9 10
+
seq(from = 1, to = 20, by = 2)
+
 [1]  1  3  5  7  9 11 13 15 17 19
+
seq(1, 20, by = 5)
+
[1]  1  6 11 16
+
seq(1, 20, length = 5)
+
[1]  1.00  5.75 10.50 15.25 20.00
+
+
+

2.3.3 Commande +rep(...)

+
rep(5, times = 10)
+
 [1] 5 5 5 5 5 5 5 5 5 5
+
rep(c(1, 2), 3)
+
[1] 1 2 1 2 1 2
+
rep(c(1, 2), each = 3)
+
[1] 1 1 1 2 2 2
+
+
+

2.3.4 Extraire des +éléments

+
d
+
[1] 2 3 5 8 4 6
+
d[2]
+
[1] 3
+
d[2:3]
+
[1] 3 5
+
d[c(1, 3, 6)]
+
[1] 2 5 6
+
d[-3]
+
[1] 2 3 8 4 6
+
d[-(1:2)]
+
[1] 5 8 4 6
+
+
+

2.3.5 Opérations

+

Additionner ou soustraire un scalaire d’un vecteur

+
d + 4
+
[1]  6  7  9 12  8 10
+
d - 4
+
[1] -2 -1  1  4  0  2
+

Multiplier ou diviser un vecteur par un scalaire

+
2 * d
+
[1]  4  6 10 16  8 12
+
d/3
+
[1] 0.6666667 1.0000000 1.6666667 2.6666667 1.3333333 2.0000000
+

Multiplier/ diviser deux vecteurs terme à terme

+
e <- rep(2, 6)
+d * e
+
[1]  4  6 10 16  8 12
+
d/e
+
[1] 1.0 1.5 2.5 4.0 2.0 3.0
+
+
+

2.3.6 Fonctions +usuelles

+
d = c(2, 3, 5, 8, 4, 6)
+d
+
[1] 2 3 5 8 4 6
+

Longueur d’un vecteur

+
length(d)
+
[1] 6
+

Somme des termes d’un vecteur numérique

+
sum(d)
+
[1] 28
+

Somme des termes cumulés d’un vecteur numérique

+
cumsum(d)
+
[1]  2  5 10 18 22 28
+

Différence des termes successifs d’un vecteur numérique

+
diff(d)
+
[1]  1  2  3 -4  2
+

Vérifier si d est un vecteur

+
is.vector(d)
+
[1] TRUE
+

Autres fonctions intéressantes avec les vecteurs : +abs(), sort(), order(), +which(), …

+
a <- c(3, -1, 5, 2, -7, 3, 9)
+abs(a)
+
[1] 3 1 5 2 7 3 9
+
sort(a)
+
[1] -7 -1  2  3  3  5  9
+
order(a)
+
[1] 5 2 4 1 6 3 7
+
which(a < 0)
+
[1] 2 5
+

On peut appliquer une fonction à tous les éléments d’un vecteur +facilement.

+
cos(a)
+
[1] -0.9899925  0.5403023  0.2836622 -0.4161468  0.7539023 -0.9899925 -0.9111303
+
+
+

2.3.7 Exercice

+
+

Construire

+
    +
  • le vecteur \(a\) constitué des +entiers pairs jusqu’à 30
  • +
  • le vecteur \(b\) contenant 6 +chiffres compris entre 4 et 30 avec un intervalle constant.
  • +
  • le vecteur \(c\) contenant la somme +des éléments de \(b\), la longueur de +\(a\) et 5 fois le chiffre 3.
  • +
+

Extraire du vecteur \(c\) le

+
    +
  • le quatrième élément
  • +
  • tous les éléments sauf le quatrième
  • +
  • tous les éléments supérieurs à 10
  • +
+
+
# A COMPLETER POUR REPONDRE A L'EXERCICE
+
+
+
+

2.4 +Matrices (matrix)

+

Comme les vecteurs, les matrices sont de mode quelconque mais ne +contiennent que des éléments de même nature. Pour créer une matrice, on +utilise la commande matrix(vec,nrow=n,ncol=p) où +vec est le vecteur contenant les éléments de la matrice de +taille \(n\) par \(p\), qui seront rangés en colonne sauf si +l’option byrow=T est utilisée.

+

On donne ici quelques exemples à tester sous R pour vous familiariser +avec les matrices. En particulier, vous pouvez découvrir des fonctions +utiles avec les matrices comme dim(), t(), +cbind(), rbind()… , les opérations usuelles +dont la différence entre A*B et A%*%B, +l’extraction d’éléments d’une matrice, …

+
+

2.4.1 +matrix()

+
A = matrix(1:15, ncol = 5)
+A
+
     [,1] [,2] [,3] [,4] [,5]
+[1,]    1    4    7   10   13
+[2,]    2    5    8   11   14
+[3,]    3    6    9   12   15
+
B = matrix(1:15, nc = 5, byrow = T)
+B2 = B
+B2[1, 1] = "toto"
+B2
+
     [,1]   [,2] [,3] [,4] [,5]
+[1,] "toto" "2"  "3"  "4"  "5" 
+[2,] "6"    "7"  "8"  "9"  "10"
+[3,] "11"   "12" "13" "14" "15"
+
rownames(A) = c(paste("ligne", 1:3, sep = ""))
+A
+
       [,1] [,2] [,3] [,4] [,5]
+ligne1    1    4    7   10   13
+ligne2    2    5    8   11   14
+ligne3    3    6    9   12   15
+
+
+

2.4.2 Extraire

+
A
+
       [,1] [,2] [,3] [,4] [,5]
+ligne1    1    4    7   10   13
+ligne2    2    5    8   11   14
+ligne3    3    6    9   12   15
+
A[1, 3]
+
ligne1 
+     7 
+
A[, 2]
+
ligne1 ligne2 ligne3 
+     4      5      6 
+
A[2, ]
+
[1]  2  5  8 11 14
+
A[1:3, c(2, 5)]
+
       [,1] [,2]
+ligne1    4   13
+ligne2    5   14
+ligne3    6   15
+
A[1:3, -c(2, 5)]
+
       [,1] [,2] [,3]
+ligne1    1    7   10
+ligne2    2    8   11
+ligne3    3    9   12
+
+
+

2.4.3 +cbind() / rbind()

+

Pour concaténer deux matrices, on peut utiliser les fonctions +rbind() ou cbind().

+
A
+
       [,1] [,2] [,3] [,4] [,5]
+ligne1    1    4    7   10   13
+ligne2    2    5    8   11   14
+ligne3    3    6    9   12   15
+
B
+
     [,1] [,2] [,3] [,4] [,5]
+[1,]    1    2    3    4    5
+[2,]    6    7    8    9   10
+[3,]   11   12   13   14   15
+
cbind(A, B)
+
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
+ligne1    1    4    7   10   13    1    2    3    4     5
+ligne2    2    5    8   11   14    6    7    8    9    10
+ligne3    3    6    9   12   15   11   12   13   14    15
+
rbind(A, B)
+
       [,1] [,2] [,3] [,4] [,5]
+ligne1    1    4    7   10   13
+ligne2    2    5    8   11   14
+ligne3    3    6    9   12   15
+          1    2    3    4    5
+          6    7    8    9   10
+         11   12   13   14   15
+
+
+

2.4.4 Fonctions +utiles

+

Dimension d’une matrice

+
dim(A)
+
[1] 3 5
+

Nombre de lignes et de colonnes

+
nrow(A)
+
[1] 3
+
ncol(A)
+
[1] 5
+

Transposée et déterminant d’une matrice

+
t(A)
+
     ligne1 ligne2 ligne3
+[1,]      1      2      3
+[2,]      4      5      6
+[3,]      7      8      9
+[4,]     10     11     12
+[5,]     13     14     15
+
det(A[, 3:5])
+
[1] 0
+

Matrice diagonale et diagonale d’une matrice

+
diag(A)
+
[1] 1 5 9
+
diag(1:5)
+
     [,1] [,2] [,3] [,4] [,5]
+[1,]    1    0    0    0    0
+[2,]    0    2    0    0    0
+[3,]    0    0    3    0    0
+[4,]    0    0    0    4    0
+[5,]    0    0    0    0    5
+

Matrice de booléens

+
A > 5
+
        [,1]  [,2] [,3] [,4] [,5]
+ligne1 FALSE FALSE TRUE TRUE TRUE
+ligne2 FALSE FALSE TRUE TRUE TRUE
+ligne3 FALSE  TRUE TRUE TRUE TRUE
+
A[A < 5] <- 0
+A
+
       [,1] [,2] [,3] [,4] [,5]
+ligne1    0    0    7   10   13
+ligne2    0    5    8   11   14
+ligne3    0    6    9   12   15
+

Quelques autres fonctions sur les matrices

+
colSums(A)
+
[1]  0 11 24 33 42
+
apply(A, 2, sum)
+
[1]  0 11 24 33 42
+
rowSums(A)
+
ligne1 ligne2 ligne3 
+    30     38     42 
+
apply(A, 1, sum)
+
ligne1 ligne2 ligne3 
+    30     38     42 
+
rowMeans(A)
+
ligne1 ligne2 ligne3 
+   6.0    7.6    8.4 
+
apply(A, 1, mean)
+
ligne1 ligne2 ligne3 
+   6.0    7.6    8.4 
+
apply(A, 1, max)
+
ligne1 ligne2 ligne3 
+    13     14     15 
+

Remarque : on reverra dans la section Programmation la fonction apply() qui +permet en particulier d’éviter les boucles for.
+

+
+
+

2.4.5 Opérations

+

Attention à la multiplication matricielle %*% et la +multiplication terme à terme *!

+

Opérations terme à terme de 2 matrices

+
A + B
+
       [,1] [,2] [,3] [,4] [,5]
+ligne1    1    2   10   14   18
+ligne2    6   12   16   20   24
+ligne3   11   18   22   26   30
+
A * B
+
       [,1] [,2] [,3] [,4] [,5]
+ligne1    0    0   21   40   65
+ligne2    0   35   64   99  140
+ligne3    0   72  117  168  225
+

Multiplication de matrices

+
t(B) %*% A
+
     [,1] [,2] [,3] [,4] [,5]
+[1,]    0   96  154  208  262
+[2,]    0  107  178  241  304
+[3,]    0  118  202  274  346
+[4,]    0  129  226  307  388
+[5,]    0  140  250  340  430
+

Multiplication par un scalaire

+
5 * A
+
       [,1] [,2] [,3] [,4] [,5]
+ligne1    0    0   35   50   65
+ligne2    0   25   40   55   70
+ligne3    0   30   45   60   75
+
+
+

2.4.6 Exercice

+
+
    +
  1. Créer la matrice \(A=\left(\begin{array}{c +c c } 3 & 3 & 3\\ 4 & 4 & 4\\ 5 & 5 & +5\end{array}\right).\)
  2. +
  3. Ajouter 2 à tous les éléments de \(A\).
  4. +
  5. Créer la matrice \(B\) en ajoutant +la ligne \((1,2,3)\) à \(A\), puis la colonne \((1,1,1,1)'\). Déterminer la dimension +de \(B\).
  6. +
  7. Extraire de \(B\) la sous-matrice +\(C\) composée des deux premières +colonnes et des deux dernières lignes. Calculer la transposée et le +déterminant de \(C\).
  8. +
+
+
# A COMPLETER POUR REPONDRE A L'EXERCICE
+
+
+
+

2.5 Listes +(list)

+

Une liste est une collection ordonnée d’objets qui peuvent être de +nature différente. Les listes sont en particulier utilisées par +certaines fonctions (cf section Programmation) +pour renvoyer des résultats complexes sous forme d’un seul objet. On +utilise la fonction list(nom1=el1,nom2=el2,...) +(l’utilisation des noms étant facultative) pour générer une liste. On +peut accéder à chaque élément de la liste à l’aide de son index entre +double crochets [[...]], ou par son nom précédé du signe +$.

+
+

2.5.1 +list(...)

+
x = list("toto", 1:8)
+x
+
[[1]]
+[1] "toto"
+
+[[2]]
+[1] 1 2 3 4 5 6 7 8
+

Création d’une liste avec des noms aux éléments

+
y = list(matrice = matrix(1:15, ncol = 5), vecteur = seq(1, 20, by = 5), texte = "toto",
+    scalaire = 8)
+y
+
$matrice
+     [,1] [,2] [,3] [,4] [,5]
+[1,]    1    4    7   10   13
+[2,]    2    5    8   11   14
+[3,]    3    6    9   12   15
+
+$vecteur
+[1]  1  6 11 16
+
+$texte
+[1] "toto"
+
+$scalaire
+[1] 8
+
+
+

2.5.2 Extraction

+

Extraction d’un élément par son numéro

+
x[[1]]
+
[1] "toto"
+

Attention, cette commande n’est pas possible:

+
x[[1]] + 1
+

par contre celle-ci est possible

+
x[[2]] + 10
+
[1] 11 12 13 14 15 16 17 18
+
y[[1]]
+
     [,1] [,2] [,3] [,4] [,5]
+[1,]    1    4    7   10   13
+[2,]    2    5    8   11   14
+[3,]    3    6    9   12   15
+
y$matrice
+
     [,1] [,2] [,3] [,4] [,5]
+[1,]    1    4    7   10   13
+[2,]    2    5    8   11   14
+[3,]    3    6    9   12   15
+
y$vec
+
[1]  1  6 11 16
+
y[c("texte", "scalaire")]
+
$texte
+[1] "toto"
+
+$scalaire
+[1] 8
+
+
+

2.5.3 Fonctions +utiles

+
names(y)
+
[1] "matrice"  "vecteur"  "texte"    "scalaire"
+
length(y)
+
[1] 4
+
length(y$vecteur)
+
[1] 4
+
cos(y$scal) + y[[2]][1]
+
[1] 0.8545
+
summary(y)
+
         Length Class  Mode     
+matrice  15     -none- numeric  
+vecteur   4     -none- numeric  
+texte     1     -none- character
+scalaire  1     -none- numeric  
+
+
+

2.5.4 Exercice

+
+
    +
  1. Créer une liste contenant le nom de trois matières, les notes de 5 +élèves pour chacune de ces matières, l’âge des 5 élèves et la filière +(PO) d’appartenance de ces 5 élèves.
  2. +
  3. Récupérer les notes du 4ème élève
  4. +
  5. Créer une matrice contenant les notes et l’âge des 5 élèves.
  6. +
+
+
# A COMPLETER POUR REPONDRE A L'EXERCICE
+
+
+
+

2.6 Data +frames

+

Sous R, un data.frame est analogue à une matrice mais le contenu des +colonnes peut être ici hétérogène. Un tableau de données est un ensemble +de vecteurs rangés colonne par colonne, chaque colonne correspondant à +une variable, chaque ligne à un individu. En particulier, lors d’études +statistiques, les données à étudier sont souvent représentées par un +data.frame sous R. Pour créer un tableau de données, on peut regrouper +des variables de même longueur à l’aide de la commande +data.frame(nom1=var1,nom2=var2,...). On peut par exemple +transformer une matrice en un tableau de données en utilisant la +commande as.data.frame(mat).

+

On donne ici quelques exemples à tester sous R pour vous familiariser +avec les data.frames. En particulier, vous pouvez découvrir des +fonctions utiles dont summary() et head().

+
+

2.6.1 +data.frame()

+
# Création du data.frame H
+taille = runif(12, 150, 180)
+masse = runif(12, 50, 90)
+sexe = rep(c("M", "F", "F", "M"), 3)
+H = data.frame(taille, masse, sexe)
+H
+
     taille    masse sexe
+1  159.1421 66.88895    M
+2  174.3444 69.15921    F
+3  171.4166 67.13989    F
+4  176.8689 63.04042    M
+5  171.3922 81.89926    M
+6  165.7481 87.59690    F
+7  152.4223 76.71279    F
+8  168.1355 57.94457    M
+9  153.0398 71.91566    M
+10 178.3689 65.47261    F
+11 153.0043 68.86331    F
+12 174.3904 53.54047    M
+
class(H)
+
[1] "data.frame"
+
+
+

2.6.2 +summary()/head()

+

La fonction summary() permet de résumer le contenu des +différentes colonnes d’un data.frame.

+
summary(H)
+
     taille          masse           sexe          
+ Min.   :152.4   Min.   :53.54   Length:12         
+ 1st Qu.:157.6   1st Qu.:64.86   Class :character  
+ Median :169.8   Median :68.00   Mode  :character  
+ Mean   :166.5   Mean   :69.18                     
+ 3rd Qu.:174.4   3rd Qu.:73.11                     
+ Max.   :178.4   Max.   :87.60                     
+

La fonction head() permet de visualiser les premières +lignes d’un data.frame

+
head(H)
+
    taille    masse sexe
+1 159.1421 66.88895    M
+2 174.3444 69.15921    F
+3 171.4166 67.13989    F
+4 176.8689 63.04042    M
+5 171.3922 81.89926    M
+6 165.7481 87.59690    F
+
+
+

2.6.3 data.frame / +list/matrix

+

Au travers de ces quelques commandes, vous pouvez voir les analogies +entre data.frame, list et matrix mais restez prudent sur la nature de +l’objet que vous manipulez!

+
H[1, ]
+
    taille    masse sexe
+1 159.1421 66.88895    M
+
H$taille
+
 [1] 159.1421 174.3444 171.4166 176.8689 171.3922 165.7481 152.4223 168.1355
+ [9] 153.0398 178.3689 153.0043 174.3904
+
H$sexe
+
 [1] "M" "F" "F" "M" "M" "F" "F" "M" "M" "F" "F" "M"
+
is.data.frame(H)
+
[1] TRUE
+
is.matrix(H)
+
[1] FALSE
+
MH = as.matrix(H)
+MH
+
      taille     masse      sexe
+ [1,] "159.1421" "66.88895" "M" 
+ [2,] "174.3444" "69.15921" "F" 
+ [3,] "171.4166" "67.13989" "F" 
+ [4,] "176.8689" "63.04042" "M" 
+ [5,] "171.3922" "81.89926" "M" 
+ [6,] "165.7481" "87.59690" "F" 
+ [7,] "152.4223" "76.71279" "F" 
+ [8,] "168.1355" "57.94457" "M" 
+ [9,] "153.0398" "71.91566" "M" 
+[10,] "178.3689" "65.47261" "F" 
+[11,] "153.0043" "68.86331" "F" 
+[12,] "174.3904" "53.54047" "M" 
+
summary(MH)
+
    taille             masse               sexe          
+ Length:12          Length:12          Length:12         
+ Class :character   Class :character   Class :character  
+ Mode  :character   Mode  :character   Mode  :character  
+
as.list(H)
+
$taille
+ [1] 159.1421 174.3444 171.4166 176.8689 171.3922 165.7481 152.4223 168.1355
+ [9] 153.0398 178.3689 153.0043 174.3904
+
+$masse
+ [1] 66.88895 69.15921 67.13989 63.04042 81.89926 87.59690 76.71279 57.94457
+ [9] 71.91566 65.47261 68.86331 53.54047
+
+$sexe
+ [1] "M" "F" "F" "M" "M" "F" "F" "M" "M" "F" "F" "M"
+
+
+

2.6.4 Exercice

+
+

On reprend le data.frame \(H\).

+
    +
  1. Extraire la masse des individus dont la taille est supérieure à +160.
  2. +
  3. Extraire la masse et le sexe de ces mêmes individus.
  4. +
  5. Extraire la taille des individus de sexe masculin dont la masse est +inférieure à 80 (c’est possible en une seule ligne avec +&).
  6. +
+
+
# A COMPLETER POUR REPONDRE A L'EXERCICE
+
+
+
+
+

3 Les graphiques avec +R

+

R contient de base des fonctions dédiées aux graphiques. Les +fonctions graphiques principales comme plot() ouvrent une +nouvelle fenêtre à l’execution. Les fonctions graphiques secondaires +permettent d’ajouter des éléments à un graphique. Une présentation +succinte des graphiques de base avec R est disponible ici (tutoriel “Premiers Graphiques”).

+

Maintenant il est plus usuel d’utiliser la librairie +ggplot2 pour faire des graphiques sous R. On découvrira les +graphiques avec ggplot dans le TP2.

+
+
+

4 Programmation avec +R

+

Cette partie est consacrée à la création des fonctions, les +instructions de contrôle, la syntaxe des itérations et la fonction +apply() (et ses dérivées).

+
+

4.1 Créer une +fonction

+

Il est possible sous R de construire ses propres fonctions. De +manière générale, la définition d’une nouvelle fonction passe par +l’expression suivante :

+
nomfonction=function(arg1[=exp1],arg2[=exp2],...){
+    bloc d instructions
+    sortie = ...
+    return(sortie)
+}
+

Les accolades signalent le début et la fin du code source de la +fonction, les crochets indiquent le caractère facultatif des valeurs par +défaut des arguments. L’objet sortie contient le ou les +résultats retournés par la fonction, on peut en particulier utiliser une +liste pour retourner plusieurs résultats.

+

Voici quelques exemples :

+
MaFonction = function(x) {
+    x + 2
+}
+MaFonction(3)
+
[1] 5
+
Fonction2 = function(a, b = 7) {
+    a + b
+}
+Fonction2(2, b = 3)
+
[1] 5
+
Fonction2(5)
+
[1] 12
+

Fonction retournant le périmètre et la surface d’un cercle à partir +de son rayon :

+
CalculsCercle = function(r) {
+    p = 2 * pi * r
+    s = pi * r * r
+    resultats = list(perimetre = p, surface = s)
+    return(resultats)
+}
+res = CalculsCercle(3)
+res
+
$perimetre
+[1] 18.84956
+
+$surface
+[1] 28.27433
+
res$surf
+
[1] 28.27433
+
+
+

4.2 Structures de +contrôle et itérations

+
+

4.2.1 Instructions +conditionnelles

+

La syntaxe if(condition){instructions} permet de +calculer les instructions uniquement si la condition est vraie. Le code +if(condition){ A }else { B } calcule les instructions A si +la condition est vraie et les instructions B sinon. On peut également +utiliser ifelse.

+

Dans l’exemple suivant, les deux commandes sont équivalentes :

+
if (x > 0) {
+    y = x * log(x)
+} else {
+    y = 0
+}
+y = ifelse(x > 0, x * log(x), 0)
+
+
+

4.2.2 Itérations

+

On utilise les boucles pour exécuter plusieurs fois une instruction +ou un bloc d’instructions. Les trois types de boucle sont :

+
    +
  • la boucle for : +for(var in seq){ commandes }
  • +
  • la boucle while : +while(cond){ commandes }
  • +
  • la boucle repeat : +repeat { commandes ; if (cond) break }
  • +
+

Pour illustrer les trois types de boucles, on a codé de trois façons +différentes la somme des éléments d’un vecteur x ce qui +correspond à la fonction sum() de R.

+
# Exemple boucle for
+somme1 = function(x) {
+    t = 0
+    for (i in 1:length(x)) {
+        t = t + x[i]
+    }
+    return(t)
+}
+
+x = seq(1:10)
+somme1(x)
+
[1] 55
+
sum(x)
+
[1] 55
+
# Exemple boucle while
+somme2 = function(x) {
+    t = 0
+    i = 1
+    while (i <= length(x)) {
+        t = t + x[i]
+        i = i + 1
+    }
+    return(t)
+}
+somme2(x)
+
[1] 55
+
# Exemple repeat
+somme3 = function(x) {
+    t = 0
+    i = 1
+    repeat {
+        t = t + x[i]
+        i = i + 1
+        if (i > length(x))
+            break
+    }
+    return(t)
+}
+somme3(x)
+
[1] 55
+

+ +

+Exercice : +

+
+

+
+
    +
  1. Écrire une fonction ma.var qui calcule la variance +empirique corrigée pour un vecteur \(x = (x_1, +. . . , x_n)\). Quelle est la variance de la variable “Taille” +dans le data.frame \(H\) ? Comparez +avec la fonction prédéfinie var().
  2. +
  3. Écrire une fonction qui calcule les \(n\) premiers termes de la suite de +Fibonacci (\(u_1=0, u_2=1, \forall n>2, +u_n=u_{n-1}+u_{n-2}\))
  4. +
+
+
# A COMPLETER POUR REPONDRE A L'EXERCICE
+
+
+
+

4.3 apply() +et ses variantes

+

Il est recommandé d’éviter les boucles très chronophages. On peut +utiliser pour cela la fonction apply() et ses variantes +sapply(), lapply(), tapply() sur +des vecteurs ou matrices.

+

La fonction apply() permet d’appliquer la même fonction +FUN sur toutes les lignes (MARGIN=1) ou les colonnes +(MARGIN=2) d’une matrice MAT : +apply(MAT , MARGIN, FUN).

+

Les fonctions lapply() et sapply() +calculent la même fonction sur tous les éléments d’un vecteur ou d’une +liste. La commande lapply(X,FUN, ARG.COMMUN) permet +d’appliquer la fonction FUN à tous les éléments du vecteur ou +de la liste X. Les valeurs de X sont affectées au +premier argument de la fonction FUN. Si la fonction +FUN a plusieurs paramètres d’entrée, ils sont spécifiés dans +ARG.COMMUN. Cette fonction retourne le résultat sous la forme +de listes. sapply() est une fonction similaire à +lapply() mais le résultat est retourné sous forme de +vecteurs, si possible.

+

La fonction tapply() applique une fonction FUN +sur les sous-groupes d’un vecteur X définis par une variable de +type factor GRP : tapply(X,GRP,FUN,...).

+

Voici quelques exemples :

+
data(iris)
+head(iris)
+
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
+1          5.1         3.5          1.4         0.2  setosa
+2          4.9         3.0          1.4         0.2  setosa
+3          4.7         3.2          1.3         0.2  setosa
+4          4.6         3.1          1.5         0.2  setosa
+5          5.0         3.6          1.4         0.2  setosa
+6          5.4         3.9          1.7         0.4  setosa
+
apply(iris[, 1:4], 2, sum)
+
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
+       876.5        458.6        563.7        179.9 
+
apply(iris[, 1:4], 1, sum)
+
  [1] 10.2  9.5  9.4  9.4 10.2 11.4  9.7 10.1  8.9  9.6 10.8 10.0  9.3  8.5 11.2
+ [16] 12.0 11.0 10.3 11.5 10.7 10.7 10.7  9.4 10.6 10.3  9.8 10.4 10.4 10.2  9.7
+ [31]  9.7 10.7 10.9 11.3  9.7  9.6 10.5 10.0  8.9 10.2 10.1  8.4  9.1 10.7 11.2
+ [46]  9.5 10.7  9.4 10.7  9.9 16.3 15.6 16.4 13.1 15.4 14.3 15.9 11.6 15.4 13.2
+ [61] 11.5 14.6 13.2 15.1 13.4 15.6 14.6 13.6 14.4 13.1 15.7 14.2 15.2 14.8 14.9
+ [76] 15.4 15.8 16.4 14.9 12.8 12.8 12.6 13.6 15.4 14.4 15.5 16.0 14.3 14.0 13.3
+ [91] 13.7 15.1 13.6 11.6 13.8 14.1 14.1 14.7 11.7 13.9 18.1 15.5 18.1 16.6 17.5
+[106] 19.3 13.6 18.3 16.8 19.4 16.8 16.3 17.4 15.2 16.1 17.2 16.8 20.4 19.5 14.7
+[121] 18.1 15.3 19.2 15.7 17.8 18.2 15.6 15.8 16.9 17.6 18.2 20.1 17.0 15.7 15.7
+[136] 19.1 17.7 16.8 15.6 17.5 17.8 17.4 15.5 18.2 18.2 17.2 15.7 16.7 17.3 15.8
+
lapply(iris[, 1:4], sum)
+
$Sepal.Length
+[1] 876.5
+
+$Sepal.Width
+[1] 458.6
+
+$Petal.Length
+[1] 563.7
+
+$Petal.Width
+[1] 179.9
+
sapply(iris[, 1:4], sum)
+
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
+       876.5        458.6        563.7        179.9 
+
tapply(iris[, 1], iris[, 5], sum)
+
    setosa versicolor  virginica 
+     250.3      296.8      329.4 
+

+ +

+Exercice : +

+
+

+

Soit la fonction suivante :

+
Exo1 = function(M) {
+    res = rep(0, 5)
+    for (i in 1:5) {
+        tmp = 0
+        for (j in 1:4) {
+            tmp = tmp + M[i, j]
+        }
+        res[i] = tmp
+    }
+    return(res)
+}
+
+M = matrix(1:20, nrow = 5, ncol = 4)
+Exo1(M)
+
+

Proposez une fonction équivalente sans aucune boucle.

+
+
# A COMPLETER
+
+
+
+

5 Lois de probabilité +sous R

+

Le logiciel R permet d’effectuer des calculs avec toutes les lois de +probabilité usuelles, et aussi de simuler des échantillons issus de ces +lois. Pour chaque distribution, quatre commandes préfixées par une des +lettres d, p, q, +r et suivi du nom de la distribution +(nomdist) sont disponibles :

+
    +
  • dnomdist : fonction de densité \(f_X(.)\) pour une loi continue ou fonction +de probabilité \(\mathbb P(X=k)\) pour +une loi discrète
  • +
  • pnomdist : fonction de répartition \(F_X(.)=\mathbb P(X\leq .)\)𝐹
  • +
  • qnomdist : quantiles
  • +
  • rnomdist : génère des réalisations aléatoires indépendantes de la +distribution nomdist.
  • +
+

Voici une liste non exhaustive de lois de probabilité disponibles +:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Loinomdist
Gaussiennenorm
Binomialebinom
Poissonpois
Uniforme continueunif
Exponentielleexp
Studentt
Khi-deuxchisq
Fisherf
+

+ +

+Exercice : +

+
+

+
+

Simulez un échantillon de \(n=1000\) +variables aléatoires gaussiennes de moyenne \(10\) et de variance \(4\) Calculez la moyenne et la variance de +l’échantillon.

+
+
# A COMPLETER
+
+
+

6 Entrée / Sortie

+
+

6.1 Importation d’un jeu +de données

+

Pour importer un tableau de données contenu dans un fichier en un +data.frame, on utilise la fonction read.table(). Par +exemple, pour un fichier nommé “Tableau.txt”, on utilisera la commande +Tab1 <- read.table("Tableau.txt") qui crée un data.frame +Tab1. La commande read.table() admet des options dont

+
    +
  • header : indique si la première ligne contient des noms +de variables. Par défaut, la valeur de cette option est FALSE.
  • +
  • sep : précise le séparateur de champ dans le fichier +entre guillemets (” ” par défaut).
  • +
  • dec : le caractère utilisé pour les décimales (“.” par +défaut).
  • +
+

Les fonctions read.csv() et read.csv2() +sont utilisées pour la lecture de fichiers de données au format +.csv.

+
+
+

6.2 Exportation

+
+

6.2.1 Exportation en un +fichier de données

+

Si maintenant on désire sauvegarder un jeu de données, on utilise la +commande write.table(). Les principales options de cette +fonction sont :

+
    +
  • file : nom du fichier dans lequel écrire (vérifier le +répertoire courant)
  • +
  • append : prend une valeur logique. Si TRUE, R ajoute +les données dans le fichier concerné sans effacer les précédentes. La +valeur par défaut est FALSE.
  • +
  • sep : précise le séparateur à utiliser.
  • +
  • dec : précise le caractère à utiliser pour les +décimales.
  • +
+

+ +

+Exercice : +

+
+

+
+

Chargez le jeu de données +ìrisdisponible dans R avec la commandedata(iris) +Sauvegardez le jeu de données dans un fichier intitulé +SauvIris.txt avec des “;” pour séparateurs. Importez les +données du fichier SauvIris.txt

+
+
# A COMPLETER
+
+
+

6.2.2 Sauvegarde d’un / +des objets R

+

R permet d’enregistrer des objets entiers, en conservant à la fois +les données contenues dans les objets et les structures des objets.

+

La fonction save.image() peut être utilisée à tout +moment pour enregistrer une image de session, c’est à dire l’ensemble +des objets dans l’environnement de travail d’une session R. La +sauvegarde d’une image de la session vous est également proposée lors de +la fermeture de R.

+

La fonction save() permet d’enregistrer spécifiquement +un ou des objets dans un fichier de format .RData. Ce fichier peut être +à tout moment rechargé sous R avec la fonction load(). +Voici un exemple :

+
x <- runif(20)
+y <- list(a = 1, b = TRUE, c = "oops")
+save(x, y, file = "xy.RData")
+load("xy.RData")
+

On peut aussi enregistrer un seul objet, sans inclure le nom de +l’objet, à l’aide de la fonction saveRDS(). L’objet, +sauvegardé au format .rds peut être rechargé avec la +fonction readRDS().

+
+
+
+ + + +
+
+ +
+ + + + + + + + + + + + + + + + diff --git a/INSA/TP anadon/TP2-StatDesc.Rmd b/INSA/TP anadon/TP2-StatDesc.Rmd new file mode 100644 index 0000000..c62e322 --- /dev/null +++ b/INSA/TP anadon/TP2-StatDesc.Rmd @@ -0,0 +1,458 @@ +--- +title: "TP2 - Statistique Descriptive" +date: "3MIC - 2024-2025" +output: + pdf_document: + toc: true + toc_depth: '4' + html_document: + toc: true + toc_float: true + toc_depth: 4 + number_sections: true +--- + +```{css,echo=F} +.badCode { +background-color: #C9DDE4; +} + +.corrO { background-color: rgb(255,238,237); } +.corrS { background-color: pink; color: black; border: 1px solid red; } +``` + +```{r setup, echo=FALSE, cache=FALSE} +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=TRUE, + cache=FALSE, + prompt=FALSE, + tidy=TRUE, + comment=NA, + message=FALSE, + warning=FALSE, + class.source="badCode") +opts_knit$set(width=75) +``` + +```{r,echo=F, error=F,warning=F} +library(corrplot) +library(ggplot2) +library(gridExtra) +library(forcats) +library(reshape2) +library(BioStatR) + + +``` + +Ce TP a pour objectif de mener l'étude descriptive uni- et bi-dimensionnelle +du jeu de données `wine` disponible sous Moodle. Vous rédigerez les réponses +et vos observations dans le script .Rmd du TP au fur et à mesure. Vous pourrez compiler votre script à la fin du TP pour obtenir un compte-rendu du TP. + +*Remarque : pensez à enlever les "eval=F" au fur et à mesure de l'avancement dans le TP pour avoir les résultats dans votre compte-rendu final de TP.* + +# Données + +On va étudier le jeu de données **wine** disponible sur la page moodle du cours. Commencez par récupérer ce jeu de données et sauvegardez le fichier dans votre dossier de travail. + +Le jeu de données **wine ** comprend des mesures physico-chimiques réalisées sur un échantillon de *$600$ *vins (rouges et blancs) du Portugal. Ces mesures sont complétées par une évaluation sensorielle de la qualité par un ensemble d’experts. Chaque vin est décrit par les variables suivantes : + ++ *Qualite* : son évaluation sensorielle par les experts ("bad","medium","good"), ++ *Type* : son type (1 pour un vin rouge, 0 pour un vin blanc), ++ *AcidVol* : la teneur en acide volatile (en g/dm3 d’acide acétique), ++ *AcidCitr* : la teneur en acide citrique (en g/dm3), ++ *SO2lbr* : le dosage du dioxyde de soufre libre (en mg/dm3), ++ *SO2tot* : le dosage du dioxyde de soufre total (en mg/dm3), ++ *Densite* : la densité (en g/cm3), ++ *Alcool* : le degré d’alcool (en % Vol.). + +Dans un premier temps, commencez par charger le jeu de données à l'aide de la fonction `read.table()`. + +```{r} +wine <- read.table("wine.txt",header=TRUE) +``` + +Vous pouvez voir les premières lignes du jeu de données à l'aide de la fonction `head()` + +```{r} +head(wine) +``` + +**Question :** Contrôlez la dimension du jeu de données (c'est-à-dire le nombre d'individus et le nombre de variables) ? Vous pouvez vous aider des fonctions `dim()`, `nrow()`et `ncol()`. + +```{r} +dim(wine) +nrow(wine) +ncol(wine) +``` + +**Question :** Contrôlez que l'objet `wine` est bien de type data.frame (commande `is.data.frame()`) ? Remarquons que l'on peut obtenir les noms des variables grâce à la commande `names(wine)` ou `colnames(wine)`. Plus largement, on peut utiliser la commande `attributes()`. + +```{r} +is.data.frame(wine) +names(wine) +colnames(wine) +``` + +**Question :** Quelle est la nature de chaque variable ? Vous pouvez vous aider de la commande `str()`. + +```{r} +str(wine) +``` + +Attention, il faut bien préciser à R les variables qui doivent être considérées comme qualitatives. On utilise donc la fonction `as.factor()` sur les variables *Qualite* et *Type*. On va aussi en profiter pour renommer les modalités de la variable *Type* en `blanc`et `rouge`. + +```{r} +wine$Qualite<-as.factor(wine$Qualite) +wine$Type<-factor(wine$Type,labels=c("blanc","rouge")) +head(wine) +str(wine) +``` + +On peut obtenir un résumé rapide du jeu de données à l'aide de la fonction `summary()` + +```{r} +summary(wine) +``` + + +# Présentation de `ggplot2` + +Avant de commencer l'analyse uni- et bi-dimensionnelle du jeu de données, on va ici donner quelques notions sur les graphiques avec `ggplot2` pour comprendre la suite. + +[**ggplot2**](https://ggplot2.tidyverse.org/){target="_blank"} est une extension dédiée aux graphiques. Elle est basée sur une syntaxe particulière (il faut oublier les graphiques de base de R) mais robuste et efficace pour la construction de graphiques complexes. Elle part du principe (comme tout package de tidyverse) que les données relatives au graphique sont stockées dans un tableau (data.frame ou tibble). + +Un graphique en `ggplot2` s'initialise avec la fonction `ggplot()` qui prend en argument le jeu de données étudié. Par exemple, + +```{r} +gEx <- ggplot(data=wine) +``` + +Pour l'instant, on ne voit rien mais pourtant l'objet `gEx` contient des informations: +```{r} +summary(gEx) +names(gEx) +gEx$layers +``` + +mais pour l'instant son `layers` est vide. + +On ajoute ensuite des éléments graphiques, appelés `geom`, à l'objet graphique grâce à l'opérateur `+` et on précise à l'aide de la fonction `aes()` les données à utiliser en argument du `geom`. Par exemple, si on veut tracer le nuage de points entre les variables `Densite` et `Alcool` : + +```{r} +ggplot(data=wine,aes(x=Densite,y=Alcool))+ + geom_point() + +``` + +Parmi les `geom` les plus utilisés, on peut citer + + - `geom_point()` (nuage de points) + - `geom_line()`(trace des lignes) + - `geom_bar()` (représentation en bâtons) + - `geom_boxplot()` (boxplot) + - `geom_violin()` (violin plot) + - `geom_histogram()` (histogramme) + - `geom_density()` (densité) + - `geom_smooth()` + +On peut ajouter un **mappage**, c'est à dire une mise en relation entre un attribut graphique d'un `geom` et une variable du tableau de données. Par exemple, on peut mettre des couleurs à un nuage de points en fonction d'une variable qualitative, ... Il faut bien distinguer un mappage d'une modification d'un attribut graphique sans lien avec une variable. Une règle importante à retenir est donc + ++ pour définir un mappage (relation entre les valeurs d'une variable et un attribut graphique), on le déclare dans `aes()` ++ pour modifier un attribut graphique de la même manière pour tous les points, on le définit en-dehors de la fonction `aes()`. + +Par exemple, + +```{r} +ggplot(data=wine)+ + geom_point(aes(x=Densite,y=Alcool,color=Type)) +``` + +```{r} +ggplot(data=wine)+ + geom_point(aes(x=Densite,y=Alcool),color="blue") +``` + +On peut représenter plusieurs `geom` sur un même graphique simultanément, il suffit d'utiliser l'opérateur `+` pour les ajouter au fur et à mesure. +Par exemple, + +```{r} +ggplot(data=wine)+ + geom_violin(aes(x=Qualite,y=Alcool))+ + geom_point(aes(x=Qualite,y=Alcool), col = "blue", alpha = 0.2,position="jitter") +``` + +Les *scales* permettent de modifier la façon dont un attribut graphique est lié aux valeurs d'une variable. Pour les modifier, on ajoute un nouvel élément de la forme `scale__` à l'objet graphique ggplot2 avec `+`. Les fonctions *scale* les plus connues sont : + ++ `scale_size()` (avec son argument `range`) pour modifier les tailles minimales, maximales, ... ++ `scale_x()` et `scale_y()` pour modifier l'axe `x`et l'axe `y` respectivement ++ `scale_x_continuous()` (resp. `scale_x_discrete()`) pour modifier l'axe des `x` dans le cas d'une variable quantitative (resp. une variable qualitative) ++ `scale_y_continuous()` (resp. `scale_y_discrete()`) pour modifier l'axe des `y` dans le cas d'une variable quantitative (resp. une variable qualitative) ++ `scale_color()` pour modifier les couleurs de dessin ++ `scale_fill()` pour modifier les couleurs de remplissage + +Pour les couleurs, on peut spécifier un gradient de couleur sur une variable quantitative avec `scale_color_gradient()`, modifier manuellement la palette de couleur avec `scale_color_manual()`, faire appel à une palette de couleur prédéfinie (par exemple en utilisant le package [viridis]("https://cran.r-project.org/web/packages/viridis/vignettes/intro-to-viridis.html"){target="_blank"} avec `scale_color_viridis`, +en s'appuyant sur les palettes disponibles dans [ColorBrewer](https://colorbrewer2.org/#type=sequential&scheme=BuGn&n=3){target="_blank"} avec `scale_color_brewer()`), ... + + +```{r} +ggplot(data=wine)+ + geom_point(aes(x=Alcool,y=Densite,size=AcidVol,color=Type))+ + scale_size("Acide vol.", range = c(0,1.5),breaks=seq(0,1.5,0.2)) + + scale_x_continuous("Alcool",limits=c(8,16)) + + scale_y_continuous("Densité",limits=c(0.985,1.01)) +``` + + +Remarque : on peut modifier certains éléments avec une commande spécifique comme + ++ `ggtitle()` pour modifier le titre ++ `xlab()`et `ylab()` pour modifier l'intituler de l'axe des abscisses et des ordonnées respectivement + +En bref, les possibles avec `ggplot2` sont infinis car de nombreux éléments sont personnalisables. Voici quelques références pour les graphiques en `ggplot2` parmi les nombreuses ressources disponibles sur le web : + ++ Le livre *Ggplot2: Elegant Graphics for Data Analysis* de H. Wickham. [@ggplot2] ++ Le [site web de ggplot2]("https://ggplot2.tidyverse.org/"){target="_blank"} ++ [The R Graph Gallery](https://www.r-graph-gallery.com/ggplot2-package.html){target="_blank"} ++ [The Cheat Sheet de ggplot 2](https://thinkr.fr/pdf/ggplot2-french-cheatsheet.pdf){target="_blank"} + + +# Etude statistique unidimensionnelle + +## Pour une variable qualitative + +Nous nous intéressons dans cette partie aux deux variables qualitatives *Type* et *Qualite*. + +**Question :** A l'aide des commandes `table()`, `summary()` et `levels()`, donnez un résumé de la variable `Type`. Quels sont les modalités du facteur ? + +```{r} +# A COMPLETER +summary(wine$Type) +levels(wine$Type + ) +table(wine$Type) +``` + +**Question :** A l'aide du code suivant, résumez graphiquement la variable `Type` +par une représentation par secteurs ou un diagramme en barres. +Interprétez les résultats. + +```{r} +g1<-ggplot(wine, aes(x=Type))+ + geom_bar()+ + ylab("")+ggtitle("Effectifs") +g2<-ggplot(wine, aes(x = Type)) + + geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences") + +df <- data.frame(group = levels(wine$Type), + value = as.vector(table(wine$Type))/nrow(wine)) +g3<-ggplot(df, aes(x="", y=value, fill=group))+ + geom_bar(width = 1, stat = "identity")+ + coord_polar("y", start=0)+ + theme(legend.position="bottom") +grid.arrange(g3,g1,g2,ncol=3) + + +``` + +**Question :** La variable *Qualite* est une variable qualitative ordinale. On peut donc utiliser les effectifs cumulés et les fréquences cumulées. Pour tracer les fréquences cumulées, il faut que l'ordre des modalités soit bien compris par R. Ici, on commence par réorganiser les modalités en `bad`, `medium` et `good`. A l'aide des codes suivants, étudiez la variable *Qualite*. + +```{r,echo=T} +wine$Qualite <- fct_relevel(wine$Qualite,"bad","medium","good") + +EffQual=as.vector(table(wine$Qualite)) +FreqQual= data.frame(Eff = EffQual, Freq = EffQual/length(wine$Qualite), FreqCumul=cumsum(EffQual)/length(wine$Qualite)) +rownames(FreqQual)=levels(wine$Qualite) + +knitr::kable(FreqQual, caption = 'Description de la variable Qualite',booktabs = TRUE,digits=3) +``` + +```{r} +df <- data.frame(Qualite = levels(wine$Qualite), value = table(wine$Qualite), + valuecumul = 100 * cumsum(prop.table(table(wine$Qualite)))) +df$Qualite <- fct_relevel(df$Qualite, "bad", "medium", "good") + +df <- data.frame(df, freq = df$value.Freq/nrow(wine)) +g1 <- ggplot(wine) + geom_bar(aes(x = Qualite)) + ggtitle("Effectifs")+xlab("Qualite") +g2 <- ggplot(wine) + geom_bar(aes(x = Qualite, y = ..prop.., group = 1)) + ggtitle("Frequences")+xlab("Qualite") +g3 <- ggplot(df, aes(x = Qualite, y = valuecumul)) + geom_bar(stat = "identity") + + ggtitle("Fréquences cumulées") + +g4 <- ggplot(df, aes(x = "", y = freq, fill = Qualite)) + geom_bar(width = 1, stat = "identity") + + coord_polar("y", start = 0) +grid.arrange(g1, g2, g3, g4, ncol = 2) +``` + +## Pour une variable quantitative + +Pour cette section, on se focalise sur la variable *Alcool*. + +### Indicateurs statistiques + +**Question :** Que calculent les commandes `mean()`, `median()`, `var()`, `sd()`, `range()` ? Calculez l’étendue des données. + +```{r} +mean(wine$Alcool) +median(wine$Alcool) +var(wine$Alcool) +sd(wine$Alcool) +range(wine$Alcool) +``` + +**Question :** Etudiez les sorties des commandes `summary(wine$Alcool)` et `quantile(wine$Alcool)`. +Donnez également l’écart interquartile et les valeurs adjacentes. + +```{r} +summary(wine$Alcool) + +quantile(wine$Alcool,0.75,names=FALSE)-quantile(wine$Alcool,0.25,names = FALSE) + +quantile(wine$Alcool) + + + +``` + +### Représentations graphiques + +Le but de la statistique exploratoire est de synthétiser, résumer et structurer l'information contenue dans des données. On utilise pour cela des représentations de données sous forme de graphiques. + + +**Question :** On peut utiliser la représentation par histogramme. +Tapez `H<-hist(wine$Alcool)` et commentez les différents attributs de `H`. +```{r} +H<-hist(wine$Alcool) + +``` + + +Pour tracer un histogramme avec ggplot, vous pouvez utiliser le code suivant. Commentez. + +```{r hist} +g1<-ggplot(wine,aes(x=Alcool))+ + geom_histogram(bins=15,color="black",fill="white")+ + ggtitle("Histo. des effectifs")+ + ylab("Frequency")+xlab("Alcool") +g2<-ggplot(wine,aes(x=Alcool))+ + geom_histogram(aes(y=..density..),bins=15,color="black", fill="white")+ + ggtitle("Histo. des frequences")+ + ylab("Density")+xlab("Alcool") +grid.arrange(g1,g2,ncol=2) + + +``` + + +**Question :** A l'aide du code suivant, représentez un boxplot de la variable "Alcool". Que remarquez-vous ? Comparez avec les valeurs adjacentes calculées précédemment. + +```{r} +ggplot(wine,aes(y=Alcool))+geom_boxplot() +``` + +Pour tracer les boxplots de toutes les variables quantitatives en même temps, il faut réorganiser en amont le jeu de données. + +```{r boxplot} +wineaux<-melt(wine[,-c(1,2)]) +ggplot(wineaux,aes(x=variable,y=value))+ + geom_boxplot() +``` + +**Question :** En vous aidant de l'aide de R et des résultats de la section précédente, tapez +`B<-boxplot(wine$Alcool)` et commentez les différents attributs de `B`. + +```{r} +B<-boxplot(wine$Alcool) +``` + +# Statistiques descriptives bidimensionnelles +## Entre 2 variables quantitatives + +**Question :** Calculez la matrice de corrélation des variables quantitatives (commande `cor()`) ou la matrice de variance-covariance (commandes `var()` +ou `cov()`). Représentez graphiquement les corrélations à l'aide de la fonction `corrplot()` de la librairie `corrplot`. Vous pourrez utiliser l'option `method="ellipse"` pour une meilleure lisibilité. + +```{r} +print('Correlation') +cor(wine[,-c(1,2)]) +print('Covariance') +cov(wine[,-c(1,2)]) + +help(corrplot) +corrplot(cor(wine[,-c(1,2)]),method = "ellipse") + +``` + + +**Question :** Interprétez les résultats. + +=> il y a une forte correlation negative entre l'Alcool et la densié + +**Question :** Représentez graphiquement la *Densite* en fonction de l'**Alcool** à l'aide de la commande `geom_point()`. Au vu de ce graphique, les variables sont-elles corrélées ? Vous pourrez ajouter la commande `+geom_smooth(method="lm")` +pour tracer la droite de régression linéaire. Est-ce cohérent avec la corrélation calculée ci-dessus ? + +```{r} +ggplot(data=wine)+ + geom_point(aes(x=Alcool,y=Densite))+ + geom_smooth(aes(x=Alcool,y=Densite),method="lm") + +``` + +## Entre une variable quantitative et une variable qualitative + +**Question :** Représentez le boxplot de la variable `Alcool` pour chaque modalité de la variable qualitative *Type*. Même question avec *Qualite*. Interprétez les résultats. + +```{r} +ggplot(wine)+ + geom_boxplot(aes(x=Type,y=Alcool)) +ggplot(wine)+ + geom_boxplot(aes(x=Qualite,y=Alcool)) +``` + +**Question :** Explorez les autres combinaisons de variables quantitatives avec les variables qualitatives afin de déterminer les variables fortement liées. + +```{r} +ggplot(wine)+ + geom_boxplot(aes(x=Type,y=AcidVol))+ + geom_boxplot(aes(x=Qualite,y=AcidVol)) + +ggplot(wine)+ + geom_boxplot(aes(x=Type,y=Densite))+ + geom_boxplot(aes(x=Qualite,y=Densite)) + +ggplot(wine)+ + geom_boxplot(aes(x=Type,y=AcidCitr))+ + geom_boxplot(aes(x=Qualite,y=AcidCitr)) +``` + +**Question :** A l'aide de la fonction `eta2()` de la librairie `BioStatR`, calculez le rapport de corrélation $\eta^2$ entre chaque variable quantitative et la variable *Type*. Commentez. Faites de même avec la variable *Qualité*. + +```{r} +eta2(x=wine$AcidVol,y=wine$Type) +eta2(x=wine$AcidCitr,y=wine$Type) +eta2(x=wine$SO2lbr,y=wine$Type) +eta2(x=wine$SO2tot,y=wine$Type) +eta2(x=wine$Alcool,y=wine$Type) +eta2(x=wine$Densite,y=wine$Type) +``` + +## Entre deux variables qualitatives + +**Question :** Analysez la table de contingence entre les deux variables qualitatives *Type* et *Qualite* avec la commande `table()`. Ajoutez les effectifs marginaux avec la commande `addmargins()`. + +```{r} +a=table(wine$Qualite,wine$Type) + +addmargins(a) + +``` + + +**Question :** Calculez et représentez les profils-lignes à l'aide des fonctions `prop.table(..., margin = ...)`et `mosaicplot`. Interprétez les résultats. Faites de même avec les profils-colonnes. + +```{r} +prop.table(table(wine$Qualite,wine$Type), margin = 1) + +help("prop.table") +``` + diff --git a/INSA/TP anadon/TP2-StatDesc.html b/INSA/TP anadon/TP2-StatDesc.html new file mode 100644 index 0000000..258241c --- /dev/null +++ b/INSA/TP anadon/TP2-StatDesc.html @@ -0,0 +1,2139 @@ + + + + + + + + + + + + + +TP2 - Statistique Descriptive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ +
+ + + + + + + + +

Ce TP a pour objectif de mener l’étude descriptive uni- et +bi-dimensionnelle du jeu de données wine disponible sous +Moodle. Vous rédigerez les réponses et vos observations dans le script +.Rmd du TP au fur et à mesure. Vous pourrez compiler votre script à la +fin du TP pour obtenir un compte-rendu du TP.

+

Remarque : pensez à enlever les “eval=F” au fur et à mesure de +l’avancement dans le TP pour avoir les résultats dans votre compte-rendu +final de TP.

+
+

1 Données

+

On va étudier le jeu de données wine disponible sur +la page moodle du cours. Commencez par récupérer ce jeu de données et +sauvegardez le fichier dans votre dossier de travail.

+

Le jeu de données wine comprend des mesures +physico-chimiques réalisées sur un échantillon de \(600\) vins (rouges et blancs) du +Portugal. Ces mesures sont complétées par une évaluation sensorielle de +la qualité par un ensemble d’experts. Chaque vin est décrit par les +variables suivantes :

+
    +
  • Qualite : son évaluation sensorielle par les experts +(“bad”,“medium”,“good”),
  • +
  • Type : son type (1 pour un vin rouge, 0 pour un vin +blanc),
  • +
  • AcidVol : la teneur en acide volatile (en g/dm3 d’acide +acétique),
  • +
  • AcidCitr : la teneur en acide citrique (en g/dm3),
  • +
  • SO2lbr : le dosage du dioxyde de soufre libre (en +mg/dm3),
  • +
  • SO2tot : le dosage du dioxyde de soufre total (en +mg/dm3),
  • +
  • Densite : la densité (en g/cm3),
  • +
  • Alcool : le degré d’alcool (en % Vol.).
  • +
+

Dans un premier temps, commencez par charger le jeu de données à +l’aide de la fonction read.table().

+
wine <- read.table("wine.txt",header=TRUE)
+

Vous pouvez voir les premières lignes du jeu de données à l’aide de +la fonction head()

+
head(wine)
+
     Qualite Type AcidVol AcidCitr SO2lbr SO2tot Densite Alcool
+1352  medium    1    0.62     0.01      8     46 0.99332   11.8
+5493  medium    0    0.34     0.10     17     63 0.99370    9.2
+5153  medium    0    0.22     0.22     39    110 0.99855    9.0
+5308  medium    0    0.35     0.46     61    183 0.99786    9.0
+3866  medium    0    0.42     0.32     20    167 0.99479   10.6
+694   medium    1    0.48     0.32     21    122 0.99840    9.4
+

Question : Contrôlez la dimension du jeu de données +(c’est-à-dire le nombre d’individus et le nombre de variables) ? Vous +pouvez vous aider des fonctions dim(), +nrow()et ncol().

+
dim(wine)
+
[1] 600   8
+
nrow(wine)
+
[1] 600
+
ncol(wine)
+
[1] 8
+

Question : Contrôlez que l’objet wine +est bien de type data.frame (commande is.data.frame()) ? +Remarquons que l’on peut obtenir les noms des variables grâce à la +commande names(wine) ou colnames(wine). Plus +largement, on peut utiliser la commande attributes().

+
is.data.frame(wine)
+
[1] TRUE
+
names(wine)
+
[1] "Qualite"  "Type"     "AcidVol"  "AcidCitr" "SO2lbr"   "SO2tot"   "Densite" 
+[8] "Alcool"  
+
colnames(wine)
+
[1] "Qualite"  "Type"     "AcidVol"  "AcidCitr" "SO2lbr"   "SO2tot"   "Densite" 
+[8] "Alcool"  
+

Question : Quelle est la nature de chaque variable ? +Vous pouvez vous aider de la commande str().

+
str(wine)
+
'data.frame':   600 obs. of  8 variables:
+ $ Qualite : chr  "medium" "medium" "medium" "medium" ...
+ $ Type    : int  1 0 0 0 0 1 0 0 0 0 ...
+ $ AcidVol : num  0.62 0.34 0.22 0.35 0.42 0.48 0.21 0.28 0.3 0.4 ...
+ $ AcidCitr: num  0.01 0.1 0.22 0.46 0.32 0.32 0.32 0.14 0.25 0.42 ...
+ $ SO2lbr  : num  8 17 39 61 20 21 39 64 21 41 ...
+ $ SO2tot  : int  46 63 110 183 167 122 113 159 124 176 ...
+ $ Densite : num  0.993 0.994 0.999 0.998 0.995 ...
+ $ Alcool  : num  11.8 9.2 9 9 10.6 9.4 10.2 10 10.8 9.4 ...
+

Attention, il faut bien préciser à R les variables qui doivent être +considérées comme qualitatives. On utilise donc la fonction +as.factor() sur les variables Qualite et +Type. On va aussi en profiter pour renommer les modalités de la +variable Type en blancet rouge.

+
wine$Qualite<-as.factor(wine$Qualite)
+wine$Type<-factor(wine$Type,labels=c("blanc","rouge"))
+head(wine)
+
     Qualite  Type AcidVol AcidCitr SO2lbr SO2tot Densite Alcool
+1352  medium rouge    0.62     0.01      8     46 0.99332   11.8
+5493  medium blanc    0.34     0.10     17     63 0.99370    9.2
+5153  medium blanc    0.22     0.22     39    110 0.99855    9.0
+5308  medium blanc    0.35     0.46     61    183 0.99786    9.0
+3866  medium blanc    0.42     0.32     20    167 0.99479   10.6
+694   medium rouge    0.48     0.32     21    122 0.99840    9.4
+

On peut obtenir un résumé rapide du jeu de données à l’aide de la +fonction summary()

+
summary(wine)
+
   Qualite       Type        AcidVol          AcidCitr          SO2lbr      
+ bad   : 19   blanc:425   Min.   :0.1000   Min.   :0.0000   Min.   :  2.00  
+ good  :110   rouge:175   1st Qu.:0.2400   1st Qu.:0.2400   1st Qu.: 15.75  
+ medium:471               Median :0.3000   Median :0.3000   Median : 27.00  
+                          Mean   :0.3512   Mean   :0.3141   Mean   : 29.41  
+                          3rd Qu.:0.4300   3rd Qu.:0.3900   3rd Qu.: 41.00  
+                          Max.   :1.0400   Max.   :1.0000   Max.   :112.00  
+     SO2tot         Densite           Alcool     
+ Min.   :  7.0   Min.   :0.9875   Min.   : 8.00  
+ 1st Qu.: 68.0   1st Qu.:0.9925   1st Qu.: 9.50  
+ Median :114.5   Median :0.9949   Median :10.40  
+ Mean   :111.2   Mean   :0.9947   Mean   :10.49  
+ 3rd Qu.:154.0   3rd Qu.:0.9970   3rd Qu.:11.30  
+ Max.   :278.0   Max.   :1.0030   Max.   :14.00  
+
+
+

2 Présentation de +ggplot2

+

Avant de commencer l’analyse uni- et bi-dimensionnelle du jeu de +données, on va ici donner quelques notions sur les graphiques avec +ggplot2 pour comprendre la suite.

+

ggplot2 est une extension dédiée +aux graphiques. Elle est basée sur une syntaxe particulière (il faut +oublier les graphiques de base de R) mais robuste et efficace pour la +construction de graphiques complexes. Elle part du principe (comme tout +package de tidyverse) que les données relatives au graphique sont +stockées dans un tableau (data.frame ou tibble).

+

Un graphique en ggplot2 s’initialise avec la fonction +ggplot() qui prend en argument le jeu de données étudié. +Par exemple,

+
gEx <- ggplot(data=wine)
+

Pour l’instant, on ne voit rien mais pourtant l’objet +gEx contient des informations:

+
summary(gEx)
+
data: Qualite, Type, AcidVol, AcidCitr, SO2lbr, SO2tot, Densite, Alcool
+  [600x8]
+faceting: <ggproto object: Class FacetNull, Facet, gg>
+    compute_layout: function
+    draw_back: function
+    draw_front: function
+    draw_labels: function
+    draw_panels: function
+    finish_data: function
+    init_scales: function
+    map_data: function
+    params: list
+    setup_data: function
+    setup_params: function
+    shrink: TRUE
+    train_scales: function
+    vars: function
+    super:  <ggproto object: Class FacetNull, Facet, gg>
+
names(gEx)
+
[1] "data"        "layers"      "scales"      "mapping"     "theme"      
+[6] "coordinates" "facet"       "plot_env"    "labels"     
+
gEx$layers
+
list()
+

mais pour l’instant son layers est vide.

+

On ajoute ensuite des éléments graphiques, appelés geom, +à l’objet graphique grâce à l’opérateur + et on précise à +l’aide de la fonction aes() les données à utiliser en +argument du geom. Par exemple, si on veut tracer le nuage +de points entre les variables Densite et +Alcool :

+
ggplot(data=wine,aes(x=Densite,y=Alcool))+
+   geom_point()
+

+

Parmi les geom les plus utilisés, on peut citer

+
    +
  • geom_point() (nuage de points)
  • +
  • geom_line()(trace des lignes)
  • +
  • geom_bar() (représentation en bâtons)
  • +
  • geom_boxplot() (boxplot)
  • +
  • geom_violin() (violin plot)
  • +
  • geom_histogram() (histogramme)
  • +
  • geom_density() (densité)
  • +
  • geom_smooth()
  • +
+

On peut ajouter un mappage, c’est à dire une mise en +relation entre un attribut graphique d’un geom et une +variable du tableau de données. Par exemple, on peut mettre des couleurs +à un nuage de points en fonction d’une variable qualitative, … Il faut +bien distinguer un mappage d’une modification d’un attribut graphique +sans lien avec une variable. Une règle importante à retenir est donc

+
    +
  • pour définir un mappage (relation entre les valeurs d’une variable +et un attribut graphique), on le déclare dans aes()
  • +
  • pour modifier un attribut graphique de la même manière pour tous les +points, on le définit en-dehors de la fonction aes().
  • +
+

Par exemple,

+
ggplot(data=wine)+
+   geom_point(aes(x=Densite,y=Alcool,color=Type))
+

+
ggplot(data=wine)+
+   geom_point(aes(x=Densite,y=Alcool),color="blue")
+

+

On peut représenter plusieurs geom sur un même graphique +simultanément, il suffit d’utiliser l’opérateur + pour les +ajouter au fur et à mesure. Par exemple,

+
ggplot(data=wine)+
+  geom_violin(aes(x=Qualite,y=Alcool))+
+   geom_point(aes(x=Qualite,y=Alcool), col = "blue", alpha = 0.2,position="jitter")
+

+

Les scales permettent de modifier la façon dont un attribut +graphique est lié aux valeurs d’une variable. Pour les modifier, on +ajoute un nouvel élément de la forme +scale_<attribut>_<type> à l’objet graphique +ggplot2 avec +. Les fonctions scale les plus +connues sont :

+
    +
  • scale_size() (avec son argument range) +pour modifier les tailles minimales, maximales, …
  • +
  • scale_x() et scale_y() pour modifier l’axe +xet l’axe y respectivement
  • +
  • scale_x_continuous() (resp. +scale_x_discrete()) pour modifier l’axe des x +dans le cas d’une variable quantitative (resp. une variable +qualitative)
  • +
  • scale_y_continuous() (resp. +scale_y_discrete()) pour modifier l’axe des y +dans le cas d’une variable quantitative (resp. une variable +qualitative)
  • +
  • scale_color() pour modifier les couleurs de dessin
  • +
  • scale_fill() pour modifier les couleurs de +remplissage
  • +
+

Pour les couleurs, on peut spécifier un gradient de couleur sur une +variable quantitative avec scale_color_gradient(), modifier +manuellement la palette de couleur avec +scale_color_manual(), faire appel à une palette de couleur +prédéfinie (par exemple en utilisant le package viridis avec scale_color_viridis, en +s’appuyant sur les palettes disponibles dans ColorBrewer avec scale_color_brewer()), +…

+
ggplot(data=wine)+
+  geom_point(aes(x=Alcool,y=Densite,size=AcidVol,color=Type))+
+  scale_size("Acide vol.", range = c(0,1.5),breaks=seq(0,1.5,0.2)) +
+  scale_x_continuous("Alcool",limits=c(8,16)) +
+  scale_y_continuous("Densité",limits=c(0.985,1.01))
+

+

Remarque : on peut modifier certains éléments avec une commande +spécifique comme

+
    +
  • ggtitle() pour modifier le titre
  • +
  • xlab()et ylab() pour modifier l’intituler +de l’axe des abscisses et des ordonnées respectivement
  • +
+

En bref, les possibles avec ggplot2 sont infinis car de +nombreux éléments sont personnalisables. Voici quelques références pour +les graphiques en ggplot2 parmi les nombreuses ressources +disponibles sur le web :

+ +
+
+

3 Etude statistique +unidimensionnelle

+
+

3.1 Pour une variable +qualitative

+

Nous nous intéressons dans cette partie aux deux variables +qualitatives Type et Qualite.

+

Question : A l’aide des commandes +table(), summary() et levels(), +donnez un résumé de la variable Type. Quels sont les +modalités du facteur ?

+
# A COMPLETER
+summary(wine$Type)
+
blanc rouge 
+  425   175 
+
levels(wine$Type
+       )
+
[1] "blanc" "rouge"
+
table(wine$Type)
+

+blanc rouge 
+  425   175 
+

Question : A l’aide du code suivant, résumez +graphiquement la variable Type par une représentation par +secteurs ou un diagramme en barres. Interprétez les résultats.

+
g1<-ggplot(wine, aes(x=Type))+ 
+  geom_bar()+
+  ylab("")+ggtitle("Effectifs")
+g2<-ggplot(wine, aes(x = Type)) +  
+  geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences")
+
+df <- data.frame(group = levels(wine$Type),
+                 value = as.vector(table(wine$Type))/nrow(wine))
+g3<-ggplot(df, aes(x="", y=value, fill=group))+
+  geom_bar(width = 1, stat = "identity")+ 
+  coord_polar("y", start=0)+ 
+  theme(legend.position="bottom")
+grid.arrange(g3,g1,g2,ncol=3)
+

+

Question : La variable Qualite est une +variable qualitative ordinale. On peut donc utiliser les effectifs +cumulés et les fréquences cumulées. Pour tracer les fréquences cumulées, +il faut que l’ordre des modalités soit bien compris par R. Ici, on +commence par réorganiser les modalités en bad, +medium et good. A l’aide des codes suivants, +étudiez la variable Qualite.

+
wine$Qualite <- fct_relevel(wine$Qualite,"bad","medium","good")
+
+EffQual=as.vector(table(wine$Qualite))
+FreqQual= data.frame(Eff = EffQual, Freq = EffQual/length(wine$Qualite), FreqCumul=cumsum(EffQual)/length(wine$Qualite))
+rownames(FreqQual)=levels(wine$Qualite)
+
+knitr::kable(FreqQual, caption = 'Description de la variable Qualite',booktabs = TRUE,digits=3)
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Description de la variable Qualite
EffFreqFreqCumul
bad190.0320.032
medium4710.7850.817
good1100.1831.000
+
df <- data.frame(Qualite = levels(wine$Qualite), value = table(wine$Qualite),
+    valuecumul = 100 * cumsum(prop.table(table(wine$Qualite))))
+df$Qualite <- fct_relevel(df$Qualite, "bad", "medium", "good")
+
+df <- data.frame(df, freq = df$value.Freq/nrow(wine))
+g1 <- ggplot(wine) + geom_bar(aes(x = Qualite)) + ggtitle("Effectifs")+xlab("Qualite")
+g2 <- ggplot(wine) + geom_bar(aes(x = Qualite, y = ..prop.., group = 1)) + ggtitle("Frequences")+xlab("Qualite")
+g3 <- ggplot(df, aes(x = Qualite, y = valuecumul)) + geom_bar(stat = "identity") +
+    ggtitle("Fréquences cumulées")
+
+g4 <- ggplot(df, aes(x = "", y = freq, fill = Qualite)) + geom_bar(width = 1, stat = "identity") +
+    coord_polar("y", start = 0)
+grid.arrange(g1, g2, g3, g4, ncol = 2)
+

+
+
+

3.2 Pour une variable +quantitative

+

Pour cette section, on se focalise sur la variable +Alcool.

+
+

3.2.1 Indicateurs +statistiques

+

Question : Que calculent les commandes +mean(), median(), var(), +sd(), range() ? Calculez l’étendue des +données.

+
mean(wine$Alcool)
+
[1] 10.48592
+
median(wine$Alcool)
+
[1] 10.4
+
var(wine$Alcool)
+
[1] 1.316059
+
sd(wine$Alcool)
+
[1] 1.147196
+
range(wine$Alcool)
+
[1]  8 14
+

Question : Etudiez les sorties des commandes +summary(wine$Alcool) et quantile(wine$Alcool). +Donnez également l’écart interquartile et les valeurs adjacentes.

+
summary(wine$Alcool)
+
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
+   8.00    9.50   10.40   10.49   11.30   14.00 
+
quantile(wine$Alcool,0.75,names=FALSE)-quantile(wine$Alcool,0.25,names = FALSE)
+
[1] 1.8
+
quantile(wine$Alcool)
+
  0%  25%  50%  75% 100% 
+ 8.0  9.5 10.4 11.3 14.0 
+
+
+

3.2.2 Représentations +graphiques

+

Le but de la statistique exploratoire est de synthétiser, résumer et +structurer l’information contenue dans des données. On utilise pour cela +des représentations de données sous forme de graphiques.

+

Question : On peut utiliser la représentation par +histogramme. Tapez H<-hist(wine$Alcool) et commentez les +différents attributs de H.

+
H<-hist(wine$Alcool)
+

+

Pour tracer un histogramme avec ggplot, vous pouvez utiliser le code +suivant. Commentez.

+
g1<-ggplot(wine,aes(x=Alcool))+
+  geom_histogram(bins=15,color="black",fill="white")+
+  ggtitle("Histo. des effectifs")+
+  ylab("Frequency")+xlab("Alcool")
+g2<-ggplot(wine,aes(x=Alcool))+
+  geom_histogram(aes(y=..density..),bins=15,color="black", fill="white")+
+  ggtitle("Histo. des frequences")+
+  ylab("Density")+xlab("Alcool")
+grid.arrange(g1,g2,ncol=2)
+

+

Question : A l’aide du code suivant, représentez un +boxplot de la variable “Alcool”. Que remarquez-vous ? Comparez avec les +valeurs adjacentes calculées précédemment.

+
ggplot(wine,aes(y=Alcool))+geom_boxplot()
+

+

Pour tracer les boxplots de toutes les variables quantitatives en +même temps, il faut réorganiser en amont le jeu de données.

+
wineaux<-melt(wine[,-c(1,2)])
+ggplot(wineaux,aes(x=variable,y=value))+
+  geom_boxplot()
+

+

Question : En vous aidant de l’aide de R et des +résultats de la section précédente, tapez +B<-boxplot(wine$Alcool) et commentez les différents +attributs de B.

+
B<-boxplot(wine$Alcool)
+

+
+
+
+
+

4 Statistiques +descriptives bidimensionnelles

+
+

4.1 Entre 2 variables +quantitatives

+

Question : Calculez la matrice de corrélation des +variables quantitatives (commande cor()) ou la matrice de +variance-covariance (commandes var() ou +cov()). Représentez graphiquement les corrélations à l’aide +de la fonction corrplot() de la librairie +corrplot. Vous pourrez utiliser l’option +method="ellipse" pour une meilleure lisibilité.

+
print('Correlation')
+
[1] "Correlation"
+
cor(wine[,-c(1,2)])
+
             AcidVol   AcidCitr      SO2lbr      SO2tot     Densite      Alcool
+AcidVol   1.00000000 -0.4107821 -0.37071293 -0.41542773  0.29814510 -0.02208799
+AcidCitr -0.41078214  1.0000000  0.14764139  0.20724080  0.12360061 -0.03949990
+SO2lbr   -0.37071293  0.1476414  1.00000000  0.71394673 -0.03516798 -0.14830238
+SO2tot   -0.41542773  0.2072408  0.71394673  1.00000000 -0.03003947 -0.24679350
+Densite   0.29814510  0.1236006 -0.03516798 -0.03003947  1.00000000 -0.67624598
+Alcool   -0.02208799 -0.0394999 -0.14830238 -0.24679350 -0.67624598  1.00000000
+
print('Covariance')
+
[1] "Covariance"
+
cov(wine[,-c(1,2)])
+
               AcidVol      AcidCitr        SO2lbr        SO2tot       Densite
+AcidVol   0.0268978296 -1.063582e-02  -1.077438119 -3.827641e+00  1.429567e-04
+AcidCitr -0.0106358172  2.492306e-02   0.413052087  1.838032e+00  5.704787e-05
+SO2lbr   -1.0774381191  4.130521e-01 314.045063996  7.107860e+02 -1.822055e-03
+SO2tot   -3.8276406511  1.838032e+00 710.785976628  3.156124e+03 -4.933866e-03
+Densite   0.0001429567  5.704787e-05  -0.001822055 -4.933866e-03  8.547444e-06
+Alcool   -0.0041557797 -7.153760e-03  -3.014961677 -1.590554e+01 -2.268091e-03
+                Alcool
+AcidVol   -0.004155780
+AcidCitr  -0.007153760
+SO2lbr    -3.014961677
+SO2tot   -15.905542015
+Densite   -0.002268091
+Alcool     1.316059100
+
help(corrplot)
+corrplot(cor(wine[,-c(1,2)]),method = "ellipse")
+

+

Question : Interprétez les résultats.

+

=> il y a une forte correlation negative entre l’Alcool et la +densié

+

Question : Représentez graphiquement la +Densite en fonction de l’Alcool à l’aide de la +commande geom_point(). Au vu de ce graphique, les variables +sont-elles corrélées ? Vous pourrez ajouter la commande ++geom_smooth(method="lm") pour tracer la droite de +régression linéaire. Est-ce cohérent avec la corrélation calculée +ci-dessus ?

+
ggplot(data=wine)+
+  geom_point(aes(x=Alcool,y=Densite))+
+    geom_smooth(aes(x=Alcool,y=Densite),method="lm")
+

+
+
+

4.2 Entre une variable +quantitative et une variable qualitative

+

Question : Représentez le boxplot de la variable +Alcool pour chaque modalité de la variable qualitative +Type. Même question avec Qualite. Interprétez les +résultats.

+
ggplot(wine)+
+  geom_boxplot(aes(x=Type,y=Alcool))
+

+
ggplot(wine)+
+  geom_boxplot(aes(x=Qualite,y=Alcool))
+

+

Question : Explorez les autres combinaisons de +variables quantitatives avec les variables qualitatives afin de +déterminer les variables fortement liées.

+
ggplot(wine)+
+  geom_boxplot(aes(x=Type,y=AcidVol))+
+  geom_boxplot(aes(x=Qualite,y=AcidVol))
+

+
ggplot(wine)+
+  geom_boxplot(aes(x=Type,y=Densite))+
+  geom_boxplot(aes(x=Qualite,y=Densite))
+

+
ggplot(wine)+
+  geom_boxplot(aes(x=Type,y=AcidCitr))+
+  geom_boxplot(aes(x=Qualite,y=AcidCitr))
+

+

Question : A l’aide de la fonction +eta2() de la librairie BioStatR, calculez le +rapport de corrélation \(\eta^2\) entre +chaque variable quantitative et la variable Type. Commentez. +Faites de même avec la variable Qualité.

+
eta2(x=wine$AcidVol,y=wine$Type)
+
[1] 0.4481639
+
eta2(x=wine$AcidCitr,y=wine$Type)
+
[1] 0.03693554
+
eta2(x=wine$SO2lbr,y=wine$Type)
+
[1] 0.2153399
+
eta2(x=wine$SO2tot,y=wine$Type)
+
[1] 0.4580193
+
eta2(x=wine$Alcool,y=wine$Type)
+
[1] 0.003022674
+
eta2(x=wine$Densite,y=wine$Type)
+
[1] 0.214444
+
+
+

4.3 Entre deux variables +qualitatives

+

Question : Analysez la table de contingence entre +les deux variables qualitatives Type et Qualite avec +la commande table(). Ajoutez les effectifs marginaux avec +la commande addmargins().

+
a=table(wine$Qualite,wine$Type)
+
+addmargins(a)
+
        
+         blanc rouge Sum
+  bad       17     2  19
+  medium   319   152 471
+  good      89    21 110
+  Sum      425   175 600
+

Question : Calculez et représentez les +profils-lignes à l’aide des fonctions +prop.table(..., margin = ...)et mosaicplot. +Interprétez les résultats. Faites de même avec les profils-colonnes.

+
prop.table(table(wine$Qualite,wine$Type), margin = 1)
+
        
+             blanc     rouge
+  bad    0.8947368 0.1052632
+  medium 0.6772824 0.3227176
+  good   0.8090909 0.1909091
+
help("prop.table")
+
+
+ + + +
+
+ +
+ + + + + + + + + + + + + + + + diff --git a/INSA/TP anadon/TP2-StatDesc.tex b/INSA/TP anadon/TP2-StatDesc.tex new file mode 100644 index 0000000..21ab7d9 --- /dev/null +++ b/INSA/TP anadon/TP2-StatDesc.tex @@ -0,0 +1,1176 @@ +% Options for packages loaded elsewhere +\PassOptionsToPackage{unicode}{hyperref} +\PassOptionsToPackage{hyphens}{url} +% +\documentclass[ +]{article} +\usepackage{amsmath,amssymb} +\usepackage{iftex} +\ifPDFTeX + \usepackage[T1]{fontenc} + \usepackage[utf8]{inputenc} + \usepackage{textcomp} % provide euro and other symbols +\else % if luatex or xetex + \usepackage{unicode-math} % this also loads fontspec + \defaultfontfeatures{Scale=MatchLowercase} + \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} +\fi +\usepackage{lmodern} +\ifPDFTeX\else + % xetex/luatex font selection +\fi +% Use upquote if available, for straight quotes in verbatim environments +\IfFileExists{upquote.sty}{\usepackage{upquote}}{} +\IfFileExists{microtype.sty}{% use microtype if available + \usepackage[]{microtype} + \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts +}{} +\makeatletter +\@ifundefined{KOMAClassName}{% if non-KOMA class + \IfFileExists{parskip.sty}{% + \usepackage{parskip} + }{% else + \setlength{\parindent}{0pt} + \setlength{\parskip}{6pt plus 2pt minus 1pt}} +}{% if KOMA class + \KOMAoptions{parskip=half}} +\makeatother +\usepackage{xcolor} +\usepackage[margin=1in]{geometry} +\usepackage{color} +\usepackage{fancyvrb} +\newcommand{\VerbBar}{|} +\newcommand{\VERB}{\Verb[commandchars=\\\{\}]} +\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} +% Add ',fontsize=\small' for more characters per line +\usepackage{framed} +\definecolor{shadecolor}{RGB}{248,248,248} +\newenvironment{Shaded}{\begin{snugshade}}{\end{snugshade}} +\newcommand{\AlertTok}[1]{\textcolor[rgb]{0.94,0.16,0.16}{#1}} +\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{#1}} +\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}} +\newcommand{\BuiltInTok}[1]{#1} +\newcommand{\CharTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}} +\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textit{#1}}} +\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{#1}} +\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{#1}}} +\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{#1}} +\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}} +\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\newcommand{\ErrorTok}[1]{\textcolor[rgb]{0.64,0.00,0.00}{\textbf{#1}}} +\newcommand{\ExtensionTok}[1]{#1} +\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.00,0.00,0.81}{#1}} +\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{#1}}} +\newcommand{\ImportTok}[1]{#1} +\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.13,0.29,0.53}{\textbf{#1}}} +\newcommand{\NormalTok}[1]{#1} +\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.81,0.36,0.00}{\textbf{#1}}} +\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{#1}} +\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textit{#1}}} +\newcommand{\RegionMarkerTok}[1]{#1} +\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.81,0.36,0.00}{\textbf{#1}}} +\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}} +\newcommand{\StringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}} +\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.00,0.00,0.00}{#1}} +\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.31,0.60,0.02}{#1}} +\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.56,0.35,0.01}{\textbf{\textit{#1}}}} +\usepackage{longtable,booktabs,array} +\usepackage{calc} % for calculating minipage widths +% Correct order of tables after \paragraph or \subparagraph +\usepackage{etoolbox} +\makeatletter +\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} +\makeatother +% Allow footnotes in longtable head/foot +\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} +\makesavenoteenv{longtable} +\usepackage{graphicx} +\makeatletter +\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} +\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} +\makeatother +% Scale images if necessary, so that they will not overflow the page +% margins by default, and it is still possible to overwrite the defaults +% using explicit options in \includegraphics[width, height, ...]{} +\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} +% Set default figure placement to htbp +\makeatletter +\def\fps@figure{htbp} +\makeatother +\setlength{\emergencystretch}{3em} % prevent overfull lines +\providecommand{\tightlist}{% + \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} +\setcounter{secnumdepth}{-\maxdimen} % remove section numbering +\ifLuaTeX + \usepackage{selnolig} % disable illegal ligatures +\fi +\usepackage{bookmark} +\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available +\urlstyle{same} +\hypersetup{ + pdftitle={TP2 - Statistique Descriptive}, + hidelinks, + pdfcreator={LaTeX via pandoc}} + +\title{TP2 - Statistique Descriptive} +\author{} +\date{\vspace{-2.5em}3MIC - 2024-2025} + +\begin{document} +\maketitle + +{ +\setcounter{tocdepth}{4} +\tableofcontents +} +Ce TP a pour objectif de mener l'étude descriptive uni- et +bi-dimensionnelle du jeu de données \texttt{wine} disponible sous +Moodle. Vous rédigerez les réponses et vos observations dans le script +.Rmd du TP au fur et à mesure. Vous pourrez compiler votre script à la +fin du TP pour obtenir un compte-rendu du TP. + +\emph{Remarque : pensez à enlever les ``eval=F'' au fur et à mesure de +l'avancement dans le TP pour avoir les résultats dans votre compte-rendu +final de TP.} + +\section{Données}\label{donnuxe9es} + +On va étudier le jeu de données \textbf{wine} disponible sur la page +moodle du cours. Commencez par récupérer ce jeu de données et +sauvegardez le fichier dans votre dossier de travail. + +Le jeu de données \textbf{wine } comprend des mesures physico-chimiques +réalisées sur un échantillon de \emph{\(600\) }vins (rouges et blancs) +du Portugal. Ces mesures sont complétées par une évaluation sensorielle +de la qualité par un ensemble d'experts. Chaque vin est décrit par les +variables suivantes : + +\begin{itemize} +\tightlist +\item + \emph{Qualite} : son évaluation sensorielle par les experts + (``bad'',``medium'',``good''), +\item + \emph{Type} : son type (1 pour un vin rouge, 0 pour un vin blanc), +\item + \emph{AcidVol} : la teneur en acide volatile (en g/dm3 d'acide + acétique), +\item + \emph{AcidCitr} : la teneur en acide citrique (en g/dm3), +\item + \emph{SO2lbr} : le dosage du dioxyde de soufre libre (en mg/dm3), +\item + \emph{SO2tot} : le dosage du dioxyde de soufre total (en mg/dm3), +\item + \emph{Densite} : la densité (en g/cm3), +\item + \emph{Alcool} : le degré d'alcool (en \% Vol.). +\end{itemize} + +Dans un premier temps, commencez par charger le jeu de données à l'aide +de la fonction \texttt{read.table()}. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{wine }\OtherTok{\textless{}{-}} \FunctionTok{read.table}\NormalTok{(}\StringTok{"wine.txt"}\NormalTok{,}\AttributeTok{header=}\ConstantTok{TRUE}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +Vous pouvez voir les premières lignes du jeu de données à l'aide de la +fonction \texttt{head()} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{head}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + Qualite Type AcidVol AcidCitr SO2lbr SO2tot Densite Alcool +1352 medium 1 0.62 0.01 8 46 0.99332 11.8 +5493 medium 0 0.34 0.10 17 63 0.99370 9.2 +5153 medium 0 0.22 0.22 39 110 0.99855 9.0 +5308 medium 0 0.35 0.46 61 183 0.99786 9.0 +3866 medium 0 0.42 0.32 20 167 0.99479 10.6 +694 medium 1 0.48 0.32 21 122 0.99840 9.4 +\end{verbatim} + +\textbf{Question :} Contrôlez la dimension du jeu de données +(c'est-à-dire le nombre d'individus et le nombre de variables) ? Vous +pouvez vous aider des fonctions \texttt{dim()}, \texttt{nrow()}et +\texttt{ncol()}. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{dim}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 600 8 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{nrow}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 600 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ncol}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 8 +\end{verbatim} + +\textbf{Question :} Contrôlez que l'objet \texttt{wine} est bien de type +data.frame (commande \texttt{is.data.frame()}) ? Remarquons que l'on +peut obtenir les noms des variables grâce à la commande +\texttt{names(wine)} ou \texttt{colnames(wine)}. Plus largement, on peut +utiliser la commande \texttt{attributes()}. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{is.data.frame}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] TRUE +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{names}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] "Qualite" "Type" "AcidVol" "AcidCitr" "SO2lbr" "SO2tot" "Densite" +[8] "Alcool" +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{colnames}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] "Qualite" "Type" "AcidVol" "AcidCitr" "SO2lbr" "SO2tot" "Densite" +[8] "Alcool" +\end{verbatim} + +\textbf{Question :} Quelle est la nature de chaque variable ? Vous +pouvez vous aider de la commande \texttt{str()}. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{str}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +'data.frame': 600 obs. of 8 variables: + $ Qualite : chr "medium" "medium" "medium" "medium" ... + $ Type : int 1 0 0 0 0 1 0 0 0 0 ... + $ AcidVol : num 0.62 0.34 0.22 0.35 0.42 0.48 0.21 0.28 0.3 0.4 ... + $ AcidCitr: num 0.01 0.1 0.22 0.46 0.32 0.32 0.32 0.14 0.25 0.42 ... + $ SO2lbr : num 8 17 39 61 20 21 39 64 21 41 ... + $ SO2tot : int 46 63 110 183 167 122 113 159 124 176 ... + $ Densite : num 0.993 0.994 0.999 0.998 0.995 ... + $ Alcool : num 11.8 9.2 9 9 10.6 9.4 10.2 10 10.8 9.4 ... +\end{verbatim} + +Attention, il faut bien préciser à R les variables qui doivent être +considérées comme qualitatives. On utilise donc la fonction +\texttt{as.factor()} sur les variables \emph{Qualite} et \emph{Type}. On +va aussi en profiter pour renommer les modalités de la variable +\emph{Type} en \texttt{blanc}et \texttt{rouge}. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Qualite}\OtherTok{\textless{}{-}}\FunctionTok{as.factor}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite)} +\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Type}\OtherTok{\textless{}{-}}\FunctionTok{factor}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Type,}\AttributeTok{labels=}\FunctionTok{c}\NormalTok{(}\StringTok{"blanc"}\NormalTok{,}\StringTok{"rouge"}\NormalTok{))} +\FunctionTok{head}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + Qualite Type AcidVol AcidCitr SO2lbr SO2tot Densite Alcool +1352 medium rouge 0.62 0.01 8 46 0.99332 11.8 +5493 medium blanc 0.34 0.10 17 63 0.99370 9.2 +5153 medium blanc 0.22 0.22 39 110 0.99855 9.0 +5308 medium blanc 0.35 0.46 61 183 0.99786 9.0 +3866 medium blanc 0.42 0.32 20 167 0.99479 10.6 +694 medium rouge 0.48 0.32 21 122 0.99840 9.4 +\end{verbatim} + +On peut obtenir un résumé rapide du jeu de données à l'aide de la +fonction \texttt{summary()} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{summary}\NormalTok{(wine)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + Qualite Type AcidVol AcidCitr SO2lbr + bad : 19 blanc:425 Min. :0.1000 Min. :0.0000 Min. : 2.00 + good :110 rouge:175 1st Qu.:0.2400 1st Qu.:0.2400 1st Qu.: 15.75 + medium:471 Median :0.3000 Median :0.3000 Median : 27.00 + Mean :0.3512 Mean :0.3141 Mean : 29.41 + 3rd Qu.:0.4300 3rd Qu.:0.3900 3rd Qu.: 41.00 + Max. :1.0400 Max. :1.0000 Max. :112.00 + SO2tot Densite Alcool + Min. : 7.0 Min. :0.9875 Min. : 8.00 + 1st Qu.: 68.0 1st Qu.:0.9925 1st Qu.: 9.50 + Median :114.5 Median :0.9949 Median :10.40 + Mean :111.2 Mean :0.9947 Mean :10.49 + 3rd Qu.:154.0 3rd Qu.:0.9970 3rd Qu.:11.30 + Max. :278.0 Max. :1.0030 Max. :14.00 +\end{verbatim} + +\section{\texorpdfstring{Présentation de +\texttt{ggplot2}}{Présentation de ggplot2}}\label{pruxe9sentation-de-ggplot2} + +Avant de commencer l'analyse uni- et bi-dimensionnelle du jeu de +données, on va ici donner quelques notions sur les graphiques avec +\texttt{ggplot2} pour comprendre la suite. + +\href{https://ggplot2.tidyverse.org/}{\textbf{ggplot2}} est une +extension dédiée aux graphiques. Elle est basée sur une syntaxe +particulière (il faut oublier les graphiques de base de R) mais robuste +et efficace pour la construction de graphiques complexes. Elle part du +principe (comme tout package de tidyverse) que les données relatives au +graphique sont stockées dans un tableau (data.frame ou tibble). + +Un graphique en \texttt{ggplot2} s'initialise avec la fonction +\texttt{ggplot()} qui prend en argument le jeu de données étudié. Par +exemple, + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{gEx }\OtherTok{\textless{}{-}} \FunctionTok{ggplot}\NormalTok{(}\AttributeTok{data=}\NormalTok{wine)} +\end{Highlighting} +\end{Shaded} + +Pour l'instant, on ne voit rien mais pourtant l'objet \texttt{gEx} +contient des informations: + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{summary}\NormalTok{(gEx)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +data: Qualite, Type, AcidVol, AcidCitr, SO2lbr, SO2tot, Densite, Alcool + [600x8] +faceting: + compute_layout: function + draw_back: function + draw_front: function + draw_labels: function + draw_panels: function + finish_data: function + init_scales: function + map_data: function + params: list + setup_data: function + setup_params: function + shrink: TRUE + train_scales: function + vars: function + super: +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{names}\NormalTok{(gEx)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + [1] "data" "layers" "scales" "guides" "mapping" + [6] "theme" "coordinates" "facet" "plot_env" "layout" +[11] "labels" +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{gEx}\SpecialCharTok{$}\NormalTok{layers} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +list() +\end{verbatim} + +mais pour l'instant son \texttt{layers} est vide. + +On ajoute ensuite des éléments graphiques, appelés \texttt{geom}, à +l'objet graphique grâce à l'opérateur \texttt{+} et on précise à l'aide +de la fonction \texttt{aes()} les données à utiliser en argument du +\texttt{geom}. Par exemple, si on veut tracer le nuage de points entre +les variables \texttt{Densite} et \texttt{Alcool} : + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(}\AttributeTok{data=}\NormalTok{wine,}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Densite,}\AttributeTok{y=}\NormalTok{Alcool))}\SpecialCharTok{+} + \FunctionTok{geom\_point}\NormalTok{()} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-12-1.pdf} + +Parmi les \texttt{geom} les plus utilisés, on peut citer + +\begin{itemize} +\tightlist +\item + \texttt{geom\_point()} (nuage de points) +\item + \texttt{geom\_line()}(trace des lignes) +\item + \texttt{geom\_bar()} (représentation en bâtons) +\item + \texttt{geom\_boxplot()} (boxplot) +\item + \texttt{geom\_violin()} (violin plot) +\item + \texttt{geom\_histogram()} (histogramme) +\item + \texttt{geom\_density()} (densité) +\item + \texttt{geom\_smooth()} +\end{itemize} + +On peut ajouter un \textbf{mappage}, c'est à dire une mise en relation +entre un attribut graphique d'un \texttt{geom} et une variable du +tableau de données. Par exemple, on peut mettre des couleurs à un nuage +de points en fonction d'une variable qualitative, \ldots{} Il faut bien +distinguer un mappage d'une modification d'un attribut graphique sans +lien avec une variable. Une règle importante à retenir est donc + +\begin{itemize} +\tightlist +\item + pour définir un mappage (relation entre les valeurs d'une variable et + un attribut graphique), on le déclare dans \texttt{aes()} +\item + pour modifier un attribut graphique de la même manière pour tous les + points, on le définit en-dehors de la fonction \texttt{aes()}. +\end{itemize} + +Par exemple, + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(}\AttributeTok{data=}\NormalTok{wine)}\SpecialCharTok{+} + \FunctionTok{geom\_point}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Densite,}\AttributeTok{y=}\NormalTok{Alcool,}\AttributeTok{color=}\NormalTok{Type))} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-13-1.pdf} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(}\AttributeTok{data=}\NormalTok{wine)}\SpecialCharTok{+} + \FunctionTok{geom\_point}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Densite,}\AttributeTok{y=}\NormalTok{Alcool),}\AttributeTok{color=}\StringTok{"blue"}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-14-1.pdf} + +On peut représenter plusieurs \texttt{geom} sur un même graphique +simultanément, il suffit d'utiliser l'opérateur \texttt{+} pour les +ajouter au fur et à mesure. Par exemple, + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(}\AttributeTok{data=}\NormalTok{wine)}\SpecialCharTok{+} + \FunctionTok{geom\_violin}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Qualite,}\AttributeTok{y=}\NormalTok{Alcool))}\SpecialCharTok{+} + \FunctionTok{geom\_point}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Qualite,}\AttributeTok{y=}\NormalTok{Alcool), }\AttributeTok{col =} \StringTok{"blue"}\NormalTok{, }\AttributeTok{alpha =} \FloatTok{0.2}\NormalTok{,}\AttributeTok{position=}\StringTok{"jitter"}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-15-1.pdf} + +Les \emph{scales} permettent de modifier la façon dont un attribut +graphique est lié aux valeurs d'une variable. Pour les modifier, on +ajoute un nouvel élément de la forme +\texttt{scale\_\textless{}attribut\textgreater{}\_\textless{}type\textgreater{}} +à l'objet graphique ggplot2 avec \texttt{+}. Les fonctions \emph{scale} +les plus connues sont : + +\begin{itemize} +\tightlist +\item + \texttt{scale\_size()} (avec son argument \texttt{range}) pour + modifier les tailles minimales, maximales, \ldots{} +\item + \texttt{scale\_x()} et \texttt{scale\_y()} pour modifier l'axe + \texttt{x}et l'axe \texttt{y} respectivement +\item + \texttt{scale\_x\_continuous()} (resp. \texttt{scale\_x\_discrete()}) + pour modifier l'axe des \texttt{x} dans le cas d'une variable + quantitative (resp. une variable qualitative) +\item + \texttt{scale\_y\_continuous()} (resp. \texttt{scale\_y\_discrete()}) + pour modifier l'axe des \texttt{y} dans le cas d'une variable + quantitative (resp. une variable qualitative) +\item + \texttt{scale\_color()} pour modifier les couleurs de dessin +\item + \texttt{scale\_fill()} pour modifier les couleurs de remplissage +\end{itemize} + +Pour les couleurs, on peut spécifier un gradient de couleur sur une +variable quantitative avec \texttt{scale\_color\_gradient()}, modifier +manuellement la palette de couleur avec \texttt{scale\_color\_manual()}, +faire appel à une palette de couleur prédéfinie (par exemple en +utilisant le package +\href{\%22https://cran.r-project.org/web/packages/viridis/vignettes/intro-to-viridis.html\%22}{viridis} +avec \texttt{scale\_color\_viridis}, en s'appuyant sur les palettes +disponibles dans +\href{https://colorbrewer2.org/\#type=sequential&scheme=BuGn&n=3}{ColorBrewer} +avec \texttt{scale\_color\_brewer()}), \ldots{} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(}\AttributeTok{data=}\NormalTok{wine)}\SpecialCharTok{+} + \FunctionTok{geom\_point}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Alcool,}\AttributeTok{y=}\NormalTok{Densite,}\AttributeTok{size=}\NormalTok{AcidVol,}\AttributeTok{color=}\NormalTok{Type))}\SpecialCharTok{+} + \FunctionTok{scale\_size}\NormalTok{(}\StringTok{"Acide vol."}\NormalTok{, }\AttributeTok{range =} \FunctionTok{c}\NormalTok{(}\DecValTok{0}\NormalTok{,}\FloatTok{1.5}\NormalTok{),}\AttributeTok{breaks=}\FunctionTok{seq}\NormalTok{(}\DecValTok{0}\NormalTok{,}\FloatTok{1.5}\NormalTok{,}\FloatTok{0.2}\NormalTok{)) }\SpecialCharTok{+} + \FunctionTok{scale\_x\_continuous}\NormalTok{(}\StringTok{"Alcool"}\NormalTok{,}\AttributeTok{limits=}\FunctionTok{c}\NormalTok{(}\DecValTok{8}\NormalTok{,}\DecValTok{16}\NormalTok{)) }\SpecialCharTok{+} + \FunctionTok{scale\_y\_continuous}\NormalTok{(}\StringTok{"Densité"}\NormalTok{,}\AttributeTok{limits=}\FunctionTok{c}\NormalTok{(}\FloatTok{0.985}\NormalTok{,}\FloatTok{1.01}\NormalTok{))} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-16-1.pdf} + +Remarque : on peut modifier certains éléments avec une commande +spécifique comme + +\begin{itemize} +\tightlist +\item + \texttt{ggtitle()} pour modifier le titre +\item + \texttt{xlab()}et \texttt{ylab()} pour modifier l'intituler de l'axe + des abscisses et des ordonnées respectivement +\end{itemize} + +En bref, les possibles avec \texttt{ggplot2} sont infinis car de +nombreux éléments sont personnalisables. Voici quelques références pour +les graphiques en \texttt{ggplot2} parmi les nombreuses ressources +disponibles sur le web : + +\begin{itemize} +\tightlist +\item + Le livre \emph{Ggplot2: Elegant Graphics for Data Analysis} de H. + Wickham. {[}@ggplot2{]} +\item + Le \href{\%22https://ggplot2.tidyverse.org/\%22}{site web de ggplot2} +\item + \href{https://www.r-graph-gallery.com/ggplot2-package.html}{The R + Graph Gallery} +\item + \href{https://thinkr.fr/pdf/ggplot2-french-cheatsheet.pdf}{The Cheat + Sheet de ggplot 2} +\end{itemize} + +\section{Etude statistique +unidimensionnelle}\label{etude-statistique-unidimensionnelle} + +\subsection{Pour une variable +qualitative}\label{pour-une-variable-qualitative} + +Nous nous intéressons dans cette partie aux deux variables qualitatives +\emph{Type} et \emph{Qualite}. + +\textbf{Question :} A l'aide des commandes \texttt{table()}, +\texttt{summary()} et \texttt{levels()}, donnez un résumé de la variable +\texttt{Type}. Quels sont les modalités du facteur ? + +\begin{Shaded} +\begin{Highlighting}[] +\CommentTok{\# A COMPLETER} +\FunctionTok{summary}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Type)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +blanc rouge + 425 175 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{levels}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Type} +\NormalTok{ )} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] "blanc" "rouge" +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{table}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Type)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + +blanc rouge + 425 175 +\end{verbatim} + +\textbf{Question :} A l'aide du code suivant, résumez graphiquement la +variable \texttt{Type} par une représentation par secteurs ou un +diagramme en barres. Interprétez les résultats. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{g1}\OtherTok{\textless{}{-}}\FunctionTok{ggplot}\NormalTok{(wine, }\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Type))}\SpecialCharTok{+} + \FunctionTok{geom\_bar}\NormalTok{()}\SpecialCharTok{+} + \FunctionTok{ylab}\NormalTok{(}\StringTok{""}\NormalTok{)}\SpecialCharTok{+}\FunctionTok{ggtitle}\NormalTok{(}\StringTok{"Effectifs"}\NormalTok{)} +\NormalTok{g2}\OtherTok{\textless{}{-}}\FunctionTok{ggplot}\NormalTok{(wine, }\FunctionTok{aes}\NormalTok{(}\AttributeTok{x =}\NormalTok{ Type)) }\SpecialCharTok{+} + \FunctionTok{geom\_bar}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{y =}\NormalTok{ (..count..)}\SpecialCharTok{/}\FunctionTok{sum}\NormalTok{(..count..)))}\SpecialCharTok{+}\FunctionTok{ylab}\NormalTok{(}\StringTok{""}\NormalTok{)}\SpecialCharTok{+}\FunctionTok{ggtitle}\NormalTok{(}\StringTok{"Frequences"}\NormalTok{)} + +\NormalTok{df }\OtherTok{\textless{}{-}} \FunctionTok{data.frame}\NormalTok{(}\AttributeTok{group =} \FunctionTok{levels}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Type),} + \AttributeTok{value =} \FunctionTok{as.vector}\NormalTok{(}\FunctionTok{table}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Type))}\SpecialCharTok{/}\FunctionTok{nrow}\NormalTok{(wine))} +\NormalTok{g3}\OtherTok{\textless{}{-}}\FunctionTok{ggplot}\NormalTok{(df, }\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\StringTok{""}\NormalTok{, }\AttributeTok{y=}\NormalTok{value, }\AttributeTok{fill=}\NormalTok{group))}\SpecialCharTok{+} + \FunctionTok{geom\_bar}\NormalTok{(}\AttributeTok{width =} \DecValTok{1}\NormalTok{, }\AttributeTok{stat =} \StringTok{"identity"}\NormalTok{)}\SpecialCharTok{+} + \FunctionTok{coord\_polar}\NormalTok{(}\StringTok{"y"}\NormalTok{, }\AttributeTok{start=}\DecValTok{0}\NormalTok{)}\SpecialCharTok{+} + \FunctionTok{theme}\NormalTok{(}\AttributeTok{legend.position=}\StringTok{"bottom"}\NormalTok{)} +\FunctionTok{grid.arrange}\NormalTok{(g3,g1,g2,}\AttributeTok{ncol=}\DecValTok{3}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-18-1.pdf} + +\textbf{Question :} La variable \emph{Qualite} est une variable +qualitative ordinale. On peut donc utiliser les effectifs cumulés et les +fréquences cumulées. Pour tracer les fréquences cumulées, il faut que +l'ordre des modalités soit bien compris par R. Ici, on commence par +réorganiser les modalités en \texttt{bad}, \texttt{medium} et +\texttt{good}. A l'aide des codes suivants, étudiez la variable +\emph{Qualite}. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Qualite }\OtherTok{\textless{}{-}} \FunctionTok{fct\_relevel}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite,}\StringTok{"bad"}\NormalTok{,}\StringTok{"medium"}\NormalTok{,}\StringTok{"good"}\NormalTok{)} + +\NormalTok{EffQual}\OtherTok{=}\FunctionTok{as.vector}\NormalTok{(}\FunctionTok{table}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite))} +\NormalTok{FreqQual}\OtherTok{=} \FunctionTok{data.frame}\NormalTok{(}\AttributeTok{Eff =}\NormalTok{ EffQual, }\AttributeTok{Freq =}\NormalTok{ EffQual}\SpecialCharTok{/}\FunctionTok{length}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite), }\AttributeTok{FreqCumul=}\FunctionTok{cumsum}\NormalTok{(EffQual)}\SpecialCharTok{/}\FunctionTok{length}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite))} +\FunctionTok{rownames}\NormalTok{(FreqQual)}\OtherTok{=}\FunctionTok{levels}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite)} + +\NormalTok{knitr}\SpecialCharTok{::}\FunctionTok{kable}\NormalTok{(FreqQual, }\AttributeTok{caption =} \StringTok{\textquotesingle{}Description de la variable Qualite\textquotesingle{}}\NormalTok{,}\AttributeTok{booktabs =} \ConstantTok{TRUE}\NormalTok{,}\AttributeTok{digits=}\DecValTok{3}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\begin{longtable}[]{@{}lrrr@{}} +\caption{Description de la variable Qualite}\tabularnewline +\toprule\noalign{} +& Eff & Freq & FreqCumul \\ +\midrule\noalign{} +\endfirsthead +\toprule\noalign{} +& Eff & Freq & FreqCumul \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +bad & 19 & 0.032 & 0.032 \\ +medium & 471 & 0.785 & 0.817 \\ +good & 110 & 0.183 & 1.000 \\ +\end{longtable} + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{df }\OtherTok{\textless{}{-}} \FunctionTok{data.frame}\NormalTok{(}\AttributeTok{Qualite =} \FunctionTok{levels}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite), }\AttributeTok{value =} \FunctionTok{table}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite),} + \AttributeTok{valuecumul =} \DecValTok{100} \SpecialCharTok{*} \FunctionTok{cumsum}\NormalTok{(}\FunctionTok{prop.table}\NormalTok{(}\FunctionTok{table}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite))))} +\NormalTok{df}\SpecialCharTok{$}\NormalTok{Qualite }\OtherTok{\textless{}{-}} \FunctionTok{fct\_relevel}\NormalTok{(df}\SpecialCharTok{$}\NormalTok{Qualite, }\StringTok{"bad"}\NormalTok{, }\StringTok{"medium"}\NormalTok{, }\StringTok{"good"}\NormalTok{)} + +\NormalTok{df }\OtherTok{\textless{}{-}} \FunctionTok{data.frame}\NormalTok{(df, }\AttributeTok{freq =}\NormalTok{ df}\SpecialCharTok{$}\NormalTok{value.Freq}\SpecialCharTok{/}\FunctionTok{nrow}\NormalTok{(wine))} +\NormalTok{g1 }\OtherTok{\textless{}{-}} \FunctionTok{ggplot}\NormalTok{(wine) }\SpecialCharTok{+} \FunctionTok{geom\_bar}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x =}\NormalTok{ Qualite)) }\SpecialCharTok{+} \FunctionTok{ggtitle}\NormalTok{(}\StringTok{"Effectifs"}\NormalTok{)}\SpecialCharTok{+}\FunctionTok{xlab}\NormalTok{(}\StringTok{"Qualite"}\NormalTok{)} +\NormalTok{g2 }\OtherTok{\textless{}{-}} \FunctionTok{ggplot}\NormalTok{(wine) }\SpecialCharTok{+} \FunctionTok{geom\_bar}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x =}\NormalTok{ Qualite, }\AttributeTok{y =}\NormalTok{ ..prop.., }\AttributeTok{group =} \DecValTok{1}\NormalTok{)) }\SpecialCharTok{+} \FunctionTok{ggtitle}\NormalTok{(}\StringTok{"Frequences"}\NormalTok{)}\SpecialCharTok{+}\FunctionTok{xlab}\NormalTok{(}\StringTok{"Qualite"}\NormalTok{)} +\NormalTok{g3 }\OtherTok{\textless{}{-}} \FunctionTok{ggplot}\NormalTok{(df, }\FunctionTok{aes}\NormalTok{(}\AttributeTok{x =}\NormalTok{ Qualite, }\AttributeTok{y =}\NormalTok{ valuecumul)) }\SpecialCharTok{+} \FunctionTok{geom\_bar}\NormalTok{(}\AttributeTok{stat =} \StringTok{"identity"}\NormalTok{) }\SpecialCharTok{+} + \FunctionTok{ggtitle}\NormalTok{(}\StringTok{"Fréquences cumulées"}\NormalTok{)} + +\NormalTok{g4 }\OtherTok{\textless{}{-}} \FunctionTok{ggplot}\NormalTok{(df, }\FunctionTok{aes}\NormalTok{(}\AttributeTok{x =} \StringTok{""}\NormalTok{, }\AttributeTok{y =}\NormalTok{ freq, }\AttributeTok{fill =}\NormalTok{ Qualite)) }\SpecialCharTok{+} \FunctionTok{geom\_bar}\NormalTok{(}\AttributeTok{width =} \DecValTok{1}\NormalTok{, }\AttributeTok{stat =} \StringTok{"identity"}\NormalTok{) }\SpecialCharTok{+} + \FunctionTok{coord\_polar}\NormalTok{(}\StringTok{"y"}\NormalTok{, }\AttributeTok{start =} \DecValTok{0}\NormalTok{)} +\FunctionTok{grid.arrange}\NormalTok{(g1, g2, g3, g4, }\AttributeTok{ncol =} \DecValTok{2}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-20-1.pdf} + +\subsection{Pour une variable +quantitative}\label{pour-une-variable-quantitative} + +Pour cette section, on se focalise sur la variable \emph{Alcool}. + +\subsubsection{Indicateurs statistiques}\label{indicateurs-statistiques} + +\textbf{Question :} Que calculent les commandes \texttt{mean()}, +\texttt{median()}, \texttt{var()}, \texttt{sd()}, \texttt{range()} ? +Calculez l'étendue des données. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{mean}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 10.48592 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{median}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 10.4 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{var}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 1.316059 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{sd}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 1.147196 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{range}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 8 14 +\end{verbatim} + +\textbf{Question :} Etudiez les sorties des commandes +\texttt{summary(wine\$Alcool)} et \texttt{quantile(wine\$Alcool)}. +Donnez également l'écart interquartile et les valeurs adjacentes. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{summary}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + Min. 1st Qu. Median Mean 3rd Qu. Max. + 8.00 9.50 10.40 10.49 11.30 14.00 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{quantile}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool,}\FloatTok{0.75}\NormalTok{,}\AttributeTok{names=}\ConstantTok{FALSE}\NormalTok{)}\SpecialCharTok{{-}}\FunctionTok{quantile}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool,}\FloatTok{0.25}\NormalTok{,}\AttributeTok{names =} \ConstantTok{FALSE}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 1.8 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{quantile}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + 0% 25% 50% 75% 100% + 8.0 9.5 10.4 11.3 14.0 +\end{verbatim} + +\subsubsection{Représentations +graphiques}\label{repruxe9sentations-graphiques} + +Le but de la statistique exploratoire est de synthétiser, résumer et +structurer l'information contenue dans des données. On utilise pour cela +des représentations de données sous forme de graphiques. + +\textbf{Question :} On peut utiliser la représentation par histogramme. +Tapez \texttt{H\textless{}-hist(wine\$Alcool)} et commentez les +différents attributs de \texttt{H}. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{H}\OtherTok{\textless{}{-}}\FunctionTok{hist}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-23-1.pdf} + +Pour tracer un histogramme avec ggplot, vous pouvez utiliser le code +suivant. Commentez. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{g1}\OtherTok{\textless{}{-}}\FunctionTok{ggplot}\NormalTok{(wine,}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Alcool))}\SpecialCharTok{+} + \FunctionTok{geom\_histogram}\NormalTok{(}\AttributeTok{bins=}\DecValTok{15}\NormalTok{,}\AttributeTok{color=}\StringTok{"black"}\NormalTok{,}\AttributeTok{fill=}\StringTok{"white"}\NormalTok{)}\SpecialCharTok{+} + \FunctionTok{ggtitle}\NormalTok{(}\StringTok{"Histo. des effectifs"}\NormalTok{)}\SpecialCharTok{+} + \FunctionTok{ylab}\NormalTok{(}\StringTok{"Frequency"}\NormalTok{)}\SpecialCharTok{+}\FunctionTok{xlab}\NormalTok{(}\StringTok{"Alcool"}\NormalTok{)} +\NormalTok{g2}\OtherTok{\textless{}{-}}\FunctionTok{ggplot}\NormalTok{(wine,}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Alcool))}\SpecialCharTok{+} + \FunctionTok{geom\_histogram}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{y=}\NormalTok{..density..),}\AttributeTok{bins=}\DecValTok{15}\NormalTok{,}\AttributeTok{color=}\StringTok{"black"}\NormalTok{, }\AttributeTok{fill=}\StringTok{"white"}\NormalTok{)}\SpecialCharTok{+} + \FunctionTok{ggtitle}\NormalTok{(}\StringTok{"Histo. des frequences"}\NormalTok{)}\SpecialCharTok{+} + \FunctionTok{ylab}\NormalTok{(}\StringTok{"Density"}\NormalTok{)}\SpecialCharTok{+}\FunctionTok{xlab}\NormalTok{(}\StringTok{"Alcool"}\NormalTok{)} +\FunctionTok{grid.arrange}\NormalTok{(g1,g2,}\AttributeTok{ncol=}\DecValTok{2}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/hist-1.pdf} + +\textbf{Question :} A l'aide du code suivant, représentez un boxplot de +la variable ``Alcool''. Que remarquez-vous ? Comparez avec les valeurs +adjacentes calculées précédemment. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(wine,}\FunctionTok{aes}\NormalTok{(}\AttributeTok{y=}\NormalTok{Alcool))}\SpecialCharTok{+}\FunctionTok{geom\_boxplot}\NormalTok{()} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-24-1.pdf} + +Pour tracer les boxplots de toutes les variables quantitatives en même +temps, il faut réorganiser en amont le jeu de données. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{wineaux}\OtherTok{\textless{}{-}}\FunctionTok{melt}\NormalTok{(wine[,}\SpecialCharTok{{-}}\FunctionTok{c}\NormalTok{(}\DecValTok{1}\NormalTok{,}\DecValTok{2}\NormalTok{)])} +\FunctionTok{ggplot}\NormalTok{(wineaux,}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{variable,}\AttributeTok{y=}\NormalTok{value))}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{()} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/boxplot-1.pdf} + +\textbf{Question :} En vous aidant de l'aide de R et des résultats de la +section précédente, tapez \texttt{B\textless{}-boxplot(wine\$Alcool)} et +commentez les différents attributs de \texttt{B}. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{B}\OtherTok{\textless{}{-}}\FunctionTok{boxplot}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Alcool)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-25-1.pdf} + +\section{Statistiques descriptives +bidimensionnelles}\label{statistiques-descriptives-bidimensionnelles} + +\subsection{Entre 2 variables +quantitatives}\label{entre-2-variables-quantitatives} + +\textbf{Question :} Calculez la matrice de corrélation des variables +quantitatives (commande \texttt{cor()}) ou la matrice de +variance-covariance (commandes \texttt{var()} ou \texttt{cov()}). +Représentez graphiquement les corrélations à l'aide de la fonction +\texttt{corrplot()} de la librairie \texttt{corrplot}. Vous pourrez +utiliser l'option \texttt{method="ellipse"} pour une meilleure +lisibilité. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{print}\NormalTok{(}\StringTok{\textquotesingle{}Correlation\textquotesingle{}}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] "Correlation" +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{cor}\NormalTok{(wine[,}\SpecialCharTok{{-}}\FunctionTok{c}\NormalTok{(}\DecValTok{1}\NormalTok{,}\DecValTok{2}\NormalTok{)])} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + AcidVol AcidCitr SO2lbr SO2tot Densite Alcool +AcidVol 1.00000000 -0.4107821 -0.37071293 -0.41542773 0.29814510 -0.02208799 +AcidCitr -0.41078214 1.0000000 0.14764139 0.20724080 0.12360061 -0.03949990 +SO2lbr -0.37071293 0.1476414 1.00000000 0.71394673 -0.03516798 -0.14830238 +SO2tot -0.41542773 0.2072408 0.71394673 1.00000000 -0.03003947 -0.24679350 +Densite 0.29814510 0.1236006 -0.03516798 -0.03003947 1.00000000 -0.67624598 +Alcool -0.02208799 -0.0394999 -0.14830238 -0.24679350 -0.67624598 1.00000000 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{print}\NormalTok{(}\StringTok{\textquotesingle{}Covariance\textquotesingle{}}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] "Covariance" +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{cov}\NormalTok{(wine[,}\SpecialCharTok{{-}}\FunctionTok{c}\NormalTok{(}\DecValTok{1}\NormalTok{,}\DecValTok{2}\NormalTok{)])} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + AcidVol AcidCitr SO2lbr SO2tot Densite +AcidVol 0.0268978296 -1.063582e-02 -1.077438119 -3.827641e+00 1.429567e-04 +AcidCitr -0.0106358172 2.492306e-02 0.413052087 1.838032e+00 5.704787e-05 +SO2lbr -1.0774381191 4.130521e-01 314.045063996 7.107860e+02 -1.822055e-03 +SO2tot -3.8276406511 1.838032e+00 710.785976628 3.156124e+03 -4.933866e-03 +Densite 0.0001429567 5.704787e-05 -0.001822055 -4.933866e-03 8.547444e-06 +Alcool -0.0041557797 -7.153760e-03 -3.014961677 -1.590554e+01 -2.268091e-03 + Alcool +AcidVol -0.004155780 +AcidCitr -0.007153760 +SO2lbr -3.014961677 +SO2tot -15.905542015 +Densite -0.002268091 +Alcool 1.316059100 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{help}\NormalTok{(corrplot)} +\FunctionTok{corrplot}\NormalTok{(}\FunctionTok{cor}\NormalTok{(wine[,}\SpecialCharTok{{-}}\FunctionTok{c}\NormalTok{(}\DecValTok{1}\NormalTok{,}\DecValTok{2}\NormalTok{)]),}\AttributeTok{method =} \StringTok{"ellipse"}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-26-1.pdf} + +\textbf{Question :} Interprétez les résultats. + +=\textgreater{} il y a une forte correlation negative entre l'Alcool et +la densié + +\textbf{Question :} Représentez graphiquement la \emph{Densite} en +fonction de l'\textbf{Alcool} à l'aide de la commande +\texttt{geom\_point()}. Au vu de ce graphique, les variables sont-elles +corrélées ? Vous pourrez ajouter la commande +\texttt{+geom\_smooth(method="lm")} pour tracer la droite de régression +linéaire. Est-ce cohérent avec la corrélation calculée ci-dessus ? + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(}\AttributeTok{data=}\NormalTok{wine)}\SpecialCharTok{+} + \FunctionTok{geom\_point}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Alcool,}\AttributeTok{y=}\NormalTok{Densite))}\SpecialCharTok{+} + \FunctionTok{geom\_smooth}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Alcool,}\AttributeTok{y=}\NormalTok{Densite),}\AttributeTok{method=}\StringTok{"lm"}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-27-1.pdf} + +\subsection{Entre une variable quantitative et une variable +qualitative}\label{entre-une-variable-quantitative-et-une-variable-qualitative} + +\textbf{Question :} Représentez le boxplot de la variable +\texttt{Alcool} pour chaque modalité de la variable qualitative +\emph{Type}. Même question avec \emph{Qualite}. Interprétez les +résultats. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(wine)}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Type,}\AttributeTok{y=}\NormalTok{Alcool))} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-28-1.pdf} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(wine)}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Qualite,}\AttributeTok{y=}\NormalTok{Alcool))} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-28-2.pdf} + +\textbf{Question :} Explorez les autres combinaisons de variables +quantitatives avec les variables qualitatives afin de déterminer les +variables fortement liées. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(wine)}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Type,}\AttributeTok{y=}\NormalTok{AcidVol))}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Qualite,}\AttributeTok{y=}\NormalTok{AcidVol))} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-29-1.pdf} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(wine)}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Type,}\AttributeTok{y=}\NormalTok{Densite))}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Qualite,}\AttributeTok{y=}\NormalTok{Densite))} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-29-2.pdf} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{ggplot}\NormalTok{(wine)}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Type,}\AttributeTok{y=}\NormalTok{AcidCitr))}\SpecialCharTok{+} + \FunctionTok{geom\_boxplot}\NormalTok{(}\FunctionTok{aes}\NormalTok{(}\AttributeTok{x=}\NormalTok{Qualite,}\AttributeTok{y=}\NormalTok{AcidCitr))} +\end{Highlighting} +\end{Shaded} + +\includegraphics{TP2-StatDesc_files/figure-latex/unnamed-chunk-29-3.pdf} + +\textbf{Question :} A l'aide de la fonction \texttt{eta2()} de la +librairie \texttt{BioStatR}, calculez le rapport de corrélation +\(\eta^2\) entre chaque variable quantitative et la variable +\emph{Type}. Commentez. Faites de même avec la variable \emph{Qualité}. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{eta2}\NormalTok{(}\AttributeTok{x=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{AcidVol,}\AttributeTok{y=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Type)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 0.4481639 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{eta2}\NormalTok{(}\AttributeTok{x=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{AcidCitr,}\AttributeTok{y=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Type)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 0.03693554 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{eta2}\NormalTok{(}\AttributeTok{x=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{SO2lbr,}\AttributeTok{y=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Type)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 0.2153399 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{eta2}\NormalTok{(}\AttributeTok{x=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{SO2tot,}\AttributeTok{y=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Type)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 0.4580193 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{eta2}\NormalTok{(}\AttributeTok{x=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Alcool,}\AttributeTok{y=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Type)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 0.003022674 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{eta2}\NormalTok{(}\AttributeTok{x=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Densite,}\AttributeTok{y=}\NormalTok{wine}\SpecialCharTok{$}\NormalTok{Type)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} +[1] 0.214444 +\end{verbatim} + +\subsection{Entre deux variables +qualitatives}\label{entre-deux-variables-qualitatives} + +\textbf{Question :} Analysez la table de contingence entre les deux +variables qualitatives \emph{Type} et \emph{Qualite} avec la commande +\texttt{table()}. Ajoutez les effectifs marginaux avec la commande +\texttt{addmargins()}. + +\begin{Shaded} +\begin{Highlighting}[] +\NormalTok{a}\OtherTok{=}\FunctionTok{table}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite,wine}\SpecialCharTok{$}\NormalTok{Type)} + +\FunctionTok{addmargins}\NormalTok{(a)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + + blanc rouge Sum + bad 17 2 19 + medium 319 152 471 + good 89 21 110 + Sum 425 175 600 +\end{verbatim} + +\textbf{Question :} Calculez et représentez les profils-lignes à l'aide +des fonctions \texttt{prop.table(...,\ margin\ =\ ...)}et +\texttt{mosaicplot}. Interprétez les résultats. Faites de même avec les +profils-colonnes. + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{prop.table}\NormalTok{(}\FunctionTok{table}\NormalTok{(wine}\SpecialCharTok{$}\NormalTok{Qualite,wine}\SpecialCharTok{$}\NormalTok{Type), }\AttributeTok{margin =} \DecValTok{1}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + +\begin{verbatim} + + blanc rouge + bad 0.8947368 0.1052632 + medium 0.6772824 0.3227176 + good 0.8090909 0.1909091 +\end{verbatim} + +\begin{Shaded} +\begin{Highlighting}[] +\FunctionTok{help}\NormalTok{(}\StringTok{"prop.table"}\NormalTok{)} +\end{Highlighting} +\end{Shaded} + + +\end{document} diff --git a/INSA/TP anadon/TP3-ACP.Rmd b/INSA/TP anadon/TP3-ACP.Rmd new file mode 100644 index 0000000..2d918f5 --- /dev/null +++ b/INSA/TP anadon/TP3-ACP.Rmd @@ -0,0 +1,291 @@ +--- +title: "TP3 - Analayse en Composantes Principales (ACP)" +date : "3MIC - 2024-2025" +output: + html_document: + toc: true + toc_float: true + toc_depth : 4 + number_sections: true +--- + +```{css,echo=F} +.badCode { +background-color: #C9DDE4; +} + +.corrO { background-color: rgb(255,238,237); } +.corrS { background-color: pink; color: black; border: 1px solid red; } +``` + +```{r setup, echo=FALSE, cache=FALSE} +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=TRUE, + cache=FALSE, + prompt=FALSE, + tidy=TRUE, + comment=NA, + message=FALSE, + warning=FALSE, + class.source="badCode") +opts_knit$set(width=75) +``` + +```{r,echo=F, error=F,warning=F} +library(corrplot) +library(ggplot2) +library(gridExtra) +library(FactoMineR) +library(factoextra) +library(reshape2) +``` + + +# Description des données + +Les données étudiées dans ce TP ont été recueillies à Rennes dans $112$ stations durant l'été 2001. Les 13 variables observées sont : + ++ maxO3 : Maximum de concentration d'ozone observé sur la journée en $\mu$gr/m3 ++ T9, T12, T15 : Température observée à 9, 12 et 15h ++ Ne9, Ne12, Ne15 : Nébulosité observée à 9, 12 et 15h ++ Vx9, Vx12, Vx15 : Composante E-O du vent à 9, 12 et 15h ++ vent : orientation du vent à 12h ++ pluie : occurrence ou non de précipitations ++ maxO3v : Maximum de concentration d'ozone observé la veille + +On charge les données, on transforme les variables qualitatives *pluie* et *vent*, et on supprime la dernière variable que l'on n'utilisera pas dans ce TP. + +```{r,eval=F} +Ozone<-read.table("Ozone.txt",header=T) +Ozone$pluie<-as.factor(Ozone$pluie) +Ozone$vent<-as.factor(Ozone$vent) +Ozone<-Ozone[,-11] +summary(Ozone) +``` + +Ainsi on a un jeu de données composé de $n=112$ individus et $p=12$ variables. + +```{r,eval=F} +dim(Ozone) +``` + + +**Question :** Pour vous familiariser avec le jeu de données, quelques statistiques descriptives ont été programmées. Commentez les résultats. + + +```{r,eval=F} +ggplot(melt(Ozone[,-c(11,12)]),aes(x=variable,y=value))+geom_boxplot() + +g1<-ggplot(Ozone,aes(x=maxO3))+geom_density() +g2<-ggplot(melt(Ozone[,c(2:4)]),aes(x=value,color=variable))+geom_density() +g3<-ggplot(melt(Ozone[,c(5:7)]),aes(x=value,color=variable))+geom_density() +g4<-ggplot(melt(Ozone[,c(8:10)]),aes(x=value,color=variable))+geom_density() +grid.arrange(g1,g2,g3,g4,ncol=2) + +ggplot(Ozone, aes(x = pluie)) + + geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences") + +quan <- as.vector(table(Ozone$vent))/nrow(Ozone) +df <- data.frame(group = levels(Ozone$vent),value = quan) +ggplot(df, aes(x="", y=value, fill=group))+ + geom_bar(width = 1, stat = "identity")+ coord_polar("y", start=0)+ theme(legend.position="bottom") +``` + +**Question :** Représentez graphiquement les corrélations des +variables quantitatives (vous pourrez utiliser la fonction `corrplot()`). +Quelles sont les variables linéairement corrélées (ou non) ? + +```{r} +corrplot(cor(Ozone[,-c(11,12)]),method = "ellipse") +``` + + +# ACP centrée + +Dans cette section, on décide de faire une analyse en composantes principales (ACP) sur les données centrées. A l'aide de la fonction `scale()`, centrez les données. Vérifiez que les variables sont bien centrées avec `apply(...,2,mean)`. + +```{r,eval=F} +OzoneC<-scale(Ozone[,-c(11,12)],scale=FALSE) # A COMPLETER +apply(OzoneC,2,mean) +``` + + + +## A la main +**Question **: A l'aide de la fonction `diag()`, créez la matrice de poids $W=\frac 1 n I_n$ et la métrique $M=I_p$. + +```{r,eval=F} +n=nrow(OzoneC) +p=ncol(OzoneC) +W<- diag(1/n,n) +M<- diag(1,p) +``` + + +**Question :** Quelle matrice cherche-t-on à diagonaliser dans ce cadre en ACP ? +Programmez cette matrice (rappelons que la multiplication matricielle est `%*%`) et diagonalisez-la à l'aide de la fonction `eigen()`. + +```{r,eval=F} +Gamma<- t(OzoneC)%*%W%*%OzoneC # A COMPLETER +A<-eigen(Gamma) +``` + + +**Question :** Que représentent les valeurs propres (`A$values`) dans ce cas ? Que représente la somme de ces valeurs propres ? Vérifiez numériquement. + +```{r,eval=F} +A$values +"La trace de gamma est l'inertie de Ozone" +sum(A$values) +sum(OzoneC**2)/n +``` + + +**Question :** Calculez les pourcentages (cumulés ou non) d'inertie portés par chaque axe. Combien de composantes principales décidez-vous de retenir ? Vous pouvez vous aider des fonctions `sum()` et `cumsum()`. + +```{r} +A$values/sum(A$values) +cumsum(A$values)/sum(A$values) + +``` + +**Question :** Que représentent les vecteurs propres (`A$vectors`) ? Construisez la matrice $C$ des composantes principales et vérifiez que la matrice $C$ est de dimension $n\times p$. Que représentent les coordonnées de la première colonne de $C$ ? + +```{r} +C=OzoneC%*%A$vectors +C +dim(C) + +boxplot(OzoneC) +``` + + +## Avec le package FactoMineR + +Rassurez-vous, nous avons programmé les étapes de l'ACP à des fins pédagogiques. En pratique, on utilise la librairie `FactoMineR`. Et on s'appuie sur la librairie `factoextra` pour les graphiques. + +On commence par programmer l'ACP centrée (pas réduite, `scale.unit=F`). On peut déclarer à la fonction `PCA` des variables qualitatives et quantitatives supplémentaires, ainsi que des individus supplémentaires. Ces éléments ne sont donc pas utilisés pour calculer l'ACP mais peuvent être exploités par la suite. Ici, on déclare donc les deux variables qualitatives *pluie* et *vent* supplémentaires. On trace ensuite les valeurs propres avec la fonction `fviz_eig()`. + +```{r,eval=F} +respca<-PCA(Ozone,quali.sup=c(11,12),scale.unit = F,graph=F) +respca$eig +fviz_eig(respca) +``` + + +### Etude des individus + +**Question :** Que contient la sortie `respca$ind$coord$` ? Comparez avec les résultats de la partie précédente ? Vérifiez visuellement à l'aide de la commande `fviz_pca_ind(respca)`. + +```{r,eval=F} +fviz_pca_ind(respca,geom=c("point")) +``` + +**Question :** Que représentent les graphiques suivants ? Commentez. + +```{r,eval=F} +fviz_pca_ind(respca,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca,geom=c("point"),select.ind = list(cos2=0.95)) +fviz_pca_ind(respca,habillage=11,geom=c("point")) +fviz_pca_ind(respca,habillage=12,geom=c("point")) +``` + +### Etude des variables + +**Question :** On représente le graphique des corrélations entre les variables initiales et les méta-variables. Commentez. + +```{r,eval=F} +plot(respca,choix="varcor") +``` + +**Question :** Afin de visualiser les corrélations des variables initiales avec toutes les méta-variables, utilisez la fonction `coorplot()`. Commentez. + +```{r,eval=F} +corrplot(respca$var$cor,method="ellipse") +``` + +# ACP centrée réduite + +## A la main + +On fait maintenant une analyse en composantes principales sur les données centrées et réduites. + +```{r,eval=F} +s<-sqrt((n-1)*apply(OzoneC,2,var)/n) +OzoneCR<-OzoneC%*%diag(1/s) +``` + +**Question :** Comparez `OzoneCR` avec `scale(Ozone[,-c(11,12)])`. + +```{r} +OzoneCR +scale(Ozone[,-c(11,12)]) +``` + +**Question :** Quelle matrice cherche-t-on à diagonaliser dans ce cadre en ACP ? +Programmez cette matrice et diagonalisez-la à l'aide de la fonction `eigen()`. + +```{r,eval=F} +Gamma2<- t(OzoneCR)%*%W%*%OzoneCR +B<-eigen(Gamma2) +``` + +**Question :** Que représentent les valeurs propres dans ce cas ? Que représente la somme de ces valeurs propres ? Vérifiez numériquement. + +```{r,eval=F} +sum(B$values) +``` + +**Question :** Comment peut-on obtenir les résultats de cette ACP centrée réduite à partir du tableau de données centrées. Vérifiez numériquement. + +```{r,eval=F} +M2<-diag(1/(apply(OzoneC,2,var)*(n-1)/n)) +GammaM=Gamma%*%M2 +G=eigen(Gamma2) +GM=eigen(GammaM) +sum(G$values) +sum(GM$values) +``` + + +## Avec FactoMineR + +**Question :** +On fait une ACP centrée réduite à l'aide de la fonction `PCA()` de la librairie `FactoMineR` en imposant `scale.unit=T` et on trace les valeurs propres à l'aide de `fviz_eig()` de la librairie `factoextra`. Interprétez les résultats. + +```{r,eval=F} +respca2<-PCA(Ozone,quali.sup=c(11,12),scale.unit=T,graph=F) +respca2$eig +fviz_eig(respca2) +``` + +**Question :** Représentez le graphe des individus et celui des variables à l'aide des fonctions `fviz_pca_ind()`et `fviz_pca_var()` dans le premier plan factoriel. Quelles différences remarquez-vous avec l'ACP centrée ? + +```{r} +g1<-fviz_pca_ind(respca2,geom=c("point")) +g2<-fviz_pca_var(respca2) +library(gridExtra) +grid.arrange(g1,g2,ncol=2) +``` + +**Question :** Afin de visualiser les corrélations des variables intiales avec toutes les méta-variables, utilisez la fonction `corrplot()`. Commentez. + +```{r} +corrplot(respca2$var$cor,method="ellipse") +``` + +**Question :** Poursuivez l'exploitation des résultats en regardant d'autres plans factoriels, en exploitant l'information des variables qualitatives *pluie* et *vent*. + +```{r} +fviz_pca_ind(respca2,col.ind="contrib",geom=c("point")) +fviz_pca_ind(respca2,geom=c("point"),select.ind = list(cos2=0.95)) + +g3=fviz_pca_ind(respca2,habillage=11,geom=c("point")) + +g4=fviz_pca_ind(respca2,habillage=12,geom=c("point")) +grid.arrange(g3,g4) +``` + + diff --git a/INSA/TP anadon/TP3-ACP.html b/INSA/TP anadon/TP3-ACP.html new file mode 100644 index 0000000..7601037 --- /dev/null +++ b/INSA/TP anadon/TP3-ACP.html @@ -0,0 +1,1757 @@ + + + + + + + + + + + + + +TP3 - Analayse en Composantes Principales (ACP) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ +
+ + + + + + + + +
+

1 Description des +données

+

Les données étudiées dans ce TP ont été recueillies à Rennes dans +\(112\) stations durant l’été 2001. Les +13 variables observées sont :

+
    +
  • maxO3 : Maximum de concentration d’ozone observé sur la journée en +\(\mu\)gr/m3
  • +
  • T9, T12, T15 : Température observée à 9, 12 et 15h
  • +
  • Ne9, Ne12, Ne15 : Nébulosité observée à 9, 12 et 15h
  • +
  • Vx9, Vx12, Vx15 : Composante E-O du vent à 9, 12 et 15h
  • +
  • vent : orientation du vent à 12h
  • +
  • pluie : occurrence ou non de précipitations
  • +
  • maxO3v : Maximum de concentration d’ozone observé la veille
  • +
+

On charge les données, on transforme les variables qualitatives +pluie et vent, et on supprime la dernière variable que +l’on n’utilisera pas dans ce TP.

+
Ozone <- read.table("Ozone.txt", header = T)
+Ozone$pluie <- as.factor(Ozone$pluie)
+Ozone$vent <- as.factor(Ozone$vent)
+Ozone <- Ozone[, -11]
+summary(Ozone)
+

Ainsi on a un jeu de données composé de \(n=112\) individus et \(p=12\) variables.

+
dim(Ozone)
+

Question : Pour vous familiariser avec le jeu de +données, quelques statistiques descriptives ont été programmées. +Commentez les résultats.

+
ggplot(melt(Ozone[, -c(11, 12)]), aes(x = variable, y = value)) + geom_boxplot()
+
+g1 <- ggplot(Ozone, aes(x = maxO3)) + geom_density()
+g2 <- ggplot(melt(Ozone[, c(2:4)]), aes(x = value, color = variable)) + geom_density()
+g3 <- ggplot(melt(Ozone[, c(5:7)]), aes(x = value, color = variable)) + geom_density()
+g4 <- ggplot(melt(Ozone[, c(8:10)]), aes(x = value, color = variable)) + geom_density()
+grid.arrange(g1, g2, g3, g4, ncol = 2)
+
+ggplot(Ozone, aes(x = pluie)) + geom_bar(aes(y = (..count..)/sum(..count..))) + ylab("") +
+    ggtitle("Frequences")
+
+quan <- as.vector(table(Ozone$vent))/nrow(Ozone)
+df <- data.frame(group = levels(Ozone$vent), value = quan)
+ggplot(df, aes(x = "", y = value, fill = group)) + geom_bar(width = 1, stat = "identity") +
+    coord_polar("y", start = 0) + theme(legend.position = "bottom")
+

Question : Représentez graphiquement les +corrélations des variables quantitatives (vous pourrez utiliser la +fonction corrplot()). Quelles sont les variables +linéairement corrélées (ou non) ?

+
# A COMPLETER
+
+
+

2 ACP centrée

+

Dans cette section, on décide de faire une analyse en composantes +principales (ACP) sur les données centrées. A l’aide de la fonction +scale(), centrez les données. Vérifiez que les variables +sont bien centrées avec apply(...,2,mean).

+
OzoneC <- scale(...)  # A COMPLETER
+apply(OzoneC, 2, mean)
+
+

2.1 A la main

+

Question : A l’aide de la fonction +diag(), créez la matrice de poids \(W=\frac 1 n I_n\) et la métrique \(M=I_p\).

+
W <- ...
+M <- ...
+

Question : Quelle matrice cherche-t-on à +diagonaliser dans ce cadre en ACP ? Programmez cette matrice (rappelons +que la multiplication matricielle est %*%) et +diagonalisez-la à l’aide de la fonction eigen().

+
Gamma <- ....  # A COMPLETER
+A <- eigen(...)
+

Question : Que représentent les valeurs propres +(A$values) dans ce cas ? Que représente la somme de ces +valeurs propres ? Vérifiez numériquement.

+
# A COMPLETER
+

Question : Calculez les pourcentages (cumulés ou +non) d’inertie portés par chaque axe. Combien de composantes principales +décidez-vous de retenir ? Vous pouvez vous aider des fonctions +sum() et cumsum().

+
# A COMPLETER
+

Question : Que représentent les vecteurs propres +(A$vectors) ? Construisez la matrice \(C\) des composantes principales et vérifiez +que la matrice \(C\) est de dimension +\(n\times p\). Que représentent les +coordonnées de la première colonne de \(C\) ?

+
# A COMPLETER
+
+
+

2.2 Avec le package +FactoMineR

+

Rassurez-vous, nous avons programmé les étapes de l’ACP à des fins +pédagogiques. En pratique, on utilise la librairie +FactoMineR. Et on s’appuie sur la librairie +factoextra pour les graphiques.

+

On commence par programmer l’ACP centrée (pas réduite, +scale.unit=F). On peut déclarer à la fonction +PCA des variables qualitatives et quantitatives +supplémentaires, ainsi que des individus supplémentaires. Ces éléments +ne sont donc pas utilisés pour calculer l’ACP mais peuvent être +exploités par la suite. Ici, on déclare donc les deux variables +qualitatives pluie et vent supplémentaires. On trace +ensuite les valeurs propres avec la fonction +fviz_eig().

+
respca <- PCA(Ozone, quali.sup = c(11, 12), scale.unit = F, graph = F)
+respca$eig
+fviz_eig(respca)
+
+

2.2.1 Etude des +individus

+

Question : Que contient la sortie +respca$ind$coord$ ? Comparez avec les résultats de la +partie précédente ? Vérifiez visuellement à l’aide de la commande +fviz_pca_ind(respca).

+
fviz_pca_ind(respca, geom = c("point"))
+

Question : Que représentent les graphiques suivants +? Commentez.

+
fviz_pca_ind(respca, col.ind = "contrib", geom = c("point"))
+fviz_pca_ind(respca, geom = c("point"), select.ind = list(cos2 = 0.95))
+fviz_pca_ind(respca, habillage = 11, geom = c("point"))
+fviz_pca_ind(respca, habillage = 12, geom = c("point"))
+
+
+

2.2.2 Etude des +variables

+

Question : On représente le graphique des +corrélations entre les variables initiales et les méta-variables. +Commentez.

+
plot(respca, choix = "varcor")
+

Question : Afin de visualiser les corrélations des +variables initiales avec toutes les méta-variables, utilisez la fonction +coorplot(). Commentez.

+
corrplot(respca$var$cor, method = "ellipse")
+
+
+
+
+

3 ACP centrée +réduite

+
+

3.1 A la main

+

On fait maintenant une analyse en composantes principales sur les +données centrées et réduites.

+
s <- sqrt((n - 1) * apply(OzoneC, 2, var)/n)
+OzoneCR <- OzoneC %*% diag(1/s)
+

Question : Comparez OzoneCR avec +scale(Ozone[,-c(11,12)]).

+
# A COMPLETER
+

Question : Quelle matrice cherche-t-on à +diagonaliser dans ce cadre en ACP ? Programmez cette matrice et +diagonalisez-la à l’aide de la fonction eigen().

+
Gamma2 <- ....  # A COMPLETER
+B <- eigen(...)
+

Question : Que représentent les valeurs propres dans +ce cas ? Que représente la somme de ces valeurs propres ? Vérifiez +numériquement.

+
# A COMPLETER
+

Question : Comment peut-on obtenir les résultats de +cette ACP centrée réduite à partir du tableau de données centrées. +Vérifiez numériquement.

+
# A COMPLETER
+
+
+

3.2 Avec FactoMineR

+

Question : On fait une ACP centrée réduite à l’aide +de la fonction PCA() de la librairie +FactoMineR en imposant scale.unit=T et on +trace les valeurs propres à l’aide de fviz_eig() de la +librairie factoextra. Interprétez les résultats.

+
respca2 <- PCA(Ozone, quali.sup = c(11, 12), scale.unit = T, graph = F)
+respca2$eig
+fviz_eig(respca2)
+

Question : Représentez le graphe des individus et +celui des variables à l’aide des fonctions fviz_pca_ind()et +fviz_pca_var() dans le premier plan factoriel. Quelles +différences remarquez-vous avec l’ACP centrée ?

+
# A COMPLETER
+

Question : Afin de visualiser les corrélations des +variables intiales avec toutes les méta-variables, utilisez la fonction +corrplot(). Commentez.

+
# A COMPLETER
+

Question : Poursuivez l’exploitation des résultats +en regardant d’autres plans factoriels, en exploitant l’information des +variables qualitatives pluie et vent.

+
# A COMPLETER
+
+
+ + + +
+
+ +
+ + + + + + + + + + + + + + + + diff --git a/INSA/TP anadon/TP4-Kmeans.Rmd b/INSA/TP anadon/TP4-Kmeans.Rmd new file mode 100644 index 0000000..f624f57 --- /dev/null +++ b/INSA/TP anadon/TP4-Kmeans.Rmd @@ -0,0 +1,332 @@ +--- +title: "TP4 Kmeans et variantes" +date : "3 MIC / 2024-2025" +output: + html_document: + toc: true + toc_float: true + toc_depth : 4 + number_sections : true +header-includes: + - \usepackage{comment} +params: + soln: TRUE +--- + +```{css,echo=F} +.badCode { +background-color: #cfdefc; +} + +.corrO { background-color: rgb(255,238,237); } +.corrS { background-color: pink; color: black; border: 1px solid red; } +``` + +```{r setup, echo=FALSE, cache=TRUE} +library(knitr) +## Global options +options(max.print="75") +opts_chunk$set(echo=TRUE, + cache=FALSE, + prompt=FALSE, + tidy=TRUE, + comment=NA, + message=FALSE, + warning=FALSE, + class.source="badCode") +opts_knit$set(width=75) +``` + +L'objectif de ce TP est d'illustrer les notions abordées dans le chapitre dédié aux algorithmes de clustering de type Kmeans. Les librairies R nécessaires pour ce TP : + +```{r,echo=T, error=F,warning=F,message=F} +library(forcats) +library(ggplot2) +library(corrplot) +library(reshape2) +library(gridExtra) + +library(FactoMineR) +library(factoextra) + +library(mclust) +library(cluster) +library(ppclust) + +library(circlize) +library(ggalluvial) +``` + +# Prise en main des données de vins +## Lecture des données + +Dans ce TP, on va utiliser le jeu de données `wine` disponible sur la page moodle du cours. + +Ce jeu de données comprend des mesures physico-chimiques réalisées sur un échantillon de $n=600$ vins (rouges et blancs) du Portugal. Ces mesures sont complétées par une évaluation sensorielle de la qualité par un ensemble d’experts. Chaque vin est décrit par les variables suivantes : + +- Qualite : son évaluation sensorielle par les experts (“bad”,“medium”,“good”), +- Type : son type (1 pour un vin rouge, 0 pour un vin blanc), +- AcidVol : la teneur en acide volatile (en g/dm3 d’acide acétique), +- AcidCitr : la teneur en acide citrique (en g/dm3), +- SO2lbr : le dosage du dioxyde de soufre libre (en mg/dm3), +- SO2tot : le dosage du dioxyde de soufre total (en mg/dm3), +- Densite : la densité (en g/cm3), +- Alcool : le degré d’alcool (en % Vol.). + +**Question 1.** Récupérez sur moodle le jeu de données `wine.txt` et chargez-le sous R. + +```{r,eval=F} +wine <-read.table("./wine.txt") +str(wine) +``` + +Vérifiez la nature des variables à l'aide de la fonction `str()`. Modifiez si nécessaire les variables qualitatives (à l'aide de `as.factor()`) et transformez les modalités "1" et "0" de la variable `Type`en "rouge" et "blanc" respectivement (à l'aide de la fonction `factor()`). + +```{r,eval=F} +wine$Qualite <- as.factor(wine$Qualite) +wine$Type <- factor(wine$Type, labels=c("blanc","rouge")) +str(wine) +``` + + +## Statistiques descriptives avec R + +**Question 2.** Faites quelques statistiques descriptives pour faire connaissance avec le jeu de données, avec des choix adaptés à la nature des variables. En particulier, étudiez les corrélations entre les variables quantitatives et faites une ACP à l'aide de la fonction `PCA()` de la librairie `FactoMineR`. + +```{r,eval=F} +# A completer - Stat. descriptives +# cf TP2 +ggplot(data=wine)+ + geom_point(aes(x=Densite,y=Alcool,color=Type)) +corrplot(cor(wine[,-c(1,2)]),method = "ellipse") + +``` + +```{r,eval=F} +# ACP A completer +resacp<-PCA(wine,quali.sup=c(1,2), scale.unit = TRUE,graph=FALSE) +fviz_eig(resacp) +g1=fviz_pca_ind(resacp,geom = c("point"),habillage = 2) +g2=fviz_pca_var(resacp) +grid.arrange(g2,g1) +corrplot(resacp$var$cor,method="ellipse") +``` + + +**Question :** +Pour la suite, on va utiliser les variables quantitatives pour faire de la classification non supervisée des vins. Les variables *Qualite* et *Type* seront utilisées comme des variables extérieures pour comparer / croiser avec les classifications obtenues pour l'interprétation. + +Pensez-vous qu'il est nécessaire de transformer les variables quantitatives dans l'objectif de clustering avec un algorithme des Kmeans ? Si oui, mettez en place cette transformation. + +```{r,eval=F} +wineCR<-scale(wine[,-c(1,2)]) +``` + +# Classification avec l'algorithme des Kmeans +## A K=3 fixé + +**Question :** A l'aide de la fonction `kmeans()`, faites une classification non supervisée en 3 classes des vins. Regardez les options disponibles dans la fonction `kmeans()`. + +```{r,eval=F} +help(kmeans) +reskmeans<-kmeans(wineCR,3) + +``` + +**Question : ** Combien a-t-on de vins par classe (vous pouvez vous aider de la fonction `table()`) ? Visualisez la classification obtenue dans les premiers plans de l'ACP (vous pouvez utiliser la fonction `PCA()` de la librairie `FactoMineR` et la fonction `fviz_cluster` de la librairie `factoextra`). + +```{r,eval=F} +# A COMPLETER +table(reskmeans$size) +fviz_cluster(reskmeans,data=wineCR, + ellipse.type="norm",labelsize=8, + geom=c("point"))+ggtitle("") +fviz_pca_ind(resacp,col.ind=as.factor(reskmeans$cluster), + geom = c("point"),axes=c(1,2)) +``` + +**Question : ** La classification obtenue précédemment a-t-elle un lien avec le type de vins ? Avec la qualité du vin ? Vous pouvez vous aider de la fonction `table()`, la fonction `adjustedRandIndex()` de la librairie `mclust`, ... + +```{r,eval=F} +# A COMPLETER +table(wine$Type,reskmeans$cluster ) +adjustedRandIndex(wine$Type,reskmeans$cluster) + +``` + +```{r, eval=F} +clust<-paste("Cl-K",reskmeans$cluster,sep="") +Tab<-melt(table(clust,wine[,1])) +ggplot(Tab,aes(y=value,axis1=clust,axis2=Var2))+ + geom_alluvium(aes(fill=clust))+ + geom_stratum(width = 1/12)+ + geom_text(stat = "stratum", aes(label = after_stat(stratum)))+ + theme(legend.position = "none") +chordDiagram(table(clust,wine[,2])) +``` + +## Choix du nombre de classes + +**Question :** +On s'intéresse dans cette section au choix du nombre de classes $K$ en étudiant l'évolution de l'inertie intraclasse. En faisant varier $K$ entre 2 et 15, calculez l'inertie intraclasse associée à chaque classification obtenue. Tracez l'évolution de l'inertie intraclasse en fonction du nombre de classes. Qu'en concluez-vous ? + +```{r,eval=F} +# A completer +Kmax<-15 +reskmeanscl<-matrix(0,nrow=nrow(wine),ncol=Kmax-1) +Iintra<-NULL +for (k in 2:Kmax){ + resaux<-kmeans(wineCR,k) + reskmeanscl[,k-1]<-resaux$cluster + Iintra<-c(Iintra,resaux$tot.withinss) +} + +df<-data.frame(K=2:15,Iintra=Iintra) +ggplot(df,aes(x=K,y=Iintra))+ + geom_line()+ + geom_point()+ + xlab("Nombre de classes")+ + ylab("Inertie intraclasse") +``` + +**Question :** Reprendre la question du choix du nombre de classes en utilisant le critère silhouette (vous pouvez vous aider de la fonction `silhouette()`). Pour la classification sélectionnée, représentez les poids $s(i)$ de chaque individu à l'aide de la fonction `fviz_silhouette()`. + +```{r, eval=F} +# A COMPLETER +Silhou<-NULL +for (k in 2:Kmax){ + aux<-silhouette(reskmeanscl[,k-1], daisy(wineCR)) + Silhou<-c(Silhou,mean(aux[,3])) +} + +df<-data.frame(K=2:Kmax,Silhouette=Silhou) +ggplot(df,aes(x=K,y=Silhouette))+ + geom_point()+ + geom_line()+theme(legend.position = "bottom") + +aux<-silhouette(reskmeanscl[,12-1], daisy(wineCR)) +fviz_silhouette(aux)+ + theme(plot.title = element_text(size =9)) +rm(df,Silhou,aux) +``` + +# Classification avec l'algorithme PAM + +**Question :** Déterminez une classification en $K=3$ classes des vins en utilisant la méthode PAM et représentez graphiquement la classification obtenue. A-t-elle un lien avec le type de vins ? Avec la qualité ? Avec la classification en $K=3$ classes obtenue avec la méthode des Kmeans? + +```{r,eval=F} +# A COMPLETER + +resPAM<-pam(wineCR,k=3,metric="euclidean") +resPAM$medoids +resPAM$id.med + +fviz_cluster(resPAM,data=wineCR, + ellipse.type="norm", + labelsize=8, + geom=c("point"))+ + ggtitle("") +fviz_pca_ind(resacp, + col.ind=as.factor(resPAM$clustering), + geom = c("point"), + axes=c(1,2)) + +adjustedRandIndex(wine$Qualite,resPAM$clustering) +table(wine$Qualite,resPAM$clustering) + +adjustedRandIndex(wine$Type,resPAM$clustering) +table(wine$Type,resPAM$clustering) +``` + +**Question :** Déterminez le nombre de classes optimal par le critère Silhouette pour $K$ variant entre 2 et 15 avec l'algorithme PAM. Commentez la classification retenue. Est-elle proche de celle obtenue avec l'algorithme des Kmeans ? + +```{r,eval=F} +# A compléter + +Kmax<-15 +resPAMcl<-matrix(0,nrow=nrow(wine),ncol=Kmax-1) +Silhou<-NULL +for (k in 2:Kmax){ + resaux<-pam(wineCR,k,metric="euclidean") + resPAMcl[,k-1]<-resaux$clustering + aux<-silhouette(resPAMcl[,k-1], daisy(wineCR)) + Silhou<-c(Silhou,mean(aux[,3])) +} + +df<-data.frame(K=2:Kmax,Silhouette=Silhou) +ggplot(df,aes(x=K,y=Silhouette))+ + geom_point()+ + geom_line()+theme(legend.position = "bottom") + + +aux<-silhouette(resPAMcl[,1], daisy(wineCR)) +fviz_silhouette(aux)+theme(plot.title = element_text(size =9)) + +adjustedRandIndex(wine$Qualite,resPAMcl[,4-1]) +table(wine$Qualite,resPAMcl[,4-1]) + +adjustedRandIndex(wine$Type,resPAMcl[,4-1]) +table(wine$Type,resPAMcl[,4-1]) +``` + +# Pour aller plus loin : Classification avec l'algorithme fuzzy c-means + +## Présentation +Avec les algorithmes de clustering précédents (Kmeans, PAM) nous obtenons une classification "dure" au sens que chaque individu ne peut appartenir qu'à une seule classe et chaque individu participe avec le même poids à la construction des classes. Une classification dure $\mathcal{P}_K=\{\mathcal{C}_1,\ldots,\mathcal{C}_K\}$ peut se traduire en une matrice $Z=(z_{ik})_{\underset{1\leq k \leq K}{1\leq i \leq n}}$ avec $z_{ik}=1$ si $i\in\mathcal{C}_k$ et 0 sinon. Dans cette section, nous allons nous intéresser à une adaptation de l'algorithme des Kmeans, appelée *fuzzy c-means*. L'idée est de retourner une classification *fuzzy* c'est-à-dire une matrice $W=(\omega_{ik})_{\underset{1\leq k \leq K}{1\leq i \leq n}}$ avec $\forall i,\ k,\ \omega_{ik}\geq 0$ et $\forall i,\ \underset{k=1}{\stackrel{K}{\sum}} \omega_{ik}=1$. On donne ainsi plutôt un poids $\omega_{ik}$ que l'individu $i$ appartienne à la classe $\mathcal{C}_k$. + +L'algorithme fuzzy c-means a pour fonction objective + +$$ +\underset{W,\{m_1,\ldots,m_K\}}{\mbox{argmin}}\ \underset{i=1}{\stackrel{n}{\sum}}\underset{k=1}{\stackrel{K}{\sum}} (\omega_{ik})^\gamma\ \|x_i - m_k\|^2 +$$ +où $X=(x_1,\ldots,x_n)'$ est la matrice des données, $\gamma\in[1,+\infty[$, $m_k$ est le centre de la classe $\mathcal{C}_k$. + +Dans le même principe que l'algorithme des Kmeans, l'algorithme fuzzy c-means est un algorithme itératif : + +- Step 1: Initialisation des poids $W^{(0)}$ +- Step 2: A l'itération $r$, on calcule les centres des classes + +$$ +m_k^{(r)} = \frac{\underset{i=1}{\stackrel{n}{\sum}} (\omega_{ik}^{(r-1)})^\gamma x_i}{\underset{i=1}{\stackrel{n}{\sum}} (\omega_{ik}^{(r-1)})^\gamma} +$$ + +- Step 3: Mise à jour des poids ($\gamma>1$) +$$ +\omega_{ik}^{(r)} = \left[\underset{\ell=1}{\stackrel{K}{\sum}} \left(\frac{\|x_i - m_k^{(r)}\|^2}{\|x_i - m_\ell^{(r)}\|^2}\right)^{\frac{1}{\gamma-1}} \right]^{-1} +$$ + +- Step 4: Si $\|W^{(r)} - W^{(r-1)}\|<$ seuil, on s'arrête, sinon on retourne à l'étape 2. + +En général, la puissance choisie sur les poids est $\gamma=2$. Dans le cas $\gamma=1$, on retrouve l'algorithme des Kmeans. + + + +Nous allons ici nous appuyer sur la fonction `fcm()` de la librairie `ppclust`. + +**Question :** Utilisez cet algorithme pour obtenir une classification en $3$ classes. Comment sont initialisés les poids ? Comment est obtenue la classification finale ? A l'aide des poids, étudiez la stabilité des classes. Vous pouvez pour cela étudier les poids des individus par classe. + +```{r,eval=F} +# A COMPLETER +library(ppclust) +resfcm<-fcm(....,centers= ... , m=2) +table(.....) + +Aux<-data.frame(cluster=as.factor(resfcm$cluster), + PoidsMax=apply(resfcm$u,1,max)) +ggplot(Aux,aes(x=cluster,y=PoidsMax))+ + geom_violin() +``` + +**Question :** Représentez la classification obtenue sur le premier plan de l'ACP en nuançant selon les poids. + +```{r,eval=F} +# A COMPLETER +fviz_pca_ind(resacp,axes=c(1,2),geom=c("point"),col.ind=apply(....................))+ +scale_color_gradient2(low="white", mid="blue",high="red", midpoint=0.8, space = "Lab") +``` + +**Question **: Comparez les classifications obtenues avec Kmeans et fuzzy c-means. Commentez. + +```{r,eval=F} +# A COMPLETER +``` diff --git a/INSA/TP anadon/TP4-Kmeans.html b/INSA/TP anadon/TP4-Kmeans.html new file mode 100644 index 0000000..9efcf32 --- /dev/null +++ b/INSA/TP anadon/TP4-Kmeans.html @@ -0,0 +1,1857 @@ + + + + + + + + + + + + + +TP4 Kmeans et variantes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ +
+ + + + + + + + +

L’objectif de ce TP est d’illustrer les notions abordées dans le +chapitre dédié aux algorithmes de clustering de type Kmeans. Les +librairies R nécessaires pour ce TP :

+
library(forcats)
+library(ggplot2)
+library(corrplot)
+library(reshape2)
+
+library(FactoMineR)
+library(factoextra)
+
+library(mclust)
+library(cluster)
+library(ppclust)
+
+library(circlize)
+library(ggalluvial)
+
+

1 Prise en main des +données de vins

+
+

1.1 Lecture des +données

+

Dans ce TP, on va utiliser le jeu de données wine +disponible sur la page moodle du cours.

+

Ce jeu de données comprend des mesures physico-chimiques réalisées +sur un échantillon de \(n=600\) vins +(rouges et blancs) du Portugal. Ces mesures sont complétées par une +évaluation sensorielle de la qualité par un ensemble d’experts. Chaque +vin est décrit par les variables suivantes :

+
    +
  • Qualite : son évaluation sensorielle par les experts +(“bad”,“medium”,“good”),
  • +
  • Type : son type (1 pour un vin rouge, 0 pour un vin blanc),
  • +
  • AcidVol : la teneur en acide volatile (en g/dm3 d’acide +acétique),
  • +
  • AcidCitr : la teneur en acide citrique (en g/dm3),
  • +
  • SO2lbr : le dosage du dioxyde de soufre libre (en mg/dm3),
  • +
  • SO2tot : le dosage du dioxyde de soufre total (en mg/dm3),
  • +
  • Densite : la densité (en g/cm3),
  • +
  • Alcool : le degré d’alcool (en % Vol.).
  • +
+

Question 1. Récupérez sur moodle le jeu de données +wine.txt et chargez-le sous R.

+
wine <- read.table(.......)
+

Vérifiez la nature des variables à l’aide de la fonction +str(). Modifiez si nécessaire les variables qualitatives (à +l’aide de as.factor()) et transformez les modalités “1” et +“0” de la variable Typeen “rouge” et “blanc” respectivement +(à l’aide de la fonction factor()).

+
wine$Qualite <- as.factor(....)
+wine$Type <- factor(..., labels = c("blanc", "rouge"))
+
+
+

1.2 Statistiques +descriptives avec R

+

Question 2. Faites quelques statistiques +descriptives pour faire connaissance avec le jeu de données, avec des +choix adaptés à la nature des variables. En particulier, étudiez les +corrélations entre les variables quantitatives et faites une ACP à +l’aide de la fonction PCA() de la librairie +FactoMineR.

+
# A completer - Stat. descriptives
+
# ACP A completer
+resacp <- PCA(wine, quali.sup = c(1, 2), scale.unit = TRUE, graph = FALSE)
+fviz_eig(...)
+fviz_pca_ind(...)
+fviz_pca_var(...)
+

Question : Pour la suite, on va utiliser les +variables quantitatives pour faire de la classification non supervisée +des vins. Les variables Qualite et Type seront +utilisées comme des variables extérieures pour comparer / croiser avec +les classifications obtenues pour l’interprétation.

+

Pensez-vous qu’il est nécessaire de transformer les variables +quantitatives dans l’objectif de clustering avec un algorithme des +Kmeans ? Si oui, mettez en place cette transformation.

+
# A completer
+
+
+
+

2 Classification avec +l’algorithme des Kmeans

+
+

2.1 A K=3 fixé

+

Question : A l’aide de la fonction +kmeans(), faites une classification non supervisée en 3 +classes des vins. Regardez les options disponibles dans la fonction +kmeans().

+
help(kmeans)
+reskmeans <- kmeans(....)
+

Question : Combien a-t-on de vins par classe (vous +pouvez vous aider de la fonction table()) ? Visualisez la +classification obtenue dans les premiers plans de l’ACP (vous pouvez +utiliser la fonction PCA() de la librairie +FactoMineR et la fonction fviz_cluster de la +librairie factoextra).

+
# A COMPLETER
+table(....)
+fviz_cluster(reskmeans, data = wine[, -c(1, 2)], ellipse.type = "norm", labelsize = 8,
+    geom = c("point")) + ggtitle("")
+fviz_pca_ind(resacp, col.ind = as.factor(reskmeans$cluster), geom = c("point"), axes = c(1,
+    2))
+

Question : La classification obtenue précédemment +a-t-elle un lien avec le type de vins ? Avec la qualité du vin ? Vous +pouvez vous aider de la fonction table(), la fonction +adjustedRandIndex() de la librairie mclust, +…

+
# A COMPLETER
+table(..., ...)
+adjustedRandIndex(..., ...)
+
clust <- paste("Cl-K", reskmeans$cluster, sep = "")
+Tab <- melt(table(clust, wine[, 1]))
+ggplot(Tab, aes(y = value, axis1 = clust, axis2 = Var2)) + geom_alluvium(aes(fill = clust)) +
+    geom_stratum(width = 1/12) + geom_text(stat = "stratum", aes(label = after_stat(stratum))) +
+    theme(legend.position = "none")
+chordDiagram(table(clust, wine[, 2]))
+
+
+

2.2 Choix du nombre de +classes

+

Question : On s’intéresse dans cette section au +choix du nombre de classes \(K\) en +étudiant l’évolution de l’inertie intraclasse. En faisant varier \(K\) entre 2 et 15, calculez l’inertie +intraclasse associée à chaque classification obtenue. Tracez l’évolution +de l’inertie intraclasse en fonction du nombre de classes. Qu’en +concluez-vous ?

+
# A completer
+Kmax <- 15
+reskmeanscl <- matrix(0, nrow = nrow(wine), ncol = Kmax - 1)
+Iintra <- NULL
+for (k in 2:Kmax) {
+    resaux <- kmeans(...)
+    reskmeanscl[, k - 1] <- resaux$...
+    Iintra <- c(Iintra, resaux$...)
+}
+
+df <- data.frame(K = 2:15, Iintra = Iintra)
+ggplot(df, aes(x = K, y = Iintra)) + geom_line() + geom_point() + xlab("Nombre de classes") +
+    ylab("Inertie intraclasse")
+

Question : Reprendre la question du choix du nombre +de classes en utilisant le critère silhouette (vous pouvez vous aider de +la fonction silhouette()). Pour la classification +sélectionnée, représentez les poids \(s(i)\) de chaque individu à l’aide de la +fonction fviz_silhouette().

+
# A COMPLETER
+Silhou <- NULL
+for (k in 2:Kmax) {
+    aux <- silhouette(reskmeanscl[, k - 1], daisy(wine[, -c(1, 2)]))
+    Silhou <- c(Silhou, mean(aux[, 3]))
+}
+
+df <- data.frame(K = 2:Kmax, Silhouette = Silhou)
+ggplot(df, aes(x = K, y = Silhouette)) + geom_point() + geom_line() + theme(legend.position = "bottom")
+
+aux <- silhouette(...)
+fviz_silhouette(aux) + theme(plot.title = element_text(size = 9))
+rm(df, Silhou, aux)
+
+
+
+

3 Classification avec +l’algorithme PAM

+

Question : Déterminez une classification en \(K=3\) classes des vins en utilisant la +méthode PAM et représentez graphiquement la classification obtenue. +A-t-elle un lien avec le type de vins ? Avec la qualité ? Avec la +classification en \(K=3\) classes +obtenue avec la méthode des Kmeans?

+
# A COMPLETER
+
+resPAM <- pam(..., k = ..., metric = ...)
+resPAM$medoids
+resPAM$id.med
+
+fviz_cluster(resPAM, data = wine[, -c(1, 2)], ellipse.type = "norm", labelsize = 8,
+    geom = c("point")) + ggtitle("")
+fviz_pca_ind(resacp, col.ind = as.factor(resPAM$clustering), geom = c("point"), axes = c(1,
+    2))
+
+adjustedRandIndex(..., ...)
+table(..., ....)
+

Question : Déterminez le nombre de classes optimal +par le critère Silhouette pour \(K\) +variant entre 2 et 15 avec l’algorithme PAM. Commentez la classification +retenue. Est-elle proche de celle obtenue avec l’algorithme des Kmeans +?

+
# A compléter
+
+Kmax <- 15
+resPAMcl <- matrix(0, nrow = nrow(wine), ncol = Kmax - 1)
+Silhou <- NULL
+for (k in 2:Kmax) {
+    resaux <- pam(.....)
+    resPAMcl[, k - 1] <- resaux$clustering
+    aux <- silhouette(resPAMcl[, k - 1], daisy(wine[, -c(1, 2)]))
+    Silhou <- c(Silhou, ......)
+}
+
+df <- data.frame(K = 2:Kmax, Silhouette = Silhou)
+ggplot(df, aes(x = K, y = Silhouette)) + geom_point() + geom_line() + theme(legend.position = "bottom")
+
+
+aux <- silhouette(resPAMcl[, 1], daisy(wine[, -c(1:2)]))
+fviz_silhouette(aux) + theme(plot.title = element_text(size = 9))
+
+adjustedRandIndex(.....)
+table(.....)
+
+
+

4 Pour aller plus loin : +Classification avec l’algorithme fuzzy c-means

+
+

4.1 Présentation

+

Avec les algorithmes de clustering précédents (Kmeans, PAM) nous +obtenons une classification “dure” au sens que chaque individu ne peut +appartenir qu’à une seule classe et chaque individu participe avec le +même poids à la construction des classes. Une classification dure \(\mathcal{P}_K=\{\mathcal{C}_1,\ldots,\mathcal{C}_K\}\) +peut se traduire en une matrice \(Z=(z_{ik})_{\underset{1\leq k \leq K}{1\leq i \leq +n}}\) avec \(z_{ik}=1\) si \(i\in\mathcal{C}_k\) et 0 sinon. Dans cette +section, nous allons nous intéresser à une adaptation de l’algorithme +des Kmeans, appelée fuzzy c-means. L’idée est de retourner une +classification fuzzy c’est-à-dire une matrice \(W=(\omega_{ik})_{\underset{1\leq k \leq K}{1\leq i +\leq n}}\) avec \(\forall i,\ k,\ +\omega_{ik}\geq 0\) et \(\forall i,\ +\underset{k=1}{\stackrel{K}{\sum}} \omega_{ik}=1\). On donne +ainsi plutôt un poids \(\omega_{ik}\) +que l’individu \(i\) appartienne à la +classe \(\mathcal{C}_k\).

+

L’algorithme fuzzy c-means a pour fonction objective

+

\[ +\underset{W,\{m_1,\ldots,m_K\}}{\mbox{argmin}}\ +\underset{i=1}{\stackrel{n}{\sum}}\underset{k=1}{\stackrel{K}{\sum}} +(\omega_{ik})^\gamma\ \|x_i - m_k\|^2 +\]\(X=(x_1,\ldots,x_n)'\) est la matrice +des données, \(\gamma\in[1,+\infty[\), +\(m_k\) est le centre de la classe +\(\mathcal{C}_k\).

+

Dans le même principe que l’algorithme des Kmeans, l’algorithme fuzzy +c-means est un algorithme itératif :

+
    +
  • Step 1: Initialisation des poids \(W^{(0)}\)
  • +
  • Step 2: A l’itération \(r\), on +calcule les centres des classes
  • +
+

\[ +m_k^{(r)} = \frac{\underset{i=1}{\stackrel{n}{\sum}} +(\omega_{ik}^{(r-1)})^\gamma x_i}{\underset{i=1}{\stackrel{n}{\sum}} +(\omega_{ik}^{(r-1)})^\gamma} +\]

+
    +
  • Step 3: Mise à jour des poids (\(\gamma>1\)) \[ +\omega_{ik}^{(r)} = \left[\underset{\ell=1}{\stackrel{K}{\sum}} +\left(\frac{\|x_i - m_k^{(r)}\|^2}{\|x_i - +m_\ell^{(r)}\|^2}\right)^{\frac{1}{\gamma-1}} \right]^{-1} +\]

  • +
  • Step 4: Si \(\|W^{(r)} - +W^{(r-1)}\|<\) seuil, on s’arrête, sinon on retourne à l’étape +2.

  • +
+

En général, la puissance choisie sur les poids est \(\gamma=2\). Dans le cas \(\gamma=1\), on retrouve l’algorithme des +Kmeans.

+

Nous allons ici nous appuyer sur la fonction fcm() de la +librairie ppclust.

+

Question : Utilisez cet algorithme pour obtenir une +classification en \(3\) classes. +Comment sont initialisés les poids ? Comment est obtenue la +classification finale ? A l’aide des poids, étudiez la stabilité des +classes. Vous pouvez pour cela étudier les poids des individus par +classe.

+
# A COMPLETER
+library(ppclust)
+resfcm <- fcm(...., centers = ..., m = 2)
+table(.....)
+
+Aux <- data.frame(cluster = as.factor(resfcm$cluster), PoidsMax = apply(resfcm$u,
+    1, max))
+ggplot(Aux, aes(x = cluster, y = PoidsMax)) + geom_violin()
+

Question : Représentez la classification obtenue sur +le premier plan de l’ACP en nuançant selon les poids.

+
# A COMPLETER
+fviz_pca_ind(resacp, axes = c(1, 2), geom = c("point"), col.ind = apply(....................)) +
+    scale_color_gradient2(low = "white", mid = "blue", high = "red", midpoint = 0.8,
+        space = "Lab")
+

Question : Comparez les classifications obtenues +avec Kmeans et fuzzy c-means. Commentez.

+
# A COMPLETER
+
+
+ + + +
+
+ +
+ + + + + + + + + + + + + + + + diff --git a/INSA/TP anadon/wine (1).txt b/INSA/TP anadon/wine (1).txt new file mode 100644 index 0000000..6040eee --- /dev/null +++ b/INSA/TP anadon/wine (1).txt @@ -0,0 +1,601 @@ +"Qualite" "Type" "AcidVol" "AcidCitr" "SO2lbr" "SO2tot" "Densite" "Alcool" +"1352" "medium" 1 0.62 0.01 8 46 0.99332 11.8 +"5493" "medium" 0 0.34 0.1 17 63 0.9937 9.2 +"5153" "medium" 0 0.22 0.22 39 110 0.99855 9 +"5308" "medium" 0 0.35 0.46 61 183 0.99786 9 +"3866" "medium" 0 0.42 0.32 20 167 0.99479 10.6 +"694" "medium" 1 0.48 0.32 21 122 0.9984 9.4 +"5085" "good" 0 0.21 0.32 39 113 0.99393 10.2 +"2280" "medium" 0 0.28 0.14 64 159 0.992 10 +"5231" "medium" 0 0.3 0.25 21 124 0.99362 10.8 +"4388" "medium" 0 0.4 0.42 41 176 0.99552 9.4 +"4172" "medium" 0 0.14 0.28 10 56 0.99352 9.9 +"4763" "good" 0 0.36 0.37 39 114 0.99036 12.7 +"4001" "bad" 0 0.16 0.49 18 107 0.99514 10.2 +"3244" "good" 0 0.19 0.49 50 134 0.9998 9.1 +"4663" "medium" 0 0.25 0.54 58 176 0.99454 10.4 +"3256" "medium" 0 0.15 0.49 21 98 0.9929 9.2 +"3444" "medium" 0 0.34 0.46 21 94 0.991 12.3 +"3867" "medium" 0 0.19 0.43 53 154 0.99752 10.4 +"3161" "medium" 0 0.28 0.49 10 112 0.9958 10.1 +"6420" "medium" 0 0.36 0.5 63 178 0.99212 9.7 +"1590" "medium" 1 0.725 0.2 29 79 0.9977 9.2 +"2155" "good" 0 0.25 0.34 31 93 0.9916 11.3 +"2258" "medium" 0 0.27 0.25 41 188 0.9915 11.3 +"209" "medium" 1 0.44 0.28 18 95 0.9966 9.4 +"4560" "good" 0 0.11 0.34 41 114 0.99634 11 +"1981" "medium" 0 0.28 0.26 48 179 0.9975 9 +"2166" "medium" 0 0.35 0.34 6 37 0.9944 11.5 +"5430" "good" 0 0.26 0.23 23 111 0.99274 11.5 +"6496" "good" 0 0.29 0.3 20 110 0.98869 12.8 +"346" "medium" 1 0.685 0 40 63 0.9979 9.9 +"1288" "medium" 1 0.6 0.08 3 7 0.99286 13 +"3615" "medium" 0 0.19 0.39 22 84 0.994 10.8 +"1837" "medium" 0 0.52 0.32 54 221 0.9972 9.6 +"5637" "medium" 0 0.34 0.22 43 176 0.99286 9.9 +"2520" "good" 0 0.11 0.32 59 144 0.9956 9.4 +"3046" "medium" 0 0.27 0.49 35 92 0.9911 12.2 +"2983" "medium" 0 0.36 0.56 25 102 0.9923 10.5 +"840" "medium" 1 0.5 0.04 13 26 0.99647 10 +"3185" "medium" 0 0.3 0.74 46 165 0.9982 8.7 +"4690" "medium" 0 0.17 0.35 33 78 0.99146 11.3 +"6347" "medium" 0 0.26 0.5 25 93 0.99428 10.5 +"728" "medium" 1 0.57 0.02 4 11 0.997 9.5 +"240" "medium" 1 1 0.09 7 37 0.99685 9 +"6318" "medium" 0 0.24 0.15 32 134 0.99378 9.9 +"2501" "medium" 0 0.29 0.29 26 113 0.9983 9.7 +"3003" "good" 0 0.26 0.31 29 128 0.9937 10.9 +"4537" "medium" 0 0.25 0.3 67 196 0.99555 10.1 +"4799" "good" 0 0.21 0.4 40 121 0.99214 12 +"141" "medium" 1 0.745 0.11 16 63 0.9965 9.6 +"3664" "medium" 0 0.22 0.28 51 180 0.9952 9.5 +"5167" "medium" 0 0.26 0.27 20 80 0.99089 11.5 +"5291" "medium" 0 0.22 0.26 23 112 0.9931 11.4 +"3383" "medium" 0 0.45 0.4 17 100 0.9957 10.1 +"2712" "medium" 0 0.22 0.34 55 177 0.9983 9.9 +"449" "medium" 1 0.53 0.22 7 27 0.9967 10.2 +"214" "medium" 1 0.57 0.26 28 65 0.9959 10.1 +"3216" "medium" 0 0.34 0.49 61 206 0.9957 9 +"4917" "medium" 0 0.32 0.32 32 105 0.99266 11.2 +"5005" "medium" 0 0.15 0.32 14 119 0.99137 10.2 +"3501" "medium" 0 0.21 0.3 14 118 0.9942 10.4 +"1291" "medium" 1 0.74 0 6 12 0.99521 11 +"3137" "medium" 0 0.28 0.49 32 148 0.9936 10 +"998" "good" 1 0.66 0 3 11 0.99378 12.8 +"1350" "medium" 1 0.57 0 21 41 0.99518 10.8 +"6336" "medium" 0 0.16 0.36 13 61 0.99143 10.8 +"492" "good" 1 0.41 0.5 12 25 0.9952 13.3 +"3901" "medium" 0 0.22 0.28 25 125 0.99856 9.4 +"4878" "medium" 0 0.38 0.36 42 214 0.9976 9.4 +"5343" "good" 0 0.15 0.28 29 149 0.99792 9 +"5096" "good" 0 0.24 0.28 61 134 0.99146 11.3 +"4516" "medium" 0 0.44 0.26 57 128 0.98982 12.7 +"1118" "medium" 1 0.69 0.07 15 21 0.99572 11.3 +"2680" "good" 0 0.15 0.33 31 118 0.9956 9 +"452" "medium" 1 0.37 0.53 9 26 0.9979 9.1 +"3937" "bad" 0 0.28 0.35 61 180 0.9972 9 +"776" "medium" 1 1 0 7 16 0.99586 10 +"528" "medium" 1 0.38 0.49 33 85 0.9962 11.4 +"3445" "medium" 0 0.44 0.2 44 157 0.998 9 +"203" "medium" 1 0.5 0.11 16 49 0.99545 9.5 +"1175" "medium" 1 0.36 0.31 26 65 0.99716 9.5 +"5796" "medium" 0 0.22 0.29 25 68 0.98865 12.6 +"2334" "medium" 0 0.38 0.25 28 191 0.9971 9.2 +"3564" "medium" 0 0.31 0.42 50 173 0.9958 9 +"1921" "medium" 0 0.24 0.35 36 135 0.9938 10.5 +"4995" "medium" 0 0.26 0.46 48 186 0.9958 9.1 +"1070" "medium" 1 0.62 0.35 28 52 0.997 10.8 +"5286" "medium" 0 0.3 0.37 27 177 0.99438 9.8 +"4421" "medium" 0 0.4 0.46 42 241 0.9968 9.9 +"5630" "medium" 0 0.19 0.38 30 105 0.99047 11.4 +"273" "medium" 1 0.37 0.58 17 65 0.99935 10.1 +"896" "medium" 1 0.59 0.01 27 43 0.9955 10.7 +"5267" "good" 0 0.32 0.28 46 115 0.98946 13 +"742" "medium" 1 0.53 0.24 28 139 0.99788 9.5 +"956" "medium" 1 0.21 0.52 9 23 0.99648 10.4 +"4435" "medium" 0 0.25 0.22 41 161 0.99256 10.5 +"414" "good" 1 0.4 0.53 6 19 0.9986 11.7 +"2737" "good" 0 0.31 0.37 70 170 0.9934 11.7 +"1496" "medium" 1 0.43 0.02 15 28 0.99492 10.6 +"455" "medium" 1 0.23 0.4 21 67 0.9952 11.1 +"3970" "good" 0 0.1 0.24 25 107 0.99511 10.5 +"286" "medium" 1 0.59 0.07 32 71 1.00015 9.8 +"1535" "good" 1 0.56 0.14 13 29 0.99397 11.7 +"3144" "medium" 0 0.13 0.49 6 24 0.9926 9.9 +"5473" "medium" 0 0.37 0.51 58 181 0.99776 9 +"6308" "medium" 0 0.33 0.28 26 109 0.99246 10.6 +"5051" "good" 0 0.21 0.29 43 106 0.99112 11.5 +"3502" "medium" 0 0.23 0.35 26 183 0.9984 9.1 +"4286" "medium" 0 0.17 0.29 52 119 0.98944 12.9 +"1408" "medium" 1 0.51 0 40 54 0.995 10.7 +"2581" "good" 0 0.28 0.33 32 155 0.9951 10.7 +"6225" "medium" 0 0.49 0.23 6 158 0.99344 11.2 +"4614" "medium" 0 0.45 0.34 12 67 0.9976 11 +"3065" "medium" 0 0.2 0.74 19 163 0.9931 10.2 +"54" "medium" 1 0.38 0.36 30 119 0.997 9.4 +"6300" "medium" 0 0.3 0.33 60 168 0.99659 9.8 +"2050" "medium" 0 0.6 0.2 21 174 0.9971 9.1 +"5574" "medium" 0 0.29 0.52 35 192 0.99551 9.5 +"3368" "medium" 0 0.37 0.07 58 144 0.9922 10 +"2332" "good" 0 0.28 0.45 14 49 0.9934 11.1 +"4225" "medium" 0 0.19 0.21 89 159 0.99332 8 +"5508" "good" 0 0.39 0.24 45 138 0.99174 11.2 +"2830" "medium" 0 0.29 0.3 46 238 0.9986 8.7 +"5669" "medium" 0 0.24 0.28 54 133 0.9952 10.7 +"6141" "medium" 0 0.23 0.34 23 111 0.98961 12.7 +"6395" "good" 0 0.105 0.29 44 140 0.99142 10.7 +"5337" "medium" 0 0.21 0.72 65 120 0.99324 9.2 +"878" "medium" 1 0.715 0.01 31 43 0.99371 11.8 +"4190" "medium" 0 0.13 0.28 47 132 0.99655 10.1 +"5778" "good" 0 0.19 0.33 49 133 0.99107 11.3 +"3316" "medium" 0 0.21 0.31 29 108 0.9939 10.8 +"5832" "medium" 0 0.39 0.28 10 92 0.99206 12.1 +"5672" "good" 0 0.16 0.38 70.5 163 0.99706 10.4 +"1786" "medium" 0 0.24 0.41 49 166 0.9954 9.9 +"2654" "medium" 0 0.31 0.52 5 61 0.9918 10.4 +"1199" "medium" 1 0.26 0.26 19 77 0.9951 10.9 +"5997" "medium" 0 0.27 0.26 55 173 0.99699 9.8 +"1347" "medium" 1 0.59 0.01 5 13 0.99472 11.4 +"4785" "medium" 0 0.21 0.4 49 115 0.99268 11 +"5400" "medium" 0 0.2 0.3 7 49 0.99242 10.3 +"2157" "medium" 0 0.41 0.24 16 137 0.993 10.4 +"3552" "good" 0 0.31 0.36 29 142 0.9925 13 +"788" "medium" 1 0.56 0.24 19 58 0.9991 10.1 +"2624" "medium" 0 0.34 0.74 23 185 0.9928 12 +"1912" "medium" 0 0.25 0.41 37 149 0.9954 10 +"499" "good" 1 0.35 0.53 5 16 0.9972 11 +"2522" "medium" 0 0.32 0.62 56 153 0.9978 8.9 +"6456" "medium" 0 0.23 0.39 26 172 0.99755 9 +"4425" "medium" 0 0.25 0.22 41 161 0.99256 10.5 +"618" "medium" 1 0.31 0.51 14 28 0.9982 9.8 +"1139" "medium" 1 0.41 0.15 29 94 0.99786 9.1 +"5815" "medium" 0 0.44 0.24 68 210 0.99718 9.5 +"1191" "medium" 1 0.4 0.57 6 20 0.99652 12.5 +"1348" "medium" 1 0.655 0.03 7 12 0.99587 9.5 +"771" "medium" 1 0.59 0.02 24 94 0.99744 9.7 +"5530" "medium" 0 0.28 0.26 25 101 0.98894 12.1 +"858" "good" 1 0.26 0.34 16 47 0.99594 11.3 +"4070" "medium" 0 0.25 0.34 34 176 0.99434 9.5 +"5460" "medium" 0 0.25 0.26 52 207 0.99587 9.2 +"4236" "medium" 0 0.24 0.27 40 174 0.99773 9 +"5919" "good" 0 0.41 0.24 33 115 0.9901 12.89333333 +"6340" "medium" 0 0.32 0.46 56 189 0.99308 9.6 +"5170" "medium" 0 0.26 0.27 20 80 0.99089 11.5 +"3266" "medium" 0 0.445 0.56 8 84 0.9938 10.8 +"3696" "medium" 0 0.32 0.34 5 129 0.9953 9.1 +"6310" "good" 0 0.33 0.31 27 108 0.99031 12.2 +"6269" "medium" 0 0.44 0.33 12 117 0.99134 11.5 +"3258" "medium" 0 0.31 0.49 52 220 0.9964 8.8 +"6313" "medium" 0 0.28 0.28 19 98 0.99216 11.1 +"362" "medium" 1 0.45 0.31 21 50 0.9982 9.9 +"2374" "good" 0 0.27 0.45 28 124 0.997 10.4 +"4507" "medium" 0 0.21 0.25 26 81 0.9902 11.4 +"1575" "medium" 1 0.31 0.78 23 92 0.99677 10.5 +"3468" "good" 0 0.21 0.27 41 144 0.9932 11.8 +"5729" "good" 0 0.34 0.31 18 68 0.98981 13.4 +"6469" "medium" 0 0.24 0.33 8 81 0.99626 9.8 +"510" "good" 1 0.29 0.75 23 43 0.9986 11.4 +"6107" "medium" 0 0.305 0.13 17 73 0.99 12.33333333 +"1178" "good" 1 0.66 0 6 11 0.99318 12.7 +"4973" "good" 0 0.28 0.24 49 121 0.98882 13.2 +"4120" "medium" 0 0.41 0.23 28 174 0.99898 9.7 +"5295" "medium" 0 0.15 0.4 61 146 0.99112 11 +"2076" "good" 0 0.28 0.36 42 105 0.9893 12.4 +"3989" "good" 0 0.46 0.26 28 83 0.99114 12 +"4518" "medium" 0 0.28 0.28 15 65 0.9902 11.2 +"3184" "medium" 0 0.25 0.74 52 209 0.9956 9.2 +"1198" "medium" 1 0.57 0.21 4 9 0.99458 9.8 +"1847" "good" 0 0.2 0.27 12 77 0.9905 10.9 +"2285" "medium" 0 0.36 0.26 54 201 0.9976 9 +"6022" "medium" 0 0.22 0.28 24 125 0.9917 10.5 +"6087" "medium" 0 0.13 0.28 32 87 0.99175 11.2 +"113" "medium" 1 0.6 0.1 14 111 0.9964 9.8 +"5667" "medium" 0 0.38 0.28 22 166 0.99506 10.6 +"3317" "medium" 0 0.27 0.32 19 142 0.9921 9.9 +"933" "medium" 1 0.4 0.29 29 66 0.9971 9.5 +"4658" "medium" 0 0.25 0.38 54 208 0.99572 9.1 +"1923" "medium" 0 0.28 0.44 35 137 0.9946 10.4 +"4026" "medium" 0 0.22 0.26 32 172 0.99194 11.2 +"2244" "medium" 0 0.24 0.29 32 166 0.9968 9.5 +"226" "medium" 1 0.43 0.25 29 63 0.99615 10.5 +"1254" "medium" 1 0.66 0 6 13 0.99569 9.5 +"747" "medium" 1 0.34 0.38 12 57 0.9978 9 +"2809" "medium" 0 0.23 0.46 30 125 0.9907 12.5 +"1137" "medium" 1 0.52 0.45 6 13 0.99774 11.4 +"2067" "medium" 0 0.32 0.21 15 68 0.9932 9.4 +"2455" "good" 0 0.2 0.35 30 116 0.9949 10.3 +"6163" "good" 0 0.26 0.27 27 119 0.9947 10.7 +"3977" "medium" 0 0.22 0.29 24 90 0.99556 9.8 +"50" "medium" 1 0.31 0.37 12 96 0.9954 9.2 +"3418" "medium" 0 0.26 0.29 27 96 0.9896 12.3 +"5477" "medium" 0 0.28 0.31 20 98 0.99069 11.4 +"2389" "medium" 0 0.3 0.27 31 119 0.99815 9.3 +"6243" "medium" 0 0.21 0.35 47 197 0.99392 10.1 +"65" "medium" 1 0.725 0.05 4 11 0.9962 10.9 +"3678" "medium" 0 0.17 0.3 25 119 0.9931 10.5 +"3117" "medium" 0 0.24 0.49 52 163 0.9952 10.6 +"4327" "medium" 0 0.17 0.31 34 121 0.99092 10.5 +"4206" "medium" 0 0.2 0.36 22 157 0.9938 10.6 +"1169" "medium" 1 0.34 0.27 8 44 0.99384 12 +"4188" "good" 0 0.18 0.3 19 171 0.99808 9 +"5392" "medium" 0 0.25 0.3 53 133 0.99524 10.4 +"1477" "medium" 1 0.5 0.5 48 82 1.00242 8.8 +"3063" "medium" 0 0.19 0.49 11 137 0.9918 11 +"6342" "medium" 0 0.27 0.32 36 133 0.99215 10.8 +"4634" "medium" 0 0.25 0.47 36 156 0.99604 9.4 +"3862" "medium" 0 0.25 0.31 11 61 0.99189 11.5 +"1497" "medium" 1 0.54 0.26 23 147 0.99636 9.7 +"193" "medium" 1 0.63 0.12 16 126 0.9969 9.5 +"2273" "medium" 0 0.31 0.3 18 130 0.9928 10.6 +"3074" "bad" 0 0.25 0.24 13 85 0.9942 9.5 +"583" "medium" 1 0.49 0.49 5 15 1 9.2 +"6169" "medium" 0 0.2 0.32 17 126 0.9936 9.4 +"3865" "medium" 0 0.3 0.21 49 159 0.99827 9 +"5812" "bad" 0 0.31 0.37 13 164 0.99602 8.8 +"2658" "medium" 0 0.21 0.34 26 111 0.9931 10.7 +"4152" "medium" 0 0.36 0.52 8 110 0.9966 9.4 +"753" "medium" 1 0.54 0.13 24 66 0.99785 9.4 +"4000" "bad" 0 0.19 0.42 16 104 0.99517 10 +"5504" "good" 0 0.455 0.18 33 106 0.98746 14 +"1861" "medium" 0 0.29 0.4 36 156 0.9996 8.9 +"6068" "medium" 0 0.21 0.24 31 95 0.99036 11.3 +"4950" "medium" 0 0.22 0.28 41 132 0.9935 11.3 +"4654" "medium" 0 0.15 0.31 7 73 0.99152 11.9 +"1511" "medium" 1 0.36 0.21 26 48 0.99661 9.7 +"1001" "good" 1 0.43 0.3 6 12 0.99495 11.5 +"2386" "medium" 0 0.34 0.28 31 117 0.99815 9.2 +"1242" "medium" 1 0.37 0.39 28 65 0.99729 9.8 +"2045" "bad" 0 0.32 0.32 16 66 0.9937 11.5 +"2743" "medium" 0 0.24 0.3 27 131 0.9933 10.5 +"1413" "medium" 1 0.24 0.34 8 22 0.9974 10.9 +"2060" "medium" 0 0.21 0.27 26 111 0.9956 9.5 +"5915" "good" 0 0.41 0.24 33 115 0.9901 12.89333333 +"469" "medium" 1 0.36 0.69 6 21 1 9.2 +"5454" "medium" 0 0.12 0.27 40 110 0.99226 12.1 +"4119" "medium" 0 0.24 0.55 67 216 0.99596 9.2 +"397" "medium" 1 0.735 0.02 68 124 0.9994 9.9 +"1278" "medium" 1 0.69 0 3 10 0.99636 9.7 +"2307" "medium" 0 0.18 0.45 57 166 0.9943 11.2 +"1279" "medium" 1 0.715 0.22 13 81 0.99688 9.5 +"4528" "good" 0 0.31 0.31 45 140 0.99216 12 +"761" "medium" 1 0.58 0.25 9 104 0.99779 9.7 +"3747" "medium" 0 0.29 0.2 20 142 0.9962 10.6 +"199" "good" 1 0.835 0.08 13 93 0.9924 13 +"802" "medium" 1 0.55 0.09 8 17 0.99735 10 +"4150" "medium" 0 0.33 0.14 27 128 0.99475 9.4 +"271" "medium" 1 0.545 0.06 27 61 0.9965 10.7 +"5070" "good" 0 0.24 0.3 105 179 0.99189 11.3 +"6303" "good" 0 0.12 0.28 36 83 0.99074 10.9 +"146" "medium" 1 0.67 0.55 32 141 0.9968 9.4 +"3768" "good" 0 0.19 0.3 48.5 229 0.9986 9.1 +"4665" "medium" 0 0.15 0.38 54 120 0.9975 9.8 +"2703" "medium" 0 0.29 0.39 6 117 0.9938 10.7 +"5349" "medium" 0 0.28 0.29 40 143 0.99374 11 +"1693" "good" 0 0.21 0.33 48 136 0.9899 12.6 +"1640" "medium" 0 0.23 0.39 63 158 0.9937 9.4 +"5547" "good" 0 0.3 0.32 41 142 0.98952 12.7 +"354" "medium" 1 0.53 0.79 23 77 1.0018 13 +"4161" "medium" 0 0.28 0.22 36 131 0.99696 9.6 +"3230" "medium" 0 0.25 0.24 6 121 0.993 11.4 +"1319" "medium" 1 0.63 0.27 17 91 0.99616 9.8 +"3832" "medium" 0 0.2 0.31 16 89 0.99416 9.5 +"2894" "bad" 0 0.41 0.22 10 102 0.993 11.6 +"3282" "good" 0 0.25 0.28 55 205 0.9986 9 +"5782" "medium" 0 0.38 0.56 15 170 0.99605 9.9 +"570" "medium" 1 0.36 0.24 19 42 0.9946 11.7 +"5111" "good" 0 0.19 0.28 22 90 0.99038 11.7 +"6433" "medium" 0 0.33 0.28 33 97 0.99126 10.9 +"229" "medium" 1 0.43 0.25 29 63 0.99615 10.5 +"5419" "medium" 0 0.35 0.26 36 120 0.99188 11.5 +"2174" "good" 0 0.2 0.33 39 138 0.991 11.7 +"1749" "medium" 0 0.25 0.3 23 116 0.994 9.4 +"4782" "medium" 0 0.12 0.33 23 131 0.99164 9.8 +"5163" "medium" 0 0.48 0.12 23 86 0.99398 9 +"6059" "medium" 0 0.22 0.18 28 120 0.99403 9.9 +"4836" "medium" 0 0.22 0.39 44 141 0.99123 12.5 +"5635" "medium" 0 0.2 0.22 53 172 0.99404 11 +"6054" "medium" 0 0.18 0.26 17 149 0.9984 9.4 +"6437" "medium" 0 0.28 0.38 54 216 0.99154 13.1 +"3347" "medium" 0 0.3 0.36 33 169 0.9982 9.3 +"684" "medium" 1 0.78 0.23 5 15 0.997 11.3 +"48" "medium" 1 0.29 0.52 12 37 0.9969 9.5 +"2117" "medium" 0 0.15 0.42 49 154 0.992 10.4 +"1224" "medium" 1 0.36 0.47 9 23 0.99638 12 +"96" "medium" 1 0.6 0.17 17 106 0.9932 12.9 +"4131" "bad" 0 0.54 0.27 8 178 0.99502 9.4 +"2726" "good" 0 0.115 0.29 73 166 0.989 12.9 +"2511" "medium" 0 0.33 0.19 22 143 0.99425 9.9 +"6262" "medium" 0 0.17 0.36 44 111 0.99272 12.4 +"3086" "medium" 0 0.15 0.49 17 51 0.9932 9.4 +"1253" "medium" 1 0.72 0 6 14 0.99627 9.8 +"4549" "medium" 0 0.28 0.52 30 139 0.99494 9 +"723" "medium" 1 0.42 0.08 15 48 0.9968 10 +"5287" "medium" 0 0.16 0.27 39 98 0.99402 10.8 +"3739" "medium" 0 0.33 0.64 12 105 0.9972 9.2 +"1658" "medium" 0 0.38 0.15 25 78 0.9931 10.2 +"76" "medium" 1 0.41 0.64 9 42 0.9986 10.5 +"1604" "medium" 0 0.23 0.32 47 186 0.9956 9.9 +"149" "medium" 1 0.49 0.1 12 30 0.9959 10.2 +"554" "medium" 1 1.04 0.24 32 96 0.9934 11.5 +"349" "medium" 1 0.56 0.31 15 46 0.9979 10 +"639" "good" 1 0.915 0.12 7 23 0.9964 10.2 +"416" "medium" 1 0.725 0.24 31 134 1.0014 9.3 +"2966" "medium" 0 0.14 0.41 22 95 0.9914 10.9 +"378" "good" 1 0.27 0.53 6 18 0.9962 12 +"475" "medium" 1 0.28 0.51 10 24 0.9982 9.4 +"1212" "medium" 1 0.44 0.15 22 53 0.9957 9.3 +"5670" "medium" 0 0.28 0.27 41 162 0.99498 9.9 +"15" "medium" 1 0.62 0.18 52 145 0.9986 9.2 +"4986" "good" 0 0.28 0.27 56 140 0.99042 12.5 +"324" "medium" 1 0.59 0.42 35 73 0.999 9.5 +"3657" "good" 0 0.31 0.31 20 151 0.9926 12 +"5571" "medium" 0 0.17 0.3 33 125 0.99152 10.4 +"881" "medium" 1 0.56 0.18 10 21 0.99576 9.9 +"322" "medium" 1 0.61 0.26 25 87 0.99975 9.7 +"1998" "medium" 0 0.26 0.27 52 168 0.9993 9.4 +"3795" "medium" 0 0.25 0.18 13 137 0.9935 9.5 +"5064" "medium" 0 0.29 0.41 52 171 0.99537 9.6 +"232" "medium" 1 0.38 0.06 12 49 0.99625 9.9 +"5447" "medium" 0 0.32 0.23 36 176 0.9986 9.1 +"2232" "medium" 0 0.24 0.33 16 131 0.9936 10.7 +"5307" "medium" 0 0.34 0.43 29 114 0.99014 12.6 +"3578" "medium" 0 0.33 0.26 23 103 0.9932 10.5 +"4645" "medium" 0 0.12 0.26 21 99 0.99324 9.9 +"6277" "good" 0 0.28 0.52 37 104 0.99161 11.8 +"6483" "medium" 0 0.47 0.17 60 148 0.98964 11.5 +"1028" "medium" 1 0.795 0 28 52 0.99378 11.6 +"5649" "medium" 0 0.16 0.36 32 98 0.99058 11.3 +"1493" "medium" 1 0.65 0.06 6 18 0.99348 11.95 +"52" "medium" 1 0.52 0.04 8 15 0.9956 9.4 +"4329" "good" 0 0.29 0.31 24 79 0.99053 11.4 +"5765" "good" 0 0.22 0.35 23 83 0.99019 12 +"4927" "good" 0 0.17 0.36 11 70 0.99202 10.4 +"4871" "good" 0 0.32 0.34 27 91 0.99184 12 +"5099" "good" 0 0.33 0.3 30 124 0.98922 13.1 +"419" "medium" 1 0.38 0.51 7 20 0.9996 10.4 +"2019" "medium" 0 0.31 0.28 33 137 0.9929 10.5 +"3490" "medium" 0 0.3 0.42 45 213 0.9991 9.2 +"5412" "medium" 0 0.21 0.39 21 138 0.99176 10.9 +"4310" "medium" 0 0.25 0.34 66 184 0.99976 8.9 +"2156" "medium" 0 0.35 0.71 22 160 0.9982 9.4 +"4040" "medium" 0 0.46 0.26 49 159 0.99434 10 +"4791" "medium" 0 0.24 0.44 49 146 0.9911 11.6 +"6205" "medium" 0 0.29 0.32 38 93 0.9906 12 +"1295" "medium" 1 0.635 0.1 25 60 0.99638 10.9 +"4177" "medium" 0 0.25 0.36 63 206 0.99553 9.6 +"2216" "good" 0 0.32 0.33 18 101 0.9912 11.7 +"6355" "medium" 0 0.29 0.73 21 92 0.99 12.4 +"4493" "good" 0 0.16 0.34 85 153 0.9909 12 +"4428" "good" 0 0.14 0.31 53 138 0.99084 11.5 +"3089" "medium" 0 0.16 0.74 52 187 0.9998 9.3 +"2142" "medium" 0 0.35 0.35 14 167 0.992 9.9 +"4354" "medium" 0 0.17 0.28 5 28 0.98985 10.6 +"5650" "good" 0 0.16 0.27 25 135 0.9984 8.7 +"2801" "good" 0 0.17 0.37 26 75 0.9922 10.8 +"2977" "medium" 0 0.28 0.41 10 136 0.993 11.4 +"919" "medium" 1 0.36 0.32 32 79 0.9964 11 +"1951" "good" 0 0.33 0.4 32 138 0.992 11.9 +"3641" "medium" 0 0.14 0.27 22 104 0.9949 9 +"5697" "medium" 0 0.14 0.28 21 82 0.99425 10 +"6452" "medium" 0 0.23 0.38 12 113 0.99176 11.4 +"3271" "good" 0 0.35 0.3 27 87 0.9936 11.4 +"4515" "medium" 0 0.14 0.38 22 81 0.99043 11.4 +"3665" "medium" 0 0.27 0.28 21 127 0.9934 9.9 +"4167" "medium" 0 0.24 0.28 39 132 0.99182 11.4 +"6008" "medium" 0 0.29 0.16 48 197 0.99512 9.4 +"6094" "medium" 0 0.24 0.29 34 84 0.9902 11.45 +"605" "medium" 1 0.58 0.13 14 63 0.9984 9.1 +"5608" "medium" 0 0.25 0.48 25 94 0.99782 9.2 +"2942" "medium" 0 0.58 0.27 37 116 0.9959 10.8 +"2360" "medium" 0 0.18 0.38 44 176 0.9958 9.8 +"4579" "good" 0 0.36 0.26 39 123 0.99119 12.2 +"4805" "good" 0 0.45 0.36 28 156 0.991 12.4 +"239" "medium" 1 0.63 0 14 38 0.99675 9 +"612" "medium" 1 0.38 0.55 5 16 1.0006 9.4 +"4937" "medium" 0 0.38 0.29 52 189 0.99784 9.5 +"3692" "medium" 0 0.76 0.03 27 93 0.9932 9.2 +"4287" "medium" 0 0.24 0.38 56 187 0.99577 9.2 +"2203" "medium" 0 0.475 0.06 9 131 0.9904 10.8 +"1547" "medium" 1 0.57 0.02 17 26 0.99575 10.2 +"5444" "medium" 0 0.37 0.25 24 84 0.9909 11.7 +"872" "medium" 1 0.56 0.03 36 46 0.99522 10.6 +"4513" "medium" 0 0.18 0.3 49 199 0.99413 9.3 +"6280" "bad" 0 0.63 0.04 25 133 0.99271 10.2 +"5050" "good" 0 0.21 0.29 43 106 0.99112 11.5 +"2226" "bad" 0 0.56 0.12 22 177 0.9983 9.1 +"5135" "medium" 0 0.28 0.44 49 179 0.99528 9.2 +"5278" "medium" 0 0.23 0.25 19 111 1.00044 8.7 +"2570" "good" 0 0.42 0.01 25 102 0.9894 12.3 +"4509" "medium" 0 0.18 0.3 23 73 0.99032 11.3 +"2732" "medium" 0 0.39 0.31 28 162 0.9988 9.1 +"1820" "medium" 0 0.27 0.36 45 164 0.9939 11 +"5495" "medium" 0 0.25 0.33 17 76 0.99021 12.3 +"1882" "bad" 0 0.44 0.37 46 201 0.9938 10.5 +"789" "medium" 1 0.56 0.24 19 58 0.9991 10.1 +"4290" "medium" 0 0.3 0.25 26 124 0.99428 9.3 +"1249" "medium" 1 0.41 0.33 22 36 0.9949 11.1 +"3306" "medium" 0 0.24 0.22 38 157 0.9934 9.9 +"5468" "medium" 0 0.22 0.25 112 177 0.9961 9.4 +"2342" "medium" 0 0.2 0.37 26 136 0.9932 10.2 +"2217" "medium" 0 0.26 0.27 52 195 0.9928 10.9 +"1252" "medium" 1 0.58 0.14 27 60 0.9963 9.8 +"1828" "medium" 0 0.17 0.32 41 200 0.9938 9.7 +"832" "medium" 1 0.61 0.08 16 24 0.99376 11.1 +"4529" "medium" 0 0.22 0.29 39 118 0.99834 9.1 +"2750" "medium" 0 0.32 0.17 69 219 0.9959 8.9 +"5511" "medium" 0 0.23 0.82 70 109 0.99304 9.2 +"4111" "medium" 0 0.3 0.49 68 215 0.99656 9.4 +"2200" "medium" 0 0.3 0.35 36 160 0.9937 9.4 +"695" "medium" 1 0.47 0.31 24 125 0.9984 9.4 +"611" "medium" 1 0.24 0.54 25 57 0.9983 9.2 +"1916" "medium" 0 0.25 0.34 34 134 0.9927 10.6 +"1646" "bad" 0 0.45 0.26 63 206 0.994 9.8 +"1774" "medium" 0 0.27 0.31 33 173 0.999 10.2 +"1977" "good" 0 0.2 0.44 21 98 0.9924 10 +"5298" "medium" 0 0.22 0.34 32 96 0.98961 11.6 +"1007" "good" 1 0.29 0.33 13 27 0.99516 11.7 +"3956" "medium" 0 0.34 0.32 29 130 0.99354 10.4 +"5659" "medium" 0 0.16 0.36 32 98 0.99058 11.3 +"6" "medium" 1 0.66 0 13 40 0.9978 9.4 +"1365" "medium" 1 0.605 0.02 10 31 0.995 11.8 +"619" "medium" 1 0.46 0.5 4 17 1.0006 10.2 +"3131" "good" 0 0.3 0.49 26 174 0.9943 11.2 +"2941" "medium" 0 0.54 0.23 13 151 0.9931 10.4 +"2027" "medium" 0 0.29 0.5 48 194 0.9974 9.4 +"3838" "medium" 0 0.15 0.29 39 151 0.99471 10.6 +"6039" "medium" 0 0.47 0.16 14 125 0.99428 9.8 +"5624" "medium" 0 0.28 0.27 50 147 0.99126 11.6 +"5323" "good" 0 0.265 0.28 46 150 0.99299 10.8 +"2730" "medium" 0 0.2 0.28 36 159 0.9936 9.1 +"1783" "medium" 0 0.27 0.4 64 227 0.9979 9.6 +"1579" "medium" 1 0.67 0.15 13 20 0.9954 11.3 +"3397" "good" 0 0.25 0.27 37 128 0.9936 11.3 +"3685" "medium" 0 0.17 0.32 47 150 0.9948 9.6 +"5180" "medium" 0 0.3 0.21 33 143 0.99244 11.1 +"1741" "medium" 0 0.37 0.67 49 155 0.9975 8.7 +"5219" "medium" 0 0.45 0.28 27 122 1.00295 10.6 +"5103" "good" 0 0.33 0.31 21 93 0.9896 13.4 +"997" "good" 1 0.66 0 3 11 0.99378 12.8 +"1451" "good" 1 0.37 0.32 15 28 0.9947 11.3 +"2102" "medium" 0 0.3 0.3 8 210 0.9937 9.9 +"309" "medium" 1 0.43 0.44 5 12 0.9994 9.5 +"3508" "good" 0 0.36 0.36 26 98 0.9914 12.5 +"4429" "medium" 0 0.26 0.32 31 170 0.99644 11.2 +"2320" "medium" 0 0.29 0.44 62 178 0.99685 8.9 +"4943" "good" 0 0.36 0.28 51 189 0.99782 9.5 +"1236" "bad" 1 0.33 0.32 6 113 0.99572 11.5 +"5285" "medium" 0 0.15 0.41 79.5 183 0.99742 10.2 +"1622" "good" 0 0.26 0.42 41 122 0.993 10.5 +"2865" "good" 0 0.31 0.34 36 174 0.9963 11.1 +"254" "medium" 1 0.775 0.42 8 86 0.9959 9.5 +"581" "medium" 1 0.5 0.49 5 14 1.0002 9.6 +"4635" "good" 0 0.24 0.33 31 85 0.99014 11.3 +"198" "medium" 1 0.3 0.6 12 27 0.9981 10.1 +"5257" "good" 0 0.15 0.47 49 128 0.99456 10.5 +"5006" "medium" 0 0.32 0.33 25 95 0.99268 11.1 +"2363" "medium" 0 0.44 0.04 38 128 0.9985 10.2 +"922" "medium" 1 0.36 0.32 32 79 0.9964 11 +"399" "medium" 1 0.59 0.59 13 49 0.9988 11 +"3948" "medium" 0 0.26 0.31 14 141 0.99077 12.2 +"2198" "good" 0 0.27 0.29 31 115 0.9949 10.5 +"5393" "medium" 0 0.32 0.26 63 170 0.9961 9.9 +"4609" "medium" 0 0.2 0.5 50 221 0.99941 8.8 +"5299" "medium" 0 0.3 0.37 27 177 0.99438 9.8 +"2598" "medium" 0 0.24 0.3 43 184 0.9997 9.2 +"1214" "medium" 1 0.38 0.42 5 13 0.99659 10.5 +"5875" "medium" 0 0.22 0.2 41 113 0.99862 8.9 +"3626" "medium" 0 0.26 0.4 5 60 0.9925 10.1 +"4087" "medium" 0 0.27 0.27 25 122 0.99088 11.9 +"783" "medium" 1 0.82 0.05 26 96 0.99814 10 +"1482" "medium" 1 0.28 0.6 10 22 0.99828 10.6 +"290" "medium" 1 0.42 0.53 33 98 1.001 9.2 +"5956" "medium" 0 0.29 0.29 35 178 0.99313 10.53333333 +"3011" "medium" 0 0.2 0.34 32 83 0.9928 11.5 +"2293" "medium" 0 0.37 0.14 34 185 0.9944 9.8 +"6176" "medium" 0 0.3 0.29 23 56 0.9904 11.3 +"3871" "medium" 0 0.25 0.26 50 156 0.99784 9.9 +"5478" "medium" 0 0.35 0.31 58 170 0.99692 9.4 +"1123" "medium" 1 0.47 0 27 33 0.9922 12.3 +"319" "good" 1 0.66 0.39 21 59 0.9989 11.5 +"2469" "medium" 0 0.24 0.29 37 97 0.9926 10.1 +"4151" "medium" 0 0.26 0.42 62 209 0.99544 9.5 +"2395" "medium" 0 0.31 0.26 37 157 0.99625 9 +"4073" "medium" 0 0.29 0.21 20 142 0.99658 10.1 +"2072" "medium" 0 0.24 0.29 19 86 0.99 12.5 +"1762" "medium" 0 0.36 0.3 14 85 0.9932 10.6 +"1775" "medium" 0 0.23 0.4 50 151 0.9927 11.4 +"3325" "medium" 0 0.17 0.22 55 152 0.9952 9.3 +"1560" "medium" 1 0.6 0.26 31 131 0.99622 9.9 +"3769" "good" 0 0.19 0.3 48.5 229 0.9986 9.1 +"5755" "medium" 0 0.3 0.47 50 187 0.9927 9.5 +"4011" "medium" 0 0.27 0.25 50 208 1.00051 9.2 +"6389" "medium" 0 0.62 0.33 24 118 0.98758 13.55 +"4958" "medium" 0 0.36 0.28 29 81 0.99151 12.5 +"3523" "medium" 0 0.37 0.27 10 59 0.9923 10.4 +"1452" "good" 1 0.32 0.44 8 17 0.99732 11 +"4576" "medium" 0 0.32 0.39 34 124 0.99286 12.1 +"5182" "medium" 0 0.32 0.32 12 76 0.98993 12.3 +"1179" "medium" 1 0.915 0 17 78 0.99346 11.4 +"1059" "good" 1 0.53 0.57 30 52 0.9971 11.6 +"6467" "medium" 0 0.6 0.34 3 60 0.98854 13 +"369" "medium" 1 0.34 0.52 15 75 0.9998 9.4 +"5795" "good" 0 0.45 0.24 24 87 0.98862 13.4 +"1836" "medium" 0 0.23 0.38 55 194 0.9979 9 +"1684" "medium" 0 0.43 0.61 54 155 0.9974 8.7 +"1737" "medium" 0 0.37 0.67 49 155 0.9975 8.7 +"988" "medium" 1 0.36 0.3 35 70 0.99693 9.4 +"5853" "bad" 0 0.47 0.1 11 74 0.99082 11.2 +"1201" "medium" 1 0.57 0.21 4 9 0.99458 9.8 +"866" "medium" 1 0.635 0.07 16 86 0.99748 9.7 +"110" "medium" 1 0.785 0.52 37 153 0.9969 9.3 +"775" "medium" 1 0.4 0.3 2 45 0.99727 9.5 +"5303" "medium" 0 0.24 0.31 26 180 0.99884 9.1 +"1938" "medium" 0 0.26 0.4 12 139 0.9945 10.4 +"1283" "medium" 1 0.765 0 9 22 0.99619 10.9 +"5636" "medium" 0 0.33 0.22 40 177 0.99287 9.9 +"1474" "medium" 1 0.6 0.08 14 45 0.99336 11 +"3236" "medium" 0 0.49 0.49 29 149 0.9952 10 +"2262" "bad" 0 0.57 0.1 23 188 0.9972 9.2 +"2881" "good" 0 0.27 0.34 26 168 0.9911 12.1 +"892" "medium" 1 0.66 0.03 16 86 0.99743 9.7 +"2032" "good" 0 0.155 0.34 73.5 214 0.9934 9.9 +"129" "good" 1 0.59 0.16 3 16 0.9962 10.5 +"6375" "medium" 0 0.27 0.4 42 124 0.99204 10.1 +"1044" "good" 1 0.39 0.41 18 39 0.99859 10.9 +"540" "medium" 1 0.5 0.74 5 17 0.9996 11.2 +"3219" "good" 0 0.22 0.49 31 128 0.9928 11.3 +"3183" "medium" 0 0.18 0.74 54 168 0.9978 10.1 +"1895" "medium" 0 0.33 0.27 34 175 0.9934 9.4 +"2631" "medium" 0 0.34 0.29 45 232 0.9955 10 +"1354" "medium" 1 0.645 0.03 14 57 0.9969 10.3 +"655" "medium" 1 0.47 0.47 7 29 0.9979 9.5 +"4963" "medium" 0 0.22 0.28 47 90 0.98862 12.6 +"3040" "medium" 0 0.26 0.74 56 162 0.998 8.8 +"4729" "medium" 0 0.21 0.38 37 122 0.98972 12 +"6286" "bad" 0 0.63 0.04 25 133 0.99271 10.2 +"5823" "bad" 0 0.43 0.11 6 51 0.99076 11.2 +"4224" "medium" 0 0.21 0.37 20 80 0.99076 12 +"729" "medium" 1 0.57 0.02 4 11 0.997 9.5 +"719" "medium" 1 0.56 0.04 10 22 0.9976 9.6 +"5217" "medium" 0 0.29 0.33 20 117 0.99048 11.4 +"3569" "good" 0 0.41 0.3 49 164 0.9927 11.7 +"1447" "medium" 1 0.63 0.02 18 30 0.99712 9.8 +"1394" "medium" 1 0.52 0.25 19 59 0.99612 10.2 +"4794" "medium" 0 0.16 0.32 7 89 0.99111 11 +"1664" "medium" 0 0.24 0.27 31 122 0.9927 10.3 +"501" "medium" 1 0.52 0.25 14 38 0.9984 9 +"3668" "medium" 0 0.32 0.18 26 104 0.9906 11 +"3098" "medium" 0 0.27 0.49 23 86 0.9914 12.5 +"1080" "good" 1 0.3 0.68 37.5 278 0.99316 12.3 +"2266" "medium" 0 0.22 0.37 38 195 0.9908 12.5 +"186" "medium" 1 0.31 0.57 26 85 0.9971 9.7 +"5841" "medium" 0 0.27 0.29 62 140 0.99237 11.1 +"3375" "medium" 0 0.49 1 28 135 0.9973 12 +"1111" "medium" 1 0.53 0 6 14 0.99593 10 +"430" "medium" 1 0.84 0.63 13 35 0.9997 10.4 +"677" "medium" 1 0.4 0.41 7 17 0.9984 9.3 +"3973" "bad" 0 0.48 0.37 5 57 0.99256 10.4 +"6471" "medium" 0 0.2 0.4 20 98 0.9897 12.05 +"1021" "medium" 1 0.36 0.66 3 8 0.99642 11.9 +"3674" "medium" 0 0.22 0.28 51 180 0.9952 9.5 +"6203" "medium" 0 0.33 0.18 40 124 0.99114 11 +"2762" "good" 0 0.25 0.41 29 151 0.9946 10.2 +"572" "medium" 1 0.36 0.24 19 42 0.9946 11.7 +"5960" "medium" 0 0.28 0.35 31 148 0.99178 10.7 +"970" "medium" 1 0.56 0.09 7 22 0.99669 10.2 +"460" "bad" 1 0.58 0.66 10 47 1.0008 9 +"4630" "good" 0 0.47 0.29 22 142 0.99518 12 +"5655" "medium" 0 0.3 0.27 22 97 0.99314 11.7 +"5365" "medium" 0 0.4 0.17 59 186 0.99754 9.4 +"2020" "good" 0 0.22 0.31 41 136 0.9898 12.7 +"3275" "medium" 0 0.27 0.32 65 224 0.9961 8.9 +"5150" "medium" 0 0.14 0.32 48 116 0.99218 10 +"3265" "good" 0 0.13 0.37 48 114 0.9911 11.5 +"3328" "medium" 0 0.3 0.24 35 116 0.9953 9.4 +"3925" "medium" 0 0.35 0.17 7 119 0.99297 9.7 +"1265" "medium" 1 0.37 0.32 26 51 0.99456 11.8 +"768" "medium" 1 0.6 0.32 13 98 0.99938 9.5 +"670" "medium" 1 0.34 0.45 6 15 0.9988 9.2 +"1156" "medium" 1 0.6 0.25 9 38 0.99616 9.8 +"2275" "medium" 0 0.28 0.25 44 201 0.9955 9.1 +"974" "medium" 1 0.34 0.44 6 12 0.99605 10.7 diff --git a/INSA/TP anadon/wine.txt b/INSA/TP anadon/wine.txt new file mode 100644 index 0000000..6040eee --- /dev/null +++ b/INSA/TP anadon/wine.txt @@ -0,0 +1,601 @@ +"Qualite" "Type" "AcidVol" "AcidCitr" "SO2lbr" "SO2tot" "Densite" "Alcool" +"1352" "medium" 1 0.62 0.01 8 46 0.99332 11.8 +"5493" "medium" 0 0.34 0.1 17 63 0.9937 9.2 +"5153" "medium" 0 0.22 0.22 39 110 0.99855 9 +"5308" "medium" 0 0.35 0.46 61 183 0.99786 9 +"3866" "medium" 0 0.42 0.32 20 167 0.99479 10.6 +"694" "medium" 1 0.48 0.32 21 122 0.9984 9.4 +"5085" "good" 0 0.21 0.32 39 113 0.99393 10.2 +"2280" "medium" 0 0.28 0.14 64 159 0.992 10 +"5231" "medium" 0 0.3 0.25 21 124 0.99362 10.8 +"4388" "medium" 0 0.4 0.42 41 176 0.99552 9.4 +"4172" "medium" 0 0.14 0.28 10 56 0.99352 9.9 +"4763" "good" 0 0.36 0.37 39 114 0.99036 12.7 +"4001" "bad" 0 0.16 0.49 18 107 0.99514 10.2 +"3244" "good" 0 0.19 0.49 50 134 0.9998 9.1 +"4663" "medium" 0 0.25 0.54 58 176 0.99454 10.4 +"3256" "medium" 0 0.15 0.49 21 98 0.9929 9.2 +"3444" "medium" 0 0.34 0.46 21 94 0.991 12.3 +"3867" "medium" 0 0.19 0.43 53 154 0.99752 10.4 +"3161" "medium" 0 0.28 0.49 10 112 0.9958 10.1 +"6420" "medium" 0 0.36 0.5 63 178 0.99212 9.7 +"1590" "medium" 1 0.725 0.2 29 79 0.9977 9.2 +"2155" "good" 0 0.25 0.34 31 93 0.9916 11.3 +"2258" "medium" 0 0.27 0.25 41 188 0.9915 11.3 +"209" "medium" 1 0.44 0.28 18 95 0.9966 9.4 +"4560" "good" 0 0.11 0.34 41 114 0.99634 11 +"1981" "medium" 0 0.28 0.26 48 179 0.9975 9 +"2166" "medium" 0 0.35 0.34 6 37 0.9944 11.5 +"5430" "good" 0 0.26 0.23 23 111 0.99274 11.5 +"6496" "good" 0 0.29 0.3 20 110 0.98869 12.8 +"346" "medium" 1 0.685 0 40 63 0.9979 9.9 +"1288" "medium" 1 0.6 0.08 3 7 0.99286 13 +"3615" "medium" 0 0.19 0.39 22 84 0.994 10.8 +"1837" "medium" 0 0.52 0.32 54 221 0.9972 9.6 +"5637" "medium" 0 0.34 0.22 43 176 0.99286 9.9 +"2520" "good" 0 0.11 0.32 59 144 0.9956 9.4 +"3046" "medium" 0 0.27 0.49 35 92 0.9911 12.2 +"2983" "medium" 0 0.36 0.56 25 102 0.9923 10.5 +"840" "medium" 1 0.5 0.04 13 26 0.99647 10 +"3185" "medium" 0 0.3 0.74 46 165 0.9982 8.7 +"4690" "medium" 0 0.17 0.35 33 78 0.99146 11.3 +"6347" "medium" 0 0.26 0.5 25 93 0.99428 10.5 +"728" "medium" 1 0.57 0.02 4 11 0.997 9.5 +"240" "medium" 1 1 0.09 7 37 0.99685 9 +"6318" "medium" 0 0.24 0.15 32 134 0.99378 9.9 +"2501" "medium" 0 0.29 0.29 26 113 0.9983 9.7 +"3003" "good" 0 0.26 0.31 29 128 0.9937 10.9 +"4537" "medium" 0 0.25 0.3 67 196 0.99555 10.1 +"4799" "good" 0 0.21 0.4 40 121 0.99214 12 +"141" "medium" 1 0.745 0.11 16 63 0.9965 9.6 +"3664" "medium" 0 0.22 0.28 51 180 0.9952 9.5 +"5167" "medium" 0 0.26 0.27 20 80 0.99089 11.5 +"5291" "medium" 0 0.22 0.26 23 112 0.9931 11.4 +"3383" "medium" 0 0.45 0.4 17 100 0.9957 10.1 +"2712" "medium" 0 0.22 0.34 55 177 0.9983 9.9 +"449" "medium" 1 0.53 0.22 7 27 0.9967 10.2 +"214" "medium" 1 0.57 0.26 28 65 0.9959 10.1 +"3216" "medium" 0 0.34 0.49 61 206 0.9957 9 +"4917" "medium" 0 0.32 0.32 32 105 0.99266 11.2 +"5005" "medium" 0 0.15 0.32 14 119 0.99137 10.2 +"3501" "medium" 0 0.21 0.3 14 118 0.9942 10.4 +"1291" "medium" 1 0.74 0 6 12 0.99521 11 +"3137" "medium" 0 0.28 0.49 32 148 0.9936 10 +"998" "good" 1 0.66 0 3 11 0.99378 12.8 +"1350" "medium" 1 0.57 0 21 41 0.99518 10.8 +"6336" "medium" 0 0.16 0.36 13 61 0.99143 10.8 +"492" "good" 1 0.41 0.5 12 25 0.9952 13.3 +"3901" "medium" 0 0.22 0.28 25 125 0.99856 9.4 +"4878" "medium" 0 0.38 0.36 42 214 0.9976 9.4 +"5343" "good" 0 0.15 0.28 29 149 0.99792 9 +"5096" "good" 0 0.24 0.28 61 134 0.99146 11.3 +"4516" "medium" 0 0.44 0.26 57 128 0.98982 12.7 +"1118" "medium" 1 0.69 0.07 15 21 0.99572 11.3 +"2680" "good" 0 0.15 0.33 31 118 0.9956 9 +"452" "medium" 1 0.37 0.53 9 26 0.9979 9.1 +"3937" "bad" 0 0.28 0.35 61 180 0.9972 9 +"776" "medium" 1 1 0 7 16 0.99586 10 +"528" "medium" 1 0.38 0.49 33 85 0.9962 11.4 +"3445" "medium" 0 0.44 0.2 44 157 0.998 9 +"203" "medium" 1 0.5 0.11 16 49 0.99545 9.5 +"1175" "medium" 1 0.36 0.31 26 65 0.99716 9.5 +"5796" "medium" 0 0.22 0.29 25 68 0.98865 12.6 +"2334" "medium" 0 0.38 0.25 28 191 0.9971 9.2 +"3564" "medium" 0 0.31 0.42 50 173 0.9958 9 +"1921" "medium" 0 0.24 0.35 36 135 0.9938 10.5 +"4995" "medium" 0 0.26 0.46 48 186 0.9958 9.1 +"1070" "medium" 1 0.62 0.35 28 52 0.997 10.8 +"5286" "medium" 0 0.3 0.37 27 177 0.99438 9.8 +"4421" "medium" 0 0.4 0.46 42 241 0.9968 9.9 +"5630" "medium" 0 0.19 0.38 30 105 0.99047 11.4 +"273" "medium" 1 0.37 0.58 17 65 0.99935 10.1 +"896" "medium" 1 0.59 0.01 27 43 0.9955 10.7 +"5267" "good" 0 0.32 0.28 46 115 0.98946 13 +"742" "medium" 1 0.53 0.24 28 139 0.99788 9.5 +"956" "medium" 1 0.21 0.52 9 23 0.99648 10.4 +"4435" "medium" 0 0.25 0.22 41 161 0.99256 10.5 +"414" "good" 1 0.4 0.53 6 19 0.9986 11.7 +"2737" "good" 0 0.31 0.37 70 170 0.9934 11.7 +"1496" "medium" 1 0.43 0.02 15 28 0.99492 10.6 +"455" "medium" 1 0.23 0.4 21 67 0.9952 11.1 +"3970" "good" 0 0.1 0.24 25 107 0.99511 10.5 +"286" "medium" 1 0.59 0.07 32 71 1.00015 9.8 +"1535" "good" 1 0.56 0.14 13 29 0.99397 11.7 +"3144" "medium" 0 0.13 0.49 6 24 0.9926 9.9 +"5473" "medium" 0 0.37 0.51 58 181 0.99776 9 +"6308" "medium" 0 0.33 0.28 26 109 0.99246 10.6 +"5051" "good" 0 0.21 0.29 43 106 0.99112 11.5 +"3502" "medium" 0 0.23 0.35 26 183 0.9984 9.1 +"4286" "medium" 0 0.17 0.29 52 119 0.98944 12.9 +"1408" "medium" 1 0.51 0 40 54 0.995 10.7 +"2581" "good" 0 0.28 0.33 32 155 0.9951 10.7 +"6225" "medium" 0 0.49 0.23 6 158 0.99344 11.2 +"4614" "medium" 0 0.45 0.34 12 67 0.9976 11 +"3065" "medium" 0 0.2 0.74 19 163 0.9931 10.2 +"54" "medium" 1 0.38 0.36 30 119 0.997 9.4 +"6300" "medium" 0 0.3 0.33 60 168 0.99659 9.8 +"2050" "medium" 0 0.6 0.2 21 174 0.9971 9.1 +"5574" "medium" 0 0.29 0.52 35 192 0.99551 9.5 +"3368" "medium" 0 0.37 0.07 58 144 0.9922 10 +"2332" "good" 0 0.28 0.45 14 49 0.9934 11.1 +"4225" "medium" 0 0.19 0.21 89 159 0.99332 8 +"5508" "good" 0 0.39 0.24 45 138 0.99174 11.2 +"2830" "medium" 0 0.29 0.3 46 238 0.9986 8.7 +"5669" "medium" 0 0.24 0.28 54 133 0.9952 10.7 +"6141" "medium" 0 0.23 0.34 23 111 0.98961 12.7 +"6395" "good" 0 0.105 0.29 44 140 0.99142 10.7 +"5337" "medium" 0 0.21 0.72 65 120 0.99324 9.2 +"878" "medium" 1 0.715 0.01 31 43 0.99371 11.8 +"4190" "medium" 0 0.13 0.28 47 132 0.99655 10.1 +"5778" "good" 0 0.19 0.33 49 133 0.99107 11.3 +"3316" "medium" 0 0.21 0.31 29 108 0.9939 10.8 +"5832" "medium" 0 0.39 0.28 10 92 0.99206 12.1 +"5672" "good" 0 0.16 0.38 70.5 163 0.99706 10.4 +"1786" "medium" 0 0.24 0.41 49 166 0.9954 9.9 +"2654" "medium" 0 0.31 0.52 5 61 0.9918 10.4 +"1199" "medium" 1 0.26 0.26 19 77 0.9951 10.9 +"5997" "medium" 0 0.27 0.26 55 173 0.99699 9.8 +"1347" "medium" 1 0.59 0.01 5 13 0.99472 11.4 +"4785" "medium" 0 0.21 0.4 49 115 0.99268 11 +"5400" "medium" 0 0.2 0.3 7 49 0.99242 10.3 +"2157" "medium" 0 0.41 0.24 16 137 0.993 10.4 +"3552" "good" 0 0.31 0.36 29 142 0.9925 13 +"788" "medium" 1 0.56 0.24 19 58 0.9991 10.1 +"2624" "medium" 0 0.34 0.74 23 185 0.9928 12 +"1912" "medium" 0 0.25 0.41 37 149 0.9954 10 +"499" "good" 1 0.35 0.53 5 16 0.9972 11 +"2522" "medium" 0 0.32 0.62 56 153 0.9978 8.9 +"6456" "medium" 0 0.23 0.39 26 172 0.99755 9 +"4425" "medium" 0 0.25 0.22 41 161 0.99256 10.5 +"618" "medium" 1 0.31 0.51 14 28 0.9982 9.8 +"1139" "medium" 1 0.41 0.15 29 94 0.99786 9.1 +"5815" "medium" 0 0.44 0.24 68 210 0.99718 9.5 +"1191" "medium" 1 0.4 0.57 6 20 0.99652 12.5 +"1348" "medium" 1 0.655 0.03 7 12 0.99587 9.5 +"771" "medium" 1 0.59 0.02 24 94 0.99744 9.7 +"5530" "medium" 0 0.28 0.26 25 101 0.98894 12.1 +"858" "good" 1 0.26 0.34 16 47 0.99594 11.3 +"4070" "medium" 0 0.25 0.34 34 176 0.99434 9.5 +"5460" "medium" 0 0.25 0.26 52 207 0.99587 9.2 +"4236" "medium" 0 0.24 0.27 40 174 0.99773 9 +"5919" "good" 0 0.41 0.24 33 115 0.9901 12.89333333 +"6340" "medium" 0 0.32 0.46 56 189 0.99308 9.6 +"5170" "medium" 0 0.26 0.27 20 80 0.99089 11.5 +"3266" "medium" 0 0.445 0.56 8 84 0.9938 10.8 +"3696" "medium" 0 0.32 0.34 5 129 0.9953 9.1 +"6310" "good" 0 0.33 0.31 27 108 0.99031 12.2 +"6269" "medium" 0 0.44 0.33 12 117 0.99134 11.5 +"3258" "medium" 0 0.31 0.49 52 220 0.9964 8.8 +"6313" "medium" 0 0.28 0.28 19 98 0.99216 11.1 +"362" "medium" 1 0.45 0.31 21 50 0.9982 9.9 +"2374" "good" 0 0.27 0.45 28 124 0.997 10.4 +"4507" "medium" 0 0.21 0.25 26 81 0.9902 11.4 +"1575" "medium" 1 0.31 0.78 23 92 0.99677 10.5 +"3468" "good" 0 0.21 0.27 41 144 0.9932 11.8 +"5729" "good" 0 0.34 0.31 18 68 0.98981 13.4 +"6469" "medium" 0 0.24 0.33 8 81 0.99626 9.8 +"510" "good" 1 0.29 0.75 23 43 0.9986 11.4 +"6107" "medium" 0 0.305 0.13 17 73 0.99 12.33333333 +"1178" "good" 1 0.66 0 6 11 0.99318 12.7 +"4973" "good" 0 0.28 0.24 49 121 0.98882 13.2 +"4120" "medium" 0 0.41 0.23 28 174 0.99898 9.7 +"5295" "medium" 0 0.15 0.4 61 146 0.99112 11 +"2076" "good" 0 0.28 0.36 42 105 0.9893 12.4 +"3989" "good" 0 0.46 0.26 28 83 0.99114 12 +"4518" "medium" 0 0.28 0.28 15 65 0.9902 11.2 +"3184" "medium" 0 0.25 0.74 52 209 0.9956 9.2 +"1198" "medium" 1 0.57 0.21 4 9 0.99458 9.8 +"1847" "good" 0 0.2 0.27 12 77 0.9905 10.9 +"2285" "medium" 0 0.36 0.26 54 201 0.9976 9 +"6022" "medium" 0 0.22 0.28 24 125 0.9917 10.5 +"6087" "medium" 0 0.13 0.28 32 87 0.99175 11.2 +"113" "medium" 1 0.6 0.1 14 111 0.9964 9.8 +"5667" "medium" 0 0.38 0.28 22 166 0.99506 10.6 +"3317" "medium" 0 0.27 0.32 19 142 0.9921 9.9 +"933" "medium" 1 0.4 0.29 29 66 0.9971 9.5 +"4658" "medium" 0 0.25 0.38 54 208 0.99572 9.1 +"1923" "medium" 0 0.28 0.44 35 137 0.9946 10.4 +"4026" "medium" 0 0.22 0.26 32 172 0.99194 11.2 +"2244" "medium" 0 0.24 0.29 32 166 0.9968 9.5 +"226" "medium" 1 0.43 0.25 29 63 0.99615 10.5 +"1254" "medium" 1 0.66 0 6 13 0.99569 9.5 +"747" "medium" 1 0.34 0.38 12 57 0.9978 9 +"2809" "medium" 0 0.23 0.46 30 125 0.9907 12.5 +"1137" "medium" 1 0.52 0.45 6 13 0.99774 11.4 +"2067" "medium" 0 0.32 0.21 15 68 0.9932 9.4 +"2455" "good" 0 0.2 0.35 30 116 0.9949 10.3 +"6163" "good" 0 0.26 0.27 27 119 0.9947 10.7 +"3977" "medium" 0 0.22 0.29 24 90 0.99556 9.8 +"50" "medium" 1 0.31 0.37 12 96 0.9954 9.2 +"3418" "medium" 0 0.26 0.29 27 96 0.9896 12.3 +"5477" "medium" 0 0.28 0.31 20 98 0.99069 11.4 +"2389" "medium" 0 0.3 0.27 31 119 0.99815 9.3 +"6243" "medium" 0 0.21 0.35 47 197 0.99392 10.1 +"65" "medium" 1 0.725 0.05 4 11 0.9962 10.9 +"3678" "medium" 0 0.17 0.3 25 119 0.9931 10.5 +"3117" "medium" 0 0.24 0.49 52 163 0.9952 10.6 +"4327" "medium" 0 0.17 0.31 34 121 0.99092 10.5 +"4206" "medium" 0 0.2 0.36 22 157 0.9938 10.6 +"1169" "medium" 1 0.34 0.27 8 44 0.99384 12 +"4188" "good" 0 0.18 0.3 19 171 0.99808 9 +"5392" "medium" 0 0.25 0.3 53 133 0.99524 10.4 +"1477" "medium" 1 0.5 0.5 48 82 1.00242 8.8 +"3063" "medium" 0 0.19 0.49 11 137 0.9918 11 +"6342" "medium" 0 0.27 0.32 36 133 0.99215 10.8 +"4634" "medium" 0 0.25 0.47 36 156 0.99604 9.4 +"3862" "medium" 0 0.25 0.31 11 61 0.99189 11.5 +"1497" "medium" 1 0.54 0.26 23 147 0.99636 9.7 +"193" "medium" 1 0.63 0.12 16 126 0.9969 9.5 +"2273" "medium" 0 0.31 0.3 18 130 0.9928 10.6 +"3074" "bad" 0 0.25 0.24 13 85 0.9942 9.5 +"583" "medium" 1 0.49 0.49 5 15 1 9.2 +"6169" "medium" 0 0.2 0.32 17 126 0.9936 9.4 +"3865" "medium" 0 0.3 0.21 49 159 0.99827 9 +"5812" "bad" 0 0.31 0.37 13 164 0.99602 8.8 +"2658" "medium" 0 0.21 0.34 26 111 0.9931 10.7 +"4152" "medium" 0 0.36 0.52 8 110 0.9966 9.4 +"753" "medium" 1 0.54 0.13 24 66 0.99785 9.4 +"4000" "bad" 0 0.19 0.42 16 104 0.99517 10 +"5504" "good" 0 0.455 0.18 33 106 0.98746 14 +"1861" "medium" 0 0.29 0.4 36 156 0.9996 8.9 +"6068" "medium" 0 0.21 0.24 31 95 0.99036 11.3 +"4950" "medium" 0 0.22 0.28 41 132 0.9935 11.3 +"4654" "medium" 0 0.15 0.31 7 73 0.99152 11.9 +"1511" "medium" 1 0.36 0.21 26 48 0.99661 9.7 +"1001" "good" 1 0.43 0.3 6 12 0.99495 11.5 +"2386" "medium" 0 0.34 0.28 31 117 0.99815 9.2 +"1242" "medium" 1 0.37 0.39 28 65 0.99729 9.8 +"2045" "bad" 0 0.32 0.32 16 66 0.9937 11.5 +"2743" "medium" 0 0.24 0.3 27 131 0.9933 10.5 +"1413" "medium" 1 0.24 0.34 8 22 0.9974 10.9 +"2060" "medium" 0 0.21 0.27 26 111 0.9956 9.5 +"5915" "good" 0 0.41 0.24 33 115 0.9901 12.89333333 +"469" "medium" 1 0.36 0.69 6 21 1 9.2 +"5454" "medium" 0 0.12 0.27 40 110 0.99226 12.1 +"4119" "medium" 0 0.24 0.55 67 216 0.99596 9.2 +"397" "medium" 1 0.735 0.02 68 124 0.9994 9.9 +"1278" "medium" 1 0.69 0 3 10 0.99636 9.7 +"2307" "medium" 0 0.18 0.45 57 166 0.9943 11.2 +"1279" "medium" 1 0.715 0.22 13 81 0.99688 9.5 +"4528" "good" 0 0.31 0.31 45 140 0.99216 12 +"761" "medium" 1 0.58 0.25 9 104 0.99779 9.7 +"3747" "medium" 0 0.29 0.2 20 142 0.9962 10.6 +"199" "good" 1 0.835 0.08 13 93 0.9924 13 +"802" "medium" 1 0.55 0.09 8 17 0.99735 10 +"4150" "medium" 0 0.33 0.14 27 128 0.99475 9.4 +"271" "medium" 1 0.545 0.06 27 61 0.9965 10.7 +"5070" "good" 0 0.24 0.3 105 179 0.99189 11.3 +"6303" "good" 0 0.12 0.28 36 83 0.99074 10.9 +"146" "medium" 1 0.67 0.55 32 141 0.9968 9.4 +"3768" "good" 0 0.19 0.3 48.5 229 0.9986 9.1 +"4665" "medium" 0 0.15 0.38 54 120 0.9975 9.8 +"2703" "medium" 0 0.29 0.39 6 117 0.9938 10.7 +"5349" "medium" 0 0.28 0.29 40 143 0.99374 11 +"1693" "good" 0 0.21 0.33 48 136 0.9899 12.6 +"1640" "medium" 0 0.23 0.39 63 158 0.9937 9.4 +"5547" "good" 0 0.3 0.32 41 142 0.98952 12.7 +"354" "medium" 1 0.53 0.79 23 77 1.0018 13 +"4161" "medium" 0 0.28 0.22 36 131 0.99696 9.6 +"3230" "medium" 0 0.25 0.24 6 121 0.993 11.4 +"1319" "medium" 1 0.63 0.27 17 91 0.99616 9.8 +"3832" "medium" 0 0.2 0.31 16 89 0.99416 9.5 +"2894" "bad" 0 0.41 0.22 10 102 0.993 11.6 +"3282" "good" 0 0.25 0.28 55 205 0.9986 9 +"5782" "medium" 0 0.38 0.56 15 170 0.99605 9.9 +"570" "medium" 1 0.36 0.24 19 42 0.9946 11.7 +"5111" "good" 0 0.19 0.28 22 90 0.99038 11.7 +"6433" "medium" 0 0.33 0.28 33 97 0.99126 10.9 +"229" "medium" 1 0.43 0.25 29 63 0.99615 10.5 +"5419" "medium" 0 0.35 0.26 36 120 0.99188 11.5 +"2174" "good" 0 0.2 0.33 39 138 0.991 11.7 +"1749" "medium" 0 0.25 0.3 23 116 0.994 9.4 +"4782" "medium" 0 0.12 0.33 23 131 0.99164 9.8 +"5163" "medium" 0 0.48 0.12 23 86 0.99398 9 +"6059" "medium" 0 0.22 0.18 28 120 0.99403 9.9 +"4836" "medium" 0 0.22 0.39 44 141 0.99123 12.5 +"5635" "medium" 0 0.2 0.22 53 172 0.99404 11 +"6054" "medium" 0 0.18 0.26 17 149 0.9984 9.4 +"6437" "medium" 0 0.28 0.38 54 216 0.99154 13.1 +"3347" "medium" 0 0.3 0.36 33 169 0.9982 9.3 +"684" "medium" 1 0.78 0.23 5 15 0.997 11.3 +"48" "medium" 1 0.29 0.52 12 37 0.9969 9.5 +"2117" "medium" 0 0.15 0.42 49 154 0.992 10.4 +"1224" "medium" 1 0.36 0.47 9 23 0.99638 12 +"96" "medium" 1 0.6 0.17 17 106 0.9932 12.9 +"4131" "bad" 0 0.54 0.27 8 178 0.99502 9.4 +"2726" "good" 0 0.115 0.29 73 166 0.989 12.9 +"2511" "medium" 0 0.33 0.19 22 143 0.99425 9.9 +"6262" "medium" 0 0.17 0.36 44 111 0.99272 12.4 +"3086" "medium" 0 0.15 0.49 17 51 0.9932 9.4 +"1253" "medium" 1 0.72 0 6 14 0.99627 9.8 +"4549" "medium" 0 0.28 0.52 30 139 0.99494 9 +"723" "medium" 1 0.42 0.08 15 48 0.9968 10 +"5287" "medium" 0 0.16 0.27 39 98 0.99402 10.8 +"3739" "medium" 0 0.33 0.64 12 105 0.9972 9.2 +"1658" "medium" 0 0.38 0.15 25 78 0.9931 10.2 +"76" "medium" 1 0.41 0.64 9 42 0.9986 10.5 +"1604" "medium" 0 0.23 0.32 47 186 0.9956 9.9 +"149" "medium" 1 0.49 0.1 12 30 0.9959 10.2 +"554" "medium" 1 1.04 0.24 32 96 0.9934 11.5 +"349" "medium" 1 0.56 0.31 15 46 0.9979 10 +"639" "good" 1 0.915 0.12 7 23 0.9964 10.2 +"416" "medium" 1 0.725 0.24 31 134 1.0014 9.3 +"2966" "medium" 0 0.14 0.41 22 95 0.9914 10.9 +"378" "good" 1 0.27 0.53 6 18 0.9962 12 +"475" "medium" 1 0.28 0.51 10 24 0.9982 9.4 +"1212" "medium" 1 0.44 0.15 22 53 0.9957 9.3 +"5670" "medium" 0 0.28 0.27 41 162 0.99498 9.9 +"15" "medium" 1 0.62 0.18 52 145 0.9986 9.2 +"4986" "good" 0 0.28 0.27 56 140 0.99042 12.5 +"324" "medium" 1 0.59 0.42 35 73 0.999 9.5 +"3657" "good" 0 0.31 0.31 20 151 0.9926 12 +"5571" "medium" 0 0.17 0.3 33 125 0.99152 10.4 +"881" "medium" 1 0.56 0.18 10 21 0.99576 9.9 +"322" "medium" 1 0.61 0.26 25 87 0.99975 9.7 +"1998" "medium" 0 0.26 0.27 52 168 0.9993 9.4 +"3795" "medium" 0 0.25 0.18 13 137 0.9935 9.5 +"5064" "medium" 0 0.29 0.41 52 171 0.99537 9.6 +"232" "medium" 1 0.38 0.06 12 49 0.99625 9.9 +"5447" "medium" 0 0.32 0.23 36 176 0.9986 9.1 +"2232" "medium" 0 0.24 0.33 16 131 0.9936 10.7 +"5307" "medium" 0 0.34 0.43 29 114 0.99014 12.6 +"3578" "medium" 0 0.33 0.26 23 103 0.9932 10.5 +"4645" "medium" 0 0.12 0.26 21 99 0.99324 9.9 +"6277" "good" 0 0.28 0.52 37 104 0.99161 11.8 +"6483" "medium" 0 0.47 0.17 60 148 0.98964 11.5 +"1028" "medium" 1 0.795 0 28 52 0.99378 11.6 +"5649" "medium" 0 0.16 0.36 32 98 0.99058 11.3 +"1493" "medium" 1 0.65 0.06 6 18 0.99348 11.95 +"52" "medium" 1 0.52 0.04 8 15 0.9956 9.4 +"4329" "good" 0 0.29 0.31 24 79 0.99053 11.4 +"5765" "good" 0 0.22 0.35 23 83 0.99019 12 +"4927" "good" 0 0.17 0.36 11 70 0.99202 10.4 +"4871" "good" 0 0.32 0.34 27 91 0.99184 12 +"5099" "good" 0 0.33 0.3 30 124 0.98922 13.1 +"419" "medium" 1 0.38 0.51 7 20 0.9996 10.4 +"2019" "medium" 0 0.31 0.28 33 137 0.9929 10.5 +"3490" "medium" 0 0.3 0.42 45 213 0.9991 9.2 +"5412" "medium" 0 0.21 0.39 21 138 0.99176 10.9 +"4310" "medium" 0 0.25 0.34 66 184 0.99976 8.9 +"2156" "medium" 0 0.35 0.71 22 160 0.9982 9.4 +"4040" "medium" 0 0.46 0.26 49 159 0.99434 10 +"4791" "medium" 0 0.24 0.44 49 146 0.9911 11.6 +"6205" "medium" 0 0.29 0.32 38 93 0.9906 12 +"1295" "medium" 1 0.635 0.1 25 60 0.99638 10.9 +"4177" "medium" 0 0.25 0.36 63 206 0.99553 9.6 +"2216" "good" 0 0.32 0.33 18 101 0.9912 11.7 +"6355" "medium" 0 0.29 0.73 21 92 0.99 12.4 +"4493" "good" 0 0.16 0.34 85 153 0.9909 12 +"4428" "good" 0 0.14 0.31 53 138 0.99084 11.5 +"3089" "medium" 0 0.16 0.74 52 187 0.9998 9.3 +"2142" "medium" 0 0.35 0.35 14 167 0.992 9.9 +"4354" "medium" 0 0.17 0.28 5 28 0.98985 10.6 +"5650" "good" 0 0.16 0.27 25 135 0.9984 8.7 +"2801" "good" 0 0.17 0.37 26 75 0.9922 10.8 +"2977" "medium" 0 0.28 0.41 10 136 0.993 11.4 +"919" "medium" 1 0.36 0.32 32 79 0.9964 11 +"1951" "good" 0 0.33 0.4 32 138 0.992 11.9 +"3641" "medium" 0 0.14 0.27 22 104 0.9949 9 +"5697" "medium" 0 0.14 0.28 21 82 0.99425 10 +"6452" "medium" 0 0.23 0.38 12 113 0.99176 11.4 +"3271" "good" 0 0.35 0.3 27 87 0.9936 11.4 +"4515" "medium" 0 0.14 0.38 22 81 0.99043 11.4 +"3665" "medium" 0 0.27 0.28 21 127 0.9934 9.9 +"4167" "medium" 0 0.24 0.28 39 132 0.99182 11.4 +"6008" "medium" 0 0.29 0.16 48 197 0.99512 9.4 +"6094" "medium" 0 0.24 0.29 34 84 0.9902 11.45 +"605" "medium" 1 0.58 0.13 14 63 0.9984 9.1 +"5608" "medium" 0 0.25 0.48 25 94 0.99782 9.2 +"2942" "medium" 0 0.58 0.27 37 116 0.9959 10.8 +"2360" "medium" 0 0.18 0.38 44 176 0.9958 9.8 +"4579" "good" 0 0.36 0.26 39 123 0.99119 12.2 +"4805" "good" 0 0.45 0.36 28 156 0.991 12.4 +"239" "medium" 1 0.63 0 14 38 0.99675 9 +"612" "medium" 1 0.38 0.55 5 16 1.0006 9.4 +"4937" "medium" 0 0.38 0.29 52 189 0.99784 9.5 +"3692" "medium" 0 0.76 0.03 27 93 0.9932 9.2 +"4287" "medium" 0 0.24 0.38 56 187 0.99577 9.2 +"2203" "medium" 0 0.475 0.06 9 131 0.9904 10.8 +"1547" "medium" 1 0.57 0.02 17 26 0.99575 10.2 +"5444" "medium" 0 0.37 0.25 24 84 0.9909 11.7 +"872" "medium" 1 0.56 0.03 36 46 0.99522 10.6 +"4513" "medium" 0 0.18 0.3 49 199 0.99413 9.3 +"6280" "bad" 0 0.63 0.04 25 133 0.99271 10.2 +"5050" "good" 0 0.21 0.29 43 106 0.99112 11.5 +"2226" "bad" 0 0.56 0.12 22 177 0.9983 9.1 +"5135" "medium" 0 0.28 0.44 49 179 0.99528 9.2 +"5278" "medium" 0 0.23 0.25 19 111 1.00044 8.7 +"2570" "good" 0 0.42 0.01 25 102 0.9894 12.3 +"4509" "medium" 0 0.18 0.3 23 73 0.99032 11.3 +"2732" "medium" 0 0.39 0.31 28 162 0.9988 9.1 +"1820" "medium" 0 0.27 0.36 45 164 0.9939 11 +"5495" "medium" 0 0.25 0.33 17 76 0.99021 12.3 +"1882" "bad" 0 0.44 0.37 46 201 0.9938 10.5 +"789" "medium" 1 0.56 0.24 19 58 0.9991 10.1 +"4290" "medium" 0 0.3 0.25 26 124 0.99428 9.3 +"1249" "medium" 1 0.41 0.33 22 36 0.9949 11.1 +"3306" "medium" 0 0.24 0.22 38 157 0.9934 9.9 +"5468" "medium" 0 0.22 0.25 112 177 0.9961 9.4 +"2342" "medium" 0 0.2 0.37 26 136 0.9932 10.2 +"2217" "medium" 0 0.26 0.27 52 195 0.9928 10.9 +"1252" "medium" 1 0.58 0.14 27 60 0.9963 9.8 +"1828" "medium" 0 0.17 0.32 41 200 0.9938 9.7 +"832" "medium" 1 0.61 0.08 16 24 0.99376 11.1 +"4529" "medium" 0 0.22 0.29 39 118 0.99834 9.1 +"2750" "medium" 0 0.32 0.17 69 219 0.9959 8.9 +"5511" "medium" 0 0.23 0.82 70 109 0.99304 9.2 +"4111" "medium" 0 0.3 0.49 68 215 0.99656 9.4 +"2200" "medium" 0 0.3 0.35 36 160 0.9937 9.4 +"695" "medium" 1 0.47 0.31 24 125 0.9984 9.4 +"611" "medium" 1 0.24 0.54 25 57 0.9983 9.2 +"1916" "medium" 0 0.25 0.34 34 134 0.9927 10.6 +"1646" "bad" 0 0.45 0.26 63 206 0.994 9.8 +"1774" "medium" 0 0.27 0.31 33 173 0.999 10.2 +"1977" "good" 0 0.2 0.44 21 98 0.9924 10 +"5298" "medium" 0 0.22 0.34 32 96 0.98961 11.6 +"1007" "good" 1 0.29 0.33 13 27 0.99516 11.7 +"3956" "medium" 0 0.34 0.32 29 130 0.99354 10.4 +"5659" "medium" 0 0.16 0.36 32 98 0.99058 11.3 +"6" "medium" 1 0.66 0 13 40 0.9978 9.4 +"1365" "medium" 1 0.605 0.02 10 31 0.995 11.8 +"619" "medium" 1 0.46 0.5 4 17 1.0006 10.2 +"3131" "good" 0 0.3 0.49 26 174 0.9943 11.2 +"2941" "medium" 0 0.54 0.23 13 151 0.9931 10.4 +"2027" "medium" 0 0.29 0.5 48 194 0.9974 9.4 +"3838" "medium" 0 0.15 0.29 39 151 0.99471 10.6 +"6039" "medium" 0 0.47 0.16 14 125 0.99428 9.8 +"5624" "medium" 0 0.28 0.27 50 147 0.99126 11.6 +"5323" "good" 0 0.265 0.28 46 150 0.99299 10.8 +"2730" "medium" 0 0.2 0.28 36 159 0.9936 9.1 +"1783" "medium" 0 0.27 0.4 64 227 0.9979 9.6 +"1579" "medium" 1 0.67 0.15 13 20 0.9954 11.3 +"3397" "good" 0 0.25 0.27 37 128 0.9936 11.3 +"3685" "medium" 0 0.17 0.32 47 150 0.9948 9.6 +"5180" "medium" 0 0.3 0.21 33 143 0.99244 11.1 +"1741" "medium" 0 0.37 0.67 49 155 0.9975 8.7 +"5219" "medium" 0 0.45 0.28 27 122 1.00295 10.6 +"5103" "good" 0 0.33 0.31 21 93 0.9896 13.4 +"997" "good" 1 0.66 0 3 11 0.99378 12.8 +"1451" "good" 1 0.37 0.32 15 28 0.9947 11.3 +"2102" "medium" 0 0.3 0.3 8 210 0.9937 9.9 +"309" "medium" 1 0.43 0.44 5 12 0.9994 9.5 +"3508" "good" 0 0.36 0.36 26 98 0.9914 12.5 +"4429" "medium" 0 0.26 0.32 31 170 0.99644 11.2 +"2320" "medium" 0 0.29 0.44 62 178 0.99685 8.9 +"4943" "good" 0 0.36 0.28 51 189 0.99782 9.5 +"1236" "bad" 1 0.33 0.32 6 113 0.99572 11.5 +"5285" "medium" 0 0.15 0.41 79.5 183 0.99742 10.2 +"1622" "good" 0 0.26 0.42 41 122 0.993 10.5 +"2865" "good" 0 0.31 0.34 36 174 0.9963 11.1 +"254" "medium" 1 0.775 0.42 8 86 0.9959 9.5 +"581" "medium" 1 0.5 0.49 5 14 1.0002 9.6 +"4635" "good" 0 0.24 0.33 31 85 0.99014 11.3 +"198" "medium" 1 0.3 0.6 12 27 0.9981 10.1 +"5257" "good" 0 0.15 0.47 49 128 0.99456 10.5 +"5006" "medium" 0 0.32 0.33 25 95 0.99268 11.1 +"2363" "medium" 0 0.44 0.04 38 128 0.9985 10.2 +"922" "medium" 1 0.36 0.32 32 79 0.9964 11 +"399" "medium" 1 0.59 0.59 13 49 0.9988 11 +"3948" "medium" 0 0.26 0.31 14 141 0.99077 12.2 +"2198" "good" 0 0.27 0.29 31 115 0.9949 10.5 +"5393" "medium" 0 0.32 0.26 63 170 0.9961 9.9 +"4609" "medium" 0 0.2 0.5 50 221 0.99941 8.8 +"5299" "medium" 0 0.3 0.37 27 177 0.99438 9.8 +"2598" "medium" 0 0.24 0.3 43 184 0.9997 9.2 +"1214" "medium" 1 0.38 0.42 5 13 0.99659 10.5 +"5875" "medium" 0 0.22 0.2 41 113 0.99862 8.9 +"3626" "medium" 0 0.26 0.4 5 60 0.9925 10.1 +"4087" "medium" 0 0.27 0.27 25 122 0.99088 11.9 +"783" "medium" 1 0.82 0.05 26 96 0.99814 10 +"1482" "medium" 1 0.28 0.6 10 22 0.99828 10.6 +"290" "medium" 1 0.42 0.53 33 98 1.001 9.2 +"5956" "medium" 0 0.29 0.29 35 178 0.99313 10.53333333 +"3011" "medium" 0 0.2 0.34 32 83 0.9928 11.5 +"2293" "medium" 0 0.37 0.14 34 185 0.9944 9.8 +"6176" "medium" 0 0.3 0.29 23 56 0.9904 11.3 +"3871" "medium" 0 0.25 0.26 50 156 0.99784 9.9 +"5478" "medium" 0 0.35 0.31 58 170 0.99692 9.4 +"1123" "medium" 1 0.47 0 27 33 0.9922 12.3 +"319" "good" 1 0.66 0.39 21 59 0.9989 11.5 +"2469" "medium" 0 0.24 0.29 37 97 0.9926 10.1 +"4151" "medium" 0 0.26 0.42 62 209 0.99544 9.5 +"2395" "medium" 0 0.31 0.26 37 157 0.99625 9 +"4073" "medium" 0 0.29 0.21 20 142 0.99658 10.1 +"2072" "medium" 0 0.24 0.29 19 86 0.99 12.5 +"1762" "medium" 0 0.36 0.3 14 85 0.9932 10.6 +"1775" "medium" 0 0.23 0.4 50 151 0.9927 11.4 +"3325" "medium" 0 0.17 0.22 55 152 0.9952 9.3 +"1560" "medium" 1 0.6 0.26 31 131 0.99622 9.9 +"3769" "good" 0 0.19 0.3 48.5 229 0.9986 9.1 +"5755" "medium" 0 0.3 0.47 50 187 0.9927 9.5 +"4011" "medium" 0 0.27 0.25 50 208 1.00051 9.2 +"6389" "medium" 0 0.62 0.33 24 118 0.98758 13.55 +"4958" "medium" 0 0.36 0.28 29 81 0.99151 12.5 +"3523" "medium" 0 0.37 0.27 10 59 0.9923 10.4 +"1452" "good" 1 0.32 0.44 8 17 0.99732 11 +"4576" "medium" 0 0.32 0.39 34 124 0.99286 12.1 +"5182" "medium" 0 0.32 0.32 12 76 0.98993 12.3 +"1179" "medium" 1 0.915 0 17 78 0.99346 11.4 +"1059" "good" 1 0.53 0.57 30 52 0.9971 11.6 +"6467" "medium" 0 0.6 0.34 3 60 0.98854 13 +"369" "medium" 1 0.34 0.52 15 75 0.9998 9.4 +"5795" "good" 0 0.45 0.24 24 87 0.98862 13.4 +"1836" "medium" 0 0.23 0.38 55 194 0.9979 9 +"1684" "medium" 0 0.43 0.61 54 155 0.9974 8.7 +"1737" "medium" 0 0.37 0.67 49 155 0.9975 8.7 +"988" "medium" 1 0.36 0.3 35 70 0.99693 9.4 +"5853" "bad" 0 0.47 0.1 11 74 0.99082 11.2 +"1201" "medium" 1 0.57 0.21 4 9 0.99458 9.8 +"866" "medium" 1 0.635 0.07 16 86 0.99748 9.7 +"110" "medium" 1 0.785 0.52 37 153 0.9969 9.3 +"775" "medium" 1 0.4 0.3 2 45 0.99727 9.5 +"5303" "medium" 0 0.24 0.31 26 180 0.99884 9.1 +"1938" "medium" 0 0.26 0.4 12 139 0.9945 10.4 +"1283" "medium" 1 0.765 0 9 22 0.99619 10.9 +"5636" "medium" 0 0.33 0.22 40 177 0.99287 9.9 +"1474" "medium" 1 0.6 0.08 14 45 0.99336 11 +"3236" "medium" 0 0.49 0.49 29 149 0.9952 10 +"2262" "bad" 0 0.57 0.1 23 188 0.9972 9.2 +"2881" "good" 0 0.27 0.34 26 168 0.9911 12.1 +"892" "medium" 1 0.66 0.03 16 86 0.99743 9.7 +"2032" "good" 0 0.155 0.34 73.5 214 0.9934 9.9 +"129" "good" 1 0.59 0.16 3 16 0.9962 10.5 +"6375" "medium" 0 0.27 0.4 42 124 0.99204 10.1 +"1044" "good" 1 0.39 0.41 18 39 0.99859 10.9 +"540" "medium" 1 0.5 0.74 5 17 0.9996 11.2 +"3219" "good" 0 0.22 0.49 31 128 0.9928 11.3 +"3183" "medium" 0 0.18 0.74 54 168 0.9978 10.1 +"1895" "medium" 0 0.33 0.27 34 175 0.9934 9.4 +"2631" "medium" 0 0.34 0.29 45 232 0.9955 10 +"1354" "medium" 1 0.645 0.03 14 57 0.9969 10.3 +"655" "medium" 1 0.47 0.47 7 29 0.9979 9.5 +"4963" "medium" 0 0.22 0.28 47 90 0.98862 12.6 +"3040" "medium" 0 0.26 0.74 56 162 0.998 8.8 +"4729" "medium" 0 0.21 0.38 37 122 0.98972 12 +"6286" "bad" 0 0.63 0.04 25 133 0.99271 10.2 +"5823" "bad" 0 0.43 0.11 6 51 0.99076 11.2 +"4224" "medium" 0 0.21 0.37 20 80 0.99076 12 +"729" "medium" 1 0.57 0.02 4 11 0.997 9.5 +"719" "medium" 1 0.56 0.04 10 22 0.9976 9.6 +"5217" "medium" 0 0.29 0.33 20 117 0.99048 11.4 +"3569" "good" 0 0.41 0.3 49 164 0.9927 11.7 +"1447" "medium" 1 0.63 0.02 18 30 0.99712 9.8 +"1394" "medium" 1 0.52 0.25 19 59 0.99612 10.2 +"4794" "medium" 0 0.16 0.32 7 89 0.99111 11 +"1664" "medium" 0 0.24 0.27 31 122 0.9927 10.3 +"501" "medium" 1 0.52 0.25 14 38 0.9984 9 +"3668" "medium" 0 0.32 0.18 26 104 0.9906 11 +"3098" "medium" 0 0.27 0.49 23 86 0.9914 12.5 +"1080" "good" 1 0.3 0.68 37.5 278 0.99316 12.3 +"2266" "medium" 0 0.22 0.37 38 195 0.9908 12.5 +"186" "medium" 1 0.31 0.57 26 85 0.9971 9.7 +"5841" "medium" 0 0.27 0.29 62 140 0.99237 11.1 +"3375" "medium" 0 0.49 1 28 135 0.9973 12 +"1111" "medium" 1 0.53 0 6 14 0.99593 10 +"430" "medium" 1 0.84 0.63 13 35 0.9997 10.4 +"677" "medium" 1 0.4 0.41 7 17 0.9984 9.3 +"3973" "bad" 0 0.48 0.37 5 57 0.99256 10.4 +"6471" "medium" 0 0.2 0.4 20 98 0.9897 12.05 +"1021" "medium" 1 0.36 0.66 3 8 0.99642 11.9 +"3674" "medium" 0 0.22 0.28 51 180 0.9952 9.5 +"6203" "medium" 0 0.33 0.18 40 124 0.99114 11 +"2762" "good" 0 0.25 0.41 29 151 0.9946 10.2 +"572" "medium" 1 0.36 0.24 19 42 0.9946 11.7 +"5960" "medium" 0 0.28 0.35 31 148 0.99178 10.7 +"970" "medium" 1 0.56 0.09 7 22 0.99669 10.2 +"460" "bad" 1 0.58 0.66 10 47 1.0008 9 +"4630" "good" 0 0.47 0.29 22 142 0.99518 12 +"5655" "medium" 0 0.3 0.27 22 97 0.99314 11.7 +"5365" "medium" 0 0.4 0.17 59 186 0.99754 9.4 +"2020" "good" 0 0.22 0.31 41 136 0.9898 12.7 +"3275" "medium" 0 0.27 0.32 65 224 0.9961 8.9 +"5150" "medium" 0 0.14 0.32 48 116 0.99218 10 +"3265" "good" 0 0.13 0.37 48 114 0.9911 11.5 +"3328" "medium" 0 0.3 0.24 35 116 0.9953 9.4 +"3925" "medium" 0 0.35 0.17 7 119 0.99297 9.7 +"1265" "medium" 1 0.37 0.32 26 51 0.99456 11.8 +"768" "medium" 1 0.6 0.32 13 98 0.99938 9.5 +"670" "medium" 1 0.34 0.45 6 15 0.9988 9.2 +"1156" "medium" 1 0.6 0.25 9 38 0.99616 9.8 +"2275" "medium" 0 0.28 0.25 44 201 0.9955 9.1 +"974" "medium" 1 0.34 0.44 6 12 0.99605 10.7 diff --git a/INSA/cle ssh.txt b/INSA/cle ssh.txt new file mode 100644 index 0000000..9c79944 --- /dev/null +++ b/INSA/cle ssh.txt @@ -0,0 +1,17 @@ +Generating publicprivate ed25519 key pair. +Your identification has been saved in CUsersPC.sshid_ed25519. +Your public key has been saved in CUsersPC.sshid_ed25519.pub. +The key fingerprint is +SHA25673MajauxjnuZNpAn2N5z1mVnlOIPS7hIhMTfytcBQWs pc@Kdo-de-Nowe-Ju +The key's randomart image is ++--[ED25519 256]--+ + . .o. + o .. + . o .E. . + . o.. o .. + o .S . + o. + . = .= = =o o + . =oo.+o+o + ..O=++o. . + o=+++ ++----[SHA256]-----+ \ No newline at end of file diff --git a/INSA/projet-clicodrome/bdd/arbre.json b/INSA/projet-clicodrome/bdd/arbre.json index 237f36e..43176bc 100644 --- a/INSA/projet-clicodrome/bdd/arbre.json +++ b/INSA/projet-clicodrome/bdd/arbre.json @@ -84,7 +84,7 @@ "boost": 40, "cout": 1000000, "borne": 500000, - "evolution":4, + "evolution":5, "css_id": "t6.css", "narration": "XHTML 4.01 améliore encore la norme HTML, avec une plus grande rigueur et des règles de codage strictes. Vous commencez à créer des pages web plus robustes et accessibles, prêtes à supporter un contenu riche et diversifié. Le web devient plus stable et professionnel." }, @@ -99,7 +99,7 @@ "boost": 50, "cout": 10000000, "borne": 5000000, - "evolution":5, + "evolution":6, "css_id": "t7.css", "narration": "Avec XHTML 1.0, vous atteignez un nouveau niveau de qualité. Vous écrivez un code plus propre et plus cohérent, et l'expérience utilisateur s'en trouve améliorée. Les pages se chargent plus rapidement et sont plus fiables. La perfection est en marche !" }, @@ -114,7 +114,7 @@ "boost": 60, "cout": 1000000000, "borne": 50000000, - "evolution":6, + "evolution":7, "css_id": "t8.css", "narration": "L'HTML 5 débarque ! C'est l'arrivée des vidéos et de l'audio sur le web. Grâce à la balise `