Skip to content

Latest commit

 

History

History
764 lines (469 loc) · 22.2 KB

File metadata and controls

764 lines (469 loc) · 22.2 KB

INFERENCIA ESTADISTICA


Introduccion a la graficacion en R

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


Introduccion

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.

Antes de iniciar

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)
A tibble: 6 × 16
ENTEntidadMUNMunicipioAlfAsiEBCDerPisSanAguDreEleLavRefIng
<dbl><chr><dbl><chr><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
1Aguascalientes 1Aguascalientes 0.97943000.96521390.73625480.85402760.99451570.99051640.99336490.99517570.99780710.86276990.946880515862.251
1Aguascalientes 3Calvillo 0.95219500.95609420.50670980.90332280.98941130.98736410.99047010.99131720.99428210.84533390.927220112184.698
1Aguascalientes 5Jesús María 0.96755480.95870290.65996990.85943340.99078790.98690910.99054550.99272730.99501300.84595670.919168823820.588
1Aguascalientes 7Rincón de Romos0.96491330.97733070.67595790.89179980.99075060.96742240.98420230.97397070.99197840.78243430.8855693 8753.307
2Baja California1Ensenada 0.96439340.96621870.65961090.86197050.98556450.85339280.92663270.91170850.98592580.79598390.912955114037.231
2Baja California2Mexicali 0.98457850.96954080.72953520.84524780.99181430.95104410.98706680.96674370.99222080.86416710.965920317977.196

Para poder entender la base de datos, necesitamos una descripcion

Descripcion de la base de datos

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.

Graficos

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])

png

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")

png

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) 

png

De nuevo, esto no nos dice nada...
Para poder conocer mejor este variable necesitaremos presentar mas graficos

Graficos para variables aleatorias continuas

Histograma

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")

png

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)

png

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)

png

O bien verla sin el histograma

plot(density(datos$Lav))

png

Tambien podemos calcular la funcion de distribucion empirica
Aqui la calculamos de manera artesanal

plot(cumsum(density(datos$Lav)$x))

png

Para hacer que se vea como una linea agregamos el parametro type = "l"

plot(cumsum(density(datos$Lav)$x),type="l")

png

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 limitsfrfrf(%)cfcf(%)
<fct><int><dbl><dbl><dbl><dbl>
[0.1198,0.2119) 20.008163265 0.8163265 2 0.8163265
[0.2119,0.3039) 50.020408163 2.0408163 7 2.8571429
[0.3039,0.396) 30.012244898 1.2244898 10 4.0816327
[0.396,0.4881) 110.044897959 4.4897959 21 8.5714286
[0.4881,0.5801)200.081632653 8.1632653 41 16.7346939
[0.5801,0.6722)380.15510204115.5102041 79 32.2448980
[0.6722,0.7643)560.22857142922.8571429135 55.1020408
[0.7643,0.8563)830.33877551033.8775510218 88.9795918
[0.8563,0.9484)270.11020408211.0204082245100.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")

png

Poligono de frecuencias acumulado

plot(dist, type="cfp")

png

Boxplot

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)

png

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)])

png

qqPlot

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

png

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

png

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)
<style> .list-inline {list-style: none; margin:0; padding: 0} .list-inline>li {display: inline-block} .list-inline>li:not(:last-child)::after {content: "\00b7"; padding: 0 .5ex} </style>
  1. 145
  2. 72

png

Graficos para variables categoricas

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)
A tibble: 6 × 16
sexonivelesttabacoestcivillaborohijosedadpesotallaimcsedentardiabmhipercolpaspadfc
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
21 234267 7215929.00000122190100 9
14 02315615017847.34251122192 7953
12NA43081 7115830.00000121190 95 9
21 024274 8518824.04934111193 9082
15 22135310217832.1929011118211473
21 243179 9814646.00000121195 9588

Descripcion de la base de datos

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, " %")

Grafica de pastel

pie(nSexo,labels = Sexo)

png

Grafica de barras

Para ello necesitamos convertir a factor

sex <- factor(datos2$sexo)
plot(sex)

png

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))) 
Graficos de dispersion (puntos y sunflower)

Grafico de puntos

plot(estcivil ~ sexo, data=datos2)
title("Grafica de puntos")

png

Grafico sunflower
sunflowerplot(estcivil ~ sexo, data=datos2)
title("Grafica Sunflower")

png

Regresemos las graficas a la normalidad

par(mfrow=(c(1,1)))
Mosaicplot

Cuando quieres observar la proporci?n de variables categorica vs categorica

mosaicplot(sexo~estcivil,data=datos2)

png