Skip to content

Analizaremos el listado de películas en IMDb. Columnas: Title,IMDb Rating,Year,Certificates,Genre,Director,Star Cast,MetaScore,Duration (minutes)

# Capturamos los archivos CSV para crearlos como DataFrames
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
imdb_1 = pd.read_csv("IMDb_Dataset.csv")
imdb_2 = pd.read_csv("IMDb_Dataset_2.csv")
# Unimos ambos DataFrames para el análisis
imdb = pd.concat([imdb_1, imdb_2], ignore_index=True).sort_index()
print(imdb.head())

Pregunta 1: ¿Cuál fue la película mejor valorada cada año?

# Creamos una variable que captura las columnas Title, IMDb Rating, Year
IMDb_title_rat_year = imdb[["Title", "IMDb Rating", "Year"]]
      
# Para cada año, capturamos el valor máximo de la columna IMDb Rating
# Identificamos cuáles fueron los mejores rating por año
best_rating_per_year = IMDb_title_rat_year.groupby("Year")["IMDb Rating"].idxmax().reset_index()
# Selecciona las filas correspondientes a este rating
max_ratings_per_year = IMDb_title_rat_year.loc[best_rating_per_year["IMDb Rating"], ["Year", "Title", "IMDb Rating"]].reset_index(drop=True).sort_values("Year")

# Presentamos las mejores películas por año
print(max_ratings_per_year)
# Graficamos el resultado
# Para una mejor visualización, acortaremos los datos entre 1940 y 1980
max_ratings_per_year_40_80 = max_ratings_per_year[(max_ratings_per_year["Year"] >= 1940) & (max_ratings_per_year["Year"] <= 1980)]

# Ajustar el tamaño de la figura
plt.figure(figsize=(12, 6)) 

# Puntos y línea de intersección a lo largo del gráfico
plt.plot(max_ratings_per_year_40_80["Year"], max_ratings_per_year_40_80["IMDb Rating"], marker='o', linestyle='-', color='b')

# Añadir etiquetas de los ejes
plt.xlabel("Year", fontsize=14)
plt.ylabel("IMDb Rating", fontsize=14)

# Añadir un título más descriptivo
plt.title("Highest IMDb Movie Rating Per Year [1940 - 1980]", fontsize=16)

# Añadir una cuadrícula
plt.grid(True, linestyle='--', alpha=0.7)

# Ajustar los ticks del eje x para que se muestren de manera legible
plt.xticks(max_ratings_per_year_40_80["Year"], rotation=90)

# Añadir anotaciones para puntos de datos específicos si es necesario
for i in range(len(max_ratings_per_year_40_80)):
    plt.text(max_ratings_per_year_40_80["Year"].iloc[i], 
             max_ratings_per_year_40_80["IMDb Rating"].iloc[i], 
             f'{max_ratings_per_year_40_80["IMDb Rating"].iloc[i]:.1f}', 
             ha='center', va='bottom')


# Ajusta automáticamente los elementos del gráfico para que no se superpongan
plt.tight_layout() 
                                                  
# Mostrar el gráfico
plt.show()

Pregunta 2: ¿Qué género predominó entre las mejores películas?

# Capturamos el género de cada película
genres = imdb["Genre"]

# Utilizando la variable best_rating_per_year, filtramos por las mejores películas
best_movies_genre = genres.loc[best_rating_per_year["IMDb Rating"]].reset_index()

# Contamos la frecuencia de cada género entre las mejores películas
genre_counts = best_movies_genre["Genre"].value_counts().reset_index()
genre_counts.columns = ["Genre", "Count"]

# Presentamos los géneros ordenados por frecuencia descendente
top_genre = genre_counts.sort_values(by="Count", ascending=False).reset_index(drop=True)

# Determinamos el género que predominó entre las mejores películas
predominant_genre = top_genre.iloc[0]["Genre"]
print(f"El género que predominó entre las mejores películas es: {predominant_genre}")
# Ajusta el tamaño de la figura
plt.figure(figsize=(10, 6))  
ax = sns.barplot(x='Count', y='Genre', data=top_genre, palette='viridis')

# Añadir etiquetas y título
plt.xlabel('Count')
plt.ylabel('Genre')
plt.title('Predominance of Genres Among Top Movies')

# Añadir etiquetas al final de cada barra
for index, value in enumerate(top_genre['Count']):
    ax.text(value, index, f'{value}', color='black', ha="left", va="center")

# Mostrar el gráfico
plt.show()

Pregunta 3: ¿Qué género predominó en cada década?

# Creamos un DF con Year y Genre
genre_year = imdb[["Genre", "Year"]]

# Creamos la columna Decade, que identificará la década de cada película
# Realizamos una división "entera" por 10 para luego multiplicar
genre_year["Decade"] = (genre_year["Year"] // 10) * 10

# Agrupamos por género y década
genres_per_decade = genre_year.groupby(["Decade","Genre"]).size().reset_index(name="Count")

# Filtramos para obtener el género predominante por década
most_popular_genre_per_decade = genres_per_decade.loc[genres_per_decade.groupby("Decade")["Count"].idxmax(), ["Decade", "Genre", "Count"]].reset_index(drop=True)
print(most_popular_genre_per_decade)
# Ajustar el tamaño de la figura
plt.figure(figsize=(12, 6))  

# Crear la gráfica de barras
ax = sns.barplot(x='Decade', y='Count', hue='Genre', data=most_popular_genre_per_decade, palette='viridis')

# Ajustar anotaciones para mostrar solo el valor correcto encima de cada barra
for p in ax.patches:
    height = p.get_height()
    if height > 0:  # Mostrar anotación solo si la altura de la barra es mayor que 0
        ax.annotate(format(height, '.0f'),
                    (p.get_x() + p.get_width() / 2., height),
                    ha='center', va='center', xytext=(0, 10),
                    textcoords='offset points')

# Añadir etiquetas y título
plt.xlabel('Decade', fontsize=14)
plt.ylabel('Count', fontsize=14)
plt.title('Most Popular Genre by Decade', fontsize=16)

# Reajustamos el tamaño de la leyenda para mejor lectura
ax.legend(fontsize='xx-large')

# Mostrar el gráfico
plt.tight_layout()
plt.show()

Pregunta 4: Para películas valorizadas sobre 8.0, ¿qué duración promedio tiene cada género?

# Creamos un DF con IMDb Rating, Genre y Duration
rat_gen_dur = imdb[["IMDb Rating", "Genre", "Duration (minutes)"]]

# Filtramos por películas > 8.0
toprat_gen_dur = rat_gen_dur[rat_gen_dur["IMDb Rating"] > 8.0]

# Agrupamos por Genre el DF y mostramos el promedio de duración
avg_dur_gen = toprat_gen_dur.groupby("Genre")["Duration (minutes)"].mean().round().reset_index(name="avg_duration")

# Reseteamos el index, nombramos la columna de promedios
avg_dur_gen_sorted = avg_dur_gen.sort_values("avg_duration", ascending=False).reset_index(drop=True)

print(avg_dur_gen_sorted)

Pregunta 5: IMDb rating y MetaScore son dos sitios diferentes que evalúan las películas. Haciendo la comparativa de puntajes en una película, ¿en qué porcentaje se diferencian en relación al puntaje máximo?

# Creamos un DF con Title, IMDb Rating y MetaScore
IMDb_title_rat_ms = imdb[["Title", "IMDb Rating", "MetaScore"]]

# Transformamos valores de IMDb Rating * 10 para tener mismo máximo que MS
IMDb_title_rat_ms["IMDb Rating"] = IMDb_title_rat_ms["IMDb Rating"] * 10

#Nueva columna que muestra la diferencia porcentual entre ambas respuestas
IMDb_title_rat_ms["d_IMDb/MS"] = (IMDb_title_rat_ms["MetaScore"] - IMDb_title_rat_ms["IMDb Rating"]) / IMDb_title_rat_ms["IMDb Rating"]

print(IMDb_title_rat_ms)