Introducción Exploración de datos

La exploración de datos es el primer paso del análisis de datos que se utiliza para explorar y visualizar datos que permite descubrir conocimientos desde el mismo inicio o identificar áreas o patrones para profundizarlos más.

¿Cuál es el objetivo del análisis exploratorio?

El análisis exploratorio tiene como objetivo identificar el modelo teórico más adecuado para representar la población de la cual proceden los datos muestrales

Dicho análisis se basa en gráficos y estadísticos que permiten explorar la distribución identificando características tales como: valores atípicos o outliers, saltos o discontinuidades, concentraciones de valores, forma de la distribución, entre otros.

El principal propósito del análisis exploratorio es tener una idea completa de cómo son nuestros datos, antes de decidir qué técnica de Ciencia de Datos o de Machine Learning usaremos. Y como en la práctica los datos no son ideales, debemos organizarlos, entender su contenido, entender cuáles son las variables más relevantes y cómo se relacionan unas con otras, comenzar a ver algunos patrones, determinar qué hacer con los datos faltantes y con los datos atípicos para finalmente extraer conclusiones acerca de todo este análisis.

En resumen una forma de entender, visualizar y extraer información relevante del set de datos para decidir cuál será la ruta o técnica más adecuada para su posterior procesamiento.

Fases del análisis exploratorio de datos:

  • Primer Paso: Tener clara la pregunta que queremos responder;
  • Segundo Paso Tener una idea general de nuestro dataset;
  • Tercer Paso Definir los tipos de datos que tenemos;
  • Cuarto Paso Elegir el tipo de estadística descriptiva
  • Quinto Paso Visualizar los datos;
  • Sexto Paso Analizar las posibles interacciones entre las variables del dataset;
  • Séptimo Paso Extraer algunas conclusiones de todo este análisis.

Notas de Interés:

  • Visualización de datos puede significar dos cosas:

  • visualizar datos para uno mismo, así que sinónimo de eso es el análisis exploratorio de datos,

  • o visualizarlo para otros Es decir hacer buenos gráficos que las personan puedan comprender.

  • Podemos trabajar en el análisis exploratorio de datos, buscando saber algo más de probabilidad y algo más de estadística para buscar patrones entre variables. Una parte muy importante de la exploración de datos es entender cómo es la relación entre x e y

Términos a comprender

  • Variable es una cantidad, cualidad o propiedad que se puede medir.

  • Valor es el estado de una variable cuando se mide. El valor de una variable puede cambiar de una medida a otra.

  • Observación es un conjunto de mediciones realizadas en condiciones similares (por lo general, realiza todas las mediciones en una observación al mismo tiempo y en el mismo objeto). Una observación contendrá varios valores, cada uno asociado con una variable diferente.

  • Datos tabulares son un conjunto de valores, cada uno asociado con una variable y una observación. Los datos tabulares están ordenados si cada valor se coloca en su propia “celda”, cada variable en su propia columna y cada observación en su propia fila.

EDA con RStudio

A la exploración de datos -EDA - podemos separarla en tres grandes fases: una de transformación de datos, otra de generar tablas resumen y otra de gráficas. Ahora, esto en R lo podemos ver utilizando los paquetes tidyr y dplyr para la transformación y limpieza de datos y ggplot para visualizaciones.

Etapas EDA

Ejemplo EDA

Utilizaremos el dataset, “Bihar:sample_data.csv” para analizar la altura de las mujeres en Bihar, en el estado de India. Para ello, necesitaremos los siguientes paquetes:


# Visualización de gráficos con ggplot
library(ggplot2)
# Limpiieza de datos 
library(dplyr)
# Formado csv lectura 
library(csvread)

Observamos los datos que contamos

Abrimos el archivo:

#Miramos los datos y comprendemos algunas características
bihar_data<-read.csv("data/Bihar_sample_data.csv")
str(bihar_data)
#> 'data.frame':    39553 obs. of  6 variables:
#>  $ personid : int  11010101 11010102 11010103 11010104 11010105 11010201 11010202 11010203 11010204 11010205 ...
#>  $ female   : int  0 0 1 0 1 0 1 0 0 1 ...
#>  $ adult    : int  1 1 1 0 0 1 1 0 0 0 ...
#>  $ age      : num  70 32 28 12 11 38 30 15 10 16 ...
#>  $ height_cm: num  164 157 150 146 135 ...
#>  $ weight_kg: num  48.9 44 37.7 30.7 30.2 67.7 57.3 59.3 40.7 43.9 ...

Analizamos más sus variables:

summary(bihar_data)
#>     personid            female           adult             age        
#>  Min.   :11010101   Min.   :0.0000   Min.   :0.0000   Min.   :  0.00  
#>  1st Qu.:14142114   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:  9.00  
#>  Median :18011402   Median :1.0000   Median :1.0000   Median : 20.00  
#>  Mean   :17674861   Mean   :0.5136   Mean   :0.5518   Mean   : 26.29  
#>  3rd Qu.:21181403   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.: 40.00  
#>  Max.   :24282407   Max.   :1.0000   Max.   :1.0000   Max.   :115.00  
#>                     NA's   :1        NA's   :14       NA's   :14      
#>    height_cm       weight_kg     
#>  Min.   :  1.0   Min.   :  1.00  
#>  1st Qu.:132.9   1st Qu.: 24.80  
#>  Median :149.4   Median : 41.60  
#>  Mean   :142.8   Mean   : 39.14  
#>  3rd Qu.:159.0   3rd Qu.: 50.60  
#>  Max.   :195.5   Max.   :141.70  
#>  NA's   :6415    NA's   :6063

Elegimos variables a trabajar, ya que queremos analizar la altura de adultos femeninos:

#Mantenemos solo los adultos femeninos

bihar_adult_females <- filter(bihar_data, adult==1, female==1)
#>   personid female adult age height_cm weight_kg
#> 1 11010103      1     1  28     150.3      37.7
#> 2 11010202      1     1  30     139.7      57.3
#> 3 11010207      1     1  35     147.5      38.9
#> 4 11010302      1     1  48     145.2      35.7
#> 5 11010303      1     1  22        NA        NA
#> 6 11010306      1     1  18        NA        NA

Exploramos

Tenemos los datos, ahora podemos explorar:

  • Trazado de histogramas
  • Trazado de la densidad de Kernels
  • Comparación de dos (o más) distribuciones
  • Trazado de estimaciones de CDF
  • Distribuciones bivariadas

Realizamos el histograma:

#> Warning: Removed 1432 rows containing non-finite values (`stat_bin()`).

Porqué utilizamos histograma

Un histograma es un gráfico que se utiliza para representar la distribución de frecuencias de algunos puntos de datos de una variable. Los histogramas frecuentemente clasifican los datos en varios “contenedores” o “grupos de rango” y cuentan cuántos puntos de datos pertenecen a cada uno de esos contenedores.

Características:

Un histograma es una estimación aproximada de la distribución de probabilidad función de una variable continua.

  • Lo obtenemos agrupando los datos (típicamente en contenedores de igual tamaño) y simplemente contando el número de observaciones dentro cada contenedor.

  • Gráfico de un histograma: Dibujamos, para cada bin, un rectángulo proporcional al número de tales casos.

  • También puede dividir por el número total de observaciones para obtener la densidad: la proporción de casos que dentro de cada compartimiento.

¿ Qué representa cada uno de estos contenedores?

Aqui, utilizamos un histograma para la altura de una mujer en Bihar, estado en India. Cada uno de estos contenedores, barras del histograma, es proporcional al número de mujeres que tienen ese tamaño de altura. Podemos representar conteo o densidad. En densidad se puede tener la proporción del número de observaciones que cae adentro. Así que todo lo que haríamos aquí es que ellos tienen exactamente la misma forma. Pero en lugar de ser 0, 500, 1000, etcétera seria un numero entre 0 y 1 que representan la fracción de mujeres que, de las observaciones que caen dentro de este contenedor. Así que cada uno de estos marcadores aquí se dividirá por la población en general.

Explorando sobre el histograma

El histograma generado, no permite ver en detalle. Por lo que ajustamos el gráfico.

Filtramos:

Agregamos detalles para que sea más visible:


ggplot(bihar_adult_females_trunc, aes(height_cm))+
  geom_histogram(fill="blue", color="darkblue")+
  xlab("Altura en  Centímetro, Bihar Females")

Jugamos con los contenedores

#Playing with bins 
bihar1 <- ggplot(bihar_adult_females_trunc, aes(height_cm))+
  geom_histogram(fill="blue", color="darkblue", binwidth = 5)+
  xlab("bin width=5")+
  ylab("")


bihar2 <- ggplot(bihar_adult_females_trunc, aes(height_cm))+
  geom_histogram(fill="blue", color="darkblue", binwidth = 10)+
  xlab("bin width=10")+
  ylab("")



bihar3 <- ggplot(bihar_adult_females_trunc, aes(height_cm))+
  geom_histogram(fill="blue", color="darkblue", binwidth = 20)+
  xlab("bin width=20")+
  ylab("")



bihar4 <- ggplot(bihar_adult_females_trunc, aes(height_cm))+
  geom_histogram(fill="blue", color="darkblue", binwidth = 50)+
  xlab("bin width=50")+
  ylab("")

Altura de Mujeres en Bihar


plot_grid(bihar1, bihar2, bihar3, bihar4, labels="Altura de Mujeres en Bihar", hjust=-1, vjust=0.2)

Lo mismo exploramos para las mujeres en USA

us_data <- read.csv("data/US_sample_data.csv")

Vemos un poco más las características del dataset

us_adult_females_trunc <- filter(us_data,female==1 , adult==1, height_cm>120 , height_cm<200)

Generamos el gráfico

ggplot(us_adult_females_trunc, aes(height_cm))+
  geom_histogram(fill="red", color="darkred")+
  xlab("Height in centimeters, US females")

Estimar la densidad de kernel

  • El histograma está un poco irregular…
  • La estimación de la densidad del kernel es una forma no paramétrica de estimar la función de densidad de probabilidad de una variable aleatoria.
  • Ampliación sencilla del histograma: en cada punto toma un promedio ponderado de la frecuencia de las observaciones.
  • Formalmente se expresa: Sea (x1, x2, …, xn) una muestra independiente e idénticamente distribuida extraída de alguna distribución con un PDF desconocido f. Nos interesa estimar la forma de esta función f
  • Muchas opciones para K(), pero normalmente tiene forma de campana.
ggplot(us_adult_females_trunc, aes(height_cm))+
  geom_histogram(data=us_adult_females_trunc, aes(height_cm , ..density..), fill="white" , color="darkred")+
  geom_density(kernel="gaussian", aes(height_cm))
#> Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
#> ℹ Please use `after_stat(density)` instead.

Jugamos con los contenedores

US1 <- ggplot(us_adult_females_trunc, aes(height_cm))+
  geom_histogram(data=us_adult_females_trunc, aes(height_cm , ..density..), fill="white" , color="darkred")+
  geom_density(kernel="gaussian", aes(height_cm), bw=1)+
  xlab("bw=1")+
  ylab("")

US2 <- ggplot(us_adult_females_trunc, aes(height_cm))+
  geom_histogram(data=us_adult_females_trunc, aes(height_cm , ..density..), fill="white" , color="darkred")+
  geom_density(kernel="gaussian", aes(height_cm), bw=5)+
  xlab("bw=5")+
  ylab("")

US3 <- ggplot(us_adult_females_trunc, aes(height_cm))+
  geom_histogram(data=us_adult_females_trunc, aes(height_cm , ..density..), fill="white" , color="darkred")+
  geom_density(kernel="gaussian", aes(height_cm), bw=10)+
  xlab("bw=10")+
  ylab("")

US4 <- ggplot(us_adult_females_trunc, aes(height_cm))+
  geom_histogram(data=us_adult_females_trunc, aes(height_cm , ..density..), fill="white" , color="darkred")+
  geom_density(kernel="gaussian", aes(height_cm), bw=20)+
  xlab("bw=20")+
  ylab("")

plot_grid(US1, US2, US3, US4, labels="Female Height in the US", hjust=-1, vjust=0.2)

Más sobre esta distribución

• ¿Qué observamos sobre la forma de esta curva? • Es unimodal, de cola delgada, simétrico.

Combinamos los dos histogramas

ggplot(bihar_adult_females_trunc, aes(height_cm))+
  geom_histogram(data=bihar_adult_females_trunc, aes(height_cm),fill="blue", color="darkblue" )+
  geom_histogram(data=us_adult_females_trunc, aes(height_cm), fill="red", color="darkred" )

No tiene sentido hacerlo contabilizando.

Hacemos más visibles los puntos.

ggplot(bihar_adult_females_trunc, aes(height_cm))+
  geom_freqpoly(data=bihar_adult_females_trunc, aes(height_cm, ..density.. ), color="darkblue" )+
  geom_freqpoly(data=us_adult_females_trunc, aes(height_cm , ..density..),  color="darkred" )+
  xlab("Height in centimeters")

Visualizamos la densidad de Kernel

ggplot(bihar_adult_females_trunc, aes(height_cm))+
  geom_density(data=bihar_adult_females_trunc, aes(height_cm), color="darkblue" )+
  geom_density(data=us_adult_females_trunc, aes(height_cm),  color="darkred" )+
  xlab("Height in centimeters")

Representamos el CDF

Referencias: