En este Rpubs lo que se pretende brindar es una metodología para realizar un análisis descriptivo de una base de datos siguiendo la ecnuesta LAPOP, que es la base de datos del Barómetro de las Américas, del Latin American Public Opinion Project (LAPOP), ubicado en la Universidad de Vanderbilt.
Un desarrollo adicional y más completo se encuentra en la página https://rpubs.com/dsulmont/94167. En este taller se tocan gráficos y estadísticas básicas complementarias.
La base de datos se encuentra consolidada en https://drive.google.com/file/d/1m-uskuClBiItEkwQIFjL7dWErvIZM8NB/view?usp=sharing
Limpiamos la consola de trabajo
rm(list=ls())
Librerías a usar
if (!require("foreign")) install.packages("foreign")
## Loading required package: foreign
if (!require("haven")) install.packages("haven")
## Loading required package: haven
## Warning: package 'haven' was built under R version 3.6.3
if (!require("agricolae")) install.packages("agricolae")
## Loading required package: agricolae
## Warning: package 'agricolae' was built under R version 3.6.3
if (!require("Hmisc")) install.packages("Hmisc")
## Loading required package: Hmisc
## Warning: package 'Hmisc' was built under R version 3.6.3
## Loading required package: lattice
## Loading required package: survival
## Warning: package 'survival' was built under R version 3.6.3
## Loading required package: Formula
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.6.3
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
##
## format.pval, units
if (!require("fBasics")) install.packages("fBasics")
## Loading required package: fBasics
## Loading required package: timeDate
##
## Attaching package: 'timeDate'
## The following objects are masked from 'package:agricolae':
##
## kurtosis, skewness
## Loading required package: timeSeries
if (!require("plotrix")) install.packages("plotrix") #paquete que contiene la funcion pie3D para realizar el diagrama 3D
## Loading required package: plotrix
Un método alternativo, no recomendado por muchos, pero que forma parte del universo de opciones de llamado de bases de datos de R es el código file.choose que nos permite cargar de forma manual cualquier tipo de datos.
Para el caso, se cargará la base de datos de tipo SPSS, importandola al R. Es importante que el lector sepa donde guardó la base de datos para así poderla cargar. El tipo de carga es similar a la selección de archivos clásica de cualquier programa.
lapop <- as.data.frame(read_sav(file.choose()),encoding = NULL, user_na = TRUE)
El código a continuación muestra las columnas o variables con las que me pienso quedar.
lapop<-(lapop[,c("b1", "b2", "b3", "b4", "b6", "q1", "pais", "tamano", "q12")])
Para mostrar la cabecera (6 primeras observaciones de la base) usamos la función head. Sin embargo, esta función puede ser modificada agregandole una coma seguida del número de observaciones a mostrar posterior a la especificación de la base. Por ejemplo head(base) es igual a decir head(base, 6) sin embargo se puede especificar head(base, 10) para que muestre las 10 primeras observaciones.
head(lapop)
## b1 b2 b3 b4 b6 q1 pais tamano q12
## 1 NA 7 1 7 7 1 10 NA 2
## 2 3 5 2 2 NA 1 10 NA 4
## 3 4 5 5 5 5 1 10 NA 2
## 4 2 6 5 7 2 2 10 NA 3
## 5 NA 7 NA 7 7 1 10 NA 0
## 6 6 7 6 5 4 2 10 NA 1
head(lapop, 10)
## b1 b2 b3 b4 b6 q1 pais tamano q12
## 1 NA 7 1 7 7 1 10 NA 2
## 2 3 5 2 2 NA 1 10 NA 4
## 3 4 5 5 5 5 1 10 NA 2
## 4 2 6 5 7 2 2 10 NA 3
## 5 NA 7 NA 7 7 1 10 NA 0
## 6 6 7 6 5 4 2 10 NA 1
## 7 4 5 3 5 4 2 10 NA 3
## 8 4 5 3 5 7 1 10 NA 2
## 9 2 2 2 3 3 2 10 NA 4
## 10 2 3 2 4 3 1 10 NA 3
Para verificar la estructura de toda la base de datos se puede usar la función str seguida de la base de datos. Esto también es válido para una variable.
str(lapop)
## 'data.frame': 151341 obs. of 9 variables:
## $ b1 : 'haven_labelled' num NA 3 4 2 NA 6 4 4 2 2 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto cree usted que los tribunales de justicia del país garantizan u"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "1 Nada" "2" "3" "4" ...
## $ b2 : 'haven_labelled' num 7 5 5 6 7 7 5 5 2 3 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto tiene usted respeto por las instituciones políticas del país?"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "1 Nada" "2" "3" "4" ...
## $ b3 : 'haven_labelled' num 1 2 5 5 NA 6 3 3 2 2 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto cree usted que los derechos básicos del ciudadano están bien pr"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "Nada protegido" "2" "3" "4" ...
## $ b4 : 'haven_labelled' num 7 2 5 7 7 5 5 5 3 4 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto se siente usted orgulloso de vivir bajo el sistema político del"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "1 Nada" "2" "3" "4" ...
## $ b6 : 'haven_labelled' num 7 NA 5 2 7 4 4 7 3 3 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto piensa usted que se debe apoyar al sistema político del país?"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "1 Nada" "2" "3" "4" ...
## $ q1 : 'haven_labelled' num 1 1 1 2 1 2 2 1 2 1 ...
## ..- attr(*, "label")= chr "Género"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 888888 988888 999999
## .. ..- attr(*, "names")= chr "Hombre" "Mujer" "DK" "NR" ...
## $ pais : 'haven_labelled' num 10 10 10 10 10 10 10 10 10 10 ...
## ..- attr(*, "label")= chr "País"
## ..- attr(*, "format.spss")= chr "F2.0"
## ..- attr(*, "display_width")= int 6
## ..- attr(*, "labels")= Named num 1 2 3 4 5 6 7 8 9 10 ...
## .. ..- attr(*, "names")= chr "México" "Guatemala" "El Salvador" "Honduras" ...
## $ tamano: 'haven_labelled' num NA NA NA NA NA NA NA NA NA NA ...
## ..- attr(*, "label")= chr "Tamaño del lugar"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "Capital nacional (área metropolitana)" "Ciudad grande" "Ciudad mediana" "Ciudad pequeña" ...
## $ q12 : 'haven_labelled' num 2 4 2 3 0 1 3 2 4 3 ...
## ..- attr(*, "label")= chr "¿Tiene hijos(as)? ¿Cuántos?"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 0 888888 988888 999999
## .. ..- attr(*, "names")= chr "Ninguno" "DK" "NR" "N/A"
str(lapop$b1)
## 'haven_labelled' num [1:151341] NA 3 4 2 NA 6 4 4 2 2 ...
## - attr(*, "label")= chr "¿Hasta qué punto cree usted que los tribunales de justicia del país garantizan u"
## - attr(*, "format.spss")= chr "F6.0"
## - attr(*, "labels")= Named num [1:10] 1 2 3 4 5 ...
## ..- attr(*, "names")= chr [1:10] "1 Nada" "2" "3" "4" ...
La estadística descriptiva clásica es un gráfico de frecuencias. R nos permite desarrollar eso con la función table, arrojándonos las frecuencias (o conteos)
La variable b1 representa a la pregunta: ¿Hasta que punto cree que los tribunales de justicia de [PAIS] garantizan un juicio justo?
table(lapop$b1)
##
## 1 2 3 4 5 6 7
## 18379 14105 25208 32566 28381 12811 10249
La variable b1 es de tipo factor. Para poder sumarla a las demás es necesario convertirla en un vector numérico y excluir los valores perdidos (DK, NR y N/A).
Lo primero que se hace es transformarla a numérica con el código as.numeric. Para realizar la prueba convertiremos todos los valores mayores que 7 a valor nulo NA y verificaremos la frecuencia. Fíjese en los dos códigos mostrados, el primero solamente con table y el segundo donde se especifica useNA
lapop$b1.r = as.numeric(lapop$b1)
lapop$b1.r[lapop$b1.r > 7] <- NA
table(lapop$b1.r)
##
## 1 2 3 4 5 6 7
## 18379 14105 25208 32566 28381 12811 10249
table(lapop$b1.r, useNA = "alw")
##
## 1 2 3 4 5 6 7 <NA>
## 18379 14105 25208 32566 28381 12811 10249 9642
## Tabla de Frecuencia
ni<-table(lapop$b1.r);ni
##
## 1 2 3 4 5 6 7
## 18379 14105 25208 32566 28381 12811 10249
fi<-prop.table(table(lapop$b1.r));fi
##
## 1 2 3 4 5 6 7
## 0.12970451 0.09954199 0.17789822 0.22982519 0.20029076 0.09040995 0.07232937
pi<-round(prop.table(table(lapop$b1.r))*100,2); pi
##
## 1 2 3 4 5 6 7
## 12.97 9.95 17.79 22.98 20.03 9.04 7.23
b1.tabla<-t(rbind(ni,fi,pi)); b1.tabla
## ni fi pi
## 1 18379 0.12970451 12.97
## 2 14105 0.09954199 9.95
## 3 25208 0.17789822 17.79
## 4 32566 0.22982519 22.98
## 5 28381 0.20029076 20.03
## 6 12811 0.09040995 9.04
## 7 10249 0.07232937 7.23
barplot(pi,
main="Distribución de la intensidad de Apoyo a los Tribunales de Justicia",
xlab="Intensidad",
ylab="Porcentaje")
La función par(mfrow=c(x,y)) permite dividir al espacio de visualización en x filas y y columnas.
par(mfrow=c(2,1)) # dividirá el espacio en 2 filas y 1 columna.
barplot(table(lapop$b1.r),
main="Distribución de la intensidad de Apoyo a los Tribunales de Justicia",
col=2,xlab="Intensidad",ylab="Conteo")
barplot(prop.table(table(lapop$b1.r))*100,
main="Distribución de la intensidad de Apoyo a los Tribunales de Justicia",
col=3,xlab="Intensidad",ylab="Proporcion")
Regresamos a la forma por defecto del espacio de visualización
par(mfrow=c(1,1))
pie(pi, main="Distribución de la intensidad de Apoyo a los Tribunales de Justicia")
lbls1 <- paste(names(table(lapop$b1.r)), "\n",
round(prop.table(table(lapop$b1.r))*100,2),"%", sep="")
pie(pi, labels = lbls1,
main="Distribución de la intensidad de Apoyo a los Tribunales de Justicia")
pie3D(table(lapop$b1.r),labels=lbls1,explode=0.1,
main="Distribución de la intensidad de Apoyo a los Tribunales de Justicia")
Para ello especificamos las variables:
q1: Sexo
1=hombre
2=mujer
b1: ¿Hasta que punto cree que los tribunales de justicia de [PAIS] garantizan un juicio justo?
También excluimos los valores perdidos (DK, NR y N/A):
lapop$b1.r <- as.numeric(lapop$b1)
lapop$b1.r[lapop$b1.r > 7] <- NA
lapop$q1.r <- as.numeric(lapop$q1)
lapop$q1.r[lapop$q1.r > 2] <- NA
tabla1=table(lapop$q1.r,lapop$b1.r)
tabla1
##
## 1 2 3 4 5 6 7
## 1 9065 7176 12513 16134 13963 6422 4868
## 2 9314 6929 12695 16432 14418 6389 5381
Presente la distribución condicional de la intensidad de aprobación a los tribunales de justicia por grupo de sexo. Construya una gráfica adecuada. ¿Es posible afirmar que existe asociación entre ambas variables?
Cuando se especifica dentro de de la función prop.table el término margin=1, lo que arrojará el código es la proporción por filas; es decir, cada fila suma 1 o 100. en caso sea margin=2 arrojará resumen por columnas; es decir, cada columna suma 1.
tabla2=round(prop.table(tabla1,margin=1),2)
tabla2
##
## 1 2 3 4 5 6 7
## 1 0.13 0.10 0.18 0.23 0.20 0.09 0.07
## 2 0.13 0.10 0.18 0.23 0.20 0.09 0.08
barplot(tabla2,col=2:3,beside = T,
xlab="intensidad de Apoyo a los Tribunales de Justicia",
ylab="Proporcion de Hombres y Mujeres",
main="Distribución de la intensidad de Apoyo a los Tribunales \n
de Justicia segun sexo")
Presente una tabla de distribución de frecuencias para el numero de hijos. Construya una grafica adecuada.
lapop$q12.r <- as.numeric(lapop$q12)
lapop$q12.r[lapop$q12.r > 25] <- NA
ni<-table(lapop$q12.r);ni
##
## 0 1 2 3 4 5 6 7 8 9 10 11 12
## 37303 22012 27422 21908 13620 7904 5343 3191 2139 1325 792 429 373
## 13 14 15 16 17 18 19 20 21 22 23 24 25
## 160 83 54 43 12 19 20 12 5 7 1 5 7
fi<-prop.table(table(lapop$q12.r));fi
##
## 0 1 2 3 4 5
## 2.587091e-01 1.526607e-01 1.901809e-01 1.519395e-01 9.445936e-02 5.481694e-02
## 6 7 8 9 10 11
## 3.705553e-02 2.213068e-02 1.483470e-02 9.189328e-03 5.492791e-03 2.975262e-03
## 12 13 14 15 16 17
## 2.586882e-03 1.109655e-03 5.756334e-04 3.745085e-04 2.982197e-04 8.322410e-05
## 18 19 20 21 22 23
## 1.317715e-04 1.387068e-04 8.322410e-05 3.467671e-05 4.854739e-05 6.935342e-06
## 24 25
## 3.467671e-05 4.854739e-05
pi<-round(prop.table(table(lapop$q12.r))*100,2); pi
##
## 0 1 2 3 4 5 6 7 8 9 10 11 12
## 25.87 15.27 19.02 15.19 9.45 5.48 3.71 2.21 1.48 0.92 0.55 0.30 0.26
## 13 14 15 16 17 18 19 20 21 22 23 24 25
## 0.11 0.06 0.04 0.03 0.01 0.01 0.01 0.01 0.00 0.00 0.00 0.00 0.00
hijos.tabla<-t(rbind(ni,fi,pi))
hijos.tabla
## ni fi pi
## 0 37303 2.587091e-01 25.87
## 1 22012 1.526607e-01 15.27
## 2 27422 1.901809e-01 19.02
## 3 21908 1.519395e-01 15.19
## 4 13620 9.445936e-02 9.45
## 5 7904 5.481694e-02 5.48
## 6 5343 3.705553e-02 3.71
## 7 3191 2.213068e-02 2.21
## 8 2139 1.483470e-02 1.48
## 9 1325 9.189328e-03 0.92
## 10 792 5.492791e-03 0.55
## 11 429 2.975262e-03 0.30
## 12 373 2.586882e-03 0.26
## 13 160 1.109655e-03 0.11
## 14 83 5.756334e-04 0.06
## 15 54 3.745085e-04 0.04
## 16 43 2.982197e-04 0.03
## 17 12 8.322410e-05 0.01
## 18 19 1.317715e-04 0.01
## 19 20 1.387068e-04 0.01
## 20 12 8.322410e-05 0.01
## 21 5 3.467671e-05 0.00
## 22 7 4.854739e-05 0.00
## 23 1 6.935342e-06 0.00
## 24 5 3.467671e-05 0.00
## 25 7 4.854739e-05 0.00
plot(pi, type="h", lwd=2,
xlab="Numero de hijos",
ylab="Porcentaje de entrevistados",
main="Distribución del numero de hijos de los entrevistados")
points(x =as.numeric(row.names(pi)),
y =as.numeric(pi),
pch=19,cex=1.5)
str(lapop)
## 'data.frame': 151341 obs. of 12 variables:
## $ b1 : 'haven_labelled' num NA 3 4 2 NA 6 4 4 2 2 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto cree usted que los tribunales de justicia del país garantizan u"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "1 Nada" "2" "3" "4" ...
## $ b2 : 'haven_labelled' num 7 5 5 6 7 7 5 5 2 3 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto tiene usted respeto por las instituciones políticas del país?"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "1 Nada" "2" "3" "4" ...
## $ b3 : 'haven_labelled' num 1 2 5 5 NA 6 3 3 2 2 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto cree usted que los derechos básicos del ciudadano están bien pr"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "Nada protegido" "2" "3" "4" ...
## $ b4 : 'haven_labelled' num 7 2 5 7 7 5 5 5 3 4 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto se siente usted orgulloso de vivir bajo el sistema político del"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "1 Nada" "2" "3" "4" ...
## $ b6 : 'haven_labelled' num 7 NA 5 2 7 4 4 7 3 3 ...
## ..- attr(*, "label")= chr "¿Hasta qué punto piensa usted que se debe apoyar al sistema político del país?"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "1 Nada" "2" "3" "4" ...
## $ q1 : 'haven_labelled' num 1 1 1 2 1 2 2 1 2 1 ...
## ..- attr(*, "label")= chr "Género"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 888888 988888 999999
## .. ..- attr(*, "names")= chr "Hombre" "Mujer" "DK" "NR" ...
## $ pais : 'haven_labelled' num 10 10 10 10 10 10 10 10 10 10 ...
## ..- attr(*, "label")= chr "País"
## ..- attr(*, "format.spss")= chr "F2.0"
## ..- attr(*, "display_width")= int 6
## ..- attr(*, "labels")= Named num 1 2 3 4 5 6 7 8 9 10 ...
## .. ..- attr(*, "names")= chr "México" "Guatemala" "El Salvador" "Honduras" ...
## $ tamano: 'haven_labelled' num NA NA NA NA NA NA NA NA NA NA ...
## ..- attr(*, "label")= chr "Tamaño del lugar"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "Capital nacional (área metropolitana)" "Ciudad grande" "Ciudad mediana" "Ciudad pequeña" ...
## $ q12 : 'haven_labelled' num 2 4 2 3 0 1 3 2 4 3 ...
## ..- attr(*, "label")= chr "¿Tiene hijos(as)? ¿Cuántos?"
## ..- attr(*, "format.spss")= chr "F6.0"
## ..- attr(*, "labels")= Named num 0 888888 988888 999999
## .. ..- attr(*, "names")= chr "Ninguno" "DK" "NR" "N/A"
## $ b1.r : num NA 3 4 2 NA 6 4 4 2 2 ...
## $ q1.r : num 1 1 1 2 1 2 2 1 2 1 ...
## $ q12.r : num 2 4 2 3 0 1 3 2 4 3 ...
lapop$b1.r <- as.numeric(lapop$b1)
lapop$b2.r <- as.numeric(lapop$b2)
lapop$b3.r <- as.numeric(lapop$b3)
lapop$b4.r <- as.numeric(lapop$b4)
lapop$b6.r <- as.numeric(lapop$b6)
lapop$b1.r[lapop$b1.r > 7] <- NA
lapop$b2.r[lapop$b2.r > 7] <- NA
lapop$b3.r[lapop$b3.r > 7] <- NA
lapop$b4.r[lapop$b4.r > 7] <- NA
lapop$b6.r[lapop$b6.r > 7] <- NA
lapop$asp <- (((lapop$b1.r+lapop$b2.r+lapop$b3.r+lapop$b4.r+lapop$b6.r)-5)/30)*100
table(lapop$b.r)
## < table of extent 0 >
hist(lapop$asp)
Para ver cuantos valores perdidos (missing values) tiene el índice:
t1 <- table(is.na(lapop$asp))
t1
##
## FALSE TRUE
## 133707 17634
prop.table(t1)*100
##
## FALSE TRUE
## 88.34817 11.65183
Seleccionamos solo las columnas “asp”, “pais”, “tamano”, eliminamos datos perdidos con na.omit. Esta última función, cuando encuentra un valor NA, elimina toda la fila.
data<-lapop[,c("asp", "pais", "tamano")]
n_row1<- nrow(data)
print(paste("La base de datos inicial tiene ",n_row1, " filas", sep=""))
## [1] "La base de datos inicial tiene 151341 filas"
data=na.omit(data) #Para eliminar valores perdidos
n_row2<- nrow(data)
print(paste("La base de datos final tiene ",n_row2, " filas", sep=""))
## [1] "La base de datos final tiene 121056 filas"
str(data)
## 'data.frame': 121056 obs. of 3 variables:
## $ asp : num 16.7 86.7 93.3 23.3 46.7 ...
## $ pais : 'haven_labelled' num 13 5 16 24 21 12 22 4 23 3 ...
## ..- attr(*, "label")= chr "País"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 6 7 8 9 10 ...
## .. ..- attr(*, "names")= chr "México" "Guatemala" "El Salvador" "Honduras" ...
## $ tamano: 'haven_labelled' num 3 3 2 5 1 2 5 5 1 1 ...
## ..- attr(*, "label")= chr "Tamaño del lugar"
## ..- attr(*, "labels")= Named num 1 2 3 4 5 ...
## .. ..- attr(*, "names")= chr "Capital nacional (área metropolitana)" "Ciudad grande" "Ciudad mediana" "Ciudad pequeña" ...
## - attr(*, "na.action")= 'omit' Named int 1 2 3 4 5 6 7 8 9 10 ...
## ..- attr(*, "names")= chr "1" "2" "3" "4" ...
A continuación se generará un vector como variable tipo factor, misma que contendrá intervalos gracias a la utilidad de la función cut. Los breaks se harán teniendo como referencia a la variable asp. El intervalo está cerrado en el intervalo derecho. El data frame xout reune la frecuencia de los intervalos de factorx. Así mismo, le cambiaremos el nombre a las columnas llamandose “asp” y “ni”
factorx <- factor(cut(lapop$asp, breaks=nclass.Sturges(lapop$asp),right=TRUE))
xout <- as.data.frame(table(factorx))
colnames(xout)<-c("asp","ni")
Con la función transform lo que se ha generado es agregale nuevas variables al dataframe creado xout. La ventaja de esta función es que ajusta los resultados al número de observaciones que tiene la base de datos de referencia. Fíjese que la dimensión de xout es de 19 observaciones y 2 variables, pero ni tiene 25 observaciones. Lo que hará transform es mantener todo en 19 observaciones.
xout2 <- transform(xout,
fi=prop.table(ni), #proporciones
pi=prop.table(ni)*100, #porcentaje
Ni = cumsum(ni), #frecuencia
Fi = cumsum(prop.table(ni)), #proporcion acumulada
Pi = cumsum(prop.table(ni))*100 #porcentaje acumulado
)
xout
## asp ni
## 1 (-0.1,5.26] 3686
## 2 (5.26,10.5] 2882
## 3 (10.5,15.8] 1993
## 4 (15.8,21.1] 5804
## 5 (21.1,26.3] 2977
## 6 (26.3,31.6] 7848
## 7 (31.6,36.8] 10483
## 8 (36.8,42.1] 6156
## 9 (42.1,47.4] 13423
## 10 (47.4,52.6] 8055
## 11 (52.6,57.9] 15037
## 12 (57.9,63.2] 7865
## 13 (63.2,68.4] 14453
## 14 (68.4,73.7] 11846
## 15 (73.7,78.9] 4705
## 16 (78.9,84.2] 7831
## 17 (84.2,89.5] 2608
## 18 (89.5,94.7] 3571
## 19 (94.7,100] 2484
A continuación se verá tablas y gráficos de frecuencia segun distintas Reglas. El código table.freq nos dará una distribución de frecuencias las cuales son usadas principalmente para reunir y resumir una gran cantidad de datos. La división de esos intervalos dependerá de la regla que useamos. Se muestran 3 reglas. Para mayor información de las reglas revisar http://www2.ulpgc.es/hege/almacen/download/26/26702/tema2.pdf
(table.freq(hist(lapop$asp,breaks = "Sturges"))) #Regla Sturges
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 5 2.5 3686 2.8 3686 2.8
## 2 5 10 7.5 2882 2.2 6568 4.9
## 3 10 15 12.5 1993 1.5 8561 6.4
## 4 15 20 17.5 5804 4.3 14365 10.7
## 5 20 25 22.5 2977 2.2 17342 13.0
## 6 25 30 27.5 7848 5.9 25190 18.8
## 7 30 35 32.5 5219 3.9 30409 22.7
## 8 35 40 37.5 11420 8.5 41829 31.3
## 9 40 45 42.5 6463 4.8 48292 36.1
## 10 45 50 47.5 15015 11.2 63307 47.3
## 11 50 55 52.5 7609 5.7 70916 53.0
## 12 55 60 57.5 15293 11.4 86209 64.5
## 13 60 65 62.5 7138 5.3 93347 69.8
## 14 65 70 67.5 13530 10.1 106877 79.9
## 15 70 75 72.5 5631 4.2 112508 84.1
## 16 75 80 77.5 9208 6.9 121716 91.0
## 17 80 85 82.5 3328 2.5 125044 93.5
## 18 85 90 87.5 4642 3.5 129686 97.0
## 19 90 95 92.5 1537 1.1 131223 98.1
## 20 95 100 97.5 2484 1.9 133707 100.0
(table.freq(hist(lapop$asp,breaks = "Scott"))) #Regla de Scott
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 2 1 2821 2.1 2821 2.1
## 2 2 4 3 865 0.6 3686 2.8
## 3 4 6 5 0 0.0 3686 2.8
## 4 6 8 7 1263 0.9 4949 3.7
## 5 8 10 9 1619 1.2 6568 4.9
## 6 10 12 11 0 0.0 6568 4.9
## 7 12 14 13 1993 1.5 8561 6.4
## 8 14 16 15 0 0.0 8561 6.4
## 9 16 18 17 2406 1.8 10967 8.2
## 10 18 20 19 3398 2.5 14365 10.7
## 11 20 22 21 0 0.0 14365 10.7
## 12 22 24 23 2977 2.2 17342 13.0
## 13 24 26 25 0 0.0 17342 13.0
## 14 26 28 27 3708 2.8 21050 15.7
## 15 28 30 29 4140 3.1 25190 18.8
## 16 30 32 31 0 0.0 25190 18.8
## 17 32 34 33 5219 3.9 30409 22.7
## 18 34 36 35 0 0.0 30409 22.7
## 19 36 38 37 5264 3.9 35673 26.7
## 20 38 40 39 6156 4.6 41829 31.3
## 21 40 42 41 0 0.0 41829 31.3
## 22 42 44 43 6463 4.8 48292 36.1
## 23 44 46 45 0 0.0 48292 36.1
## 24 46 48 47 6960 5.2 55252 41.3
## 25 48 50 49 8055 6.0 63307 47.3
## 26 50 52 51 0 0.0 63307 47.3
## 27 52 54 53 7609 5.7 70916 53.0
## 28 54 56 55 0 0.0 70916 53.0
## 29 56 58 57 7428 5.6 78344 58.6
## 30 58 60 59 7865 5.9 86209 64.5
## 31 60 62 61 0 0.0 86209 64.5
## 32 62 64 63 7138 5.3 93347 69.8
## 33 64 66 65 0 0.0 93347 69.8
## 34 66 68 67 7315 5.5 100662 75.3
## 35 68 70 69 6215 4.6 106877 79.9
## 36 70 72 71 0 0.0 106877 79.9
## 37 72 74 73 5631 4.2 112508 84.1
## 38 74 76 75 0 0.0 112508 84.1
## 39 76 78 77 4705 3.5 117213 87.7
## 40 78 80 79 4503 3.4 121716 91.0
## 41 80 82 81 0 0.0 121716 91.0
## 42 82 84 83 3328 2.5 125044 93.5
## 43 84 86 85 0 0.0 125044 93.5
## 44 86 88 87 2608 2.0 127652 95.5
## 45 88 90 89 2034 1.5 129686 97.0
## 46 90 92 91 0 0.0 129686 97.0
## 47 92 94 93 1537 1.1 131223 98.1
## 48 94 96 95 0 0.0 131223 98.1
## 49 96 98 97 842 0.6 132065 98.8
## 50 98 100 99 1642 1.2 133707 100.0
(table.freq(hist(lapop$asp,breaks = "FD"))) #Regla de Friedman-Diaconis
## Lower Upper Main Frequency Percentage CF CPF
## 1 0 1 0.5 2821 2.1 2821 2.1
## 2 1 2 1.5 0 0.0 2821 2.1
## 3 2 3 2.5 0 0.0 2821 2.1
## 4 3 4 3.5 865 0.6 3686 2.8
## 5 4 5 4.5 0 0.0 3686 2.8
## 6 5 6 5.5 0 0.0 3686 2.8
## 7 6 7 6.5 1263 0.9 4949 3.7
## 8 7 8 7.5 0 0.0 4949 3.7
## 9 8 9 8.5 0 0.0 4949 3.7
## 10 9 10 9.5 1619 1.2 6568 4.9
## 11 10 11 10.5 0 0.0 6568 4.9
## 12 11 12 11.5 0 0.0 6568 4.9
## 13 12 13 12.5 0 0.0 6568 4.9
## 14 13 14 13.5 1993 1.5 8561 6.4
## 15 14 15 14.5 0 0.0 8561 6.4
## 16 15 16 15.5 0 0.0 8561 6.4
## 17 16 17 16.5 2406 1.8 10967 8.2
## 18 17 18 17.5 0 0.0 10967 8.2
## 19 18 19 18.5 0 0.0 10967 8.2
## 20 19 20 19.5 3398 2.5 14365 10.7
## 21 20 21 20.5 0 0.0 14365 10.7
## 22 21 22 21.5 0 0.0 14365 10.7
## 23 22 23 22.5 0 0.0 14365 10.7
## 24 23 24 23.5 2977 2.2 17342 13.0
## 25 24 25 24.5 0 0.0 17342 13.0
## 26 25 26 25.5 0 0.0 17342 13.0
## 27 26 27 26.5 3708 2.8 21050 15.7
## 28 27 28 27.5 0 0.0 21050 15.7
## 29 28 29 28.5 0 0.0 21050 15.7
## 30 29 30 29.5 4140 3.1 25190 18.8
## 31 30 31 30.5 0 0.0 25190 18.8
## 32 31 32 31.5 0 0.0 25190 18.8
## 33 32 33 32.5 0 0.0 25190 18.8
## 34 33 34 33.5 5219 3.9 30409 22.7
## 35 34 35 34.5 0 0.0 30409 22.7
## 36 35 36 35.5 0 0.0 30409 22.7
## 37 36 37 36.5 5264 3.9 35673 26.7
## 38 37 38 37.5 0 0.0 35673 26.7
## 39 38 39 38.5 0 0.0 35673 26.7
## 40 39 40 39.5 6156 4.6 41829 31.3
## 41 40 41 40.5 0 0.0 41829 31.3
## 42 41 42 41.5 0 0.0 41829 31.3
## 43 42 43 42.5 0 0.0 41829 31.3
## 44 43 44 43.5 6463 4.8 48292 36.1
## 45 44 45 44.5 0 0.0 48292 36.1
## 46 45 46 45.5 0 0.0 48292 36.1
## 47 46 47 46.5 6960 5.2 55252 41.3
## 48 47 48 47.5 0 0.0 55252 41.3
## 49 48 49 48.5 0 0.0 55252 41.3
## 50 49 50 49.5 8055 6.0 63307 47.3
## 51 50 51 50.5 0 0.0 63307 47.3
## 52 51 52 51.5 0 0.0 63307 47.3
## 53 52 53 52.5 0 0.0 63307 47.3
## 54 53 54 53.5 7609 5.7 70916 53.0
## 55 54 55 54.5 0 0.0 70916 53.0
## 56 55 56 55.5 0 0.0 70916 53.0
## 57 56 57 56.5 7428 5.6 78344 58.6
## 58 57 58 57.5 0 0.0 78344 58.6
## 59 58 59 58.5 0 0.0 78344 58.6
## 60 59 60 59.5 7865 5.9 86209 64.5
## 61 60 61 60.5 0 0.0 86209 64.5
## 62 61 62 61.5 0 0.0 86209 64.5
## 63 62 63 62.5 0 0.0 86209 64.5
## 64 63 64 63.5 7138 5.3 93347 69.8
## 65 64 65 64.5 0 0.0 93347 69.8
## 66 65 66 65.5 0 0.0 93347 69.8
## 67 66 67 66.5 7315 5.5 100662 75.3
## 68 67 68 67.5 0 0.0 100662 75.3
## 69 68 69 68.5 0 0.0 100662 75.3
## 70 69 70 69.5 6215 4.6 106877 79.9
## 71 70 71 70.5 0 0.0 106877 79.9
## 72 71 72 71.5 0 0.0 106877 79.9
## 73 72 73 72.5 0 0.0 106877 79.9
## 74 73 74 73.5 5631 4.2 112508 84.1
## 75 74 75 74.5 0 0.0 112508 84.1
## 76 75 76 75.5 0 0.0 112508 84.1
## 77 76 77 76.5 4705 3.5 117213 87.7
## 78 77 78 77.5 0 0.0 117213 87.7
## 79 78 79 78.5 0 0.0 117213 87.7
## 80 79 80 79.5 4503 3.4 121716 91.0
## 81 80 81 80.5 0 0.0 121716 91.0
## 82 81 82 81.5 0 0.0 121716 91.0
## 83 82 83 82.5 0 0.0 121716 91.0
## 84 83 84 83.5 3328 2.5 125044 93.5
## 85 84 85 84.5 0 0.0 125044 93.5
## 86 85 86 85.5 0 0.0 125044 93.5
## 87 86 87 86.5 2608 2.0 127652 95.5
## 88 87 88 87.5 0 0.0 127652 95.5
## 89 88 89 88.5 0 0.0 127652 95.5
## 90 89 90 89.5 2034 1.5 129686 97.0
## 91 90 91 90.5 0 0.0 129686 97.0
## 92 91 92 91.5 0 0.0 129686 97.0
## 93 92 93 92.5 0 0.0 129686 97.0
## 94 93 94 93.5 1537 1.1 131223 98.1
## 95 94 95 94.5 0 0.0 131223 98.1
## 96 95 96 95.5 0 0.0 131223 98.1
## 97 96 97 96.5 842 0.6 132065 98.8
## 98 97 98 97.5 0 0.0 132065 98.8
## 99 98 99 98.5 0 0.0 132065 98.8
## 100 99 100 99.5 1642 1.2 133707 100.0
(table.freq(graph.freq(lapop$asp,plot=FALSE))) #Regla Sturges (Agricolae)
## Lower Upper Main Frequency Percentage CF CPF
## 1 0.0 5.6 2.8 3686 2.8 3686 2.8
## 2 5.6 11.2 8.4 2882 2.2 6568 4.9
## 3 11.2 16.8 14.0 4399 3.3 10967 8.2
## 4 16.8 22.4 19.6 3398 2.5 14365 10.7
## 5 22.4 28.0 25.2 6685 5.0 21050 15.7
## 6 28.0 33.6 30.8 9359 7.0 30409 22.7
## 7 33.6 39.2 36.4 5264 3.9 35673 26.7
## 8 39.2 44.8 42.0 12619 9.4 48292 36.1
## 9 44.8 50.4 47.6 15015 11.2 63307 47.3
## 10 50.4 56.0 53.2 7609 5.7 70916 53.0
## 11 56.0 61.6 58.8 15293 11.4 86209 64.5
## 12 61.6 67.2 64.4 14453 10.8 100662 75.3
## 13 67.2 72.8 70.0 6215 4.6 106877 79.9
## 14 72.8 78.4 75.6 10336 7.7 117213 87.7
## 15 78.4 84.0 81.2 7831 5.9 125044 93.5
## 16 84.0 89.6 86.8 2608 2.0 127652 95.5
## 17 89.6 95.2 92.4 3571 2.7 131223 98.1
## 18 95.2 100.8 98.0 2484 1.9 133707 100.0
h1<-hist(lapop$asp,border=FALSE)
polygon.freq(h1,frequency=1,col="red")
h1<-hist(lapop$asp,breaks = "Sturges",
xlab="asp",
ylab="Numero de entrevistados")
polygon.freq(h1,frequency=1,col="red")
par(mfrow=c(1,3))
hist(data$asp[data$pais=="11"],ylim=c(0,1200))
hist(data$asp[data$pais=="10"],ylim=c(0,1200))
hist(data$asp[data$pais=="16"],ylim=c(0,1200))
par(mfrow=c(1,1))
plot(density(data$asp))
Sería de calcular entonces el área bajo la curva de los valores oscilantes entre [70; 100].
hist(data$asp,prob=TRUE)
lines(density.default(data$asp))
El boxplot o diagrama de caja y bigote muestra gráficamente una serie de datos a través de su distribución por cuantiles (Q1, Q2 y Q3). La línea más gruesa representa la mediana (Q2), la parte superior de la caja es el tercer cuantil (Q3), la parte inferir de la caja representa el primer cuantil (Q1). Asimismo, el punto más bajo, el de los bigotes, es el punto de datos más bajo excluyendo valores atípicos y el punto más alto de los bigotes es el punto de datos más alto excluyendo valores atípicos.
boxplot(lapop$asp)
Para el caso del gráfico mostrado, los datos se concentran en el intervalo [40, 65], con una mediana de 55. El valor mínimo es 0 y el máximo 100. No se tienen valores atípicos.
summary(data$asp)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 36.67 53.33 52.02 66.67 100.00
describe(data$asp)
## data$asp
## n missing distinct Info Mean Gmd .05 .10
## 121056 0 31 0.998 52.02 25.64 13.33 20.00
## .25 .50 .75 .90 .95
## 36.67 53.33 66.67 80.00 86.67
##
## lowest : 0.000000 3.333333 6.666667 10.000000 13.333333
## highest: 86.666667 90.000000 93.333333 96.666667 100.000000
basicStats(data$asp)
## X..data.asp
## nobs 1.210560e+05
## NAs 0.000000e+00
## Minimum 0.000000e+00
## Maximum 1.000000e+02
## 1. Quartile 3.666667e+01
## 3. Quartile 6.666667e+01
## Mean 5.201807e+01
## Median 5.333333e+01
## Sum 6.297100e+06
## SE Mean 6.486700e-02
## LCL Mean 5.189094e+01
## UCL Mean 5.214521e+01
## Variance 5.093737e+02
## Stdev 2.256931e+01
## Skewness -2.174030e-01
## Kurtosis -4.348740e-01
Eliminamos las etiquetas vacías
data$tamano <- factor(data$tamano)
boxplot(data$asp ~ data$tamano,
xlab="tamano de la ciudad",ylab="asp",
main="Comparacion del asp por tamano de la ciudad")