Profesor: Gonzalo Perez de la Cruz
Ayudante: Alexis Adrian Carrillo Medina
Ayudante: Dioney Alonso Rosas Sanchez
Ayudante : Gerardo Cruz García
Ayudante : Juan Andrés Cervantes Sandoval
Esta clase esta enfocada a la graficacion de datos en R
apartir de bases de una base de datos real graficaremos
y obtendremos informacion de las graficas.
Utilizaremos 2 bases de datos: datos.csv y datos2.csv
Las pueden descargar en la siguiente liga: Bases de datos
R cuenta con 4 sistemas de graficacion.
base graphics, grid graphics, lattice graphics, y ggplot2.
Para este curso utilizaremos base graphics, no sin antes exhortarlos
a indagar sobre los graficos ggplot2 que son los que mas se utilizan en la practica.
Recuerden que antes de iniciar un nuevo script de R es recomendable borrar todos los objetos del ambiente para no causar errores. Para ello podemos ejecutar el siguiente codigo
rm(list = ls(all.names = TRUE))
gc()
Para esta clase utilizaremos las siguientes librerias
library(readr) #para utilizar la funci?n read_csv
library(corrplot) #para el grafico de correlaciones
library(fdth) #para el calculo de distribuci?n de frecuencias
library(car) #para utilizar qqPlot
corrplot 0.84 loaded
Attaching package: ‘fdth’
The following objects are masked from ‘package:stats’:
sd, var
Loading required package: carData
Para poder cargar nuestra base de datos necesitamos cambiar el
directorio de trabajo a donde se encuentre nuesta base de datos.
En este ejemplo yo puse mi directorio, pero es necesario que ustedes pongan el directorio donde guardaron las bases de datos
setwd("/home/a-carrillo/Documents/Escuela/Ayudantias/Inferencia estadistica/R/Ayudantia 1")
Carguemos nuestro base de datos
datos = read_csv("datos.csv") # guardamos en una variable "datos"
Parsed with column specification:
cols(
ENT = �[32mcol_double()�[39m,
Entidad = �[31mcol_character()�[39m,
MUN = �[32mcol_double()�[39m,
Municipio = �[31mcol_character()�[39m,
Alf = �[32mcol_double()�[39m,
Asi = �[32mcol_double()�[39m,
EBC = �[32mcol_double()�[39m,
Der = �[32mcol_double()�[39m,
Pis = �[32mcol_double()�[39m,
San = �[32mcol_double()�[39m,
Agu = �[32mcol_double()�[39m,
Dre = �[32mcol_double()�[39m,
Ele = �[32mcol_double()�[39m,
Lav = �[32mcol_double()�[39m,
Ref = �[32mcol_double()�[39m,
Ing = �[32mcol_double()�[39m
)
Para comprender la estructura de la base de datos
str(datos)
tibble [245 × 16] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ ENT : num [1:245] 1 1 1 1 2 2 2 2 3 3 ...
$ Entidad : chr [1:245] "Aguascalientes" "Aguascalientes" "Aguascalientes" "Aguascalientes" ...
$ MUN : num [1:245] 1 3 5 7 1 2 3 4 1 2 ...
$ Municipio: chr [1:245] "Aguascalientes" "Calvillo" "Jesús María" "Rincón de Romos" ...
$ Alf : num [1:245] 0.979 0.952 0.968 0.965 0.964 ...
$ Asi : num [1:245] 0.965 0.956 0.959 0.977 0.966 ...
$ EBC : num [1:245] 0.736 0.507 0.66 0.676 0.66 ...
$ Der : num [1:245] 0.854 0.903 0.859 0.892 0.862 ...
$ Pis : num [1:245] 0.995 0.989 0.991 0.991 0.986 ...
$ San : num [1:245] 0.991 0.987 0.987 0.967 0.853 ...
$ Agu : num [1:245] 0.993 0.99 0.991 0.984 0.927 ...
$ Dre : num [1:245] 0.995 0.991 0.993 0.974 0.912 ...
$ Ele : num [1:245] 0.998 0.994 0.995 0.992 0.986 ...
$ Lav : num [1:245] 0.863 0.845 0.846 0.782 0.796 ...
$ Ref : num [1:245] 0.947 0.927 0.919 0.886 0.913 ...
$ Ing : num [1:245] 15862 12185 23821 8753 14037 ...
- attr(*, "spec")=
.. cols(
.. ENT = �[32mcol_double()�[39m,
.. Entidad = �[31mcol_character()�[39m,
.. MUN = �[32mcol_double()�[39m,
.. Municipio = �[31mcol_character()�[39m,
.. Alf = �[32mcol_double()�[39m,
.. Asi = �[32mcol_double()�[39m,
.. EBC = �[32mcol_double()�[39m,
.. Der = �[32mcol_double()�[39m,
.. Pis = �[32mcol_double()�[39m,
.. San = �[32mcol_double()�[39m,
.. Agu = �[32mcol_double()�[39m,
.. Dre = �[32mcol_double()�[39m,
.. Ele = �[32mcol_double()�[39m,
.. Lav = �[32mcol_double()�[39m,
.. Ref = �[32mcol_double()�[39m,
.. Ing = �[32mcol_double()�[39m
.. )
Ver el encabezado de nuestra base de datos
head(datos)
ENT | Entidad | MUN | Municipio | Alf | Asi | EBC | Der | Pis | San | Agu | Dre | Ele | Lav | Ref | Ing |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <chr> | <dbl> | <chr> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> |
1 | Aguascalientes | 1 | Aguascalientes | 0.9794300 | 0.9652139 | 0.7362548 | 0.8540276 | 0.9945157 | 0.9905164 | 0.9933649 | 0.9951757 | 0.9978071 | 0.8627699 | 0.9468805 | 15862.251 |
1 | Aguascalientes | 3 | Calvillo | 0.9521950 | 0.9560942 | 0.5067098 | 0.9033228 | 0.9894113 | 0.9873641 | 0.9904701 | 0.9913172 | 0.9942821 | 0.8453339 | 0.9272201 | 12184.698 |
1 | Aguascalientes | 5 | Jesús María | 0.9675548 | 0.9587029 | 0.6599699 | 0.8594334 | 0.9907879 | 0.9869091 | 0.9905455 | 0.9927273 | 0.9950130 | 0.8459567 | 0.9191688 | 23820.588 |
1 | Aguascalientes | 7 | Rincón de Romos | 0.9649133 | 0.9773307 | 0.6759579 | 0.8917998 | 0.9907506 | 0.9674224 | 0.9842023 | 0.9739707 | 0.9919784 | 0.7824343 | 0.8855693 | 8753.307 |
2 | Baja California | 1 | Ensenada | 0.9643934 | 0.9662187 | 0.6596109 | 0.8619705 | 0.9855645 | 0.8533928 | 0.9266327 | 0.9117085 | 0.9859258 | 0.7959839 | 0.9129551 | 14037.231 |
2 | Baja California | 2 | Mexicali | 0.9845785 | 0.9695408 | 0.7295352 | 0.8452478 | 0.9918143 | 0.9510441 | 0.9870668 | 0.9667437 | 0.9922208 | 0.8641671 | 0.9659203 | 17977.196 |
Para poder entender la base de datos, necesitamos una descripcion
Hay que entender como esta conformada la base de datos:
Municipios del pais y conjuntos de variables sociodemograficas relevantes.
ENT: Clave de la entidad
Entidad: nombre de la entidad
MUN: nombre del municipio
Municipio: porcentaje de viviendas particulares habitadas con piso de tierra.
Alf: porcentaje de poblaci?n de 15 o m?s a?os que sabe leer y escribir.
Asi: porcentaje de poblaci?n de 6 a 14 a?os que asiste a la escuela.
EBC: porcentaje de poblaci?n de 15 o m?s a?os con educaci?n b?sica completa.
Der: porcentaje de poblaci?n con derechohabiencia a servicios de salud.
Pis: porcentaje de viviendas particulares habitadas con piso diferente de tierra.
San: porcentaje de viviendas particulares habitadas que disponen de excusado o sanitario.
Agu: porcentaje de viviendas particulares habitadas que no disponen de agua potable.
Dre: porcentaje de viviendas particulares habitadas que no disponen de drenaje.
Ele: porcentaje de viviendas particulares habitadas que no disponen de electricidad.
Lav: porcentaje de viviendas particulares habitadas que disponen de lavadora.
Ref: porcentaje de viviendas particulares habitadas que disponen de refrigerador.
Ing: Estimacion de la media del ingreso corriente mensual en los hogares.
Lo primero que se nos podria ocurrir es graficar los datos
La funcion plot() es la funcion generica para realizar graficos en
primera instancia, R desplegara el grafico que considere mas adecuado
para el tipo de variable que se esta tomando
plot(datos[,5:16])
En este caso realiza un grafico de dispersion de todas las variables 2 a 2.
Esta grafica no nos dice mucho e incluso es dificil de leer
Talvez es mas conveniente si encontramos relaciones entre las variables
Esto lo haremos con la ayuda de la funcion corrplot()
cor_datos = cor(datos[,5:16])
corrplot(cor_datos,method = "ellipse")
La grafica es mas legible, no obstante aun no es algo digno de presentar
Sera mas sencillo si nos enfocamos en una variable en particular.
Seleccionemos la variable Lav, parece comportarse bien
veamos un grafico de los datos de esta variable
plot(datos$Lav)
De nuevo, esto no nos dice nada...
Para poder conocer mejor este variable necesitaremos presentar mas graficos
Para cada valor, categoria o clase de la variable, se asocia una barra cuya altura es la frecuencia con la que se observa la categoria
Histograma de frecuencias absolutas para la variable Lav
hist(datos$Lav, main="Histograma de la variable Lav",xlab = "Lav",
ylab = "Frecuencia",col="deepskyblue3")
Histograma de frecuencias relativas para la variable Lav
hist(datos$Lav, main="Histograma de la variable Lav",xlab = "Lav",
ylab = "Frecuencia",col="deepskyblue3",freq = F)
Podemos ver la densidad teorica de nuestra variable de interes con la funcion
lines(), la cual agrega curvas a la ultima grafica hecha.
En este caso agregaremos la densidad y esto se hace con la funcion
density()
hist(datos$Lav, main="Histograma de la variable Lav",xlab = "Lav",
ylab = "Frecuencia",col="deepskyblue3",freq = F)
lines(density(datos$Lav),lwd=2)
O bien verla sin el histograma
plot(density(datos$Lav))
Tambien podemos calcular la funcion de distribucion empirica
Aqui la calculamos de manera artesanal
plot(cumsum(density(datos$Lav)$x))
Para hacer que se vea como una linea agregamos el parametro type = "l"
plot(cumsum(density(datos$Lav)$x),type="l")
Una alternativa mejor es utilizar las funciones de la libreria fdth
dist <- fdt(datos$Lav,breaks="Sturges")
dist #nos brinda una tabla con los calculos de la distribuci?n de frecuencias.
- $table
A data.frame: 9 × 6 Class limits f rf rf(%) cf cf(%) <fct> <int> <dbl> <dbl> <dbl> <dbl> [0.1198,0.2119) 2 0.008163265 0.8163265 2 0.8163265 [0.2119,0.3039) 5 0.020408163 2.0408163 7 2.8571429 [0.3039,0.396) 3 0.012244898 1.2244898 10 4.0816327 [0.396,0.4881) 11 0.044897959 4.4897959 21 8.5714286 [0.4881,0.5801) 20 0.081632653 8.1632653 41 16.7346939 [0.5801,0.6722) 38 0.155102041 15.5102041 79 32.2448980 [0.6722,0.7643) 56 0.228571429 22.8571429 135 55.1020408 [0.7643,0.8563) 83 0.338775510 33.8775510 218 88.9795918 [0.8563,0.9484) 27 0.110204082 11.0204082 245 100.0000000 - $breaks
- <style>
.dl-inline {width: auto; margin:0; padding: 0}
.dl-inline>dt, .dl-inline>dd {float: none; width: auto; display: inline-block}
.dl-inline>dt::after {content: ":\0020"; padding-right: .5ex}
.dl-inline>dt:not(:first-of-type) {padding-left: .5ex}
</style>
- start
- 0.11980434807
- end
- 0.948405049
- h
- 0.0920667445477778
- right
- 0
Donde:
f = frecuencia absoluta
rf = frecuencia relativa
rf(%) = frecuencia relativa porcentual
cf = frecuencia acumulada
cf(%) = frecuencia acumulada porcentual
Histograma de frecuencias acumulada
plot(dist, type="cfh")
Poligono de frecuencias acumulado
plot(dist, type="cfp")
Tambien conocido como diagrama de caja y bigote.
Es un metodo estandarizado para representar graficamente una serie de datos
numericos a traves de sus cuartiles. A su vez nos sirve a encontrar datos atipicos
boxplot(datos$Lav)
Podemos verificar la construccion del boxplot, viendo un resumen de nuestra variable
summary(datos$Lav)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.1210 0.6319 0.7489 0.7101 0.8192 0.9390
Podemos hacer los boxplots para todas las variables
boxplot(datos[,c(5:15)])
Tambien conocidos como graficos cuantil-cuantil
Se utiliza para el diagnóstico de diferencias entre la distribución de probabilidad de una población de la que se ha extraído una muestra aleatoria y una distribución usada para la comparación.
Veamos un grafico qqPlot
qqplot(datos$Lav, datos$Ref)
abline(0,1) #Para trazar la identidad y ver si sus distribuciones son iguales
Uno de los principales usos del qqplot es ver si la distribuci?n de nuestra variable, o bien nuetra base de datos es normal, graficando los cuantiles teoricos de una dist normal, contra los cuantiles de la dist teorica de nuestra variable
qqnorm(datos$Lav) #Para compararlo con una normal
qqline(datos$Lav) #Para trazar la recta de comparacion
claramente observamos que esto no sigue una dist normal
Otra manera m?s pr?ctica es con la funcion qqPlot() de la library car
qqPlot(datos$Lav)
- 145
- 72
Cargamos nuestra base de datos.
datos2 = read_csv("datos2.csv") # guardamos en una variable "datos2"
Parsed with column specification:
cols(
sexo = �[32mcol_double()�[39m,
nivelest = �[32mcol_double()�[39m,
tabaco = �[32mcol_double()�[39m,
estcivil = �[32mcol_double()�[39m,
laboro = �[32mcol_double()�[39m,
hijos = �[32mcol_double()�[39m,
edad = �[32mcol_double()�[39m,
peso = �[32mcol_double()�[39m,
talla = �[32mcol_double()�[39m,
imc = �[32mcol_double()�[39m,
sedentar = �[32mcol_double()�[39m,
diabm = �[32mcol_double()�[39m,
hipercol = �[32mcol_double()�[39m,
pas = �[32mcol_double()�[39m,
pad = �[32mcol_double()�[39m,
fc = �[32mcol_double()�[39m
)
Para comprender la estructura de la base de datos
str(datos2)
tibble [536 × 16] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ sexo : num [1:536] 2 1 1 2 1 2 2 2 1 1 ...
$ nivelest: num [1:536] 1 4 2 1 5 1 3 1 1 3 ...
$ tabaco : num [1:536] 2 0 NA 0 2 2 3 0 2 0 ...
$ estcivil: num [1:536] 3 2 4 2 2 4 3 2 2 2 ...
$ laboro : num [1:536] 4 3 3 4 1 3 4 4 3 3 ...
$ hijos : num [1:536] 2 1 0 2 3 1 2 3 2 0 ...
$ edad : num [1:536] 67 56 81 74 53 79 62 69 68 65 ...
$ peso : num [1:536] 72 150 71 85 102 98 76 65.5 80 71.4 ...
$ talla : num [1:536] 159 178 158 188 178 146 159 145 170 157 ...
$ imc : num [1:536] 29 47.3 30 24 32.2 ...
$ sedentar: num [1:536] 1 1 1 1 1 1 1 1 NA 1 ...
$ diabm : num [1:536] 2 2 2 1 1 2 2 2 2 1 ...
$ hipercol: num [1:536] 2 2 1 1 1 1 2 1 1 2 ...
$ pas : num [1:536] 190 192 190 193 182 195 183 184 180 177 ...
$ pad : num [1:536] 100 79 95 90 114 95 84 88 91 84 ...
$ fc : num [1:536] 9 53 9 82 73 88 66 99 61 65 ...
- attr(*, "spec")=
.. cols(
.. sexo = �[32mcol_double()�[39m,
.. nivelest = �[32mcol_double()�[39m,
.. tabaco = �[32mcol_double()�[39m,
.. estcivil = �[32mcol_double()�[39m,
.. laboro = �[32mcol_double()�[39m,
.. hijos = �[32mcol_double()�[39m,
.. edad = �[32mcol_double()�[39m,
.. peso = �[32mcol_double()�[39m,
.. talla = �[32mcol_double()�[39m,
.. imc = �[32mcol_double()�[39m,
.. sedentar = �[32mcol_double()�[39m,
.. diabm = �[32mcol_double()�[39m,
.. hipercol = �[32mcol_double()�[39m,
.. pas = �[32mcol_double()�[39m,
.. pad = �[32mcol_double()�[39m,
.. fc = �[32mcol_double()�[39m
.. )
Ver el encabezado de nuestra base de datos
head(datos2)
sexo | nivelest | tabaco | estcivil | laboro | hijos | edad | peso | talla | imc | sedentar | diabm | hipercol | pas | pad | fc |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
<dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> | <dbl> |
2 | 1 | 2 | 3 | 4 | 2 | 67 | 72 | 159 | 29.00000 | 1 | 2 | 2 | 190 | 100 | 9 |
1 | 4 | 0 | 2 | 3 | 1 | 56 | 150 | 178 | 47.34251 | 1 | 2 | 2 | 192 | 79 | 53 |
1 | 2 | NA | 4 | 3 | 0 | 81 | 71 | 158 | 30.00000 | 1 | 2 | 1 | 190 | 95 | 9 |
2 | 1 | 0 | 2 | 4 | 2 | 74 | 85 | 188 | 24.04934 | 1 | 1 | 1 | 193 | 90 | 82 |
1 | 5 | 2 | 2 | 1 | 3 | 53 | 102 | 178 | 32.19290 | 1 | 1 | 1 | 182 | 114 | 73 |
2 | 1 | 2 | 4 | 3 | 1 | 79 | 98 | 146 | 46.00000 | 1 | 2 | 1 | 195 | 95 | 88 |
Nos centraremos unicamente en el sexo y el estado civil
Para el sexo tenemos:
1 = Masculino, 2 = Femenino
Para el estado civil:
1 = Soltero, 2 = Casado/Pareja, 3 = Separado, 4 = Viudo
Contaremos el numero de hombres y mujeres y los uniremos en un vector
nSexo <- c(sum(datos2$sexo==1),sum(datos2$sexo==2))
Categorizaremos los sexos
Sexo <- c("Masculino", "Femenino")
Calcularemos el porcentaje
porcentaje <- round(nSexo/sum(nSexo)*100)
Lo hacemos bonito
Sexo <- paste(Sexo, porcentaje)
Sexo <- paste(Sexo, " %")
pie(nSexo,labels = Sexo)
Para ello necesitamos convertir a factor
sex <- factor(datos2$sexo)
plot(sex)
La funcion par() se utiliza para configuraciones de graficas en general
Con mfrow = c(n,m) se configura el numero de graficas desplegadas
a la vez
par(mfrow=(c(1,2)))
Grafico de puntos
plot(estcivil ~ sexo, data=datos2)
title("Grafica de puntos")
sunflowerplot(estcivil ~ sexo, data=datos2)
title("Grafica Sunflower")
Regresemos las graficas a la normalidad
par(mfrow=(c(1,1)))
Cuando quieres observar la proporci?n de variables categorica vs categorica
mosaicplot(sexo~estcivil,data=datos2)