Carga de data: Esta vez usaremos un archivo en SPSS. Este archivo no puede ser directamente leido desde Google.

En esta situacion, un archivo de este tipo debe ser guardado en GitHub. El archivo lo puedes descargar de aquí. Los archivos de este tipo, normalmente tienen un archivo de metadatos, donde se explica que significa cada columna y valores, para este archivo, puedes encontrar los metadatos aqui.

Cuando no sean CSV desde Google , debes usar la biblioteca rio junto con el link de GitHub. Aqui te paso mi link, pero debes luego cambiarlo por el tuyo:

library(rio)

linkGIT="https://github.com/JoseManuelMagallanes/Estadistica_Para_AnalisisPolitico/raw/master/hsb.sav"
politik=import(linkGIT)
str(politik,strict.width="cut",width=50)
## 'data.frame':    600 obs. of  15 variables:
##  $ ID    : num  1 2 3 4 5 6 7 8 9 10 ...
##   ..- attr(*, "format.spss")= chr "F5.0"
##  $ SEX   : num  2 1 2 2 2 1 1 2 1 2 ...
##   ..- attr(*, "format.spss")= chr "F5.0"
##  $ RACE  : num  2 2 2 2 2 2 2 2 2 2 ...
##   ..- attr(*, "format.spss")= chr "F5.0"
##  $ SES   : num  1 1 1 2 2 2 1 1 2 1 ...
##   ..- attr(*, "format.spss")= chr "F5.0"
##  $ SCTYP : num  1 1 1 1 1 1 1 1 1 1 ...
##   ..- attr(*, "format.spss")= chr "F5.0"
##  $ HSP   : num  3 2 2 3 3 2 1 1 1 1 ...
##   ..- attr(*, "format.spss")= chr "F5.0"
##  $ LOCUS : num  0.29 -0.42 0.71 0.06 0.22 0.46 0..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ CONCPT: num  0.88 0.03 0.03 0.03 -0.28 0.03 -..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ MOT   : num  0.67 0.33 0.67 0 0 0 0.33 1 0.33..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ CAR   : num  10 2 9 15 1 11 10 9 9 11 ...
##   ..- attr(*, "format.spss")= chr "F5.0"
##  $ RDG   : num  33.6 46.9 41.6 38.9 36.3 49.5 62..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ WRTG  : num  43.7 35.9 59.3 41.1 48.9 46.3 64..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ MATH  : num  40.2 41.9 41.9 32.7 39.5 46.2 48..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ SCI   : num  39 36.3 44.4 41.7 41.7 41.7 63.4..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ CIV   : num  40.6 45.6 45.6 40.6 45.6 35.6 55..
##   ..- attr(*, "format.spss")= chr "F5.2"

Formatear:

Lea la metadata,y de formato:

politik$ID=as.character(politik$ID)

politik[,c(2,3,5,6,10)]=lapply(politik[,c(2,3,5,6,10)],as.factor)

politik$SES=as.ordered(politik$SES)
politik$HSP=as.ordered(politik$HSP)

Veo cómo quedó:

str(politik,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   : Ord.factor w/ 3 levels "1"<"2"<"3": 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..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ CONCPT: num  0.88 0.03 0.03 0.03 -0.28 0.03 -..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ MOT   : num  0.67 0.33 0.67 0 0 0 0.33 1 0.33..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ CAR   : Factor w/ 17 levels "1","2","3","4",...
##  $ RDG   : num  33.6 46.9 41.6 38.9 36.3 49.5 62..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ WRTG  : num  43.7 35.9 59.3 41.1 48.9 46.3 64..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ MATH  : num  40.2 41.9 41.9 32.7 39.5 46.2 48..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ SCI   : num  39 36.3 44.4 41.7 41.7 41.7 63.4..
##   ..- attr(*, "format.spss")= chr "F5.2"
##  $ CIV   : num  40.6 45.6 45.6 40.6 45.6 35.6 55..
##   ..- attr(*, "format.spss")= chr "F5.2"

Preguntas bivariadas

a. Tipo 1: NUM-DICO - Si tenemos que estos son los promedios de matematicas para hombres y mujeres:

f1=formula(MATH ~ SEX)
aggregate(f1, politik,mean) 

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

b. Tipo 2: NUM-POLI Si tenemos que estos son los promedios de matematicas según programa escolar:

f2=formula(MATH ~ HSP)
aggregate(f2, politik,mean) 

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

Probando Hipótesis

Las hipótesis se prueban siguiendo camino paramétrico o NO paramétrico.

Tipo 1:

Decidiendo si es no paramétrico

Probemos normalidad de la variable, ¿que significa eso?

La curva normal es una distribución estadística importante:

En estadística y probabilidad se llama distribución normal, distribución de Gauss, distribución gaussiana o distribución de Laplace-Gauss, a una de las distribuciones de probabilidad de variable continua que con más frecuencia aparece en estadística y en la teoría de probabilidades.1

La gráfica de su función de densidad tiene una forma acampanada y es simétrica respecto de un determinado parámetro estadístico. Esta curva se conoce como campana de Gauss y es el gráfico de una función gaussiana.2

La importancia de esta distribución radica en que permite modelar numerosos fenómenos naturales, sociales y psicológicos. 3 Mientras que los mecanismos que subyacen a gran parte de este tipo de fenómenos son desconocidos, por la enorme cantidad de variables incontrolables que en ellos intervienen, el uso del modelo normal puede justificarse asumiendo que cada observación se obtiene como la suma de unas pocas causas independientes.

De hecho, la estadística descriptiva sólo permite describir un fenómeno, sin explicación alguna. Para la explicación causal es preciso el diseño experimental, de ahí que al uso de la estadística en psicología y sociología sea conocido como método correlacional.

La distribución normal también es importante por su relación con la estimación por mínimos cuadrados, uno de los métodos de estimación más simples y antiguos.

Algunos ejemplos de variables asociadas a fenómenos naturales que siguen el modelo de la normal son:

La distribución normal también aparece en muchas áreas de la propia estadística. Por ejemplo, la distribución muestral de las medias muestrales es aproximadamente normal, cuando la distribución de la población de la cual se extrae la muestra no es normal.4 Además, la distribución normal maximiza la entropía entre todas las distribuciones con media y varianza conocidas, lo cual la convierte en la elección natural de la distribución subyacente a una lista de datos resumidos en términos de media muestral y varianza. La distribución normal es la más extendida en estadística y muchos tests estadísticos están basados en una “normalidad” más o menos justificada de la variable aleatoria bajo estudio.

En probabilidad, la distribución normal aparece como el límite de varias distribuciones de probabilidad continuas y discretas.


Cuando los datos que tienes tienen una distribución parecida a esa curva, se puede aplicar un tipo de técnicas conocidas como las paramétricas.

Esta gráfica compara el histograma de las notas de matematica, y muestra la curva normal:

library(ggplot2)
ggplot(politik,aes(x=MATH)) + geom_histogram(aes(y = ..density..),bins = 20, fill='green') +
        stat_function(fun = dnorm, colour = "red",
                      args = list(mean = mean(politik$MATH, na.rm = TRUE),
                                 sd = sd(politik$MATH, na.rm = TRUE))) + facet_grid(~SEX) + coord_flip()

¿Podrias afirmar que tu variable MATH se distribuye normalmente en cada caso?

Otra alternativa gráfica es:

library(ggpubr)
## Loading required package: magrittr
ggqqplot(data=politik,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, politik,
                     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).

Opcion Paramétrica para dicotómica

t.test(f1,politik)
## 
##  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.

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,politik)
## 
##  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

Verificando para tipo 2:

Queremos saber si hay normalidad de la numerica en cada grupo de la categorica:

# calculando
resultado= aggregate(f2, politik,
                     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.

Opcion Paramétrica para politomica:

summary(aov(f2, data=politik))
##              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 que la probabilidad de que todas las medias sean iguales es menor a 0.05. De ahi que al menos una difiere de las demás.

Tratemos de detectar las diferencias:

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

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

Opcion No Paramétrica para politomica:

kruskal.test(f2,politik)
## 
##  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=politik, 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.

WRITING - SEX (dicotómico)

M=formula(WRTG ~ SEX)
aggregate(M, politik,mean) 
library(knitr)
tablag= aggregate(M, politik,
          FUN = function(x) {y <- shapiro.test(x); c(y$statistic, y$p.value)})

# para que se vea mejor:
library(knitr)

shapiroTest=as.data.frame(tablag[,2])
names(shapiroTest)=c("W","Prob")

kable(cbind(tablag[1],shapiroTest))
SEX W Prob
1 0.9643550 2.8e-06
2 0.9445193 0.0e+00
library(ggpubr)
ggqqplot(data=politik,x="WRTG") + facet_grid(. ~ SEX)

Efectivamente, es anormal. Usamos un no paramétrico.

wilcox.test(M,politik)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  WRTG by SEX
## W = 32624, p-value = 1.255e-08
## alternative hypothesis: true location shift is not equal to 0

Decimos que la variable es significativa cuando la probabilidad (p-value) es menor que 0.05.

Como el p-value es 1.255e-08, la variable es significativa. Entonces, en el gráfico me saldrá que la diferencia entre los bloques es alta.

ggplot(data=politik, aes(x=SEX, y=WRTG)) + geom_boxplot(notch = T)

Las medias se diferencian

WRTG - SES (politómica)

N=formula(WRTG ~ SES)
aggregate(N, politik,mean) 
library(knitr)
tablag=aggregate(N, politik,
          FUN = function(x) {y <- shapiro.test(x); c(y$statistic, y$p.value)})

# para que se vea mejor:

shapiroTest=as.data.frame(tablag[,2])
names(shapiroTest)=c("W","Prob")

kable(cbind(tablag[1],shapiroTest))
SES W Prob
1 0.9673549 0.0020755
2 0.9517413 0.0000000
3 0.9249929 0.0000002
library(ggpubr)
ggqqplot(data=politik,x="WRTG") + facet_grid(. ~ SES)

Uso NO paramétrica

kruskal.test(N,politik)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  WRTG by SES
## Kruskal-Wallis chi-squared = 37.037, df = 2, p-value = 9.069e-09

Ya que el p-value es 9.069e-09, decimos que es muy significativo. En el gráfico las medias se diferenciarán.

ggplot(data=politik, aes(x=SES, y=WRTG)) + geom_boxplot(notch = T)

Las medias se diferencian