# 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)
Data summary
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

  1. INTRODUCCIÓN Y DESCRIPCIÓN DE LA BASE DE DATOS

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.

  1. PRUEBA DE HIPÓTESIS: ¿LAS PELÍCULAS MÁS LARGAS GENERAN MAYORES INGRESOS?

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).

  1. ANÁLISIS DE REGRESIÓN LINEAL: PREDICIENDO EL RATING DE LAS PELÍCULAS

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.

  1. ÁRBOL DE DECISIÓN: CLASIFICANDO PELÍCULAS COMO “BUENAS” O “REGULARES”

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.

  1. CONCLUSIONES GENERALES Y RECOMENDACIONES

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.