Autor: Álvaro Alonso Fernández
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)
Vamos a realizar un análisis exploratorio de nuestros datos. Este es un trabajo previo a cualquier análisis estadísitico y nos permite ver como son nuestros datos, sus tendencias, los posibles valores perdidos, errores, etc. de nuestra base de datos.
Utilizaremos una matriz de datos sencilla con 11 variables y 20 observaciones, incluyendo variables categóricas y cuantitativas.
Autor: Álvaro Alonso Fernández
Empezamos cargando los paquetes necesarios:
library(pastecs)
library(summarytools)
library(DataExplorer)
Ahora fijamos directorio y cargamos los datos que se encuentran en un fichero .csv:
#Fijamos directorio de trabajo
setwd(dir = "F:/R/MARKDOWN/analisisexploratorio")
#leemos el fichero de datos
datas<-read.csv("analisisexploratorio.csv", sep=";")
str(datas)
## 'data.frame': 20 obs. of 11 variables:
## $ site : chr "pr1" "pr1" "pr5" "pr6" ...
## $ pH : num 5.6 6.5 2.3 6.5 5.6 8.9 8.9 8.6 8.4 7.5 ...
## $ temp : int 10 12 13 15 12 11 14 17 19 20 ...
## $ bin : int 0 1 1 1 1 0 0 0 0 1 ...
## $ region: chr "a" "a" "a" "d" ...
## $ pais : chr "sp" "sp" "" "sp" ...
## $ var1 : int 90 23 31 67 50 10 100 44 27 52 ...
## $ var2 : int 59 57 53 53 58 57 50 55 51 57 ...
## $ var3 : int 165 168 157 162 156 156 153 159 167 161 ...
## $ var4 : int 0 0 2 2 2 45 5 5 89 87 ...
## $ var5 : num 1 1 3 2.5 2.1 32 2 1 99 99 ...
head(datas)
## site pH temp bin region pais var1 var2 var3 var4 var5
## 1 pr1 5.6 10 0 a sp 90 59 165 0 1.0
## 2 pr1 6.5 12 1 a sp 23 57 168 0 1.0
## 3 pr5 2.3 13 1 a 31 53 157 2 3.0
## 4 pr6 6.5 15 1 d sp 67 53 162 2 2.5
## 5 pr7 5.6 12 1 d sp 50 58 156 2 2.1
## 6 pr8 8.9 11 0 d sp 10 57 156 45 32.0
Vamos a comenzar con un análisis visual de nuestras variables.
¿Hay valores perdidos?
plot_missing(datas)
Sí, tenemos valores perdidos, en la variable temp y en la bin. Si son errores deberíamos revisar nuestros datos originales para poder corregirlo (oer ejemplo, al tomar ese dato estaba atento al móvil y no lo apunté al estadillo, ahora vienen las lamentaciones…..)
Un histograma y diagrama de densidades para cada una de nuestras variables cuantitativas. Podemos hacernos una primera idea de la distribución de nuestros datos.
plot_histogram(datas)
plot_density(datas)
¿Se correlacionan nuestras variables? Esto es importante a la hora por ejemplo de realizar un análisis multivariantes o a la hora de seleccionar las variables más influyentes.
plot_correlation(datas, type = 'continuous','Review.Date')
## Warning: Removed 26 rows containing missing values (geom_text).
Vemos que para las variables con valores perdidos no se ha hecho la correlación. Los colores más intensos muestran una mayor correlación entre las variables.
Para las variables categóricas utilizamos plot_bar:
plot_bar(datas)
Todo lo anterior lo podemos resumir en un informe con la función create_report que nos genera un html con bastante información. Tal vez sea demasiada, pero puede ser útil en determinadas situaciones (por ejemplo una primera aproximación a un análisis de componentes principales).
Para ejecutarlo simplemente create_report (datas)
Vamos a comenzar con un análisis cuantitativo de nuestras variables. ¿Cuál es la media de cada variables? ¿su valor máximo? ¿el número de casos? etc.
tabla1<-stat.desc(datas)
tabla1
## site pH temp bin region pais var1
## nbr.val NA 20.0000000 18.0000000 19.0000000 NA NA 20.0000000
## nbr.null NA 0.0000000 0.0000000 10.0000000 NA NA 0.0000000
## nbr.na NA 0.0000000 2.0000000 1.0000000 NA NA 0.0000000
## min NA 2.3000000 10.0000000 0.0000000 NA NA 10.0000000
## max NA 8.9000000 20.0000000 1.0000000 NA NA 100.0000000
## range NA 6.6000000 10.0000000 1.0000000 NA NA 90.0000000
## sum NA 130.8000000 252.0000000 9.0000000 NA NA 1003.0000000
## median NA 6.5000000 13.5000000 0.0000000 NA NA 46.5000000
## mean NA 6.5400000 14.0000000 0.4736842 NA NA 50.1500000
## SE.mean NA 0.3610948 0.6365758 0.1176878 NA NA 6.9020497
## CI.mean NA 0.7557802 1.3430576 0.2472529 NA NA 14.4461560
## var NA 2.6077895 7.2941176 0.2631579 NA NA 952.7657895
## std.dev NA 1.6148652 2.7007624 0.5129892 NA NA 30.8669044
## coef.var NA 0.2469213 0.1929116 1.0829771 NA NA 0.6154916
## var2 var3 var4 var5
## nbr.val 2.000000e+01 2.000000e+01 20.000000 20.000000
## nbr.null 0.000000e+00 0.000000e+00 2.000000 0.000000
## nbr.na 0.000000e+00 0.000000e+00 0.000000 0.000000
## min 5.000000e+01 1.510000e+02 0.000000 1.000000
## max 5.900000e+01 1.680000e+02 89.000000 99.000000
## range 9.000000e+00 1.700000e+01 89.000000 98.000000
## sum 1.082000e+03 3.198000e+03 497.000000 435.600000
## median 5.350000e+01 1.605000e+02 14.500000 12.000000
## mean 5.410000e+01 1.599000e+02 24.850000 21.780000
## SE.mean 7.287336e-01 1.121324e+00 6.215971 6.555892
## CI.mean 1.525257e+00 2.346959e+00 13.010176 13.721639
## var 1.062105e+01 2.514737e+01 772.765789 859.594316
## std.dev 3.258996e+00 5.014715e+00 27.798665 29.318839
## coef.var 6.024022e-02 3.136157e-02 1.118659 1.346136
Otra forma similar de hacer la tabla anterior:
summarytools::descr(datas)
## Non-numerical variable(s) ignored: site, region, pais
## Descriptive Statistics
## datas
## N: 20
##
## bin pH temp var1 var2 var3 var4 var5
## ----------------- ------- -------- ------- -------- -------- -------- -------- --------
## Mean 0.47 6.54 14.00 50.15 54.10 159.90 24.85 21.78
## Std.Dev 0.51 1.61 2.70 30.87 3.26 5.01 27.80 29.32
## Min 0.00 2.30 10.00 10.00 50.00 151.00 0.00 1.00
## Q1 0.00 5.60 12.00 25.00 51.00 156.00 3.50 2.30
## Median 0.00 6.50 13.50 46.50 53.50 160.50 14.50 12.00
## Q3 1.00 7.50 15.00 85.00 57.00 163.00 34.50 25.50
## Max 1.00 8.90 20.00 100.00 59.00 168.00 89.00 99.00
## MAD 0.00 1.33 2.22 40.77 5.19 5.93 18.53 15.57
## IQR 1.00 1.90 3.00 58.00 6.00 6.50 30.00 22.85
## CV 1.08 0.25 0.19 0.62 0.06 0.03 1.12 1.35
## Skewness 0.10 -0.59 0.69 0.22 0.05 0.03 1.16 1.75
## SE.Skewness 0.52 0.51 0.54 0.51 0.51 0.51 0.51 0.51
## Kurtosis -2.09 0.32 -0.45 -1.50 -1.71 -1.12 0.11 1.94
## N.Valid 19.00 20.00 18.00 20.00 20.00 20.00 20.00 20.00
## Pct.Valid 95.00 100.00 90.00 100.00 100.00 100.00 100.00 100.00
summarytools::descr(datas, transpose = TRUE)#cambiamos orden
## Non-numerical variable(s) ignored: site, region, pais
## Descriptive Statistics
## datas
## N: 20
##
## Mean Std.Dev Min Q1 Median Q3 Max MAD IQR CV
## ---------- -------- --------- -------- -------- -------- -------- -------- ------- ------- ------
## bin 0.47 0.51 0.00 0.00 0.00 1.00 1.00 0.00 1.00 1.08
## pH 6.54 1.61 2.30 5.60 6.50 7.50 8.90 1.33 1.90 0.25
## temp 14.00 2.70 10.00 12.00 13.50 15.00 20.00 2.22 3.00 0.19
## var1 50.15 30.87 10.00 25.00 46.50 85.00 100.00 40.77 58.00 0.62
## var2 54.10 3.26 50.00 51.00 53.50 57.00 59.00 5.19 6.00 0.06
## var3 159.90 5.01 151.00 156.00 160.50 163.00 168.00 5.93 6.50 0.03
## var4 24.85 27.80 0.00 3.50 14.50 34.50 89.00 18.53 30.00 1.12
## var5 21.78 29.32 1.00 2.30 12.00 25.50 99.00 15.57 22.85 1.35
##
## Table: Table continues below
##
##
##
## Skewness SE.Skewness Kurtosis N.Valid Pct.Valid
## ---------- ---------- ------------- ---------- --------- -----------
## bin 0.10 0.52 -2.09 19.00 95.00
## pH -0.59 0.51 0.32 20.00 100.00
## temp 0.69 0.54 -0.45 18.00 90.00
## var1 0.22 0.51 -1.50 20.00 100.00
## var2 0.05 0.51 -1.71 20.00 100.00
## var3 0.03 0.51 -1.12 20.00 100.00
## var4 1.16 0.51 0.11 20.00 100.00
## var5 1.75 0.51 1.94 20.00 100.00
dfSummary(datas, style="multiline", split.tables = 100)
## Data Frame Summary
## datas
## Dimensions: 20 x 11
## Duplicates: 0
##
## ------------------------------------------------------------------------------------------------------
## No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
## ---- ------------- ------------------------- -------------------- --------------- ---------- ---------
## 1 site 1. pr1 4 (20.0%) IIII 20 0
## [character] 2. pr4 6 (30.0%) IIIIII (100.0%) (0.0%)
## 3. pr5 2 (10.0%) II
## 4. pr6 2 (10.0%) II
## 5. pr7 2 (10.0%) II
## 6. pr8 2 (10.0%) II
## 7. pr9 2 (10.0%) II
##
## 2 pH Mean (sd) : 6.5 (1.6) 12 distinct values : 20 0
## [numeric] min < med < max: : . . . (100.0%) (0.0%)
## 2.3 < 6.5 < 8.9 : : : :
## IQR (CV) : 1.9 (0.2) : : : :
## : : : : : :
##
## 3 temp Mean (sd) : 14 (2.7) 10 : 1 ( 5.6%) I 18 2
## [integer] min < med < max: 11 : 1 ( 5.6%) I (90.0%) (10.0%)
## 10 < 13.5 < 20 12 : 5 (27.8%) IIIII
## IQR (CV) : 3 (0.2) 13 : 2 (11.1%) II
## 14 : 2 (11.1%) II
## 15 : 3 (16.7%) III
## 16 : 1 ( 5.6%) I
## 17 : 1 ( 5.6%) I
## 19 : 1 ( 5.6%) I
## 20 : 1 ( 5.6%) I
##
## 4 bin Min : 0 0 : 10 (52.6%) IIIIIIIIII 19 1
## [integer] Mean : 0.5 1 : 9 (47.4%) IIIIIIIII (95.0%) (5.0%)
## Max : 1
##
## 5 region 1. a 3 (15.0%) III 20 0
## [character] 2. d 3 (15.0%) III (100.0%) (0.0%)
## 3. f 5 (25.0%) IIIII
## 4. g 6 (30.0%) IIIIII
## 5. h 2 (10.0%) II
## 6. j 1 ( 5.0%) I
##
## 6 pais 1. (Empty string) 3 (15.0%) III 20 0
## [character] 2. fr 4 (20.0%) IIII (100.0%) (0.0%)
## 3. ge 7 (35.0%) IIIIIII
## 4. sp 6 (30.0%) IIIIII
##
## 7 var1 Mean (sd) : 50.1 (30.9) 19 distinct values : 20 0
## [integer] min < med < max: . : . : (100.0%) (0.0%)
## 10 < 46.5 < 100 : : : :
## IQR (CV) : 58 (0.6) : : : :
## : : : : :
##
## 8 var2 Mean (sd) : 54.1 (3.3) 50 : 4 (20.0%) IIII 20 0
## [integer] min < med < max: 51 : 2 (10.0%) II (100.0%) (0.0%)
## 50 < 53.5 < 59 52 : 2 (10.0%) II
## IQR (CV) : 6 (0.1) 53 : 2 (10.0%) II
## 54 : 1 ( 5.0%) I
## 55 : 1 ( 5.0%) I
## 57 : 4 (20.0%) IIII
## 58 : 3 (15.0%) III
## 59 : 1 ( 5.0%) I
##
## 9 var3 Mean (sd) : 159.9 (5) 12 distinct values : : 20 0
## [integer] min < med < max: : : (100.0%) (0.0%)
## 151 < 160.5 < 168 : :
## IQR (CV) : 6.5 (0) : : : :
## : : : :
##
## 10 var4 Mean (sd) : 24.9 (27.8) 15 distinct values : 20 0
## [integer] min < med < max: : (100.0%) (0.0%)
## 0 < 14.5 < 89 :
## IQR (CV) : 30 (1.1) : .
## : : . . :
##
## 11 var5 Mean (sd) : 21.8 (29.3) 15 distinct values : 20 0
## [numeric] min < med < max: : (100.0%) (0.0%)
## 1 < 12 < 99 :
## IQR (CV) : 22.9 (1.3) : .
## : : . :
## ------------------------------------------------------------------------------------------------------
Cono todo lo anterior nos podemos hacer una primera idea de como son nuestros datos y los posible errores en los mismos. También tenemos una primera idea de sus distribuciones (por medio de los histogramas) y de los valores perdidos o los posibles outliers. Sin este trabajo previo no debemos realizar un análisis estadístico, ya que desconocemos la naturaleza de nuestras variables y su posible interpretación.
Departamento de Ciencias de la Vida
Universidad de Alcalá (España)
Ahora la vida se ve mucho mejor