Análisis exploratorio de datos con R

Camila Salazar

¿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 paquete dplyr. 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(): promedio
  • n(): esta función no requiere ningún argumento y calcula la cantidad de observaciones.
  • sum(): suma del valor de la variable.
  • min() y max(): 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 PRN
  • porcentajepac: 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).