Dans ce document, nous présentons notre étude sur des données concernant des films et des acteurs aux Etats-Unis dans le cadre du projet données ouvertes.
Dans une première partie, nous faisons de la prédiction de notes de films en utilisant plusieurs variables quantitatives. Nous implémentons plusieurs méthodes dont nous comparons les performances en calculant l’erreur absolue moyenne. Dans une seconde partie, nous nous intéressons au réseau des acteurs en étudiant les communautés et les éléments centraux.
Nous avons récupéré nos données via le site IMBD : International Movie Database. Ces données se trouvent dans trois tables. La première comprend les films américains, et se présente comme suit.
Ce jeu de données possède \(134049\) observations de \(10\) variables :
tconst
correspond à l’identifiant unique IMBD du film.primaryTitle
correspond au titre utilisé pour faire la promotion du film.originalTitle
correspond au titre d’origine dans la langue d’origine du film.isAdult
indique si le film est destiné à un public adulte ou non.startYear
correspond à l’année de parution du filmruntimeMinutes
est la durée du film en minutesgenres
est une liste pouvant contenir jusqu’à 3 éléments indiquant les genres principaux du film.isOriginal
est un booléen indiquant si le titre du film est bien le titre d’origine.averageRating
est la note moyenne décernée par les utilisateurs du site IMBDnumVotes
est le nombre de notes données à un film.Le jeu de données suivant contient les informations des acteurs.
Ce jeu de données possède \(244002\) observations de \(7\) variables :
nconst
est l’identifiant unique d’un acteur.primaryName
comprend le nom et prénom d’un acteur.birthYear
est l’année de naissance d’un acteur.deathYear
est l’année de décès d’un acteur.primaryProfession
est une liste pouvant contenir jusqu’a 3 métiers d’un acteur.knownForTitles
est une liste pouvant contenir jusqu’a 4 identifiants de films pour lesquels l’acteur est connu.M0F1
vaut 0 pour un acteur et 1 pour une actrice.Enfin, le dernier jeu de données fait le lien entre les deux jeux de données précédents, et permet ainsi de relier les films et les acteurs.
Pour chaque film identifié par tconst
, nconst
est l’identifiant d’un acteur qui a joué dans ce film. De plus, on a aussi l’information du personnage joué avec characters
. La clé de cette table est donc le couple tconst
, nconst
. Il y a \(821438\) lignes dans ce jeu de données.
En joignant ces trois jeux de données avec la librairie tidyverse, nous avons pu créer \(5\) colonnes supplémentaires dans la table des films, qui sont des indicateurs par rapport aux acteurs qui jouent dans ces films :
made_known
est le nombre d’acteurs qui sont connus pour avoir joué dans un film.moy_age
est la moyenne d’âge des acteurs d’un film.sd_age
est l’écart-type des âges des acteurs d’un film.nb_act
est le nombre d’acteurs qui jouent dans un film (non exhaustif).prop_fem
est la proportion d’actrices qui jouent dans un film.Dans cette partie, nous présentons quelques visualisations afin de se faire une première idée des données.
Nombre de films par an
On peut tout d’abord s’intéresser au nombre de films par an.
Nous présentons ici l’évolution du nombre de films qui sortent au cinéma par an. On peut ainsi voir la naissance du cinéma fin du XIXème siècle, début XXème. S’en suit une période qui correspond à l’essor du cinéma jusqu’aux années \(2000\) à partir desquelles le nombre de films par années explose. Enfin à partir de \(2020\), on remarque une chute qui est expliquée par l’arrivée du corona virus.
Distribution de la durée des films
Nous nous posons maintenant la question de la distribution de la durée des films.
Nous avons décidé de retirer les \(5\)% de films qui durent plus de \(200\) minutes. On observe un pic très important pour \(90\) minutes, et on remarque que la plupart des films se concentrent autour de \(90\) mintues.
Durée moyenne des films par an
A présent, nous voulons étudier l’évolution de la durée moyenne des films en fonction des années.
On remarque que dans un premier temps, la durée moyenne des films est très volatile. Cela est du au fait que peu de films sont réalisés, et donc un film a beaucoup de poids. A partir des années \(30\), on observe une uniformisation ainsi qu’une constante augmentation des durées jusqu’aux années \(60\) à partir desquelles la durée moyenne des films reste constante vers les \(90\) minutes.
Dans cette partie, nous implémentons des algorithmes pour prédire les notes moyennes des films. Nous faisons deux modèles. Le premier comprends toutes les variables dont on dispose. Le second, plus réaliste, se repose seulement sur les variables dont on dispose avant qu’un film sorte.
Le critère de performance que nous évaluons pour ces méthodes est le MSE. Ce critère est facilement interprétable sur nos données : c’est la distance absolue moyenne entre les prédictions et les vraies valeurs des notes moyennes.
Nous présentons d’abord les données utilisées pour faire de la prédiction. Nous avons trouvé un autre jeu de données qui complète notre jeu de données sur les films en y ajoutant beaucoup de variables. Ces dernières nous semblent avoir des potentiels prédictifs. Seulement, il ne contient que \(5000\) films auxquels on décide donc de se restreindre. Aussi, nous conservons seulement les variables numériques.
## [1] "made_known" "moy_age"
## [3] "sd_age" "nb_act"
## [5] "prop_fem" "startYear"
## [7] "runtimeMinutes" "averageRating"
## [9] "numVotes" "num_critic_for_reviews"
## [11] "director_facebook_likes" "actor_3_facebook_likes"
## [13] "actor_1_facebook_likes" "gross"
## [15] "cast_total_facebook_likes" "facenumber_in_poster"
## [17] "num_user_for_reviews" "budget"
## [19] "actor_2_facebook_likes" "aspect_ratio"
## [21] "movie_facebook_likes"
Voici les nouvelles variables que l’on possède :
num_critic_for_reviews
le nombre de critiques de journalistes d’un filmdirector_facebook_likes
le nombre de mentions “J’aime” sur la page Facebook du directeur d’un filmactor_n_facebook_likes
le nombre de mentions “J’aime” sur la page Facebook du nième acteur principal d’un film (avec n=1,2,3)cast_total_facebook_likes
la somme des nombres de mentions “J’aime” sur les pages Facebook des membres du casting d’un filmmovie_facebook_likes
le nombre de mentions “J’aime” sur la page Facebook d’un filmgross
les recettes d’un filmfacenumber_in_poster
le nombre de visages présents sur l’affiche d’un filmnum_user_for_reviews
le nombre de commentaires d’internautes sur un filmbudget
le budget d’un filmaspect_ratio
le ratio de l’image d’un filmEtude des corrélations
Nous commençons par une étude des corrélations entre les variables.
On peut voir deux groupes de variables. Tout d’abord, on a les variables de type mention “J’aime” Facebook des acteurs qui sont fortement corrélées positivement entre elles. Ensuite, un autre groupe comporte plusieurs variables, dont la note moyenne, qui sont corrélées positivement entre elles. On pense donc qu’il est envisageable de construire un modèle de prédiction des notes moyennes avec ces variables. Les variables corrélées positivement avec la note moyenne sont :
numVotes
runtimeMinutes
num_user_for_reviews
num_critic_for_reviews
movie_facebook_likes
gross
made_known
director_facebook_likes
Les corrélations ne sont pas très fortes mais il y a quand même un certain lien. Peut-être que des liens non linéaires existent et ne sont donc pas visibles ici.
Analyse en composante principales
Nous réalisons maintenant une Analyse en Composantes Principales sur les films. Nous n’utilisons pas la variable des notes moyennes pour réaliser l’ACP, mais colorons les points représentant les films en fonction de leurs notes moyennes. Pour cela on définit trois groupes interprétables et avec des effectifs proches : les films qui ne sont pas une franche réussite (note moyenne strictement inférieure à \(6\)), les films qui sont plutôt bien appréciés par le public (note moyenne entre \(6\) inclu et \(7\) exclu), et les films à grand succès (note moyenne supérieure ou égale à \(7\)). Voici la répartition des classes :
On procède à l’ACP :
On s’intéresse au premier plan factoriel. Voici le graphique des variables :
On représente uniquement les variables qui ont une contribution de plus de 0.6. Sur le plan \(1\) - \(2\) qui porte \(34.77\)% de l’inertie, \(2\) groupes de variables se distinguent. En haut a droite se trouvent les variables de type mention “J’aime”, liées à facebook. Comme on l’avait noté sur le cercle des corrélation, ces variabes sont très liées entre elles. On trouve cette information ici. Ensuite, le deuxième groupe se trouve dans le cadran droite bas. Il s’agit des variables qui correspondent à l’avis des spectateurs. Ces groupes de variables ont un angle proche de \(90\) degrés et sont presque indépendants.
Nous voulons voir si cette projection permet de séparer les différents groupes de notes moyennes en nous penchant sur le graphe des individus.
Au vu de ce graphique, on remarque que les films à grand succès se trouvent en grande partie en bas à droite. D’après notre analyse du cercle des variables, ces films correspondent à ceux pour lesquels il y a le plus de votes et de commentaires des internautes, et de critiques que dans la moyenne du jeu de données. C’est l’information que l’on avait aussi retenue de la matrice des corrélations : numVotes
, num_user_for_reviews
et num_critic_for_reviews
faisaient partie des quatre variables les plus corrélées avec la note moyenne.
Les films qui se situent en haut à droite et qui ont donc des valeurs supérieures à la moyenne du jeu de données pour les variables liées à facebook font partie en majorité des groupes de films plutôt bien appréciés ou à grand succès. Ces informations n’apparaissaient pas dans la matrice des corrélations.
Les autre plans factoriels ne permettent pas d’obtenir d’information supplémentaire notable par rapport au premier plan et à la matrice des corrélations.
Premier modèle avec toutes les variables
Le premier modèle décrit plus haut est implémenté pour les méthodes suivantes :
On construit \(50\) découpages aléatoires des données en ensembles d’apprentissage et de test. Pour chaque découpage, on implémente les différentes méthodes, et on récupères les valeurs des erreurs absolues moyennes (MAE) dont on calcule la moyenne. On compare à la fin les erreurs à l’aide d’un graphique récapitulatif.
On voit que les forêts aléatoires sont meilleures dans notre cas pour faire de la prédiction. Leur MAE ne dépasse pas \(0.5\) avec ces découpages. C’est-à-dire que l’écart moyen entre les prédictions et les notes moyennes réelles n’a dépassé \(0.5\) pour aucun des découpages. A l’inverse, les MAE obtenus avec les trois autres méthodes sont toujours supérieurs à \(0.5\). Ces autres méthodes ont l’air équivalentes, avec les arbres de régression qui ont l’air légèrement moins performants.
Deuxième modèle plus réaliste
Nous implémentons ici les mêmes méthodes que précédemment mais en utilisant une base de données restreinte : nous cherchons à savoir si on peut faire de la prédiction de notes avec seulement les variables dont on dispose avant qu’un film ne sorte dans la vraie vie. Nous avons donc retiré de la base de données les variables suivantes :
made_known
le nombre d’acteurs qui sont connus pour avoir joué dans un filmnumVotes
le nombre de votes des internautes pour un filmgross
les recettes brutes d’un filmnum_user_for_reviews
le nombre de commentaires des internautes pour un filmVoici le graphique récapitulatif des erreurs :
Encore une fois, c’est les forêts aléatoires qui font les meilleures prédictions, et les arbres de régression qui sont légèrement moins performants que les deux autres méthodes.
Dans cette partie, nous reprenons le jeu de données initial des acteurs. Nous considérons le graphe suivant :
Nous avons choisi un seuil de \(3\) après en avoir essayé plusieurs, car il était le meilleur en terme de conservation de l’information (un seuil plus grand entraîne une composante connexe principale qui contient trop peu de communautés différentes) et d’interprétabilité (un seuil plus petit entraîne une composante connexe principale qui contient un trop grand nombre (plus de \(1000\)) de communautés différentes).
Voici une représentation de ce graphe :
Le graphe n’est pas connecté. On voit qu’il existe beaucoup de composantes connexes. En effet, elles correspondent à des groupes d’acteurs qui ont joué de nombreuses fois ensemble sans jamais (ou moins de \(3\) fois) sortir de leur cercle. C’est notamment le cas pour des groupes d’acteurs étrangers dont les films ont été diffusés aux Etats-Unis, ou dont certains acteur ont joué moins de \(3\) fois avec des acteurs des Etats-Unis.
On décide de se concentrer sur la plus grosse composante connexe qui contient la plupart des acteurs des Etats-Unis.
Nous nous intéressons aux communautés des acteurs dans cette composante connexe et tentons de les interpréter. Nous voulons aussi nous pencher sur la centralité de certains acteurs dans cette composante connexe. A partir de maintenant, nous désignons par le mot graphe le sous graphe qu’est cette composante connexe.
Nous utilisons le logiciel Tulip et son implémentation de l’algorithme de Louvain pour définir des communautés dans notre graphe. Cet algorithme maximise la modularité, qui correspond à la densité des liens à l’intérieur des communautés par rapport à la densité des liens entre les communautés. La modularité est donc une mesure qui traduit de la qualité de la partition. Elle prend des valeurs entre \(-1\) et \(1\).
L’algorithme de Louvain définit \(36\) communautés dans le graphe. La modularité pour ces communautés est de \(0.768\) ce qui témoigne d’une bonne partition. Voici une représentation du graphe avec les communautés colorées :
On distingue bien les différentes communautés et des groupes de communautés. Certains groupes de communautés sont reliées par très peu d’acteurs. C’est en lien direct avec la valeur élevée de la modularité du graphe. On peut interpréter cela de la façon suivante : beaucoup d’acteurs jouent souvent avec les mêmes personnes, et peu d’acteurs jouent assez souvent avec les mêmes personnes pour apparaître dans le graphe, tout en variant assez pour faire les liens entre les communautés. On peut s’attendre à ce que ce soit des acteurs populaires. Aussi, comme on peut s’attendre à des communautés en partie définies par les différentes générations d’acteurs, on peut imaginer que les acteurs populaires qui font les liens sont populaires sur une longue durée.
Pour avoir une meilleure lisibilité des liens entre les communautés, nous représentons le graphe des communautés. Dans ce graphe, un sommet représente une communauté. Une arête entre deux sommets témoigne d’un lien entre deux éléments de ces communautés.
Le graphe des communautés nous semble faire apparaître plusieurs groupes de communautés. Nous avons regardé les caractéristiques des acteurs composant ces différents groupes. Nous avons distingué \(4\) groupes de communautés :
Les seconds rôles importants et les acteurs les plus populaires font le lien entre les trois groupes périphériques décrits plus haut. Ce sont les pierres angulaires de notre réseau. Nous allons étudier leur centralité dans la partie suivante.
Nous voulons dans cette partie illustrer l’importance de la centralité de certains sommets. Un sommet central est un sommet pour lequel la suppression entraîne des changements importants dans le graphe.
Pour cela, on calcule la centralité de chaque sommet. On supprime successivement les sommets de plus forte centralité. A chaque fois, on regarde le nombre de sommets dans la plus grande composante connexe du graphe par rapport au nombre de sommets du graphe. Cela nous permet de nous rendre compte de l’importance d’un sommet à faire le lien entre des composantes connexes.
Il existe plusieurs mesures de centralité pour le sommet d’un graphe. Nous en utilisons \(6\) :
Nous comparons les résultats obtenus avec ces différentes métriques quand on supprime \(500\) sommets successivement dans le graphe :
Les profils de courbes sont différents car d’une métrique à l’autre, ce qui fait qu’un élément est central diffère. On ne supprime donc pas les mêmes sommets à chaque fois pour les différentes métriques.
Après \(500\) itérations, la méthode qui a le mieux cassé le graphe est la centralité vecteur propre. On s’attendait à ce que l’excentricité ait de bonnes performances d’après sa définition. Il n’est pas surprenant que le degré ne soit pas dans les méthodes les plus performantes car dans notre graphe, les sommets qui font les liens entre les communautés ont un faible degré. Enfin, la centralité de proximité a de mauvais résultats pour cette tâche car elle supprime les sommets qui sont au centre de communautés denses.
Voici une représentation du graphe après avoir appliqué cet algorithme avec la méthode vecteur propre :
On voit que certains groupes de communautés ont pu se détacher. Deux cassures à droite se sont pas visibles sur la représentation. Il y a aussi beaucoup de cassures qui s’opèrent dans la communauté rose. On peut donc réussir avec la bonne mesure de centralité à séparer automatiquement certains groupes de communautés en enlevant des éléments centraux, mais cette séparation n’est pas optimale. Il est possible au vu du graphe de séparer les communautés en enlevant peu d’éléments. Cependant, la difficulté ici est de modéliser la bonne mesure de centralité qui permet de détecter ces éléments qui font les ponts entre les communautés.
Pour conclure, nous avons pu dans le cadre de ce projet utiliser plusieurs méthodes vues en cours pendant notre master. Nous avons utlisé les outils Python, R et Tulip.
Une première phase conséquente de notre travail consistait au pré-traitement des données afin d’obtenir des jeux de données exploitables pour nos idées. Face à la taille des jeux de données, nous avons rencontré des limites en termes de temps d’exécution.
Nous avons réussi à mettre en oeuvre les idées principales émises au début du projet, ainsi que celles qui ont émergé en chemin. Nous avons implémenté plusieurs modèles pour faire de la prédiction de notes moyennes des films. Les forêts aléatoires ont été plutôt concluantes. Nous avons également pu faire des interprétations de communautés dans le graphe des acteurs et travailler sur la centralité.
Nous avons pensé à faire de la classification sur les acteurs pour comparer les communautés obtenues mais manquons de variables sur les acteurs. Nous avons pensé à en créer mais la difficulté vient du manque de variables quantitatives dans les jeux de données.
Nous avons aussi eu des idées que nous avons décidé de ne pas retenir afin de consacrer notre temps à celles décrites plus haut. Parmi celles-ci, il y a le graphe des acteurs dans lequel une arête entre deux acteurs traduit le fait qu’ils sont connus pour avoir joué dans un film en commun (variable known_for_titles
). Cette représentation aurait permis une analyse et une interprétation différentes. Il y a aussi la prédiction des recettes brutes d’un film. Aussi, nous avons pensé à inclure les variables qualitatives dans nos modèles de prédiction. Par exemple, on pense que les acteurs qui jouent dans les films, ou bien le genre du film peuvent avoir de bons potentiels prédictifs pour les notes moyennes des films.
Finalement, nous sommes contents d’avoir pu choisir un jeu de données que nous avons exploité en mettant en place un panel de méthodes apprises cette année. Nous avons pu faire de manière satisfaisante le travail que nous avions imaginé, malgré le temps qui nous était imparti.