if (!require("ggplot2")) install.packages("ggplot2")
## Cargando paquete requerido: ggplot2
if (!require("mice")) install.packages("mice")
## Cargando paquete requerido: mice
##
## Adjuntando el paquete: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
if (!require("reshape2")) install.packages("reshape2")
## Cargando paquete requerido: reshape2
if (!require("randomForest")) install.packages("randomForest")
## Cargando paquete requerido: randomForest
## randomForest 4.7-1.2
## Type rfNews() to see new features/changes/bug fixes.
##
## Adjuntando el paquete: 'randomForest'
## The following object is masked from 'package:ggplot2':
##
## margin
library(ggplot2)
library(mice)
library(reshape2)
library(randomForest)
Este análisis exploratorio de datos (EDA) está enfocado en un conjunto de datos sintético relacionado con problemas de inteligencia artificial (IA). El objetivo es entender las relaciones entre los algoritmos utilizados, los frameworks implementados, los tipos de problemas abordados, y las métricas de desempeño como precisión y tiempo de entrenamiento. A través de este EDA, buscamos identificar patrones, correlaciones, y posibles áreas de mejora en los modelos de IA.
data <- read.csv(file.choose())
head(data)
## Algorithm Framework Problem_Type Dataset_Type Accuracy Precision
## 1 SVM Scikit-learn Regression Time Series 0.6618051 0.6929447
## 2 K-Means Keras Clustering Time Series 0.7443216 0.4900292
## 3 Neural Network Keras Clustering Image 0.8852037 0.5948056
## 4 SVM Keras Clustering Text 0.8416477 0.8424142
## 5 SVM Scikit-learn Regression Tabular 0.7229514 0.6856109
## 6 K-Means PyTorch Regression Image 0.6368133 0.6255330
## Recall F1_Score Training_Time Date
## 1 NA 0.4426950 4.978592 2023-03-08 11:26:21
## 2 0.8766533 0.4414046 NA 2023-03-09 11:26:21
## 3 0.9685424 0.9644707 3.282594 2023-03-10 11:26:21
## 4 0.8748388 0.7041523 4.041629 2023-03-11 11:26:21
## 5 0.3010956 0.6456472 3.603991 2023-03-12 11:26:21
## 6 7.4548096 0.8865271 3.006475 2023-03-13 11:26:21
str(data)
## 'data.frame': 560 obs. of 10 variables:
## $ Algorithm : chr "SVM" "K-Means" "Neural Network" "SVM" ...
## $ Framework : chr "Scikit-learn" "Keras" "Keras" "Keras" ...
## $ Problem_Type : chr "Regression" "Clustering" "Clustering" "Clustering" ...
## $ Dataset_Type : chr "Time Series" "Time Series" "Image" "Text" ...
## $ Accuracy : num 0.662 0.744 0.885 0.842 0.723 ...
## $ Precision : num 0.693 0.49 0.595 0.842 0.686 ...
## $ Recall : num NA 0.877 0.969 0.875 0.301 ...
## $ F1_Score : num 0.443 0.441 0.964 0.704 0.646 ...
## $ Training_Time: num 4.98 NA 3.28 4.04 3.6 ...
## $ Date : chr "2023-03-08 11:26:21" "2023-03-09 11:26:21" "2023-03-10 11:26:21" "2023-03-11 11:26:21" ...
summary(data)
## Algorithm Framework Problem_Type Dataset_Type
## Length:560 Length:560 Length:560 Length:560
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## Accuracy Precision Recall F1_Score
## Min. :0.5038 Min. :0.4019 Min. :0.3001 Min. :0.4000
## 1st Qu.:0.6236 1st Qu.:0.5632 1st Qu.:0.4819 1st Qu.:0.5515
## Median :0.7578 Median :0.7195 Median :0.6493 Median :0.7086
## Mean :0.8779 Mean :0.8129 Mean :0.7486 Mean :0.8122
## 3rd Qu.:0.8824 3rd Qu.:0.8596 3rd Qu.:0.8404 3rd Qu.:0.8438
## Max. :9.7181 Max. :9.7320 Max. :9.3662 Max. :9.3740
## NA's :39 NA's :19 NA's :20 NA's :20
## Training_Time Date
## Min. : 0.1032 Length:560
## 1st Qu.: 1.2441 Class :character
## Median : 2.4347 Mode :character
## Mean : 2.9910
## 3rd Qu.: 3.8131
## Max. :46.9856
## NA's :20
Este conjunto de datos contiene 10 variables, incluyendo tanto métricas numéricas como Accuracy, Precision, y Training_Time, y variables categóricas como Algorithm, Framework, y Problem_Type. Este análisis se enfocará en extraer información clave de estas variables.
sapply(data, function(x) sum(is.na(x)))
## Algorithm Framework Problem_Type Dataset_Type Accuracy
## 0 0 0 0 39
## Precision Recall F1_Score Training_Time Date
## 19 20 20 20 0
Revisamos los valores faltantes en cada variable. Si existen valores faltantes, podríamos eliminarlos o imputarlos utilizando métodos como mice para asegurar que los análisis no se vean afectados por la falta de información.
Imputar valores faltantes con el paquete mice si es necesario library(mice) imputed_data <- mice(data, method = ‘pmm’, m = 5) complete_data <- complete(imputed_data, 1)
#Analisis descriptivo de variables
##Variables categoricas Analicemos primero las variables categóricas: Algorithm, Framework, y Problem_Type. Comencemos visualizando la distribución de estas variables.
###Distribucion de algoritmos
library(ggplot2)
ggplot(data, aes(x = Algorithm)) +
geom_bar(fill = "steelblue") +
labs(title = "Distribución de Algoritmos", x = "Algoritmos", y = "Frecuencia")
Observamos que Random Forest es el algoritmo más utilizado, seguido de
Neural Network. Esta alta frecuencia en el uso de Random Forest podría
sugerir que es un algoritmo popular debido a su flexibilidad y capacidad
para manejar tanto clasificación como regresión. Sin embargo, puede ser
relevante evaluar su desempeño en relación con otros algoritmos, dado
que su mayor uso no garantiza que sea el más eficiente en todas las
situaciones.
ggplot(data, aes(x = Framework)) +
geom_bar(fill = "darkorange") +
labs(title = "Distribución de Frameworks", x = "Framework", y = "Frecuencia")
Vemos que TensorFlow y Scikit-learn son los frameworks más utilizados.
Esto puede deberse a que ambos son muy versátiles y ampliamente
adoptados en la industria de la IA. TensorFlow es particularmente útil
en problemas relacionados con deep learning, mientras que Scikit-learn
es popular por su facilidad de uso y su amplio rango de algoritmos.
ggplot(data, aes(x = Problem_Type)) +
geom_bar(fill = "purple") +
labs(title = "Distribución de Tipos de Problema", x = "Tipo de Problema", y = "Frecuencia")
Los problemas de clasificación son los más comunes en este conjunto de
datos, seguidos de los problemas de regresión y clustering. Esto sugiere
que las tareas de clasificación, como la categorización de imágenes o
textos, dominan las aplicaciones de IA en este caso.
Pasemos ahora a analizar las métricas de desempeño numéricas: Accuracy, Precision, Recall, y Training_Time.
ggplot(data, aes(x = Accuracy)) +
geom_histogram(binwidth = 0.05, fill = "lightgreen", color = "black") +
labs(title = "Histograma de Precisión", x = "Precisión", y = "Frecuencia")
## Warning: Removed 39 rows containing non-finite outside the scale range
## (`stat_bin()`).
La mayoría de los modelos tienen una precisión que oscila entre 0.75 y
1. Esto sugiere que la precisión de los modelos en general es alta,
aunque puede haber algunos modelos que no están rindiendo tan bien. Este
análisis es importante porque, aunque la precisión es alta, puede que
otros factores como el tiempo de entrenamiento o el recall influyan en
la eficiencia general del modelo.
ggplot(data, aes(x = Training_Time)) +
geom_histogram(binwidth = 0.5, fill = "lightblue", color = "black") +
labs(title = "Histograma de Tiempo de Entrenamiento", x = "Tiempo (horas)", y = "Frecuencia")
## Warning: Removed 20 rows containing non-finite outside the scale range
## (`stat_bin()`).
El tiempo de entrenamiento varía considerablemente entre los modelos, con algunos modelos completando el entrenamiento en menos de una hora, mientras que otros pueden tardar mucho más. Esto podría ser un factor crítico en aplicaciones donde el tiempo de respuesta es importante, como en entornos de producción. Modelos con alto tiempo de entrenamiento podrían no ser viables en estos casos, independientemente de su precisión.
El análisis bivariado nos permite observar la relación entre dos variables
ggplot(data, aes(x = Problem_Type, y = Accuracy, fill = Problem_Type)) +
geom_boxplot() +
labs(title = "Precisión por Tipo de Problema", x = "Tipo de Problema", y = "Precisión")
## Warning: Removed 39 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
Los problemas de clasificación tienden a tener una mayor precisión en
comparación con los problemas de regresión y clustering. Esto podría
deberse a que los algoritmos en el conjunto de datos están más
optimizados para clasificación, un tipo de problema más estructurado en
la mayoría de los casos. El clustering, por otro lado, puede ser más
desafiante debido a la falta de etiquetas claras.
ggplot(data, aes(x = Algorithm, y = Training_Time, fill = Algorithm)) +
geom_boxplot() +
labs(title = "Tiempo de Entrenamiento por Algoritmo", x = "Algoritmo", y = "Tiempo (horas)")
## Warning: Removed 20 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
Random Forest y SVM tienen los tiempos de entrenamiento más largos, lo
cual es esperable dado que son algoritmos complejos que requieren más
procesamiento. En contraste, K-Means es uno de los algoritmos más
rápidos, lo que lo convierte en una opción atractiva para tareas donde
el tiempo de entrenamiento es un factor crítico. Sin embargo, la
precisión de K-Means suele ser menor para ciertos tipos de problemas, lo
que puede limitar su uso.
Una forma efectiva de analizar las relaciones entre variables numéricas es a través de un mapa de calor de correlación.
# Calcular la matriz de correlación
corr_matrix <- cor(data[,c("Accuracy", "Precision", "Recall", "F1_Score", "Training_Time")], use="complete.obs")
# Graficar mapa de calor
library(reshape2)
ggplot(melt(corr_matrix), aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1,1)) +
labs(title = "Mapa de Calor de la Correlación entre Métricas")
El mapa de calor muestra una fuerte correlación positiva entre Precision, Recall, y F1_Score, lo cual tiene sentido, ya que estas métricas están directamente relacionadas entre sí. Por otro lado, no parece haber una correlación fuerte entre el tiempo de entrenamiento y las demás métricas
Detectar y visualizar outliers en las variables numéricas puede ofrecer más información sobre la distribución de los datos y posibles valores extremos.
# Boxplot para identificar outliers en Accuracy
ggplot(data, aes(y = Accuracy)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Boxplot para la Precisión (Accuracy)", y = "Precisión")
## Warning: Removed 39 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
# Boxplot para identificar outliers en Training_Time
ggplot(data, aes(y = Training_Time)) +
geom_boxplot(fill = "lightcoral") +
labs(title = "Boxplot para el Tiempo de Entrenamiento", y = "Tiempo de Entrenamiento (Horas)")
## Warning: Removed 20 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
Estos boxplots permiten identificar valores atípicos en las métricas
clave como precisión y tiempo de entrenamiento. Si se detectan outliers,
podrías analizar si estos valores tienen sentido en el contexto de los
algoritmos utilizados.
Si tu conjunto de datos incluye una variable de fecha (Date), puedes analizar cómo han cambiado las métricas a lo largo del tiempo.
# Si hay una columna Date en el dataset
data$Date <- as.Date(data$Date) # Asegúrate de que el formato sea correcto
# Gráfico de líneas para observar cambios en Accuracy a lo largo del tiempo
ggplot(data, aes(x = Date, y = Accuracy, group = 1)) +
geom_line(color = "blue") +
labs(title = "Cambio de Precisión a lo Largo del Tiempo", x = "Fecha", y = "Precisión")
# Gráfico de líneas para el Tiempo de Entrenamiento
ggplot(data, aes(x = Date, y = Training_Time, group = 1)) +
geom_line(color = "red") +
labs(title = "Cambio en el Tiempo de Entrenamiento a lo Largo del Tiempo", x = "Fecha", y = "Tiempo de Entrenamiento (Horas)")
Este análisis te permite identificar tendencias o cambios en el desempeño de los modelos a lo largo del tiempo, lo cual puede ser útil si estás evaluando modelos entrenados en diferentes momentos.
Permite evaluar si las diferencias en la precisión entre los diferentes tipos de problemas o frameworks son estadísticamente significativas usando ANOVA (Análisis de Varianza).
# ANOVA para verificar diferencias de precisión entre tipos de problemas
anova_accuracy <- aov(Accuracy ~ Problem_Type, data = data)
summary(anova_accuracy)
## Df Sum Sq Mean Sq F value Pr(>F)
## Problem_Type 2 1.2 0.5915 0.664 0.515
## Residuals 518 461.3 0.8906
## 39 observations deleted due to missingness
# ANOVA para verificar diferencias de precisión entre frameworks
anova_framework <- aov(Accuracy ~ Framework, data = data)
summary(anova_framework)
## Df Sum Sq Mean Sq F value Pr(>F)
## Framework 3 1.9 0.6436 0.722 0.539
## Residuals 517 460.6 0.8909
## 39 observations deleted due to missingness
Si los resultados de ANOVA son significativos (p < 0.05), esto indicará que hay diferencias significativas entre los grupos. Esto es útil para confirmar si ciertos tipos de problemas o frameworks realmente influyen en la precisión de los modelos.
Esto incluye características que influyen en el desempeño del modelo, podrías realizar un análisis para determinar la importancia de estas características. Este análisis es relevante cuando deseas entender qué variables son más influyentes en el rendimiento del modelo (e.g., Problem_Type, Framework, etc.).
# Eliminar filas con valores faltantes
clean_data <- na.omit(data)
# Entrenar modelo Random Forest con datos limpios
rf_model <- randomForest(Accuracy ~ ., data = clean_data, importance = TRUE)
# Mostrar la importancia de las características
importance(rf_model)
## %IncMSE IncNodePurity
## Algorithm -0.3627233 10.592753
## Framework -0.6893186 5.545347
## Problem_Type -2.1119976 7.064082
## Dataset_Type 0.5987700 9.507938
## Precision 1.4225206 50.415610
## Recall 0.5208222 31.595890
## F1_Score -1.2492123 47.784366
## Training_Time -1.9599877 35.002937
## Date -2.9292565 47.692213
varImpPlot(rf_model)
Este gráfico te mostrará qué variables (framework, algoritmo, etc.)
tienen mayor peso en la precisión del modelo. Esto puede ser clave para
mejorar el desempeño de los modelos al enfocarse en las variables más
influyentes.
Si sospechas que algunas de las relaciones entre las variables no son lineales, puedes usar la correlación de Spearman en lugar de Pearson. Esta técnica es útil para detectar relaciones monotónicas no lineales entre variables.
# Correlación de Spearman entre métricas
spearman_corr <- cor(data[,c("Accuracy", "Precision", "Recall", "F1_Score", "Training_Time")], method = "spearman", use = "complete.obs")
# Graficar la correlación de Spearman
ggplot(melt(spearman_corr), aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1,1)) +
labs(title = "Mapa de Calor de la Correlación (Spearman)")
La correlación de Spearman es útil cuando las relaciones entre las
variables no son estrictamente lineales. Esto te puede dar información
sobre cómo variables como Training_Time o Precision podrían estar
relacionadas de manera no lineal con otras métricas.
Puedes usar el algoritmo K-Means para ver si hay patrones ocultos entre los datos y agrupar los modelos en base a sus métricas (como Accuracy, Training_Time, etc.).
# Eliminar filas con NA, NaN o Inf en las columnas Accuracy y Training_Time
data_clean <- data[complete.cases(data$Accuracy, data$Training_Time) & is.finite(data$Accuracy) & is.finite(data$Training_Time), ]
# Aplicar K-means con los datos limpios
set.seed(123)
wss <- (nrow(data_clean) - 1) * sum(apply(data_clean[,c("Accuracy", "Training_Time")], 2, var))
for (i in 2:10) wss[i] <- sum(kmeans(data_clean[,c("Accuracy", "Training_Time")], centers = i)$withinss)
plot(1:10, wss, type="b", pch = 19, frame = FALSE,
xlab="Número de clusters", ylab="Suma de cuadrados dentro de los clusters")
# Aplicar K-means con 3 clusters
kmeans_result <- kmeans(data_clean[,c("Accuracy", "Training_Time")], centers = 3)
# Agregar los clusters al dataframe
data_clean$Cluster <- as.factor(kmeans_result$cluster)
# Visualizar los clusters
ggplot(data_clean, aes(x = Accuracy, y = Training_Time, color = Cluster)) +
geom_point() +
labs(title = "Clusters basados en Precisión y Tiempo de Entrenamiento",
x = "Precisión", y = "Tiempo de Entrenamiento (Horas)")
El análisis de clustering agrupa los modelos en diferentes clusters, lo
que puede ayudarnos a identificar grupos de modelos con comportamientos
similares en términos de precisión y tiempo de entrenamiento. Esto es
útil para segmentar los modelos y analizar características comunes
dentro de cada grupo.
El análisis de Chi-Cuadrado es útil para determinar si existe una relación significativa entre dos variables categóricas. En este caso, podemos evaluar si el algoritmo utilizado está asociado con el tipo de problema que aborda.
# Tabla de contingencia entre Algorithm y Problem_Type
contingency_table <- table(data$Algorithm, data$Problem_Type)
# Mostrar la tabla de contingencia
print(contingency_table)
##
## Classification Clustering Regression
## K-Means 55 58 50
## Neural Network 47 39 49
## Random Forest 38 50 38
## SVM 35 49 52
# Prueba Chi-cuadrado
chi_test <- chisq.test(contingency_table)
# Resultados de la prueba Chi-cuadrado
print(chi_test)
##
## Pearson's Chi-squared test
##
## data: contingency_table
## X-squared = 6.5396, df = 6, p-value = 0.3655
La tabla de contingencia muestra la frecuencia con la que cada algoritmo se usa en los diferentes tipos de problemas (clasificación, regresión, clustering).
El resultado de la prueba de Chi-cuadrado indicará si hay una asociación significativa entre las variables. Si el valor p es menor que 0.05, podemos concluir que existe una relación significativa entre el tipo de algoritmo y el tipo de problema.
El análisis de Chi-cuadrado nos permitirá ver si ciertos algoritmos son preferidos para tipos específicos de problemas, lo cual es útil para identificar patrones y tomar decisiones informadas sobre qué algoritmo utilizar para un tipo de problema determinado.
Este análisis exhaustivo sobre un conjunto de datos sintético relacionado con problemas de inteligencia artificial nos permitió extraer información valiosa sobre el comportamiento de los algoritmos, frameworks, tipos de problemas, y las métricas clave que influyen en el rendimiento de los modelos de IA. A continuación, se presentan las conclusiones clave derivadas de este análisis:
En cuanto a frameworks, TensorFlow y Scikit-learn fueron los más utilizados. TensorFlow es popular en aplicaciones de deep learning, mientras que Scikit-learn destaca por su simplicidad y diversidad de algoritmos para machine learning clásico. La elección del framework tiene un impacto importante en el rendimiento de los modelos, tal como se evidenció en los gráficos de precisión y tiempo de entrenamiento por framework.
Tiempo de Entrenamiento: Hubo una variabilidad significativa en el tiempo de entrenamiento de los modelos, con algunos algoritmos, como K-Means, siendo mucho más rápidos en comparación con algoritmos como Random Forest o SVM, que requerían tiempos de entrenamiento mucho más largos. Esto es relevante en entornos donde el tiempo de ejecución es crítico, lo que sugiere que, aunque Random Forest es popular, su uso podría no ser ideal en escenarios donde se necesiten tiempos de entrenamiento rápidos.
Relación entre Algoritmos y Tiempo de Entrenamiento: Algoritmos como Random Forest y SVM mostraron tiempos de entrenamiento más largos, lo cual es consistente con la complejidad de estos modelos. Por otro lado, K-Means fue significativamente más rápido, pero su precisión fue generalmente menor. Esto resalta el compromiso entre precisión y velocidad, donde la elección del algoritmo depende del contexto y de los requisitos del proyecto.