Análisis de la Evolución de los Géneros Cinematográficos
Para estudiar cómo han variado las preferencias de los géneros a lo largo de los años, es necesario procesar la columna que contiene esta información. Dado que los géneros se almacenan como cadenas en formato JSON, se deben parsear y expandir para realizar un conteo anual y visualizra las tendencias históricas.
import pandas as pd
import json
import matplotlib.pyplot as plt
# Carga del conjunto de datos
movies_data = pd.read_csv("tmdb_5000_movies.csv")
# Parseo de cadenas JSON y extracción de nombres de géneros
movies_data['parsed_genres'] = movies_data['genres'].apply(
lambda x: [g['name'] for g in json.loads(x)] if pd.notnull(x) else []
)
# Extracción del año de estreno
movies_data['release_year'] = pd.to_datetime(movies_data['release_date'], errors='coerce').dt.year
# Expansión de la lista de géneros y agrupación por año
exploded_genres = movies_data.explode('parsed_genres')
genre_year_counts = exploded_genres.groupby(['release_year', 'parsed_genres']).size().unstack(fill_value=0)
# Configuración y generación del gráfico de líneas
fig, ax = plt.subplots(figsize=(14, 7))
for category in genre_year_counts.columns:
ax.plot(genre_year_counts.index, genre_year_counts[category], label=category)
ax.set_title("Evolución de los Géneros Cinematográficos a lo Largo del Tiempo")
ax.set_xlabel("Año de Estreno")
ax.set_ylabel("Cantidad de Películas")
ax.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
Identificación de Países con Menor Producción
El conjunto de datos incluye información sobre los países participantes en la producción. Para encontrar aquellas naciones con una participación mínima en la industria, extraemos los códigos ISO y calculamos su frecuencia, ordenando los resultados de forma ascendente.
# Extracción de códigos de país desde la columna JSON
movies_data['countries'] = movies_data['production_countries'].apply(
lambda x: [c['iso_3166_1'] for c in json.loads(x)] if pd.notnull(x) else []
)
# Cálculo de frecuencias y selección de los países con menor producción
least_producers = (
movies_data.explode('countries')['countries']
.value_counts()
.sort_values(ascending=True)
.head(30)
)
print(least_producers)
Evaluación de la Rentabilidad por Género
La rentabilidad es un idnicador crucial en la industria del cine. Calculamos el beneficio neto restando el presupuesto de los ingresos totales, y luego agrupamos estos valores por categoría para visualizar qué géneros generan mayores retornos financieros en promedio.
# Cálculo del beneficio neto
movies_data['net_profit'] = movies_data['revenue'].fillna(0) - movies_data['budget'].fillna(0)
# Agregación del beneficio promedio por género
profit_by_category = (
movies_data.explode('parsed_genres')
.groupby('parsed_genres')['net_profit']
.mean()
.sort_values(ascending=False)
)
# Visualización mediante gráfico de barras
fig, ax = plt.subplots(figsize=(12, 6))
profit_by_category.plot(kind='bar', ax=ax, color='teal')
ax.set_title("Rentabilidad Promedio por Género")
ax.set_ylabel("Beneficio Neto Promedio (USD)")
ax.set_xlabel("Género")
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.show()
Análisis de Correlación entre Métricas de Rendimiento
Para comprender qué variables influyen en el éxito comercial y crítico de una película, generamos matrices de correlación. Esto permite identificar relaciones lineales entre el presupuesto, la popularidad, los ingresos y las puntuaciones de los usuarios mediante mapas de calor.
import seaborn as sns
# Selección de variables numéricas clave para la primera matriz
numeric_cols = ['budget', 'popularity', 'runtime', 'revenue', 'vote_average', 'vote_count']
subset_data = movies_data[numeric_cols].dropna()
corr_matrix = subset_data.corr()
fig, ax = plt.subplots(figsize=(9, 7))
sns.heatmap(corr_matrix, annot=True, cmap='viridis', fmt=".2f", linewidths=.5, ax=ax)
ax.set_title("Matriz de Correlación de Variables Numéricas Clave")
plt.show()
# Cálculo de correlaciones de todas las variables numéricas con los objetivos principales
all_numeric = movies_data.select_dtypes(include=['number']).columns
corr_with_targets = pd.DataFrame({
'Correlación con Ingresos': movies_data[all_numeric].corrwith(movies_data['revenue']),
'Correlación con Puntuación': movies_data[all_numeric].corrwith(movies_data['vote_average'])
}).dropna()
fig, ax = plt.subplots(figsize=(10, 12))
sns.heatmap(corr_with_targets, annot=True, cmap='coolwarm', fmt=".2f", ax=ax)
ax.set_title("Correlación de Todas las Variables con Ingresos y Puntuación")
plt.show()