Facultad de Derecho y Ciencia Politica

Escuela de Ciencia Política

Guia de Clase de ESTADISTICA


Exploración Bivariada (parte 1)

1. Carga de data:

Para esta sesión usaremos estos datos:

Traigamosla desde Google:

link="https://docs.google.com/spreadsheets/d/e/2PACX-1vQ_VNceU6ncsQs-_KFvkQsv2XqYKRCMyRYCDYQFosH5bo6Yt-l1gE8ZRdP44m4Rh8lQB2nOY-Y-p0ZP/pub?gid=0&single=true&output=csv"

hsb=read.csv(link, stringsAsFactors = F)

2. EXPLOREMOS

¿Qué tenemos?

Esto es lo R ha traido:

str(hsb)
## 'data.frame':    600 obs. of  15 variables:
##  $ ID    : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ SEX   : int  2 1 2 2 2 1 1 2 1 2 ...
##  $ RACE  : int  2 2 2 2 2 2 2 2 2 2 ...
##  $ SES   : int  1 1 1 2 2 2 1 1 2 1 ...
##  $ SCTYP : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ HSP   : int  3 2 2 3 3 2 1 1 1 1 ...
##  $ LOCUS : num  0.29 -0.42 0.71 0.06 0.22 0.46 0.44 0.68 0.06 0.05 ...
##  $ CONCPT: num  0.88 0.03 0.03 0.03 -0.28 0.03 -0.47 0.25 0.56 0.15 ...
##  $ MOT   : num  0.67 0.33 0.67 0 0 0 0.33 1 0.33 1 ...
##  $ CAR   : int  10 2 9 15 1 11 10 9 9 11 ...
##  $ RDG   : num  33.6 46.9 41.6 38.9 36.3 49.5 62.7 44.2 46.9 44.2 ...
##  $ WRTG  : num  43.7 35.9 59.3 41.1 48.9 46.3 64.5 51.5 41.1 49.5 ...
##  $ MATH  : num  40.2 41.9 41.9 32.7 39.5 46.2 48 36.9 45.3 40.5 ...
##  $ SCI   : num  39 36.3 44.4 41.7 41.7 41.7 63.4 49.8 47.1 39 ...
##  $ CIV   : num  40.6 45.6 45.6 40.6 45.6 35.6 55.6 55.6 55.6 50.6 ...

2. PRE PROCESAMIENTO:

No se puede empezar el análisis sin adecuar la data a la metadata

La data tiene que reformatearse segun lo que indica la metadata:

Los cambios que se necesitan son:

# id como texto (pues no es variable, sino "identificador"
hsb$ID=as.character(hsb$ID)

# estas variables como CATEGORICAS NOMINALES
hsb[,c(2,3,5,6,10)]=lapply(hsb[,c(2,3,5,6,10)],as.factor)

# estas variables como CATEGORICAS ORDINALES
hsb$HSP=as.ordered(hsb$HSP)

Note que el formateo NO INCLUYO RECODIFICACION. La recodificación es necesaria cuando la variable categórica presenta etiquetas como categorías (vera ese caso cuando trabaje el Indice de Democracia, para las variables tipo de regimen y continente).

Note además que NO todas las columnas serán variables, otras sera identificadores o claves o keys. Los identificadores deben permanecer como texto (char).

Ahora veamos nueva estructura:

str(hsb,strict.width="cut",width=50)
## 'data.frame':    600 obs. of  15 variables:
##  $ ID    : chr  "1" "2" "3" "4" ...
##  $ SEX   : Factor w/ 2 levels "1","2": 2 1 2 2 2..
##  $ RACE  : Factor w/ 4 levels "1","2","3","4": 2..
##  $ SES   : int  1 1 1 2 2 2 1 1 2 1 ...
##  $ SCTYP : Factor w/ 2 levels "1","2": 1 1 1 1 1..
##  $ HSP   : Ord.factor w/ 3 levels "1"<"2"<"3": 3..
##  $ LOCUS : num  0.29 -0.42 0.71 0.06 0.22 0.46 0..
##  $ CONCPT: num  0.88 0.03 0.03 0.03 -0.28 0.03 -..
##  $ MOT   : num  0.67 0.33 0.67 0 0 0 0.33 1 0.33..
##  $ CAR   : Factor w/ 17 levels "1","2","3","4",...
##  $ RDG   : num  33.6 46.9 41.6 38.9 36.3 49.5 62..
##  $ WRTG  : num  43.7 35.9 59.3 41.1 48.9 46.3 64..
##  $ MATH  : num  40.2 41.9 41.9 32.7 39.5 46.2 48..
##  $ SCI   : num  39 36.3 44.4 41.7 41.7 41.7 63.4..
##  $ CIV   : num  40.6 45.6 45.6 40.6 45.6 35.6 55..

3. Probando HIPOTESIS a nivel bivariado

Lo clave para probar hipotesis es saber la hipótesis nula de la prueba estadística que le toque hacer.

la prueba estadística depende de saber si la variable numérica a analizar se distribuye normalmente:

Por ejemplo, para todos nuestros ejemplos, usaremos a MATH como nuestra variable numérica de interés. Veamos la distribuición de esta variable:

library(ggplot2)

base=ggplot(data=hsb, aes(x=MATH))
base + geom_histogram(bins = 20)

Usaremos tests y graficas para comprobar si MATH se distribuye (u otra variabe numerica) tiene una distribución sufientemente cercana a la normal. El test de normalidad a utilizar será el de Shapiro Wilk, cuya hipotesis nula es que la variable se distribuye normalmente. Recuerda que si hay normalidad se usarán técnicas paramétricas, si no la hay, las NO paramétricas.

IMPORTANTE: Todas las hipotesis nulas serán rechazadas si el test aplicado nos devuelve un p-valor (p-value / prob) menor a 0.05. Cuando un test de hipotesis tiene ese valor, se dice que significativo.

a. Tipo 1: NUM-DICO

Aqui plantearemos hipótesis entre una variable numerica y una variable categorica dicotómica (solo dos niveles).

  • HIPOTESIS NULA o H0: Los promedios de las variable numerica en cada grupo de la dicotómica no se diferencian.

Si tenemos que estos son los promedios de matematicas para hombres y mujeres:

f1=formula(MATH ~ SEX)
aggregate(f1, hsb,mean) 
##   SEX     MATH
## 1   1 52.34542
## 2   2 51.43456

Podemos inferir que a los hombres les va mejor en MATH?

1. Paso 1: Decidiendo si es no no paramétrico

Usemos el método gráfico:

library(ggpubr)
## Loading required package: magrittr
ggqqplot(data=hsb,x="MATH") + facet_grid(. ~ SEX)

Si los puntos se alejan mucho de la diagonal, se aleja de la normalidad.

Como es dificil hacerlo visualmente siempre, podemos usar el test de Shapiro-Wilk, que nos reporta la probabilidad que los datos tengan esa distribución.

# funcion ad-hoc
normalidadTest=function(x) {y =shapiro.test(x); 
                            c(y$statistic, y$p.value)}
# calculando
resultado= aggregate(f1, hsb,
                     FUN = normalidadTest) 


# mostrando resultado
library(knitr)

shapiroTest=as.data.frame(resultado[,2])
names(shapiroTest)=c("SW_Statistic","Probabilidad")
kable(cbind(resultado[1],shapiroTest))
SEX SW_Statistic Probabilidad
1 0.9837903 0.0034565
2 0.9790040 0.0001031

El test nos dice que la probabilidad que la variable MATH se comporte como la curva normal es muy baja (considera bajo si es menor a 0.05). Se rechaza la hipótesis que MATH tiene distribución normal en cada nivel de SEXO.

2. Aplicando TEST para aceptar o rechazar la H0:

Ya sabemos que lo que corresponde utilizar, si ya sabemos que no es NORMAL, es alguna prueba no paramétrica que me informe si los promedios difieren segun grupo. Pero veamos ambos tipos de pruebas:

  • Opcion Paramétrica para dicotómica:

Si hay normalidad usa la prueba t:

t.test(f1,hsb)
## 
##  Welch Two Sample t-test
## 
## data:  MATH by SEX
## t = 1.1722, df = 560.59, p-value = 0.2416
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -0.6154067  2.4371360
## sample estimates:
## mean in group 1 mean in group 2 
##        52.34542        51.43456

Esta prueba informa la probabilidad que la media de MATH sea la misma en ambos grupos de SEX. Como ves, el p-value es mayor a 0.05, por lo que aceptamos la H0 de la prueba t.

  • Opcion No Paramétrica para dicotómica:

Si no hay normalidad usa la prueba Mann-Whitney:

# el test de wilcoxon devuelve Mann-Whitney 
# al recibir "f1"
wilcox.test(f1,hsb)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  MATH by SEX
## W = 46789, p-value = 0.3086
## alternative hypothesis: true location shift is not equal to 0

Igualmente, el p-value sale NO signficativo. SE acepta la H0 del Mann-Whitney.

b. Tipo 2: NUM-POLI

Aqui plantearemos hipótesis entre una variable numerica y una variable categorica politómica (más de dos niveles).

  • HIPOTESIS NULA o H0: Los promedios de las variable numerica en cada grupo de la politómica no se diferencian.

Si tenemos que estos son los promedios de matematicas según programa escolar:

f2=formula(MATH ~ HSP)
aggregate(f2, hsb,mean) 
##   HSP     MATH
## 1   1 55.81071
## 2   2 49.09172
## 3   3 46.26803

Podemos inferir que a los alumnos del programa general les va mejor en MATH?

1. Paso 1: Decidiendo si es no no paramétrico

Usemos el método gráfico:

library(ggpubr)
ggqqplot(data=hsb,x="MATH") + facet_grid(. ~ HSP)

Ahora hagamos el test de Shapiro Wilk

# calculando
resultado= aggregate(f2, hsb,
                     FUN = normalidadTest) 


# mostrando resultado
library(knitr)

shapiroTest=as.data.frame(resultado[,2])
names(shapiroTest)=c("SW_Statistic","Probabilidad")
kable(cbind(resultado[1],shapiroTest))
HSP SW_Statistic Probabilidad
1 0.9888836 0.0187048
2 0.9810514 0.0423975
3 0.9512192 0.0000496

Como al menos una tiene probabilidad menor a 0.05, debemos ir por el camino no paramétrico.

2. Aplicando TEST para aceptar o rechazar la H0:

  • Opcion Paramétrica para politomica:

Aquí corresponde la pruea F de Schnedecor, conocida tambien como one-way ANOVA:

summary(aov(f2, data=hsb))
##              Df Sum Sq Mean Sq F value Pr(>F)    
## HSP           2  10515    5258   73.72 <2e-16 ***
## Residuals   597  42579      71                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Los astericos indican si el H0 es significativo. Podemos rechazarlo, de ahi que al menos un promedio difiere de los demás. Tratemos de detectar las diferencias:

library(ggpubr)
ggerrorplot(hsb, x = "HSP", 
            y = "MATH", 
            desc_stat = "mean_ci"
            )

El nivel 1 se diferenciaría de los demás.

  • Opcion No Paramétrica para politomica:

Aquí puedes usar la prueba de Kruskal-Wallis:

kruskal.test(f2,hsb)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  MATH by HSP
## Kruskal-Wallis chi-squared = 121.26, df = 2, p-value < 2.2e-16

Aqui no muestra asteriscos, pero la probabilidad (p-value) es también menor a 0.05.

Visualmente:

ggplot(data=hsb, aes(x=HSP, y=MATH)) + geom_boxplot(notch = T)

En este caso, se ha puesto un ‘notch’ al boxplot. Si los notches se intersectan, se asume igualdad de medianas, de ahí que la opcion 1 es diferente a las demás.

Tarea: Analizar WRITING, por sexo y nivel socioeconómico. Escribir conclusiones.

Volver al indice