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"
f1=formula(MATH ~ SEX)
aggregate(f1, politik,mean)
¡Podemos inferir que a los hombres les va mejor en MATH?
f2=formula(MATH ~ HSP)
aggregate(f2, politik,mean)
¿Podemos inferir que a los alumnos del programa general les va mejor en MATH?
Las hipótesis se prueban siguiendo camino paramétrico o NO paramétrico.
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. 3Mientras 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).
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.
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
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.
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.
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.
Analizar WRITING, por sexo y nivel socioeconómico. Escribir conclusiones.
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
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