¡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!
Extraer los títulos de las películas de terror más votadas
Obtener los años de lanzamiento
Recopilar las calificaciones de los usuarios
Crear un dataframe con toda la información
Realizar visualizaciones y análisis que revelen insights clave
# 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
“El silencio de los inocentes” es la película mejor valorada (8.6) y también la más votada (1.7M votos), lo que indica consenso entre crítica y público.
Existe una correlación positiva entre rating y votos - las películas mejor valoradas tienden a tener más votos, sugiriendo que la calidad atrae a más espectadores.
Las sagas de Alien tienen calificaciones consistentemente altas (8.5 y 8.4), demostrando la calidad mantenida en la franquicia.
Psicosis (1960) tiene una calificación excepcional (8.5) para su antigüedad, confirmando su estatus de clásico atemporal.
Las películas más recientes como ¡Huye! (2017) mantienen altos estándares de calidad (7.8), mostrando que el género sigue evolucionando favorablemente.
No parece haber una correlación clara entre la antigüedad de las películas y su rating, lo que sugiere que las buenas películas mantienen su calidad con el tiempo.