library(rio)
linkGIT="https://github.com/JoseManuelMagallanes/Estadistica_Para_AnalisisPolitico/raw/master/hsb.sav"
estad=import(linkGIT)
str(estad,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"
EL SES DEBE SER CATEGÓRICA
Formatear: 2. Lea la metadata,y de formato:
estad$ID=as.character(estad$ID)
estad[,c(2,3,4,5,6,10)]=lapply(estad[,c(2,3,4,5,6,10)],as.factor)
estad$HSP=as.ordered(estad$HSP)
Ahora:
str(estad,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 : Factor w/ 3 levels "1","2","3": 1 1 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"
f1=formula(WRTG ~ SEX)
aggregate(f1, estad, mean)
## SEX WRTG
## 1 1 49.78608
## 2 2 54.55443
Podemos inferir que a los hombres les va mejor en WRITING? Se puede afirmar que NO, porque tienen menor rendimiento que las mujeres.
f2=formula(WRTG ~ SES)
aggregate(f2, estad,mean)
## SES WRTG
## 1 1 48.70288
## 2 2 52.35853
## 3 3 55.59259
Podemos inferir que a los de clase alta les va mal en WRITING, a comparación de la clase media y loa clase baja que es la de mayor rendimiento.
Probando Hipótesis Las hipótesis se prueban siguiendo camino paramétrico o NO paramétrico.
Decidiendo si es no no paramétrico
library(knitr)
tablag= aggregate(f1, estad,
FUN = function(x) {y <- shapiro.test(x); c(y$statistic, y$p.value)})
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 |
Se obs | erva que no | son paramétricas, pues el Prob es menor a 0.05 en los dos sexos. |
library(knitr)
tablag= aggregate(f2, estad,
FUN = function(x) {y <- shapiro.test(x); c(y$statistic, y$p.value)})
library(knitr)
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 |
Se observa que no son paramétricas, pues el Prob es menor a 0.05 en las tres clases sociales
Prueba gráfica de la paramétrica:
library(ggpubr)
## Loading required package: ggplot2
## Loading required package: magrittr
ggqqplot(data=estad,x="WRTG") + facet_grid(. ~ SEX)
library(ggpubr)
ggqqplot(data=estad,x="WRTG") + facet_grid(. ~ SES)
Probemos normalidad de la variable, ¿que significa eso? No hay normalidad, por eso se irá por el camino de la paramétrica.
La curva normal es una distribución estadística importante:
wilcox.test(f1,estad)
##
## 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
El p-value es menor a 0.05, entonces, hay diferenciación
Visualmente:
ggplot(data=estad, aes(x=SEX, y=WRTG)) + geom_boxplot(notch = T)
ggplot(data=estad, aes(x=SES, y=WRTG)) + geom_boxplot(notch = T)
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(estad,aes(x=WRTG)) + geom_histogram(aes(y = ..density..),bins = 20, fill='green') +
stat_function(fun = dnorm, colour = "red",
args = list(mean = mean(estad$WRTG, na.rm = TRUE),
sd = sd(estad$WRTG, na.rm = TRUE))) + facet_grid(~SEX) + coord_flip()
Otra alternativa gráfica es:
library(ggpubr)
ggqqplot(data=estad,x="WRTG") + 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.
normalidadTest=function(x) {y =shapiro.test(x);
c(y$statistic, y$p.value)}
resultado= aggregate(f1, estad,
FUN = normalidadTest)
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.9643550 | 2.8e-06 |
2 | 0.9445193 | 0.0e+00 |
El test nos dice que la probabilidad que la variable WTNG se comporte como la curva normal es muy baja (considera bajo si es menor a 0.05).
Opcion Paramétrica para dicotómica: Si hay normalidad usa la prueba t:
t.test(f1, estad)
##
## Welch Two Sample t-test
##
## data: WRTG by SEX
## t = -6.0807, df = 540.78, p-value = 2.264e-09
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -6.308770 -3.227937
## sample estimates:
## mean in group 1 mean in group 2
## 49.78608 54.55443
Esta prueba informa la probabilidad que la media de wtrng sea la misma en ambos grupos de SEX.
Opcion No Paramétrica para dicotómica: Si no hay normalidad usa la prueba Mann-Whitney:
wilcox.test(f1,estad)
##
## 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
Queremos saber si hay normalidad de la numerica en cada grupo de la categorica:
resultado= aggregate(f2, estad,
FUN = normalidadTest)
library(knitr)
shapiroTest=as.data.frame(resultado[,2])
names(shapiroTest)=c("SW_Statistic","Probabilidad")
kable(cbind(resultado[1],shapiroTest))
SES | SW_Statistic | Probabilidad |
---|---|---|
1 | 0.9673549 | 0.0020755 |
2 | 0.9517413 | 0.0000000 |
3 | 0.9249929 | 0.0000002 |
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=estad))
## Df Sum Sq Mean Sq F value Pr(>F)
## SES 2 3552 1776 19.96 4.07e-09 ***
## Residuals 597 53116 89
## ---
## 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(estad, x = "SES",
y = "WRTG",
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,estad)
##
## Kruskal-Wallis rank sum test
##
## data: WRTG by SES
## Kruskal-Wallis chi-squared = 37.037, df = 2, p-value = 9.069e-09
Aqui no muestra asteriscos, pero la probabilidad (p-value) es también MAYOR a 0.05.
Visualmente:
ggplot(data=estad, aes(x=SES, y=WRTG)) + 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.