# I - Transformer des chaines de caractères en facteurs # ----------------------------------------------------- # importer la dataframe mi mi <- read.csv(file = "../data/mi.csv", row.names = "X", stringsAsFactors = FALSE) # faire un barplot avec Income barplot(table(mi$Income)) # La classe (0-1000] est à droite alors qu'elle serait mieux placée à gauche. # Pour le moment, le vecteur mi$Income contient des chaines de caractères # (normal, puisque l'on a utilisé l'argument stringsAsFactors = FALSE dans la fonction read.csv()!) str(mi$Income) # On va donc utiliser la fonction factor() pour transformer les chaines de caractères en facteur, # et on utilise l'argument levels pour ordonner de la manière souhaitée les différents "niveaux". # Ici, on place bien la classe [0-1000] avant les autres afin de retrouver un ordre plus logique. # Note : Dans ce cas, on crée un nouvelle colonne (Incomef), mais il est tout à fait possible de faire # la même opération sur la colonne d'origine (Income) mi$Incomef <- factor(mi$Income, levels = c("[0-1000]", "(1000-2000]", "(2000-3000]", "(3000-inf]")) # Pour vérifier que l'on n'a pas échangé des niveaux ou autres erreurs de manipulation table(mi$Income, mi$Incomef) # Il est possible de changer le nom des niveaux. # Attention toutefois à respecter l'ordre entre les anciens et nouveaux noms. mi$Incomef2 <- mi$Incomef levels(mi$Incomef2) <- c("low", "med_low", "med_high", "high") # Toujours pour vérifier la correspondance entre ancienne et nouvelle nomenclature table(mi$Income, mi$Incomef) # Si on veut changer l'appellation d'un niveau en particulier (ici, le niveau n°4) levels(mi$Incomef2)[4] <- "very_high" # Toujours pour vérifier si la modification est bien celle voulue table(mi$Incomef, mi$Incomef2) # Passer des chaines de caractère aux facteurs # permet d'ordonner ces derniers de la manière souhaitée. # Maintenant, dans le graphe, les différentes classes # respectent l'ordre croissant des revenus. barplot(table(mi$Incomef)) # II - Changer une variable numérique en catégorielle # --------------------------------------------------- # On utilise la fonction cut() # (voir ?cut pour les détails) # Ici, on crée une nouvelle colonne 'Age_cl' # dans laquelle les valeurs de la colonne 'Age' vont être assignées # à une des 4 classes créées par la fonction et l'argument '4'. mi$Age_cl <- cut(mi$Age, 4) # La fonction cut crée des classes qui sont des facteurs str(mi$Age_cl) # On peut donc maintenant faire des tables de contingence table(mi$Age_cl) # Inspection des colonnes désirées # -> accès aux premières ligne du tableau avec la fonction head # (ici, on visualisera les 10 premières lignes) head(mi[, c("Age", "Age_cl")], 10) # -> accès aux dernières ligne du tableau avec la fonction tail # (ici, on visualisera les 10 dernières lignes) tail(mi[, c("Age", "Age_cl")], 10) # Il est possible d'utiliser la fonction cut avec les arguments # "breaks" (et "labels") pour déterminer (et nommer) les classes à créer. mi$Age_cl2 <- cut(mi$Age, breaks = c(0, 10, 20, 40, 50, 100), labels = paste("age", 1:5, sep = "_") ) # Table de contingence table(mi$Age_cl2) # Inspection des colonnes désirées head(mi[, c("Age", "Age_cl", "Age_cl2")], 10) # III - Quelques exemples de graphiques avec ggplot2 # -------------------------------------------------- # install.packages("ggplot2") # Si la la librairie n'est pas encore installée # première étape : charger la librairie. library(ggplot2) # 1 - scatter plot BMI~Age ggplot(data = mi, aes(x = Age, y = BMI)) + geom_point() # Colorier les points en fonction du genre ggplot(data = mi, aes(x = Age, y = BMI)) + geom_point(aes(color = Sex)) # Colorier les points en fonction du genre # + faire un graph par genre ggplot(data = mi, aes(x = Age, y = BMI)) + geom_point(aes(color = Sex)) + facet_wrap(~Sex) # Colorier les points en fonction du genre # + faire un graph par genre (séparation horizontale) # et par statut "Smoking" (séparation verticale) ggplot(data = mi, aes(x = Age, y = BMI)) + geom_point(aes(color = Sex)) + facet_grid(Smoking~Sex) # Colorier les points en fonction du genre, # leur donner une taille en fonction de OwnsHouse, # une forme en fonction de LivesWithKids, avec transparence (alpha = 0.5) # + faire un graph par genre (séparation horizontale) # et par statut "Smoking" (séparation verticale) # + ajout de lignes verticales (geom_vline()) et horizontales (geom_hline()) # avec choix de couleurs et de styles de ligne # + modification de l'aspect par l'ajout d'un thème ggplot(data = mi, aes(x = Age, y = BMI)) + geom_point(aes(color = Sex, size = OwnsHouse, shape = LivesWithKids), alpha = 0.5) + guides(color = "none", shape = "none", size = "none") + geom_hline(yintercept = c(24, 27), linetype = "dashed", color = c("red", "green")) + geom_vline(xintercept = c(30, 50), linetype = c("dashed", "dotted"), color = "blue") + theme_classic() # 2 - barplot ggplot(data = mi, aes(Incomef)) + geom_bar() # 3 - boxplot # a ggplot(data = mi, aes(y = Age)) + geom_boxplot() # b ggplot(data = mi, aes(x = Sex, y = Age)) + geom_boxplot() # c avec les points superposés au boxplot # (alpha = 0.75, rend les points légèrement transparents (0=100% transparent, 1=0%)) ggplot(data = mi, aes(x = Sex, y = Age)) + geom_boxplot() + geom_jitter(height = 0, width = .25, alpha = 0.75) # 4 - violin plot # L'argument draw_quantiles = 0.5 permet de matérialiser la ligne médiane ggplot(data = mi, aes(x = Sex, y = Age)) + geom_violin(draw_quantiles = 0.5) # 5 - histogramme # L'argument bins, permet de choisir la taille des classes ggplot(mi, aes(Age)) + geom_histogram(fill = "white", color = "black", bins = 10) # IV - Utilisation de plusieurs critères pour sélectionner les lignes # ------------------------------------------------------------------- mi_susbset <- mi[(mi$Age > 25 & mi$OwnsHouse == "Yes" & mi$Smoking == "Never"),] # Ici, on sélectionne uniquement les individus de plus de 25 ans, # possédant une maison et n'ayant jamais fumé. # V - Dataframe avec NA # --------------------- v1 <- 1:5 v2 <- 1:10 df <- data.frame(v1, v2) # ne fonctionne pas car les 2 vecteurs n'ont pas la même longueur # Trichons un peu et changeons la longueur du plus petit vecteur # pour qu'il ait la taille du plus grand. length(v1) <- length(v2) df <- data.frame(v1, v2) # Maintenant, ça fonctionne. # Inspection de la data frame créée. # Elle n'est pas bien grande, on peut l'afficher complètement. df # Si on fait des opération sur la colonne contenant des NA, on peut avoir un résultats non souhaités mean(df$v1) # Dans la plupart des fonctions de calcul de R, # il y a une option pour savoir comment les NA doivent être considérés. # Ici, dans la fonction mean, l'argument na.rm = TRUE # permet de ne pas prendre en compte les NA pour le calcul de la moyenne. mean(df$v1, na.rm = TRUE)