Analisis descriptivo - UNMSM
Gabriel Carrasco-Escobar
Análsis Descriptivo
Paquetes y Data
Los paquetes que se utilizaran son:
library(tidyverse)
library(janitor)
library(pubh)
library(pracma)
library(moments)
library(doBy)
library(epiDisplay)
library(sfsmisc)
library(ggmosaic)
Para los ejercicios a continuacion se utilizaron las siguientes bases de datos:
- Winzell2004_covar.csv
- DHS_Peru.csv
<- read_csv(url("https://zenodo.org/record/5053036/files/Winzell2004_covar.csv?download=1"))
df
<- read_csv(url("https://zenodo.org/record/5053060/files/DHS_Peru.csv?download=1")) peru
Medidas de Frecuencia
Una variable
El paquete janitor
tiene la función tabyl
que permite generar tablas de frecuencias y se integra en el ecosistema del tidyverse
.
%>%
df tabyl(Diet)
## Diet n percent
## chow 449 0.5307329
## hf 397 0.4692671
tabyl
permite almacenar el objeto del cálculo de frecuencias en formato tidy
para su manipulación posterior.
<- df %>%
tab1 tabyl(Diet)
View(tab1)
Diet | n | percent |
---|---|---|
chow | 449 | 0.5307329 |
hf | 397 | 0.4692671 |
Adicionalmente podemos configurar nuestra tabla con adorn_*()
. Por ejemplo, podemos utilizar adorn_totals("row")
para agregar el total de las filas y adorn_pct_formatting()
para dar formato a la columna de porcentajes.
%>%
df tabyl(Diet) %>%
adorn_totals("row") %>%
adorn_pct_formatting()
## Diet n percent
## chow 449 53.1%
## hf 397 46.9%
## Total 846 100.0%
Dos variables
Podemos realizar tablas de doble entrada (frecuencias de 2 variables) con tabyl
%>%
df tabyl(Diet, Sex)
## Diet F M
## chow 225 224
## hf 200 197
Al igual que con las freuencias de una vairable podemos cambiar el formato de la tabla con adorn_*()
. Más información de las opciones de formato se encuentra detallado en la documentación de janitor
.
%>%
df tabyl(Diet, Sex) %>%
adorn_percentages("col") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns()
## Diet F M
## chow 52.94% (225) 53.21% (224)
## hf 47.06% (200) 46.79% (197)
Otro paquete con funciones útiles para medidas descriptivas es pubh
(enfocado en salud pública). La función cross_tab()
permite realizar también tablas de doble entrada.
%>%
df cross_tab(Sex ~ Diet) %>%
theme_pubh()
F | M | Total | |
---|---|---|---|
(N=425) | (N=421) | (N=846) | |
Diet | |||
- chow | 225 (52.9%) | 224 (53.2%) | 449 (53.1%) |
- hf | 200 (47.1%) | 197 (46.8%) | 397 (46.9%) |
Medidas de tendencia central
Media aritmetica
Con mean
calculamos la media (promedio) de una variable. En este caso, glucose
.
mean(df$glucose)
## [1] 7.006728
Mediana
A diferencia de la media, la mediana nos permite identificar el valor que divide una ditribución ordenada por la mitad
Utilizamos la función median
con la variable glucose
median(df$glucose)
## [1] 7.00021
Moda
Nos da como resultado el valor mas frecuente; suele ser utilizado para variables categóricas
R no tiene una funcion en los comandos de base para calcular la moda. Utilizaremos la función Mode
del paquete pracma
.
Mode(df$glucose)
## [1] 7.029131
Medidas de dispersion
Rango
Se conoce como rango a la diferencia entre el valor máximo y el mínimo observados. Se lo conoce también como aplitud total o recorrido.
Utilizamos la función min
y max
para hallar los valores mínimos y máximos de una variable respectivamente.
c(min(df$glucose),max(df$glucose))
## [1] 5.650370 8.315831
Para hallar el rango, utilizamos la función range
. Comprobamos que el resultado sea igual al de min
y max
.
range(df$glucose)
## [1] 5.650370 8.315831
Rango intercuartil (RIC)
Con la función IQR
hallamos el rango intercuartil (percentiles 25 y 75)
IQR(df$glucose)
## [1] 0.5067847
Desviacion estandar
Con la desviación estándar calculamos el monto promedio en el que se desvían los valores observados respecto a su media artimética.
En R utilizamos la función sd
.
sd(df$glucose)
## [1] 0.383118
Varianza muestral
Tambien podemos utilizar la función var
para obtener el resultado de la varianza muestral.
var(df$glucose)
## [1] 0.1467794
Coeficiente de variacion
La formula para la función del coeficiente de variacion es el siguiente:
<- function (x) { sd(x) / mean(x) } cv
Con la variable glucosa, el coeficiente de variación nos da el siguiente resultado:
cv(df$glucose)
## [1] 0.05467859
Medidas de localizacion y forma
Para explicar y entender mejor la distribución de los datos de una variable, utilizamos las medidas de asimetria estadistica (skewness) y curtosis.
Skewness
Con la funcion skewness
del paquete moments
calculamos la asimetría estadística.
skewness(df$glucose)
## [1] 0.001214676
Kurtosis
La curtosis es calculada con la función kurtosis
del paquete moments
.
kurtosis(df$glucose)
## [1] 3.355597
Multiples metricas
Con la función summary
obtenemos un resumen de las principales medidas de una variable (valor mínimo, 1er quintil, mediana, media, 3er quintil, valor máximo)
summary(df$glucose)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 5.650 6.744 7.000 7.007 7.251 8.316
Podemos usar la función estat()
del paquete pubh
para obtener múltiples medidas de tendencia central en formato tidy
%>%
df estat(~ glucose)
## N Min. Max. Mean Median SD CV
## 1 glucose 846 5.65 8.32 7.01 7 0.38 0.05
Metricas estratificadas
Con la función summaryBy
del paquete doBy
podemos comparar múltiples métricas estratificadas por una segunda variable.
En el código a continuación, compararamos las variables glucose
y Diet
, utilizando los datos del objeto df
, y queremos obtener la media (mean), desviación estándar (sd), mediana (median), tamaño (length), simetría (skewness) y curtosis (kurtosis)
En algunas ocasiones, debemos utilizar la función
as.data.frame
para cambiar el formato del objeto de tu base de datos:df <- as.data.frame(df)
summaryBy(glucose ~ Diet, data=df,
FUN=c(mean, sd, median, skewness, kurtosis), na.rm=T)
## # A tibble: 2 × 6
## Diet glucose.mean glucose.sd glucose.median glucose.skewness glucose.kurtosis
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 chow 7.03 0.389 7.03 0.0835 3.21
## 2 hf 6.98 0.375 6.98 -0.118 3.48
Podemos realizar la misma rutina con la función stat()
del paquete pubh
dentro del ecosistema tidyverse
.
Es importante notar que la variable sobre la cual vamos a estratificar nuestras métricas tiene que estar en formato
factor
.
%>%
df mutate(Diet = as.factor(Diet)) %>%
estat(glucose ~ Diet)
## Diet N Min. Max. Mean Median SD CV
## 1 glucose chow 449 5.65 8.21 7.03 7.03 0.39 0.06
## 2 hf 397 5.82 8.32 6.98 6.98 0.37 0.05
Visualizacion y Analisis de datos Exploratorio (ADE)
Analisis de una variable
Frecuencias
La función tab1
del paquete epiDisplay
genera un gráfico de barras de una variable (tabulación de un solo sentido).
En el siguiente ejemplo, utilizamos la función tab1
con la variable Diet
para visualizar la distribución de las freqcuencias de dietas chow
y hf
.
tab1(df$Diet)
## df$Diet :
## Frequency Percent Cum. percent
## chow 449 53.1 53.1
## hf 397 46.9 100.0
## Total 846 100.0 100.0
La consola de R nos brindara una tabla de resumen, en el que se indica la frequencia, porcentaje y porcentaje acumulado de las variables que utilizamos.
Stem plot
Con la función stem
generamos un gráfico de texto, conocido como diagrama de tallos y hojas, el cual nos permite visualizar la distribución de un grupo de observaciones.
En este caso, utilizamos la variable glucose
.
stem(df$glucose)
##
## The decimal point is 1 digit(s) to the left of the |
##
## 56 | 5
## 58 | 236
## 60 | 2246802245569
## 62 | 000134800111344567777888888
## 64 | 00002233334556666677788888889990011222333334444444555555666677777788
## 66 | 00000002222222233333344444444445555566677777888890000000000011111122+37
## 68 | 00000000111122222233333344444444555555566666667788888888889999999999+98
## 70 | 00000000001111222222223333333333344444444445555566666666667777777788+82
## 72 | 00000000000011111111222222222222333333334444444455555555555556666666+68
## 74 | 00111111111222223333333444455666777778888990000022223333455555667777
## 76 | 00122234788901236999
## 78 | 0112245781123689
## 80 | 12386
## 82 | 12
Histograma
Similar a la funcion stem
, la función hist
nos permite visualizar esta información a través de un histograma.
Nuevamente, utilizamos la variable glucose
para la visualización.
hist(df$glucose)
Podemos generar el mismo gráfico en el ecosistema tidyverse
con ggplot
y la geomtría geom_histogram()
.
%>%
df ggplot(aes(x = glucose)) +
geom_histogram()
Anotaciones
Utilziaremos la flexibilidad gráfica de ggplot
con la geometría geom_vline()
para anotar nuestro histograma con las posiciones de nuestras 3 medidas de tendencia central de la variable glucose
:
- La media, de rojo.
- La mediana, de azul
- La moda, de verde
%>%
df ggplot(aes(x = glucose)) +
geom_histogram() +
geom_vline(aes(xintercept = mean(glucose)), col = "red") +
geom_vline(aes(xintercept = median(glucose)), col = "blue") +
geom_vline(aes(xintercept = Mode(glucose)), col = "green")
Boxplot
Usaremos la geometría geom_boxplot
para generar diagramas de caja (boxplots).
%>%
df ggplot(aes(x = glucose)) +
geom_boxplot()
Graficos estadisticos
Podemos combinar múltiples gráficos para entender la información que proporciona cada gráfico. La función histBxp
del paquete sfsmisc
nos permite comparar el gráfico de histograma con el de boxplot.
histBxp(df$glucose, main="Hist y Boxplot de glucosa en ratones", xlab="Glucosa", ylab="Frecuencia")
En el paquete ggplot
podemos combinar geometrias para lograr un gráfico equivalente.
%>%
df ggplot(aes(x = glucose)) +
geom_boxplot(width = 10) +
geom_histogram(fill="transparent", col = "black")
Adicionalmente podemos agregar anotaciones de las posiciones de nuestras 3 medidas de tendencia central de la variable glucose
:
%>%
df ggplot(aes(x = glucose)) +
geom_boxplot(width = 10) +
geom_histogram(fill="transparent", col = "black") +
geom_vline(aes(xintercept = mean(glucose)), col = "red") +
geom_vline(aes(xintercept = median(glucose)), col = "blue") +
geom_vline(aes(xintercept = Mode(glucose)), col = "green")
Comparacion de dos variables
Categorica vs. Categroica
Los gráficos de mosaicos nos permite comparar dos variables categoricas. Usaremos la geometría geom_mosaic()
del paquete ggmosaic
%>%
df ggplot() +
geom_mosaic(aes(x = product(Sex, Diet), fill = Sex))
Continua vs. Continua
Para comparar dos variables continuas en un grafico de dispersion, utilizamos la geometría geom_point
en ggplot
.
Para el ejemplo usaremos las variables Bodyweight
y glucose
%>%
df ggplot(aes(x = Bodyweight, y = glucose)) +
geom_point()
Continua vs. Categorica
%>%
df ggplot(aes(x = Diet, y = Bodyweight)) +
geom_boxplot()
## Warning: Removed 5 rows containing non-finite values (stat_boxplot).
Ejercicios
Ejercicio 1
- EJERCICIO Realiza exploracion grafica para determinar si las variables
en_intake
ytime
tienen distribucion normal. Utiliza la geometríageom_vline()
para complementar tus hallazgos.
Ejercicio 2
- EJERCICIO Compara la dispersión de
meta_eff
yein_resp
Ejercicio 3
EJERCICIO A Explora y compara
en_intake
yein_resp
en terminos de skewnessEJERCICIO B Explora y compara
insulin
ymeta_eff
en terminos de Curtosis