Base de datos para estos ejercicios: Familia y roles de género 2012, a descargar de:
http://iop-data.pucp.edu.pe/busqueda/encuesta/71?
Descomprimir y grabar el archivo SPSS en el directorio de trabajo de R
# Importar la base de datos del SPSS a un data frame de R
library(foreign)
genero <- as.data.frame(read.spss("IOP_1212_01_B.sav"))
## re-encoding from UTF-8
# Una tabla de distribución de frecuencias del sexo del entrevistado:
table(genero$SEXO)
##
## Masculino Femenino
## 589 614
prop.table(table(genero$SEXO)) # tabla en proporciones
##
## Masculino Femenino
## 0.4896093 0.5103907
prop.table(table(genero$SEXO))*100 # tabla en porcentajes
##
## Masculino Femenino
## 48.96093 51.03907
tabla.1a <- table(genero$SEXO)
tabla.1b <- prop.table(tabla.1a)*100
tabla.1a
##
## Masculino Femenino
## 589 614
tabla.1b
##
## Masculino Femenino
## 48.96093 51.03907
Redondear o especificar espacios decimales (que sean significativos)
round(tabla.1b, digits = 0) # Para redondear a la unidad
##
## Masculino Femenino
## 49 51
table(genero$P3A)
##
## Muy de acuerdo De acuerdo
## 67 377
## En desacuerdo Muy en desacuerdo
## 569 99
## Ni de acuerdo ni en desacuerdo No sabe
## 63 22
## No contesta
## 6
levels(genero$P3A)
## [1] "Muy de acuerdo" "De acuerdo"
## [3] "En desacuerdo" "Muy en desacuerdo"
## [5] "Ni de acuerdo ni en desacuerdo" "No sabe"
## [7] "No contesta"
library(car) # Cargar el paquete "car"
p3a.t <- as.numeric(genero$P3A) # Creamos un objeto temporal
table(p3a.t)
## p3a.t
## 1 2 3 4 5 6 7
## 67 377 569 99 63 22 6
genero$P3A.r <- recode(p3a.t, "3=4; 4=5; 5=3; 6:7=NA") # recodificamos
table(genero$P3A.r)
##
## 1 2 3 4 5
## 67 377 63 569 99
Convertimos la variable recodificada en un factor y le asignamos niveles (etiquetas)
genero$P3A.r <- factor(genero$P3A.r)
levels(genero$P3A.r) <- c("Muy de acuerdo", "De acuerdo",
"Ni de acuerdo ni en desacuerdo",
"En desacuerdo", "Muy en desacuerdo")
tabla.2 <- round(prop.table(table(genero$P3A.r))*100, digits = 2)
tabla.2
##
## Muy de acuerdo De acuerdo
## 5.70 32.09
## Ni de acuerdo ni en desacuerdo En desacuerdo
## 5.36 48.43
## Muy en desacuerdo
## 8.43
Si queremos hacer tablas parecidas al SPSS podemos usar la función “freq” del paquete “descr” (requiere que el paquete esté instalado en la librería del R)
library(descr)
tabla.3 <- freq(genero$SEXO, plot = FALSE)
tabla.3
## genero$SEXO
## Frequency Percent
## Masculino 589 48.96
## Femenino 614 51.04
## Total 1203 100.00
Cuando la tabla corresponde a una variable ordinal, podemos incluir las frecuencias acumuladas, indicando que estamos trabajando con un factor ordenado:
tabla.4 <- freq(ordered(genero$P3A.r), plot = FALSE)
tabla.4
## ordered(genero$P3A.r)
## Frequency Percent Valid Percent Cum Percent
## Muy de acuerdo 67 5.569 5.702 5.702
## De acuerdo 377 31.338 32.085 37.787
## Ni de acuerdo ni en desacuerdo 63 5.237 5.362 43.149
## En desacuerdo 569 47.298 48.426 91.574
## Muy en desacuerdo 99 8.229 8.426 100.000
## NA's 28 2.328
## Total 1203 100.000 100.000
Veamos la variable edad:
table(genero$EDAD)
##
## 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
## 55 43 39 28 38 32 21 32 25 20 37 40 40 18 25 28 19 31 32 22 26 18 32 15 29
## 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
## 19 31 34 22 17 22 15 29 13 21 14 12 8 14 16 8 9 20 5 15 11 6 10 13 10
## 68 69 70 71 72 73 74 75 76 77 80 81 82 83 84 87 92
## 5 5 12 6 4 4 3 8 2 1 2 1 4 4 1 1 1
En intervalos de 10 años:
edad <- genero$EDAD
edad2 <- cut(edad, seq(from = 18, to = 98, by = 10), include.lowest=TRUE)
table(edad2)
## edad2
## [18,28] (28,38] (38,48] (48,58] (58,68] (68,78] (78,88] (88,98]
## 370 281 239 150 104 45 13 1
edad2b <- cut(edad, seq(from = 15, to = 95, by = 10))
table(edad2b)
## edad2b
## (15,25] (25,35] (35,45] (45,55] (55,65] (65,75] (75,85] (85,95]
## 288 283 258 173 114 70 15 2
Otra posibilidad:
edad2c <- cut(edad, breaks = c(18, 25, 35, 45, 55, 92),
include.lowest = TRUE)
table(edad2c)
## edad2c
## [18,25] (25,35] (35,45] (45,55] (55,92]
## 288 283 258 173 201
tabla.5 <- freq(ordered(edad2c), plot = FALSE)
tabla.5
## ordered(edad2c)
## Frequency Percent Cum Percent
## [18,25] 288 23.94 23.94
## (25,35] 283 23.52 47.46
## (35,45] 258 21.45 68.91
## (45,55] 173 14.38 83.29
## (55,92] 201 16.71 100.00
## Total 1203 100.00
Una tabla bi-variable con las Rptas a la pregunta P3A en las filas y el sexo del entrevistado en las columnas: “P3A según sexo”
# Tabla de frecuencias cruzadas simples
table(genero$P3A.r, genero$SEXO)
##
## Masculino Femenino
## Muy de acuerdo 40 27
## De acuerdo 215 162
## Ni de acuerdo ni en desacuerdo 30 33
## En desacuerdo 249 320
## Muy en desacuerdo 39 60
Tabla de frecuencias cruzadas en porcentajes calculados sobre el total de todos los casos de la tabla
prop.table(table(genero$P3A.r, genero$SEXO))*100
##
## Masculino Femenino
## Muy de acuerdo 3.404255 2.297872
## De acuerdo 18.297872 13.787234
## Ni de acuerdo ni en desacuerdo 2.553191 2.808511
## En desacuerdo 21.191489 27.234043
## Muy en desacuerdo 3.319149 5.106383
# Tabla de porcentajes calculados sobre el total de cada fila
prop.table(table(genero$P3A.r, genero$SEXO), 1)*100
##
## Masculino Femenino
## Muy de acuerdo 59.70149 40.29851
## De acuerdo 57.02918 42.97082
## Ni de acuerdo ni en desacuerdo 47.61905 52.38095
## En desacuerdo 43.76098 56.23902
## Muy en desacuerdo 39.39394 60.60606
# Tabla de porcentajes calculados sobre el total de cada columna
prop.table(table(genero$P3A.r, genero$SEXO), 2)*100
##
## Masculino Femenino
## Muy de acuerdo 6.980803 4.485050
## De acuerdo 37.521815 26.910299
## Ni de acuerdo ni en desacuerdo 5.235602 5.481728
## En desacuerdo 43.455497 53.156146
## Muy en desacuerdo 6.806283 9.966777
Guardamos los resultados de la última tabla creada en un objeto llamado “tabla.6”, con los números redondeados hasta 2 decimales
tabla.6 <- round(prop.table(table(genero$P3A.r, genero$SEXO), 2)*100, digits = 2)
tabla.6
##
## Masculino Femenino
## Muy de acuerdo 6.98 4.49
## De acuerdo 37.52 26.91
## Ni de acuerdo ni en desacuerdo 5.24 5.48
## En desacuerdo 43.46 53.16
## Muy en desacuerdo 6.81 9.97
Otra manera de tener una tabla de frecuencias cruzadas, usando el comando “crosstab” del paquete “descr”. Es similar a la opción de tablas de contingencia o “Crosstabs” del SPSS
library(descr)
tabla.7 <- crosstab(genero$P3A.r, genero$SEXO, prop.c = TRUE, plot = FALSE)
tabla.7
Si en vez de calcular los % para las columnas los queremos para las filas, reemplazamos la opción “prop.c = TRUE” por “prop.r = TRUE”. Si los queremos calculados sobre el total de casos de la tabla, usamos “prop.t = TRUE”.
## Cell Contents
## |-------------------------|
## | Count |
## | Column Percent |
## |-------------------------|
##
## ==============================================================
## genero$SEXO
## genero$P3A.r Masculino Femenino Total
## --------------------------------------------------------------
## Muy de acuerdo 40 27 67
## 6.981 4.485
## --------------------------------------------------------------
## De acuerdo 215 162 377
## 37.522 26.910
## --------------------------------------------------------------
## Ni de acuerdo ni en desacuerdo 30 33 63
## 5.236 5.482
## --------------------------------------------------------------
## En desacuerdo 249 320 569
## 43.455 53.156
## --------------------------------------------------------------
## Muy en desacuerdo 39 60 99
## 6.806 9.967
## --------------------------------------------------------------
## Total 573 602 1175
## 48.766 51.234
## ==============================================================
Para enviar tablas a otros programas, por ejemplo el Excel. Podemos usar la función “xtable”, del paquete con el mismo nombre (requiere ser instalado en la librería del R) Para más información ver:
http://cran.r-project.org/web/packages/xtable/xtable.pdf
http://cran.r-project.org/web/packages/xtable/vignettes/xtableGallery.pdf
tabla.2 # Correspondiente a la pregunta P3A
##
## Muy de acuerdo De acuerdo
## 5.70 32.09
## Ni de acuerdo ni en desacuerdo En desacuerdo
## 5.36 48.43
## Muy en desacuerdo
## 8.43
library(xtable)
print(xtable(tabla.2, caption = "P3A"), type = "html",
file = "tabla2.html")
Ubique el archivo “tabla2.html” en su directorio de trabajo de R y ábralo desde el
Hagamos lo mismo con otras tablas y vea como quedan abriendo los archivos HTML desde el Excel.
print(xtable(tabla.3, caption ="Sexo del entrevistado"),
type = "html", file = "tabla3.html")
print(xtable(tabla.4, caption ="P3A"),
type = "html", file = "tabla4.html")
print(xtable(tabla.5, caption ="Grupos de edad"),
type = "html", file = "tabla5.html")
print(xtable(tabla.6, caption = "P3A según sexo"),
type = "html", file = "tabla6.html")
print(xtable(tabla.7, caption = "P3A según sexo"),
type = "html", file = "tabla7.html")
Una de las mejores herramientas para realizar un análisis estadístico descriptivo es el uso de gráficos estadísticos.
Un buen gráfico debe:
El R ofrece diferentes posibilidades para realizar gráficos
Veamos cómo se ven los resultados de la siguiente tabla usando los tres entornos gráficos seleccionados:
##
## Muy de acuerdo De acuerdo
## 67 377
## Ni de acuerdo ni en desacuerdo En desacuerdo
## 63 569
## Muy en desacuerdo
## 99
barplot(table(genero$P3A.r), horiz=TRUE)
library(lattice)
barchart(genero$P3A.r)
library(ggplot2)
v1 <- na.omit(genero$P3A.r)
qplot(v1, geom = "bar") + coord_flip()
El gráfico de barras es la mejor opción para representar variables categóricas. Por ejemplo, si queremos hacer un gráfico de distribución de las respuestas a la pregunta P51D:
ggplot(genero, aes(P51D)) + geom_bar()
El histograma es la primera opción para observar la distribución de una variable cuantitativa:
ggplot(genero, aes(EDAD)) + geom_histogram()
¿Qué está mal aqui?
ggplot(genero, aes(P1)) + geom_histogram()
Corregimos:
genero$P1r <- genero$P1
genero$P1r[genero$P1 == 99] <- NA # Designamos al código 99 como NA
ggplot(genero, aes(P1r)) + geom_histogram()
Observe que en el histograma anterior hay otro dato “raro”, pruebe con quitarlo y rehacer nuevamente el histograma. Debería quedar como esto:
genero$P1r <- genero$P1
genero$P1r[genero$P1 >= 60] <- NA # Designamos al código 99 como NA
ggplot(genero, aes(P1r)) + geom_histogram()
#Amplitud 2
ggplot(genero, aes(P1r)) + geom_histogram(binwidth=2)
#Amplitud 5
ggplot(genero, aes(P1r)) + geom_histogram(binwidth=5)
Con el histograma podemos comparar diferentes distribuciones de una variable cuantitativa:
ggplot(genero, aes(P1r)) + geom_histogram(binwidth=2) + facet_grid(Ambito ~.)
La curva de densidad de Kernell nos permite observar gráficamente la distribución de una variable cuantitativa, “suavizando” los bordes de las barras del histograma. En el eje vertical se muestra la estimación de la probabilidad correspondiente a cada valor de la variable
También podemos comparar distribuciones con la curva de densidad:
ggplot(genero, aes(P1r)) + geom_line(stat="density") + facet_grid(Ambito ~.)