Hito 3 Hito 2 Hito 1 Home

Hito 3: Caracterización y análisis de películas de IMDB

CC5206 Semestre Primavera 2021

Integrantes: Alan Acevedo, Camila Labarca, Franco Miranda, Julia Paredes

Grupo: 4

Profesores: Andrés Abeliuk, Hernán Sarmiento

Auxiliares: Alison Fernández, Cinthia Sánchez

Fecha de entrega: 20 de diciembre de 2021

Introducción

En la última década, el mercado de las películas y series ha crecido enormemente gracias a los avances tecnológicos y a plataformas online como Netflix, Hulu, Amazon, Disney+, entre otras. Este tema puede ser bastante interesante de analizar ya que prácticamente todas las personas están familiarizadas con éste ámbito.

El objetivo de este proyecto es aplicar distintas técnicas de minería de datos para realizar un estudio sobre un dataset obtenido de la Internet Movie Database que contiene información sobre películas. Los resultados le podrían ser de bastante utilidad a aspirantes en el mundo del cine, pues les daría una amplia imagen de la industria cinematográfica, y junto con ello entender su comportamiento.

Mejoras al Hito 1

Las mejoras que se realizarán al Hito 1 son principalmente 2. La primera, es que no solo se tendrá en cuenta la información de las películas, sino que también de los actores, directores y escritores que participaron en ellas, por lo que a la tabla que se había obtenido en el Hito 1 se le agregará esta información. Y la segunda, es que habiendo actualizado el dataset se refinarán las preguntas planteadas al final del Hito 1.

Dataset

Se trabajó con el dataset de IMDB, el cual está distribuido en 7 tablas en formato TSV, de las cuales se ocuparán cinco.

La tabla title_basics contiene varios atributos de interés sobre títulos:

La tabla title_ratings contiene dos atributos interesantes:

La tabla title_crew contiene dos atributos de interés:

La tabla title_principals tiene cinco atributos relevantes:

La tabla name_basics contiene cinco atributos importantes:

Se importan las librerías necesarias.

Se importan los datasets necesarios.

Luego, los atributos que correspondan se cambian a categóricos o a númericos

title_basics tiene 8.246.400 filas.

Para ver cuántos elementos sin valores asignados hay en las tablas se usa la siguiente línea:

La columna runtimeMinutes tiene 5.920.699 valores no asignados, lo que corresponde a un gran porcentaje del total de filas. También hay 971.886 valores nulos en startYear. Estos atributos son de interés y podrían ser usados en el estudio, por lo que se hará una limpieza del dataset.

Se realizará un estudio de los datos relacionados a películas, por lo que se filtrará para quitar los títulos de tipo documental o cortometraje, y además solo se considerarán las películas con géneros válidos.

El nuevo dataframe tiene 516.492 filas.

Ahora se puede volver a ver cuantos elementos tienen valores no asignados.

Después de la limpieza de valores nulos, title_basics tiene 340.916 filas. Sigue siendo un número importante de datos que pueden ser estudiados por lo que no es necesario considerar los valores nulos.

Como ya se filtró según la columna titleType, ésta se elimina del dataframe. Además, endYear es siempre \N para las películas, por lo que no entregan información y se eliminan del dataframe. Por último se elimina la columna originalTitle ya que no es de interés (es el nombre de la película en el idioma original).

Se hace un join de las tablas only_movies y title_ratings para que cada película tenga su valoración promedio y cantidad de valoraciones.

Columnas nuevas

Se crea una nueva tabla que será el join de movies y title_crew por la variable tconst, el identificador de cada película.

Se tiene que trabajar un poco para que aparezcan los nombres de los directores.

Como se obtuvieron los nombres de los directores para cada película, basta unir esta tabla con la original.

Se hace el mismo proceso anterior para los escritores.

Se unen las tablas y se elimina una columna innecesaria

Falta vincular los actores con sus películas. Para ello, se debe trabajar de una forma distinta pues el formato de la tabla en donde se encuentran los actores es distinto al resto.

Se muestran todos los actores para una película en concreto, por lo tanto, hay que juntar las tablas, eliminar las filas con algún NA (ya sea de director, escritor o actor) y con esto se tiene toda la información.

Se puede ver que efectivamente no hay filas con algún valor nulo.

No hay nulos en ninguna columna, por lo que el dataframe está completamente limpio.

Luego de haber limpiado el dataset, se puede hacer un summary para analizar si hay algún dato inconsistente.

En startYear se muestran años desde 1906 hasta el año actual, no existen películas en años futuros por lo que está correcta esta columna. En runtimeMinutes existen películas con 1 minuto de duración y con más de 43 mil minutos de duración, estos valores posiblemente sean outliers y entonces se pueden trabajar sin problemas. Los valores de la columna averageRating se mueven entre 1 y 10 lo que es consistente. Por último, la columna numVotes se mueve entre valores positivos y entonces es consistente.

A partir de ahora solo se trabajará con esta tabla, por lo cual se reemplazará la variable movies y se liberará la memoria ocupada por la importación de las otras tablas.

En la tabla movies hay una columna “genres” que lista hasta 3 géneros de una misma película, éstos se pueden separar para hacer más sencillo el estudio. Se considerará el primer género como el principal.

Ahora se analizarán las películas exitosas y películas muy malas. Para ello, se mostrarán los deciles que corresponden a rating y número de votos. Con ello, se definirá una película exitosa la que esté sobre el decil 9 en ambas categorías, y una película muy mala será aquella bajo el decil 1 para rating.

Vistos los deciles, se define una película exitosa como toda película que tiene un rating promedio de al menos 7.5 y una cantidad de votos mayor o igual a 2481. También, se define una película muy mala como toda película que tenga un rating inferior o igual a 4.3

A partir de esto, se puede ver qué porcentaje de películas del total puede considerarse exitosa.

Solo el 1.67% de películas puede considerarse exitosa, que corresponde a un porcentaje muy bajo, lo que puede hablar de que es muy difícil crear una película y que ésta sea exitosa.

También, se puede ver qué porcentaje del total de películas corresponde a películas muy malas.

Un 10.77% de las películas es muy mala, un porcentaje bastante mayor al de películas exitosas, lo que habla de que es mucho más sencillo crear una película muy mala a una que tenga éxito.

Se puede analizar cuantas películas exitosas y cuantas muy malas tienen contenido explícito:

Hay muchas películas malas en comparación a las exitosas que tienen contenido explícito, lo que puede significar que las películas con contenido explícito tienen mayor probabilidad de no tener éxito. Esto puede deberse a la misma razón mencionada anteriormente, es decir, que estas películas están hechas para un público más pequeño y específico, por lo que no serán bien recibidas por todos y todas.

Luego de realizar el análisis anterior, se puede consultar sobre un top 10 de películas mejor y peor calificadas a partir de 1970, esto último para solo considerar películas contemporáneas.

Podemos notar que tanto en las mejores como en las peores hay muchas películas de los últimos años. Esto podría deberse a que en los últimos años se han votado las películas que han salido y esos datos se han guardado en el dataset de forma correcta, lo que puede no haber sido así para películas más antiguas.

A continuación se definen funciones que pueden ser útiles para el análisis de los datos.

Luego de haber definido las funciones, se pueden realizar algunas consultas interesantes, como ver qué porcentaje de películas exitosas o muy malas corresponde a cierto género.

Porcentaje de películas de un género que son exitosas.

Porcentaje de películas de un género que son muy malas.

Comparando ambos resultados, lo primero que se destaca es que no hay películas para adultos exitosas y sí lo hay en películas muy malas, lo que confirma lo dicho en un punto anterior. También, en ambos casos el género “Drama” es el que más aparece, seguido por “Comedy”, y por "Romance" en las películas exitosas y “Action” en las películas malas, esto puede dar a entender que se realizan muchas películas de estos géneros porque son géneros populares, y por ende hay muchas que son tanto exitosas como muy malas. Se puede notar que hay un alto porcentaje de películas del género “Romance” que son exitosas, sin embargo este número disminuye bastante en las películas muy malas, lo mismo ocurre con “Crime”.

Se realizará un gráfico de densidad que mostrará cómo se distribuyen los rating para todas las películas.

Analizando el gráfico junto con el promedio y desviación estándar para el rating, se puede notar que el gráfico se asemeja bastante a una distribución normal con media 6 y desviación estándar 1.28. El valor de la densidad aumenta levemente hasta llegar a su máximo, para luego caer rápidamente, esto significa que hay muy poca cantidad de películas con rating sobre el promedio en comparación a películas con rating bajo el promedio.

Se crearán boxplots de ratings para géneros utilizando dos métodos. Primero, se creará un boxplot si es que la película es de un único género, y segundo, en caso de que el título esté asociado a más de un género, se creará un boxplot solo considerando el primer género de la lista, esto para ver si hay mayores diferencias a cuando el género es único o no. Se analizará para los géneros “Action”, “Drama” y “Comedy” y se diferenciará por contenido explícito.

Boxplots para “Action”

En este caso, no se ven cambios respecto a cuando “Action” es el género principal de una película o no.

Boxplots para “Drama”

En este caso, si la película no es para adultos no se ven cambios, pero de serlo, la distribución cambia, ésta se traslada un poco hacia abajo, lo que significa que el primer, segundo y tercer cuartil de ratings son más bajos.

Boxplots para “Comedy”

En este último caso se ven cambios tanto si la película es para adultos como si no. Cuando no es para adultos, el tercer cuartil se desplaza un poco para abajo y hay más outliers superiores, mientras que cuando es para adultos, el boxplot se desplaza bastante hacia abajo, y se puede concluir lo mismo que para el género anterior.

Se pueden realizar gráficos de dispersión para analizar la relación entre ciertas variables. En particular, se analizará la relación entre rating y duración, y rating y cantidad de votos para los géneros “Action”, “Drama”, “Comedy”.

Gráficos de dispersión entre rating y duración.

Luego de realizar el gráfico de dispersión entre rating y duración de las películas para los 3 géneros, se puede notar que los 3 son bastante similiares, aunque en el caso de "Drama" hay varios puntos con un rating relativamente alto que tienen mayor duración. Para ninguno de los 3 casos parece haber una relación clara entre las variables.

Gráficos de duración entre rating y cantidad de votos.

Con los gráficos de dispersión entre rating y cantidad de votos se puede ver una clara tendencia, a partir del rating 5.0 aproximadamente comienza a haber un mayor número de votos, lo cual hace sentido, pues si una película es bien calificada más gente se verá interesada en seguir votándola.

Con los valores numéricos del dataset se puede crear una matriz de correlación. Para ver si el título de la película tiene alguna correlación con otra variable se usará el largo del título.

La mayor correlación que existe es entre el rating y el número de votos, lo que es consistente con lo dicho anteriormente, pero aun así sigue siendo un valor extremadamente pequeño (ni siquiera 0.1). Entonces, se puede decir que todas las variables son prácticamente independientes entre sí.

Reformulación de preguntas y problemas

Luego de haber agregado las columnas correspondientes a directores, escritores y actores para cada una de las películas, ahora se reformularán las preguntas y problemas. Para estas preguntas se definió éxito como la valoración y popularidad como la cantidad de votos.

Propuesta experimental

Funciones útiles

Antes de responder las preguntas, se definirán algunas funciones que serán de utilidad.

Para las funciones de etiquetado se utilizarán los cuartiles de cada atributo. Por ejemplo, el cuartil 1 del rating es 5.3, el cuartil 2 es 6.1 y el cuartil 3 es 6.9. De esta forma, quedan 4 clases bastante equilibradas y por lo tanto no es necesario realizar over/sub sampling.

La función run_classifier corre un clasificador cierto número de veces y va guardando sus resultados en un arreglo.

La función sim_matrix crea la matriz de similitud.

La función plot será de utilidad para graficar la matriz de similitud.

Pregunta 1

Pre - procesamiento

Se etiquetan los directores y géneros. Para ello, se crea una tabla en donde, si una película tiene m directores y n géneros, esa fila se separará en m*n filas en la nueva tabla.

Luego, se agregan las etiquetas de popularidad, largo del título y duración para cada fila.

Luego de haber etiquetado los datos necesarios, se clasificarán los datos utilizando varios métodos y calculando su precision, recall y F1-Score. Si alguno de estos valores entrega un valor mayor o igual a un 75% se dirá que sí se puede predecir.

La idea a seguir será realizar un cierto número de tests con distintos training set, y el valor de precision, recall y F1-Score será el promedio de todos los valores calculados.

Con lo siguiente se puede ver que las clases de las últimas 3 etiquetas asignadas están bien balanceadas:

Resultados

Se realizará la predicción del éxito usando las etiquetas del director, del género, de duración, del largo del título y de la popularidad. No se utilizan ni actores ni escritores porque no son relevantes para el estudio, y tampoco si la película tiene contenido para adultos o no, porque hay un gran desbalance entre ambas clases.

Se utilizará un Dummy Classifier, un Decision Tree, K-Nearest Neighbors y Gaussian Naive-Bayes para realizar la predicción.

Luego de probar con distintos clasificadores, es evidente que no es posible predecir el éxito de una película en base a sus atributos, pues el mejor resultado es solo un 41%.

Pregunta 2

Pre - procesamiento

Para generar los clusters, se etiquetaron el año, la duración, los géneros, el rating y la cantidad de votos. La nueva tabla quedó con estos atributos y con todos los datos etiquetados.

Resultados

Ahora con los datos etiquetados se procedió a generar los clusters usando K-means. Para esto, se hizo el gráfico de SSE de 1 a 15 clusters, y con ello usar el método del codo para elegir la cantidad de clusters óptima.

Al ver el gráfico del método del codo se puede notar que el número óptimo de clusters es 2, por lo que se generaron los 2 clusters usando K-means.

Visualmente no se ve ningún cluster claro, aunque tampoco parece muy correcta la división en 2 clusters.

Finalmente se usó el coeficiente de Silhouette para evaluar los clusters generados.

Según este resultado y a partir del gráfico se puede concluir que K-means no es el mejor método para generar los clusters.

Para la siguiente parte se trataron de generar los clusters usando clustering jerárquico aglomerativo. Sin embargo, dadas las dimensiones del dataframe no se logró hacer esto con todos los datos, ya que se caía con un MemoryError. Entonces, se decidió evaluar con solo una parte de los datos.

Luego de probar con particiones más grandes y fallar con el mismo error anterior se decidió generar los clusters con un 1% de los datos. A continuación se muestran los resultados:

A partir de estos gráficos se generaron los distintos clusters y se evaluaron con la matriz de similitud, excepto para linkage single ya que en este caso no se pueden apreciar los grupos correctamente.

A partir de los resultados de clustering jerárquico aglomerativo se puede concluir que este método tampoco fue capaz de generar los clusters correctamente. A pesar de que los clusters se separan claramente en general, como se puede ver en la matriz de similitud, no se puede apreciar ningún patrón entre los clusters generados. Vale recordar que puede ser que este resultado se vea afectado por solo estar considerando el 1% de los datos y no el total.

Finalmente, se usará el método DBSCAN para generar los clusters. Por el mismo problema anterior esto se hace con solo un 10% de los datos y nuevamente se evaluará con el coeficiente de silhouette.

Como se puede notar, el eps es 0, por lo que podemos inferir que los datos están repartidos sin orden alguno, y es por esto que no hay clusters en este dataset. De igual manera se continuará con DBSCAN y un eps muy pequeño.

Este resultado se produjo tras elegir un eps muy pequeño, con el cual se interpreta como que cada punto es su propio cluster, y que por ende en realidad no hay ningún cluster, por lo que el hecho de que este coeficiente tienda a 1 significa que los clusters están bien asignados, y entonces los datos debiesen estar distribuidos de manera aleatoria. También, hay que considerar que solo se tomó el 10% de los datos, por lo que puede ser que este resultado no sea fiable completamente.

Pregunta 3

Pre - procesamiento

Para realizar el pre-procesamiento necesario para esta pregunta se define la función etiquetarPresenciaActor, que lo que hace es etiquetar si un actor está presente en una película.

Para ello, se pasa el nombre del actor, el año en que inició su carrera y el año en que la terminó, ambos parámetros opcionales. Las películas anteriores a cuando comenzó su carrera y posteriores a cuando terminó su carrera directamente se sabe que el actor no está, entonces luego solo basta recorrer las que quedaron viendo si el actor está o no. Todo este proceso se hace por razones de eficiencia.

Resultados

Se puede analizar para cualquier nombre de actor, a modo de ejemplo, se hace con Brad Pitt que empezó su carrera en el año 1987 y a día de hoy no ha terminado.

Se usarán los mismos clasificadores que en la pregunta 1 para realizar la predicción. Si alguno de los valores es mayor o igual a 75% entonces se dirá que se puede predecir, en caso contrario no lo será.

Se utilizará la etiqueta de la presencia de un actor junto a la etiquetas del largo del título, del año, de la duración y del éxito.

Luego de haber probado con los distintos clasificadores, es claro que no se puede saber si la presencia de Brad Pitt junto a otros atributos es relevante a la hora de predecir la popularidad de una película, pues el mejor resultado fue de un 42%.

Conclusiones generales

Al obtener el dataset, no hubieron mayores problemas a la hora de hacer la limpieza de los datos ni la exploración, pues los métodos de pandas para limpiar, obtener un resumen de los datos, y a partir de ahí explorar, facilitaban mucho el trabajo. La exploración de datos aporta mucha información sobre cómo es el dataset y qué datos contiene.

Por otro lado, al momento de realizar los experimentos, existió un problema que fue crucial. Como son más de 200 mil tuplas, para realizar el Clustering Jerárquico Aglomerativo y DBSCAN no se pudo trabajar con los datos completos, sino solo con samples muy pequeños (1% y 10% de los datos, respectivamente), lo que hace que los resultados obtenidos muy posiblemente no sean los esperados.

Se realizó un buen trabajo de etiquetado de los datos para obtener clases balanceadas y no verse en la necesidad de usar over/sub sampling, pues al utilizar los cuartiles de cada uno de los atributos a etiquetar, todas las clases quedaron con aproximadamente la misma cantidad.

Los mejor podría haber sido comenzar realizando la limpieza de los datos y el etiquetado, para luego quitar filas de cada una de las clases y de esa forma obtener un dataset final más pequeño, con todas las clases balanceadas, para poder correr todos los algoritmos de clustering con todo el dataset y obtener resultados más fiables.

Planificación futura

Si se contara con más tiempo, se podría explorar el rendimiento de los modelos haciendo una selección más prudente de los atributos, en vez de utilizar la mayor cantidad, con el fin de obtener mejores resultados que sean más cercanos a la realidad. Tambien, en este proyecto se consideraron sólo aquellas filas correspondientes a películas. Sería interesante también trabajar con otros tipos de metrajes que se encuentran en el dataset y que no fueron considerados, como documentales, series, etc. Con esto, se podría explorar preguntas relacionadas al tipo de metraje, como por ejemplo si para cierto género suele ser más atractivo un tipo u otro, o comparar el rendimiento entre directores que crean un sólo tipo de metraje versus los que crean de varios.

Contribución de cada miembro

Alan Acevedo:

Hito 1: Obtención y limpieza de datos. Presentación.

Hito 2: Preprocesamiento de los datos. Propuestas experimentales. Corregir hito 1 según feedback.

Hito 3: Etiquetado de datos. Desarrollo de las preguntas 1 y 3. Planificación futura. Presentación.

Camila Labarca:

Hito 1: Gráficos de dispersión, largo de titulo para matriz de correlación, formulación de preguntas y problemas. Presentación.

Hito 2: Preprocesamiento de los datos. Propuestas experimentales. Corregir hito 1 según feedback.

Hito 3: Etiquetado de datos. Desarrollo pregunta 2. Presentación.

Franco Miranda:

Hito 1: Análisis de mejores y peores películas . Funciones para gráficos. Preguntas y problemas. Presentación.

Hito 2: Preprocesamiento de los datos. Diseño de clasificadores. Propuestas experimentales. Corregir hito 1 según feedback.

Hito 3: Etiquetado de datos. Desarrollo de las preguntas 1 y 3. Conclusiones generales. Presentación. Mejoras a página web.

Julia Paredes:

Hito 1: Análisis y exploración de datos, formulación de preguntas y problemas. Presentación.

Hito 2: Traducción preprocesamiento de datos hito 1 de R a python. Diapositivas. Propuestas experimentales. Corregir hito 1 según feedback.

Hito 3: Etiquetado de datos. Desarrollo pregunta 2. Diapositivas y presentación.