Antonio Martínez Pineda
1 de diciembre de 2016
De acuerdo con Leek y Peng (2015)1 existen seis tipos de preguntas:
Estos tipos de preguntas tienen características sumativas por lo que un análisis estadístico puede servir para contestar varias preguntas a la vez.
Toda vez que se ha identificado la pregunta se pueden utilizar las características del tipo de pregunta y de una buena pregunta para refinar la pregunta mediante los siguientes pasos utilizados de forma iterativa:
El análisis exploratorio de los datos consiste en la revisión de la estructura de la base de datos, las variables que se incluyen en la base de datos y las características y distribución de cada una de estas variables. Este análisis tiene como propósitos: a) determinar si existe algún problema con la base de datos; b) si los datos permiten responder la pregunta planteada; c) bosquejar la respuesta a la pregunta.
El análisis exploratorio debe cubrir los siguientes puntos:
El método a seguir depende del formato en el que estén guardados los datos, en la presentación Introducción a R4 se explica como leer una base de datos en formato .RData (diapositiva 18) y como importar datos desde diferentes formatos (diapositiva 24).
En este caso los datos están en un archivo .RDS por lo que podemos leerlos con la función readRDS().
base <- readRDS("base_grupo.RDS")Siempre es importante saber cuántas variables hay en la base de datos y cuántas observaciones tenemos. Además, es importante conocer el nivel de medición de las variables y si su codificación es adecuada.
De manera general podemos obtener un resumen de todo esto con la función str() que nos informa sobre la clase de objeto que estamos revisando, en este caso una base de datos, el número de filas (observaciones) y columnas (variables) que incluye y una lista de las variables indicando su nombre, clase y una muestra de las primeras observaciones.
str(base)'data.frame': 18 obs. of 5 variables:
$ Nombre : Factor w/ 18 levels "Aideé","Alejandra",..: 3 7 5 17 4 11 9 6 1 12 ...
$ Sexo : Factor w/ 2 levels "Mujer","Hombre": 1 1 2 1 1 1 1 1 1 2 ...
$ llaves : num 4 3 4 4 6 2 NA 4 4 2 ...
$ parejas: num 7 3 5 4 1 4 NA 1 5 1 ...
$ edad : num 33 28 29 25 44 24 NA 27 22 22 ...
Cuando se importan datos de algún otro formato (.csv, .xlsx, .sav, .dbf, por ejemplo) puede haber filas en blanco o notas antes o después de los datos. Cuando se leen los datos esta información puede quedar capturada como parte de los datos o simplemente, por algún defecto en el código, los datos pueden leerse parcialmente. Revisar la parte inicial y final de los datos es una forma práctica de detectar estos casos.
# La función head() nos presenta las primeras observaciones en la base de
# datos
head(base, 3) Nombre Sexo llaves parejas edad
1 Ana Mujer 4 7 33
2 Diana Mujer 3 3 28
3 Carlos Hombre 4 5 29
# De igual forma tail() presenta las últimas observaciones de la base
tail(base, 2) Nombre Sexo llaves parejas edad
17 Tania Mujer 8 2 22
18 Nallely Mujer 7 1 27
Esta es otra medida para revisar que todo esté como debe estar, si se espera tener un registro de 1000 sujetos y al revisar la base de datos solo hay 100, algo debe estar sucediendo. Cuando se realiza un estudio generalmente se conoce cuantos participantes hay y las cuentas deben coincidir, de igual forma se sabe que variables se están midiendo y cuáles son sus valores, mediante este análisis podemos detectar si hay alguna mala codificación o valores no válidos.
# Por ejemplo podemos revisar si tenemos un identificador único para cada
# observación
nrow(base) == length(unique(base$Nombre))[1] TRUE
# También cuales son los niveles para un factor y si hay datos faltantes
sexo <- table(base$Sexo, useNA = "ifany")
sexo
Mujer Hombre
16 2
table(base$parejas, useNA = "ifany")
1 2 3 4 5 7 <NA>
4 3 2 3 2 1 3
Generalmente trabajamos con muestras (idealmente representativas) de alguna población, revisar que nuestros datos hagan sentido con lo que se espera de esa población es una forma rápida de evaular que tan útiles pueden ser esos datos, por ejemplo, para hacer inferencias.
Digamos que en la población estudiantil de la Facultad de Psicología hay 9 de cada 10 alumnos son mujeres (algo así como 90% de la población), esperaríamos una proporción similar en los datos que vamos estamos analizando.
round(prop.table(sexo) * 100, 2)
Mujer Hombre
88.89 11.11
# Supongamos también que la edad promedio de la población es de 23 años con
# una desviación estándar de 3.7 años
library(dplyr)
res <- base %>% summarise(Media = mean(edad, na.rm = T), DE = sd(edad, na.rm = T))
knitr::kable(res, digits = 2)| Media | DE |
|---|---|
| 26.6 | 5.77 |
Una imagen dice más que mil palabras
Las gráficas nos sirven para comparar cosas, si presentamos una gráfica sin una comparación no es demasiado informativa.
Si comparamos el número de llaves entre hombres y mujeres es mucho más informativo.
ggplot(base, aes(Sexo, llaves, fill = Sexo)) + geom_boxplot()También se pueden modelar predicciones o causalidades en una gráfica.
with(base, cor.test(edad, parejas))
Pearson's product-moment correlation
data: edad and parejas
t = -0.17266, df = 13, p-value = 0.8656
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.5466989 0.4760969
sample estimates:
cor
-0.04783135
(summary(lm(parejas ~ edad, base)))
Call:
lm(formula = parejas ~ edad, data = base)
Residuals:
Min 1Q Median 3Q Max
-2.0692 -1.4038 -0.0391 0.9684 4.0962
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.39991 2.36651 1.437 0.174
edad -0.01503 0.08708 -0.173 0.866
Residual standard error: 1.879 on 13 degrees of freedom
(3 observations deleted due to missingness)
Multiple R-squared: 0.002288, Adjusted R-squared: -0.07446
F-statistic: 0.02981 on 1 and 13 DF, p-value: 0.8656
La solución sencilla es atractiva -porque es sencilla- pero siempre se debe pensar en soluciones alternativas que puedan contradecir los resultados de esa solución.
Call:
lm(formula = parejas ~ edad + llaves + edad * llaves, data = base)
Residuals:
Min 1Q Median 3Q Max
-2.3437 -1.1198 -0.2326 1.1247 2.6773
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -12.79619 9.63573 -1.328 0.211
edad 0.64755 0.38633 1.676 0.122
llaves 2.88976 1.69644 1.703 0.117
edad:llaves -0.11977 0.06843 -1.750 0.108
Residual standard error: 1.803 on 11 degrees of freedom
(3 observations deleted due to missingness)
Multiple R-squared: 0.223, Adjusted R-squared: 0.01106
F-statistic: 1.052 on 3 and 11 DF, p-value: 0.4083
Multiple regression power calculation
u = 11
v = 3
f2 = 0.1603428
sig.level = 0.05
power = 0.0654074
Multiple regression power calculation
u = 11
v = 3
f2 = 12.99785
sig.level = 0.05
power = 0.9
Leek, J. T. & Peng, R. D. (2015). What is the question? Science, 348 (6228),1314-135. DOI: 10.1126/science.aaa6146↩
Peng, R. D. & Matsui, E. (2016). Art of data science: A guide for anyone who works with data. Skybrude Consulting, LLC, disponible en: http://leanpub.com/artofdatascience↩
Peng, R. D. (2015). Exploratory data analysis with R. Autor. Disponible en: http://leanpub.com/exdata↩
Martínez, A. (4 de julio de 2016). Introducción a R. Presentación disponible en: http://rpubs.com/tonosan/Intro_R↩