Exercice

Transcription

Exercice
Correction du contrôle continu, Master 1 MIASHS, 25 novembre 2015, 1h30 minutes
Prénom, nom : Correction
À faire :
• dans le nom de ce fichier, vous changez Prenom et Nom par votre prénom et votre nom ;
• vous répondez dans ce fichier ; vos réponses s'affichent en noir.
• à l'issue du contrôle, vous envoyez le pdf de ce fichier à [email protected]
Exercice
Chargez le fichier se trouvant à l'url
http://www.grappa.univ-lille3.fr/~ppreux/ensg/miashs/m2/tps/cc1/movies.ods
Ce fichier contient des informations concernant des films. Les attributs sont :
• identificateur du film
• titre du film
• date de sortie du film
• url dans la base de données IMDb
• puis 19 attributs indiquant le genre du film :
• inconnu
• Action
• Aventure
• Animation
• Enfants
• Comédie
• Crime
• Documentaire
• Drame
• Fantaisie
• Film-Noir
• Horreur
• Musical
• Mystère
• Romance
• Science-Fiction
• Suspense
• Guerre
• Western
Si ce champ vaut 1, ce genre est associé au film ; s'il vaut 0, il ne l'est pas.
Question 1. quelle commande tapez-vous pour charger ce fichier dans un data frame en R ?
On ouvre movie.ods avec libreoffice et on le sauve au format csv en indiquant bien qu'il faut mettre
le contenu des cellules contenant du texte entre doubles-quotes (Quote all text cells dans la version
anglaise de libreoffice).
Ensuite, sous R, on tape :
movies <­ read.csv ("movies.csv")
Question 2. quelle commande R utilisez-vous pour connaître :
le nombre de lignes ?
nrow (movies)
le nombre de colonnes (attributs) ?
ncol (movies)
le nom des attributs ?
names (movies)
Question 3.
Le premier attribut est un nombre ; le deuxième est une chaîne de caractère ; le troisième est une
date ; le quatrième est une chaîne de caractères ; les 19 suivants sont des valeurs logiques (TRUE
ou FALSE).
Quelle(s) commande(s) tapez-vous pour que les données soient du type correct dans R ?
movies$id <­ as.numeric (movies$id)
movies$title <­ as.character (movies$title)
movies$release.date <­ as.date (movies$release.date, format = "%d­%m­%Y")
movies$IMDb.URL <­ as.character (movies$IMDb.URL)
for (col in 5:ncol (movies)) movies [, col] <­ as.logical (movies [, col]) À la place de la boucle, on peut traiter les attributs un par un. Heureusement qu'il n'y en a pas trop...
J'ai vu la réponse suivante :
movies [, 5:23] <- as.logical (movies [, 5:23])
c'est une bonne idée, mais ça ne fonctionne pas : as.logical fonctionne sur un vecteur, par sur une
matrice.
Question 4. Comment réalisez-vous un graphique indiquant le nombre de films présents dans ce jeu
de données qui sont sortis année par année ? Un graphique comme celui-ci :
On commence par créer un attribut contenant l'année. On fera :
movies$year <­ unclass (as.POSIXlt (movies$release.date))$year + 1900
puis on fait le graphique sur la table de contigence :
year.table <­ table (movies$year) plot (year.table, main = "Nombre de sorties de films par année",
xlab = "Année", ylab = "Nombre de sorties")
Question 5. Quelle(s) commande(s) tapez-vous pour calculer le nombre de films par année et par
genre ? Le résultat doit se trouver dans une matrice. Cette matrice aura autant de lignes qu'il y a
d'années représentées dans le jeu de données et autant de colonnes qu'il y a de genres. (S'il n'y a
pas de films pour une certaine année, cette année ne doit pas apparaître dans la matrice.)
Il y a plusieurs manière de faire. Par exemple :
nb.films.par.annee.et.genre ← matrix (0, nrow = length (year.table), ncol = 19) les.annees ← as.numeric (names (year.table)) for (y in 1:length (year.table)) for (g in 1:19) nb.films.par.annee.et.genre [y, g] <­ length (which ((movies$year == les.annees [y]) & movies[, g + 4] == 1))) Question 6. On souhaite réaliser un graphique qui montre l'évolution du nombre de films pour
chacun 6 des genres (Aventure, Comédie, Crime, Drame, Horreur, Science-Fiction), soit un
graphique ressemblant à celui ci-dessous.
Comment faites-vous ?
On peut faire comme suit pour avoir une solution qui permet
les.genres <­ c ("inconnu", "Action", "Aventure", "Animation", "Enfants", "Comedie", "Crime", "Documentaire", "Drame", "Fantaisie", "Film­Noir", "Horreur", "Musical", "Mystère", "Romance", "Science­Fiction", "Suspense", "Guerre", "Western") ss.genres <­ c (3, 6, 7, 9, 12, 16) op <­ par(mfrow = c (3, 2)) palette <­ rainbow (6) max.m <­ max (m [, ss.genres]) for (i in 1:6) { plot (les.annees, m [, ss.genres [i]], ylim = c (0, max.m), main = les.genres [ss.genres [i]], xlab = "Année", type = "l", ylab = "Nombre d'occurences", col = palette [i]) } Question 7. Quelle(s) commande(s) tapez-vous pour réaliser le graphique suivant qui indique le
nombre de films pour chaque genre.
Il faut d'abord connaître le nombre de films par genre. Avec la matrice calculée précédemment, c'est
très simple : il suffit de faire la somme de chacune des colonnes :
nb.films.par.genre <­ colSums (nb.films.par.annee.et.genre)
Si on ne connaît pas la fonction colSums, il faut faire la même chose sans l'utiliser :
nb.films.par.genre <­ rep (0, times = length (les.genres))
for (g in 1:length (les.genres)) {
nb.films.par.genre [g] <­ length (which (movies [g + 4] == TRUE))
}
Et ensuite, on peut faire le graphique :
plot (1:19, colSums(m), type = "h", xlab = "Genres", ylab = "Nombre de films",
main = "Nombre de films par genre")
text (1:19, nb.films.par.genre + 20, les.genres, cex = .75) Question 8. On veut utilisez les informations sur le genre pour faire des recommendations. Étant
donné un film, on veut recommender un ou des films ayant le même genre. Par exemple, si on
considère le premier film, il est associé aux genres Animation, Enfants, et Comédie. On cherche
donc les films ayant les mêmes genres.
Comment faites-vous pour déterminer les films ayant les mêmes genres qu'un film donné ?
Quels sont les films ayant les mêmes genres que les films 1, 120 et 1234 ?
Remarque : on ne peut pas utiliser la fonction knn() que l'on a vu ensemble pour répondre à cette
question. Savez-vous expliquez pourquoi ? Si oui, faites-le.
Pour déterminer les films ayant les mêmes genres qu'un film donné : par exemple, on considère le
film d'indice ind, on écrira par exemple :
ind <­ 1
meme.genre.que.ind <­ rep (FALSE, times = nrow (movies))
for (film in 1:nrow (movies))
meme.genre.que.ind [film] <­ all (movies [film, 5:23] == movies [ind, 5:23]) which (meme.genre.que.ind == TRUE)
Pour le film 1, cela donne le film 120 (et le 1).
Pour le film 120, cela donne les films 194, 248, 481, 1495 et 1533.
Pour le film 1234, cela donne les films 130, 308, 546, 843, 990, 1010, 1080, 1150, 1186, 1244,
1279, 1389, 1509, 1559 et 1605.
On ne peut pas utiliser knn() car il s'agît ici d'attributs booléens et non pas quantitatifs.
Question 9. On s'intéresse encore à la recommendation de films. Cette fois-ci, on cherche des films
ayant le plus de genres en commun avec un film donné. Comment faites-vous ? (Expliquez d'abord
puis indiquez comment vous faites en R)
Au lieu de rechercher les films qui ont exactement les mêmes genres que le film de référence
(comme à la question 8), on cherche les films ayant les mêmes genres et d'autres éventuellement en
plus.
On pourra écrire :
ind <­ 120
nb.genre.identique.a.ind <­ rep (FALSE, times = nrow (movies))
nb.genres.ind <­ length (which (movies [ind, 5:23] == TRUE))
for (film in 1:nrow (movies))
meme.genre.que.ind [film] ←
length (which ((movies [ind, 5:23] == TRUE) &
(movies [film, 5:23] == movies [ind, 5:23])))
which (meme.genre.que.ind == nb.genres.ind)

Documents pareils