A continuación, se presenta un resumen de los más levante que engloba el tema de Minería de Datos; por ende, contendrá en cada subtema su respectiva descripción y código representativo de la explicación.

1. Fundamentos de minería de datos

La minería de datos es un proceso, el cual implica la exploración y análisis de grandes volúmenes de datos. En otras palabras, busca encontrar patrones, tendencias y relaciones que no se persiben a simple vista; cabe mencionar que, dos de los enfoques más reconocidos en este campo son CRISP-DM (Cross-Industry Standard Process for Data Mining) y KDD (Knowledge Discovery in Databases). Por lo tanto,la minería de datos se basa en técnicas estadísticas y algoritmos de aprendizaje automático para identificar dichos patrones y realizar predicciones basadas en los datos analizados.

1.1 Ciclos de vida CRISP-DM

Cross-Industry Standard Process for Data Mining (CRISP-DM) es un metodo ampliamente utilizada en minería de datos, se estructura en seis fases interrelacionadas al permitir un enfoque iterativo y adaptativo, como se observa en la fig 1.

Fases del ciclo de vida CRISP-DM

Figura 1. Fases del ciclo de vida CRISP-DM


Descripción de las fases del ciclo:

  1. Comprensión del Negocio: Identificación de los objetivos y requisitos del proyecto, asegurando que el análisis esté alineado con las necesidades empresariales; en otras palabras, se define objetivos y requisitos.

  2. Comprensión de los Datos: Recolección y exploración inicial de los datos disponibles, con ello familiarizarse con su contenido y calidad; en otras palabras, recolección y exploración inicial.

  3. Preparación de los Datos: Esta se basa en la limpieza, transformación y selección de datos adecuados para el modelado. Por lo tanto, en esta fase incluye la eliminación de ruido, manejo de valores faltantes y creación de variables derivadas.

  4. Modelado: Aplicación de técnicas de minería de datos para construir modelos predictivos o descriptivos, en esta fase puede implicar la selección de algoritmos adecuados según el tipo de problema.

  5. Evaluación: Análisis del modelo construido para determinar su efectividad y adecuación a los objetivos iniciales. Por ende, se evalúan métricas como precisión, recall y F1-score.

  6. Despliegue: Implementación del modelo en un entorno real, lo que puede incluir la creación de informes o la integración del modelo en sistemas existentes.

1.2 Ciclos de vida KDD

KDD (Knowledge Discovery in Databases) es un proceso más amplio que abarca la extracción de conocimiento a partir de bases de datos, enfatizando la importancia de cada etapa en el descubrimiento efectivo del conocimiento. Por lo tanto, se centra en el proceso completo de descubrimiento, desde la selección de datos hasta la interpretación final, enfatizando la importancia del preprocesamiento.

Fases del ciclo de vida KDD

Figura 2. Fases del ciclo de vida KDD


Las fases principales son (se percibe en la fig 2):

  1. Selección: Identificación y recolección de datos relevantes para el análisis.

  2. Procesamiento: Limpieza y transformación de los datos para eliminar inconsistencias y preparar los datos para el análisis.

  3. Transformación: Conversión de los datos preprocesados en un formato adecuado para el análisis, lo que puede incluir la normalización o agregación.

  4. Minería de datos: Aplicación de algoritmos para descubrir patrones interesantes en los datos, utilizando técnicas como clustering, clasificación o asociación.

  5. Evaluación: Validación y análisis crítico de los patrones descubiertos para asegurar su utilidad y aplicabilidad.

  6. Presentación: Comunicación efectiva de los resultados obtenidos a través del proceso KDD, utilizando visualizaciones o reportes que faciliten la comprensión por parte de las partes interesadas.

1.3 Comparativa entre CRISP-DM y KDD

En resumen, se obtiene lo siguiente:

  • Enfoque: CRISP-DM se centra más en la alineación con objetivos empresariales desde el inicio, mientras que KDD abarca un proceso más técnico que enfatiza la extracción efectiva del conocimiento.
  • Iteratividad: Ambas metodologías son iterativas; sin embargo, CRISP-DM proporciona un marco más estructurado con fases claramente definidas, mientras que KDD permite mayor flexibilidad en el manejo de las etapas.
  • Aplicaciones Prácticas: CRISP-DM es frecuentemente utilizado en proyectos comerciales debido a su enfoque práctico y orientado a resultados, mientras que KDD es más común en entornos académicos e investigaciones donde se busca entender profundamente los procesos subyacentes.

Ambas metodologías, CRISP-DM y KDD, ofrecen enfoques valiosos para abordar proyectos de minería de datos, cada una con sus propias fortalezas. Por lo tanto, la elección entre ellas dependerá del contexto específico del proyecto, así como de los objetivos empresariales y técnicos involucrados.

2. Preparación de datos

La preparación de datos es un proceso fundamental en la minería de datos que incluye la importación, limpieza y transformación de los datos para su análisis. A continuación, se presentan un ejemplo práctico utilizando el conjunto de datos Titanic.


Conjunto de datos “Titanic”

Este conjunto de datos proporciona información sobre el destino de los pasajeros del fatal viaje inaugural del transatlántico ‘Titanic’, estos datos fueron recopilados originalmente por la Junta de Comercio Británica en su investigación del naufragio. Cabe señalar que, no existe un acuerdo total entre las fuentes primarias en cuanto al número exacto de personas a bordo, rescatadas o perdidas. Por lo tanto, la fuente proporciona un conjunto de datos que registra la clase, el sexo, la edad y el estado de supervivencia de cada persona a bordo del Titanic, y se basa en datos recopilados originalmente por la Junta de Comercio Británica.

2.1 Importación de datos

La importación de datos es el primer paso en el análisis de datos. Cabe mencionar que, se pueden utilizar bases de datos o dataset del mismo R ó un archivo .CSV (almacena datos tabulares). Dependiendo de la elección, por ejemplo, en un archivo .CSV se pueden importar con “read.csv” del paquete readr.

# Necesario instalar y cargar las librerías a utilizar 
library(dplyr)
library(tidyr)
library(readr)
library(ggplot2)
library(reshape2)
library(caret) # Para la normalización
library(FactoMineR) # Para PCA
library(rpart)
library(rpart.plot)
library(randomForest)
library(e1071)
library(cluster)

# Ejemplo: Importar desde un archivo .CSV
titanic_data <- read.csv("/Users/anacastillo/Downloads/Titanic-Dataset.csv")

# Visualizar las primeras filas del dataset
head(titanic_data)

2.2 Limpieza de datos

2.2.1 Identificar y eliminar valores duplicados

Los valores duplicados pueden distorsionar los resultados del análisis; por ende, es esencial identificarlos y eliminarlos para asegurar la integridad del conjunto de datos.

#Función duplicated
data_duplicated = duplicated(titanic_data)
head(!data_duplicated)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE
#SubVector sin datos duplicados
titanic_cleaned_data = titanic_data[!data_duplicated,]
head(titanic_cleaned_data)

2.2.2 Reemplazar o eliminar valores incorrectos y atípicos

Los valores incorrectos o atípicos pueden surgir debido a errores en la entrada de datos y deben ser tratados adecuadamente para evitar sesgos en el análisis.

# Boxplot para visualización
boxplot(titanic_cleaned_data$Age, main = "Boxplot Edades", ylab = "Edad")

#Identificar
Q1 = quantile(titanic_cleaned_data$Age, 0.25, na.rm=TRUE)
Q3 = quantile(titanic_cleaned_data$Age, 0.75, na.rm=TRUE)

#Rango
IQR = Q3 - Q1

#Limite inferior y superior
LimiteInf = Q1 - 1.5 * IQR
LimiteSup = Q3 + 1.5 * IQR

#Sin datos atipicos
dataSinOutliners = titanic_cleaned_data[titanic_cleaned_data$Age >= LimiteInf & 
                                    titanic_cleaned_data$Age <= LimiteSup |
                                    is.na(titanic_cleaned_data$Age),]
boxplot(dataSinOutliners$Age, main = "Boxplot Edades", ylab = "Edad")

2.2.3 Manejar valores faltantes

Los valores faltantes son comunes en conjuntos de datos reales y pueden manejarse mediante eliminación o imputación.

#Eliminar las filas que presenten datos faltantes 
titanic_cleaned_data = na.omit(titanic_cleaned_data)
head(titanic_cleaned_data)
#Para visualizar algunos resultados relevantes después de la limpieza:
#Histograma de edades después de quitar los valores faltantes
hist(titanic_cleaned_data$Age, main = "Histograma: Distribución de Edades",
     xlab = "Edad",
     ylab="Frecuencia"
      )

2.2.4 Escalado y normalización

El escalado y normalización son técnicas utilizadas para ajustar la escala de los datos numéricos, lo que es especialmente importante para algoritmos de aprendizaje automático.

# Resultado previo
head(titanic_cleaned_data)
# Normalizar la columna fare
titanic_scaled_data <- titanic_cleaned_data %>%
  mutate(Fare = scale(Fare))

# Visualizar resultado final
head(titanic_scaled_data)

2.2.5 ¿Comó utilizar las librerías como dplyr y tidyr?

Para utilizar las librerías dplyr y tidyr en R, es fundamental entender sus funciones principales; cabe mencionar que, se deben instalar previamente y cargar en R: install.packages(“tidyverse”) O install.packages(“dplyr”).

Principales funciones de dplyr

dplyr proporciona una serie de “verbos” que facilitan la manipulación de data frames:

  • select(): Selecciona columnas específicas.
  • filter(): Filtra filas basadas en condiciones lógicas.
  • mutate(): Crea nuevas columnas a partir de columnas existentes.
  • arrange(): Ordena las filas según una o varias columnas.
  • summarise(): Genera resúmenes estadísticos.
  • group_by(): Agrupa los datos para realizar operaciones resumidas sobre cada grupo.

Ejemplo:

#Uso de dplyr para seleccionar y filtrar
# Filtrar personas mayores de 50 años y seleccionar el nombre
result_dplyr <- titanic_cleaned_data %>%
  filter(Age > 50) %>%
  select(Name)
head(result_dplyr)

Principales funciones de tidyr

tidyr se centra en la estructura de los datos, permitiendo convertir entre formatos “anchos” y “largos”, así como limpiar y organizar los datos:

  • gather(): Convierte datos de formato ancho a largo.
  • spread(): Convierte datos de formato largo a ancho.
  • separate(): Separa una columna en varias.
  • unite(): Combina varias columnas en una sola.

Ejemplo

#Previo
head(titanic_cleaned_data$Name)
## [1] "Braund, Mr. Owen Harris"                            
## [2] "Cumings, Mrs. John Bradley (Florence Briggs Thayer)"
## [3] "Heikkinen, Miss. Laina"                             
## [4] "Futrelle, Mrs. Jacques Heath (Lily May Peel)"       
## [5] "Allen, Mr. William Henry"                           
## [6] "McCarthy, Mr. Timothy J"
#Uso de tidyr para separar el nombre y apellido
titanic_separated <- titanic_cleaned_data %>%
  separate(Name, into = c("LastName", "Name"), sep = ",")

#Separado
titanic_names <- titanic_separated %>%
  select(LastName, Name)
head(titanic_names)

2.2.6 Resumen de la preparación de los datos

Para la importación de los datos, se utiliza “read.csv()” para cargar el dataset del Titanic desde un archivo CSV. Con ello, proceder con la eliminación de duplicados, en donde, se utilizó la función “duplicated()” para las fila duplicada en el dataset y para el manejo de los valores faltantes, se utilizó la función “na.omit”. Del mismo modo, se utiliza un boxplot para visualizar los outliers o datos atipicos en la columna Age y se eliminan los outliers utilizando el rango intercuartílico (IQR).Como ultimo, se las columna Fare se normaliza con la función scale().

3. Análisis exploratorio de datos (EDA)

El análisis exploratorio de datos (EDA) es un enfoque para analizar conjuntos de datos con el objetivo de resumir sus principales características, frecuentemente utilizando técnicas visuales. A continuación, se presentarán estadísticas descriptivas y visualizaciones del conjunto de datos Titanic.

3.1 Estadísticas descriptivas

Las estadísticas descriptivas proporcionan un resumen numérico de las características del conjunto de datos, incluyendo medidas como la media(promedio aritmético de un conjunto de valores), mediana(valor central; robusta ante valores atípicos), moda(valor más frecuente).

#La función summary en automático lo calcula
summary(titanic_cleaned_data)
##   PassengerId       Survived          Pclass          Name          
##  Min.   :  1.0   Min.   :0.0000   Min.   :1.000   Length:714        
##  1st Qu.:222.2   1st Qu.:0.0000   1st Qu.:1.000   Class :character  
##  Median :445.0   Median :0.0000   Median :2.000   Mode  :character  
##  Mean   :448.6   Mean   :0.4062   Mean   :2.237                     
##  3rd Qu.:677.8   3rd Qu.:1.0000   3rd Qu.:3.000                     
##  Max.   :891.0   Max.   :1.0000   Max.   :3.000                     
##      Sex                 Age            SibSp            Parch       
##  Length:714         Min.   : 0.42   Min.   :0.0000   Min.   :0.0000  
##  Class :character   1st Qu.:20.12   1st Qu.:0.0000   1st Qu.:0.0000  
##  Mode  :character   Median :28.00   Median :0.0000   Median :0.0000  
##                     Mean   :29.70   Mean   :0.5126   Mean   :0.4314  
##                     3rd Qu.:38.00   3rd Qu.:1.0000   3rd Qu.:1.0000  
##                     Max.   :80.00   Max.   :5.0000   Max.   :6.0000  
##     Ticket               Fare           Cabin             Embarked        
##  Length:714         Min.   :  0.00   Length:714         Length:714        
##  Class :character   1st Qu.:  8.05   Class :character   Class :character  
##  Mode  :character   Median : 15.74   Mode  :character   Mode  :character  
##                     Mean   : 34.69                                        
##                     3rd Qu.: 33.38                                        
##                     Max.   :512.33
# O calcular las estadísticas descriptivas por cada una
stats_descrip <- titanic_cleaned_data %>%
  summarise(
    Media_Edad = mean(Age, na.rm = TRUE),
    Mediana_Edad = median(Age, na.rm = TRUE),
    Varianza_Edad = var(Age, na.rm = TRUE),
    Desviacion_Edad = sd(Age, na.rm = TRUE),
    Media_Fare = mean(Fare, na.rm = TRUE),
    Mediana_Fare = median(Fare, na.rm = TRUE),
    Varianza_Fare = var(Fare, na.rm = TRUE),
    Desviacion_Fare = sd(Fare, na.rm = TRUE)
  )

# Mostrar estadísticas descriptivas
stats_descrip

3.2 Visualización de datos con gráficos

3.1.2 Histogramas

Los histogramas son útiles para visualizar la distribución de una variable numérica; con ello, permiten observar la frecuencia de los valores en diferentes intervalos.

# Histograma de edad
hist(titanic_cleaned_data$Age, main = "Histograma de Edades",
     xlab = "Edad",
     ylab="Frecuencia"
      )

3.1.2 Diagramas de caja

Los diagramas de caja (boxplots) son útiles para visualizar la dispersión y detectar valores atípicos en los datos.

# Diagrama de caja para la edad por clase
ggplot(titanic_cleaned_data, aes(x = factor(Pclass), y = Age)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Diagrama de Caja de Edades por Clase", x = "Clase", y = "Edad") +
  theme_minimal()

3.1.3 Diagramas de dispersión

Los diagramas de dispersión son utilizados para observar la relación entre dos variables numéricas.

# Diagrama de dispersión entre Fare y Age
ggplot(titanic_cleaned_data, aes(x = Fare, y = Age)) +
  geom_point(alpha=0.5) +
  labs(title = "Diagrama de Dispersión entre Tarifa y Edad", x = "Tarifa", y = "Edad") +
  theme_minimal()

3.1.4 Correlaciones y tendencias

Identificar correlaciones entre variables es crucial para entender cómo se relacionan entre sí.

# Calcular la matriz de correlación
correlation_matrix <- cor(titanic_cleaned_data %>% select(Age, Fare), use="complete.obs")

# Mostrar la matriz de correlación
correlation_matrix
##             Age       Fare
## Age  1.00000000 0.09606669
## Fare 0.09606669 1.00000000
# Convertir la matriz a formato largo
melted_correlation <- melt(correlation_matrix)

# Gráfico de calor para la matriz de correlación
ggplot(melted_correlation, aes(Var1, Var2, fill=value)) +
  geom_tile() +
  scale_fill_gradient2(low="blue", high="red", mid="white", midpoint=0) +
  labs(title="Matriz de Correlación", x="", y="") +
  theme_minimal() +
  theme(axis.text.x=element_text(angle=45, hjust=1))

El análisis exploratorio es fundamental para comprender las características del conjunto de datos Titanic. Dado que, a través del uso de estadísticas descriptivas y visualizaciones, se pueden identificar patrones importantes y relaciones entre variables.

4. Técnicas de reducción de dimensionalidad

La reducción de dimensionalidad es una técnica utilizada en minería de datos y aprendizaje automático para simplificar modelos sin perder información significativa. Una de las técnicas más comunes es el Análisis de Componentes Principales (PCA).

4.1 Análisis de componentes principales (PCA)

El Análisis de Componentes Principales (PCA) es una técnica estadística que transforma un conjunto de variables posiblemente correlacionadas en un conjunto de variables no correlacionadas llamadas componentes principales. Dichos componentes, son ordenados por la cantidad de varianza que explican del conjunto original, permitiendo así reducir la dimensionalidad del conjunto de datos mientras se conserva la mayor parte de la variabilidad.

El PCA se basa en la descomposición en valores propios (eigenvalues) y vectores propios (eigenvectors) de la matriz de covarianza del conjunto de datos. Los primeros componentes principales capturan la mayor parte de la variabilidad, mientras que los últimos componentes explican cada vez menos.

4.1 Ejemplo práctico

# Para mejor comprensión del proceso, se reitera que se debe manejar los valores faltantes(ya se realizo, pero si no es el caso se realiza lo siguiente)
titanic_pca_data <- titanic_data %>%
  select(Age, Fare, Pclass) %>%
  na.omit()

# Y del mismo caso, la normalizar los datos
titanic_pca_data_scaled <- scale(titanic_pca_data)

# PCA
pca_result <- prcomp(titanic_pca_data_scaled, center = TRUE, scale. = TRUE)

# Resumen del PCA
summary(pca_result)
## Importance of components:
##                           PC1    PC2    PC3
## Standard deviation     1.3087 0.9548 0.6130
## Proportion of Variance 0.5709 0.3039 0.1253
## Cumulative Proportion  0.5709 0.8748 1.0000


Visualización del PCS

# Gráfico del porcentaje de varianza explicada por cada componente
screeplot(pca_result, main = "Scree Plot", col = "blue", pch = 19, xlab = "Componente",)

# Dataframe con las coordenadas proyectadas
pca_scores <- as.data.frame(pca_result$x)

# Agregar la clase para visualización
pca_scores$Pclass <- titanic_data$Pclass[!is.na(titanic_data$Age) & !is.na(titanic_data$Fare)]

# Gráfico de dispersión en los dos primeros componentes principales
ggplot(pca_scores, aes(x = PC1, y = PC2, color = factor(Pclass))) +
  geom_point(alpha=0.5) +
  labs(title = "Proyección en los Primeros Dos Componentes Principales",
       x = "Componente Principal 1",
       y = "Componente Principal 2",
       color = "Clase") +
  theme_minimal()

El Análisis de Componentes Principales (PCA) es una técnica para reducir la dimensionalidad y resaltar las características más importantes en un conjunto de datos, en este ejemplo práctico se observo con el conjunto de datos Titanic.

5. Modelos supervisados

5.1 Conceptos básicos de predicción y clasificación

La predicción y clasificación son tareas fundamentales en minería de datos que permiten a los analistas de datos tomar decisiones informadas basadas en datos históricos.

-Predicción: Se refiere a la estimación de valores futuros basados en patrones identificados en datos históricos. Los modelos predictivos pueden ser utilizados para prever tendencias, comportamientos o resultados futuros. -Clasificación: Es el proceso de asignar una categoría a una observación basada en sus características. En este contexto, se utilizan algoritmos para predecir la clase a la que pertenece una instancia a partir de un conjunto de datos etiquetado.

5.2 Ejemplos prácticos

5.2.1 Regresión lineal

La regresión lineal es un método estadístico que modela la relación entre una variable dependiente y una o más variables independientes utilizando una línea recta.

#Para mejor comprensión del proceso, se reitera que se debe manejar los valores faltantes(ya se realizo, pero si no es el caso se realiza lo siguiente)
titanic_regression_data <- titanic_data %>%
  select(Age, Fare) %>%
  na.omit()

# Ajustar un modelo de regresión lineal
linear_model <- lm(Fare ~ Age, data = titanic_regression_data)

# Resumen del modelo
summary(linear_model)
## 
## Call:
## lm(formula = Fare ~ Age, data = titanic_regression_data)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -42.42 -24.49 -17.60   2.33 475.78 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  24.3009     4.4922   5.410 8.64e-08 ***
## Age           0.3500     0.1359   2.575   0.0102 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 52.71 on 712 degrees of freedom
## Multiple R-squared:  0.009229,   Adjusted R-squared:  0.007837 
## F-statistic: 6.632 on 1 and 712 DF,  p-value: 0.01022


Visualización

# Gráfico de dispersión con la línea de regresión
library(ggplot2)

ggplot(titanic_regression_data, aes(x = Age, y = Fare)) +
  geom_point() +
  geom_smooth(method = "lm", col = "blue") +
  labs(title = "Regresión Lineal: Tarifa vs Edad", x = "Edad", y = "Tarifa")

5.2.2 Regresión logística

La regresión logística es un modelo utilizado para predecir la probabilidad de un evento binario (por ejemplo, supervivencia o no supervivencia) basado en uno o más predictores; se menciona que, se utiliza la función logística para limitar los resultados entre 0 y 1.

# Ajustar un modelo de regresión logística
logistic_model <- glm(Survived ~ Age + Sex + Pclass, data = titanic_data, family = binomial)


Visualización

# Resumen del modelo
summary(logistic_model)
## 
## Call:
## glm(formula = Survived ~ Age + Sex + Pclass, family = binomial, 
##     data = titanic_data)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  5.056006   0.502128  10.069  < 2e-16 ***
## Age         -0.036929   0.007628  -4.841 1.29e-06 ***
## Sexmale     -2.522131   0.207283 -12.168  < 2e-16 ***
## Pclass      -1.288545   0.139259  -9.253  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 964.52  on 713  degrees of freedom
## Residual deviance: 647.29  on 710  degrees of freedom
##   (177 observations deleted due to missingness)
## AIC: 655.29
## 
## Number of Fisher Scoring iterations: 5

5.2.2.1 Regresión logística: Utilizando métricas de evaluación (precisión, recall, F1-score)

Explicación de las métricas

  • Precisión: Proporción de verdaderos positivos entre todos los casos etiquetados como positivos.
  • Recall (Sensibilidad): Proporción de verdaderos positivos entre todos los casos reales positivos.
  • F1 Score: Media armónica entre precisión y recall, útil cuando se necesita un balance entre ambas métricas.

Utilizando el modelo anterior, se realizaran predicciones sobre los datos:

# Métricas de evaluación
predicted_probs <- predict(logistic_model, titanic_data)
confusion_table <- table (predicted_probs, titanic_data$Survived)
precision <- sum(diag(confusion_table))/sum(confusion_table) 

#Valores de la matriz de confusión
TP <- confusion_table[1,1]  
FN <- confusion_table[1,2]  
FP <- confusion_table[2,1]  
TN <- confusion_table[2,2]  

#Calcular Recall
recall <- TP / (TP + FN)

#Calcular F1-score
f1_score <- 2 * (precision * recall) / (precision + recall)

#Resultados
cat("Precisión del modelo: ", precision)
## Precisión del modelo:  0.00140056
cat("Recall del modelo: ", recall)
## Recall del modelo:  1
cat("F1_Score del modelo: ", f1_score)
## F1_Score del modelo:  0.002797203

5.2.1 Árboles de decisión

Los árboles de decisión son modelos predictivos que utilizan un enfoque basado en reglas para clasificar instancias, se dividen los datos en subconjuntos basados en características específicas.

# Ajustar un árbol de decisión
decision_tree_model <- rpart(Survived ~ Age + Sex + Pclass, data = titanic_data, method = "class")


Visualización

# Visualizar el árbol
rpart.plot(decision_tree_model)

5.2.1 Bosques aleatorios (Random Forest)

El bosque aleatorio es un método que utiliza múltiples árboles de decisión para mejorar la precisión del modelo; dado que, combina las predicciones de varios árboles para obtener un resultado más robusto.

# Ajustar un modelo de bosque aleatorio
random_forest_model <- randomForest(Survived ~ Age + Sex + Pclass, data = titanic_cleaned_data)


Visualización

# Resumen del modelo
print(random_forest_model)
## 
## Call:
##  randomForest(formula = Survived ~ Age + Sex + Pclass, data = titanic_cleaned_data) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 1
## 
##           Mean of squared residuals: 0.1376161
##                     % Var explained: 42.94

5.2.1 Máquinas de soporte vectorial (SVM)

Las máquinas de soporte vectorial son modelos supervisados que buscan encontrar el hiperplano óptimo que separa diferentes clases en el espacio multidimensional.

# Ajustar un modelo SVM
svm_model <- svm(Survived ~ Age + Sex + Pclass, data = titanic_data)


Visualización

# Resumen del modelo
summary(svm_model)
## 
## Call:
## svm(formula = Survived ~ Age + Sex + Pclass, data = titanic_data)
## 
## 
## Parameters:
##    SVM-Type:  eps-regression 
##  SVM-Kernel:  radial 
##        cost:  1 
##       gamma:  0.25 
##     epsilon:  0.1 
## 
## 
## Number of Support Vectors:  322

Se han explorado diversas técnicas predictivas y clasificatorias utilizando el conjunto de datos Titanic. Por ello, cada técnica tiene sus propias ventajas y desventajas dependiendo del contexto del problema y los datos disponibles; se menciona que, las métricas de evaluación son fundamentales para determinar la efectividad del modelo implementado.

6. Modelos no Supervisados

Los modelos no supervisados son técnicas de aprendizaje automático que se utilizan para encontrar patrones en datos no etiquetados. Uno de los algoritmos más conocidos en esta categoría es el K-Means.

6.1 Algoritmo K-Means

K-Means es un algoritmo de agrupamiento que busca dividir un conjunto de datos en \(k\) grupos (o clústeres) basándose en características similares. Por lo tanto, el objetivo del algoritmo es minimizar la varianza dentro de cada clúster, es decir, maximizar la similitud entre los puntos dentro del mismo clúster y minimizar la similitud entre puntos en diferentes clústeres.

Proceso de K-Means se puede resumir en los siguientes pasos:

  1. Inicialización: Seleccionar \(k\) puntos aleatorios como centroides iniciales.
  2. Asignación: Asignar cada punto de datos al clúster cuyo centroide esté más cercano.
  3. Recalibración: Calcular nuevos centroides como la media de todos los puntos asignados a cada clúster.
  4. Repetición: Repetir los pasos 2 y 3 hasta que no haya cambios significativos en los centroides o se alcance un número máximo de iteraciones.

6.2 Ejemplo práctico

# Para mejor comprensión del proceso, se reitera que se debe manejar los valores faltantes(ya se realizo, pero si no es el caso se realiza lo siguiente)
titanic_kmeans_data <- titanic_data %>%
  select(Age, Fare) %>%
  na.omit()

# Y de la misma manera, escalar los datos
titanic_kmeans_data_scaled <- scale(titanic_kmeans_data)

# Aplicar el algoritmo K-Means
set.seed(123) # Para reproducibilidad
kmeans_result <- kmeans(titanic_kmeans_data_scaled, centers = 3, nstart = 25)

# Agregar los resultados al dataframe original
titanic_kmeans_data$Cluster <- as.factor(kmeans_result$cluster)

# Mostrar los resultados del clustering
head(titanic_kmeans_data)


Visualización

# Gráfico de dispersión con los clústeres identificados
ggplot(titanic_kmeans_data, aes(x = Age, y = Fare, color = Cluster)) +
  geom_point(alpha = 0.5) +
  labs(title = "Clustering K-Means en el Conjunto de Datos Titanic",
       x = "Edad",
       y = "Tarifa") +
  theme_minimal() +
  scale_color_manual(values = c("red", "green", "blue"), 
                     labels = c("Cluster 1", "Cluster 2", "Cluster 3"))

El algoritmo K-Means es una técnica poderosa para agrupar datos no etiquetados en clústeres basados en similitudes. En este ejemplo práctico con el conjunto de datos Titanic, se aplico K-Means para identificar grupos de pasajeros según su edad y tarifa, visualizando claramente cómo se agrupan los datos en diferentes clústeres.

7. Evaluación y validación de modelos

La evaluación y validación de modelos son pasos cruciales en el proceso de minería de datos. Estos pasos aseguran que los modelos generados sean precisos y generalizables a nuevos datos.

7.1 División en conjuntos de entrenamiento, validación y prueba

La división de los datos en conjuntos de entrenamiento, validación y prueba es una práctica estándar en el desarrollo de modelos predictivos:

  • Conjunto de entrenamiento: Este conjunto se utiliza para entrenar el modelo. Contiene ejemplos conocidos que el modelo utiliza para aprender las relaciones entre las variables independientes y la variable dependiente.
  • Conjunto de validación: Este conjunto se utiliza para ajustar los parámetros del modelo y evitar el sobreajuste (overfitting). Permite evaluar el rendimiento del modelo durante el proceso de entrenamiento.
  • Conjunto de prueba: Este conjunto se utiliza para evaluar la capacidad del modelo para generalizar a nuevos datos. Se mantiene separado durante todo el proceso de entrenamiento y validación.

7.2 Ejemplos de validación cruzada con funciones de R

La validación cruzada es una técnica que permite evaluar la capacidad generalizadora de un modelo dividiendo los datos en múltiples subconjuntos. Por ejemplo, una forma común es la validación cruzada k-fold, donde los datos se dividen en \(k\) grupos (o “folds”). En otras palabras, el modelo se entrena \(k\) veces, cada vez utilizando un fold diferente como conjunto de prueba y los demás como conjunto de entrenamiento.

#Para mejor comprensión del proceso, se reitera que se debe manejar los valores faltantes(ya se realizo, pero si no es el caso se realiza lo siguiente)
titanic_data <- titanic_data %>%
  select(Survived, Age, Fare, Pclass, Sex) %>%
  mutate(Sex = ifelse(Sex == "male", 1, 0)) %>%
  na.omit()

# Definir el control para la validación cruzada
control <- trainControl(method = "cv", number = 10)

# Ajustar un modelo de regresión logística usando validación cruzada
set.seed(123) # Para reproducibilidad
logistic_model_cv <- train(Survived ~ Age + Fare + Pclass + Sex,
                           data = titanic_data,
                           method = "glm",
                           family = "binomial",
                           trControl = control)


Visualización

# Mostrar resultados del modelo
print(logistic_model_cv)
## Generalized Linear Model 
## 
## 714 samples
##   4 predictor
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 642, 642, 643, 643, 643, 643, ... 
## Resampling results:
## 
##   RMSE       Rsquared   MAE      
##   0.3804824  0.4033319  0.2907415

En este ejemplo con el conjunto de datos Titanic, se aplico la validación cruzada para evaluar un modelo de regresión logística.

8. Referencias bibliográficas

  1. Breiman, L. (2001). Random Forests. Machine Learning, 45(1), 5-32. https://doi.org/10.1023/A:1010933404324
  2. Hastie, T., Tibshirani, R., & Friedman, J. (2009). The Elements of Statistical Learning: Data Mining, Inference, and Prediction (2nd ed.). Springer.
  3. James, G., Witten, D., Hastie, T., & Tibshirani, R. (2013). An Introduction to Statistical Learning with Applications in R. Springer.
  4. R Core Team. (2023). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. https://www.R-project.org/
  5. Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis. Springer.