¿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áfico: 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.
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(dplyr)
library(ggplot2)
library(readxl)
library(gmodels)
library(Hmisc)
library(ggthemes)
(Recordar que si no ha instalado estos paquetes debe correr primero el comando: install.packages("nombre del paquete")
)
Importar archivos
Para este tutorial vamos a usar dos archivos, que se encuentran en el siguiente enlace: encuesta.xlsx correlaciones.xlsx
Antes de comenzar, hay que cambiar el directorio de trabajo y seleccionar el folder en donde tenemos nuestros archivos. Esto se hace con el comando setwd()
.
Ahora podemos importar los archivos de varias formas. Podemos hacerlo desde el menú de arriba, usando: File -> Import Dataset y seleccionando el tipo de archivo que queremos importar.
También podemos hacerlo escribiendo el código. Es siempre recomendable asignar el archivo que importamos a un objeto con el símbolo <-
. Inicialmente vamos a importar unos archivos .xlsx, por lo que usamos el paquete readxl
, que ya instalamos.
El archivo que vamos a usar inicialmente es:
#Recuerden cambiar el directorio de trabajo
setwd("/Users/camilasalazar/Documents/Curso periodismo de datos/Clases R/analisis")
encuesta <- read_xlsx("encuesta.xlsx")
encuesta <- tbl_df(encuesta)
El archivo contiene información sobre las personas que viven solas en Costa Rica. Los datos se extrajeron de la Encuesta Nacional de Hogares del 2016 y contienen las siguientes variables:
id
: identificador único
REGION
: Región de planificación donde vive la persona (Central, Chorotega, Pacífico Central, Brunca, Huetar Atlántica, Huetar Norte)
ZONA
: Zona en la que vive la persona (urbana o rural)
Tipo_vivienda
: Tenencia de la vivienda (Propia totalmente pagada, Propia pagando a plazos, Alquilada, En precario, Otra tenencia)
Mensualidad
: Mensualidad pagada por la vivienda, cuando esta no es propia pagada
M2
: Metros cuadrados de construcción de la vivienda
Sexo
: Sexo (Hombre o Mujer)
Edad
: Edad de la persona
Estado_civil
: Estado civil
NivInst
: Nivel de escolaridad:
0- Sin nivel de instrucción:Persona con ninguna educación, con preparatoria o educación especial sin aprobación de niveles
1- Primaria incompleta:Persona de primero hasta quinto grado y primaria con año aprobado no declarado
2- Primaria completa:Persona con sexto grado
3- Secundaria académica incompleta :Persona de primer año hasta cuarto año de secundaria y secundaria con año aprobado no declarado
4- Secundaria académica completa:Persona con quinto año de secundaria, con o sin título de bachiller
5- Secundaria técnica incompleta:Persona con primer año hasta quinto año en secundaria técnica y secundaria técnica con año aprobado no declarado.
6- Secundaria técnica completa:Persona con secundaria técnica concluida con o sin título de bachiller.
7- Educación superior de pregrado y grado:Persona que tiene desde un año hasta tres años en para-universitaria, incluyendo año no declarado, y desde un año hasta seis años de universidad, incluyendo año no declarado
8- Educación superior de posgrado:Persona con estudios universitarios de especialidad, maestría o doctorado desde un año hasta seis años, incluyendo año no declarado.
Escolari
: Años de escolaridad
CondAct
: Condición de actividad (Ocupado, Desempleado, Fuera de la fuerza de trabajo)
ingreso
: Ingreso total neto del Hogar
np
: Nivel de pobreza (Pobreza no extrema, Pobreza extrema, No pobre)
quintil
: Quintil de ingreso per cápita del hogar
Explorar los datos
Una vez que cargamos el archivo podemos comenzar a explorar los datos. (Recordar comandos de Tutorial de limpieza con R.
glimpse(encuesta)
## Observations: 1,455
## Variables: 15
## $ id <chr> "32", "49", "131", "195", "236", "240", "250", "...
## $ REGION <chr> "Central", "Central", "Central", "Central", "Cen...
## $ ZONA <chr> "Urbana", "Urbana", "Urbana", "Urbana", "Urbana"...
## $ Tipo_vivienda <chr> "En precario", "En precario", "Alquilada", "Prop...
## $ Mensualidad <dbl> NA, NA, 60000, NA, 140000, NA, NA, 130000, NA, N...
## $ M2 <chr> "Menos de 30 m2", "De 41 a 60 m2", "De 41 a 60 m...
## $ Sexo <chr> "Mujer", "Hombre", "Mujer", "Mujer", "Hombre", "...
## $ Edad <dbl> 51, 88, 74, 76, 27, 86, 75, 78, 66, 81, 78, 78, ...
## $ Estado_civil <chr> "Soltero(a)", "Viudo(a)", "Soltero(a)", "Separad...
## $ NivInst <chr> "Sin nivel de instruccion", "Sin nivel de instru...
## $ Escolari <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
## $ CondAct <chr> "Ocupado", "Fuera de la fuerza de trabajo", "Fue...
## $ ingreso <dbl> 332583.33, 160416.67, 100000.00, 104500.00, 5488...
## $ np <chr> "No pobre", "No pobre", "Pobreza no extrema", "P...
## $ quintil <chr> "Q4: Mas de 273816 a 499386", "Q2: Mas de 94063 ...
Con esto podemos ver que tenemos cuatro variables numericas (dbl) y el resto con caracteres.
También hay otros comandos exploratorios como: str()
, head()
, tail()
, class()
, class()
Tip Podemos convertir las variables de texto a factores (variables con categorías) con el comando as.factor()
. Por ejemplo si queremos convertir la variable de REGION, el comando sería:
encuesta$REGION<-as.factor(encuesta$REGION)
#Para convertir varias variables a factor
#Las guardamos en un vector
cols<- c("REGION","ZONA", "Tipo_vivienda", "M2", "Sexo", "Estado_civil", "NivInst", "CondAct", "np", "quintil")
#Le aplicamos una misma función a todas las columnas con lapply
encuesta[cols] <- lapply(encuesta[cols], factor)
Note que el $
se utiliza para llamar a variables de un dataframe. En el ejemplo anterior, el comando se lee: guarde la variable REGION del dataframe encuesta como un factor.
Variables categóricas
Para las variables categóricas podemos calcular tablas de frecuencia, es decir, ver el número de ocurrencias de cada categoría de la variable. Esto lo hacemos con el comando table()
.
Frecuencias simples
Entonces si quisieramos calcular la frecuencia de la variable ZONA el comando sería:
table(encuesta$ZONA)
##
## Rural Urbana
## 447 1008
Y podemos ver que 447 personas viven en Zona Rural y 1008 en Urbana.
Tablas de contingencia
Ahora si queremos tabular dos variables, simplemente las separamos por coma.
Por ejemplo la frecuencia de Tipo de vivienda según Zona:
table(encuesta$Tipo_vivienda, encuesta$ZONA)
##
## Rural Urbana
## Alquilada 43 281
## En precario 4 21
## Otra tenencia (cedida, prestada) 93 98
## Propia pagando a plazos 10 77
## Propia totalmente pagada 297 531
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(encuesta$Tipo_vivienda, encuesta$ZONA))
##
## Rural Urbana
## Alquilada 0.029553265 0.193127148
## En precario 0.002749141 0.014432990
## Otra tenencia (cedida, prestada) 0.063917526 0.067353952
## Propia pagando a plazos 0.006872852 0.052920962
## Propia totalmente pagada 0.204123711 0.364948454
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).
#Filas
prop.table(table(encuesta$Tipo_vivienda, encuesta$ZONA),1)
##
## Rural Urbana
## Alquilada 0.1327160 0.8672840
## En precario 0.1600000 0.8400000
## Otra tenencia (cedida, prestada) 0.4869110 0.5130890
## Propia pagando a plazos 0.1149425 0.8850575
## Propia totalmente pagada 0.3586957 0.6413043
#Columnas
prop.table(table(encuesta$Tipo_vivienda, encuesta$ZONA),2)
##
## Rural Urbana
## Alquilada 0.096196868 0.278769841
## En precario 0.008948546 0.020833333
## Otra tenencia (cedida, prestada) 0.208053691 0.097222222
## Propia pagando a plazos 0.022371365 0.076388889
## Propia totalmente pagada 0.664429530 0.526785714
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(encuesta$Tipo_vivienda, encuesta$ZONA)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | Chi-square contribution |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 1455
##
##
## | encuesta$ZONA
## encuesta$Tipo_vivienda | Rural | Urbana | Row Total |
## ---------------------------------|-----------|-----------|-----------|
## Alquilada | 43 | 281 | 324 |
## | 32.114 | 14.241 | |
## | 0.133 | 0.867 | 0.223 |
## | 0.096 | 0.279 | |
## | 0.030 | 0.193 | |
## ---------------------------------|-----------|-----------|-----------|
## En precario | 4 | 21 | 25 |
## | 1.764 | 0.782 | |
## | 0.160 | 0.840 | 0.017 |
## | 0.009 | 0.021 | |
## | 0.003 | 0.014 | |
## ---------------------------------|-----------|-----------|-----------|
## Otra tenencia (cedida, prestada) | 93 | 98 | 191 |
## | 20.075 | 8.902 | |
## | 0.487 | 0.513 | 0.131 |
## | 0.208 | 0.097 | |
## | 0.064 | 0.067 | |
## ---------------------------------|-----------|-----------|-----------|
## Propia pagando a plazos | 10 | 77 | 87 |
## | 10.469 | 4.643 | |
## | 0.115 | 0.885 | 0.060 |
## | 0.022 | 0.076 | |
## | 0.007 | 0.053 | |
## ---------------------------------|-----------|-----------|-----------|
## Propia totalmente pagada | 297 | 531 | 828 |
## | 7.142 | 3.167 | |
## | 0.359 | 0.641 | 0.569 |
## | 0.664 | 0.527 | |
## | 0.204 | 0.365 | |
## ---------------------------------|-----------|-----------|-----------|
## Column Total | 447 | 1008 | 1455 |
## | 0.307 | 0.693 | |
## ---------------------------------|-----------|-----------|-----------|
##
##
En este caso, el cuadro de arriba, nos dice qué es lo que se muestra en la tabla: N (número de observaciones), Chi-square (estadístico, no interesa por ahora), N/Row total (porcentaje por fila), N/Col Total (porcentaje por columna), N/Table Total (porcentaje total).
Tambien podemos simplificar la tabla para que nos muestre menos resultados, cambiando las opciones:
prop.r=TRUE
: porcentaje por filas. Si lo ponemos = F no lo muestra.
prop.c=TRUE
: porcentaje por columnas. Si lo ponemos = F no lo muestra
prop.t=TRUE
: porcentaje total de la tabla. Si lo ponemos = F no lo muestra
prop.chisq=TRUE
: Chi-square. Si lo ponemos = F no lo muestra
Entonces por ejemplo si solo queremos el porcentaje por fila y columna, la tabla sería:
CrossTable(encuesta$Tipo_vivienda, encuesta$ZONA, prop.t=F, prop.chisq = F)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## |-------------------------|
##
##
## Total Observations in Table: 1455
##
##
## | encuesta$ZONA
## encuesta$Tipo_vivienda | Rural | Urbana | Row Total |
## ---------------------------------|-----------|-----------|-----------|
## Alquilada | 43 | 281 | 324 |
## | 0.133 | 0.867 | 0.223 |
## | 0.096 | 0.279 | |
## ---------------------------------|-----------|-----------|-----------|
## En precario | 4 | 21 | 25 |
## | 0.160 | 0.840 | 0.017 |
## | 0.009 | 0.021 | |
## ---------------------------------|-----------|-----------|-----------|
## Otra tenencia (cedida, prestada) | 93 | 98 | 191 |
## | 0.487 | 0.513 | 0.131 |
## | 0.208 | 0.097 | |
## ---------------------------------|-----------|-----------|-----------|
## Propia pagando a plazos | 10 | 77 | 87 |
## | 0.115 | 0.885 | 0.060 |
## | 0.022 | 0.076 | |
## ---------------------------------|-----------|-----------|-----------|
## Propia totalmente pagada | 297 | 531 | 828 |
## | 0.359 | 0.641 | 0.569 |
## | 0.664 | 0.527 | |
## ---------------------------------|-----------|-----------|-----------|
## Column Total | 447 | 1008 | 1455 |
## | 0.307 | 0.693 | |
## ---------------------------------|-----------|-----------|-----------|
##
##
Además podemos poner únicamente una variable y nos muestra de una vez las proporciones. Por ejemplo:
CrossTable(encuesta$ZONA)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 1455
##
##
## | Rural | Urbana |
## |-----------|-----------|
## | 447 | 1008 |
## | 0.307 | 0.693 |
## |-----------|-----------|
##
##
##
##
Datos numéricos
Para calcular los estadísticos de las variables numéricas tenemos varias opciones.
Podemos usar el comando summary()
. Este comando nos da los principales estadísticos descriptivos (mínimo, máximo, cuartiles, promedio). Este comando podemos aplicarlo a todo el dataframe (nos da los estadísticos de todas las variables a la vez) o solo a una variable. En este caso, vamos a usarlo para toda la base.
summary(encuesta)
## id REGION ZONA
## Length:1455 Brunca :161 Rural : 447
## Class :character Central :777 Urbana:1008
## Mode :character Chorotega :139
## Huetar Caribe :142
## Huetar Norte :124
## Pacifico Central:112
##
## Tipo_vivienda Mensualidad
## Alquilada :324 Min. : 8000
## En precario : 25 1st Qu.: 65000
## Otra tenencia (cedida, prestada):191 Median : 125000
## Propia pagando a plazos : 87 Mean : 1612970
## Propia totalmente pagada :828 3rd Qu.: 206500
## Max. :99999999
## NA's :1044
## M2 Sexo Edad Estado_civil
## De 101 a 150 m2:165 Hombre:772 Min. :18.00 Divorciado(a):275
## De 151 a 200m2 : 78 Mujer :683 1st Qu.:42.50 Separado(a) :380
## De 30 a 40 m2 :192 Median :58.00 Soltero(a) :512
## De 41 a 60 m2 :472 Mean :56.59 Viudo(a) :288
## De 61 a 100 m2 :330 3rd Qu.:70.00
## Mas de 200m2 : 78 Max. :97.00
## Menos de 30 m2 :140
## NivInst Escolari
## Primaria completa :360 Min. : 0.000
## Primaria incompleta :290 1st Qu.: 5.000
## Educacion superior de pregrado y grado:289 Median : 6.000
## Secundaria academica incompleta :184 Mean : 8.079
## Secundaria academica completa :138 3rd Qu.:12.000
## Sin nivel de instruccion :109 Max. :21.000
## (Other) : 85
## CondAct ingreso
## Desempleado abierto : 37 Min. : 0
## Fuera de la fuerza de trabajo:602 1st Qu.: 124500
## Ocupado :816 Median : 306720
## Mean : 565695
## 3rd Qu.: 664062
## Max. :11830000
##
## np quintil
## No pobre :1221 Q1: 94063 o menos :269
## Pobreza extrema : 81 Q2: Mas de 94063 a 165618 :227
## Pobreza no extrema: 153 Q3: Mas de 165618 a 273816:184
## Q4: Mas de 273816 a 499386:287
## Q5: Mas de 499386 :488
##
##
NOTA: Si queremos calcular los estadísticos para una sola variable ponemos el nombre de la base de datos seguido del signo de $
. Por ejemplo: summary(encuesta$ingreso)
.
Además podemos hacer uso de funciones para calcular individualmente los estadísticos descriptivos: mean()
, median()
, min()
, max()
, IQR()
(rango intercuartílico), sd()
(desviación estándar).
describe()
Un comando muy útil es describe()
del paquete Hmisc
, ya que nos muestra un panorama más completo de las variables. En el caso de las numéricas nos muestra los estadísticos descriptivos, la cantidad de observaciones, los valores perdidos. Para las variables categóricas, muestra la frecuencia, las proporciones y los valores perdidos.
describe(encuesta)
## encuesta
##
## 15 Variables 1455 Observations
## ---------------------------------------------------------------------------
## id
## n missing distinct
## 1455 0 1455
##
## lowest : 1 10 100 1000 1001, highest: 995 996 997 998 999
## ---------------------------------------------------------------------------
## REGION
## n missing distinct
## 1455 0 6
##
## Value Brunca Central Chorotega
## Frequency 161 777 139
## Proportion 0.111 0.534 0.096
##
## Value Huetar Caribe Huetar Norte Pacifico Central
## Frequency 142 124 112
## Proportion 0.098 0.085 0.077
## ---------------------------------------------------------------------------
## ZONA
## n missing distinct
## 1455 0 2
##
## Value Rural Urbana
## Frequency 447 1008
## Proportion 0.307 0.693
## ---------------------------------------------------------------------------
## Tipo_vivienda
## n missing distinct
## 1455 0 5
##
## Alquilada (324, 0.223), En precario (25, 0.017), Otra tenencia (cedida,
## prestada) (191, 0.131), Propia pagando a plazos (87, 0.060), Propia
## totalmente pagada (828, 0.569)
## ---------------------------------------------------------------------------
## Mensualidad
## n missing distinct Info Mean Gmd .05 .10
## 411 1044 118 0.999 1612970 3001446 32500 45000
## .25 .50 .75 .90 .95
## 65000 125000 206500 328648 418771
##
## Value 0 1000000 100000000
## Frequency 398 7 6
## Proportion 0.968 0.017 0.015
## ---------------------------------------------------------------------------
## M2
## n missing distinct
## 1455 0 7
##
## Value De 101 a 150 m2 De 151 a 200m2 De 30 a 40 m2 De 41 a 60 m2
## Frequency 165 78 192 472
## Proportion 0.113 0.054 0.132 0.324
##
## Value De 61 a 100 m2 Mas de 200m2 Menos de 30 m2
## Frequency 330 78 140
## Proportion 0.227 0.054 0.096
## ---------------------------------------------------------------------------
## Sexo
## n missing distinct
## 1455 0 2
##
## Value Hombre Mujer
## Frequency 772 683
## Proportion 0.531 0.469
## ---------------------------------------------------------------------------
## Edad
## n missing distinct Info Mean Gmd .05 .10
## 1455 0 78 1 56.59 20.56 25.0 30.0
## .25 .50 .75 .90 .95
## 42.5 58.0 70.0 80.0 85.0
##
## lowest : 18 19 20 21 22, highest: 91 92 94 95 97
## ---------------------------------------------------------------------------
## Estado_civil
## n missing distinct
## 1455 0 4
##
## Value Divorciado(a) Separado(a) Soltero(a) Viudo(a)
## Frequency 275 380 512 288
## Proportion 0.189 0.261 0.352 0.198
## ---------------------------------------------------------------------------
## NivInst
## n missing distinct
## 1455 0 9
##
## lowest : Educacion superior de posgrado Educacion superior de pregrado y grado Primaria completa Primaria incompleta Secundaria academica completa
## highest: Secundaria academica completa Secundaria academica incompleta Secundaria tecnica completa Secundaria tecnica incompleta Sin nivel de instruccion
## ---------------------------------------------------------------------------
## Escolari
## n missing distinct Info Mean Gmd .05 .10
## 1455 0 22 0.983 8.079 5.825 0 1
## .25 .50 .75 .90 .95
## 5 6 12 16 17
##
## lowest : 0 1 2 3 4, highest: 17 18 19 20 21
## ---------------------------------------------------------------------------
## CondAct
## n missing distinct
## 1455 0 3
##
## Value Desempleado abierto Fuera de la fuerza de trabajo
## Frequency 37 602
## Proportion 0.025 0.414
##
## Value Ocupado
## Frequency 816
## Proportion 0.561
## ---------------------------------------------------------------------------
## ingreso
## n missing distinct Info Mean Gmd .05 .10
## 1455 0 990 1 565695 650160 40000 80000
## .25 .50 .75 .90 .95
## 124500 306720 664062 1412044 1993744
##
## lowest : 0 6500 7800 9100 10000
## highest: 5805518 6149000 6809833 7071794 11830000
## ---------------------------------------------------------------------------
## np
## n missing distinct
## 1455 0 3
##
## Value No pobre Pobreza extrema Pobreza no extrema
## Frequency 1221 81 153
## Proportion 0.839 0.056 0.105
## ---------------------------------------------------------------------------
## quintil
## n missing distinct
## 1455 0 5
##
## Q1: 94063 o menos (269, 0.185), Q2: Mas de 94063 a 165618 (227, 0.156),
## Q3: Mas de 165618 a 273816 (184, 0.126), Q4: Mas de 273816 a 499386 (287,
## 0.197), Q5: Mas de 499386 (488, 0.335)
## ---------------------------------------------------------------------------
Histograma
Una forma útil de explorar las variables numéricas es con histogramas. Estos podemos hacerlos con el comando hist()
, donde ponemos como argumento el nombre del dataframe seguido de $
y el nombre de la variable que queremos graficar.
hist(encuesta$ingreso)
Bonus 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:
histograma <- ggplot(encuesta, aes(x=ingreso)) +
ggtitle("Ingreso neto de hogares unipersonales") +
theme_fivethirtyeight() +
geom_histogram(color="#28324a", fill="#3c78d8")
histograma
Dplyr 2.0: Group_by y summarise
Group_by
Group by es uno de los comandos más útiles que tiene el paquetedplyr
. Como su nombre lo dice nos permite agrupar variables y hacer cálculos entre los grupos, por ejemplo calcular nuevas variables o estadísticos para los grupos.Por ejemplo, como vimos anteriormente con la función mean()
podemos calcular el ingreso promedio de toda la variable. Pero ¿Qué pasa si queremos crear una nueva variable cuyo valor sea el ingreso promedio de la Región de la planificación?. En este caso podemos hacer uso de group_by
.
encuesta <- encuesta %>%
group_by(REGION) %>%
mutate(ingresoprom=mean(ingreso))
También podemos agrupar por más de una variable, lo único que debemos hacer es separar las variables por coma. Por ejemplo si queremos agrupar por región, zona y sexo, el comando sería: group_by(encuesta, REGION, ZONA, sexo)
.
Summarise()
Finalmente otro de los comandos más comunes de dplyr
es summarise()
. Este como su nombre lo indica nos ayuda a resumir valores. Este comando funciona muy bien combinado con group_by()
. Por ejemplo si queremos calcular el ingreso y la edad promedio por region.
encuesta %>%
group_by(REGION) %>%
summarise(ingresoprom=mean(ingreso),
edadprom=mean(Edad))
## # A tibble: 6 x 3
## REGION ingresoprom edadprom
## <fct> <dbl> <dbl>
## 1 Brunca 465490. 56.5
## 2 Central 664111. 56.4
## 3 Chorotega 448612. 56.3
## 4 Huetar Caribe 417192. 55.8
## 5 Huetar Norte 433180. 59.1
## 6 Pacifico Central 507286. 56.7
Note que si queremos calcular más de un estadístico, lo único que debemos hacer es separarlos por comas, al igual que con la función mutate
.
Algunas funciones comunes que podemos calcular con summarise:
mean()
: promedion()
: esta función no requiere ningún argumento y calcula la cantidad de observaciones.
sum()
: suma del valor de la variable.min()
ymax()
: valor mínimo y máximo.
Correlaciones
¿Qué es? Una correlación mide la relación lineal entre dos variables. Por ejemplo la relación entre el la experiencia laboral y el salario.
Esta se mide con un coeficiente que va de -1 a 1.
- r = 1, la relación es positiva perfecta
- 0 < r < 1 la relación es positiva
- r = 0 no hay relación lineal
- -1 < r < 0 la relación es negativa
- r = -1 la relación es negativa perfecta
Primero vamos a instalar y cargar los siguientes paquetes:
#(recordar instalar paquetes si no se tienen)
install.packages("GGally")
install.packages("corrplot")
install.packages("PerformanceAnalytics")
#Cargar paquetes
library(GGally)
library(corrplot)
library(PerformanceAnalytics)
Ahora vamos a importar la base de datos llamada correlaciones.xlxs
:
#importar base de datos (recordar cambiar directorio)
base <- read_excel("correlaciones.xlsx")
La base de datos contiene variables sobre porcentajes de votación en la primera ronda electoral de 2018 y otros indicadores cantonales. Estas son las variables:
porcentajeprn
: porcentaje de votos obtenido por el PRNporcentajepac
: porcentaje de votos obtenido por el PAC
rezago
: Porcentaje de la población por cantón que contiene algún tipo de rezago escolar.
nini
: Porcentaje de jóvenes por cantón que no estudian ni trabajan.
educ_superior
: Porcentaje de la población con educación superior
ips
: Índice de progreso social
Calcular el coeficiente de correlación
¿Cómo calcular una correlación entre dos variables? Podemos hacerlo con el comando cor()
, donde tenemos que enlistar, separadas por coma, las variables que queremos correlacionar.
Por ejemplo si queremos correlacionar el porcentaje de votos del pac con los índice de progreso social escribimos:
cor(base$porcentajepac, base$ips)
## [1] 0.8049364
Esto nos muestra que el coeficiente de correlación es igual a 0.8. Sin embargo, debemos saber si esta relación es estadísticamente significativa, para lo que requerimos el p-value. Este lo obtenemos con el comando cor.test()
.
cor.test(base$porcentajepac, base$ips)
##
## Pearson's product-moment correlation
##
## data: base$porcentajepac and base$ips
## t = 11.904, df = 77, p-value < 0.00000000000000022
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7102332 0.8710224
## sample estimates:
## cor
## 0.8049364
Esto nos da como resultado un p-value de 0.000, por lo que rechazamos la hipótesis nula de que la correlación es igual a cero, a un nivel de significancia del 1%.
Matriz de correlación
También podemos calcular de una sola vez la correlación entre varias variables, con una matriz de correlación. Para ello usamos el mismo comando cor()
, pero ponemos como argumento de la función la base de datos:
round(cor(base),2)
## porcentajeprn porcentajepac rezago nini educ_superior ips
## porcentajeprn 1.00 -0.80 0.68 0.74 -0.57 -0.75
## porcentajepac -0.80 1.00 -0.71 -0.87 0.69 0.80
## rezago 0.68 -0.71 1.00 0.81 -0.77 -0.82
## nini 0.74 -0.87 0.81 1.00 -0.80 -0.84
## educ_superior -0.57 0.69 -0.77 -0.80 1.00 0.64
## ips -0.75 0.80 -0.82 -0.84 0.64 1.00
#NOTA: usamos round con dos decimales, para redondear el resultado, si no se quiere
#redondear solamente podemos usar el comando cor(base)
Podemos interpretar que por ejemplo, la correlación entre el porcentaje de votos que obtuvo el prn y el indicador de rezago escolar es de 0,68. Es decir, es una relación positiva que indica que a mayor porcentaje de votación del PRN mayor es el indicador de rezago escolar por cantón.
Calcular la matriz, con el p-value
Una vez que calculamos el coeficiente de correlación, es necesario identificar si es estadísticamente significativo, por lo que calculamos el p-value.
Si el p-value es menor al nivel de significancia que nosotros escogemos, por ejemplo 5%, entonces el coeficiente es estadísticamente significativo.
rcorr(as.matrix(base))
## porcentajeprn porcentajepac rezago nini educ_superior ips
## porcentajeprn 1.00 -0.80 0.68 0.74 -0.57 -0.75
## porcentajepac -0.80 1.00 -0.71 -0.87 0.69 0.80
## rezago 0.68 -0.71 1.00 0.81 -0.77 -0.82
## nini 0.74 -0.87 0.81 1.00 -0.80 -0.84
## educ_superior -0.57 0.69 -0.77 -0.80 1.00 0.64
## ips -0.75 0.80 -0.82 -0.84 0.64 1.00
##
## n= 79
##
##
## P
## porcentajeprn porcentajepac rezago nini educ_superior ips
## porcentajeprn 0 0 0 0 0
## porcentajepac 0 0 0 0 0
## rezago 0 0 0 0 0
## nini 0 0 0 0 0
## educ_superior 0 0 0 0 0
## ips 0 0 0 0 0
Este comando nos da la misma matriz de correlación que obtuvimos arriba, y abajo nos da el p-value. En todos el casos el p-value es muy bajo (=0), lo cual quiere decir que sí es estadísticamente significativo.
Ver la matriz de forma gráfica
Podemos graficar con el comando corrplot
. Ver más en este enlace:
Lo primero es calcular la matriz de correlación y guardarla en un objeto y luego graficarlo. En este caso vamos a graficar los coeficientes.
correlacion<-round(cor(base), 1)
corrplot(correlacion, method="number", type="upper")
También podemos hacer gráficos de dispersión, calcular los coeficientes de una sola vez y ver si son estadísticamente significativos, con un solo comando:
chart.Correlation(base, histogram = F, pch = 19)
En ese gráfico podemos observar gráficamente que hay una relación entre el porcentaje de votos del prn y el rezago escolar (tercera fila, primera columna) y que el coeficiente es de 0,68 y es estadístcamente significativo (esto se representa con los tres puntos rojos).
Materiales recomendados
Data wrangling cheatsheet
Limpieza de datos con R
Exploratory Data Analysis-Howard Seltman
Correlaciones en R