correlación, asociación y diferencia de medias Para trabajar la correlación, asociación y diferencia de medias hemos descargado los packages siguientes:
library(foreign) #Paquete para importar datos
library(dplyr) #Paquete de procesamiento de bases de datos
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(car) #Paquete de análisis de datos
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(xtable) #Paquete tablas en LaTeX
Abriendo los paquetes que usaremos para hacer toda la rutina de exploración y estadísticos descriptivos.
library(DataExplorer)
library(ggplot2)
library(Hmisc)
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:xtable':
##
## label, label<-
## The following objects are masked from 'package:dplyr':
##
## src, summarize
## The following objects are masked from 'package:base':
##
## format.pval, units
library(knitr)
Luego, importamos la base y la renombramos de ECE_2s_2019_WEB a Censal.
library (foreign)#cargando comando de importacion
censal <- read.spss("ECE_2S_2019_WEB.Sav",use.value.labels=TRUE, max.value.labels=Inf, to.data.frame=TRUE)
Ahora, revisamos la estructura de la base de datos Censal. En esta base se aprecia que hay 24 variables y 508331 observaciones.
str(censal)
## 'data.frame': 508331 obs. of 24 variables:
## $ ID_IE : chr "20001" "20001" "20001" "20001" ...
## $ ID_Seccion : chr "01" "01" "01" "01" ...
## $ cor_est : chr "01" "02" "03" "04" ...
## $ cod_DRE : chr "1600" "1600" "1600" "1600" ...
## $ nom_dre : chr "Loreto " "Loreto " "Loreto " "Loreto " ...
## $ cod_UGEL : chr "160004" "160004" "160004" "160004" ...
## $ nom_ugel : chr "Loreto - Nauta " "Loreto - Nauta " "Loreto - Nauta " "Loreto - Nauta " ...
## $ codgeo : chr "160301" "160301" "160301" "160301" ...
## $ Departamento : chr "LORETO " "LORETO " "LORETO " "LORETO " ...
## $ Provincia : chr "LORETO " "LORETO " "LORETO " "LORETO " ...
## $ Distrito : chr "NAUTA " "NAUTA " "NAUTA " "NAUTA " ...
## $ gestion2 : Factor w/ 2 levels "Estatal","No estatal": 1 1 1 1 1 1 1 1 1 1 ...
## $ area : Factor w/ 2 levels "Urbana","Rural": 1 1 1 1 1 1 1 1 1 1 ...
## $ sexo : Factor w/ 2 levels "Hombre","Mujer": 1 2 1 1 1 2 2 1 1 2 ...
## $ M500_L : num 451 568 509 541 550 ...
## $ grupo_L : Factor w/ 4 levels "Previo al inicio",..: 1 2 2 2 2 1 2 1 2 2 ...
## $ M500_M : num 400 560 560 580 522 ...
## $ grupo_M : Factor w/ 4 levels "Previo al inicio",..: 1 2 2 2 2 1 4 1 1 1 ...
## $ M500_CT : num 392 420 538 660 564 ...
## $ grupo_CT : Factor w/ 4 levels "Previo al inicio",..: 2 2 3 4 3 2 2 2 3 2 ...
## $ aj_lectura : num 1 1 1 1 1 ...
## $ aj_matematica: num 1 1 1 1 1 ...
## $ aj_ct : num 1.04 1.04 1.04 1.04 1.04 ...
## $ ISE : num -1.129 0.455 -1.343 -0.303 -1.17 ...
## - attr(*, "variable.labels")= Named chr [1:24] "ID_IE" "ID_sección" "Correlativo del estudiante" "Código de DRE" ...
## ..- attr(*, "names")= chr [1:24] "ID_IE" "ID_Seccion" "cor_est" "cod_DRE" ...
## - attr(*, "codepage")= int 1252
Escogimos las siguientes variables: Medida de lectura (M500_L), Medida de matemática (M500_M), Medida de CT (M500_CT)
names(censal)
## [1] "ID_IE" "ID_Seccion" "cor_est" "cod_DRE"
## [5] "nom_dre" "cod_UGEL" "nom_ugel" "codgeo"
## [9] "Departamento" "Provincia" "Distrito" "gestion2"
## [13] "area" "sexo" "M500_L" "grupo_L"
## [17] "M500_M" "grupo_M" "M500_CT" "grupo_CT"
## [21] "aj_lectura" "aj_matematica" "aj_ct" "ISE"
Este gráfico nos permite ver qué tipo de datos contiene cada columna.
plot_str(censal)
Conjunto de datos
introduce(censal)
## rows columns discrete_columns continuous_columns all_missing_columns
## 1 508331 24 17 7 0
## total_missing_values complete_rows total_observations memory_usage
## 1 78569 483664 12199944 86475144
kable(t(introduce(censal)))
| rows | 508331 |
| columns | 24 |
| discrete_columns | 17 |
| continuous_columns | 7 |
| all_missing_columns | 0 |
| total_missing_values | 78569 |
| complete_rows | 483664 |
| total_observations | 12199944 |
| memory_usage | 86475144 |
Visualización de la tabla en gráficos amigables
plot_intro(censal)
- Columnas discretas: contienen a las categóricas 70,83%
-Todas las columnas que faltan: Columnas que tienen 100% de datos que faltan 0%
-Filas completas: Porcentaje de filas completas (no faltan datos) 95.15%
Datos perdidos Veamos un poco los datos perdidos y dónde se concentran.
COmo se aprecia en el gráfico, los datos perdidos se concentran en las
variales: aj_ct, grupo_CT, M500_CT, ISE.
library(dlookr)
##
## Attaching package: 'dlookr'
## The following object is masked from 'package:Hmisc':
##
## describe
## The following object is masked from 'package:base':
##
## transform
describe(censal)
## # A tibble: 7 × 26
## described_variables n na mean sd se_mean IQR skewness
## <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 M500_L 506420 1911 568. 69.2 0.0972 93.7 0.185
## 2 M500_M 506115 2216 568. 97.7 0.137 121. 0.464
## 3 M500_CT 492779 15552 502. 101. 0.144 131. -0.179
## 4 aj_lectura 506420 1911 1.03 0.111 0.000156 0.0339 28.7
## 5 aj_matematica 506115 2216 1.04 0.112 0.000157 0.0345 30.3
## 6 aj_ct 492779 15552 1.06 0.135 0.000193 0.0696 28.2
## 7 ISE 488799 19532 0.00136 1.00 0.00143 1.55 -0.394
## # ℹ 18 more variables: kurtosis <dbl>, p00 <dbl>, p01 <dbl>, p05 <dbl>,
## # p10 <dbl>, p20 <dbl>, p25 <dbl>, p30 <dbl>, p40 <dbl>, p50 <dbl>,
## # p60 <dbl>, p70 <dbl>, p75 <dbl>, p80 <dbl>, p90 <dbl>, p95 <dbl>,
## # p99 <dbl>, p100 <dbl>
Ahora, procedemos a crear un subconjunto de nuestra data seleccionando solo algunas variables que sean de nuestro interés, en este caso las variables M500_L(MEDIDA DE LECTURA), M500_M (MEDIDA DE MATEMÀTICA)y M500_CT (MEDIDA DE CT) . Para ello creamos un objeto llamado subcensal de la siguiente manera:
attach(censal)
subcensal <- data.frame(M500_L,M500_M,M500_CT)
names(subcensal)
## [1] "M500_L" "M500_M" "M500_CT"
describe(subcensal)
## # A tibble: 3 × 26
## described_variables n na mean sd se_mean IQR skewness kurtosis
## <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 M500_L 506420 1911 568. 69.2 0.0972 93.7 0.185 0.964
## 2 M500_M 506115 2216 568. 97.7 0.137 121. 0.464 0.871
## 3 M500_CT 492779 15552 502. 101. 0.144 131. -0.179 1.57
## # ℹ 17 more variables: p00 <dbl>, p01 <dbl>, p05 <dbl>, p10 <dbl>, p20 <dbl>,
## # p25 <dbl>, p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>,
## # p75 <dbl>, p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>
Ahora invocaremos las variables escogidas
attach(censal)
## The following objects are masked from censal (pos = 3):
##
## aj_ct, aj_lectura, aj_matematica, area, cod_DRE, cod_UGEL, codgeo,
## cor_est, Departamento, Distrito, gestion2, grupo_CT, grupo_L,
## grupo_M, ID_IE, ID_Seccion, ISE, M500_CT, M500_L, M500_M, nom_dre,
## nom_ugel, Provincia, sexo
Para ver la normalidad las numéricas
plot_qq(subcensal)
## Warning: Removed 19679 rows containing non-finite values (`stat_qq()`).
## Warning: Removed 19679 rows containing non-finite values (`stat_qq_line()`).
#Analisis de correlación
subcensal<-na.omit(subcensal)
plot_correlation(subcensal)
#Boxplot
plot_boxplot(subcensal, by = "M500_L")
#Boxplot
plot_boxplot(subcensal, by = "M500_M")
#Boxplot
plot_boxplot(subcensal, by = "M500_CT")
**1. Correlación lineal paramétrica y no paramétrica
Relacionaremos la medida de lectura con la medida de matemática de la prueba censal 2019.
Pimero graficamos una dispersión de puntos para observar si existe algún tipo de relación. Agregamos una línea para identificar la relación lineal
plot(M500_L, M500_M)
abline(lm(M500_L ~ M500_M), col = "red") #agregar tendencia lineal
En el gráfico, se aprecia que hay una tendencia lineal directa entre la
medida de lectura (M500_L) y la medida de matemática (M500_M).
plot(M500_M, M500_CT)
abline(lm(M500_M ~ M500_CT), col = "red") #agregar tendencia lineal
plot(M500_L, M500_CT)
abline(lm(M500_L ~ M500_CT), col = "red") #agregar tendencia lineal
Ahora, comprobaremos si las variables numéricas elegidas tienen una distribución normal.a través de la prueba kornogorov-smirnov.test.
ks.test(censal$M500_L,pnorm,mean(censal$M500_L),sd(censal$M500_L))
## Warning in ks.test.default(censal$M500_L, pnorm, mean(censal$M500_L),
## sd(censal$M500_L)): ties should not be present for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: censal$M500_L
## D = NA, p-value = NA
## alternative hypothesis: two-sided
ks.test(censal$M500_M,pnorm,mean(censal$M500_M),sd(censal$M500_M))
## Warning in ks.test.default(censal$M500_M, pnorm, mean(censal$M500_M),
## sd(censal$M500_M)): ties should not be present for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: censal$M500_M
## D = NA, p-value = NA
## alternative hypothesis: two-sided
ks.test(censal$M500_CT,pnorm,mean(censal$M500_CT),sd(censal$M500_CT))
## Warning in ks.test.default(censal$M500_CT, pnorm, mean(censal$M500_CT), : ties
## should not be present for the Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: censal$M500_CT
## D = NA, p-value = NA
## alternative hypothesis: two-sided
Ahora generaremos gráficos qgplot para analizar el comportamiento de las tres variables escogidas
qqPlot(M500_L)
## [1] 98186 117385
qqPlot(M500_M)
## [1] 117385 143436
qqPlot(M500_CT)
## [1] 117385 143436
Luego, verificaremos la asociación lineal entre las variables continuas (medida de lectura y medida de matemática; medida de matemática y medida de ct, medida de lectura y medida Ct) a través de la prueba de correlación de Pearson. Las hipótesis son: H0: r=0. No existe asociación lineal entre las variables. H1: r≠0. Hay asociación lineal entre las variables.
Se decide trabajará con un nivel de confianza del 95% y un nivel de significación de α=0.05
cor.test(M500_L, M500_M, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: M500_L and M500_M
## t = 782.01, df = 505910, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.7385235 0.7410186
## sample estimates:
## cor
## 0.7397736
cor.test(M500_M, M500_CT, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: M500_M and M500_CT
## t = 592.93, df = 490736, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6444206 0.6476808
## sample estimates:
## cor
## 0.6460536
cor.test(M500_L, M500_CT, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: M500_L and M500_CT
## t = 636.92, df = 490954, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.6711024 0.6741657
## sample estimates:
## cor
## 0.6726369
Como se puede apreciar, sí existe correlación entre las variables: medida de lectura y medida de matemática; medida de matemática y medida de ciencia; medida de lectura y medida de ciencia). Por lo tanto, se acepta la H1: Hay asociación lineal entre las variables.
Ahora escogeremos dos variables categóricas de nuestra base de datos para hacer uso de Chi cuadrado.Las variables escogidas son: sexo y nivel de desempeño en lectura. Para ello, debemos convertir la variable sexo en una variable numérica, hacemos uso del comando as.numeric:
subcensal2 <- data.frame(sexo,grupo_L)
names(subcensal2)
## [1] "sexo" "grupo_L"
describe(subcensal2)
## # A tibble: 0 × 9
## # ℹ 9 variables: described_variables <chr>, n <int>, na <int>, mean <dbl>,
## # sd <dbl>, se_mean <dbl>, IQR <dbl>, skewness <dbl>, kurtosis <dbl>
subcensal2$sexo <- as.numeric(as.character(subcensal2$sexo))
## Warning: NAs introducidos por coerción
describe(subcensal2,sexo)
## # A tibble: 1 × 26
## described_variables n na mean sd se_mean IQR skewness kurtosis
## <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 sexo 0 508331 NaN NA NA NA NA NA
## # ℹ 17 more variables: p00 <dbl>, p01 <dbl>, p05 <dbl>, p10 <dbl>, p20 <dbl>,
## # p25 <dbl>, p30 <dbl>, p40 <dbl>, p50 <dbl>, p60 <dbl>, p70 <dbl>,
## # p75 <dbl>, p80 <dbl>, p90 <dbl>, p95 <dbl>, p99 <dbl>, p100 <dbl>
tabla <- table(sexo, grupo_L)
chisq.test(tabla)$expected
## grupo_L
## sexo Previo al inicio En inicio En proceso Satisfactorio
## Hombre 44780.87 108696.9 67436.46 38063.76
## Mujer 42786.13 103855.1 64432.54 36368.24
chi <-chisq.test(tabla)
chi
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 1458.2, df = 3, p-value < 2.2e-16
Con un 95% de confianza, existe evidencia suficiente para aceptar la hipótesis nula de independencia estadística entre las variables sexo y medida de lectura de la prueba censal 2019. (χ²=1458.2,df=3,p< 2e-16). Por lo tanto, es posible sostener que, no existe relación entre el sexo de los estudiantes y sus niveles de desempeño en lectura de los estudiantes que rindieron la prueba censal 2019.