Introducción

La razón por la que elegí el dataset de Pokémon es porque es un tema que me interesa personalmente.
El objetivo de este análisis es desarrollar un modelo de red neuronal para predecir si un Pokémon es legendario (is_legendary) usando estadísticas de combate como:

  • Salud (HP)
  • Ataque
  • Defensa
  • Velocidad
  • Ataque Especial
  • Defensa Especial

Paso 1: Instalar y cargar librerías

library(readr)
library(corrplot)
library(neuralnet)

Paso 2: Cargar el dataset y revisar valores faltantes

pokemon <- read_csv("C:/R/all_pokemon_data.csv")
View(pokemon)

# Verificar valores faltantes
colSums(is.na(pokemon))
##                  Name        National Dex #        Primary Typing 
##                     0                     0                     0 
##      Secondary Typing Secondary Typing Flag            Generation 
##                   530                     0                     0 
##      Legendary Status                  Form         Alt Form Flag 
##                     0                     0                     0 
##       Evolution Stage   Number of Evolution              Color ID 
##                     0                     0                     0 
##            Catch Rate           Height (dm)           Weight (hg) 
##                     0                     0                     0 
##           Height (in)          Weight (lbs)       Base Stat Total 
##                     0                     0                     0 
##                Health                Attack               Defense 
##                     0                     0                     0 
##        Special Attack       Special Defense                 Speed 
##                     0                     0                     0

Paso 3: Limpieza y transformación de datos

# Eliminar filas con NA
pokemon <- na.omit(pokemon)

# Renombrar la columna objetivo
names(pokemon)[names(pokemon) == "Legendary Status"] <- "is_legendary"

# Convertir lógica a binario
pokemon$is_legendary <- as.numeric(pokemon$is_legendary)

# Seleccionar variables relevantes
datos_poke <- pokemon[, c("Health", "Attack", "Defense", "Speed",
                          "Special Attack", "Special Defense", "is_legendary")]

# Renombrar columnas para compatibilidad
colnames(datos_poke) <- make.names(colnames(datos_poke))

Descripción de Variables

  • Health: Puntos de salud del Pokémon.
  • Attack: Daño causado por ataques físicos.
  • Defense: Resistencia a ataques físicos.
  • Speed: Influye en el orden de ataque.
  • Special Attack: Potencia de ataques especiales.
  • Special Defense: Resistencia a ataques especiales.
  • is_legendary: 1 si es legendario, 0 si no.

Paso 4: Análisis de correlación

corr_poke <- round(cor(datos_poke), 2)
corrplot(corr_poke, method = "number", type = "upper", tl.cex = 0.8)

Este análisis nos permite ver qué variables están más relacionadas entre sí. Nos ayuda a identificar colinealidades o patrones previos al entrenamiento.


Paso 5: Entrenamiento de la red neuronal

set.seed(123)

red_poke <- neuralnet(is_legendary ~ Health + Attack + Defense + Speed + Special.Attack + Special.Defense,
                      hidden = c(5, 3),
                      linear.output = FALSE,
                      act.fct = "logistic",
                      data = datos_poke)

# Guardar modelo entrenado
save(red_poke, file = "C:/R/Unidad 2/Modelos Entrenados/modeloPokemon.RData")

# Visualización de la red
plot(red_poke)

Paso 6: Predicción y evaluación del modelo

# Obtener predicciones
preds <- unlist(red_poke$net.result)

# Tabla comparativa
tablita_poke <- data.frame(
  Predicho = round(preds),
  Real = datos_poke$is_legendary,
  Acierto = round(preds) == datos_poke$is_legendary
)

View(tablita_poke)

# Precisión del modelo
precision <- sum(tablita_poke$Acierto) / nrow(tablita_poke) * 100
paste("Precisión del modelo:", round(precision, 2), "%")
## [1] "Precisión del modelo: 85.17 %"

Matriz de Confusión

table(Predicho = round(preds), Real = datos_poke$is_legendary)
##         Real
## Predicho   0   1
##        0 467  54
##        1  43  90

Esta matriz nos permite ver cuántos Pokémon fueron correctamente clasificados como legendarios o no legendarios.


Resumen General

Este proyecto consistió en:

  • Preparar y limpiar un dataset real.
  • Seleccionar las variables relevantes para el análisis.
  • Usar una red neuronal con dos capas ocultas para resolver un problema de clasificación binaria.
  • Evaluar el desempeño del modelo mediante una tabla comparativa y una matriz de confusión.

Conclusión

Esta práctica fue una excelente introducción al uso de redes neuronales en R. Aprendí cómo:

  • Procesar datos reales,
  • Identificar correlaciones úctiles,
  • Aplicar un modelo de machine learning,
  • Interpretar métricas de rendimiento.

¡Además, fue divertido analizar algo relacionado con Pokémon! 🎮