Pourcentage par catégorie

Cette semaine, le #Tidytuesday nous fourni une base de données de 500 mots de passe les plus populaires issus de différents sites comme Facebook, Hotmail et Yahoo entre autres. Les mots de passe ont été rendus disponibles via Wikipedia.



CONTEXTE

Les données de cette semaine proviennent de Knowledge is Beautiful et un article sur le sujet peut être trouvé ici.



OBJECTIFS

  1. Visualiser le niveau de sécurité des mots de passes en fonction des catégories.



IMPORTER

passwords <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-01-14/passwords.csv')
FALSE Parsed with column specification:  
FALSE cols(  
FALSE   rank = col_double(),  
FALSE   password = col_character(), 
FALSE   category = col_character(),  
FALSE   value = col_double(),  
FALSE   time_unit = col_character(),  
FALSE   offline_crack_sec = col_double(),  
FALSE   rank_alt = col_double(),  
FALSE   strength = col_double(),  
FALSE   font_size = col_double()  
FALSE )



EXPLORER

summary(passwords)
##       rank         password           category             value         
##  Min.   :  1.0   Length:507         Length:507         Min.   : 1.290    
##  1st Qu.:125.8   Class :character   Class :character   1st Qu.: 3.430    
##  Median :250.5   Mode  :character   Mode  :character   Median : 3.720    
##  Mean   :250.5                                         Mean   : 5.603    
##  3rd Qu.:375.2                                         3rd Qu.: 3.720    
##  Max.   :500.0                                         Max.   :92.270    
##  NA's   :7                                             NA's   :7         
##   time_unit         offline_crack_sec     rank_alt        strength       
##  Length:507         Min.   : 0.00000   Min.   :  1.0   Min.   : 0.000    
##  Class :character   1st Qu.: 0.00321   1st Qu.:125.8   1st Qu.: 6.000    
##  Mode  :character   Median : 0.00321   Median :251.5   Median : 7.000    
##                     Mean   : 0.50001   Mean   :251.2   Mean   : 7.432    
##                     3rd Qu.: 0.08350   3rd Qu.:376.2   3rd Qu.: 8.000    
##                     Max.   :29.27000   Max.   :502.0   Max.   :48.000    
##                     NA's   :7          NA's   :7       NA's   :7         
##    font_size     
##  Min.   : 0.0    
##  1st Qu.:10.0    
##  Median :11.0    
##  Mean   :10.3    
##  3rd Qu.:11.0    
##  Max.   :28.0    
##  NA's   :7
glimpse(passwords)
## Observations: 507  
## Variables: 9  
## $ rank              <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…  
## $ password          <chr> "password", "123456", "12345678", "1234", "qwe…  
## $ category          <chr> "password-related", "simple-alphanumeric", "si…  
## $ value             <dbl> 6.91, 18.52, 1.29, 11.11, 3.72, 1.85, 3.72, 6.…  
## $ time_unit         <chr> "years", "minutes", "days", "seconds", "days",…  
## $ offline_crack_sec <dbl> 2.17e+00, 1.11e-05, 1.11e-03, 1.11e-07, 3.21e-…  
## $ rank_alt          <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,…  
## $ strength          <dbl> 8, 4, 4, 4, 8, 4, 8, 4, 7, 8, 8, 1, 32, 9, 9, …  
## $ font_size         <dbl> 11, 8, 8, 8, 11, 8, 11, 8, 11, 11, 11, 4, 23, …



PRÉPARER

plt1 <-passwords %>%
     filter(strength<=10& strength>=1) %>%
     ggplot(aes(x=" ", y = strength)) +
     geom_boxplot(fill = "#FFFFFF", color = "black") +
     coord_flip() +
     theme_classic() +
     xlab("") + 
     ylab("strength")+ 
     theme(axis.text.y=element_blank(),
          axis.ticks.y=element_blank())    

plt2 <-passwords %>%
    filter(strength<=10 & strength>=1) %>%
    ggplot() +
    geom_histogram(aes(x = strength, y = (..count..)/sum(..count..)),
                         position = "identity", binwidth = 1,
                          fill = "#FFFFFF", color = "black") +
    ylab("Fréquence Relative")+
    xlab("")+
    theme_classic()+
    theme(axis.text.x = element_blank())+
    theme(axis.ticks.x = element_blank())  

plt2 + plt1 + plot_layout(nrow = 2, heights = c(2, 1))

data<-passwords %>%
     filter(strength<=10 & strength>=1)

data<-passwords %>% 
    filter(strength<=10 & strength>=1) %>%
          mutate(force=case_when(strength >= 8 ~ "fort",
                                 strength <= 6 ~ "mauvais",
                                 strength >6 & strength<8 ~ "Moyen")) %>%
   count(category, force) %>%
   spread(force, n) %>%
   mutate(pct_fort=fort/(fort+Moyen+mauvais)*100) %>%
   mutate(pct_moyen=Moyen/(fort+Moyen+mauvais)) %>%
   mutate(pct_mauvais=mauvais/(fort+Moyen+mauvais)) %>%
   filter(!category=="food")



VISUALISER

#Graphique  
gg<- ggplot(data=data,aes(x = pct_fort, y=reorder(category, pct_fort), group=category))  
gg <- gg +  geom_point(color="#ffffff",fill="#F7B32B", size=17, pch=21)  
gg <- gg + geom_segment( aes(x=0, xend=100,y=category, yend=category),
                             color="#838A90", alpha=0.6, size=4)  
gg <- gg + geom_segment( aes(x=0, xend=100,y=category, yend=category),
                             color="#ffffff", alpha=1, size=0.5)  
gg <- gg +  geom_point(color="#ffffff",fill="#F7B32B", size=18, pch=21)  
#Changer les étiquettes de l'axe des y  
gg <- gg +  scale_y_discrete(labels=c("Alphanumérique", "Vulgaire", "Léger", "Relié au mot de passe","Animal", "Nom", "Cool", "Sport", "Pop"))  
#ajouter les étiquettes de points  
gg<-gg + geom_text(data=data, aes(x=pct_fort, y=category, label=(paste0(round(data$pct_fort,0),"%")), group=NULL), color="#ffffff", size=4.5, vjust=0.5, hjust=0.5, fontface="bold")  
#modifier le thème  
gg <- gg +  theme(plot.background = element_rect(fill = "#173f50"),
                    panel.background = element_rect(fill = "#173f50"),
                    panel.grid.major.y= element_blank(),
                    panel.grid.major.x= element_blank(),
                    panel.grid.minor = element_blank(),
                    axis.line.x = element_blank(),
                    axis.line.y =element_blank(),
                    axis.ticks.x = element_blank(),
                    axis.ticks.y = element_blank())
#ajouter les titres 
gg<-gg + labs(title="Ne choisissez pas un mot de passe alphanumérique!",
              subtitle = "\nIls sont faciles  à deviner. Si  vous voulez vraiment choisir un  mauvais mot de passe,  optez plutôt pour un style\nproche de la pop comme «starwars» ou «matrix». Ils sont les meilleurs parmi les pires que vous puissiez choisir.\n",
                x="% de mot de passe les plus sécuritaire pour chaque catégorie",
                 y=" ",
                 caption="\nSOURCE: Knowledge is Beautiful   |  DESIGN: Johanie Fournier, agr.")  
gg<-gg + theme(    plot.title    =  element_text(size=26.4, hjust=1,vjust=0.5, color="#FFFFFF", family="Tw Cen MT", face="bold"),
                   plot.subtitle = element_text(size=13.1, hjust=1,vjust=0.5, color="#FFFFFF", family="Tw Cen MT"),
                   plot.caption  = element_text(size=10, hjust=1,vjust=0.5, color="#FFFFFF", family="Tw Cen MT"),
                   axis.title.x  = element_text(size=12, hjust=0.05,vjust=0.5, color="#FFFFFF", family="Tw Cen MT", angle =0),
                   axis.title.y  = element_blank(),
                   axis.text.y   = element_text(size=13, hjust=0,vjust=0.5, color="#FFFFFF", family="Tw Cen MT"),
                   axis.text.x   = element_text(size=12, hjust=0.5,vjust=0.5, color="#FFFFFF", family="Tw Cen MT"))    

Voici ce que ça donne:





Alors, tu veux en savoir plus sur ma démarche? Abonne-toi à mon infolettre pour savoir quand est-ce que le prochain épisode de podcast sera disponible. J’y expliquerai toute la réflexion et les concepts de data visualisation qui ont menés à la création de cette viz.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.