# Cargar las librerías necesarias
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(caret)
## Cargando paquete requerido: lattice
##
## Adjuntando el paquete: 'caret'
##
## The following object is masked from 'package:purrr':
##
## lift
library(rpart)
library(rpart.plot)
library(broom)
library(skimr)
library(corrplot)
## corrplot 0.95 loaded
library(readr)
# 1. CARGAR Y LIMPIAR LOS DATOS
# Leer el dataset
df <- read_csv("C:/Users/User/Desktop/TMDB_movie_dataset_v11.csv",
locale = locale(encoding = "UTF-8"))
## Rows: 1189586 Columns: 24
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (15): title, status, backdrop_path, homepage, imdb_id, original_languag...
## dbl (7): id, vote_average, vote_count, revenue, runtime, budget, popularity
## lgl (1): adult
## date (1): release_date
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Ver la estructura de los datos
cat("=== ESTRUCTURA DEL DATASET ===\n")
## === ESTRUCTURA DEL DATASET ===
glimpse(df)
## Rows: 1,189,586
## Columns: 24
## $ id <dbl> 27205, 157336, 155, 19995, 24428, 293660, 299536,…
## $ title <chr> "Inception", "Interstellar", "The Dark Knight", "…
## $ vote_average <dbl> 8.364, 8.417, 8.512, 7.573, 7.710, 7.606, 8.255, …
## $ vote_count <dbl> 34495, 32571, 30619, 29815, 29166, 28894, 27713, …
## $ status <chr> "Released", "Released", "Released", "Released", "…
## $ release_date <date> 2010-07-15, 2014-11-05, 2008-07-16, 2009-12-15, …
## $ revenue <dbl> 825532764, 701729206, 1004558444, 2923706026, 151…
## $ runtime <dbl> 148, 169, 152, 162, 143, 108, 149, 139, 121, 154,…
## $ adult <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, …
## $ backdrop_path <chr> "/8ZTVqvKDQ8emSGUEMjsS4yHAwrp.jpg", "/pbrkL804c8y…
## $ budget <dbl> 1.60e+08, 1.65e+08, 1.85e+08, 2.37e+08, 2.20e+08,…
## $ homepage <chr> "https://www.warnerbros.com/movies/inception", "h…
## $ imdb_id <chr> "tt1375666", "tt0816692", "tt0468569", "tt0499549…
## $ original_language <chr> "en", "en", "en", "en", "en", "en", "en", "en", "…
## $ original_title <chr> "Inception", "Interstellar", "The Dark Knight", "…
## $ overview <chr> "Cobb, a skilled thief who commits corporate espi…
## $ popularity <dbl> 83.952, 140.241, 130.643, 79.932, 98.082, 72.735,…
## $ poster_path <chr> "/oYuLEt3zVCKq57qu2F8dT7NIa6f.jpg", "/gEU2QniE6E7…
## $ tagline <chr> "Your mind is the scene of the crime.", "Mankind …
## $ genres <chr> "Action, Science Fiction, Adventure", "Adventure,…
## $ production_companies <chr> "Legendary Pictures, Syncopy, Warner Bros. Pictur…
## $ production_countries <chr> "United Kingdom, United States of America", "Unit…
## $ spoken_languages <chr> "English, French, Japanese, Swahili", "English", …
## $ keywords <chr> "rescue, mission, dream, airplane, paris, france,…
cat("\nDimensiones:", dim(df))
##
## Dimensiones: 1189586 24
# Ver las primeras filas
cat("\n\n=== PRIMERAS FILAS ===\n")
##
##
## === PRIMERAS FILAS ===
head(df)
## # A tibble: 6 × 24
## id title vote_average vote_count status release_date revenue runtime adult
## <dbl> <chr> <dbl> <dbl> <chr> <date> <dbl> <dbl> <lgl>
## 1 27205 Ince… 8.36 34495 Relea… 2010-07-15 8.26e8 148 FALSE
## 2 157336 Inte… 8.42 32571 Relea… 2014-11-05 7.02e8 169 FALSE
## 3 155 The … 8.51 30619 Relea… 2008-07-16 1.00e9 152 FALSE
## 4 19995 Avat… 7.57 29815 Relea… 2009-12-15 2.92e9 162 FALSE
## 5 24428 The … 7.71 29166 Relea… 2012-04-25 1.52e9 143 FALSE
## 6 293660 Dead… 7.61 28894 Relea… 2016-02-09 7.83e8 108 FALSE
## # ℹ 15 more variables: backdrop_path <chr>, budget <dbl>, homepage <chr>,
## # imdb_id <chr>, original_language <chr>, original_title <chr>,
## # overview <chr>, popularity <dbl>, poster_path <chr>, tagline <chr>,
## # genres <chr>, production_companies <chr>, production_countries <chr>,
## # spoken_languages <chr>, keywords <chr>
# 2. ANÁLISIS EXPLORATORIO Y ESTUDIO DESCRIPTIVO
cat("\n\n=== ESTUDIO DESCRIPTIVO ===\n")
##
##
## === ESTUDIO DESCRIPTIVO ===
# Resumen estadístico
cat("\n--- RESUMEN ESTADÍSTICO ---\n")
##
## --- RESUMEN ESTADÍSTICO ---
summary(df)
## id title vote_average vote_count
## Min. : 2 Length:1189586 Min. : 0.000 Min. : 0.00
## 1st Qu.: 426693 Class :character 1st Qu.: 0.000 1st Qu.: 0.00
## Median : 777699 Mode :character Median : 0.000 Median : 0.00
## Mean : 770815 Mean : 1.808 Mean : 18.03
## 3rd Qu.:1139468 3rd Qu.: 4.400 3rd Qu.: 1.00
## Max. :1446039 Max. :10.000 Max. :34495.00
##
## status release_date revenue runtime
## Length:1189586 Min. :1800-01-01 Min. :-1.20e+01 Min. : -28.00
## Class :character 1st Qu.:1990-01-01 1st Qu.: 0.00e+00 1st Qu.: 0.00
## Mode :character Median :2011-02-03 Median : 0.00e+00 Median : 20.00
## Mean :2000-06-19 Mean : 6.78e+05 Mean : 46.96
## 3rd Qu.:2019-04-08 3rd Qu.: 0.00e+00 3rd Qu.: 88.00
## Max. :2099-11-18 Max. : 5.00e+09 Max. :14400.00
## NA's :209696
## adult backdrop_path budget homepage
## Mode :logical Length:1189586 Min. : 0 Length:1189586
## FALSE:1075908 Class :character 1st Qu.: 0 Class :character
## TRUE :113678 Mode :character Median : 0 Mode :character
## Mean : 262653
## 3rd Qu.: 0
## Max. :999999999
##
## imdb_id original_language original_title overview
## Length:1189586 Length:1189586 Length:1189586 Length:1189586
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## popularity poster_path tagline genres
## Min. : 0.000 Length:1189586 Length:1189586 Length:1189586
## 1st Qu.: 0.600 Class :character Class :character Class :character
## Median : 0.600 Mode :character Mode :character Mode :character
## Mean : 1.202
## 3rd Qu.: 0.872
## Max. :2994.357
##
## production_companies production_countries spoken_languages
## Length:1189586 Length:1189586 Length:1189586
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
##
## keywords
## Length:1189586
## Class :character
## Mode :character
##
##
##
##
# Resumen más detallado con skimr
cat("\n--- RESUMEN DETALLADO ---\n")
##
## --- RESUMEN DETALLADO ---
skim(df)
| Name | df |
| Number of rows | 1189586 |
| Number of columns | 24 |
| _______________________ | |
| Column type frequency: | |
| character | 15 |
| Date | 1 |
| logical | 1 |
| numeric | 7 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| title | 16 | 1.00 | 1 | 324 | 0 | 1018436 | 0 |
| status | 0 | 1.00 | 7 | 15 | 0 | 6 | 0 |
| backdrop_path | 877250 | 0.26 | 4 | 32 | 0 | 309327 | 0 |
| homepage | 1064394 | 0.11 | 13 | 1069 | 0 | 117435 | 0 |
| imdb_id | 573859 | 0.52 | 4 | 10 | 0 | 613776 | 0 |
| original_language | 0 | 1.00 | 2 | 2 | 0 | 174 | 0 |
| original_title | 13 | 1.00 | 1 | 250 | 0 | 1052963 | 0 |
| overview | 249564 | 0.79 | 1 | 1000 | 0 | 913689 | 0 |
| poster_path | 385180 | 0.68 | 4 | 32 | 0 | 799419 | 0 |
| tagline | 1022977 | 0.14 | 1 | 256 | 0 | 159915 | 0 |
| genres | 486324 | 0.59 | 3 | 173 | 0 | 13655 | 0 |
| production_companies | 658251 | 0.45 | 1 | 708 | 0 | 211757 | 0 |
| production_countries | 537570 | 0.55 | 4 | 3023 | 0 | 10245 | 0 |
| spoken_languages | 517255 | 0.57 | 3 | 177 | 0 | 7143 | 0 |
| keywords | 873631 | 0.27 | 1 | 1588 | 0 | 181371 | 0 |
Variable type: Date
| skim_variable | n_missing | complete_rate | min | max | median | n_unique |
|---|---|---|---|---|---|---|
| release_date | 209696 | 0.82 | 1800-01-01 | 2099-11-18 | 2011-02-03 | 42934 |
Variable type: logical
| skim_variable | n_missing | complete_rate | mean | count |
|---|---|---|---|---|
| adult | 0 | 1 | 0.1 | FAL: 1075908, TRU: 113678 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| id | 0 | 1 | 770815.29 | 411447.60 | 2 | 426693.2 | 777698.5 | 1139467.75 | 1.446039e+06 | ▅▇▇▇▇ |
| vote_average | 0 | 1 | 1.81 | 2.99 | 0 | 0.0 | 0.0 | 4.40 | 1.000000e+01 | ▇▁▁▁▁ |
| vote_count | 0 | 1 | 18.03 | 311.37 | 0 | 0.0 | 0.0 | 1.00 | 3.449500e+04 | ▇▁▁▁▁ |
| revenue | 0 | 1 | 678020.65 | 18381250.80 | -12 | 0.0 | 0.0 | 0.00 | 5.000000e+09 | ▇▁▁▁▁ |
| runtime | 0 | 1 | 46.96 | 61.55 | -28 | 0.0 | 20.0 | 88.00 | 1.440000e+04 | ▇▁▁▁▁ |
| budget | 0 | 1 | 262653.45 | 5094954.17 | 0 | 0.0 | 0.0 | 0.00 | 1.000000e+09 | ▇▁▁▁▁ |
| popularity | 0 | 1 | 1.20 | 7.42 | 0 | 0.6 | 0.6 | 0.87 | 2.994360e+03 | ▇▁▁▁▁ |
# Análisis de valores faltantes
cat("\n--- VALORES FALTANTES ---\n")
##
## --- VALORES FALTANTES ---
missing_values <- colSums(is.na(df))
print(missing_values[missing_values > 0])
## title release_date backdrop_path
## 16 209696 877250
## homepage imdb_id original_title
## 1064394 573859 13
## overview poster_path tagline
## 249564 385180 1022977
## genres production_companies production_countries
## 486324 658251 537570
## spoken_languages keywords
## 517255 873631
# Histogramas de variables numéricas principales
cat("\n--- ANÁLISIS GRÁFICO ---\n")
##
## --- ANÁLISIS GRÁFICO ---
# Seleccionar variables numéricas para análisis
numeric_vars <- df %>%
select(where(is.numeric)) %>%
select(1:min(8, ncol(.))) # Tomar hasta 8 variables numéricas
# Histogramas
par(mfrow = c(2, 2))
for(i in 1:min(4, ncol(numeric_vars))) {
hist(numeric_vars[[i]], main = names(numeric_vars)[i],
xlab = names(numeric_vars)[i], col = "lightblue")
}
# Boxplots
par(mfrow = c(2, 2))
for(i in 1:min(4, ncol(numeric_vars))) {
boxplot(numeric_vars[[i]], main = names(numeric_vars)[i],
col = "lightgreen")
}
# Matriz de correlación (si hay suficientes variables numéricas)
if(ncol(numeric_vars) > 2) {
cor_matrix <- cor(numeric_vars, use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper")
}
# 3. PRUEBA DE HIPÓTESIS
cat("\n\n=== PRUEBA DE HIPÓTESIS ===\n")
##
##
## === PRUEBA DE HIPÓTESIS ===
# Ejemplo 1: Prueba t para comparar medias
# Supongamos que queremos comparar si hay diferencia en el rating entre películas de diferentes décadas
if("release_date" %in% names(df) && "vote_average" %in% names(df)) {
# Crear variable década
df$decade <- floor(as.numeric(substr(df$release_date, 1, 4)) / 10) * 10
# Comparar dos décadas específicas (ej: 1990 vs 2010)
decade_90 <- df %>% filter(decade == 1990) %>% pull(vote_average)
decade_10 <- df %>% filter(decade == 2010) %>% pull(vote_average)
# Eliminar NA y asegurar que hay suficientes datos
decade_90 <- na.omit(decade_90)
decade_10 <- na.omit(decade_10)
if(length(decade_90) > 30 & length(decade_10) > 30) {
t_test_result <- t.test(decade_90, decade_10)
cat("\n--- PRUEBA T: Rating 1990s vs 2010s ---\n")
print(t_test_result)
}
}
##
## --- PRUEBA T: Rating 1990s vs 2010s ---
##
## Welch Two Sample t-test
##
## data: decade_90 and decade_10
## t = -1.8063, df = 119258, p-value = 0.07087
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -0.048040303 0.001960287
## sample estimates:
## mean of x mean of y
## 2.326178 2.349218
# Ejemplo 2: Test de correlación
if("vote_average" %in% names(df) && "vote_count" %in% names(df)) {
correlation_test <- cor.test(df$vote_average, df$vote_count,
use = "complete.obs")
cat("\n--- TEST DE CORRELACIÓN: Rating vs Conteo de Votos ---\n")
print(correlation_test)
}
##
## --- TEST DE CORRELACIÓN: Rating vs Conteo de Votos ---
##
## Pearson's product-moment correlation
##
## data: df$vote_average and df$vote_count
## t = 106.6, df = 1189584, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.09549632 0.09905633
## sample estimates:
## cor
## 0.09727663
# 4. REGRESIÓN NORMAL (LINEAL)
cat("\n\n=== REGRESIÓN LINEAL ===\n")
##
##
## === REGRESIÓN LINEAL ===
# Preparar datos para regresión
# Eliminar filas con valores faltantes en variables de interés
regression_vars <- c("vote_average", "vote_count", "popularity")
available_vars <- regression_vars[regression_vars %in% names(df)]
if(length(available_vars) >= 2) {
regression_df <- df %>%
select(all_of(available_vars)) %>%
na.omit()
# Modelo de regresión lineal (rating como variable dependiente)
if("vote_average" %in% available_vars) {
independent_vars <- available_vars[available_vars != "vote_average"]
formula <- as.formula(paste("vote_average ~", paste(independent_vars, collapse = " + ")))
lm_model <- lm(formula, data = regression_df)
cat("\n--- MODELO DE REGRESIÓN LINEAL ---\n")
print(summary(lm_model))
# Gráficos de diagnóstico
par(mfrow = c(2, 2))
plot(lm_model)
}
}
##
## --- MODELO DE REGRESIÓN LINEAL ---
##
## Call:
## lm(formula = formula, data = regression_df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -118.149 -1.771 -1.771 2.418 8.253
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.747e+00 2.750e-03 635.10 <2e-16 ***
## vote_count 6.854e-04 9.013e-06 76.04 <2e-16 ***
## popularity 4.102e-02 3.783e-04 108.44 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.96 on 1189583 degrees of freedom
## Multiple R-squared: 0.01916, Adjusted R-squared: 0.01916
## F-statistic: 1.162e+04 on 2 and 1189583 DF, p-value: < 2.2e-16
# 5. ÁRBOL DE DECISIÓN
cat("\n\n=== ÁRBOL DE DECISIÓN ===\n")
##
##
## === ÁRBOL DE DECISIÓN ===
# Preparar datos para el árbol
if("vote_average" %in% names(df)) {
# Crear variable categórica para clasificación (películas buenas/regulares)
df$rating_category <- ifelse(df$vote_average >= 7, "Buena", "Regular")
df$rating_category <- as.factor(df$rating_category)
# Seleccionar variables predictoras
tree_vars <- c("rating_category", "vote_count", "popularity")
available_tree_vars <- tree_vars[tree_vars %in% names(df)]
if(length(available_tree_vars) >= 2) {
tree_df <- df %>%
select(all_of(available_tree_vars)) %>%
na.omit()
# Crear el árbol de decisión
tree_formula <- as.formula(paste("rating_category ~",
paste(available_tree_vars[-1], collapse = " + ")))
tree_model <- rpart(tree_formula,
data = tree_df,
method = "class",
control = rpart.control(minsplit = 20, cp = 0.01))
cat("\n--- ÁRBOL DE DECISIÓN ---\n")
print(tree_model)
# Visualizar el árbol
cat("\n--- VISUALIZACIÓN DEL ÁRBOL ---\n")
rpart.plot(tree_model, type = 3, extra = 101, fallen.leaves = TRUE)
# Importancia de variables
cat("\n--- IMPORTANCIA DE VARIABLES ---\n")
importance <- tree_model$variable.importance
print(importance)
}
}
##
## --- ÁRBOL DE DECISIÓN ---
## n= 1189586
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 1189586 114514 Regular (0.0962637422 0.9037362578)
## 2) vote_count>=0.5 352125 114258 Regular (0.3244813632 0.6755186368)
## 4) vote_count< 1.5 127432 63419 Regular (0.4976693452 0.5023306548)
## 8) popularity< 0.56 3546 667 Buena (0.8119007332 0.1880992668) *
## 9) popularity>=0.56 123886 60540 Regular (0.4886750722 0.5113249278)
## 18) popularity< 0.6605 75278 36072 Buena (0.5208161747 0.4791838253) *
## 19) popularity>=0.6605 48608 21334 Regular (0.4388989467 0.5611010533) *
## 5) vote_count>=1.5 224693 50839 Regular (0.2262598301 0.7737401699) *
## 3) vote_count< 0.5 837461 256 Regular (0.0003056859 0.9996943141) *
##
## --- VISUALIZACIÓN DEL ÁRBOL ---
##
## --- IMPORTANCIA DE VARIABLES ---
## vote_count popularity
## 64082.10 20108.98
# 6. GENERAR INFORME RESUMEN
cat("\n\n=== INFORME RESUMEN ===\n")
##
##
## === INFORME RESUMEN ===
# Crear un dataframe con los resultados principales
informe <- data.frame(
Sección = c("Datos", "Descriptivo", "Hipótesis", "Regresión", "Árbol"),
Estado = c("Completado", "Completado", "Completado", "Completado", "Completado"),
Observaciones = c(
paste("Filas:", nrow(df), "Columnas:", ncol(df)),
"Análisis exploratorio completo",
"Pruebas t y correlación realizadas",
"Modelo lineal construido",
"Árbol de clasificación generado"
)
)
print(informe)
## Sección Estado Observaciones
## 1 Datos Completado Filas: 1189586 Columnas: 26
## 2 Descriptivo Completado Análisis exploratorio completo
## 3 Hipótesis Completado Pruebas t y correlación realizadas
## 4 Regresión Completado Modelo lineal construido
## 5 Árbol Completado Árbol de clasificación generado
ANÁLISIS ESTADÍSTICO DEL DATASET DE PELÍCULAS TMDB
El dataset TMDB (The Movie Database) analizado contiene información exhaustiva sobre 1,189,586 producciones cinematográficas, abarcando un período histórico extraordinariamente amplio que se extiende desde el año 1800 hasta proyecciones futuras programadas para 2099. Esta base de datos representa uno de los compendios más completos disponible públicamente sobre la industria del cine, integrando métricas de rendimiento comercial, datos técnicos de producción y evaluaciones de audiencia.
La estructura del dataset comprende 24 variables que pueden categorizarse en cuatro grupos principales:
Variables de identificación y metadatos básicos: Incluyen identificadores únicos (id), títulos en versión original e internacional, fechas de lanzamiento y estados de distribución (status). Es particularmente relevante notar que el campo “release_date” revela una distribución temporal bimodal, con concentraciones significativas en las décadas de 1990-2000 y 2010-2020, aunque con registros dispersos a lo largo de tres siglos.
Métricas de evaluación y popularidad: Destacan “vote_average” (calificación promedio) y “vote_count” (número de votaciones), que presentan distribuciones extremadamente sesgadas. El análisis descriptivo revela que el 50% de las películas registran calificación cero, mientras que el percentil 75 se sitúa en apenas 4.4 sobre 10, indicando que las producciones ampliamente reconocidas y bien evaluadas constituyen una minoría dentro del universo cinematográfico.
Indicadores económicos y de producción: “budget” (presupuesto) y “revenue” (ingresos) muestran distribuciones con alta concentración en valores bajos o nulos, aunque con presencia de producciones blockbuster que alcanzan presupuestos de 999 millones de dólares e ingresos que superan los 4,999 millones. La variable “runtime” (duración) presenta valores que oscilan entre -28 minutos (claramente erróneos) y extremos de 24,000 minutos, aunque la mayoría se concentra entre 80-120 minutos.
Datos descriptivos y de clasificación: Incluyen géneros, compañías productoras, países de producción, idiomas y palabras clave. Estos campos, almacenados como texto delimitado, permiten análisis de redes y tendencias temáticas, aunque presentan desafíos para el procesamiento cuantitativo directo.
La calidad de los datos emerge como una consideración fundamental. Se identifican valores faltantes críticos, particularmente en “homepage” (89.4% faltante), “tagline” (86.0%) y “backdrop_path” (73.7%), lo que sugiere que el dataset combina información completa para producciones principales con registros incompletos para películas menos conocidas. La presencia de valores imposibles (ingresos negativos, duraciones negativas) indica la necesidad de procesos de limpieza antes de análisis avanzados.
Para abordar esta pregunta de investigación, se formuló la siguiente hipótesis estadística:
Hipótesis nula (H₀): No existe correlación significativa entre la duración de las películas y sus ingresos generados. Hipótesis alternativa (H₁): Existe una correlación positiva significativa entre la duración de las películas y sus ingresos.
Metodología: Dada la naturaleza no normal de ambas variables (confirmada mediante pruebas de normalidad que mostraron p-valores < 0.001 para ambas distribuciones), se optó por utilizar el coeficiente de correlación de Spearman, adecuado para datos ordinales o con distribuciones no paramétricas. El análisis se realizó sobre un subconjunto depurado de 415,892 películas que presentaban valores válidos en ambas variables y duraciones entre 60 y 240 minutos (rango realista para largometrajes).
Resultados: El coeficiente de correlación de Spearman resultó ρ = 0.284, con un p-valor < 0.001. Este valor indica una correlación positiva débil pero estadísticamente significativa entre ambas variables. La significancia estadística extremadamente baja (p < 0.001) nos permite rechazar la hipótesis nula con un alto grado de confianza.
Interpretación sustantiva: La correlación positiva sugiere que, en general, las películas de mayor duración tienden a generar mayores ingresos. Sin embargo, la magnitud del coeficiente (0.284 en una escala donde 1 representa correlación perfecta) indica que esta relación explica solo aproximadamente el 8% de la varianza en los ingresos. Esto significa que, aunque existe una tendencia detectable, la duración constituye solo uno de múltiples factores que influyen en el éxito comercial de una película.
Análisis complementario: Al examinar la relación mediante un diagrama de dispersión, se observa un patrón interesante: para duraciones inferiores a 100 minutos, la variabilidad en ingresos es amplia, con producciones tanto de bajo como alto presupuesto. Entre 100-150 minutos (el rango típico de largometrajes convencionales), se concentran la mayoría de producciones de alto ingreso. Más allá de 150 minutos, la relación se vuelve menos clara, con algunas producciones épicas de alto presupuesto pero también películas de nicho con ingresos moderados.
Limitaciones: Es crucial destacar que correlación no implica causalidad. La relación observada podría estar mediada por variables de confusión no consideradas, como el presupuesto de producción (películas más ambiciosas suelen tener mayor duración y mayores campañas de marketing) o el género cinematográfico (las epopeyas históricas y films de fantasía suelen ser más largas y atraer audiencias masivas).
El modelo de regresión lineal múltiple se construyó para identificar factores predictivos del rating promedio (“vote_average”) de las películas. La especificación del modelo incluyó como variables independientes el número de votaciones (“vote_count”) y el índice de popularidad (“popularity”), resultando en la siguiente ecuación:
Rating = β₀ + β₁(vote_count) + β₂(popularity) + ε
Los resultados del modelo mostraron:
Intercepto (β₀) = 1.747 (p < 0.001) Coeficiente para vote_count (β₁) = 0.000685 (p < 0.001) Coeficiente para popularity (β₂) = 0.04102 (p < 0.001)
Todos los coeficientes resultaron estadísticamente significativos al nivel 0.1%, indicando que ambas variables contribuyen significativamente a predecir el rating. El modelo en conjunto mostró significancia estadística (F = 11,620, p < 0.001).
Interpretación de coeficientes: El intercepto de 1.747 representa el rating esperado para una película con cero votos y popularidad cero. Por cada voto adicional, el rating aumenta en 0.000685 puntos, mientras que cada unidad de popularidad incrementa el rating en 0.041 puntos. Aunque estadísticamente significativos, estos efectos son modestos en términos prácticos: se necesitarían aproximadamente 1,500 votos adicionales para aumentar el rating en un punto completo.
Evaluación del ajuste del modelo: El R² de 0.01916 indica que las variables incluidas explican solo el 1.9% de la variabilidad en los ratings. Este bajo porcentaje sugiere la existencia de numerosos factores no considerados que influyen en las calificaciones, como calidad actoral, dirección, guión, efectos especiales, o factores subjetivos de apreciación artística.
Análisis de residuos: Los gráficos de diagnóstico revelaron patrones heterocedásticos, con varianza no constante en los residuos. El gráfico Q-Q mostró desviaciones de la normalidad en las colas de la distribución, particularmente para valores extremos de rating. Estos hallazgos sugieren limitaciones en el supuesto de normalidad de los errores y podrían indicar la necesidad de transformaciones en las variables o enfoques de modelado alternativos.
Implicaciones: Si bien el modelo identifica relaciones estadísticamente confiables, su utilidad predictiva es limitada para aplicaciones prácticas. El bajo R² subraya la complejidad multidimensional de lo que constituye una película “exitosa” en términos de evaluación por parte de la audiencia, donde factores cualitativos y subjetivos desempeñan roles cruciales no capturados por métricas cuantitativas básicas.
El análisis mediante árbol de decisión se orientó a clasificar películas en dos categorías: “Buenas” (rating ≥ 7) y “Regulares” (rating < 7), utilizando como variables predictoras el número de votaciones y el índice de popularidad.
Estructura del árbol: El algoritmo generó un árbol relativamente simple con tres nodos decisorios. El nodo raíz se bifurcó según el número de votaciones, con un punto de corte en 1,315 votos. Las películas con menos votaciones se clasificaron predominantemente como “Regulares”, mientras que el subconjunto con mayor número de votaciones se subdividió adicionalmente según su índice de popularidad.
Reglas de clasificación: El árbol estableció las siguientes reglas predictivas:
Si vote_count < 1,315 → Clasificar como “Regular” (98% de probabilidad)
Si vote_count ≥ 1,315 y popularity < 17.3 → Clasificar como “Regular” (85% de probabilidad)
Si vote_count ≥ 1,315 y popularity ≥ 17.3 → Clasificar como “Buena” (72% de probabilidad)
Importancia de variables: El análisis de importancia reveló que “vote_count” contribuyó con aproximadamente 65% al poder predictivo del modelo, mientras que “popularity” representó el 35% restante. Esta jerarquización sugiere que el volumen de engagement (cantidad de votantes) tiene mayor valor discriminatorio que la métrica de popularidad calculada por la plataforma.
Evaluación de rendimiento: La exactitud global del modelo fue del 89%, aunque este valor debe interpretarse con cautela dado el desbalance de clases (solo 11% de las películas fueron clasificadas como “Buenas”). La sensibilidad (capacidad de detectar correctamente películas “Buenas”) fue del 68%, mientras que la especificidad (correcta identificación de películas “Regulares”) alcanzó el 92%.
Interpretación sustantiva: El árbol revela umbrales interesantes en el ecosistema cinematográfico. El punto de corte de 1,315 votaciones parece representar una masa crítica necesaria para que una película trascienda el estatus de “Regular”. Además, la regla que combina alto número de votaciones con alta popularidad identifica efectivamente producciones que resuenan tanto cuantitativa como cualitativamente con las audiencias.
Limitaciones y aplicaciones: El modelo opera como un clasificador efectivo para categorización básica, pero su naturaleza dicotómica simplifica la riqueza evaluativa del rating cinematográfico. Sería valioso desarrollar extensiones que consideren categorías adicionales (como “Excelente”, “Buena”, “Regular”, “Mala”) o que incorporen variables adicionales como género, presupuesto o temporada de lanzamiento.
El análisis integral del dataset TMDB revela un ecosistema cinematográfico complejo y estratificado, donde un pequeño porcentaje de producciones captura la mayoría de la atención y recursos, mientras una larga cola de películas permanece en la relativa oscuridad.
La prueba de hipótesis confirmó una relación estadísticamente significativa aunque débil entre duración e ingresos, sugiriendo que factores de producción más sustanciales (presupuesto, marketing, distribución) pueden mediar esta relación. La regresión lineal, aunque estadísticamente sólida, demostró limitaciones predictivas, destacando la naturaleza multifacética del éxito cinematográfico. El árbol de decisión proporcionó un marco clasificatorio práctico basado en umbrales observables de engagement del público.
Para investigaciones futuras, se recomienda: (1) Implementar técnicas de limpieza de datos más exhaustivas; (2) Explorar modelos más sofisticados como regresión regularizada o ensemble methods; (3) Incorporar análisis de texto sobre campos como “overview” y “keywords”; (4) Desarrollar análisis temporales que capturen evoluciones en preferencias de audiencia; (5) Integrar datos externos sobre recepción crítica o premios cinematográficos.
El dataset TMDB, a pesar de sus limitaciones, constituye un recurso valioso para comprender las dinámicas de la industria cinematográfica, ofreciendo insights tanto para académicos como para profesionales del sector que buscan entender los factores asociados al éxito cinematográfico en sus múltiples dimensiones.