##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Explorar y comprender la estructura del conjunto de datos starwars, disponible en el paquete dplyr, que contiene información sobre personajes del universo de Star Wars.
Identificar la disponibilidad de datos biográficos, e investigar el origen de los mismos.
Aplicar limpieza, agrupación y visualización de los datos, para luego con ggplot2 para generar gráficos interpretables y bien estructurados.
Realizar intepretaciones sobre los graficos realizados, dejando constancia y razon de cada uno de ellos, poniendo en practica el analisis de la informacion.
El conjunto de datos starwars contiene información sobre
87 personajes del universo ficticio de Star Wars. Cada fila representa
un personaje, y las columnas incluyen datos físicos (altura, peso, color
de piel), biográficos (sexo, género, planeta de origen) y de
participación en la saga (películas, vehículos y naves en las que
aparece).
starwars y paquetes
relacionadosEl conjunto de datos starwars incluido en el paquete
dplyr del ecosistema tidyverse contiene
información sobre personajes del universo de Star Wars. Este dataset fue
creado con fines educativos y está basado en datos recopilados
públicamente de fuentes como la Star
Wars API (SWAPI). Está estructurado como un tibble y
preparado para ser utilizado directamente en análisis sin necesidad de
limpieza previa.
starwarsdb: Este paquete
proporciona una estructura relacional más completa de los datos de Star
Wars, dividiéndolos en múltiples tablas (films,
people, planets, etc.). Fue construido también
a partir de SWAPI y está diseñado para enseñar principios de bases de
datos relacionales en R. Además, permite utilizar los datos como una
base de datos DuckDB local.
rwars (no en CRAN): Otro paquete
orientado a facilitar el acceso en tiempo real a SWAPI desde R. Fue
desarrollado con un enfoque en llamadas a API en lugar de análisis
preprocesado.
Ambos comparten origen en la misma fuente (SWAPI), pero sirven a propósitos distintos dentro del entorno de R.
height, mass,
birth_yearhair_color,
skin_color, eye_color, sex,
gender, homeworld, speciesfilms, vehicles,
starships (listas de strings con nombres)La variable birth_year indica el año de nacimiento de
los personajes en relación al evento “Battle of Yavin”: -
Mínimo: 8 ABY (After) - Máximo: 896
BBY (Before)
Varias columnas contienen valores faltantes (NA).
| Variable | Cantidad de NA |
|---|---|
| height | 6 |
| mass | 28 |
| birth_year | 44 |
| hair_color | algunos |
| films | 0 |
| vehicles | muchos (listas vacías) |
| starships | muchos (listas vacías) |
Observación:
- mass y birth_year tienen muchos valores
faltantes posiblemente porque hay personajes con poca información
oficial.
- Las variables tipo lista como vehicles y
starships tienen estructuras vacías para personajes que no
usan medios de transporte propios.
- Los NA en hair_color pueden deberse a
especies sin cabello (como droides o criaturas alienígenas).
| Variable | Descripción |
|---|---|
| name | Nombre del personaje |
| height | Altura en centímetros |
| mass | Peso en kilogramos |
| hair_color | Color de cabello del personaje |
| skin_color | Color de piel |
| eye_color | Color de ojos |
| birth_year | Año de nacimiento según cronología ficticia |
| sex | Sexo biológico (male, female, none) |
| gender | Identidad de género (masculine, feminine, none) |
| homeworld | Planeta de origen |
| species | Especie del personaje (Human, Droid, etc.) |
| films | Lista de películas en las que aparece |
| vehicles | Lista de vehículos que ha conducido |
| starships | Lista de naves espaciales piloteadas |
birth_na <- starwars %>%
mutate(has_birthyear = ifelse(is.na(birth_year), "Desconocido", "Registrado"))
ggplot(birth_na, aes(x = has_birthyear, fill = has_birthyear)) +
geom_bar(width = 0.6, color = "white", alpha = 0.9) +
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5, size = 5, fontface = "bold") +
scale_fill_manual(values = c("Desconocido" = "#D95F02", "Registrado" = "#1B9E77")) +
labs(
title = "Disponibilidad del año de nacimiento",
subtitle = "En el universo de personajes de Star Wars",
x = NULL,
y = "Cantidad"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", size = 18, hjust = 0.5),
plot.subtitle = element_text(size = 13, hjust = 0.5),
axis.text = element_text(size = 12),
axis.title.y = element_text(margin = margin(r = 10))
) +
guides(fill = "none")
Interpretación del gráfico:
El gráfico muestra que hay una cantidad casi equilibrada de personajes con año de nacimiento registrado (43) y desconocido (44). Esto sugiere que, aunque hay muchos personajes documentados en el universo de Star Wars, no todos cuentan con datos completos.
Una posible explicación es que los personajes que tienen mayor protagonismo o relevancia narrativa tienden a tener más datos disponibles, mientras que los personajes secundarios, criaturas, o entidades con apariciones menores no tienen tanta información registrada, como es el caso de muchos droides, extraterrestres o personajes de fondo.
Este patrón refleja cómo la visibilidad y la importancia de un personaje podrían estar relacionadas con la cantidad de atributos biográficos que conocemos sobre ellos.
Análisis previo: cantidad de películas por personaje
## # A tibble: 2 × 4
## has_birthyear Promedio_peliculas Max_peliculas Min_peliculas
## <lgl> <dbl> <int> <int>
## 1 FALSE 1.32 3 1
## 2 TRUE 2.67 7 1
Este análisis muestra que los personajes con año de nacimiento registrado participan en más películas en promedio (2.67 frente a 1.32) y también alcanzan un máximo de 7 películas, mientras que los del grupo desconocido no superan las 3 apariciones.
Esta diferencia sugiere que los personajes más relevantes dentro de la narrativa —aquellos que aparecen en más películas— tienden a tener mayor información biográfica documentada, como su año de nacimiento. Este patrón será visualizado y confirmado en el gráfico de caja a continuación.
starwars %>%
mutate(
num_films = lengths(films),
has_birthyear = ifelse(is.na(birth_year), "Desconocido", "Registrado")
) %>%
ggplot(aes(x = has_birthyear, y = num_films, fill = has_birthyear)) +
geom_boxplot() +
labs(title = "Películas por personaje según disponibilidad de año de nacimiento",
x = "Año de nacimiento",
y = "Cantidad de películas") +
theme_minimal() +
scale_fill_manual(values = c("Desconocido" = "#D95F02", "Registrado" = "#1B9E77")) +
guides(fill = "none")
Interpretación del gráfico:
Este gráfico de caja muestra la cantidad de películas en las que participan los personajes, comparando aquellos que tienen año de nacimiento registrado con los que no.
Se puede observar que los personajes con año de nacimiento registrado tienden a aparecer en más películas en promedio que aquellos con año de nacimiento desconocido. Además, la mediana del grupo “Registrado” es visiblemente mayor que la del grupo “Desconocido”, lo cual refuerza la hipótesis inicial.
Esto sugiere que los personajes más importantes o recurrentes en la saga suelen tener más información biográfica documentada, como su fecha de nacimiento. En cambio, los personajes secundarios o con menor relevancia narrativa suelen carecer de este tipo de detalles, lo que respalda la idea inicial que la completitud de los datos está correlacionada con la prominencia del personaje en la saga.
ggplot(
data = starwars %>% filter(!is.na(height), !is.na(mass), !is.na(species)),
aes(x = height, y = mass, color = species)
) +
geom_point(size = 3, alpha = 0.8) +
labs(
title = "Altura vs Peso según especie",
subtitle = "Relación entre características físicas por especie",
x = "Altura (cm)",
y = "Peso (kg)",
color = "Especie"
) +
theme_minimal(base_size = 14) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
legend.position = "right", # Mueve la leyenda a la derecha
legend.text = element_text(size = 8),
legend.title = element_text(size = 10)
) +
guides(color = guide_legend(ncol = 2, byrow = TRUE))
Interpretación del gráfico:
El gráfico de dispersión muestra la relación entre la altura y el peso de los personajes del universo Star Wars, categorizados por especie mediante el color.
Se observa una fuerte concentración de personajes en un rango de altura entre 150 y 200 cm, y peso entre 50 y 120 kg, lo cual sugiere que la mayoría de las especies humanoides comparten proporciones físicas similares. Esto incluye especies como los humanos, mirialan, twi’lek y zabrak, entre otras.
También destaca un outlier vertical importante: un personaje de gran altura y peso —probablemente Jabba el Hutt— con un peso superior a los 1000 kg, lo que indica que algunas especies tienen características físicas extremadamente distintas y afectan la escala visual del gráfico.
## # A tibble: 31 × 5
## species `Promedio altura (cm)` `Promedio peso (kg)` `Máx altura (cm)`
## <chr> <dbl> <dbl> <int>
## 1 Wookiee 231 124 234
## 2 Kaminoan 229 88 229
## 3 Kaleesh 216 159 216
## 4 Gungan 210 74 224
## 5 Pau'an 206 80 206
## 6 Besalisk 198 102 198
## 7 Cerean 198 82 198
## 8 Nautolan 196 87 196
## 9 Skakoan 193 48 193
## 10 Neimodian 191 90 191
## 11 Trandoshan 190 113 190
## 12 Kel Dor 188 80 188
## 13 Tholothian 184 50 184
## 14 Geonosian 183 80 183
## 15 Human 180. 81.3 202
## 16 Mon Calamari 180 83 180
## 17 Togruta 178 57 178
## 18 Twi'lek 178 55 178
## 19 Hutt 175 1358 175
## 20 Zabrak 175 80 175
## 21 Rodian 173 74 173
## 22 Clawdite 168 55 168
## 23 Mirialan 168 53.1 170
## 24 Toong 163 65 163
## 25 Sullustan 160 68 160
## 26 Droid 140 69.8 200
## 27 Dug 112 40 112
## 28 Vulptereen 94 45 94
## 29 Ewok 88 20 88
## 30 Aleena 79 15 79
## 31 Yoda's species 66 17 66
## # ℹ 1 more variable: `Máx peso (kg)` <dbl>