En este laboratorio vamos a ver la utilidad de una biblioteca muy popular esta biblioteca es ggplot2
Lo primero que debemos hacer es cargar la biblioteca, si no la tenemos instalada tendremos que instalarla (este paso solamente se hace una vez)
#si no la tenemos instalada primero usamos
#install.packages("ggplot2")
#y despues
library(ggplot2)
Tambien vamos a cargar una biblioteca para facilitar pasar de data frame a matrices
library(readr)
Ahora si abrimos nuestra base de datos
setwd("/Users/mau/Dropbox/Cursos mau/Maestria CEI")
data<-read.csv("BaseIP.csv",header=TRUE)
HISTOGRAMAS Son un caso especial de graficas de barras; representan la manera en la que se distribuyen nuestros datos. Siempre son un buen punto de partida. Hay dos tipos: a) Frecuencia absoluta b) Frecuencia relativa Para construirlos, contamos el numero de casos que caen en cada intervalo de interes. Por ejemplo: vamos a simular unos datos:
xnorm<-rnorm(100,25,5)
xflat<-runif(100, min=20, max=40)
Ahora usamos la funcion hist() para obtener nuestros histogramas
hist(xnorm,main="Titulo",xlab="Etiqueta eje x",ylab="Etiqueta eje y")
hist(xflat,main="Titulo",xlab="Etiqueta eje x",ylab="Etiqueta eje y")
Usando ggplot podemos hacer las graficas mas bonitas… pero…. ggplot no trabaja bien con vectores, hay que hacer data frames
xnorm<-data.frame(xnorm=xnorm)
ggplot(data=xnorm)+geom_histogram(aes(xnorm),binwidth=2.5)
Ahora debemos darle formato mas bonito a nuestro histograma
ggplot(data=xnorm)+geom_histogram(mapping=aes(xnorm),binwidth=2.5)+
ggtitle(label="Mi Histograma", subtitle="Ejemplo")+
xlab(label="Eje x")+ylab(label="Eje y")
Ahora usemos alguna variable de nuestra base de datos Aqui nos marcaria error porque la variable no es numerica en el sistema, debemos transformarla
data$s2<-as.numeric(data$s2)
ggplot(data=data)+geom_histogram(mapping=aes(s2),binwidth=2.5)+
ggtitle(label="Edad", subtitle="Distribucion de la muestra por edad")+
xlab(label="Edad")+ylab(label="Casos")
Podemos reducir un poco el numero de columnas
ggplot(data=data)+geom_histogram(mapping=aes(s2),binwidth=5)+
ggtitle(label="Edad", subtitle="Distribucion de la muestra por edad")+
xlab(label="Edad")+ylab(label="Casos")
Y tal vez querramos tener una presentacion distinta
ggplot(data=data)+geom_freqpoly(mapping=aes(s2),binwidth=5)+
ggtitle(label="Edad", subtitle="Distribucion de la muestra por edad")+
xlab(label="Edad")+ylab(label="Frecuencia")
O podemos volver a la presentacion mas tradicional del histograma
ggplot(data=data)+geom_histogram(mapping=aes(s2,colour=s1),binwidth=5)+
ggtitle(label="Edad", subtitle="Distribucion de la muestra por edad")+
xlab(label="Edad")+ylab(label="Frecuencia")
Ahora bien, la mayoria de nuestras variables no son continuas sino discretas por lo tanto no podemos usar un histograma para representarlas En esta caso debemos usar un grafico de barras, la logica es la misma
ggplot(data=data)+geom_bar(mapping=aes(p2,colour=s1))+
ggtitle(label="Edad y sexo", subtitle="Distribucion de la muestra por edad")+
xlab(label="Edad")+ylab(label="Frecuencia")
Tal vez queramos presentarlo como barras
g<-ggplot(data=data)+geom_bar(mapping=aes(p21_3))+
ggtitle(label="Libertad religiosa", subtitle="Se puede practicar libremente")+
xlab(label="")+ylab(label="Frecuencia")
g+coord_flip()
Vamos a darle un poco de formato, Creamos una nueva variable de libertad religiosa
data$lib_rel<-0
data$lib_rel<-ifelse(data$p21_3=="NS/NC",NA,data$lib_rel)
data$lib_rel<-ifelse(data$p21_3=="Siempre","Si",data$lib_rel)
data$lib_rel<-ifelse(data$p21_3=="Muchas veces","Si",data$lib_rel)
data$lib_rel<-ifelse(data$p21_3=="Pocas veces","No",data$lib_rel)
data$lib_rel<-ifelse(data$p21_3=="A veces","No",data$lib_rel)
data$lib_rel<-ifelse(data$p21_3=="Nunca","No",data$lib_rel)
table(data$lib_rel)
##
## No Si
## 1584 9372
Y ahora hacemos nuestra grafica de nuevo
g<-ggplot(data=data)+geom_bar(mapping=aes(lib_rel))+
ggtitle(label="Libertad religiosa", subtitle="Se puede practicar libremente")+
xlab(label="")+ylab(label="Frecuencia")
g+coord_flip()
¿Como podemos eliminar las NA’s? Vamos a usar el comando subset
g<-ggplot(data=subset(data,!is.na(lib_rel)))+geom_bar(mapping=aes(lib_rel))+
ggtitle(label="Libertad religiosa", subtitle="Se puede practicar libremente")+
xlab(label="")+ylab(label="Frecuencia")
g+coord_flip()
g<-ggplot(data=subset(data,!is.na(lib_rel)))+geom_bar(mapping=aes(lib_rel,colour=s1))+
ggtitle(label="Libertad religiosa", subtitle="Se puede practicar libremente")+
xlab(label="")+ylab(label="Frecuencia")
g+coord_flip()
Vamos a complicar un poco el analisis Supongamos que queremos hacer un analisis a nivel estatal y municipal y vamos a ver las distintas expresiones de discriminacion en los estados…
Para esto vamos a hacer un “agregado” de nuestra base de datos, pero primero debemos crear algunas variables indicadoras
Vamos a señalar si para cada persona se ha sentido discriminada por a) Apariencia fisica p46_1 b) Clase social p46_2 c) Color de piel p46_3 d) Preferencia sexual p46_4 e) Ser mujer p46_5 f) Preferencia politica p46_6 g) Creencias religiosas p46_7 h) Ser indigena p46_8
data$disc1<-ifelse(data$p46_1=="S\355",1,0)
data$disc2<-ifelse(data$p46_2=="S\355",1,0)
data$disc3<-ifelse(data$p46_3=="S\355",1,0)
data$disc4<-ifelse(data$p46_4=="S\355",1,0)
data$disc5<-ifelse(data$p46_5=="S\355",1,0)
data$disc6<-ifelse(data$p46_6=="S\355",1,0)
data$disc7<-ifelse(data$p46_7=="S\355",1,0)
data$disc8<-ifelse(data$p46_8=="S\355",1,0)
data$control<-1
datab1<-data[,2]
datab2<-data[,4]
datab3<-data[,489:497]
data2<-aggregate(datab3,list(datab1,datab2),FUN="sum",na.rm=T)
data2$pd1<-data2$disc1/data2$control*100
data2$pd2<-data2$disc2/data2$control*100
data2$pd3<-data2$disc3/data2$control*100
data2$pd4<-data2$disc4/data2$control*100
data2$pd5<-data2$disc5/data2$control*100
data2$pd6<-data2$disc6/data2$control*100
data2$pd7<-data2$disc7/data2$control*100
data2$pd8<-data2$disc8/data2$control*100
summary(data2$pd1)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 10.00 17.64 18.60 30.00 80.00
summary(data2$pd2)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 10.00 20.00 22.18 30.00 90.00
summary(data2$pd3)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 10.00 12.46 20.00 90.00
summary(data2$pd4)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 0.000 2.898 3.011 40.000
summary(data2$pd5)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 10.00 12.81 20.00 60.00
summary(data2$pd6)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 5.278 8.098 10.000 50.000
summary(data2$pd7)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 10.00 9.79 14.53 90.00
summary(data2$pd8)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 2.857 8.137 10.000 100.000
Todo esto para poder seguir usando ggplot jeje Ahora vamos a hacer otros tipos de graficas
data2$region<-0
data2$region<-ifelse(data2$Group.1==1,"Occidente",data2$region)
data2$region<-ifelse(data2$Group.1==2,"Noroeste",data2$region)
data2$region<-ifelse(data2$Group.1==3,"Noroeste",data2$region)
data2$region<-ifelse(data2$Group.1==4,"Sureste",data2$region)
data2$region<-ifelse(data2$Group.1==5,"Noreste",data2$region)
data2$region<-ifelse(data2$Group.1==6,"Occidente",data2$region)
data2$region<-ifelse(data2$Group.1==7,"Sureste",data2$region)
data2$region<-ifelse(data2$Group.1==8,"Noroeste",data2$region)
data2$region<-ifelse(data2$Group.1==9,"Centro",data2$region)
data2$region<-ifelse(data2$Group.1==10,"Noreste",data2$region)
data2$region<-ifelse(data2$Group.1==11,"Occidente",data2$region)
data2$region<-ifelse(data2$Group.1==12,"Centro",data2$region)
data2$region<-ifelse(data2$Group.1==13,"Centro",data2$region)
data2$region<-ifelse(data2$Group.1==14,"Occidente",data2$region)
data2$region<-ifelse(data2$Group.1==15,"Centro",data2$region)
data2$region<-ifelse(data2$Group.1==16,"Occidente",data2$region)
data2$region<-ifelse(data2$Group.1==17,"Centro",data2$region)
data2$region<-ifelse(data2$Group.1==18,"Occidente",data2$region)
data2$region<-ifelse(data2$Group.1==19,"Noreste",data2$region)
data2$region<-ifelse(data2$Group.1==20,"Sureste",data2$region)
data2$region<-ifelse(data2$Group.1==21,"Centro",data2$region)
data2$region<-ifelse(data2$Group.1==22,"Occidente",data2$region)
data2$region<-ifelse(data2$Group.1==23,"Sureste",data2$region)
data2$region<-ifelse(data2$Group.1==24,"Noreste",data2$region)
data2$region<-ifelse(data2$Group.1==25,"Noroeste",data2$region)
data2$region<-ifelse(data2$Group.1==26,"Noroeste",data2$region)
data2$region<-ifelse(data2$Group.1==27,"Sureste",data2$region)
data2$region<-ifelse(data2$Group.1==28,"Noreste",data2$region)
data2$region<-ifelse(data2$Group.1==29,"Centro",data2$region)
data2$region<-ifelse(data2$Group.1==30,"Sureste",data2$region)
data2$region<-ifelse(data2$Group.1==31,"Sureste",data2$region)
data2$region<-ifelse(data2$Group.1==32,"Occidente",data2$region)
Ahora si, la grafica
ggplot(data2)+
geom_boxplot(aes(region,y=pd1))+
ggtitle(label="% Discriminado por apariencia fisica")+coord_flip()
colnames(data2)[1] <- "ent"
colnames(data2)[2] <- "muni"
ggplot(data2)+
geom_boxplot(aes(ent,y=pd1,fill=region))+
ggtitle(label="% Discriminado por apariencia fisica")+coord_flip()
## Warning: position_dodge requires non-overlapping x intervals
¿Como evitamos que se amontonen?
data2$ent2<-0
data2$ent2<-ifelse(data2$ent==1,"R4.AGS",data2$ent2)
data2$ent2<-ifelse(data2$ent==2,"R3.BCN",data2$ent2)
data2$ent2<-ifelse(data2$ent==3,"R3.BCS",data2$ent2)
data2$ent2<-ifelse(data2$ent==4,"R5.CAM",data2$ent2)
data2$ent2<-ifelse(data2$ent==5,"R2.COA",data2$ent2)
data2$ent2<-ifelse(data2$ent==6,"R4.COL",data2$ent2)
data2$ent2<-ifelse(data2$ent==7,"R5.CHI",data2$ent2)
data2$ent2<-ifelse(data2$ent==8,"R3.CHH",data2$ent2)
data2$ent2<-ifelse(data2$ent==9,"R1.CDMX",data2$ent2)
data2$ent2<-ifelse(data2$ent==10,"R2.DGO",data2$ent2)
data2$ent2<-ifelse(data2$ent==11,"R4.GTO",data2$ent2)
data2$ent2<-ifelse(data2$ent==12,"R1.GRO",data2$ent2)
data2$ent2<-ifelse(data2$ent==13,"R1.HGO",data2$ent2)
data2$ent2<-ifelse(data2$ent==14,"R4.JAL",data2$ent2)
data2$ent2<-ifelse(data2$ent==15,"R1.MEX",data2$ent2)
data2$ent2<-ifelse(data2$ent==16,"R4.MIC",data2$ent2)
data2$ent2<-ifelse(data2$ent==17,"R1.MOR",data2$ent2)
data2$ent2<-ifelse(data2$ent==18,"R4.NAY",data2$ent2)
data2$ent2<-ifelse(data2$ent==19,"R2.NLN",data2$ent2)
data2$ent2<-ifelse(data2$ent==20,"R5.OAX",data2$ent2)
data2$ent2<-ifelse(data2$ent==21,"R1.PUE",data2$ent2)
data2$ent2<-ifelse(data2$ent==22,"R4.QRT",data2$ent2)
data2$ent2<-ifelse(data2$ent==23,"R5.QTR",data2$ent2)
data2$ent2<-ifelse(data2$ent==24,"R2.SLP",data2$ent2)
data2$ent2<-ifelse(data2$ent==25,"R3.SIN",data2$ent2)
data2$ent2<-ifelse(data2$ent==26,"R3.SON",data2$ent2)
data2$ent2<-ifelse(data2$ent==27,"R5.TAB",data2$ent2)
data2$ent2<-ifelse(data2$ent==28,"R2.TAM",data2$ent2)
data2$ent2<-ifelse(data2$ent==29,"R1.TLX",data2$ent2)
data2$ent2<-ifelse(data2$ent==30,"R5.VER",data2$ent2)
data2$ent2<-ifelse(data2$ent==31,"R5.YUC",data2$ent2)
data2$ent2<-ifelse(data2$ent==32,"R4.ZAC",data2$ent2)
ggplot(data2)+
geom_boxplot(aes(ent2,y=pd1,fill=region))+
ggtitle(label="% Discriminado por apariencia fisica")+coord_flip()
Y asi podemos hacer graficos para otras formas de discriminacion
ggplot(data2)+
geom_boxplot(aes(ent2,y=pd2,fill=region))+
ggtitle(label="% Discriminado por clase social")+coord_flip()
ggplot(data2)+
geom_boxplot(aes(ent2,y=pd3,fill=region))+
ggtitle(label="% Discriminado por color de piel")+coord_flip()
Graficos de dispersion Sirven para ver la asociacion entre dos o mas variables Por ejemplo: ¿Que tanto se relacionan la discriminacion por apariencia fisica y clase social?
plot(pd1~pd2,data=data2)
usando ggplot
ggplot(data=data2)+
geom_point(mapping=aes(x=pd1,y=pd2))+
ggtitle(label="Asociacion entre discriminacion por apariencia
fisica y por clase social")+
xlab(label="Clase social")+
ylab(label="Apariencia fisica")
Tambien podemos hacer distincion por region
ggplot(data=data2)+
geom_point(mapping=aes(x=pd1,y=pd2, colour=region))+
ggtitle(label="Asociacion entre discriminacion por apariencia
fisica y por clase social")+
xlab(label="Clase social")+
ylab(label="Apariencia fisica")
O tal vez vamos a imprimir sin color y queremos distinguir
ggplot(data=data2)+
geom_point(mapping=aes(x=pd1,y=pd2, shape=region))+
ggtitle(label="Asociacion entre discriminacion por apariencia
fisica y por clase social")+
xlab(label="Clase social")+
ylab(label="Apariencia fisica")
Finalmente, ¿y si los queremos por separado?
ggplot(data=data2)+
geom_point(mapping=aes(x=pd1,y=pd2))+
facet_wrap(~region)+
ggtitle(label="Asociacion entre discriminacion por apariencia
fisica y por clase social")+
xlab(label="Clase social")+
ylab(label="Apariencia fisica")