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.

  1. Luego de abrir el paquete dlookr, describimos la base de datos censal
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.