Resumen: El análisis exploratorio de datos (AED) es el primer paso en un proyecto de datos. Crearemos un template de código para hacerlo con solo una función.

Introducción

El AED consiste en un análisis univariado (1-variable) y bivariado (2-variables).
En este artículo revisaremos algunas funciones que nos llevan al análisis del primer caso.

  • Paso 1 - Primer acercamiento a los datos
  • Paso 2 - Analizar las variables categóricas
  • Paso 3 - Analizar las variables numéricas
  • Paso 4 - Analizar numérico y categórico al mismo tiempo

Abarcando algunos puntos clave en un AED básico:

  • Tipos de datos
  • Los valores atípicos (outliers)
  • Los valores faltantes (nulos)
  • Análisis de distribuciones (numéricas y gráficas) para ambos tipos.

💻 Este post está estrechamente relacionado con el curso Desembarcando en R > 2da Edición, pueden anotarse gratis acá, o ir a la versión paga con soporte y certificado, aquí!

Fin de pauta publicitaria, sigamos con el post!


Tipo de resultados de los análisis

Pueden ser dos: informativos u operativos.

Informativas - Por ejemplo, gráficos, o cualquier resumen largo de variables. No podemos filtrar los datos de él, pero nos da mucha información a la vez. La más utilizada en la etapa AED.

Operativo - Los resultados pueden ser usados para tomar una acción directamente en el flujo de trabajo de los datos (por ejemplo, seleccionando cualquier variable cuyo porcentaje de valores faltantes esté por debajo del 20%). Más utilizado en la etapa Preparación de datos.

Preparación

Descomentar en caso de que no tengas ninguna de estas librerías:

# install.packages("tidyverse")
# install.packages("funModeling")
# install.packages("Hmisc")

library(funModeling) 
library(tidyverse) 
library(Hmisc)

Si ya tienen funModeling, recuerden volver a instalarla para disponer de las últimas funciones y fixes.


Resumen de código

Ejecutar todas las funciones de este post de una sola vez con la siguiente función:

basic_eda <- function(data)
{
  glimpse(data)
  print(status(data))
  freq(data) 
  print(profiling_num(data))
  plot_num(data)
  describe(data)
}

Remplacen data con sus datos, y eso es todo! 🎉

aed_basico(mis_super_datos)

<br>



Creando los datos para este ejemplo

Usando los datos de heart_disease (del paquete funModeling). Tomaremos sólo 4 variables para su legibilidad.

data=heart_disease %>% select(age, max_heart_rate, thal, has_heart_disease)

Paso 1 - Primer acercamiento a los datos

Número de observaciones (filas) y variables, y una muestra de los primeros casos.

glimpse(data)
## Observations: 303
## Variables: 4
## $ age               <int> 63, 67, 67, 37, 41, 56, 62, 57, 63, 53, 57, ...
## $ max_heart_rate    <int> 150, 108, 129, 187, 172, 178, 160, 163, 147,...
## $ thal              <fct> 6, 3, 7, 3, 3, 3, 3, 3, 7, 7, 6, 3, 6, 7, 7,...
## $ has_heart_disease <fct> no, yes, yes, no, no, no, yes, no, yes, yes,...

Obteniendo las métricas sobre tipos de datos, ceros, números infinitos y valores perdidos:

status(data)
##            variable q_zeros p_zeros q_na p_na   q_inf p_inf    type unique
## 1               age       0       0    0 0.0000     0     0 integer     41
## 2    max_heart_rate       0       0    0 0.0000     0     0 integer     91
## 3              thal       0       0    2 0.0066     0     0  factor      3
## 4 has_heart_disease       0       0    0 0.0000     0    

status devuelve una tabla, así que es fácil tener las variables que coincidan con ciertas condiciones como:
+ Tener al menos el 80% de los valores no-NA (p_na < 0.2)
+ Tener menos de 50 valores únicos (unique <= 50)

💡 TIPS:

  • ¿Todas las variables están en el tipo de datos correcto?
  • ¿Variables con muchos ceros o NAs?
  • ¿Alguna variable de alta cardinalidad?

[🔎 Leer más aquí]

Paso 2: Analizar las variables categóricas

La función freq se ejecuta automáticamente para todas las variables factor o character.

freq(data)
Análisis de frecuencia
##   thal frequency percentage cumulative_perc
## 1    3       166      54.79              55
## 2    7       117      38.61              93
## 3    6        18       5.94              99
## 4 <NA>         2       0.66             100
Análisis de frecuencia
##   has_heart_disease frequency percentage cumulative_perc
## 1                no       164         54              54
## 2               yes       139         46             100

## [1] "Variables processed: thal, has_heart_disease"

💡 TIPS:

  • Si freq recibe una variable - freq(data$variable) -, se devuelve una tabla. Esto es útil para tratar variables de alta cardinalidad (como el código postal).
  • Exportar las gráficas a jpeg en el directorio actual: freq(data, path_out = ".")
  • ¿Todas las categorías tienen sentido?
  • ¿Muchos valores perdidos (NA)?
  • Siempre comprobar los valores absolutos y relativos

[🔎 Leer mas aquí]

Paso 3 - Analizar las variables numéricas

Ya veremos: plot_num y profiling_num. Ambos se ejecutan automáticamente para todas las variables numéricas y enteras:

Visualmente

plot_num(data)
Histogramas

Exportar el gráfico a jpeg: plot_num(data, path_out = ".")

💡 TIPS:

  • Identificar las variables desbalanceadas
  • Comprobar visualmente cualquier variable con valores atípicos (outliers)

[🔎 Leer más aquí]

Cuantitativamente

La función profiling_num se ejecutará para todas las variables numericas/integer automáticamente:

data_prof=profiling_num(data)
##         variable mean std_dev variation_coef p_01 p_05 p_25 p_50 p_75 p_95
## 1            age   54       9           0.17   35   40   48   56   61   68
## 2 max_heart_rate  150      23           0.15   95  108  134  153  166  182
##   p_99 skewness kurtosis iqr        range_98     range_80
## 1   71    -0.21      2.5  13        [35, 71]     [42, 66]
## 2  192    -0.53      2.9  32 [95.02, 191.96] [116, 176.6]

💡 TIPS:

  • Describir cada variable en función de su distribución (también útil para la presentación de informes)
  • Prestar atención a las variables con altp desvio estándar.
  • Seleccionar las métricas con las que esté más familiarizado: data_prof %>% select(variable, variation_coef, rango_98): Un valor alto en variation_coef puede indicar valores atípicos. rango_98 indica dónde están la mayoría de los valores.

[🔎 Leer más aquí]

Paso 4 - Análisis de variables numéricas y categóricas al mismo tiempo

Usaremos la función describe del paquete Hmisc.

library(Hmisc)
describe(data)
## data 
## 
##  4  Variables      303  Observations
## ---------------------------------------------------------------------------
## age 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      303        0       41    0.999    54.44     10.3       40       42 
##      .25      .50      .75      .90      .95 
##       48       56       61       66       68 
## 
## lowest : 29 34 35 37 38, highest: 70 71 74 76 77
## ---------------------------------------------------------------------------
## max_heart_rate 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      303        0       91        1    149.6    25.73    108.1    116.0 
##      .25      .50      .75      .90      .95 
##    133.5    153.0    166.0    176.6    181.9 
## 
## lowest :  71  88  90  95  96, highest: 190 192 194 195 202
## ---------------------------------------------------------------------------
## thal 
##        n  missing distinct 
##      301        2        3 
##                          
## Value         3    6    7
## Frequency   166   18  117
## Proportion 0.55 0.06 0.39
## ---------------------------------------------------------------------------
## has_heart_disease 
##        n  missing distinct 
##      303        0        2 
##                     
## Value        no  yes
## Frequency   164  139
## Proportion 0.54 0.46
## ---------------------------------------------------------------------------

Es muy útil para tener una imagen rápida de todas las variables. Pero no es tan operativo como freq y profiling_num cuando queremos usar sus resultados para cambiar nuestro flujo de datos.

💡 TIPS:

  • Comprobar los valores mínimos y máximos (valores atípicos)
  • Verificar las distribuciones (igual que ántes)

[🔎 Leer más aquí]



En la escuela tenemos un curso super completo llamado Ciencia de Datos 360 con R.🤓 [soporte y certificado]


📬 Escuela de Datos Vivos en Linkedin y Twitter.