Capítulo 5 Análisis exploratorio de datos
Como sabemos, los estadísticos de tendencia central van a depender del tipo de variable que estemos analizando.
Para practicar este apartado vamos a utilizar la base de datos de Lapop del año 2017. Lapop es el Proyecto de Opinión Pública de América Latina implementado por la Universidad de Vanderbilt, el cual es un proyecto de investigación multinacional especializado en el desarrollo, implementación y análisis de encuestas de opinión pública.
Abrimos la base de datos desde nuestro repositorio:
library(rio)
link="https://github.com/DataPolitica/salidas/raw/master/Data/sub_lapop.sav"
lapop=import(link)
Esta base de datos ha sido editada con fines didácticos (idioma, recodificación, etc).
5.1 Para nominales
5.1.1 Preparación
Selecciones la variable urbanorural y procedemos a configurarla adecuadamente.
Primero identifiquemos cómo el R está leyendo la variable.
str(lapop$urbanorural)
## num [1:2153] 2 2 2 2 2 2 2 2 2 2 ...
## - attr(*, "label")= chr "Urbano / Rural"
## - attr(*, "format.spss")= chr "F8.2"
## - attr(*, "display_width")= int 9
## - attr(*, "labels")= Named num [1:2] 1 2
## ..- attr(*, "names")= chr [1:2] "Urbano" "Rural"
class(lapop$urbanorural)
## [1] "numeric"
Luego, al ver que aún se encuentra como numérico, entonces lo convertimos en factor:
lapop$urbanorural=as.factor(lapop$urbanorural)
class(lapop$urbanorural)
## [1] "factor"
Verificamos los niveles y, de acuerdo con la metadata, le asignamos las etiquetas a cada uno de los mismos.
levels(lapop$urbanorural)
## [1] "1" "2"
levels(lapop$urbanorural)<-c("Urbano","Rural")
levels(lapop$urbanorural)
## [1] "Urbano" "Rural"
Asimismo, podemos solicitar una tabla que nos muestre las proporciones
por cada categoría. Para ello, utilizamos la función prop.table()
.
Cuando escribimos esta función hay que tener en cuenta que la tenemos
que aplicar sobre la tabla de frecuencias normal (que aplicamos
anteriormente):
prop.table(table(lapop$urbanorural))
##
## Urbano Rural
## 0.6149559 0.3850441
Si queremos los porcentaje hacemos lo mismo pero al final le decimos que lo multiple por 100 (*100):
prop.table(table(lapop$urbanorural))*100
##
## Urbano Rural
## 61.49559 38.50441
Ya tenemos la variable lista para aplicar técnicas de análisis descriptivo.
5.1.2 Estadísticos descriptivos
Lo primero que podemos hacer es solicitar la función summary
. Esta
función nos va a dar una mirada rápida al contenido de nuestra variable.
En el caso de ser factor, nos va a mostrar las frecuencias (incluye los
NA si los hubiera):
summary(lapop$urbanorural)
## Urbano Rural
## 1324 829
Como sabemos el estadístico más idóneo para variables nominales es la
moda. Por ello, hacemos uso del paquete DescTools
y de la función
Mode()
:
library(DescTools)
Mode(lapop$urbanorural)
## [1] Urbano
## attr(,"freq")
## [1] 1324
## Levels: Urbano Rural
Lo que nos dice el resultado es que la moda es la categoría Urbano y nos indica la frecuencia.
Otra opción también es solicitar una tabla simple para ver la frecuencia de cada categoría.
table (lapop$urbanorural)
##
## Urbano Rural
## 1324 829
5.1.3 Gráficos
Lo primero que podemos solicitar es un diagrama de pie o de sectores. Nótese que primero debemos crear un objeto que sea la tabla de la variable que deseamos graficar, en este caso, de urbano rural. De esa manera, el programa podrá utilizar los datos y plasmarlos en un gráfico.
mi_tabla <- table(lapop$urbanorural)
pie(mi_tabla)

Image
Es recomendable graficar un máximo de 7 sectores. Si colocamos una varaible con más sector puede resultar confusa la interpretación.
También podemos solicitar un diagrama de barras.
barplot(mi_tabla)

Image
Agregando más detalles a nuestros gráficos
Hasta este momento hemos visto que podemos solicitar gráficos de una forma muy práctica. Sin embargo, nosotros podemos solicitar un producto más elaborado en la medida en que agreguemos más características al código.
Por ejemplo, si deseamos un diagrama de barras azul escribimos:
barplot(mi_tabla, col="blue")

Image
Si deseamos un diagrama de barras azul y con título escribimos:
barplot(mi_tabla,col="blue",
main="Casos según su lugar de procedencia")

Image
Como nos damos cuenta, nosotros podemos ir agregando más características a nuestro código. Es posible que recuerdes ejemplos de códigos de programación que son líneas interminables. Eso es así porque los programadores elaboran productos muy específicos y que, en su mayoría de veces, requieren la especificación de muchas características.
Nuestro objetivo será avanzar en el uso de estos códigos de programación para poder, al igual que los programadores, elaborar análisis estadísticas cada vez más complejos y específicos.
5.2 Para ordinales
Abrimos la base de datos LAPOP desde nuestro repositorio:
library(rio)
link="https://github.com/DataPolitica/salidas/raw/master/Data/sub_lapop.sav"
lapop=import(link)
5.2.1 Preparación
Esta vez vamos a utilizar la variable Interés en la política. Procedemos a configurarla adecuadamente.
Primero identifiquemos cómo el R está leyendo la variable.
str(lapop$interes)
## num [1:2153] 2 2 1 1 1 2 2 2 2 3 ...
## - attr(*, "label")= chr "Interés en la política"
## - attr(*, "format.spss")= chr "F8.2"
## - attr(*, "display_width")= int 11
## - attr(*, "labels")= Named num [1:4] 1 2 3 4
## ..- attr(*, "names")= chr [1:4] "Nada" "Un poco" "Algo" "Mucho"
class(lapop$interes)
## [1] "numeric"
Luego, al ver que aún se encuentra como numérico, entonces lo convertimos en factor ordenado:
lapop$interes=ordered(lapop$interes)
class(lapop$interes)
## [1] "ordered" "factor"
Verificamos los niveles y, de acuerdo con la metadata, le asignamos las etiquetas a cada uno de los mismos. En este caso los significados son: 1, “Nada”; 2, “Poco”; 3, “Algo”; y 4, “Mucho”.
levels(lapop$interes)
## [1] "1" "2" "3" "4"
levels(lapop$interes)<-c("Nada","Poco", "Algo", "Mucho")
levels(lapop$interes)
## [1] "Nada" "Poco" "Algo" "Mucho"
Ya tenemos la variable lista para aplicar técnicas de análisis descriptivo para ordinales.
5.2.2 Estadísticos descriptivos
Al igual que la sección anterior, podemos solicitar la función
summary()
para que nos muestre las frecuencias por cada categoría (en
este caso tampoco tenemos NA´´s):
summary(lapop$interes)
## Nada Poco Algo Mucho
## 632 787 532 202
Utilizando el paquete DescTools
podemos solicitar la moda, con la
función Mode()
; y la mediana, con la función Median()
:
library(DescTools)
Mode(lapop$interes)
## [1] Poco
## attr(,"freq")
## [1] 787
## Levels: Nada < Poco < Algo < Mucho
Median(lapop$interes)
## [1] Poco
## Levels: Nada < Poco < Algo < Mucho
Lo que nos dice el resultado es que la moda es la categoría Poco. La mediana nos dice que, si ordenamos los resultados de menor a mayor, el valor central es Poco. También podemos interpretarlo como que “al menos el 50% de los casos tienen poco interés en la política”.
Otra opción, al igual que las nominales, es solicitar una tabla simple para ver la frecuencia de cada categoría.
table (lapop$interes)
##
## Nada Poco Algo Mucho
## 632 787 532 202
5.2.3 Gráficos
Primero creamos un objeto que sea la tabla de la variable que deseamos graficar, en este caso, interés por la política.
mi_tabla <- table(lapop$interes)
mi_tabla
##
## Nada Poco Algo Mucho
## 632 787 532 202
Solicitamos un diagrama de pie o sector con la función pie()
:
pie(mi_tabla)

Image
Solicitamos un diagrama de barras con la función barplor()
:
barplot(mi_tabla)

Image
5.3 Para numéricas
5.3.1 Preparación
Abrimos la base de datos LAPOP desde nuestro repositorio:
library(rio)
link="https://github.com/DataPolitica/salidas/raw/master/Data/sub_lapop.sav"
lapop=import(link)
Seleccionamos la variable ingresos
5.3.2 Estadísticos descriptivos
Solicitar la función summary()
y vamos a ver que el resultado variable
significativamente de los resultados de las variables categóricas:
summary(lapop$ingresos)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1316 2661 3010 3012 3341 4667
Como vemos, el summary ahora nos muestra los principales estadísticos de una variable numérica, es decir: mínimo, 1er cuartil, mediana, media o promedio, 3er cuartil y máximo. Siempre que tengamos una variable numérica comencemos por solicitar esta función.
5.3.3 Estadísticos de dispersión
La lógica es la misma, colocamos la función y entre paréntesis el nombre de la variable:
Si deseamos la desviación estándar utilizamos la función sd()
:
sd(lapop$ingresos)
## [1] 498.6063
Si deseamos la varianza utilizamos la función var()
:
var(lapop$ingresos)
## [1] 248608.3
También podemos pedir estadísticos de dispersión.
Para solicitar la asimetría y curtosis primero abrimos el paquete
e1071
:
library(e1071)
Para la asimetría utilizamos la función skewness()
:
skewness(lapop$ingresos)
## [1] 0.0544436
Para la curtosis utilizamos la función kurtosis()
:
kurtosis(lapop$ingresos)
## [1] -0.0678835
5.3.4 Gráficos
En este caso, como estamos ante una variable numérica, no necesitamos crear una tabla antes de solicitar los gráficos.
- Histograma
Solicitemos un histograma con la función hist()
:
hist(lapop$ingresos)

Image
- Diagrama de cajas o boxplot
Solicitemos un diagrama de cajas con la función boxplot()
:
boxplot(lapop$ingresos)

Image
5.4 Análisis bivariado
5.4.1 Tablas de contingencia
Abrimos la base de datos LAPOP desde nuestro repositorio:
library(rio)
link="https://github.com/DataPolitica/salidas/raw/master/Data/sub_lapop.sav"
lapop=import(link)
Verificamos y configuramos adecuadamente las variables que utilizaremos
lapop$urbanorural=as.factor(lapop$urbanorural)
levels(lapop$urbanorural)<-c("Urbano","Rural")
lapop$sexo=as.factor(lapop$sexo)
levels(lapop$sexo)<-c("Hombre","Mujer")
Una vez que hemos identificamos dos variables categóricas lo primeros que podemos solicitar es una tabla de contingencia.
Ante de seguir te sugiero ver el siguiente tutorial para solicitar tablas de contigencias:
Como vimos en el video, podemos pedir tablas de contingencia con la
función table()
. Hagamos una tabla para las variables urbanorural y
sexo:
Primero hallemos una tabla de contingencia simple, con sólo las frecuencias. La llamaremos tabla1:
tabla1 <- table(lapop$urbanorural, lapop$sexo)
tabla1
##
## Hombre Mujer
## Urbano 687 637
## Rural 434 395
Podemos agregarle los totales marginales escribiendo la siguiente
función addmargins()
addmargins(tabla1)
##
## Hombre Mujer Sum
## Urbano 687 637 1324
## Rural 434 395 829
## Sum 1121 1032 2153
Ahora, pidamos una tabla de contingencia con porcentaje Tenemos que
hacer referencia a la tabla creada anteriormente y usar el comando
prop.table()
y lo multiplicamos por 100. La llamaremos tabla2:
tabla2 <- prop.table(tabla1)*100
tabla2
##
## Hombre Mujer
## Urbano 31.90896 29.58662
## Rural 20.15792 18.34649
Vemos que nos da los valores totales, pero nosotros queremos sólo los porcentaje por columna. Para ello, debemos hacer referencia a las columnas dentro del comando agregando el número 2 (si ponemos 1 aparecerán los porcentaje por filas)
tabla3 <- prop.table(tabla1, 2)*100
tabla3
##
## Hombre Mujer
## Urbano 61.28457 61.72481
## Rural 38.71543 38.27519
Por último, podemos agregarle los totales marginales escribiendo la
siguiente función addmargins()
addmargins(tabla3)
##
## Hombre Mujer Sum
## Urbano 61.28457 61.72481 123.00937
## Rural 38.71543 38.27519 76.99063
## Sum 100.00000 100.00000 200.00000
5.4.2 Una numérica y una categórica
Para mostrar los descriptivos de una variable numérica según una variable categórica tenemos que considerar a esta última como grupos. De esta manera, lo que hacemos en realidad es la comparación de la numérica entre 2 o más grupos.
Para ello, utilizamos el paquete psych()
library(psych)
Para describir la varible podemos utilizar la función describeBy()
.
Notemos que primero debemos poner la variable numérica y luego el grupo
de comparación.
Por ejemplo, obtengamos los estadísticos descriptivos de la variable Edad según si la persona pertenece al ámbito rural o urbano (categórica/grupos):
describeBy(lapop$edad,group=lapop$urbanorural)
##
## Descriptive statistics by group
## group: Urbano
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 1324 37.79 14.59 35 36.51 14.83 18 86 68 0.67 -0.27 0.4
## ------------------------------------------------------------
## group: Rural
## vars n mean sd median trimmed mad min max range skew kurtosis se
## X1 1 829 36.96 13.68 35 35.84 14.83 18 80 62 0.63 -0.25 0.48
También podemos solicitar un diagrama de cajas o boxplot según los grupos:
boxplot(lapop$edad~lapop$urbanorural)

Image
5.4.3 Dos variables numéricas
Utilicemos la base de datos trabajadores:
library(rio)
base_trabajadores="https://github.com/DataPolitica/salidas/raw/master/Data/trabajadores.sav"
trabajadores=import(base_trabajadores)
Para analizar la relación entre dos variables numéricas es muy común referirse al gráfico de dispersión.
Para ello, solicitamos el gráfico con la función plot()
. Entre
paréntesis colocar las dos variables numéricas: el salario inicial y el
salario actual de los trabajadores de una empresa.
plot(trabajadores$salario_actual, trabajadores$salario_inicial)

Image
Podemos especificar más elementos de nuestro gráfico de dispersión. Agreguemos título del gráfico y etiquetas de los ejes X e Y:
plot(trabajadores$salario_actual, trabajadores$salario_inicial,
main="Relación entre salario inicial y salario final",
xlab="Salario actual",
ylab="Salario final")

Image