Université de Poitiers - M1 STDV

Modèles linéaires et généralisés


Compte-rendu réalisé par : FOUGEROUX Aurélien

A rendre au plus tard le : Dimanche 3 mai à 23h59

Exercice 1 : Estimation du poids de Lépidoptères


1. Chargement des données et statistiques descriptives

pap<-read.csv("papillons.csv") 

dim(pap)
## [1] 2645   16
#View(pap)

summary(pap)
##       X                  DBw                 Hl              Hw        
##  Length:2645        Min.   :   0.042   Min.   :0.050   Min.   : 0.270  
##  Class :character   1st Qu.:   5.770   1st Qu.:0.580   1st Qu.: 1.540  
##  Mode  :character   Median :  21.577   Median :0.910   Median : 2.420  
##                     Mean   :  73.296   Mean   :1.029   Mean   : 2.619  
##                     3rd Qu.:  67.110   3rd Qu.:1.330   3rd Qu.: 3.400  
##                     Max.   :3278.775   Max.   :6.010   Max.   :10.110  
##        Tl               Tw               Al               Aw        
##  Min.   : 0.390   Min.   : 0.370   Min.   : 0.680   Min.   : 0.160  
##  1st Qu.: 2.790   1st Qu.: 1.870   1st Qu.: 5.030   1st Qu.: 1.090  
##  Median : 4.680   Median : 2.870   Median : 7.550   Median : 1.790  
##  Mean   : 5.183   Mean   : 3.357   Mean   : 8.824   Mean   : 2.321  
##  3rd Qu.: 6.740   3rd Qu.: 4.350   3rd Qu.:11.190   3rd Qu.: 3.050  
##  Max.   :23.230   Max.   :14.450   Max.   :43.240   Max.   :11.710  
##       FWl              FWw              HWl              HWw        
##  Min.   :  1.89   Min.   : 0.420   Min.   :  1.57   Min.   : 0.390  
##  1st Qu.: 11.24   1st Qu.: 4.240   1st Qu.:  8.73   1st Qu.: 5.110  
##  Median : 16.69   Median : 7.530   Median : 12.53   Median : 8.450  
##  Mean   : 20.06   Mean   : 9.037   Mean   : 15.31   Mean   : 9.936  
##  3rd Qu.: 24.45   3rd Qu.:11.460   3rd Qu.: 18.33   3rd Qu.:12.430  
##  Max.   :114.12   Max.   :55.840   Max.   :153.81   Max.   :53.660  
##       Wsp1             Wsp2              Bl           FAMILY         
##  Min.   :  4.14   Min.   :  4.16   Min.   : 1.28   Length:2645       
##  1st Qu.: 22.70   1st Qu.: 24.74   1st Qu.: 8.74   Class :character  
##  Median : 32.66   Median : 36.61   Median :13.30   Mode  :character  
##  Mean   : 38.56   Mean   : 43.48   Mean   :15.04                     
##  3rd Qu.: 47.15   3rd Qu.: 53.57   3rd Qu.:19.17                     
##  Max.   :214.60   Max.   :239.39   Max.   :68.15
length(unique(pap$FAMILY))
## [1] 100
length(unique(pap$X))
## [1] 2645

La base de donnée contient 2645 individus et 16 variables.

Variables qualitatives : X , FAMILY. La variable X donne un nom unique à chaque papillon et la variable FAMILY classe le papillon dans la famille à laquelle il appartient parmis les 100 familles apparentes dans la base.

2. Visualisation (DBw vs FW1) et transformations logarithmiques

DBw<-pap$DBw
FWl<-pap$FWl

plot(FWl,DBw,las=1)

log10DBw<-log10(DBw)
log10FWl<-log10(FWl)

plot(log10FWl,log10DBw)

plot(FWl,DBw,log="xy")

Le graphe en fonction des logarithme base 10 est le même que celui de l’article ,la seule chose qui change sont les echelles qui sont en puissance de 10(en lisant 3 sur l’axe y on lit en réalité 10^3 mg).

3. Transformation des variables quantitatives (\(Log_{10}\))

pap_Q_log10<-log10(pap[,2:15])

pap2<-cbind(X=pap$X,pap_Q_log10,FAMILY=pap$FAMILY)
#View(pap2)

4. Régression linéaire simple (DBw ~ FW1)

modeleS<-lm(DBw~FWl,data=pap2)

summary(modeleS)
## 
## Call:
## lm(formula = DBw ~ FWl, data = pap2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.89045 -0.21444 -0.01914  0.21165  0.86840 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2.05168    0.02643  -77.61   <2e-16 ***
## FWl          2.72610    0.02118  128.73   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2978 on 2643 degrees of freedom
## Multiple R-squared:  0.8624, Adjusted R-squared:  0.8624 
## F-statistic: 1.657e+04 on 1 and 2643 DF,  p-value: < 2.2e-16

J’obtient avec ce modèle linéaire simple les coefficients : -2.05168 pour l’intercept et 2.72610 pour FWl. le R^2 ajusté est de 0.8624.

Ce R^2 nous apprend que le modèle est plutôt bien ajusté.

On trouve approximativement les mêmes résultat que l’auteur sur la table 1 à la ligne de FWl pour intercept et coefficient (Intercept:-2.053 ,Coefficient:2.727 ).

5. Prédiction du poids pour une aile de 3mm

ailetest<-3 # en mm

coefms<-coef(modeleS)
log10_prediction_poid<-coefms[1]+coefms[2]*log10(ailetest)

prediction_poid<-10^(log10_prediction_poid)
prediction_poid
## (Intercept) 
##   0.1774168

Il est donc prédit qu’un papillon avec des ailes de 3 mm aurait un poid d’environ 0,177 mg

6. Régressions linéaires simples (Autres variables)

#modèle linéaire simple de DBw en fonction de toutes les autres variables quantitatives.

res<-matrix(NA,nrow=15,ncol=2)

colnames(res)<-c("Intercept","Coefficient")



R2<-numeric(15)

for (i in 1:15) {
  modeleS2=lm(DBw~pap2[,i],data=pap2)
  R2[i]=summary(modeleS2)$adj.r.squared
  res[i,"Intercept"]<-coef(modeleS2)[1]
  res[i,"Coefficient"]<-coef(modeleS2)[2]
}


#modeleS2

noms=c("Hl","Hw","Tl","Tw","Al","Aw","FWl","FWw","HWl","HWw","Wsp1","Wsp2","Bl")
#res
Res_final<-cbind(res[3:15,],R2[3:15],noms)

Res_final
##       Intercept             Coefficient                            noms  
##  [1,] "1.41906679591151"    "2.30896116014388" "0.602494224370337" "Hl"  
##  [2,] "0.253237587253971"   "2.92334389249664" "0.916454298763331" "Hw"  
##  [3,] "-0.431264610068992"  "2.7048358029766"  "0.948331118550555" "Tl"  
##  [4,] "-0.0138452804009023" "2.86112290763519" "0.910170783819414" "Tw"  
##  [5,] "-1.05290537417659"   "2.69293587773412" "0.881098370606713" "Al"  
##  [6,] "0.66004843397411"    "2.37721599960582" "0.867023940171597" "Aw"  
##  [7,] "-2.05168337538385"   "2.72609542132282" "0.862390729626412" "FWl" 
##  [8,] "-0.338076301730261"  "1.95068359619092" "0.779992301212012" "FWw" 
##  [9,] "-1.72693903147396"   "2.71305970281769" "0.782391108334219" "HWl" 
## [10,] "-0.727494946666458"  "2.23396996193819" "0.763222741790457" "HWw" 
## [11,] "-3.20991530244933"   "2.96142182929919" "0.889133092589765" "Wsp1"
## [12,] "-3.07671364376782"   "2.79207126581453" "0.885441918857263" "Wsp2"
## [13,] "-1.84925116927549"   "2.83837027776421" "0.940581885956571" "Bl"

Res_final nous rend le tableau des intercepts , coefficients et R^2 ajusté pour chaque modèle simple de la variable DBw avec la variable appelé dans la colonne “noms”.

Comparaison avec l’article : Nous retrouvons approximativement les mêmes valeurs que les auteurs que ce soit pour les Intercepts , les coefficients ou bien les R^2.

7. Matrice de corrélation

library(corrplot)
## corrplot 0.95 loaded
pap2_Q<-pap2[,2:15]
#View(pap2_Q)
corr<-cor(pap2_Q)

corr
##            DBw        Hl        Hw        Tl        Tw        Al        Aw
## DBw  1.0000000 0.7763019 0.9573327 0.9738330 0.9540465 0.9386924 0.9311682
## Hl   0.7763019 1.0000000 0.8383816 0.8132687 0.7069782 0.7738788 0.6658545
## Hw   0.9573327 0.8383816 1.0000000 0.9637908 0.9236761 0.9099872 0.8820314
## Tl   0.9738330 0.8132687 0.9637908 1.0000000 0.9217252 0.9187086 0.8787813
## Tw   0.9540465 0.7069782 0.9236761 0.9217252 1.0000000 0.8967428 0.9502507
## Al   0.9386924 0.7738788 0.9099872 0.9187086 0.8967428 1.0000000 0.8717185
## Aw   0.9311682 0.6658545 0.8820314 0.8787813 0.9502507 0.8717185 1.0000000
## FWl  0.9286780 0.8101318 0.9090384 0.9344124 0.8449292 0.9291737 0.8173590
## FWw  0.8832188 0.7827743 0.8837843 0.9040109 0.7883845 0.8507127 0.7524461
## HWl  0.8845753 0.7835391 0.8630856 0.8924631 0.7947599 0.8848792 0.7618573
## HWw  0.8736775 0.7928575 0.8778747 0.8979826 0.7831538 0.8545581 0.7361195
## Wsp1 0.9429608 0.8061193 0.9181648 0.9410728 0.8743457 0.9432756 0.8453133
## Wsp2 0.9410023 0.8109305 0.9201676 0.9440283 0.8660796 0.9370576 0.8362403
## Bl   0.9698476 0.8257461 0.9535473 0.9708942 0.9205681 0.9851071 0.8864941
##            FWl       FWw       HWl       HWw      Wsp1      Wsp2        Bl
## DBw  0.9286780 0.8832188 0.8845753 0.8736775 0.9429608 0.9410023 0.9698476
## Hl   0.8101318 0.7827743 0.7835391 0.7928575 0.8061193 0.8109305 0.8257461
## Hw   0.9090384 0.8837843 0.8630856 0.8778747 0.9181648 0.9201676 0.9535473
## Tl   0.9344124 0.9040109 0.8924631 0.8979826 0.9410728 0.9440283 0.9708942
## Tw   0.8449292 0.7883845 0.7947599 0.7831538 0.8743457 0.8660796 0.9205681
## Al   0.9291737 0.8507127 0.8848792 0.8545581 0.9432756 0.9370576 0.9851071
## Aw   0.8173590 0.7524461 0.7618573 0.7361195 0.8453133 0.8362403 0.8864941
## FWl  1.0000000 0.9479541 0.9739307 0.9430251 0.9927166 0.9991220 0.9523871
## FWw  0.9479541 1.0000000 0.9329916 0.9602272 0.9270127 0.9462478 0.8931212
## HWl  0.9739307 0.9329916 1.0000000 0.9373487 0.9640740 0.9710046 0.9091037
## HWw  0.9430251 0.9602272 0.9373487 1.0000000 0.9286616 0.9413069 0.8938018
## Wsp1 0.9927166 0.9270127 0.9640740 0.9286616 1.0000000 0.9946778 0.9626350
## Wsp2 0.9991220 0.9462478 0.9710046 0.9413069 0.9946778 1.0000000 0.9606047
## Bl   0.9523871 0.8931212 0.9091037 0.8938018 0.9626350 0.9606047 1.0000000
#Visualiser 

corrplot(corr)

8. Clustering hiérarchique et dendrogramme

M<-cor(pap2_Q)

D<-as.dist(1-M)

clust<-hclust(D,method="average")

dendro<-as.dendrogram(clust)




par(mar=c(2,1,4,6))
plot(dendro,main="Dendro",horiz=TRUE,xlab="r",xlim=c(0.25,0),axes= FALSE)
axis(side=3,at=c(0.30,0.20,0.10,0.05,0),labels=
       c("0.7","0.80","0.90","0.95","1.0"),line=0)

On obtient à peu près le même dendrogramme que les auteurs. On peut voir les corrélations dans l’ensemble des variables quantitatives. Le noeud ou deux groupes de variable se rejoignent indique la corrélation (sur l’axe) entre ces deux groupes de variables.

9. Ajustement du “Model 2”

modele2<-lm(DBw~Hw+Tl+Tw+Al+Aw+FWl+FWw,data=pap2_Q)
summary(modele2)
## 
## Call:
## lm(formula = DBw ~ Hw + Tl + Tw + Al + Aw + FWl + FWw, data = pap2_Q)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.42251 -0.07245 -0.00083  0.07345  0.51101 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.44519    0.02304 -19.322  < 2e-16 ***
## Hw           0.08745    0.03492   2.505   0.0123 *  
## Tl           1.12551    0.03657  30.778  < 2e-16 ***
## Tw           0.49914    0.03509  14.225  < 2e-16 ***
## Al           0.27292    0.02737   9.972  < 2e-16 ***
## Aw           0.52760    0.02305  22.888  < 2e-16 ***
## FWl          0.24832    0.03881   6.399 1.85e-10 ***
## FWw          0.09661    0.02144   4.506 6.90e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1144 on 2637 degrees of freedom
## Multiple R-squared:  0.9798, Adjusted R-squared:  0.9797 
## F-statistic: 1.823e+04 on 7 and 2637 DF,  p-value: < 2.2e-16
AIC(modele2)
## [1] -3954.392

On obtient un AIC de -3954.4 tandis que l’auteur en a un de -3959.7.

Ainsi voici les valeurs des coefficients que l’on obtient :

Nous Auteurs

Intercept :-0.44519 ->-0.4474
Hw:0.08745 ->0.0847 Tl:1.12551 ->1.1281 Tw:0.49914 ->0.5020 Al:0.27292 ->0.2738 Aw:0.52760 ->0.5275 FWl:0.24832 ->0.2454 FWw:0.09661 ->0.0992

On obtient un R^2 ajusté de 0.9797 et une statistique F de 1.823e+04 et l’auteur lui a un R^2 de 0.980 et une valeur de statistique F de 18250.5.

Le summary nous montre que les valeurs des estimations des coefficients pour le modèle 2 est proche de celles de l’auteurs (à des petits arrondis près).

10. Visualisation des valeurs prédites vs observées

logDBw_prediction<-predict(modele2)

DBw_prediction<-10^(logDBw_prediction)

log_DBw_réel<-pap2_Q$DBw
DBw_réel<-10^(log_DBw_réel)


plot(DBw_prediction,DBw_réel,log="xy",xlab="poid prédit",ylab="poid réel",axes=FALSE,xlim=c(0.1,3000))
va<-c(0.01,0.1,0.5,5,50,200,1000,3000)

axis(1,at=va,labels=va)
axis(2,at=va,labels=va,las=1)

Ce graphique est le même que celui obtenu par les auteurs (il n’y a pas l’affichage de l’abscisse 3000).

11. Comparaison des critères AIC

Parmis les 8 modèles ajustés par l’auteur AIC=-4002.8 est la valeur la plus négative , ainsi le modèle 1 possède le meilleur critère AIC.

12. Sélection de variables (AIC vs BIC)

npap<-nrow(pap2_Q)
modelecomplet<-lm(DBw~.,data=pap2_Q)

modelebonAIC<-step(modelecomplet,direction="backward")
## Start:  AIC=-11523.16
## DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWl + FWw + HWl + HWw + Wsp1 + 
##     Wsp2 + Bl
## 
##        Df Sum of Sq    RSS    AIC
## <none>              33.557 -11523
## - HWw   1    0.0376 33.595 -11522
## - HWl   1    0.0609 33.618 -11520
## - Bl    1    0.0616 33.619 -11520
## - Hl    1    0.0680 33.625 -11520
## - Wsp2  1    0.0743 33.632 -11519
## - FWl   1    0.0778 33.635 -11519
## - Wsp1  1    0.1067 33.664 -11517
## - Tw    1    0.1213 33.679 -11516
## - Al    1    0.1525 33.710 -11513
## - FWw   1    0.2590 33.816 -11505
## - Hw    1    0.4311 33.988 -11491
## - Tl    1    1.3959 34.953 -11417
## - Aw    1    5.9944 39.552 -11090
modelebonBIC<-step(modelecomplet,direction="backward",k=log(npap))
## Start:  AIC=-11440.84
## DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWl + FWw + HWl + HWw + Wsp1 + 
##     Wsp2 + Bl
## 
##        Df Sum of Sq    RSS    AIC
## - HWw   1    0.0376 33.595 -11446
## - HWl   1    0.0609 33.618 -11444
## - Bl    1    0.0616 33.619 -11444
## - Hl    1    0.0680 33.625 -11443
## - Wsp2  1    0.0743 33.632 -11443
## - FWl   1    0.0778 33.635 -11443
## <none>              33.557 -11441
## - Wsp1  1    0.1067 33.664 -11440
## - Tw    1    0.1213 33.679 -11439
## - Al    1    0.1525 33.710 -11437
## - FWw   1    0.2590 33.816 -11428
## - Hw    1    0.4311 33.988 -11415
## - Tl    1    1.3959 34.953 -11341
## - Aw    1    5.9944 39.552 -11014
## 
## Step:  AIC=-11445.75
## DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWl + FWw + HWl + Wsp1 + 
##     Wsp2 + Bl
## 
##        Df Sum of Sq    RSS    AIC
## - HWl   1    0.0442 33.639 -11450
## - Bl    1    0.0612 33.656 -11449
## - Hl    1    0.0714 33.666 -11448
## - Wsp2  1    0.0745 33.669 -11448
## - FWl   1    0.0773 33.672 -11448
## - Wsp1  1    0.0973 33.692 -11446
## <none>              33.595 -11446
## - Tw    1    0.1204 33.715 -11444
## - Al    1    0.1519 33.747 -11442
## - FWw   1    0.2310 33.826 -11436
## - Hw    1    0.4146 34.010 -11421
## - Tl    1    1.3867 34.982 -11347
## - Aw    1    6.3216 39.917 -10998
## 
## Step:  AIC=-11450.15
## DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWl + FWw + Wsp1 + Wsp2 + 
##     Bl
## 
##        Df Sum of Sq    RSS    AIC
## - Bl    1    0.0555 33.695 -11454
## - Hl    1    0.0735 33.713 -11452
## - FWl   1    0.0775 33.717 -11452
## - Wsp2  1    0.0790 33.718 -11452
## <none>              33.639 -11450
## - Wsp1  1    0.1121 33.751 -11449
## - Tw    1    0.1192 33.758 -11449
## - Al    1    0.1412 33.780 -11447
## - FWw   1    0.2716 33.911 -11437
## - Hw    1    0.3918 34.031 -11427
## - Tl    1    1.3577 34.997 -11353
## - Aw    1    6.2782 39.917 -11005
## 
## Step:  AIC=-11453.67
## DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWl + FWw + Wsp1 + Wsp2
## 
##        Df Sum of Sq    RSS    AIC
## - FWl   1    0.0891 33.784 -11455
## - Wsp2  1    0.0894 33.784 -11454
## <none>              33.695 -11454
## - Tw    1    0.1108 33.806 -11453
## - Wsp1  1    0.1202 33.815 -11452
## - FWw   1    0.2824 33.977 -11440
## - Hw    1    0.3703 34.065 -11433
## - Hl    1    0.5282 34.223 -11420
## - Al    1    1.1625 34.857 -11372
## - Aw    1    6.4672 40.162 -10997
## - Tl    1   11.9137 45.608 -10661
## 
## Step:  AIC=-11454.57
## DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWw + Wsp1 + Wsp2
## 
##        Df Sum of Sq    RSS    AIC
## - Wsp2  1    0.0005 33.784 -11462
## <none>              33.784 -11455
## - Wsp1  1    0.1296 33.913 -11452
## - FWw   1    0.2809 34.065 -11440
## - Hw    1    0.3553 34.139 -11435
## - Hl    1    0.5657 34.350 -11418
## - Al    1    1.1972 34.981 -11370
## - Tw    1    1.8636 35.647 -11320
## - Aw    1    6.3790 40.163 -11005
## - Tl    1   12.5071 46.291 -10629
## 
## Step:  AIC=-11462.42
## DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWw + Wsp1
## 
##        Df Sum of Sq    RSS    AIC
## <none>              33.784 -11462
## - Hw    1    0.3549 34.139 -11443
## - FWw   1    0.4325 34.217 -11437
## - Hl    1    0.5653 34.350 -11426
## - Wsp1  1    0.8553 34.640 -11404
## - Al    1    1.2171 35.001 -11377
## - Tw    1    1.8688 35.653 -11328
## - Aw    1    6.3845 40.169 -11012
## - Tl    1   12.6836 46.468 -10627
#summary(modelebonAIC)
#summary(modelebonBIC)

Nous avons donc deux modèle dont un avec critère AIC et l’autre avec critère BIC.

Modèle avec critère AIC :

Le modèle complet avec descente ne supprime aucune variable puisque aucune suppression ne permet d’obtenir un AIC plus négatif qu’au début de l’algorithme. Ainsi pour le critère AIC le modèle optimal est le modèle complet.

Modèle avec critère BIC :

Par critère BIC , le modèle complet subit cinq suppression de variable. Cela permet de dire que le critère BIC est plus restrictif que l’AIC.

Le modèle final obtenu à partir du modèle complet est donc le suivant :

Start:AIC=-11440.84

Step: AIC=-11462.42 DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWw + Wsp1

Ici huit variables permettent d’optimiser DBw (Dry Body Weight) par BIC

Comparaison avec le modèle de l’article :

le meilleur modèle de l’article (modèle1) garde 8 variables :

AIC=-4002.8

DBw ~ Hl + Hw + Tl + Tw + Al + Aw + FWw + FWl

Notre modèle BIC est le plus proche de celui de l’article. En effet la seule différence réside dans le choix de la variable wsp1 au lieu de FWl.

Cependant nous avons remarqué precèdemment que ces deux variables possèdent une bonne corrélation donc le meilleur modèle de l’auteur et notre modèle BIC sont des bons modèles de prédiction du poid corporel sec des papillons.

Enfin notre modèle AIC n’est pas assez restrictif , il garde chacune des variables montrant qu’elles apportent tout de même un gain de précision réel même s’il est minime.

13. Recréation de la Figure 3

DBw_final<-pap$DBw
FWl_final<-pap$FWl

Hesperiidae_DBw<-DBw_final[pap$FAMILY=="Hesperiidae"]
Papilionidae_DBw<-DBw_final[pap$FAMILY=="Papilionidae"]      
Pieridae_DBw<-DBw_final[pap$FAMILY=="Pieridae"] 
Nymp_Lyca_Rio_DBw<-DBw_final[pap$FAMILY=="Nymphalidae"|pap$FAMILY=="Lycaenidae"|pap$FAMILY=="Riodinidae"] 


Hesperiidae_FWl<-FWl_final[pap$FAMILY=="Hesperiidae"]
Papilionidae_FWl<-FWl_final[pap$FAMILY=="Papilionidae"]      
Pieridae_FWl<-FWl_final[pap$FAMILY=="Pieridae"] 
Nymp_Lyca_Rio_FWl<-FWl_final[pap$FAMILY=="Nymphalidae"|pap$FAMILY=="Lycaenidae"|pap$FAMILY=="Riodinidae"] 



DroiteH=lm(log10(Hesperiidae_DBw)~log10(Hesperiidae_FWl))
DroitePa=lm(log10(Papilionidae_DBw)~log10(Papilionidae_FWl))
DroitePi=lm(log10(Pieridae_DBw)~log10(Pieridae_FWl))
DroiteN=lm(log10(Nymp_Lyca_Rio_DBw)~log10(Nymp_Lyca_Rio_FWl))


plot(Hesperiidae_FWl,Hesperiidae_DBw,log="xy",pch=3,col="black",xlim=c(5,150),ylim=c(1,600),cex=0.5,las=1,xlab="Forewing length (mm)",ylab="Dry body weight (mg)",xaxt="n")
points(Papilionidae_FWl,Papilionidae_DBw,pch=19,col="red",cex=0.5)
points(Pieridae_FWl,Pieridae_DBw,pch=19,col="yellow",cex=0.5)
points(Nymp_Lyca_Rio_FWl,Nymp_Lyca_Rio_DBw,pch=15,col="cyan",cex=0.5)

axis(1,at=c(10,20,30,40,50,60,80,100,150),labels=c(10,20,30,40,50,60,80,100,150))

abline(DroiteH,col="black",lwd=2)
abline(DroitePa,col="red",lwd=2)
abline(DroitePi,col="yellow",lwd=2)
abline(DroiteN,col="cyan",lwd=2)


family<-c("Hesperiidae","Papilionidae","Pieridae","Lycaenidae-Riodinidae-Nymphalidae")

couleur<-c("black","red","yellow","cyan")
points<-c(3,19,19,15)

legend("bottomright",legend=family,col=couleur,pch=points,lty=1,lwd=3,          bty="n",cex=0.6,seg.len=3)


Exercice 2 : Le système Elo aux échecs


I) Modèles univariés

1. Structure du jeu de données

chess<-read.csv("Chess.csv",stringsAsFactors=TRUE)

dim(chess)
## [1] 17435    11

Dans ce jeu de données , il y’a 17435 individus et 11 variables

2. Création de la variable “Victoire”

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
#Ajouter la variable binaire Victoire

Victoire<-ifelse((chess$Resultat=="1-0"&chess$Couleur.joueur=="Blanc")|(chess$Resultat=="0-1"&chess$Couleur.joueur=="Noir"),1,0)


#Retirer la variable résultat et ajouter la variable Victoire
chess_new<-cbind(Victoire,chess[,1:5],chess[,7:11])

3. Rapport des cotes selon la couleur (Blancs vs Noirs)

library(epitools)
tab<-table(chess_new$Couleur.joueur,chess_new$Victoire)
tab
##        
##            0    1
##   Blanc 4165 4566
##   Noir  4377 4327
oddsratio.wald(tab,conf.level = 0.95)
## $data
##        
##            0    1 Total
##   Blanc 4165 4566  8731
##   Noir  4377 4327  8704
##   Total 8542 8893 17435
## 
## $measure
##        odds ratio with 95% C.I.
##          estimate     lower     upper
##   Blanc 1.0000000        NA        NA
##   Noir  0.9017568 0.8497472 0.9569498
## 
## $p.value
##        two-sided
##           midp.exact fisher.exact   chi.square
##   Blanc           NA           NA           NA
##   Noir  0.0006450032 0.0006528506 0.0006444845
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

la modalité de reference est que bob joue les blancs

On a que bob perds plus en commençant avec les noirs plutôt qu’avec les blancs

les p-valeurs sont petites (<0.05) donc l’hypothèse nulle est rejeté , ce qui veut dire que bob n’a pas autant de chance de gagner selon la couleur de départ , ici il perd plus s’il joue les noirs en premier.

4. Impact de la cadence (Référence : Blitz)

chess_new$Type.partie=relevel(chess_new$Type.partie,"Blitz")
tab2<-table(chess_new$Type.partie,chess_new$Victoire)
tab2
##                 
##                     0    1
##   Blitz          5046 5167
##   Bullet         2312 2221
##   Classique       406  561
##   Correspondance   40   87
##   Rapide          738  857
oddsratio.wald(tab2,conf.level = 0.95)
## $data
##                 
##                     0    1 Total
##   Blitz          5046 5167 10213
##   Bullet         2312 2221  4533
##   Classique       406  561   967
##   Correspondance   40   87   127
##   Rapide          738  857  1595
##   Total          8542 8893 17435
## 
## $measure
##                 odds ratio with 95% C.I.
##                  estimate     lower    upper
##   Blitz          1.000000        NA       NA
##   Bullet         0.938144 0.8747454 1.006138
##   Classique      1.349415 1.1808119 1.542093
##   Correspondance 2.124066 1.4577689 3.094906
##   Rapide         1.134053 1.0202048 1.260605
## 
## $p.value
##                 two-sided
##                    midp.exact fisher.exact   chi.square
##   Blitz                    NA           NA           NA
##   Bullet         7.370811e-02 7.432966e-02 7.366663e-02
##   Classique      9.828401e-06 1.017651e-05 1.018332e-05
##   Correspondance 5.251021e-05 5.282795e-05 6.002307e-05
##   Rapide         1.971632e-02 2.054978e-02 1.972430e-02
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Bob à le plus de chance de gagner les parties de Correspondance bien plus que les autres styles de partie.

De plus la p-valeur associée confirme qu’on ne peut pas rejeter le fait que Bob ne gagne pas autant de partie de correspondance que de Blitz.

5. Analyse de l’évolution annuelle (Variable Year)

library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(dplyr)

typeof(chess_new$Date)
## [1] "integer"
#Les dates vont de 2018 à 2025
date<-chess_new$Date
date_c<-as.character(date)

typeof(date_c)
## [1] "character"
dated<-as.Date(date_c,format="%Y.%m.%d")
typeof(dated)
## [1] "double"
Year<-year(dated)

chess_1<-cbind(chess_new[,1:6],Year,chess_new[,8:11])

#Rapport des côtes Victoire contre non-victoire en 2019

chess_1$Year<-relevel(as.factor(chess_1$Year),"2019")
tab3<-table(chess_1$Year,chess_1$Victoire)
tab3
##       
##           0    1
##   2019 1528 1666
##   2018   59   61
##   2020 1624 1632
##   2021 1327 1387
##   2022 1692 1777
##   2023 1087 1178
##   2024  944  921
##   2025  281  271
oddsratio.wald(tab3,conf.level = 0.95)
## $data
##        
##            0    1 Total
##   2019  1528 1666  3194
##   2018    59   61   120
##   2020  1624 1632  3256
##   2021  1327 1387  2714
##   2022  1692 1777  3469
##   2023  1087 1178  2265
##   2024   944  921  1865
##   2025   281  271   552
##   Total 8542 8893 17435
## 
## $measure
##       odds ratio with 95% C.I.
##         estimate     lower    upper
##   2019 1.0000000        NA       NA
##   2018 0.9482573 0.6585667 1.365377
##   2020 0.9216849 0.8359218 1.016247
##   2021 0.9586364 0.8653369 1.061995
##   2022 0.9632420 0.8749069 1.060496
##   2023 0.9939490 0.8923993 1.107054
##   2024 0.8948206 0.7981865 1.003154
##   2025 0.8845275 0.7382756 1.059752
## 
## $p.value
##       two-sided
##        midp.exact fisher.exact chi.square
##   2019         NA           NA         NA
##   2018 0.77535688   0.78094736 0.77513327
##   2020 0.10179989   0.10541107 0.10170179
##   2021 0.41888832   0.43325788 0.41873200
##   2022 0.44553104   0.44699434 0.44538886
##   2023 0.91209232   0.91246152 0.91210897
##   2024 0.05672832   0.05815136 0.05661739
##   2025 0.18366587   0.19654188 0.18314392
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

D’après les p-valeurs On ne peut dire que l’hypothèse nulle n’est pas rejeté. Il n’y a pas d’odd ratio qui se demarque fortement des autres donc bob n’a pas eu d’année prépondérante en terme de victoire

6. Création de la variable Difference.Gaffe

# Construire une variable différence de gaffe entre bob et son opposant 

gaffe_bob<-chess_1$Gaffe.joueur
gaffe_opp<-chess_1$Gaffe.adversaire 

Difference.Gaffe<-gaffe_bob-gaffe_opp

chess_2<-cbind(chess_1[,1:9],Difference.Gaffe)
#View(chess_2)

7. Visualisation des gaffes selon le résultat

#Tracer le diagramme en boite horizontal des différences de nombre de Gaffe selon que bob ai gagné ou perdu 

diff_gaffW<-chess_2$Difference.Gaffe[chess_2$Victoire=="1"]

diff_gaffL<-chess_2$Difference.Gaffe[chess_2$Victoire=="0"]


boxplot(Difference.Gaffe~Victoire,data=chess_2,names=c("Win","Lose"),
        col=c("blue","red"),main=" Résultat de bob selon la différence de gaffe",horizontal=TRUE)

Lorsque la différence de gaffe entre bob et son adversaire est nulle on ne peut pas determiner qui a le plus de succès ce qui veut dire que la partie ne determine pas de gagnant flagrant entre bob et son adversaire lorsque il y’a le même nombre de gaffe entre les deux.

Globalement on voit un comportement symétrique , si bob fait une erreur de plus que son adversaire il a tendance a perdre et inversement il a tendance à gagner lorsque son adversaire a fait une gaffe de plus que lui.

Le nombre de gaffe a donc une influence principal dans le résultat des jeux.

8. Modèle logistique : Victoire ~ Difference.Gaffe

#Ajuster un modèle logistique pour la variable Victoire en fonction de la variable Difference.Gaffe

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.2
modeleL<-glm(Victoire~Difference.Gaffe,data=chess_2)

ggplot(chess_2,aes(x=Difference.Gaffe,y=Victoire))+geom_boxplot(aes(group=Victoire),fill=c("red","blue"),width=0.1)+stat_smooth(method="glm",method.args=list(family="binomial"),se=FALSE,color="red")+theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

La boite à moustache de droite est celle des défaites de bob et elle montre que lorsque la différence de gaffe entre bob et son adversaire est positive (bob fait plus d’erreur) alors bob perds plus souvent.

On a le comportement opposé similaire lorsque bob fait moins d’erreur que son adversaire.

la courbe rouge montre la probabilité de victoire de bob face à son adversaire.

La courbe comporte une symétrie centrale par rapport au point (0,0.5) ce qui veut dire que selon les différences de gaffe bob perd autant de fois qu’il gagne (probabilité de gagner ou perdre) lorsque la valeur absolue de la difference de gaffe est la même.

II) Modèles multivariés

1. Sélection descendante par critère BIC

n<-nrow(chess_2)

glmL<-glm(Victoire~Couleur.joueur+Elo.joueur+Elo.adversaire+Type.partie+Site+Type.partie,data=chess_2,family="binomial")

summary(glmL)
## 
## Call:
## glm(formula = Victoire ~ Couleur.joueur + Elo.joueur + Elo.adversaire + 
##     Type.partie + Site + Type.partie, family = "binomial", data = chess_2)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                0.5516216  0.1250023   4.413 1.02e-05 ***
## Couleur.joueurNoir        -0.1086560  0.0313324  -3.468 0.000525 ***
## Elo.joueur                 0.0048159  0.0001799  26.764  < 2e-16 ***
## Elo.adversaire            -0.0051479  0.0001765 -29.163  < 2e-16 ***
## Type.partieBullet         -0.0002059  0.0376177  -0.005 0.995633    
## Type.partieClassique       0.1371019  0.0731836   1.873 0.061014 .  
## Type.partieCorrespondance  0.1446766  0.2161075   0.669 0.503198    
## Type.partieRapide          0.1001677  0.0562691   1.780 0.075051 .  
## SiteLichess.com            0.0051382  0.0402850   0.128 0.898508    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 24163  on 17434  degrees of freedom
## Residual deviance: 22934  on 17426  degrees of freedom
## AIC: 22952
## 
## Number of Fisher Scoring iterations: 4
glmC<-step(glmL,direction="backward",k=log(n))
## Start:  AIC=23021.71
## Victoire ~ Couleur.joueur + Elo.joueur + Elo.adversaire + Type.partie + 
##     Site + Type.partie
## 
##                  Df Deviance   AIC
## - Type.partie     4    22941 22990
## - Site            1    22934 23012
## <none>                 22934 23022
## - Couleur.joueur  1    22946 23024
## - Elo.joueur      1    23825 23903
## - Elo.adversaire  1    24062 24141
## 
## Step:  AIC=22989.52
## Victoire ~ Couleur.joueur + Elo.joueur + Elo.adversaire + Site
## 
##                  Df Deviance   AIC
## - Site            1    22941 22980
## <none>                 22941 22990
## - Couleur.joueur  1    22953 22992
## - Elo.joueur      1    23873 23912
## - Elo.adversaire  1    24111 24150
## 
## Step:  AIC=22979.85
## Victoire ~ Couleur.joueur + Elo.joueur + Elo.adversaire
## 
##                  Df Deviance   AIC
## <none>                 22941 22980
## - Couleur.joueur  1    22953 22982
## - Elo.joueur      1    23877 23906
## - Elo.adversaire  1    24145 24174
summary(glmC)
## 
## Call:
## glm(formula = Victoire ~ Couleur.joueur + Elo.joueur + Elo.adversaire, 
##     family = "binomial", data = chess_2)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         0.5778651  0.1126309   5.131 2.89e-07 ***
## Couleur.joueurNoir -0.1086735  0.0313261  -3.469 0.000522 ***
## Elo.joueur          0.0048404  0.0001777  27.244  < 2e-16 ***
## Elo.adversaire     -0.0051757  0.0001737 -29.798  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 24163  on 17434  degrees of freedom
## Residual deviance: 22941  on 17431  degrees of freedom
## AIC: 22949
## 
## Number of Fisher Scoring iterations: 4

Les variables significatives sont pour le premier modèle : L’intercept , Couleur.joueurNoir,Elo.joueur ,Elo.adversaire.

la méthode descendante nous fait passer de AIC=23021.71 à Step: AIC=22979.85 et garde bien les variables de la couleur du joueur , de l’elo du joueur et de l’elo de l’adversaire.

glmbest<-glm(Victoire~Couleur.joueur+Elo.joueur+Elo.adversaire,data=chess_2,family="binomial")

summary(glmbest)
## 
## Call:
## glm(formula = Victoire ~ Couleur.joueur + Elo.joueur + Elo.adversaire, 
##     family = "binomial", data = chess_2)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)    
## (Intercept)         0.5778651  0.1126309   5.131 2.89e-07 ***
## Couleur.joueurNoir -0.1086735  0.0313261  -3.469 0.000522 ***
## Elo.joueur          0.0048404  0.0001777  27.244  < 2e-16 ***
## Elo.adversaire     -0.0051757  0.0001737 -29.798  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 24163  on 17434  degrees of freedom
## Residual deviance: 22941  on 17431  degrees of freedom
## AIC: 22949
## 
## Number of Fisher Scoring iterations: 4

Couleur.joueurNoir <0 donc comme la modalité de reference est blanc ca veut dire qu’il est plus probable pour bob de perdre lorsqu’il joue avec les noirs.

Elo.joueur>0 et Elo.adversaire<0 ce qui veut dire que il est plus probable que bob gagne si son elo augmente et qu’il est plus probable que bob perd si l’elo de l’adversaire augmente.

2. Test de Wald (Somme des coefficients Elo)

coeff<-coef(glmbest)
sommecoeff<-coeff["Elo.joueur"]+coeff["Elo.adversaire"]
sommecoeff
##    Elo.joueur 
## -0.0003353332
library(aod)
indices<-which(names(coeff)%in%c("Elo.joueur","Elo.adversaire"))

testW<-wald.test(b=coef(glmbest),Sigma=vcov(glmbest),
                 L=matrix(c(0,0,1,1),nrow=1))
testW
## Wald test:
## ----------
## 
## Chi-squared test:
## X2 = 33.1, df = 1, P(> X2) = 9e-09

9e-09<5e-02 donc on rejette l’hypothèse nulle.

Ainsi on rejette l’idée que la somme des coefficients est nulle.

Donc l’effet de l’elo de l’adversaire et de l’elo de bob ne se compensent pas.

3. Création de la variable Difference.Elo

Différence.Elo<-chess_2$Elo.joueur-chess_2$Elo.adversaire


chess_3<-cbind(chess_2[,1:2],chess_2[,5:10],Différence.Elo)

#View(chess_3)

4. Régression logistique et probabilité de gain (Diff = 200)

n1<-nrow(chess_3)


Glmnouv<-glm(Victoire~Couleur.joueur+Différence.Elo+Type.partie+Site+Longueur.Partie,data=chess_3,family="binomial")

summary(Glmnouv)
## 
## Call:
## glm(formula = Victoire ~ Couleur.joueur + Différence.Elo + Type.partie + 
##     Site + Longueur.Partie, family = "binomial", data = chess_3)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                0.0542422  0.0515281   1.053 0.292491    
## Couleur.joueurNoir        -0.1086493  0.0313162  -3.469 0.000522 ***
## Différence.Elo             0.0050285  0.0001743  28.854  < 2e-16 ***
## Type.partieBullet          0.0369358  0.0368099   1.003 0.315658    
## Type.partieClassique       0.2015611  0.0719127   2.803 0.005065 ** 
## Type.partieCorrespondance  0.1556166  0.2152788   0.723 0.469765    
## Type.partieRapide          0.1016046  0.0563031   1.805 0.071137 .  
## SiteLichess.com           -0.0861595  0.0354725  -2.429 0.015144 *  
## Longueur.Partie           -0.0020986  0.0009602  -2.185 0.028858 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 24163  on 17434  degrees of freedom
## Residual deviance: 22952  on 17426  degrees of freedom
## AIC: 22970
## 
## Number of Fisher Scoring iterations: 4
step(Glmnouv,direction="backward",k=log(n))
## Start:  AIC=23040.2
## Victoire ~ Couleur.joueur + Différence.Elo + Type.partie + Site + 
##     Longueur.Partie
## 
##                   Df Deviance   AIC
## - Type.partie      4    22963 23012
## - Longueur.Partie  1    22957 23035
## - Site             1    22958 23036
## <none>                  22952 23040
## - Couleur.joueur   1    22964 23042
## - Différence.Elo   1    24055 24133
## 
## Step:  AIC=23011.78
## Victoire ~ Couleur.joueur + Différence.Elo + Site + Longueur.Partie
## 
##                   Df Deviance   AIC
## - Longueur.Partie  1    22968 23007
## - Site             1    22969 23008
## <none>                  22963 23012
## - Couleur.joueur   1    22975 23014
## - Différence.Elo   1    24103 24142
## 
## Step:  AIC=23006.79
## Victoire ~ Couleur.joueur + Différence.Elo + Site
## 
##                  Df Deviance   AIC
## - Site            1    22974 23003
## <none>                 22968 23007
## - Couleur.joueur  1    22980 23009
## - Différence.Elo  1    24111 24140
## 
## Step:  AIC=23003.22
## Victoire ~ Couleur.joueur + Différence.Elo
## 
##                  Df Deviance   AIC
## <none>                 22974 23003
## - Couleur.joueur  1    22986 23006
## - Différence.Elo  1    24151 24171
## 
## Call:  glm(formula = Victoire ~ Couleur.joueur + Différence.Elo, family = "binomial", 
##     data = chess_3)
## 
## Coefficients:
##        (Intercept)  Couleur.joueurNoir      Différence.Elo  
##          -0.056694           -0.108413            0.005085  
## 
## Degrees of Freedom: 17434 Total (i.e. Null);  17432 Residual
## Null Deviance:       24160 
## Residual Deviance: 22970     AIC: 22980

La méthode de descente fait passer de AIC=23040.2 à AIC=23003.22

Différence.Elo et Couleur.joueurNoir sont les variables les plus significatives.

Ensuite Type.partieClassique,SiteLichess.com et Longueur.Partie sont significatives aussi même si elles le sont bien moins.

glmbest2<-glm(Victoire~Couleur.joueur+Différence.Elo,data=chess_3,family="binomial")

summary(glmbest2)
## 
## Call:
## glm(formula = Victoire ~ Couleur.joueur + Différence.Elo, family = "binomial", 
##     data = chess_3)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        -0.0566938  0.0224819  -2.522 0.011677 *  
## Couleur.joueurNoir -0.1084134  0.0312971  -3.464 0.000532 ***
## Différence.Elo      0.0050854  0.0001722  29.532  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 24163  on 17434  degrees of freedom
## Residual deviance: 22974  on 17432  degrees of freedom
## AIC: 22980
## 
## Number of Fisher Scoring iterations: 4
#Proba que bob gagne avec les blancs et adversaire qui a 200 elo de moins
#Différence.Elo=200 et il joue les blancs

#Bob est blanc donc on a 0 de contribution au lieu de 1*-0.1084134 s'il était noir

Bobscore<--0.0566938 +0*-0.1084134 +0.0050854*200

probaBob<-exp(Bobscore)/(1+exp(Bobscore))
probaBob
## [1] 0.7231991

Bob a donc 72.3% de chance de gagner en jouant les blancs et en ayant 200 elo de plus que son adversaire.

5. Identification des ouvertures fréquentes (ECO >= 100)

ECO<-table(chess_3$ECO)
open<-names(which(ECO>=100))

length(open)
## [1] 36

Il y’a exactement 36 ouvertures que Bob a joué plus de 100 fois dans l’ensemble de ses parties.

6. Recodage de la variable ECO (Autres)

chess_3$ECO<-as.character(chess_3$ECO)

chess_3$ECO[!(chess_3$ECO %in% open)]<-"Peu joué"
chess_3$ECO<-as.factor(chess_3$ECO)

#View(chess_3)

7. Modèle final et impact des ouvertures sur la victoire

glmfinal<-glm(Victoire~.,data=chess_3,family="binomial")

summary(glmfinal)
## 
## Call:
## glm(formula = Victoire ~ ., family = "binomial", data = chess_3)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                0.3352409  0.1915359   1.750  0.08007 .  
## Couleur.joueurNoir        -0.2902743  0.0623532  -4.655 3.23e-06 ***
## Type.partieBullet          0.1162571  0.0565141   2.057  0.03967 *  
## Type.partieClassique       0.0344762  0.0946966   0.364  0.71581    
## Type.partieCorrespondance -0.1350239  0.2628311  -0.514  0.60744    
## Type.partieRapide          0.0883830  0.0775651   1.139  0.25451    
## SiteLichess.com           -0.0847414  0.0457586  -1.852  0.06404 .  
## Year2018                   0.2806963  0.2465952   1.138  0.25500    
## Year2020                  -0.0617735  0.0750905  -0.823  0.41071    
## Year2021                  -0.0419436  0.0769089  -0.545  0.58550    
## Year2022                  -0.1134652  0.0669522  -1.695  0.09013 .  
## Year2023                  -0.1278492  0.0741896  -1.723  0.08484 .  
## Year2024                  -0.2347601  0.0790438  -2.970  0.00298 ** 
## Year2025                  -0.3006071  0.1250294  -2.404  0.01620 *  
## ECOA13                     0.0035649  0.2501052   0.014  0.98863    
## ECOA40                    -0.0296732  0.1875191  -0.158  0.87427    
## ECOA41                     0.2265089  0.2404060   0.942  0.34609    
## ECOA43                    -0.1170147  0.2689635  -0.435  0.66352    
## ECOA50                     0.2139532  0.2816684   0.760  0.44750    
## ECOA52                    -0.0256811  0.2575999  -0.100  0.92059    
## ECOA53                    -0.0594680  0.3085190  -0.193  0.84715    
## ECOA56                     0.1149811  0.3004207   0.383  0.70192    
## ECOA57                     0.3567604  0.2385727   1.495  0.13481    
## ECOA84                    -0.2410348  0.2848794  -0.846  0.39750    
## ECOA85                     0.3078628  0.2932694   1.050  0.29383    
## ECOC00                     0.1661905  0.1798033   0.924  0.35534    
## ECOC01                     0.1812252  0.1906603   0.951  0.34185    
## ECOC02                     0.3282712  0.1892177   1.735  0.08276 .  
## ECOC05                    -0.0213547  0.2191947  -0.097  0.92239    
## ECOC06                     0.3491873  0.2396017   1.457  0.14502    
## ECOC11                     0.3583701  0.2047734   1.750  0.08010 .  
## ECOC12                     0.2405234  0.2159989   1.114  0.26548    
## ECOD00                     0.2567405  0.2457000   1.045  0.29605    
## ECOD02                     0.0645445  0.2567593   0.251  0.80152    
## ECOD06                     0.2106704  0.2257837   0.933  0.35079    
## ECOD10                     0.2581835  0.1972479   1.309  0.19056    
## ECOD20                     0.0949407  0.2135140   0.445  0.65657    
## ECOD30                     0.0625080  0.2068155   0.302  0.76247    
## ECOD31                     0.3448042  0.2113357   1.632  0.10277    
## ECOD35                    -0.1304124  0.2119205  -0.615  0.53830    
## ECOD37                     0.1173672  0.2297122   0.511  0.60940    
## ECOD50                     0.0325440  0.2730080   0.119  0.90511    
## ECOD53                    -0.1124552  0.2279846  -0.493  0.62183    
## ECOD55                    -0.0405290  0.2143573  -0.189  0.85004    
## ECOD85                    -0.0980135  0.2892880  -0.339  0.73475    
## ECOE00                    -0.0408147  0.2894072  -0.141  0.88785    
## ECOE11                     0.1911675  0.3015769   0.634  0.52615    
## ECOE32                    -0.0791831  0.2899303  -0.273  0.78477    
## ECOE61                     0.3411407  0.2056582   1.659  0.09716 .  
## ECOPeu joué                0.0239411  0.1796940   0.133  0.89401    
## Longueur.Partie           -0.0083263  0.0011916  -6.987 2.80e-12 ***
## Difference.Gaffe          -1.3265509  0.0212406 -62.454  < 2e-16 ***
## Différence.Elo             0.0045309  0.0002077  21.816  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 24163  on 17434  degrees of freedom
## Residual deviance: 16416  on 17382  degrees of freedom
## AIC: 16522
## 
## Number of Fisher Scoring iterations: 5

ECOC11 est associé au coefficient positif le plus élevé donc il s’agit de l’ouverture parmis toutes , qui contribue le plus à la victoire de Bob.

ECOA84 est associé au coefficient le plus grand négativement ce qui explique que cette ouverture contribue le plus à la defaite de Bob parmis toutes les ouvertures.

Rapport de cote ajusté ajusté entre ces deux ouvertures et intervalle de confiance à 95%

c<-coef(glmfinal)

d_c<-c["ECOC11"]-c["ECOA84"]
d_c
##   ECOC11 
## 0.599405
OR<-exp(d_c)
OR
##   ECOC11 
## 1.821035
IC<-confint.default(glmfinal)

err_s_diff<-sqrt(vcov(glmfinal)["ECOC11", "ECOC11"]+vcov(glmfinal)["ECOA84","ECOA84"]-2*vcov(glmfinal)["ECOC11","ECOA84"])

IC_OR<-exp(d_c+c(inf=-1.96,sup=1.96)*err_s_diff)

IC_OR
##      inf      sup 
## 1.102987 3.006533

Bob a approximativement 1.8 fois plus de chance de gagner la partie avec une ouverture C11 plutôt que A84.

1 n’appartient pas à l’IC_OR donc le résultat est statistiquement significatif au seuil 95%

On peut affirmer avec 95% de confiance que l’ouverture C11 est meilleur que l’ouverture A84 pour Bob.


Exercice 3 : Freestyle


1. Choix du jeu de données et problématique

Choix du jeu et ce que je compte faire avec : vgsales.csv

Problématique : L’objectif va être dans un premier temps d’adapter un modèle dans le but de prédire le nombre de vente d’un jeu sur console portable et faire la même chose sur les jeux de console de salon. L’objectif est de determiner la comparaison d’influence entre ces deux manière de voir le jeu vidéo.

On va globalement regarder la composition de la base de données et faire des petites analyse globales sur le jeu vidéo , ainsi nous allons faire des choix en conséquence sur les variables qu l’on modifiera et gardera.

On pourra également faire une regression logistique pour determiner si un jeu est populaire ou non populaire en fonction d’une nouvelle variable score. Pour effectuer ceci , nous devrons determiner ce que l’on appel succès.

library(dplyr)

jv<-read.csv("vgsales.csv")

Ce jeu de données nous renseigne sur 16 598 jeux videos en donnant leurs intitulés (de quel jeu il s’agit) , leurs rangs (les plus populaires , basé sur les ventes globales).

Nous retrouvons également la plateforme associé à chaque jeu , l’année de sortie , l’organisme qui a publié le jeu , le genre du jeu (Action, RP ou autre) et enfin les ventes focalisés sur l’Europe , le Japon , les ventes mondiales et les ventes dans les autres pays réunis).

Ainsi ce jeu de donnée comporte 16 598 jeux pour 11 variables.

Nous avons 6 variables qualitatives et 5 quantitatives.

Les variables quantitatives sont les nombres d’exemplaires vendus en millions dans les différentes régions : Japon , Europe , Amérique du nord , les autres et les ventes globales.

On s’interessera aussi au succès des jeux pour les petits éditeurs.

unique(jv$Platform)
##  [1] "Wii"  "NES"  "GB"   "DS"   "X360" "PS3"  "PS2"  "SNES" "GBA"  "3DS" 
## [11] "PS4"  "N64"  "PS"   "XB"   "PC"   "2600" "PSP"  "XOne" "GC"   "WiiU"
## [21] "GEN"  "DC"   "PSV"  "SAT"  "SCD"  "WS"   "NG"   "TG16" "3DO"  "GG"  
## [31] "PCFX"
unique(jv$Year)
##  [1] "2006" "1985" "2008" "2009" "1996" "1989" "1984" "2005" "1999" "2007"
## [11] "2010" "2013" "2004" "1990" "1988" "2002" "2001" "2011" "1998" "2015"
## [21] "2012" "2014" "1992" "1997" "1993" "1994" "1982" "2003" "1986" "2000"
## [31] "N/A"  "1995" "2016" "1991" "1981" "1987" "1980" "1983" "2020" "2017"
unique(jv$Genre)
##  [1] "Sports"       "Platform"     "Racing"       "Role-Playing" "Puzzle"      
##  [6] "Misc"         "Shooter"      "Simulation"   "Action"       "Fighting"    
## [11] "Adventure"    "Strategy"
#unique(jv$Publisher)

summary(jv)
##       Rank           Name             Platform             Year          
##  Min.   :    1   Length:16598       Length:16598       Length:16598      
##  1st Qu.: 4151   Class :character   Class :character   Class :character  
##  Median : 8300   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 8301                                                           
##  3rd Qu.:12450                                                           
##  Max.   :16600                                                           
##     Genre            Publisher            NA_Sales          EU_Sales      
##  Length:16598       Length:16598       Min.   : 0.0000   Min.   : 0.0000  
##  Class :character   Class :character   1st Qu.: 0.0000   1st Qu.: 0.0000  
##  Mode  :character   Mode  :character   Median : 0.0800   Median : 0.0200  
##                                        Mean   : 0.2647   Mean   : 0.1467  
##                                        3rd Qu.: 0.2400   3rd Qu.: 0.1100  
##                                        Max.   :41.4900   Max.   :29.0200  
##     JP_Sales         Other_Sales        Global_Sales    
##  Min.   : 0.00000   Min.   : 0.00000   Min.   : 0.0100  
##  1st Qu.: 0.00000   1st Qu.: 0.00000   1st Qu.: 0.0600  
##  Median : 0.00000   Median : 0.01000   Median : 0.1700  
##  Mean   : 0.07778   Mean   : 0.04806   Mean   : 0.5374  
##  3rd Qu.: 0.04000   3rd Qu.: 0.04000   3rd Qu.: 0.4700  
##  Max.   :10.22000   Max.   :10.57000   Max.   :82.7400

Il y’a 31 plateforme de jeu , les années de publication vont de 1980 à 2020 sans compter toutes les années entre.

Il y’a 12 genre de jeu repertorié et 579 éditeurs.

Pour le reste des variables qualitatives , il y’a le nom du jeu et le rang de celui-ci en terme de nombre d’exemplaire vendu.

On regarde les ventes globales pour chaque année

#On créer une variable somme des ventes 

library(dplyr)



jv<-jv%>%mutate(Year=as.numeric(Year))
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `Year = as.numeric(Year)`.
## Caused by warning:
## ! NAs introduced by coercion
jv<-jv%>%mutate(Rank=as.numeric(Rank))
jv<-jv%>%mutate(NA_Sales=as.numeric(NA_Sales))
jv<-jv%>%mutate(EU_Sales=as.numeric(EU_Sales))
jv<-jv%>%mutate(JP_Sales=as.numeric(JP_Sales))
jv<-jv%>%mutate(Other_Sales=as.numeric(Other_Sales))
jv<-jv%>%mutate(Global_Sales=as.numeric(Global_Sales))


sum(is.na(jv$Rank))#0
## [1] 0
sum(is.na(jv$Year))#271
## [1] 271
sum(is.na(jv$NA_Sales))#0
## [1] 0
sum(is.na(jv$EU_Sales))#0
## [1] 0
sum(is.na(jv$JP_Sales))#0
## [1] 0
sum(is.na(jv$Other_Sales))#0
## [1] 0
sum(is.na(jv$Global_Sales))#0
## [1] 0
#Ca ne pose pas de problème de garder les N/A


sum_V<-jv%>%group_by(jv$Year)%>%summarise(Total_Ventes=sum(Global_Sales,na.rm=TRUE))

print(sum_V)
## # A tibble: 40 × 2
##    `jv$Year` Total_Ventes
##        <dbl>        <dbl>
##  1      1980         11.4
##  2      1981         35.8
##  3      1982         28.9
##  4      1983         16.8
##  5      1984         50.4
##  6      1985         53.9
##  7      1986         37.1
##  8      1987         21.7
##  9      1988         47.2
## 10      1989         73.4
## # ℹ 30 more rows
plot(Global_Sales~Year,data=jv)

plot(sum_V,pch=19,main="Nombre de jeu vendu par année",xlab="Nombre de jeu",ylab="Année")

Interprétation :

On va s’intéresser à présent à l’année speciale qu’a été 2008 (Grosse année de vente). On pourrait se focaliser également sur 2005-2011.

library(lubridate)
library(epitools)

jv2008<-jv[jv$Year=="2008",]

dim(jv2008)
## [1] 1699   11
#jv2008


jv2008$Platform<-relevel(as.factor(jv2008$Platform),"DS")

plateforme_vente2008<-table(jv2008$Platform,jv2008$Global_Sales)
#plateforme_vente2008

fisher.test(plateforme_vente2008,simulate.p.value=TRUE)
## 
##  Fisher's Exact Test for Count Data with simulated p-value (based on
##  2000 replicates)
## 
## data:  plateforme_vente2008
## p-value = 0.0004998
## alternative hypothesis: two.sided

Nous avons une p-valeur de 0.0004998 ce qui montre qu’on rejette l’hypothèse nulle , ainsi il existe une association significative entre la plateforme de jeu et le nombre de vente.

Cela est cohérent (par exemple) avec le fait que l’année 2008 est une année marquante pour la Wii avec des très grosses sorties qui resterons majeurs sur cette année. (Mario kart Wii , smash bros brawl). Cette année comporte également un nombre massif de vente de la Wii et de la DS avec 1,6M et 2,25M respectivement alors que 708 000 et 566 000 PS3 et Xbox ont été vendu cette année la.

On remarque que l’année 2008 est une année marqué par une grosse présence de Nintendo (jeux DS et Wii).

Creation d’un indicateur de popularité et comparaison entre les régions :

On va se baser exclusivement sur les notes mais je compte normaliser sur chaque colonne de vente en excluant les ventes globales qui sont la somme de toutes.

Je definirai donc une variable score étant la somme normalisé de chacune des ventes.

library(dplyr)

jv2<-read.csv("vgsales.csv",stringsAsFactors=FALSE)



normaliser<-function(x){
  return((x-min(x,na.rm=TRUE))/(max(x,na.rm=TRUE)-min(x,na.rm=TRUE)))
}




jv2$Year<-as.numeric(jv2$Year)
## Warning: NAs introduced by coercion
jv2$popuG<-normaliser(jv2$NA_Sales)+normaliser(jv2$EU_Sales)+normaliser(jv2$JP_Sales)+normaliser(jv2$Other_Sales)

#On ne garde que les variables explicatives et la cible (popuG)
jv2_I<-jv2[,c("Platform","Year","Genre","Publisher","popuG")]

#Filtrage des éditeurs (<50) 

jv2_I<-jv2_I[jv2_I$Publisher%in%names(which(table(jv2_I$Publisher)>=50)),]
hist(jv2$popuG,breaks=50,col="skyblue",main="Distribution du Score de Popularité")

Ce graphique montre que la massive partie des jeux de notre base de donnée n’est pas populaire (en comparaison avec les bests seller).

Il y’a donc une répartition défavorable en quelque sorte. Nous avons que quelques jeux qui ont un gros score mais ils se font petit dans l’ensemble de la plupart des jeux qui n’ont pas une popularité élevé.

à la lumière d’autres types d’art (livre, cinéma ou autre) on retrouve beaucoup de gros titres et de titre ayant un impact relatif moindre.

Ici on cherche à regrouper les modalités de la variable éditeur en groupe plus large pour pouvoir obtenir une meilleure lecture des informations.

#Filtre des NA
jv2_I<-jv2_I%>%filter(!is.na(Year))

#unique(jv2_I$Publisher)


constructeurs<-c("Nintendo","Microsoft Game Studios","Sony Computer Entertainment")


Grands<-c("Take-Two Interactive","Activision","Ubisoft","Electronic Arts","Sega","SquareSoft","Capcom","Konami Digital Entertainment","Square Enix","Namco Bandai Games","THQ","Vivendi Games", 
"Warner Bros. Interactive Entertainment")


Moyens<-c("Bethesda Softworks","Atari","505 Games","LucasArts","Eidos Interactive","Disney Interactive Studios","Codemasters", "Midway Games","Deep Silver","Tecmo Koei","Infogrames","Atlus","Focus Home Interactive")


petits<-c("Virgin Interactive","Acclaim Entertainment","Majesco Entertainment","Unknown","Banpresto","D3Publisher","Crave Entertainment", "Hudson Soft","Rising Star Games","N/A","Zoo Digital Publishing","Empire Interactive","Nippon Ichi Software","Ignition Entertainment","Kadokawa Shoten", "Marvelous Interactive","Idea Factory","5pb")



jv2_I<-jv2_I%>%mutate(Publisher=case_when(
    Publisher %in% constructeurs~"Constructeur",
    Publisher %in% Grands~"Grand",
    Publisher %in% Moyens~"Moyen",
    Publisher %in% petits~"Petit",
    TRUE~"Autres"))

Gestion des années d’apparition

# L'âge d'or de l'arcade et des premières consoles (8/16 bits)
retro<-1980:1994

# L'arrivée de la 3D et la domination de la PS1/PS2
TroisD<-1995:2005

# L'ère de la HD, du jeu en ligne et de la Wii
HD<-2006:2013

# L'ère moderne (PS4, Switch, Cloud)
moderne<-2014:2020




jv2_I<-jv2_I%>%mutate(Periode=case_when(
    Year%in%retro~"Retro",
    Year%in%TroisD~"3D",
    Year%in%HD~"HD",
    Year%in%moderne~"Moderne",
    TRUE~"Inconnu"))

Gestion des plateformes

#unique(jv2_I$Platform)

Nintendo <- c("Wii","NES","GB","DS","SNES","GBA","3DS","N64","GC","WiiU")
Sony <- c("PS4","PS3","PS2","PS","PSP","PSV")
Microsoft <- c("X360","XB","XOne")
PC <- c("PC")
Sega_Retro <- c("GEN","DC","SAT","SCD","GG")
Autres_Retro <- c("2600","WS","3DO","NG","TG16")




jv2_I<-jv2_I%>%
  mutate(Platform_Group=case_when(
    Platform%in%c("Wii","NES","GB","DS","SNES","GBA","3DS","N64","GC","WiiU")~ "Nintendo",
    Platform%in%c("PS4","PS3","PS2","PS","PSP","PSV")~"Sony",
    Platform%in%c("X360","XB","XOne")~"Microsoft",
    Platform=="PC"~"PC",
    TRUE~"Autres/Retro"))

Consoles portables et Salon

consoles_portables<-c("GB","DS","GBA","3DS","PSP","PSV","WS","GG")

jv2_I$Support_Type<-ifelse(jv2_I$Platform%in%consoles_portables,"Portable", "Salon")



table(jv2_I$Support_Type)
## 
## Portable    Salon 
##     3975     9033
summary(jv2_I)
##    Platform              Year         Genre            Publisher        
##  Length:13008       Min.   :1980   Length:13008       Length:13008      
##  Class :character   1st Qu.:2003   Class :character   Class :character  
##  Mode  :character   Median :2007   Mode  :character   Mode  :character  
##                     Mean   :2007                                        
##                     3rd Qu.:2010                                        
##                     Max.   :2020                                        
##      popuG            Periode          Platform_Group     Support_Type      
##  Min.   :0.000000   Length:13008       Length:13008       Length:13008      
##  1st Qu.:0.003444   Class :character   Class :character   Class :character  
##  Median :0.008992   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :0.027466                                                           
##  3rd Qu.:0.025019                                                           
##  Max.   :3.169263

Création de la variable binaire succès qui se base sur le quartile 0.9 de la popularité.

# Création d'une variable pour le Top 10%
jv2_I$Succes_Top10<-ifelse(jv2_I$popuG>quantile(jv2_I$popuG,0.9),1,0)

# Calcul de l'OR pour le succès en fonction du support
tab_10<-table(jv2_I$Support_Type,jv2_I$Succes_Top10)
oddsratio.wald(tab_10)
## $data
##           
##                0    1 Total
##   Portable  3701  274  3975
##   Salon     8006 1027  9033
##   Total    11707 1301 13008
## 
## $measure
##           odds ratio with 95% C.I.
##            estimate    lower   upper
##   Portable   1.0000       NA      NA
##   Salon      1.7327 1.508077 1.99078
## 
## $p.value
##           two-sided
##              midp.exact fisher.exact   chi.square
##   Portable           NA           NA           NA
##   Salon    6.661338e-16 7.812094e-16 4.547415e-15
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

On trouve des p-valeurs très petites donc la différence entre salon et portable n’est pas due au hasard au seuil 95%. Cela veut dire qu’en moyenne il y’a 1.7327 fois plus de jeu étant un top 20% de succès sur console de salon.

Le succès des hits et donc plus controlé par la console de salon.

Succès top 10% en fonction de la plateforme.

tab1<-table(jv2_I$Platform_Group,jv2_I$Succes_Top10)
oddsratio.wald(tab1)
## $data
##               
##                    0    1 Total
##   Autres/Retro   256   18   274
##   Microsoft     1804  166  1970
##   Nintendo      4350  499  4849
##   PC             683   30   713
##   Sony          4614  588  5202
##   Total        11707 1301 13008
## 
## $measure
##               odds ratio with 95% C.I.
##                estimate     lower    upper
##   Autres/Retro 1.000000        NA       NA
##   Microsoft    1.308697 0.7908511 2.165625
##   Nintendo     1.631469 1.0026562 2.654639
##   PC           0.624695 0.3422433 1.140253
##   Sony         1.812455 1.1152788 2.945445
## 
## $p.value
##               two-sided
##                midp.exact fisher.exact chi.square
##   Autres/Retro         NA           NA         NA
##   Microsoft    0.29563302   0.34710543 0.29381563
##   Nintendo     0.03894833   0.04954068 0.04663431
##   PC           0.13317850   0.13699960 0.12240287
##   Sony         0.01042556   0.01321338 0.01491006
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Ici on voit que Sony est le groupe qui comptabilise le plus de succès

Je souhaite regarder également ce succès ci selon les périodes du jeu vidéo

tabP<-table(jv2_I$Periode,jv2_I$Succes_Top10)
oddsratio.wald(tabP)
## $data
##          
##               0    1 Total
##   3D       4071  467  4538
##   HD       6329  586  6915
##   Moderne  1093  105  1198
##   Retro     214  143   357
##   Total   11707 1301 13008
## 
## $measure
##          odds ratio with 95% C.I.
##            estimate     lower     upper
##   3D      1.0000000        NA        NA
##   HD      0.8071360 0.7103063 0.9171657
##   Moderne 0.8374393 0.6707402 1.0455683
##   Retro   5.8251416 4.6174368 7.3487252
## 
## $p.value
##          two-sided
##            midp.exact fisher.exact   chi.square
##   3D               NA           NA           NA
##   HD      0.001063825 1.061746e-03 9.989755e-04
##   Moderne 0.114324432 1.289172e-01 1.168312e-01
##   Retro   0.000000000 9.046938e-44 2.077751e-60
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Ici les informations sont très intéressantes puisque l’on peut voir l’évolution d’un hit en fonction de la période. Un jeu dit “retro” de l’ancien était beaucoup plus probable d’être un hit. L’effet de l’époque infique qu’un jeu retro a presque 6 fois plus de chance d’être un hit qu’un jeu de l’époque 3D.

On visualise l’effet l’effet de la période et du support sur la popularité

ggplot(jv2_I,aes(x=Periode,y=popuG,color=Support_Type))+geom_jitter(alpha=0.4) +labs(title ="Popularité des jeux selon la période et le support",
       x="Période",y="Popularité (Ventes Mondiales)")+theme_light()

On voit un nuage de point très dense et qui monte assez haut pour la période HD. L’ère HD est celle ou le marché du jeu vidéo à exploser en volume.

à présent on s’intéresse au genre des jeux étant des succès.

tabG<-table(jv2_I$Genre,jv2_I$Succes_Top10)
oddsratio.wald(tabG)
## $data
##               
##                    0    1 Total
##   Action        2520  258  2778
##   Adventure      782   23   805
##   Fighting       595   75   670
##   Misc          1170  108  1278
##   Platform       633  123   756
##   Puzzle         347   42   389
##   Racing         879   96   975
##   Role-Playing   960  185  1145
##   Shooter        906  145  1051
##   Simulation     592   61   653
##   Sports        1813  163  1976
##   Strategy       510   22   532
##   Total        11707 1301 13008
## 
## $measure
##               odds ratio with 95% C.I.
##                 estimate     lower     upper
##   Action       1.0000000        NA        NA
##   Adventure    0.2872777 0.1861329 0.4433847
##   Fighting     1.2311902 0.9378057 1.6163574
##   Misc         0.9016100 0.7127242 1.1405542
##   Platform     1.8979389 1.5053210 2.3929595
##   Puzzle       1.1822264 0.8373708 1.6691044
##   Racing       1.0667513 0.8336371 1.3650525
##   Role-Playing 1.8822674 1.5365640 2.3057489
##   Shooter      1.5632219 1.2581172 1.9423173
##   Simulation   1.0064425 0.7507919 1.3491441
##   Sports       0.8781539 0.7152552 1.0781526
##   Strategy     0.4213406 0.2698438 0.6578914
## 
## $p.value
##               two-sided
##                  midp.exact fisher.exact   chi.square
##   Action                 NA           NA           NA
##   Adventure    5.474265e-11 7.931915e-11 2.295753e-09
##   Fighting     1.382112e-01 1.448059e-01 1.336648e-01
##   Misc         3.893658e-01 4.091922e-01 3.876902e-01
##   Platform     1.519331e-07 1.454075e-07 4.054096e-08
##   Puzzle       3.418437e-01 3.548919e-01 3.409501e-01
##   Racing       6.040068e-01 6.106748e-01 6.074596e-01
##   Role-Playing 1.973488e-09 2.291282e-09 6.380457e-10
##   Shooter      7.492518e-05 7.415607e-05 4.960491e-05
##   Simulation   9.558998e-01 9.404405e-01 9.657410e-01
##   Sports       2.143885e-01 2.335310e-01 2.142976e-01
##   Strategy     2.671572e-05 3.873131e-05 9.151526e-05
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Le top 10% des jeux les plus populaire sont les jeux de plateforme et de role-play qui sont proche de 90% de chance d’être plus populaire qu’un jeu d’action. (p-valeur significative)

tabPu<-table(jv2_I$Publisher,jv2_I$Succes_Top10)
oddsratio.wald(tabPu)
## $data
##               
##                    0    1 Total
##   Constructeur  1100  467  1567
##   Grand         7065  702  7767
##   Moyen         1996  100  2096
##   Petit         1546   32  1578
##   Total        11707 1301 13008
## 
## $measure
##               odds ratio with 95% C.I.
##                  estimate      lower      upper
##   Constructeur 1.00000000         NA         NA
##   Grand        0.23404575 0.20486428 0.26738391
##   Moyen        0.11800904 0.09393478 0.14825322
##   Petit        0.04875468 0.03379801 0.07033014
## 
## $p.value
##               two-sided
##                midp.exact  fisher.exact    chi.square
##   Constructeur         NA            NA            NA
##   Grand                 0  2.704066e-93 1.313272e-113
##   Moyen                 0  2.704544e-98  2.180371e-95
##   Petit                 0 9.394347e-117 8.148797e-101
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Les gros constructeurs prennent la part majoritaire des succès sur le marché. (5 fois plus que les grands éditeurs).

Graphique boite à moustache montrant la répartition des hits selon les éditeurs

library(ggplot2)
ggplot(jv2_I,aes(x=Publisher,y=log(popuG+1),fill=Publisher))+geom_boxplot() +
  labs(title="Distribution du succès par type d'éditeur",
       x="Catégorie d'Éditeur",y="Ventes (log scale)")+theme_minimal()

#log pour mieux voir les succès car c'est très écrasé proche de 0

Nous remarquons directement l’interêt de ce genre de visualisation. En effet on voit tout de suite que les “Constructeurs” ont une médiane de ventes bien plus haute et beaucoup d’outliers (les hits mondiaux).

On fait à present un glm par descente avec critère de sélection AIC/BIC

# Modèle Gamma (très adapté aux scores de ventes)
modele<-glm(popuG+10^(-6)~Year+Platform+Publisher+Periode,data=jv2_I,family=Gamma(link="log"))

summary(modele)
## 
## Call:
## glm(formula = popuG + 10^(-6) ~ Year + Platform + Publisher + 
##     Periode, family = Gamma(link = "log"), data = jv2_I)
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)    72.14079   19.01848   3.793 0.000149 ***
## Year           -0.03763    0.00957  -3.932 8.46e-05 ***
## Platform3DO    -1.05175    1.80562  -0.582 0.560246    
## Platform3DS     1.18506    0.36085   3.284 0.001026 ** 
## PlatformDC      0.58622    0.41018   1.429 0.152975    
## PlatformDS      0.71519    0.33512   2.134 0.032849 *  
## PlatformGB      1.33033    0.32906   4.043 5.31e-05 ***
## PlatformGBA     0.10422    0.33068   0.315 0.752649    
## PlatformGC     -0.15940    0.33349  -0.478 0.632681    
## PlatformGEN     0.75106    0.43436   1.729 0.083813 .  
## PlatformGG     -1.67959    1.79638  -0.935 0.349811    
## PlatformN64     0.32091    0.32801   0.978 0.327917    
## PlatformNES     1.19907    0.29001   4.135 3.58e-05 ***
## PlatformNG     -0.76824    1.80611  -0.425 0.670584    
## PlatformPC      0.45743    0.33934   1.348 0.177679    
## PlatformPS      0.78208    0.31009   2.522 0.011678 *  
## PlatformPS2     1.04935    0.32646   3.214 0.001311 ** 
## PlatformPS3     1.58815    0.34508   4.602 4.22e-06 ***
## PlatformPS4     2.13192    0.36887   5.780 7.66e-09 ***
## PlatformPSP     0.72688    0.33914   2.143 0.032106 *  
## PlatformPSV     0.79901    0.36524   2.188 0.028714 *  
## PlatformSAT     0.48384    0.32758   1.477 0.139688    
## PlatformSCD    -0.33691    0.76601  -0.440 0.660070    
## PlatformSNES    1.17920    0.28286   4.169 3.08e-05 ***
## PlatformTG16   -1.17353    1.80611  -0.650 0.515859    
## PlatformWii     1.17751    0.33977   3.466 0.000531 ***
## PlatformWiiU    0.84183    0.38315   2.197 0.028029 *  
## PlatformWS      0.50417    0.79106   0.637 0.523919    
## PlatformX360    1.34817    0.34221   3.940 8.20e-05 ***
## PlatformXB     -0.20634    0.33144  -0.623 0.533585    
## PlatformXOne    1.53630    0.37556   4.091 4.33e-05 ***
## PublisherGrand -1.15371    0.05112 -22.568  < 2e-16 ***
## PublisherMoyen -1.59451    0.06131 -26.009  < 2e-16 ***
## PublisherPetit -2.13020    0.06525 -32.647  < 2e-16 ***
## PeriodeHD      -0.24921    0.07287  -3.420 0.000629 ***
## PeriodeModerne -0.49526    0.12474  -3.970 7.22e-05 ***
## PeriodeRetro    0.10957    0.19540   0.561 0.574979    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Gamma family taken to be 3.172353)
## 
##     Null deviance: 28488  on 13007  degrees of freedom
## Residual deviance: 20898  on 12971  degrees of freedom
## AIC: -75571
## 
## Number of Fisher Scoring iterations: 10
n<-nrow(jv2_I)
best1<-step(modele) #AIC
## Start:  AIC=-75570.54
## popuG + 10^(-6) ~ Year + Platform + Publisher + Periode
## 
##             Df Deviance    AIC
## <none>            20898 -75571
## - Periode    3    20948 -75561
## - Year       1    20947 -75557
## - Platform  29    23330 -74862
## - Publisher  3    24780 -74353
best2<-step(modele,k=log(n))
## Start:  AIC=-75294.03
## popuG + 10^(-6) ~ Year + Platform + Publisher + Periode
## 
##             Df Deviance    AIC
## - Periode    3    20948 -75307
## <none>            20898 -75294
## - Year       1    20947 -75288
## - Platform  29    23330 -74802
## - Publisher  3    24780 -74099
## 
## Step:  AIC=-75284.31
## popuG + 10^(-6) ~ Year + Platform + Publisher

modele est déjà un très bon modèle par critère de descente AIC , le critère BIC nous indique que l’on peut enlever la variable de période ce qui améliorera le modèle.

Ainsi la variable Période (en comparaison avec les autres variables) n’explique pas suffisament bien la popularité d’un jeu.

à présent on s’intéressera à une regression logistique sur la variable créer ci-dessus (succès top 10%) pour determiner les variables qui influence un jeu à être un top jeu 10%.

modeleLog<-glm(Succes_Top10~Platform_Group+Publisher+Periode+Support_Type,data=jv2_I,family=binomial)

summary(modeleLog)
## 
## Call:
## glm(formula = Succes_Top10 ~ Platform_Group + Publisher + Periode + 
##     Support_Type, family = binomial, data = jv2_I)
## 
## Coefficients:
##                         Estimate Std. Error z value Pr(>|z|)    
## (Intercept)             -3.04877    0.29630 -10.289  < 2e-16 ***
## Platform_GroupMicrosoft  1.33995    0.29311   4.571 4.84e-06 ***
## Platform_GroupNintendo   1.55901    0.27895   5.589 2.28e-08 ***
## Platform_GroupPC         0.65371    0.33679   1.941   0.0523 .  
## Platform_GroupSony       1.72945    0.28418   6.086 1.16e-09 ***
## PublisherGrand          -1.34209    0.07187 -18.675  < 2e-16 ***
## PublisherMoyen          -2.02679    0.11947 -16.965  < 2e-16 ***
## PublisherPetit          -2.97292    0.18985 -15.659  < 2e-16 ***
## PeriodeHD                0.03491    0.06957   0.502   0.6158    
## PeriodeModerne           0.02484    0.11777   0.211   0.8330    
## PeriodeRetro             2.13666    0.15475  13.807  < 2e-16 ***
## Support_TypeSalon        0.60780    0.08300   7.323 2.43e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 8458.2  on 13007  degrees of freedom
## Residual deviance: 7410.6  on 12996  degrees of freedom
## AIC: 7434.6
## 
## Number of Fisher Scoring iterations: 6

On peut remarquer ici un effet big three des plateformes (Sony , Nintendo et Microsoft)

La hiérarchie impitoyable des Éditeurs : Les constructeurs se voient avoir un succès écrasant , les Grand éditeurs ont 5 fois moins de succès et pour les petits nous tombons à 5% de leurs parts.

Le facteur “Salon” Retour en force : un jeu étant sur un support salon favorise la qualité d’un jeu à être un succès.

L’exception “Rétro” : c’est une nuance subtile, à cette époque il n’y avait moins de jeu mais ils avaient tendance à plus facilement être des succès ce qui n’est plus le cas dans notre époque moderne du jeu vidéo. (Il n’y avait pas à l’époque l’installation actuelle/La grande place qu’a pris les jeux vidéos dans la vie des Hommes).

On effectue la comparaison entre console de salon et console portable

jv2_I$Support_Type<-as.factor(jv2_I$Support_Type) #Car variable binaire pour regression logistique 

modeleSupport<-glm(Support_Type~Publisher+Genre+Periode+popuG,
                   family=binomial,data=jv2_I)

summary(modeleSupport)
## 
## Call:
## glm(formula = Support_Type ~ Publisher + Genre + Periode + popuG, 
##     family = binomial, data = jv2_I)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)        1.09071    0.08096  13.473  < 2e-16 ***
## PublisherGrand     0.30018    0.06595   4.552 5.32e-06 ***
## PublisherMoyen     0.50166    0.08057   6.226 4.78e-10 ***
## PublisherPetit    -0.24402    0.08242  -2.961 0.003069 ** 
## GenreAdventure    -0.61851    0.08553  -7.231 4.78e-13 ***
## GenreFighting      0.49369    0.10822   4.562 5.07e-06 ***
## GenreMisc         -0.25718    0.07324  -3.511 0.000446 ***
## GenrePlatform     -0.56010    0.09090  -6.162 7.19e-10 ***
## GenrePuzzle       -1.46837    0.12055 -12.181  < 2e-16 ***
## GenreRacing        0.52477    0.09472   5.540 3.02e-08 ***
## GenreRole-Playing -0.56275    0.07514  -7.489 6.92e-14 ***
## GenreShooter       1.29919    0.11218  11.582  < 2e-16 ***
## GenreSimulation   -0.49367    0.09167  -5.385 7.23e-08 ***
## GenreSports        0.55406    0.07276   7.615 2.63e-14 ***
## GenreStrategy     -0.03727    0.10600  -0.352 0.725127    
## PeriodeHD         -0.82542    0.04707 -17.534  < 2e-16 ***
## PeriodeModerne    -0.38612    0.07846  -4.921 8.60e-07 ***
## PeriodeRetro       1.15010    0.19210   5.987 2.14e-09 ***
## popuG              1.07515    0.34627   3.105 0.001903 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 16013  on 13007  degrees of freedom
## Residual deviance: 14466  on 12989  degrees of freedom
## AIC: 14504
## 
## Number of Fisher Scoring iterations: 5

On retrouve ici une claire tendance entre console de salon et console portable.

Ces deux manières de jouer trouvent des utilisations différentes.

En effet les jeux de tir sont plus souvent de salon car plus adapté à l’être (necessite des capacités et équipement adapté sur une console de salon et offre donc une meilleure expérience de salon).

On voit également les jeux de sport , de combat de course qui sont beaucoup plus des jeux de console de salon (Proche de 2 fois plus de jeu de ces genre sont de salon).

Pour ce qui est des coefficients négatifs dans ce modèle on retrouve les jeux de puzzle ,aventure , plateforme , RPG et simulation qui sont donc des jeux qui se voient être plus joué sur console portable puisque ce sont des jeux rapides sans prise de tête ne necessitant pas forcément l’experience et l’installation d’une console de salon.

D’un point de vue des éditeurs on retrouve que les moyens , constructeurs et grand éditeurs ont un coefficient positif donc ils favorisent des sorties de jeux sur console de salon (ca peut s’expliquer puisque ces éditeurs privilégie le multiplateforme et également avec leurs moyens et leurs visibilités , ils peuvent se permettre de voir plus ambitieux et grand).

Cependant les petits éditeurs ont tendance à privilégier des sorties portable (coût de developpement plus bas , accessible plus facilement, barrière d’entrée plus simple)

Si l’on considère maintenant les période du jeu vidéo on retrouve que l’époque retro se hisse au sommet avec une présence dominante des jeux sur consoles de salon.

On trouve ensuite un coefficient négatif à l’ère HD qui est l’époque des DS/PSP d’ou cette ère met en lumière les consoles portables qui deviennent une forme de révolution dans le jeu.

Ensuite on retrouve une même tendance pour l’époque moderne mais qui s’est beaucoup plus atténuée (-0.8 -> -0.38) ce qui montre que le portable garde de sa présence même si cette présence diminue. Cette base de donnée ne montre pas le passage à l’ère du mobile avec des jeux comme clash of clan , clash royal , subway surfer , doodle jump , ce qui pourrait augmenter la cote du mobile face au salon.

On retiendra que le choix de la plateforme (salon/portable) n’est pas une conséquence du hasard , un petit éditeur voulant developper un puzzle game se verra mal se lancer sur du salon en essayant de concurencer d’autres jeux plus complexes et innovants sur ce support.

Pour finir la variable de popularité dans ce modèle indique que la probabilité qu’un jeu soit un jeu de salon augmente son nombre de vente mondial. Plus un jeu à l’ambition d’être un carton , un succès massif , plus il a des chance d’être un jeu de salon.

Ainsi le portable se voit considérer des jeux à succès plus modeste puisque plus niche en globalité.

Pour conclure j’aimerai faire une ouverture de ce sujet en apportant une visualisation des corrélations par région.

library(corrplot)

Corr<-cor(jv[,c("NA_Sales","EU_Sales","JP_Sales","Other_Sales")])
corrplot(Corr,method="color",addCoef.col="black",type="upper",title="Corrélation des ventes par région")

Pour conclure le salon et le portable offre des expériences totalement différentes et se voient dans cette branche du jeu vidéo être adapté à différent style de jeu , d’envie du moment , de la facilité à être mis en place. On pourrait aller plus loin dans cette étude si l’on avait à disposition de nouvelles variables comme par exemple des notes de joueur , le temps de jeu , la difficulté des jeux, la capacité (nombre de personne pouvant jouer) mais également les prix des jeux consoles sur le marché primaire et secondaire et aussi pourquoi pas les exigences d’âge pour jouer ou la présence plus ou moins développer de compétition dans ces jeux.

Ce graphique des corrélation pourrait également nous questionner sur la place du Japon dans cette industrie du jeu vidéo puisque le japon ne semble pas être très bien corrélé au marché du jeu dans les autres région.

Ce cas précis donne donc de l’intêret pour ainsi pouvoir comprendre en quoi , en quel mesure le Japon est il si différent.

2. Justification des modifications et du modèle choisi

(Détaillez le choix des individus, des variables et la nature du modèle)

J’ai décidé de segmenter les variables dont les modalités sont intéressantes dans ce contexte et donc par conséquent qui ne mérite pas d’être simplement supprimé.

J’ai donc décidé de joindre les années en époque définissant des ères dans le jeu vidéo , de regrouper les éditeurs les plus gros (>50) en groupes de popularité (Petits/Moyens/Grands studios).

J’ai aussi choisi de regrouper les plateforme en groupe de plateforme pour réduire la masse de donnée (considérer Wii et Wii U comme étant nintendo par exemple).

J’ai choisi de faire un modèle logistique pour la variable console de salon ou console portable puisque qu’il s’agit d’une variable binaire.

De plus une variable essentiel à été la variable de score sur laquelle j’ai éffectué un modèle de regression gamma , Ce choix s’est fait puisque la variable score a tendance à prendre énormément de petite valeurs (proche de 0 puisque la plupart des jeux ne sont pas très populaire face à d’autres dans ce jeu de données).

Cette variable score m’a permis de définir différentes variables binaire de succès avec une frontière de décisision basé sur la valeur du quartile choisi.

Ces différentes variables binaires nous ont donc permis d’établir des analyses des jeux vidéos selon leurs caractéristiques pour ainsi pouvoir imaginer pourquoi tel type de jeu a tendance à être un succès et pas un autre.