🎯 Enunciado: “El Desafío del Cine de Terror”

¡Alerta de misión!

Eres un/a científico/a de datos en una productora de cine de terror. Tu jefe te acaba de asignar una misión de última hora: analizar las películas de terror más votadas en IMDb para descubrir patrones que ayuden a crear el próximo éxito taquillero. Tienes hasta mañana para presentar tus hallazgos. ¡El futuro de la compañía depende de ti!

🔍 Objetivos de la Misión

  1. Extraer los títulos de las películas de terror más votadas

  2. Obtener los años de lanzamiento

  3. Recopilar las calificaciones de los usuarios

  4. Crear un dataframe con toda la información

  5. Realizar visualizaciones y análisis que revelen insights clave

🚀 Código de la Misión

# Cargar las librerías necesarias para la misión
library(rvest)    # Para el web scraping
library(dplyr)    # Para manipulación de datos
library(ggplot2)  # Para visualizaciones
library(stringr)  # Para manipulación de texto
# Establecer la URL objetivo
url <- "https://www.imdb.com/es/search/title/?genres=horror&explore=genres&title_type=feature&sort=num_votes%2Cdesc"

# Leer el contenido HTML de la página
html_content <- read_html(url)

Pregunta 1

titulos <- html_content %>%
  html_elements("h3.ipc-title__text") %>%
  html_text() %>%
  .[str_detect(., "^\\d+\\.\\s")] %>%  # Filtrar solo los que empiezan con número y punto
  str_remove("^\\d+\\.\\s") %>%        # Remover la numeración
  head(50)                             # Tomar las primeras 50

titulos
##  [1] "El silencio de los inocentes"           
##  [2] "El resplandor"                          
##  [3] "Alien, el octavo pasajero"              
##  [4] "Soy leyenda"                            
##  [5] "Alien 2: El regreso"                    
##  [6] "Psicópata americano"                    
##  [7] "¡Huye!"                                 
##  [8] "Guerra mundial Z"                       
##  [9] "Psicosis"                               
## [10] "Tiburón"                                
## [11] "It (Eso)"                               
## [12] "Tierra de zombies"                      
## [13] "Un lugar en silencio"                   
## [14] "El desesperar de los muertos"           
## [15] "Fragmentado"                            
## [16] "El conjuro"                             
## [17] "Exterminio"                             
## [18] "La cosa del otro mundo"                 
## [19] "Juego macabro"                          
## [20] "Depredador"                             
## [21] "El exorcista"                           
## [22] "La cabaña del terror"                   
## [23] "El Menú"                                
## [24] "Midsommar. El terror no espera la noche"
## [25] "Cloverfield: Monstruo"

Pregunta 2

# Extraer los años de las películas
years <- html_content %>%
  html_elements("span.dli-title-metadata-item") %>%
  html_text() %>%
  .[str_detect(., "^\\d{4}$")] %>%     # Filtrar solo los que son exactamente 4 dígitos
  head(50)

years
##  [1] "1991" "1980" "1979" "2007" "1986" "2000" "2017" "2013" "1960" "1975"
## [11] "2017" "2009" "2018" "2004" "2016" "2013" "2002" "1982" "2004" "1987"
## [21] "1973" "2011" "2022" "2019" "2008"

Pregunta 3

# Extraer los ratings
ratings <- html_content %>%
  html_elements("span.ipc-rating-star--rating") %>%
  html_text() %>%
  as.numeric() %>%
  head(50)
ratings
##  [1] 8.6 8.4 8.5 7.2 8.4 7.6 7.8 7.0 8.5 8.1 7.3 7.5 7.5 7.9 7.3 7.5 7.5 8.2 7.6
## [20] 7.8 8.1 7.0 7.2 7.1 7.0

PLUS ¿Cómo podemos extraer el número de votos?

# Extraer el número de votos (esto requiere un selector más específico)
votos <- html_content %>%
  html_elements("span.ipc-rating-star--voteCount") %>%
  html_text() %>%
  str_extract("\\d+(\\.\\d+)?[KM]?") %>%  # Extraer números con posibles K/M para miles/millones
  str_replace("K", "000") %>%
  str_replace("M", "000000") %>%
  as.numeric() %>%
  head(50)
votos
##  [1]   1.7   1.2   1.0 858.0 818.0 796.0 775.0 762.0 762.0 712.0 655.0 651.0
## [13] 637.0 625.0 601.0 594.0 514.0 506.0 496.0 484.0 484.0 478.0 468.0 459.0
## [25] 437.0

Pregunta 04

# Crear el dataframe con los datos extraídos
peliculas_terror <- data.frame(
  Titulo = titulos,
  Año = years,
  Rating = ratings,
  Votos = votos,
  stringsAsFactors = FALSE
)
# Verificar y mostrar los resultados
print("Primeras 10 películas:")
## [1] "Primeras 10 películas:"
print(head(peliculas_terror, 10))
##                          Titulo  Año Rating Votos
## 1  El silencio de los inocentes 1991    8.6   1.7
## 2                 El resplandor 1980    8.4   1.2
## 3     Alien, el octavo pasajero 1979    8.5   1.0
## 4                   Soy leyenda 2007    7.2 858.0
## 5           Alien 2: El regreso 1986    8.4 818.0
## 6           Psicópata americano 2000    7.6 796.0
## 7                        ¡Huye! 2017    7.8 775.0
## 8              Guerra mundial Z 2013    7.0 762.0
## 9                      Psicosis 1960    8.5 762.0
## 10                      Tiburón 1975    8.1 712.0
print(paste("Total de películas extraídas:", nrow(peliculas_terror)))
## [1] "Total de películas extraídas: 25"

Adicional

write.csv(peliculas_terror, "top_peliculas_terror_imdb.csv", row.names = FALSE)
# Corregir los votos: valores < 100 están en millones, valores >= 100 están en miles
peliculas <- peliculas_terror %>%
  mutate(Votos_corregidos = ifelse(Votos < 100, 
                                   Votos * 1000000, 
                                   Votos * 1000),
         Votos_millones = Votos_corregidos / 1000000)

# Mostrar el dataframe corregido
print(peliculas[, c("Titulo", "Año", "Rating", "Votos_millones")])
##                                     Titulo  Año Rating Votos_millones
## 1             El silencio de los inocentes 1991    8.6          1.700
## 2                            El resplandor 1980    8.4          1.200
## 3                Alien, el octavo pasajero 1979    8.5          1.000
## 4                              Soy leyenda 2007    7.2          0.858
## 5                      Alien 2: El regreso 1986    8.4          0.818
## 6                      Psicópata americano 2000    7.6          0.796
## 7                                   ¡Huye! 2017    7.8          0.775
## 8                         Guerra mundial Z 2013    7.0          0.762
## 9                                 Psicosis 1960    8.5          0.762
## 10                                 Tiburón 1975    8.1          0.712
## 11                                It (Eso) 2017    7.3          0.655
## 12                       Tierra de zombies 2009    7.5          0.651
## 13                    Un lugar en silencio 2018    7.5          0.637
## 14            El desesperar de los muertos 2004    7.9          0.625
## 15                             Fragmentado 2016    7.3          0.601
## 16                              El conjuro 2013    7.5          0.594
## 17                              Exterminio 2002    7.5          0.514
## 18                  La cosa del otro mundo 1982    8.2          0.506
## 19                           Juego macabro 2004    7.6          0.496
## 20                              Depredador 1987    7.8          0.484
## 21                            El exorcista 1973    8.1          0.484
## 22                    La cabaña del terror 2011    7.0          0.478
## 23                                 El Menú 2022    7.2          0.468
## 24 Midsommar. El terror no espera la noche 2019    7.1          0.459
## 25                   Cloverfield: Monstruo 2008    7.0          0.437

Pregunta 05

# 1. Gráfico de relación entre Rating y Votos
p1 <- ggplot(peliculas, aes(x = Rating, y = Votos_millones)) +
  geom_point(size = 3, color = "darkred") +
  geom_smooth(method = "lm", se = FALSE, color = "blue", alpha = 0.5) +
  geom_text(aes(label = substr(Titulo, 1, 10)), hjust = 0.5, vjust = -0.8, size = 3) +
  labs(title = "Relación entre Rating y Popularidad",
       x = "Rating (0-10)",
       y = "Votos (millones)") +
  theme_minimal()

p1
## `geom_smooth()` using formula = 'y ~ x'

# 2. Top 5 películas más votadas (barras horizontales)
top5 <- peliculas %>%
  arrange(desc(Votos_millones)) %>%
  head(5)

top5
##                         Titulo  Año Rating Votos Votos_corregidos
## 1 El silencio de los inocentes 1991    8.6   1.7          1700000
## 2                El resplandor 1980    8.4   1.2          1200000
## 3    Alien, el octavo pasajero 1979    8.5   1.0          1000000
## 4                  Soy leyenda 2007    7.2 858.0           858000
## 5          Alien 2: El regreso 1986    8.4 818.0           818000
##   Votos_millones
## 1          1.700
## 2          1.200
## 3          1.000
## 4          0.858
## 5          0.818
p2 <- ggplot(top5, aes(x = reorder(Titulo, Votos_millones), y = Votos_millones)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  labs(title = "Top 5 Películas Más Votadas",
       x = "",
       y = "Votos (millones)") +
  theme_minimal()
p2

# 3. Evolución del rating por año
p3 <- ggplot(peliculas, aes(x = Año, y = Rating)) +
  geom_line(color = "green", size = 1) +
  geom_point(color = "darkgreen", size = 3) +
  geom_text(aes(label = Rating), vjust = -1, size = 3) +
  labs(title = "Evolución del Rating por Año",
       x = "Año",
       y = "Rating") +
  ylim(6, 9) +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
p3

Conclusiones finales