Inteligencia Analítica de Datos con R

Análisis Exploratorio de datos

Msc. Roberto Trespalacios

Universidad Tecnológica de Bolivar

7/11/22

Análisis exploratorio de información con R

¿Qué vamos a aprender?

En este tutorial vamos a aprender cómo realizar análisis exploratorio de datos con R. El primer paso para analizar datos es comenzar a explorar las variables de nuestra base de datos para:

  • Encontrar patrones
  • Identificar errores
  • Plantear nuevas hipótesis o preguntas
  • Identificar relaciones entre variables
  • Empezar a encontrar respuestas a nuestras preguntas de investigación.

Es importante considerar que este es un primer paso y no corresponde a un análisis estadístico riguroso, pero puede permitirnos encontrar respuestas o guiarnos en el tipo de análisis que queremos realizar.

¿Qué es análisis exploratorio?

Lectura recomendada: Exploratory Data Analysis-Howard Seltman El análisis exploratorio puede ser gráfico o no gráfico y univariado o multivariado (normalmente de dos variables).

  • No gráfica: Calcula estadísticas descriptivas de las variables
  • Gráfico: Calcula estadísticas de forma gráfica
  • Univariado: Analiza una sola variable a la vez
  • Multivariado: Analiza dos o más variables

A su vez, cada uno de esas dividisiones puede subdividirse según los tipos de datos con los que trabajemos: cateógicos o numéricos.

¿Cómo lo haremos?

No hay una regla sobre qué preguntas debe hacer para guiar su investigación. Sin embargo, dos tipos de preguntas siempre serán útiles para hacer descubrimientos dentro de sus datos. Puede redactar libremente estas preguntas como:

  • ¿Qué tipo de variación ocurre dentro de mis variables?
  • ¿Qué tipo de covariación ocurre entre mis variables?

El resto de este capítulo analizará estas dos preguntas. Explicaré qué son la variación y la covariación, y te mostraré varias formas de responder cada pregunta. Para facilitar la discusión, definamos algunos términos:

  • Una variable es una cantidad, cualidad o propiedad que se puede medir.
  • Un valor es el estado de una variable cuando la mides. El valor de una variable puede cambiar de una medida a otra.

Cargar paquetes

Lo primero que tenemos que hacer es cargar los paquetes que vamos a utilizar para el análisis. En este caso vamos a usar:

options(scipen = 999)
library(readr)
library(dplyr)
library(tidyr)
library(dlookr)
library(ggplot2) 
library(readxl)
library(gmodels)
library(Hmisc)
library(ggthemes)

Recuerde que: (Si no ha instalado estos paquetes debe correr primero el comando:

install.packages("nombre del paquete")

Conjuntos de datos a explorar

  • Vamos atrabajar con la libreria dlookr
  • Para ilustrar el uso básico de EDA en el paquete dlookr usaremos el conjunto de datos Carseats.
  • Este conjunto de datos contiene ventas de asientos para niños en 400 tiendas diferentes de EEUU.
  • Estos datos tienen el fin de predecir el volumen de ventas.

Las variables de carseats

El contenido de las variables individuales es el siguiente.

  • ventas: Ventas unitarias (miles) en cada ubicación
  • compPrecio: Precio cobrado por el competidor en cada ubicación
  • ingreso: Nivel de ingresos de la comunidad (miles de dólares)
  • publicidad: Presupuesto de publicidad(miles de dólares)
  • población: Tamaño de la población en la región (en miles)
  • precio: Precio de los cargos de la compañía por los asientos de seguridad en cada sitio
  • estanteria: Un factor (niveles Malo, Bueno y Medio) que indica la calidad ubicación en estanterías par asientos de seguridad.
  • edad: Edad media de la población
  • educación: Nivel de educación en cada lugar
  • urbano: Un factor (niveles No y Sí) indicar urbana o rural
  • eeuu: Un factor con (niveles No y Sí) indicar EE.UU. o no

Carguemos los datos carseats

Cuando se realiza el análisis de datos, con frecuencia se encuentran datos que contienen valores faltantes. Primero carguemos los datos.

carseats <- read_csv("C:/Users/Roberto Trespalacio/Documents/sem_1.4/datos/carseats.csv")

Análisis exploratorio de datos

  • dlookr puede ayudar a comprender la distribución de datos mediante el cálculo de estadísticas descriptivas de datos numéricos.
  • Además, se identifica la correlación entre las variables y se realiza la prueba de normalidad.
  • También identifica la relación entre las variables objetivo y las variables independientes.

lista de las funciones EDA del paquete dlookr

La siguiente es una lista de las funciones EDA incluidas en el paquete dlookr.

  • describe(): proporciona estadísticas descriptivas para datos numéricos.
  • normality() y plot_normality(): realizar la normalización y visualización de datos numéricos.
  • correlate() y plot.correlate(): calcular el coeficiente de correlación entre dos datos numéricos y proporcionar visualización.
  • target_by(): define la variable objetivo y relate()describe la relación con las variables de interés correspondientes a la variable objetivo.
  • plot.relate(): visualiza la relación con la variable de interés correspondiente a la variable de destino.
  • eda_report(): realiza un análisis exploratorio de datos e informa los resultados.

Datos univariados EDA

Cálculo de estadísticas descriptivas utilizando la función: describe()

  • describe() calcula estadísticas descriptivas para datos numéricos.
  • Las estadísticas descriptivas ayudan a determinar la distribución de variables numéricas.
  • Como función de dplyr
    • el primer argumento es el tibble (o trama de datos).
    • El segundo argumento y los subsiguientes se refieren a variables dentro de ese marco de datos.

Variables del objeto tbl_df

Las variables del objeto tbl_df devuelto por describe(), son las siguientes:

  • n: número de observaciones excluyendo los valores perdidos
  • na: número de valores perdidos
  • mean: media aritmética
  • sd: Desviación Estándar
  • se_mean: media del error estándar. SD/raíz cuadrada(n)
  • IQR: rango intercuartílico (Q3-Q1)
  • skewness: sesgo
  • kurtosis: curtosis
  • p25: Q1. percentil 25%
  • p50: mediana. percentil 50%
  • p75: P3. percentil 75%
  • p01, p05, p10, p20, p30: 1%, 5%, 20%, 30% percentiles
  • p40, p60, p70, p80: 40%, 60%, 70%, 80% percentiles
  • p90, p95, p99, p100: 90%, 95%, 99%, 100% percentiles

Observemos los los datos

Los datos categoricos

table(carseats$estanteria)

Tablas de contingencia

Ahora si queremos tabular dos variables, simplemente las separamos por coma. Por ejemplo la frecuencia de estanteria según zona, si es urbano o no:

table(carseats$estanteria, carseats$urbano)

Proporciones

  • Los números absolutos a veces no son útiles para entender los datos, por lo que es mejor utilizar proporciones. Para ello usamos el comando prop.table().

  • Por ejemplo si quisieramos mostrar la tabla anterior como proporciones, lo que hacemos es ingresar ese comando dentro del comando de prop.table().

prop.table(table(carseats$estanteria, carseats$urbano))

Proporciones por filas y columnas

  • En este caso nos muestra los datos como proporciones totales, pero ¿cómo hacemos si queremos ver porcentajes por fila o columna?. +Esto lo hacemos poniendo una coma y luego 1 (filas) o 2 (columnas).

Proporciones por fila

prop.table(table(carseats$estanteria, carseats$urbano), 1)

Proporciones por columna

prop.table(table(carseats$estanteria, carseats$urbano), 2)

CrossTable()

  • Un comando muy útil para simplificar los pasos es el comando CrossTable() del paquete gmodels(). + El comando nos permite presentar en una misma tabla los porcentajes por fila o columna y el total de la tabla.
CrossTable(carseats$estanteria, carseats$urbano)

Descripción de los datos

Code
desc <- describe(carseats)
Code
desc

Observaciones

  • skewness (sesgo): Los datos de distribución están sesgados a la izquierda, es decir, las variables con un gran sesgo positivo, deben considerar las transformaciones logarítmicas o raíz cuadrada para seguir la distribución normal.
  • La variable publicidad parecen necesitar considerar la transformación de variables.
  • mean, sd y se_mean: La variable poblacion, tiene un desviación estandar del error bastante grande of the mean(se_mean) tiene baja representatividad de la media arithmetica mean(mean).
  • standard deviation(sd) es mucho mayor que el promedio aritmético.

Estadísticas descriptivas

A continuación se explican las estadísticas descriptivas solo para unas pocas variables seleccionadas:

Code
# seleccionar columnas por nombres
describe(carseats, c("ventas", "compPrecio", "ingreso"))


# Seleccionar todas las columnas entre año y día (incluir)
describe(carseats, 1:3)

# Seleccionar todas las columnas excepto las del año al día (excluir)
describe(carseats, -(1:3))

Diagrama de barras e histograma

Histograma

Una forma útil de explorar las variables numéricas es con histogramas. Estos podemos hacerlos con el comando hist(), donde ponemos como argumento la variable que deseamos graficar.

hist(carseats$ventas)

Más adelante veremos cómo hacer los gráficos más estéticos con ggplot2. Este es el código para hacer ese mismo gráfico:

ggplot(data = carseats, aes(x=ventas)) +
  geom_histogram(color="#28324a", fill="lightblue") +
  labs(title = "Ventas carseat", x= "Ventas", y ="Frecuencia absoluta")

Diagrama de barras

ggplot(data = carseats, aes(x = estanteria)) +
  geom_bar(color="#28324a", fill="lightblue") +
  labs(title = "Tipo de muestrario o estanteria", x= "Ubicación de la estanteria", y ="Frecuencia absoluta")

Prueba de normalidad sobre variables numéricas utilizando la función normality()

normality() realiza una prueba de normalidad en datos numéricos. Shapiro-Wilk normality testes interpretado. Cuando el número de observaciones es superior a 5000, se prueba tras extraer 5000 muestras mediante muestreo aleatorio simple.

Las variables del objeto tbl_df devueltas por normality() son las siguientes:

  • statistic: Estadísticas de la prueba de Shapiro-Wilk
  • p_value: valor p de la prueba de Shapiro-Wilk
  • sample: Número de observaciones de muestras realizadas Prueba de Shapiro-Wilk

Prueba de normalidad para los datos carseats

normality() realiza la prueba de normalidad para todas las variables numéricas de carseatsla siguiente manera:

Code
normality(carseats)
Code
normality(carseats, ventas, compPrecio, ingreso)
Code
# seleccionar columnas por nombres
normality(carseats, c("ventas", "compPrecio", "ingreso"))

# Seleccionar todas las columnas entre año y día (incluir)
normality(carseats, 1:3)

# Seleccionar todas las columnas excepto las del año al día (excluir)
normality(carseats, -(1:3))

Usemos la librerya dplyr para ordenar las varables con menor p-valor

Code
carseats %>%
  normality() %>%
  filter(p_value <= 0.01) %>% 
  arrange(abs(p_value))

En particular, publicidad se considera que la variable es la que más se sale de la distribución normal.

Agrupando por variables y niveles del factor

La función normality() admite la función group_by() sintaxis de la función en el paquete dplyr.

Code
carseats %>%
  group_by(estanteria, eeuu) %>%
  normality(ingreso) %>% 
  arrange(desc(p_value))
  • El ingreso variable no sigue la distribución normal. Sin embargo, el caso donde eeuu es No y estanteria es Goody Bad al nivel de significancia de 0.01, sigue la distribución normal.
  • El siguiente ejemplo funciona el test de normalidad si hacemos una transformación de los datos en logaritmo. Es decir:
    • log(ingreso) para cada nivel de la variable estantería, la variable categórica eeuu, tiene subniveles y podemos ver si siguen una distribución normal.
Code
carseats %>%
  mutate(log_ingreso = log(ingreso)) %>%
  group_by(estanteria, eeuu) %>%
  normality(log_ingreso) %>%
  filter(p_value > 0.01)

Visualización de normalidad de variables numéricas mediante plot_normality()

  • La función plot_normality() visualiza la normalidad de los datos numéricos.
  • La información visualizada por plot_normality()
    • Histogram of original data (Histograma de los datos originales)
    • Q-Q plot of original data (Gráfico de los Quantiles originales)
    • histogram of log transformed data (histograma de la transformación log de los datos)
    • Histogram of square root transformed data (histograma de la transformación raiz cuadrada de los datos)

Transformaciones de variables

  • En el proceso de análisis de datos, a menudo encuentra datos numéricos que no siguen una distribución normal.
  • En ocaciones se realizan transformaciones de las variables numericas para convertir los datos a una distribución normal. Algunas transforamciones son:
    • log, logaritmo
    • sqrt, raiz cuadrada.

Plots de normalidad y sus transformaciones

A continuación vamos a ver el plot_normality() y algunas transformaciones.

Code
plot_normality(carseats, ventas, compPrecio)

La función plot_normality() también admite la group_by() sintaxis de la función en el paquete dplyr

Code
carseats %>%
  filter(estanteria == "Good") %>%
  group_by(eeuu) %>%
  plot_normality(ingreso)

Análisis exploratorio de datos bivariados

  • Cálculo de correlation coefficienteude correlación con la función correlate()
  • correlate() calcula el coeficiente de correlación de todas las combinaciones de los datos carseats para las variables numéricas. Así:
Code
# todas las variables
correlate(carseats)

# selección por nombre
correlate(carseats, ventas, compPrecio, ingreso)


# seleccion de las columnas  ventas, compPrecio, ingreso
correlate(carseats, 1:3)

# seleccion de todas las columnas  excepto ventas, compPrecio, ingreso
correlate(carseats, -(1:3))

Correlaciones pareadas de las variables

La función correlate() produce dos variables pareadas. El siguiente ejemplo se usa filter() para obtener el coeficiente de correlación para variables pareadas y ordenarlas de forma descendente.

Code
carseats %>%
  correlate(ventas, compPrecio, ingreso) %>%
  arrange(desc(abs(coef_corr)))%>%
  print(n=21)

Las funciones correlate() y group_by().

Code
tab_corr <- carseats %>%
  filter(estanteria == "Good") %>%
  group_by(urbano, eeuu) %>%
  correlate(ventas) %>%
  filter(abs(coef_corr) > 0.5)

tab_corr

Visualización de la matriz de correlación usando plot.correlate()

plot.correlate() visualiza la matriz de correlación con la clase de correlación.

Code
carseats %>% 
  correlate() %>% 
  plot()
  • plot.correlate() también puede especificar múltiples variables, como la función correlate().
  • La siguiente es una visualización de la matriz de correlación que incluye varias variables seleccionadas.
Code
# Seleccion por nombre de var
correlate(carseats, ventas, precio) %>% 
  plot()

Las funciones plot.correlate() y group_by()

La función plot.correlate() también admite la función group_b().

Code
carseats %>%
  filter(estanteria == "Good") %>%
  group_by(urbano) %>%
  correlate() %>%
  plot() 

Ejercicios

  1. Realizar el análisis exploratorio de la base de datos