Standby

Software Engineer

Las pruebas ICFES son exámenes estandarizados obligatorios en Colombia, siendo la principal la Saber 11 que evalúa competencias en lectura crítica, matemáticas, ciencias naturales, sociales e inglés. Son fundamentales porque constituyen un requisito para graduarse de bachillerato, determinan el acceso a universidades públicas, sirven como criterio para becas, permiten evaluar la calidad educativa de las instituciones y orientan las políticas públicas del sistema educativo nacional

Impacto del cierre de escuelas por COVID-19

Este análisis implica examinar los datos históricos de los resultados de la prueba Saber 11 en los colegios públicos de Bogotá y compararlos con los resultados durante el cierre de las escuelas con el propósito de identificar los cambios y las tendencias que pueden haber ocurrido durante este periodo. Además, se llevará a cabo un análisis comparativo de las diferentes localidades de Bogotá para determinar si existen diferencias significativas en los resultados de la prueba Saber 11 entre los colegios públicos de la ciudad y para finalizar se hará una reflexión sobre cómo la educación remota afectó a los estudiantes de los colegios públicos en Bogotá que son primordialmente los de menores condiciones socioeconómicas y si estos tuvieron acceso o no, a recursos educativos y tecnológicos adecuados durante la pandemia.

Es importante destacar que los cambios mencionados anteriormente se refieren a las diferencias en los puntajes promedio según algunas variables de interés, entre las cuales se incluyen:

  • Ubicación geográfica (localidad donde se encuentra la institución educativa oficial).

  • Estrato socioeconómico de los estudiantes

  • Jornada académica en la que se encuentra el estudiante

  • Disponibilidad o no de un computador en el hogar.

  • Acceso o no a internet en el hogar.

  • Nivel educativo de los padres.

  • Flexibilización de los contenidos curriculares desarrollados, asociados a intensidad horaria, metodologías implementadas y criterios de evaluación.

Seguiremos estas etapas, para la primera etapa analizaremos, importaremos los datos, haremos correciones y revisaremos que todo este bien para poder empezar con lo divertido, es muy normal que en empresas a inicio existan errores, mala organizacion, malas decisiones, información decentralizada, etc. Cosas que iremos arreglando, por ejemplo, para este escenario trabajaremos con txts proporcionados de la base de datos del icfes. Una vez que hagamos los analisis necesarios y las graficas necesarias haremos los entrenamientos, validamos y realizaremos la prediccion con algoritmos de aprendizaje supervizado - y predicciones con algebra linel multiple.

Análisis de datos de colegios públicos de Bogotá

1. Importanción de Pandas.

A mededida que se escribe este analisis iremos importando las librerias (Un conjunto de funciones y herramientas predefinidas que pueden ser importadas y utilizadas en el desarrollo para realizar tareas específicas). Para este paso usaremos pandas para el analisis y manipulacion de datos.

import pandas as pd

1.1 Identificación de datos.

En este proceso analizaremos las variables e importaremos el dataset (archivos.txt) de la base de datos proporcionada del ICFEs, como sabemos los csv tienen separadores para identificar columnas, filas y datos, en este caso si visualizamos alguno de estos archivos tenemos ¬ como separador. Así que no hace falta la conversion aun csv.

import pandas as pd
path = '/content/drive/MyDrive/icfes/'
# Importamos los datos a nuestra variable df
df = pd.read_csv(path+'SB11_20181.TXT', sep='¬', engine='python')
df.head()
ESTU_TIPODOCUMENTOESTU_NACIONALIDADESTU_GENEROESTU_FECHANACIMIENTOPERIODOESTU_CONSECUTIVOESTU_ESTUDIANTEESTU_PAIS_RESIDEESTU_TIENEETNIAESTU_ETNIA...PUNT_INGLESPERCENTIL_INGLESDESEMP_INGLESPUNT_GLOBALPERCENTIL_GLOBALESTU_INSE_INDIVIDUALESTU_NSE_INDIVIDUALESTU_NSE_ESTABLECIMIENTOESTU_ESTADOINVESTIGACIONESTU_PILOPAGA
0TICOLOMBIAF19/07/200020181SB11201810005035ESTUDIANTECOLOMBIANoNaN...4421A-2262054.101344NSE33.0PUBLICARNO
1TICOLOMBIAM03/10/200120181SB11201810005012ESTUDIANTECOLOMBIANoNaN...5845A22633766.990405NSE43.0PUBLICARNO
2TICOLOMBIAF29/06/200020181SB11201810005026ESTUDIANTECOLOMBIANoNaN...325A-2041245.721848NSE23.0PUBLICARNO
3TICOLOMBIAM30/04/200120181SB11201810004998ESTUDIANTECOLOMBIANoNaN...5032A13317051.145124NSE23.0PUBLICARNO
4TICOLOMBIAF06/08/200120181SB11201810005010ESTUDIANTECOLOMBIANoNaN...6250A23186353.365582NSE33.0PUBLICARNO

5 rows × 82 columns

df
ESTU_TIPODOCUMENTOESTU_NACIONALIDADESTU_GENEROESTU_FECHANACIMIENTOPERIODOESTU_CONSECUTIVOESTU_ESTUDIANTEESTU_PAIS_RESIDEESTU_TIENEETNIAESTU_ETNIA...PUNT_INGLESPERCENTIL_INGLESDESEMP_INGLESPUNT_GLOBALPERCENTIL_GLOBALESTU_INSE_INDIVIDUALESTU_NSE_INDIVIDUALESTU_NSE_ESTABLECIMIENTOESTU_ESTADOINVESTIGACIONESTU_PILOPAGA
0TICOLOMBIAF19/07/200020181SB11201810005035ESTUDIANTECOLOMBIANoNaN...4421A-2262054.101344NSE33.0PUBLICARNO
1TICOLOMBIAM03/10/200120181SB11201810005012ESTUDIANTECOLOMBIANoNaN...5845A22633766.990405NSE43.0PUBLICARNO
2TICOLOMBIAF29/06/200020181SB11201810005026ESTUDIANTECOLOMBIANoNaN...325A-2041245.721848NSE23.0PUBLICARNO
3TICOLOMBIAM30/04/200120181SB11201810004998ESTUDIANTECOLOMBIANoNaN...5032A13317051.145124NSE23.0PUBLICARNO
4TICOLOMBIAF06/08/200120181SB11201810005010ESTUDIANTECOLOMBIANoNaN...6250A23186353.365582NSE33.0PUBLICARNO
..................................................................
12522TICOLOMBIAM09/04/200020181SB11201810055305ESTUDIANTECOLOMBIANoNaN...5133A12081371.165216NSE42.0PUBLICARNO
12523TICOLOMBIAF17/12/200120181SB11201810055294ESTUDIANTECOLOMBIASiNaN...4625A-2603555.447884NSE32.0PUBLICARNO
12524TICOLOMBIAM27/03/200020181SB11201810055303ESTUDIANTECOLOMBIANoNaN...261A-2101462.192852NSE32.0PUBLICARNO
12525TICOLOMBIAM18/01/200220181SB11201810055301ESTUDIANTECOLOMBIANoNaN...4421A-2151654.766308NSE32.0PUBLICARNO
12526TICOLOMBIAM04/05/200120181SB11201810055300ESTUDIANTECOLOMBIANoNaN...4218A-2784453.387778NSE32.0PUBLICARNO

12527 rows × 82 columns

Tenemos 82 columnas y 12mil estudiantes, y vimos ejemplos de como se reflejan los datos de los estudiantes, ya nos podemos dar una idea de como manejar las variables categóricas, por ejemplo, ESTU_GENERO, donde utilizaremos One-Hot Encoding, donde se crea una nueva columna binaria (0 o 1) para cada categoría única de la variable.

  • F: Femenino (0)
  • M: Mascuino (1)

Pero sin adelantarnos, sigamos estudiando las variables ya que no se muestran todas.

df.info()
RangeIndex: 12527 entries, 0 to 12526
Data columns (total 82 columns):
 #   Column                         Non-Null Count  Dtype
---  ------                         --------------  -----
 0   ESTU_TIPODOCUMENTO             12527 non-null  object
 1   ESTU_NACIONALIDAD              12527 non-null  object
 2   ESTU_GENERO                    12527 non-null  object
 3   ESTU_FECHANACIMIENTO           12527 non-null  object
 4   PERIODO                        12527 non-null  int64
 5   ESTU_CONSECUTIVO               12527 non-null  object
 6   ESTU_ESTUDIANTE                12527 non-null  object
 7   ESTU_PAIS_RESIDE               12527 non-null  object
 8   ESTU_TIENEETNIA                12526 non-null  object
 9   ESTU_ETNIA                     119 non-null    object
 10  ESTU_DEPTO_RESIDE              12527 non-null  object
 11  ESTU_COD_RESIDE_DEPTO          12527 non-null  int64
 12  ESTU_MCPIO_RESIDE              12527 non-null  object
 13  ESTU_COD_RESIDE_MCPIO          12527 non-null  int64
 14  FAMI_ESTRATOVIVIENDA           12063 non-null  object
 15  FAMI_PERSONASHOGAR             12244 non-null  object
 16  FAMI_CUARTOSHOGAR              12319 non-null  object
 17  FAMI_EDUCACIONPADRE            12094 non-null  object
 18  FAMI_EDUCACIONMADRE            12096 non-null  object
 19  FAMI_TRABAJOLABORPADRE         12273 non-null  object
 20  FAMI_TRABAJOLABORMADRE         12299 non-null  object
 21  FAMI_TIENEINTERNET             12108 non-null  object
 22  FAMI_TIENESERVICIOTV           12083 non-null  object
 23  FAMI_TIENECOMPUTADOR           12347 non-null  object
 24  FAMI_TIENELAVADORA             12354 non-null  object
 25  FAMI_TIENEHORNOMICROOGAS       12347 non-null  object
 26  FAMI_TIENEAUTOMOVIL            12329 non-null  object
 27  FAMI_TIENEMOTOCICLETA          12317 non-null  object
 28  FAMI_TIENECONSOLAVIDEOJUEGOS   12335 non-null  object
 29  FAMI_NUMLIBROS                 12102 non-null  object
 30  FAMI_COMELECHEDERIVADOS        12086 non-null  object
 31  FAMI_COMECARNEPESCADOHUEVO     12073 non-null  object
 32  FAMI_COMECEREALFRUTOSLEGUMBRE  12076 non-null  object
 33  FAMI_SITUACIONECONOMICA        12328 non-null  object
 34  ESTU_DEDICACIONLECTURADIARIA   12091 non-null  object
 35  ESTU_DEDICACIONINTERNET        12069 non-null  object
 36  ESTU_HORASSEMANATRABAJA        12326 non-null  object
 37  ESTU_TIPOREMUNERACION          12273 non-null  object
 38  COLE_CODIGO_ICFES              12527 non-null  int64
 39  COLE_COD_DANE_ESTABLECIMIENTO  12527 non-null  int64
 40  COLE_NOMBRE_ESTABLECIMIENTO    12527 non-null  object
 41  COLE_GENERO                    12527 non-null  object
 42  COLE_NATURALEZA                12527 non-null  object
 43  COLE_CALENDARIO                12527 non-null  object
 44  COLE_BILINGUE                  11123 non-null  object
 45  COLE_CARACTER                  12403 non-null  object
 46  COLE_COD_DANE_SEDE             12527 non-null  int64
 47  COLE_NOMBRE_SEDE               12527 non-null  object
 48  COLE_SEDE_PRINCIPAL            12527 non-null  object
 49  COLE_AREA_UBICACION            12527 non-null  object
 50  COLE_JORNADA                   12527 non-null  object
 51  COLE_COD_MCPIO_UBICACION       12527 non-null  int64
 52  COLE_MCPIO_UBICACION           12527 non-null  object
 53  COLE_COD_DEPTO_UBICACION       12527 non-null  int64
 54  COLE_DEPTO_UBICACION           12527 non-null  object
 55  ESTU_PRIVADO_LIBERTAD          12527 non-null  object
 56  ESTU_COD_MCPIO_PRESENTACION    12527 non-null  int64
 57  ESTU_MCPIO_PRESENTACION        12527 non-null  object
 58  ESTU_DEPTO_PRESENTACION        12527 non-null  object
 59  ESTU_COD_DEPTO_PRESENTACION    12527 non-null  int64
 60  PUNT_LECTURA_CRITICA           12527 non-null  int64
 61  PERCENTIL_LECTURA_CRITICA      12527 non-null  int64
 62  DESEMP_LECTURA_CRITICA         12527 non-null  int64
 63  PUNT_MATEMATICAS               12527 non-null  int64
 64  PERCENTIL_MATEMATICAS          12527 non-null  int64
 65  DESEMP_MATEMATICAS             12527 non-null  int64
 66  PUNT_C_NATURALES               12527 non-null  int64
 67  PERCENTIL_C_NATURALES          12527 non-null  int64
 68  DESEMP_C_NATURALES             12527 non-null  int64
 69  PUNT_SOCIALES_CIUDADANAS       12527 non-null  int64
 70  PERCENTIL_SOCIALES_CIUDADANAS  12527 non-null  int64
 71  DESEMP_SOCIALES_CIUDADANAS     12527 non-null  int64
 72  PUNT_INGLES                    12527 non-null  int64
 73  PERCENTIL_INGLES               12527 non-null  int64
 74  DESEMP_INGLES                  12527 non-null  object
 75  PUNT_GLOBAL                    12527 non-null  int64
 76  PERCENTIL_GLOBAL               12527 non-null  int64
 77  ESTU_INSE_INDIVIDUAL           12268 non-null  float64
 78  ESTU_NSE_INDIVIDUAL            12268 non-null  object
 79  ESTU_NSE_ESTABLECIMIENTO       12430 non-null  float64
 80  ESTU_ESTADOINVESTIGACION       12527 non-null  object
 81  ESTU_PILOPAGA                  12527 non-null  object
 dtypes: float64(2), int64(26), object(54)
 memory usage: 7.8+ MB

1.2 Categorización de variables por grupos

Categoría 1: Información personal del estudiante

  • ESTU_TIPODOCUMENTO
  • ESTU_NACIONALIDAD
  • ESTU_GENERO
  • ESTU_FECHANACIMIENTO
  • ESTU_CONSECUTIVO
  • ESTU_ESTUDIANTE
  • ESTU_PAIS_RESIDE
  • ESTU_TIENEETNIA
  • ESTU_ETNIA
  • ESTU_DEPTO_RESIDE
  • ESTU_COD_RESIDE_DEPTO
  • ESTU_MCPIO_RESIDE
  • ESTU_COD_RESIDE_MCPIO
  • ESTU_PRIVADO_LIBERTAD

Categoría 2: Información familiar y socioeconómica

  • FAMI_ESTRATOVIVIENDA
  • FAMI_PERSONASHOGAR
  • FAMI_CUARTOSHOGAR
  • FAMI_EDUCACIONPADRE
  • FAMI_EDUCACIONMADRE
  • FAMI_TRABAJOLABORPADRE
  • FAMI_TRABAJOLABORMADRE
  • FAMI_TIENEINTERNET
  • FAMI_TIENESERVICIOTV
  • FAMI_TIENECOMPUTADOR
  • FAMI_TIENELAVADORA
  • FAMI_TIENEHORNOMICROOGAS
  • FAMI_TIENEAUTOMOVIL
  • FAMI_TIENEMOTOCICLETA
  • FAMI_TIENECONSOLAVIDEOJUEGOS
  • FAMI_NUMLIBROS
  • FAMI_COMELECHEDERIVADOS
  • FAMI_COMECARNEPESCADOHUEVO
  • FAMI_COMECEREALFRUTOSLEGUMBRE
  • FAMI_SITUACIONECONOMICA
  • ESTU_INSE_INDIVIDUAL
  • ESTU_NSE_INDIVIDUAL
  • ESTU_NSE_ESTABLECIMIENTO

Categoría 3: Información académica y laboral del estudiante

  • ESTU_DEDICACIONLECTURADIARIA
  • ESTU_DEDICACIONINTERNET
  • ESTU_HORASSEMANATRABAJA
  • ESTU_TIPOREMUNERACION
  • ESTU_ESTADOINVESTIGACION
  • ESTU_PILOPAGA

Categoría 4: Información del colegio

  • COLE_CODIGO_ICFES
  • COLE_COD_DANE_ESTABLECIMIENTO
  • COLE_NOMBRE_ESTABLECIMIENTO
  • COLE_GENERO
  • COLE_NATURALEZA
  • COLE_CALENDARIO
  • COLE_BILINGUE
  • COLE_CARACTER
  • COLE_COD_DANE_SEDE
  • COLE_NOMBRE_SEDE
  • COLE_SEDE_PRINCIPAL
  • COLE_AREA_UBICACION
  • COLE_JORNADA
  • COLE_COD_MCPIO_UBICACION
  • COLE_MCPIO_UBICACION
  • COLE_COD_DEPTO_UBICACION
  • COLE_DEPTO_UBICACION

Categoría 5: Información de la presentación del examen

  • PERIODO
  • ESTU_COD_MCPIO_PRESENTACION
  • ESTU_MCPIO_PRESENTACION
  • ESTU_DEPTO_PRESENTACION
  • ESTU_COD_DEPTO_PRESENTACION

Categoría 6: Resultados de la prueba Saber 11

  • PUNT_LECTURA_CRITICA
  • PERCENTIL_LECTURA_CRITICA
  • DESEMP_LECTURA_CRITICA
  • PUNT_MATEMATICAS
  • PERCENTIL_MATEMATICAS
  • DESEMP_MATEMATICAS
  • PUNT_C_NATURALES
  • PERCENTIL_C_NATURALES
  • DESEMP_C_NATURALES
  • PUNT_SOCIALES_CIUDADANAS
  • PERCENTIL_SOCIALES_CIUDADANAS
  • DESEMP_SOCIALES_CIUDADANAS
  • PUNT_INGLES
  • PERCENTIL_INGLES
  • DESEMP_INGLES
  • PUNT_GLOBAL
  • PERCENTIL_GLOBAL
# Consultamos datos estadisticos generales: numeros de elementos, media, desviación, valor minimo, porcentajes
df.describe().transpose()
countmeanstdmin25%50%75%max
PERIODO12527.02.018100e+040.000000e+002.018100e+042.018100e+042.018100e+042.018100e+042.018100e+04
ESTU_COD_RESIDE_DEPTO12527.04.790053e+013.109914e+015.000000e+001.100000e+017.600000e+017.600000e+017.600000e+01
ESTU_COD_RESIDE_MCPIO12527.04.796111e+043.111927e+045.001000e+031.100100e+047.600100e+047.600100e+047.689500e+04
COLE_CODIGO_ICFES12527.08.921620e+041.367315e+051.820000e+021.934900e+044.644100e+041.061200e+057.146340e+05
COLE_COD_DANE_ESTABLECIMIENTO12527.03.577158e+114.197414e+101.765200e+113.118480e+113.760010e+113.760010e+114.768921e+11
COLE_COD_DANE_SEDE12527.03.576174e+114.195383e+101.765200e+113.118480e+113.760010e+113.760010e+114.768921e+11
COLE_COD_MCPIO_UBICACION12527.04.849935e+043.063171e+045.001000e+031.100100e+047.600100e+047.600100e+047.689200e+04
COLE_COD_DEPTO_UBICACION12527.04.839650e+013.064030e+015.000000e+001.100000e+017.600000e+017.600000e+017.600000e+01
ESTU_COD_MCPIO_PRESENTACION12527.04.790827e+043.118285e+045.001000e+031.100100e+047.600100e+047.600100e+047.683400e+04
ESTU_COD_DEPTO_PRESENTACION12527.04.785280e+013.117389e+015.000000e+001.100000e+017.600000e+017.600000e+017.600000e+01
PUNT_LECTURA_CRITICA12527.06.426591e+019.022561e+002.900000e+015.900000e+016.500000e+017.100000e+011.000000e+02
PERCENTIL_LECTURA_CRITICA12527.06.320029e+012.453513e+011.000000e+004.500000e+016.600000e+018.400000e+011.000000e+02
DESEMP_LECTURA_CRITICA12527.03.409675e+006.386825e-011.000000e+003.000000e+003.000000e+004.000000e+004.000000e+00
PUNT_MATEMATICAS12527.06.379428e+011.189882e+012.100000e+015.600000e+016.500000e+017.200000e+011.000000e+02
PERCENTIL_MATEMATICAS12527.06.397637e+012.402950e+011.000000e+004.700000e+016.700000e+018.400000e+011.000000e+02
DESEMP_MATEMATICAS12527.03.151034e+006.811860e-011.000000e+003.000000e+003.000000e+004.000000e+004.000000e+00
PUNT_C_NATURALES12527.06.280267e+011.063723e+010.000000e+005.600000e+016.400000e+017.000000e+011.000000e+02
PERCENTIL_C_NATURALES12527.06.420212e+012.384049e+011.000000e+004.700000e+016.700000e+018.400000e+011.000000e+02
DESEMP_C_NATURALES12527.02.971981e+007.347994e-011.000000e+003.000000e+003.000000e+003.000000e+004.000000e+00
PUNT_SOCIALES_CIUDADANAS12527.06.215742e+011.125163e+012.200000e+015.500000e+016.300000e+017.000000e+011.000000e+02
PERCENTIL_SOCIALES_CIUDADANAS12527.06.310178e+012.483422e+011.000000e+004.500000e+016.600000e+018.400000e+011.000000e+02
DESEMP_SOCIALES_CIUDADANAS12527.02.936298e+007.899843e-011.000000e+002.000000e+003.000000e+003.000000e+004.000000e+00
PUNT_INGLES12527.07.050802e+011.388719e+010.000000e+006.000000e+017.300000e+018.200000e+011.000000e+02
PERCENTIL_INGLES12527.06.484953e+012.306537e+011.000000e+004.800000e+016.700000e+018.400000e+011.000000e+02
PUNT_GLOBAL12527.03.190647e+024.907322e+011.370000e+022.870000e+023.260000e+023.550000e+024.750000e+02
PERCENTIL_GLOBAL12527.06.451217e+012.340080e+011.000000e+004.800000e+016.700000e+018.400000e+011.000000e+02
ESTU_INSE_INDIVIDUAL12268.06.585032e+018.564458e+002.159309e+015.966838e+016.641709e+017.210113e+018.358035e+01
ESTU_NSE_ESTABLECIMIENTO12430.03.272164e+005.884799e-011.000000e+003.000000e+003.000000e+004.000000e+004.000000e+00

Un resumen de las estadísticas descriptivas de las variables cuantitativas del año 2018

  1. PERIODO:

    • Todos los valores son iguales a 20181, lo que indica que los datos corresponden al mismo periodo.
  2. ESTU_COD_RESIDE_MCPIO, COLE_COD_MCPIO_UBICACION y ESTU_COD_MCPIO_PRESENTACION:

    • El 50% de los datos están entre los códigos 11001 (Bogotá) y 76001 (Cali).
  3. Puntajes y percentiles en las áreas evaluadas (PUNT_LECTURA_CRITICA, PUNT_MATEMATICAS, PUNT_C_NATURALES, PUNT_SOCIALES_CIUDADANAS, PUNT_INGLES):

    • Los puntajes promedio varían entre 62 y 70 puntos, con desviaciones estándar entre 9 y 13 puntos.
    • Los percentiles promedio están alrededor de 63, con desviaciones estándar cercanas a 24.
  4. Desempeños en las áreas evaluadas (DESEMP_LECTURA_CRITICA, DESEMP_MATEMATICAS, DESEMP_C_NATURALES, DESEMP_SOCIALES_CIUDADANAS):

    • Los desempeños promedio varían entre 2.9 y 3.4, con desviaciones estándar pequeñas (menores a 1).
  5. PUNT_GLOBAL y PERCENTIL_GLOBAL:

    • El puntaje global promedio es de 319 puntos, con una desviación estándar de 49 puntos.
    • El percentil global promedio es de 64.5, con una desviación estándar de 23.4.
  6. ESTU_INSE_INDIVIDUAL:

    • El índice socioeconómico individual promedio es de 65.85, con una desviación estándar de 8.56.
    • El 50% de los estudiantes tienen un índice entre 59.67 y 72.10.
  7. ESTU_NSE_ESTABLECIMIENTO:

    • El nivel socioeconómico promedio de los establecimientos es de 3.27, con una desviación estándar pequeña (0.59).
    • La mayoría de los establecimientos se encuentran en los niveles socioeconómicos 3 y 4.
# Consultamos numeros de filas y columnas, para estar seguros.
df.shape
(12527, 82)
# Consultamos si tenemos celdas con valores sin valores
null_counts = df.isnull().sum()
null_counts
0
ESTU_TIPODOCUMENTO0
ESTU_NACIONALIDAD0
ESTU_GENERO0
ESTU_FECHANACIMIENTO0
PERIODO0
......
ESTU_INSE_INDIVIDUAL259
ESTU_NSE_INDIVIDUAL259
ESTU_NSE_ESTABLECIMIENTO97
ESTU_ESTADOINVESTIGACION0
ESTU_PILOPAGA0

82 rows × 1 columns

# Filtramos las variables que tengan mas de un valor null con datos > 0
null_counts[null_counts > 0]
0
ESTU_TIENEETNIA1
ESTU_ETNIA12408
FAMI_ESTRATOVIVIENDA464
FAMI_PERSONASHOGAR283
FAMI_CUARTOSHOGAR208
FAMI_EDUCACIONPADRE433
FAMI_EDUCACIONMADRE431
FAMI_TRABAJOLABORPADRE254
FAMI_TRABAJOLABORMADRE228
FAMI_TIENEINTERNET419
FAMI_TIENESERVICIOTV444
FAMI_TIENECOMPUTADOR180
FAMI_TIENELAVADORA173
FAMI_TIENEHORNOMICROOGAS180
FAMI_TIENEAUTOMOVIL198
FAMI_TIENEMOTOCICLETA210
FAMI_TIENECONSOLAVIDEOJUEGOS192
FAMI_NUMLIBROS425
FAMI_COMELECHEDERIVADOS441
FAMI_COMECARNEPESCADOHUEVO454
FAMI_COMECEREALFRUTOSLEGUMBRE451
FAMI_SITUACIONECONOMICA199
ESTU_DEDICACIONLECTURADIARIA436
ESTU_DEDICACIONINTERNET458
ESTU_HORASSEMANATRABAJA201
ESTU_TIPOREMUNERACION254
COLE_BILINGUE1404
COLE_CARACTER124
ESTU_INSE_INDIVIDUAL259
ESTU_NSE_INDIVIDUAL259
ESTU_NSE_ESTABLECIMIENTO97

Estos datos con valores en null son de estudiantes que no han respondido a esas preguntas (Por razones desconocidas), es importante tener esto en cuenta.

Ahora tratemos de ver las columnas, así en caso de volver no tenemos que ir viendo cada consulta o nos iremos perdiendo a la hora de buscar alguna variable al programar.

df.columns
Index(['ESTU_TIPODOCUMENTO', 'ESTU_NACIONALIDAD', 'ESTU_GENERO',
           'ESTU_FECHANACIMIENTO', 'PERIODO', 'ESTU_CONSECUTIVO',
           'ESTU_ESTUDIANTE', 'ESTU_PAIS_RESIDE', 'ESTU_TIENEETNIA', 'ESTU_ETNIA',
           'ESTU_DEPTO_RESIDE', 'ESTU_COD_RESIDE_DEPTO', 'ESTU_MCPIO_RESIDE',
           'ESTU_COD_RESIDE_MCPIO', 'FAMI_ESTRATOVIVIENDA', 'FAMI_PERSONASHOGAR',
           'FAMI_CUARTOSHOGAR', 'FAMI_EDUCACIONPADRE', 'FAMI_EDUCACIONMADRE',
           'FAMI_TRABAJOLABORPADRE', 'FAMI_TRABAJOLABORMADRE',
           'FAMI_TIENEINTERNET', 'FAMI_TIENESERVICIOTV', 'FAMI_TIENECOMPUTADOR',
           'FAMI_TIENELAVADORA', 'FAMI_TIENEHORNOMICROOGAS', 'FAMI_TIENEAUTOMOVIL',
           'FAMI_TIENEMOTOCICLETA', 'FAMI_TIENECONSOLAVIDEOJUEGOS',
           'FAMI_NUMLIBROS', 'FAMI_COMELECHEDERIVADOS',
           'FAMI_COMECARNEPESCADOHUEVO', 'FAMI_COMECEREALFRUTOSLEGUMBRE',
           'FAMI_SITUACIONECONOMICA', 'ESTU_DEDICACIONLECTURADIARIA',
           'ESTU_DEDICACIONINTERNET', 'ESTU_HORASSEMANATRABAJA',
           'ESTU_TIPOREMUNERACION', 'COLE_CODIGO_ICFES',
           'COLE_COD_DANE_ESTABLECIMIENTO', 'COLE_NOMBRE_ESTABLECIMIENTO',
           'COLE_GENERO', 'COLE_NATURALEZA', 'COLE_CALENDARIO', 'COLE_BILINGUE',
           'COLE_CARACTER', 'COLE_COD_DANE_SEDE', 'COLE_NOMBRE_SEDE',
           'COLE_SEDE_PRINCIPAL', 'COLE_AREA_UBICACION', 'COLE_JORNADA',
           'COLE_COD_MCPIO_UBICACION', 'COLE_MCPIO_UBICACION',
           'COLE_COD_DEPTO_UBICACION', 'COLE_DEPTO_UBICACION',
           'ESTU_PRIVADO_LIBERTAD', 'ESTU_COD_MCPIO_PRESENTACION',
           'ESTU_MCPIO_PRESENTACION', 'ESTU_DEPTO_PRESENTACION',
           'ESTU_COD_DEPTO_PRESENTACION', 'PUNT_LECTURA_CRITICA',
           'PERCENTIL_LECTURA_CRITICA', 'DESEMP_LECTURA_CRITICA',
           'PUNT_MATEMATICAS', 'PERCENTIL_MATEMATICAS', 'DESEMP_MATEMATICAS',
           'PUNT_C_NATURALES', 'PERCENTIL_C_NATURALES', 'DESEMP_C_NATURALES',
           'PUNT_SOCIALES_CIUDADANAS', 'PERCENTIL_SOCIALES_CIUDADANAS',
           'DESEMP_SOCIALES_CIUDADANAS', 'PUNT_INGLES', 'PERCENTIL_INGLES',
           'DESEMP_INGLES', 'PUNT_GLOBAL', 'PERCENTIL_GLOBAL',
           'ESTU_INSE_INDIVIDUAL', 'ESTU_NSE_INDIVIDUAL',
           'ESTU_NSE_ESTABLECIMIENTO', 'ESTU_ESTADOINVESTIGACION',
           'ESTU_PILOPAGA'],
          dtype='object')
df.dtypes
0
ESTU_TIPODOCUMENTOobject
ESTU_NACIONALIDADobject
ESTU_GENEROobject
ESTU_FECHANACIMIENTOobject
PERIODOint64
......
ESTU_INSE_INDIVIDUALfloat64
ESTU_NSE_INDIVIDUALobject
ESTU_NSE_ESTABLECIMIENTOfloat64
ESTU_ESTADOINVESTIGACIONobject
ESTU_PILOPAGAobject

82 rows × 1 columns

Variables cuantitativas

Son aquellas que representan una cantidad numérica o medida. Estas variables pueden ser discretas o continuas.

  • Variables cuantitativas discretas: Son aquellas que toman valores numéricos enteros y se pueden contar, como el número de personas en una familia o en este caso el periodo en el que se encuentra el estudiante.
  • Variables cuantitativas continuas: Son aquellas que pueden tomar cualquier valor dentro de un rango, y generalmente se miden en una escala continua, como la altura de una persona o el peso de un objeto.

Variables cualitativas

Son aquellas que representan cualidades o características que no se pueden medir numéricamente. Estas variables se dividen en dos subtipos:

  • Variables cualitativas nominales: Son aquellas que representan categorías sin un orden intrínseco, como el color de los ojos o la marca de un automóvil.
  • Variables cualitativas ordinales: Son aquellas que representan categorías con un orden natural o jerarquía, como el nivel de educación (primaria, secundaria, universitaria).

Teniendo estas definiciones importantes para nuestro analisis prosigamos a categorizar las variables que usaremos.

  1. Variables cuantitativas:

    • Variables cuantitativas continuas:

      • Puntajes promedio en las áreas evaluadas (PUNT_LECTURA_CRITICA, PUNT_MATEMATICAS, PUNT_C_NATURALES, PUNT_SOCIALES_CIUDADANAS, PUNT_INGLES)
      • Puntaje global (PUNT_GLOBAL)
      • Índice socioeconómico del evaluado (ESTU_INSE_INDIVIDUAL)
    • Variables cuantitativas discretas:

      • Periodo (PERIODO)
      • Código DANE del municipio de ubicación de la sede (COLE_COD_MCPIO_UBICACION)
      • Código DANE del departamento de ubicación de la sede (COLE_COD_DEPTO_UBICACION)
  2. Variables cualitativas:

    • Variables cualitativas nominales:

      • Municipio de ubicación de la sede (COLE_MCPIO_UBICACION)
      • Departamento de ubicación de la sede (COLE_DEPTO_UBICACION)
      • Naturaleza del establecimiento (COLE_NATURALEZA)
      • Jornada de la sede (COLE_JORNADA)
      • Género del evaluado (ESTU_GENERO)
      • Disponibilidad de computador en el hogar (FAMI_TIENECOMPUTADOR)
      • Acceso a internet en el hogar (FAMI_TIENEINTERNET)
    • Variables cualitativas ordinales:

      • Estrato socioeconómico de la vivienda (FAMI_ESTRATOVIVIENDA)
      • Nivel educativo más alto alcanzado por el padre (FAMI_EDUCACIONPADRE)
      • Nivel educativo más alto alcanzado por la madre (FAMI_EDUCACIONMADRE)
      • Nivel socioeconómico del evaluado (ESTU_NSE_INDIVIDUAL)

Como resumen tenemos información familiar, socioeconómica, academica (Trabajos de sus padres, cosas basicas materiales, titulaciones o nivel academico en el que petenezcan como su estrato) y laboral del estudiante como información personal, y detalle de como le fue en el icfes, ademas de saber donde estudia y presento el examen. Analizamos cada variable, sacamos las importantes, las categorizamos y sabemos que son, para que sirven y nos damos una idea de que podriamos hacer con ellas.

1.3 Importacion de los datasets

Como vimos al principio importamos un solo dataset SB11_20181.TXT para explorar sus columnas, para comprobar que todo este bien miremos el periodo.

df['PERIODO']
PERIODO
020181
120181
220181
320181
420181
......
1252220181
1252320181
1252420181
1252520181
1252620181

12527 rows × 1 columns

De momento esta todo bien, coincide con periodo y año con el archivo, asi que es hora de importar los demas años y guardarlos todos en una sola variable, si mantenemos variables separadas con datasets sera mucho mas complejo por lo que iremos trabajando y filtrando por la columna PERIODO.

import csv
import io
def read_csv_replace_null(file, encoding):
  with open(file, 'r', encoding=encoding, errors='replace') as f:
    content = f.read().replace('', '') # Reemplazar bytes nulos con una cadena vacía
    return pd.read_csv(io.StringIO(content), sep='¬', engine='python', quoting=csv.QUOTE_NONE, on_bad_lines='skip')
# Lista de nombres de archivos
files = ['SB11_20181.TXT', 'SB11_20182.TXT', 'SB11_20191_.txt', 'SB11_20192.TXT', 'SB11_20201.txt', 'SB11_20202.txt', 'SB11_20211.txt', 'SB11_20212.txt', 'SB11_20221.TXT', 'SB11_20231.TXT', 'SB11_20232.TXT']
# Comprensión de lista para leer todos los archivos y almacenarlos en una lista
# de DataFrames en uno solo, si el archivo es SB11_20222.TXT utilizamos las correciones correspondientes.
# el 2 if, es porque SB11*20191*.txt usa | en vez de ¬ para separar los datos, ademas de ser en minusculas las columnas...
saber11 = pd.concat(
[read_csv_replace_null(path+file, 'latin-1') if file == 'SB11_20222.TXT' else
pd.read_csv(path+file, sep='|', engine='python').rename(columns=str.upper) if file == 'SB11_20191_.txt' else
pd.read_csv(path+file, sep='¬', engine='python') for file in files],
ignore_index=True
)

1.4 Analizando y sanatizando datos.

Comprobemos que todo este bien, analizando cuantas columnas y alumnos tenemos (Antes habia 12mil), y si hay mas periodos, para poder trabajar.

saber11.shape

(2775282, 92)

Como vemos, tenemos 2m de datos con los que podemos trabajar, y 92 columnas, por lo que hay columnas nuevas añadidas, y unos doscientos cincuenta y cinco millones trescientos veinticinco mil novecientos cuarenta y cuatro de datos.. Así que debemos ver cuales son.

saber11.columns
Index(['ESTU_TIPODOCUMENTO', 'ESTU_NACIONALIDAD', 'ESTU_GENERO',
           'ESTU_FECHANACIMIENTO', 'PERIODO', 'ESTU_CONSECUTIVO',
           'ESTU_ESTUDIANTE', 'ESTU_PAIS_RESIDE', 'ESTU_TIENEETNIA', 'ESTU_ETNIA',
           'ESTU_DEPTO_RESIDE', 'ESTU_COD_RESIDE_DEPTO', 'ESTU_MCPIO_RESIDE',
           'ESTU_COD_RESIDE_MCPIO', 'FAMI_ESTRATOVIVIENDA', 'FAMI_PERSONASHOGAR',
           'FAMI_CUARTOSHOGAR', 'FAMI_EDUCACIONPADRE', 'FAMI_EDUCACIONMADRE',
           'FAMI_TRABAJOLABORPADRE', 'FAMI_TRABAJOLABORMADRE',
           'FAMI_TIENEINTERNET', 'FAMI_TIENESERVICIOTV', 'FAMI_TIENECOMPUTADOR',
           'FAMI_TIENELAVADORA', 'FAMI_TIENEHORNOMICROOGAS', 'FAMI_TIENEAUTOMOVIL',
           'FAMI_TIENEMOTOCICLETA', 'FAMI_TIENECONSOLAVIDEOJUEGOS',
           'FAMI_NUMLIBROS', 'FAMI_COMELECHEDERIVADOS',
           'FAMI_COMECARNEPESCADOHUEVO', 'FAMI_COMECEREALFRUTOSLEGUMBRE',
           'FAMI_SITUACIONECONOMICA', 'ESTU_DEDICACIONLECTURADIARIA',
           'ESTU_DEDICACIONINTERNET', 'ESTU_HORASSEMANATRABAJA',
           'ESTU_TIPOREMUNERACION', 'COLE_CODIGO_ICFES',
           'COLE_COD_DANE_ESTABLECIMIENTO', 'COLE_NOMBRE_ESTABLECIMIENTO',
           'COLE_GENERO', 'COLE_NATURALEZA', 'COLE_CALENDARIO', 'COLE_BILINGUE',
           'COLE_CARACTER', 'COLE_COD_DANE_SEDE', 'COLE_NOMBRE_SEDE',
           'COLE_SEDE_PRINCIPAL', 'COLE_AREA_UBICACION', 'COLE_JORNADA',
           'COLE_COD_MCPIO_UBICACION', 'COLE_MCPIO_UBICACION',
           'COLE_COD_DEPTO_UBICACION', 'COLE_DEPTO_UBICACION',
           'ESTU_PRIVADO_LIBERTAD', 'ESTU_COD_MCPIO_PRESENTACION',
           'ESTU_MCPIO_PRESENTACION', 'ESTU_DEPTO_PRESENTACION',
           'ESTU_COD_DEPTO_PRESENTACION', 'PUNT_LECTURA_CRITICA',
           'PERCENTIL_LECTURA_CRITICA', 'DESEMP_LECTURA_CRITICA',
           'PUNT_MATEMATICAS', 'PERCENTIL_MATEMATICAS', 'DESEMP_MATEMATICAS',
           'PUNT_C_NATURALES', 'PERCENTIL_C_NATURALES', 'DESEMP_C_NATURALES',
           'PUNT_SOCIALES_CIUDADANAS', 'PERCENTIL_SOCIALES_CIUDADANAS',
           'DESEMP_SOCIALES_CIUDADANAS', 'PUNT_INGLES', 'PERCENTIL_INGLES',
           'DESEMP_INGLES', 'PUNT_GLOBAL', 'PERCENTIL_GLOBAL',
           'ESTU_INSE_INDIVIDUAL', 'ESTU_NSE_INDIVIDUAL',
           'ESTU_NSE_ESTABLECIMIENTO', 'ESTU_ESTADOINVESTIGACION', 'ESTU_PILOPAGA',
           'ESTU_LIMITA_MOTRIZ', 'ESTU_GENERACION-E', 'ESTU_GENERACIONE',
           'PERCENTIL_ESPECIAL_GLOBAL', 'ESTU_AGREGADO', 'ESTU_PRESENTACIONSABADO',
           'SEED_CODIGOMEN', 'SEED_NOMBRE', 'ESTU_LENGUANATIVA',
           'ESTU_GENERACION'],
          dtype='object')

Estas serias las nuevas columnas

  1. ESTU_GENERACION-E
  2. ESTU_GENERACIONE
  3. PERCENTIL_ESPECIAL_GLOBAL
  4. ESTU_AGREGADO
  5. ESTU_PRESENTACIONSABADO
  6. SEED_CODIGOMEN
  7. SEED_NOMBRE
  8. ESTU_LENGUANATIVA
  9. ESTU_GENERACION

Las iremos ignorando en este analisis ya que no aportan tanto, ademas debemos tener encuenta los resultados en cada año no podemos ir añadiendo columnas nuevas, sin saber que en los anteriores años estas preguntas no estan respondidas por lo que habran muchas respuestas en NULL (sin respuesta).

# Consultamos si tenemos celdas con valores sin valores
null_counts = saber11.isnull().sum()
null_counts[null_counts > 0]
0
ESTU_GENERO219
ESTU_TIENEETNIA570590
ESTU_ETNIA2700179
ESTU_DEPTO_RESIDE1383
ESTU_COD_RESIDE_DEPTO1383
ESTU_MCPIO_RESIDE1383
ESTU_COD_RESIDE_MCPIO1383
FAMI_ESTRATOVIVIENDA175075
FAMI_PERSONASHOGAR98623
FAMI_CUARTOSHOGAR103634
FAMI_EDUCACIONPADRE153482
FAMI_EDUCACIONMADRE153885
FAMI_TRABAJOLABORPADRE111377
FAMI_TRABAJOLABORMADRE106420
FAMI_TIENEINTERNET156095
FAMI_TIENESERVICIOTV162269
FAMI_TIENECOMPUTADOR107012
FAMI_TIENELAVADORA102971
FAMI_TIENEHORNOMICROOGAS106871
FAMI_TIENEAUTOMOVIL109584
FAMI_TIENEMOTOCICLETA105170
FAMI_TIENECONSOLAVIDEOJUEGOS109449
FAMI_NUMLIBROS206262
FAMI_COMELECHEDERIVADOS179782
FAMI_COMECARNEPESCADOHUEVO163752
FAMI_COMECEREALFRUTOSLEGUMBRE175246
FAMI_SITUACIONECONOMICA108257
ESTU_DEDICACIONLECTURADIARIA159984
ESTU_DEDICACIONINTERNET165055
ESTU_HORASSEMANATRABAJA104407
ESTU_TIPOREMUNERACION109694
COLE_BILINGUE461550
COLE_CARACTER85283
ESTU_COD_MCPIO_PRESENTACION208
ESTU_MCPIO_PRESENTACION208
ESTU_DEPTO_PRESENTACION208
ESTU_COD_DEPTO_PRESENTACION208
PUNT_INGLES6843
PERCENTIL_INGLES6433
DESEMP_INGLES6433
PERCENTIL_GLOBAL6488
ESTU_INSE_INDIVIDUAL113465
ESTU_NSE_INDIVIDUAL113465
ESTU_NSE_ESTABLECIMIENTO16435
ESTU_PILOPAGA2762755
ESTU_LIMITA_MOTRIZ2775281
ESTU_GENERACION-E625850
ESTU_GENERACIONE2754199
PERCENTIL_ESPECIAL_GLOBAL2716195
ESTU_AGREGADO2762423
ESTU_PRESENTACIONSABADO2211850
SEED_CODIGOMEN2762578
SEED_NOMBRE2762578
ESTU_LENGUANATIVA2765972
ESTU_GENERACION2224133
saber11.describe().transpose()
countmeanstdmin25%50%75%max
PERIODO2775282.02.020557e+041.788081e+012.018100e+042.019400e+042.020400e+042.021400e+042.023400e+04
ESTU_COD_RESIDE_DEPTO2773899.04.028716e+018.555583e+025.000000e+001.100000e+012.300000e+015.400000e+019.999900e+04
ESTU_COD_RESIDE_MCPIO2773899.03.321133e+042.664617e+045.001000e+031.100100e+042.300100e+045.424500e+049.999900e+04
COLE_CODIGO_ICFES2775282.02.500845e+052.706402e+051.800000e+015.244900e+041.262010e+054.317340e+058.152660e+05
COLE_COD_DANE_ESTABLECIMIENTO2775282.02.073891e+119.406685e+101.050010e+111.180010e+111.760010e+113.080010e+118.548740e+11
COLE_COD_DANE_SEDE2775282.02.078808e+119.462532e+101.050010e+111.187530e+111.760010e+113.080010e+118.548740e+11
COLE_COD_MCPIO_UBICACION2775282.03.322695e+042.661775e+045.001000e+031.100100e+042.300100e+045.423900e+049.977300e+04
COLE_COD_DEPTO_UBICACION2775282.03.299041e+012.659654e+015.000000e+001.100000e+012.300000e+015.400000e+019.900000e+01
ESTU_COD_MCPIO_PRESENTACION2775074.03.319458e+042.668342e+045.001000e+031.100100e+042.300100e+045.417200e+049.977300e+04
ESTU_COD_DEPTO_PRESENTACION2775074.03.297709e+012.666027e+015.000000e+001.100000e+012.300000e+015.400000e+019.900000e+01
PUNT_LECTURA_CRITICA2775282.05.272982e+011.053381e+010.000000e+004.500000e+015.300000e+016.000000e+011.000000e+02
PERCENTIL_LECTURA_CRITICA2775282.05.006827e+012.896852e+011.000000e+002.500000e+015.000000e+017.500000e+011.000000e+02
DESEMP_LECTURA_CRITICA2775282.02.649610e+007.512747e-011.000000e+002.000000e+003.000000e+003.000000e+004.000000e+00
PUNT_MATEMATICAS2775282.05.085867e+011.214063e+010.000000e+004.200000e+015.100000e+015.900000e+011.000000e+02
PERCENTIL_MATEMATICAS2775282.05.010526e+012.895552e+011.000000e+002.500000e+015.000000e+017.500000e+011.000000e+02
DESEMP_MATEMATICAS2775282.02.455762e+007.551350e-011.000000e+002.000000e+003.000000e+003.000000e+004.000000e+00
PUNT_C_NATURALES2775282.04.907280e+011.066725e+010.000000e+004.100000e+014.800000e+015.700000e+011.000000e+02
PERCENTIL_C_NATURALES2775282.05.014289e+012.893142e+011.000000e+002.500000e+015.000000e+017.500000e+011.000000e+02
DESEMP_C_NATURALES2775282.02.070502e+007.646729e-011.000000e+002.000000e+002.000000e+003.000000e+004.000000e+00
PUNT_SOCIALES_CIUDADANAS2775282.04.787349e+011.216655e+010.000000e+003.800000e+014.700000e+015.700000e+011.000000e+02
PERCENTIL_SOCIALES_CIUDADANAS2775282.05.014310e+012.892459e+011.000000e+002.500000e+015.000000e+017.500000e+011.000000e+02
DESEMP_SOCIALES_CIUDADANAS2775282.02.001436e+008.346854e-011.000000e+001.000000e+002.000000e+003.000000e+004.000000e+00
PUNT_INGLES2768439.04.977864e+011.283478e+010.000000e+004.000000e+014.800000e+015.700000e+011.000000e+02
PERCENTIL_INGLES2768849.05.016052e+012.890562e+011.000000e+002.500000e+015.000000e+017.500000e+011.000000e+02
PUNT_GLOBAL2775282.02.505214e+025.165701e+010.000000e+002.110000e+022.470000e+022.870000e+025.000000e+02
PERCENTIL_GLOBAL2768794.05.002996e+012.896563e+011.000000e+002.500000e+015.000000e+017.500000e+011.000000e+02
ESTU_INSE_INDIVIDUAL2661817.05.057651e+019.703502e+001.134724e+014.385332e+015.025759e+015.669878e+018.483637e+01
ESTU_NSE_ESTABLECIMIENTO2758847.02.405172e+006.729321e-011.000000e+002.000000e+002.000000e+003.000000e+004.000000e+00
PERCENTIL_ESPECIAL_GLOBAL59087.05.041936e+012.888397e+011.000000e+002.500000e+015.000000e+017.500000e+011.000000e+02
SEED_CODIGOMEN12704.01.443476e+026.276720e+015.000000e+006.800000e+011.880000e+021.880000e+022.720000e+02

Saber los años y periodos de las pruebas saber11 que iremos trabajando.

saber11['PERIODO'].unique()
array([20181, 20182, 20191, 20194, 20201, 20204, 20211, 20214, 20221,
       20231, 20234])

Ya hemos identificado varios errores, y los hemos arreglado, ademas de que tenemos la columna PERIODO funcional, que era nuestro objetivo. Nuestro otro objetivo es saber que nuestra variable segunda mas importante (COLE_COD_DANE_SEDE) funcione bien, ya que con esta sabremos la ubicacion exacta de cada colegio.

saber11['COLE_COD_DANE_SEDE']
COLE_COD_DANE_SEDE
0319001002330
1319001002330
2319001002330
3319001002330
4319001002330
......
2775277117444000818
2775278117444000818
2775279173283000038
2775280173283000038
2775281223807002839

2775282 rows × 1 columns

saber11['COLE_COD_DANE_SEDE'] = saber11['COLE_COD_DANE_SEDE'].fillna(0).astype(int)

Con algunos ajustes hicimos que el codigo DANE de cada sede este bien formateado, ya que como vimos mas arriba era de tipo float64, es decir, decimal. Nosotros buscamos que nuestro codigo sea un entero. (Tenemos que cuidar nuestras variables como cientificos, ya que seran el resultado de nuestra investigacion).

Investigando un poco y mirando el funcionamiento del codigo interno de la web geoportal.dane.gov.co, podemos identificar con el codigo informacion tal como nombre, longitud, direccion, latitud, nombre, etc. Luego haremos una pequeña funcion para poder operar con esta web del gobierno.

# Comprobamos que nuestra variable categorica este bien
# aparte que nos damos una idea de que jornadas existen.
saber11['COLE_JORNADA'].unique()
array(['MAÑANA', 'COMPLETA', 'TARDE', 'NOCHE', 'UNICA', 'SABATINA'], dtype=object)
# Saber si el estudiante como su familia tienen internet. (Binaria)
saber11['FAMI_TIENEINTERNET'].unique()
array(['Si', 'No', nan], dtype=object)
# Lo mismo si tienen algun computador con el que trabajar. (Binaria)
saber11['FAMI_TIENECOMPUTADOR'].unique()
array(['Si', 'No', nan], dtype=object)
# Estrato del 0 al 6, donde 0 no tiene estrato. Luego las volveremos numericas.
saber11['FAMI_ESTRATOVIVIENDA'].unique()
array(['Estrato 3', 'Estrato 4', 'Estrato 1', 'Estrato 2', 'Estrato 5',
       'Estrato 6', nan, 'Sin Estrato'], dtype=object)
# Educacion del padre, probablemente lo manejemos como binaria.
saber11['FAMI_EDUCACIONPADRE'].unique()
array(['Secundaria (Bachillerato) completa',
       'Educación profesional completa', 'Primaria completa',
       'Técnica o tecnológica completa', 'Postgrado',
       'Secundaria (Bachillerato) incompleta', nan, 'No sabe',
       'Educación profesional incompleta', 'Primaria incompleta',
       'Ninguno', 'Técnica o tecnológica incompleta', 'No Aplica'],
      dtype=object)

2. FASE EXPLORACIÓN (VISUAL)

Para esta fase usaremos matploit para graficar, y seabor para simplificar la creación de gráficos complejos al proporcionar funciones de alto nivel para gráficos como diagramas de dispersión con líneas de regresión, matrices de correlación, gráficos de distribución conjunta, diagramas de violín y mucho más.

import matplotlib.pyplot as plt
import seaborn as sns

Por ejemplo, si queremos ver histogramas de cada variable. Luego iremos combinandolas para sacar las conclusiones objetivo que tenemos.

saber11.hist(figsize=(30,35))
plt.show()

Es hora de combinar variables para nuestros histogramas y sacar conclusiones. Pero antes, busquemos nuestro colegio preferido.

instuto = saber11[saber11['COLE_NOMBRE_ESTABLECIMIENTO'].str.contains('COLEGIO INSTITUTO TECNICO INTERNACIONAL', case=False)]['COLE_NOMBRE_ESTABLECIMIENTO']
instuto
COLE_NOMBRE_ESTABLECIMIENTO
28813COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
30925COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
31056COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
40353COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
42675COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
......
2734602COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
2739100COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
2758677COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
2760805COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)
2762246COLEGIO INSTITUTO TECNICO INTERNACIONAL (IED)

794 rows × 1 columns

import numpy as np
# Obtener los datos únicos de 'PERIODO' y 'PUNT_MATEMATICAS'
periodos = saber11['PERIODO'].unique()
puntajes = saber11['PUNT_MATEMATICAS']
# Ordenar los períodos de forma cronológica y alinear con los puntajes correspondientes
periodos_ordenados, puntajes_ordenados = zip(*sorted(zip(periodos, puntajes)))
# Crear el gráfico
fig, ax = plt.subplots(figsize=(10, 6))
bar_width = 0.6
bar_positions = np.arange(len(periodos_ordenados))
# Barras
bars = ax.bar(bar_positions, puntajes_ordenados, bar_width, color='skyblue', edgecolor='black')
# Línea de tendencia
z = np.polyfit(bar_positions, puntajes_ordenados, 1)
p = np.poly1d(z)
ax.plot(bar_positions, p(bar_positions), 'r--', linewidth=2, label='Tendencia')
# Etiquetas y título
ax.set_xlabel('Período', fontsize=12)
ax.set_ylabel('Puntaje en Matemáticas', fontsize=12)
ax.set_title('Puntaje en Matemáticas por Período', fontsize=14, fontweight='bold')
ax.set_xticks(bar_positions)
ax.set_xticklabels(periodos_ordenados, rotation=45, ha='right')
# Anotaciones
covid_start = 20201 # Período de inicio del COVID-19
covid_end = 20211 # Período de cierre del COVID-19
ax.annotate('Inicio del COVID-19', xy=(periodos_ordenados.index(covid_start), puntajes_ordenados[periodos_ordenados.index(covid_start)]),
xytext=(0.2, 0.9), textcoords='axes fraction', fontsize=10,
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='left', verticalalignment='top')
ax.annotate('Cierre del COVID-19', xy=(periodos_ordenados.index(covid_end), puntajes_ordenados[periodos_ordenados.index(covid_end)]),
xytext=(0.8, 0.9), textcoords='axes fraction', fontsize=10,
arrowprops=dict(facecolor='black', shrink=0.05),
horizontalalignment='right', verticalalignment='top')
# Leyenda
ax.legend(fontsize=10)
# Ajustar márgenes y espaciado
plt.tight_layout()

Puntaje de Matematicas en Promedio por Disponibilidad de Computador en el Hogar

# Calculamos el puntaje promedio por disponibilidad de computador en el hogar
puntajes_promedio = saber11.groupby('FAMI_TIENECOMPUTADOR')['PUNT_MATEMATICAS'].mean()
ax = puntajes_promedio.plot(kind='bar', figsize=(6, 6), color='skyblue', edgecolor='black', linewidth=1.5)
# Configuramos etiquetas y título
ax.set_xlabel('Disponibilidad de Computador en el Hogar', fontsize=12)
ax.set_ylabel('Puntaje Global Promedio', fontsize=12)
ax.set_title('Puntaje de Matematicas en Promedio por Disponibilidad de Computador en el Hogar', fontsize=14, fontweight='bold')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

Calcular el puntaje promedio de matemáticas por acceso a internet en el hogar

# Calculamos el puntaje promedio de matemáticas por acceso a internet en el hogar
puntajes_promedio = saber11.groupby('FAMI_TIENEINTERNET')['PUNT_MATEMATICAS'].mean()
# Creamos el gráfico de barras
ax = puntajes_promedio.plot(kind='bar', figsize=(6, 6), color='skyblue', edgecolor='black', linewidth=1.5)
# Configuramos etiquetas y título
ax.set_xlabel('Acceso a Internet en el Hogar', fontsize=12)
ax.set_ylabel('Puntaje Promedio de Matemáticas', fontsize=12)
ax.set_title('Puntaje Promedio de Matemáticas por Acceso a Internet en el Hogar', fontsize=14, fontweight='bold')
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()

Calcular el puntaje promedio de matemáticas por nivel socioeconómico del establecimiento

# Calculamos el puntaje promedio de matemáticas por nivel socioeconómico del establecimiento
puntajes_promedio = saber11.groupby('ESTU_NSE_ESTABLECIMIENTO')['PUNT_MATEMATICAS'].mean()
# Crear el gráfico de barras
ax = puntajes_promedio.plot(kind='bar', figsize=(8, 6), color='skyblue', edgecolor='black', linewidth=1.5)
# Configurar etiquetas y título
ax.set_xlabel('Nivel Socioeconómico del Establecimiento', fontsize=12)
ax.set_ylabel('Puntaje Promedio de Matemáticas', fontsize=12)
ax.set_title('Puntaje Promedio de Matemáticas por Nivel Socioeconómico del Establecimiento', fontsize=14, fontweight='bold')
# Ajustamos la rotación de las etiquetas del eje x
plt.xticks(rotation=0)
# Ajustar márgenes y espaciado
plt.tight_layout()
plt.show()

Calcular el puntaje promedio de matemáticas por jornada académica

# Calculamos el puntaje promedio de matemáticas por jornada académica
puntajes_promedio = saber11.groupby('COLE_JORNADA')['PUNT_MATEMATICAS'].mean()
# Creamos el gráfico de barras
ax = puntajes_promedio.plot(kind='bar', figsize=(8, 6), color='skyblue', edgecolor='black', linewidth=1.5)
# Configuramos etiquetas y título
ax.set_xlabel('Jornada Académica', fontsize=12)
ax.set_ylabel('Puntaje Promedio de Matemáticas', fontsize=12)
ax.set_title('Puntaje Promedio de Matemáticas por Jornada Académica', fontsize=14, fontweight='bold')
# Ajustamos la rotación de las etiquetas del eje x
plt.xticks(rotation=0)
# Ajustamos márgenes y espaciado
plt.tight_layout()
plt.show()

Puntaje Promedio de Matemáticas de los estudiantes por Nivel Educativo de los Padres

# Calculamos el puntaje promedio de matemáticas por nivel educativo del padre
puntajes_promedio_padre = saber11.groupby('FAMI_EDUCACIONPADRE')['PUNT_MATEMATICAS'].mean()
# Calculamos el puntaje promedio de matemáticas por nivel educativo de la madre
puntajes_promedio_madre = saber11.groupby('FAMI_EDUCACIONMADRE')['PUNT_MATEMATICAS'].mean()
# Creamos el gráfico de barras para el nivel educativo del padre
ax1 = puntajes_promedio_padre.plot(kind='bar', figsize=(10, 6), color='skyblue', edgecolor='black', linewidth=1.5, position=1, width=0.4)
# Creamos el gráfico de barras para el nivel educativo de la madre
ax2 = puntajes_promedio_madre.plot(kind='bar', figsize=(10, 6), color='lightgreen', edgecolor='black', linewidth=1.5, position=0, width=0.4)
# Configuramos etiquetas y título
ax1.set_xlabel('Nivel Educativo de los Padres', fontsize=12)
ax1.set_ylabel('Puntaje Promedio de Matemáticas', fontsize=12)
ax1.set_title('Puntaje Promedio de Matemáticas de los estudiantes por Nivel Educativo de los Padres', fontsize=14, fontweight='bold')
# Crear la leyenda
ax1.legend(['Padre', 'Madre'], loc='upper right')
# Ajustar la rotación de las etiquetas del eje x
plt.xticks(rotation=45, ha='right')
# Ajustar márgenes y espaciado
plt.tight_layout()
plt.show()

Relación entre INSE y Puntaje de Matemáticas

# Crear el gráfico de dispersión
plt.figure(figsize=(8, 6))
plt.scatter(saber11['ESTU_INSE_INDIVIDUAL'], saber11['PUNT_MATEMATICAS'], alpha=0.5)
# Configurar etiquetas y título
plt.xlabel('Índice Socioeconómico Individual (INSE)', fontsize=12)
plt.ylabel('Puntaje de Matemáticas', fontsize=12)
plt.title('Relación entre INSE y Puntaje de Matemáticas', fontsize=14, fontweight='bold')
# Ajustar márgenes y espaciado
plt.tight_layout()
plt.show()
  • A medida que aumenta el INSE, la dispersión de los puntos se reduce gradualmente. Esto indica que, en general, los estudiantes de estratos socioeconómicos más altos tienden a tener puntajes de matemáticas más consistentes y agrupados en un rango más estrecho.

  • La dispersión de los puntos es mayor en los niveles más bajos del INSE (por debajo de 40). Esto sugiere que entre los estudiantes de estratos socioeconómicos más bajos, hay una mayor variabilidad en los puntajes de matemáticas. Algunos estudiantes de estos estratos obtienen puntajes relativamente altos, mientras que otros obtienen puntajes bajos.

  • Hay algunos valores atípicos en el gráfico, especialmente en los niveles más altos del INSE (por encima de 80). Estos puntos representan estudiantes con puntajes de matemáticas excepcionalmente altos en relación con su INSE. Sería interesante investigar las características y circunstancias específicas de estos estudiantes.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler, MaxAbsScaler
# Seleccionar las variables de interés
variables = [
"PERIODO",
"PUNT_MATEMATICAS",
"ESTU_GENERO",
"FAMI_TIENECOMPUTADOR",
"FAMI_TIENEINTERNET",
"FAMI_ESTRATOVIVIENDA",
"COLE_COD_DANE_SEDE",
"COLE_COD_MCPIO_UBICACION",
"COLE_NATURALEZA",
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'COLE_JORNADA',
'COLE_BILINGUE',
'COLE_CARACTER',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'ESTU_DEDICACIONLECTURADIARIA',
'ESTU_DEDICACIONINTERNET',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENELAVADORA',
'FAMI_TIENEHORNOMICROOGAS',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'ESTU_HORASSEMANATRABAJA',
"COLE_JORNADA"
]
# Normalizamos y usamos solo las variables objetivos que tenemos como interes.
saber11_n = saber11[variables]
saber11_n
PERIODOPUNT_MATEMATICASESTU_GENEROFAMI_TIENECOMPUTADORFAMI_TIENEINTERNETFAMI_ESTRATOVIVIENDACOLE_COD_DANE_SEDECOLE_COD_MCPIO_UBICACIONCOLE_NATURALEZAFAMI_EDUCACIONPADRE...FAMI_TIENELAVADORAFAMI_TIENEHORNOMICROOGASFAMI_TIENEAUTOMOVILFAMI_TIENEMOTOCICLETAFAMI_TIENECONSOLAVIDEOJUEGOSFAMI_COMELECHEDERIVADOSFAMI_COMECARNEPESCADOHUEVOFAMI_COMECEREALFRUTOSLEGUMBREESTU_HORASSEMANATRABAJACOLE_JORNADA
02018146FSiSiEstrato 331900100233019001NO OFICIALSecundaria (Bachillerato) completa...SiSiNoNoNoTodos o casi todos los díasTodos o casi todos los días3 a 5 veces por semana0MAÑANA
12018162MSiSiEstrato 431900100233019001NO OFICIALEducación profesional completa...SiSiSiSiSiTodos o casi todos los díasTodos o casi todos los días1 o 2 veces por semana0MAÑANA
22018143FNoNoEstrato 131900100233019001NO OFICIALSecundaria (Bachillerato) completa...NoNoNoNoNoTodos o casi todos los díasNunca o rara vez comemos esoTodos o casi todos los días0MAÑANA
32018175MSiNoEstrato 131900100233019001NO OFICIALPrimaria completa...NoSiSiNoSiTodos o casi todos los díasTodos o casi todos los díasNunca o rara vez comemos eso0MAÑANA
42018162FSiSiEstrato 231900100233019001NO OFICIALTécnica o tecnológica completa...NoNoNoNoNoTodos o casi todos los días3 a 5 veces por semana1 o 2 veces por semana0MAÑANA
..................................................................
27752772023438FNoSiEstrato 211744400081817444OFICIALPrimaria completa...NoNoNoNoNo1 o 2 veces por semanaTodos o casi todos los días1 o 2 veces por semana0UNICA
27752782023448FNoSiEstrato 111744400081817444OFICIALSecundaria (Bachillerato) completa...SiNoNoSiNo3 a 5 veces por semanaNunca o rara vez comemos esoTodos o casi todos los días0UNICA
27752792023461FNoNoEstrato 117328300003873283OFICIALPrimaria completa...SiNoNoNoNo1 o 2 veces por semana3 a 5 veces por semanaNunca o rara vez comemos eso0UNICA
27752802023473FSiSiEstrato 317328300003873283OFICIALEducación profesional completa...SiSiSiNoNo3 a 5 veces por semanaTodos o casi todos los días3 a 5 veces por semana0UNICA
27752812023443FNoNoEstrato 122380700283923807OFICIALSecundaria (Bachillerato) completa...SiNoNoSiNo1 o 2 veces por semana1 o 2 veces por semana3 a 5 veces por semana0UNICA

2775282 rows × 30 columns

saber11_n['PERIODO'].unique()
array([20181, 20182, 20191, 20194, 20201, 20204, 20211, 20214, 20221,
           20231, 20234])
# Filtrar los datos por colegios públicos de Bogotá
saber11_n = saber11_n[(saber11_n['COLE_COD_MCPIO_UBICACION'] == 11001)]
saber11_n['PERIODO'].unique()
array([20181, 20182, 20191, 20194, 20201, 20204, 20211, 20214, 20221,
           20231, 20234])
# Convertir variables categóricas a variables dummy
saber11_n = pd.get_dummies(
data=saber11_n,
prefix="OHE",
prefix_sep="_",
columns=[
"ESTU_GENERO",
"FAMI_ESTRATOVIVIENDA",
"COLE_NATURALEZA",
'FAMI_EDUCACIONPADRE',
'FAMI_EDUCACIONMADRE',
'COLE_JORNADA',
'COLE_BILINGUE',
'COLE_CARACTER',
'FAMI_PERSONASHOGAR',
'FAMI_CUARTOSHOGAR',
'ESTU_DEDICACIONLECTURADIARIA',
'ESTU_DEDICACIONINTERNET',
'FAMI_TRABAJOLABORPADRE',
'FAMI_TRABAJOLABORMADRE',
'FAMI_TIENELAVADORA',
'FAMI_TIENEHORNOMICROOGAS',
'FAMI_TIENEAUTOMOVIL',
'FAMI_TIENEMOTOCICLETA',
'FAMI_TIENECONSOLAVIDEOJUEGOS',
'FAMI_COMELECHEDERIVADOS',
'FAMI_COMECARNEPESCADOHUEVO',
'FAMI_COMECEREALFRUTOSLEGUMBRE',
'ESTU_HORASSEMANATRABAJA',
],
drop_first=True,
dtype="int8",
)
saber11*n = pd.get_dummies(
data=saber11_n,
prefix=["FAMI_TIENECOMPUTADOR", "FAMI_TIENEINTERNET"], # Especificar prefijos diferentes para cada variable
prefix_sep="*",
columns=["FAMI_TIENECOMPUTADOR", "FAMI_TIENEINTERNET"], # Especificar las columnas a codificar
drop_first=True,
dtype="int8",
)
saber11_n
PERIODOPUNT_MATEMATICASCOLE_COD_DANE_SEDECOLE_COD_MCPIO_UBICACIONOHE_MOHE_Estrato 2OHE_Estrato 3OHE_Estrato 4OHE_Estrato 5OHE_Estrato 6...OHE_Todos o casi todos los díasOHE_3 a 5 veces por semanaOHE_Nunca o rara vez comemos esoOHE_Todos o casi todos los díasOHE_Entre 11 y 20 horasOHE_Entre 21 y 30 horasOHE_Menos de 10 horasOHE_Más de 30 horasFAMI_TIENECOMPUTADOR_SiFAMI_TIENEINTERNET_Si
266201817431100104266711001100001...1001000011
267201817831100104266711001000000...0000000000
268201817831100104266711001000010...1100000011
269201816031100104266711001000100...0001000010
270201816331100104266711001000001...1100000011
..................................................................
2775242202344431100100545111001000000...1100000011
2775259202342511100104438511001100000...0000000000
2775260202344111100101092811001100000...0000000000
2775264202342611100104438511001100000...0000000000
2775267202343311100104438511001100000...0000000000

423240 rows × 109 columns

Revisamos las nuevas columnas añadidas recientemente.

saber11_n.columns
Index(['PERIODO', 'PUNT_MATEMATICAS', 'COLE_COD_DANE_SEDE',
       'COLE_COD_MCPIO_UBICACION', 'OHE_M', 'OHE_Estrato 2', 'OHE_Estrato 3',
       'OHE_Estrato 4', 'OHE_Estrato 5', 'OHE_Estrato 6',
       ...
       'OHE_Todos o casi todos los días', 'OHE_3 a 5 veces por semana',
       'OHE_Nunca o rara vez comemos eso', 'OHE_Todos o casi todos los días',
       'OHE_Entre 11 y 20 horas', 'OHE_Entre 21 y 30 horas',
       'OHE_Menos de 10 horas', 'OHE_Más de 30 horas',
       'FAMI_TIENECOMPUTADOR_Si', 'FAMI_TIENEINTERNET_Si'],
      dtype='object', length=109)
# Dividir los datos en conjuntos de entrenamiento y prueba
X = saber11_n.drop('PUNT_MATEMATICAS', axis=1)
y = saber11_n['PUNT_MATEMATICAS']
# Escalamos la variable charges para hacerla más estandar
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
#Los algoritmos de preprocessing de sklearn están preparados para convertir matrices por lo que tenemos que hacer una transformación de nuestra variable y
# ya que es una variable de tipo Series
# para ello hacemos un .to_numpy() que nos convierte la serie en un array y luego hacemos reshape (-1,1) que transforma un array de 1xn en una matriz de nx1
y = scaler.fit_transform(y.to_numpy().reshape(-1,1))
# Volvemos a transformar nuestra variable en un array de 1xn
y=y.reshape(1,-1)[0]
# Escalar los datos utilizando MaxAbsScaler
scaler = MaxAbsScaler()
X_scaled = scaler.fit_transform(X)
# preparamos train data y test data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=43)
# Reemplazar NaN con ceros
X_train = X_train.fillna(0)
X_test = X_test.fillna(0)
# Crear y entrenar el modelo de regresión lineal múltiple
regresion_lineal=LinearRegression()
regresion_lineal.fit(X_train, y_train)
# FASE VALIDACION
# predecimos los valores y para los datos usados en el entrenamiento
prediccion_entrenamiento = regresion_lineal.predict(X_train)
# calculamos el Error Cuadrático Medio (MSE = Mean Squared Error)
mse_hipot5_train = mean_squared_error(y_true = y_train, y_pred = prediccion_entrenamiento)
print('Error Cuadrático Medio (MSE) HIPO 1 TRAIN= ' + str(mse_hipot5_train))
# predecimos los valores y para los datos usados en el entrenamiento
prediccion_entrenamiento = regresion_lineal.predict(X_test)
# calculamos el Error Cuadrático Medio (MSE = Mean Squared Error)
mse_hipot5_test = mean_squared_error(y_true = y_test, y_pred = prediccion_entrenamiento)
print('Error Cuadrático Medio (MSE) HIPO 1 TEST= ' + str(mse_hipot5_test))
Error Cuadrático Medio (MSE) HIPO 1 TRAIN= 0.9305982848337508
Error Cuadrático Medio (MSE) HIPO 1 TEST= 0.9253285091410614
# Gráfico de residuos
residuos = y_test - prediccion_entrenamiento
plt.figure(figsize=(8, 6))
plt.scatter(prediccion_entrenamiento, residuos, color='blue', alpha=0.5)
plt.xlabel('Valores Predichos')
plt.ylabel('Residuos')
plt.title('Gráfico de Residuos')
plt.hlines(y=0, xmin=prediccion_entrenamiento.min(), xmax=prediccion_entrenamiento.max(), color='red', linestyle='--', lw=2)
plt.show()
# Importancia de las variables
importancia_variables = pd.DataFrame({'Variable': X.columns, 'Importancia': regresion_lineal.coef_})
importancia_variables = importancia_variables.sort_values(by='Importancia', ascending=False)
plt.figure(figsize=(40, 38))
sns.barplot(x='Importancia', y='Variable', data=importancia_variables)
plt.title('Importancia de las Variables')
plt.xlabel('Importancia')
plt.ylabel('Variable')
plt.show()
saber11_n['PERIODO'].unique()
array([20181, 20182, 20191, 20194, 20201, 20204, 20211, 20214, 20221,
       20231, 20234])
# Analizar el impacto del cierre de escuelas por COVID-19
periodos_antes_covid = [20181, 20182,20191, 20194]
periodos_durante_covid = [20201, 20204, 20211, 20214]
periodos_despues_covid = [20221, 20231, 20234, 20234]
datos_antes_covid = saber11_n[saber11_n['PERIODO'].isin(periodos_antes_covid)]
datos_durante_covid = saber11_n[saber11_n['PERIODO'].isin(periodos_durante_covid)]
datos_despues_covid = saber11_n[saber11_n['PERIODO'].isin(periodos_despues_covid)]
puntaje_promedio_antes_covid = datos_antes_covid['PUNT_MATEMATICAS'].mean()
puntaje_promedio_durante_covid = datos_durante_covid['PUNT_MATEMATICAS'].mean()
puntaje_promedio_despues_covid = datos_despues_covid['PUNT_MATEMATICAS'].mean()
print("Puntaje promedio antes del COVID-19:", puntaje_promedio_antes_covid)
print("Puntaje promedio durante el COVID-19:", puntaje_promedio_durante_covid)
print("Puntaje promedio después del COVID-19:", puntaje_promedio_despues_covid)
Puntaje promedio antes del COVID-19: 54.76147510590245
Puntaje promedio durante el COVID-19: 54.68657360062099
Puntaje promedio después del COVID-19: 55.43896821185664
saber11_n['COLE_COD_DANE_SEDE']
COLE_COD_DANE_SEDE
266311001042667
267311001042667
268311001042667
269311001042667
270311001042667
......
2775242311001005451
2775259111001044385
2775260111001010928
2775264111001044385
2775267111001044385

423240 rows × 1 columns

import geopandas as gpd
from shapely.geometry import Point
# localidades de Bogotá D.C
localidades_shp = gpd.read_file("/content/drive/MyDrive/icfes/bogota/localidades.shp")
localidades_shp
OBJECTIDNOMBRECODIGO_LOCDECRETOLINKSIMBOLOESCALA_CAPFECHA_CAPTSHAPE_AREASHAPE_LENgeometry
01SANTA FE3Acuerdo 117 de 2003NoneNoneNoneNaT4.517065e+0743779.905440POLYGON ((100996.362 103506.019, 101013.606 10...
111PUENTE ARANDA16Acuerdo 8 de 1977NoneNoneNoneNaT1.731115e+0717854.555403POLYGON ((95475.458 104555.873, 95837.202 1049...
213CIUDAD BOLIVAR19Acuerdo 14 de 1983NoneNoneNoneNaT1.299864e+0877732.027669POLYGON ((91716.74 100390.427, 91714.771 10033...
36BARRIOS UNIDOS12Acuerdo 8 de 1977NoneNoneNoneNaT1.190345e+0713426.542795POLYGON ((102251.61 110024.092, 101669.946 106...
42SUBA11Acuerdo 8 de 1977NoneNoneNoneNaT1.005606e+0865665.349126POLYGON ((103891.168 125935.111, 103894.608 12...
514ANTONIO NARIÑO15Acuerdo 117 de 2003NoneNoneNoneNaT4.879543e+0612085.873823POLYGON ((94092.947 99681.858, 94269.388 99673...
620CANDELARIA17Acuerdo 117 de 2003NoneNoneNoneNaT2.060243e+067444.083075POLYGON ((101257.966 100768.507, 101258.45 100...
74ENGATIVA10Acuerdo 8 de 1977NoneNoneNoneNaT3.588097e+0732351.036738POLYGON ((94467.113 115606.642, 94463.029 1157...
85FONTIBON9Acuerdo 8 de 1977NoneNoneNoneNaT3.328100e+0735674.375625POLYGON ((91349.527 113469.012, 91426.279 1134...
917SAN CRISTOBAL4Acuerdo 117 de 2003NoneNoneNoneNaT4.909850e+0740291.316126POLYGON ((101322.246 98588.942, 101325.293 985...
108TEUSAQUILLO13Acuerdo 8 de 1977NoneNoneNoneNaT1.419317e+0716432.566183POLYGON ((98204.005 107725.863, 98248.098 1076...
113USAQUEN1Acuerdo 8 de 1977NoneNoneNoneNaT6.531573e+0746996.167978POLYGON ((102251.61 110024.092, 103089.422 115...
127CHAPINERO2Acuerdo 8 de 1977NoneNoneNoneNaT3.815586e+0736833.382799POLYGON ((102251.61 110024.092, 102811.332 109...
1318USME5Acuerdo 15 de 1993NoneNoneNoneNaT2.150664e+08108895.163760POLYGON ((94611.356 94313.174, 94612.246 94313...
1419SUMAPAZ20Acuerdo 9 de 1986NoneNoneNoneNaT7.809523e+08216244.441198POLYGON ((92731.192 67235.182, 92781.136 67270...
1516RAFAEL URIBE URIBE18Acuerdo 117 de 2003NoneNoneNoneNaT1.383408e+0719333.547847POLYGON ((94395.307 99591.788, 94424.204 99568...
1615TUNJUELITO6Acuerdo 117 de 2003NoneNoneNoneNaT9.910940e+0623330.007022POLYGON ((93314.583 99851.296, 93993.58 99712....
1712LOS MARTIRES14Acuerdo 8 de 1977NoneNoneNoneNaT6.514046e+0611013.197559POLYGON ((100522.914 102123.105, 100491.468 10...
189KENNEDY8Acuerdo 8 de 1977NoneNoneNoneNaT3.858973e+0731422.417887POLYGON ((91005.069 107357.708, 91018.543 1073...
1910BOSA7Acuerdo 14 de 1983NoneNoneNoneNaT2.393545e+0734117.517640POLYGON ((87997.629 105621.791, 88093.812 1053...
import pickle
import requests
from requests.exceptions import ConnectTimeout
from requests.adapters import HTTPAdapter
session = requests.Session()
connect_timeout = 0.1
read_timeout = 10
datos_colegios = {}
localidades_fallidas = []
proxies = {
'http': 'http://188.114.96.20:80',
}
def obtener_datos_localidad(localidad, datos_colegios):
  datos_localidad = saber11_n[saber11_n['COLE_COD_DANE_SEDE'] == localidad]
  puntaje_promedio_localidad = datos_localidad['PUNT_MATEMATICAS'].mean()
  url = f"https://geoportal.dane.gov.co/laboratorio/serviciosjson/visor_sise/buscadorv2.php?palabra={localidad}"
  try:
    response = session.get(url, proxies=proxies)
    if response.status_code == 200:
      data = response.json()
      if data["estado"] and len(data["resultado"]) > 0:
        resultado = data["resultado"][0]
        latitud = resultado["LATITUD"]
        longitud = resultado["LONGITUD"]
        datos_colegios[localidad] = {
        "puntaje_promedio": puntaje_promedio_localidad,
        "latitud": latitud,
        "longitud": longitud
        }
      else:
        print(f"Error en la solicitud a la API del DANE para el código {localidad}")
      except ConnectTimeout:
        print(f"Error de ConnectTimeout para la localidad {localidad} e intentos {i}")
        localidades_fallidas.append(localidad)
localidades = saber11_n['COLE_COD_DANE_SEDE'].unique()
#for localidad in localidades:
  #  obtener_datos_localidad(localidad, datos_colegios)
# Reintentar obtener datos para las localidades fallidas
# for localidad in localidades_fallidas:
  #    obtener_datos_localidad(localidad, datos_colegios)
# Usarse si quiere volver a usar el for
# Guardar los datos en un archivo utilizando pickle
# with open('datos_colegios.pkl', 'wb') as archivo:
  #    pickle.dump(datos_colegios, archivo)
# Cargar los datos desde el archivo utilizando pickle
with open('/content/drive/MyDrive/icfes/datos_colegios.pkl', 'rb') as archivo:
  datos_colegios = pickle.load(archivo)
len(datos_colegios)
1252
datolocalidades_shp["area"] = localidades_shp.area
localidades_shp["area"]
area
04.517065e+07
11.731115e+07
21.299864e+08
31.190345e+07
41.005606e+08
54.879543e+06
62.060243e+06
73.588097e+07
83.328100e+07
94.909850e+07
101.419317e+07
116.531573e+07
123.815586e+07
132.150664e+08
147.809523e+08
151.383408e+07
169.910940e+06
176.514046e+06
183.858973e+07
192.393545e+07
localidades_shp["perimetro"] = localidades_shp.boundary
localidades_shp["NOMBRE"] = localidades_shp.NOMBRE
localidades_shp["centroide"] = localidades_shp.centroid
punto_inicial = localidades_shp["centroide"].iloc[0]
localidades_shp["distancia"] = localidades_shp["centroide"].distance(punto_inicial)
localidades_shp["distancia"]
distancia
00.000000
18721.119096
218630.258749
39333.201006
419231.446216
57418.334999
63990.679376
714611.909834
814828.435114
96001.140480
107584.230824
1116412.080486
125643.472536
1325477.855485
1466360.150822
159088.162443
1611276.094681
175924.795690
1813538.483689
1917825.275539
def asignar_categoria(puntaje):
  if puntaje <= 49:
    return 'Bajo'
  elif puntaje >= 50 and puntaje < 60:
    return 'Medio'
  elif puntaje >= 60 and puntaje <= 70:
    return 'Alto'
  else:
    return 'Muy Alto'
colegios_data = pd.DataFrame(datos_colegios).T.reset_index()
colegios_data.columns = ['COLE_COD_DANE_SEDE', 'puntaje_promedio', 'latitud', 'longitud']
colegios_data['latitud'] = pd.to_numeric(colegios_data['latitud'])
colegios_data['longitud'] = pd.to_numeric(colegios_data['longitud'])
colegios_data['geometry'] = colegios_data.apply(lambda row: Point(row['longitud'], row['latitud']), axis=1)
colegios_data['categoria'] = colegios_data['puntaje_promedio'].apply(asignar_categoria)
colegios_geo = gpd.GeoDataFrame(colegios_data, geometry='geometry')
colegios_geo.crs = {'init': 'epsg:4326'}  # Sistema de coordenadas WGS84
localidades_shp = localidades_shp.to_crs(epsg=3116)
colegios_geo = colegios_geo.to_crs(epsg=3116)
conteo_categorias = colegios_geo.groupby('categoria').size().reset_index(name='cantidad')
colores = {'Bajo': 'red', 'Medio': 'orange', 'Alto': 'lightgreen', 'Muy Alto': 'darkgreen'}
fig, ax = plt.subplots(figsize=(62, 48))
localidades_shp.plot(ax=ax, alpha=0.5, edgecolor='black')
for categoria, datos in colegios_geo.groupby('categoria'):
  datos.plot(ax=ax, markersize=20, color=colores[categoria], label=categoria)
  leyenda_labels = [f"{categoria} ({cantidad})" for categoria, cantidad in zip(conteo_categorias['categoria'], conteo_categorias['cantidad'])]
  ax.legend(labels=leyenda_labels, title='Categorías (Cantidad de Colegios)')
  ax.set_title('Colegios de Bogotá - Categorías de Puntaje Promedio de Matemáticas')
  ax.set_xlabel('Longitud')
  ax.set_ylabel('Latitud')
  plt.show()
colegios_localidades = gpd.sjoin(colegios_geo, localidades_shp, predicate='within')
promedios_localidades = colegios_localidades.groupby('NOMBRE')['puntaje_promedio'].mean().reset_index()
promedios_localidades['puntaje_promedio'] = pd.to_numeric(promedios_localidades['puntaje_promedio'], errors='coerce')
mejor_localidad = promedios_localidades.loc[promedios_localidades['puntaje_promedio'].idxmax(), 'NOMBRE']
mejor_promedio = promedios_localidades.loc[promedios_localidades['puntaje_promedio'].idxmax(), 'puntaje_promedio']
fig, ax = plt.subplots(figsize=(34, 28))
localidades_shp.plot(ax=ax, alpha=0.5, edgecolor='black')
for categoria, datos in colegios_geo.groupby('categoria'):
  datos.plot(ax=ax, markersize=20, color=colores[categoria], label=categoria)
  leyenda_labels = [f"{categoria} ({cantidad})" for categoria, cantidad in zip(conteo_categorias['categoria'], conteo_categorias['cantidad'])]
  ax.legend(labels=leyenda_labels, title='Categorías (Cantidad de Colegios)')
  ax.set_title(f'Colegios de Bogotá - Categorías de Puntaje Promedio de Matemáticas
  Localidad con mejor promedio: {mejor_localidad} ({mejor_promedio:.2f})')
  ax.set_xlabel('Longitud')
  ax.set_ylabel('Latitud')
  plt.show()
localidades_shp.plot("NOMBRE", figsize=(22, 8))
localidades_shp.head()
OBJECTIDNOMBRECODIGO_LOCDECRETOLINKSIMBOLOESCALA_CAPFECHA_CAPTSHAPE_AREASHAPE_LENgeometryareaperimetrocentroidedistancia
01SANTA FE3Acuerdo 117 de 2003NoneNoneNoneNaT4.517065e+0743779.905440POLYGON ((1000992.557 1003507.35, 1001009.803 ...4.517065e+07MULTILINESTRING ((100996.362 103506.019, 10101...POINT (104587.385 99751.307)0.000000
111PUENTE ARANDA16Acuerdo 8 de 1977NoneNoneNoneNaT1.731115e+0717854.555403POLYGON ((995473.963 1004557.322, 995835.597 1...1.731115e+07LINESTRING (95475.458 104555.873, 95837.202 10...POINT (96221.311 102214.378)8721.119096
213CIUDAD BOLIVAR19Acuerdo 14 de 1983NoneNoneNoneNaT1.299864e+0877732.027669POLYGON ((991716.342 1000393.903, 991714.368 1...1.299864e+08LINESTRING (91716.74 100390.427, 91714.771 100...POINT (90628.777 87412.595)18630.258749
36BARRIOS UNIDOS12Acuerdo 8 de 1977NoneNoneNoneNaT1.190345e+0713426.542795POLYGON ((1002247.94 1010022.688, 1001666.173 ...1.190345e+07LINESTRING (102251.61 110024.092, 101669.946 1...POINT (100442.088 108113.433)9333.201006
42SUBA11Acuerdo 8 de 1977NoneNoneNoneNaT1.005606e+0865665.349126POLYGON ((1003888.431 1025927.164, 1003891.869...1.005606e+08LINESTRING (103891.168 125935.111, 103894.608 ...POINT (100186.402 118472.415)19231.446216
saber11_n.columns
Index(['PERIODO', 'PUNT_MATEMATICAS', 'COLE_COD_DANE_SEDE',
       'COLE_COD_MCPIO_UBICACION', 'OHE_M', 'OHE_Estrato 2', 'OHE_Estrato 3',
       'OHE_Estrato 4', 'OHE_Estrato 5', 'OHE_Estrato 6',
       ...
       'OHE_Todos o casi todos los días', 'OHE_3 a 5 veces por semana',
       'OHE_Nunca o rara vez comemos eso', 'OHE_Todos o casi todos los días',
       'OHE_Entre 11 y 20 horas', 'OHE_Entre 21 y 30 horas',
       'OHE_Menos de 10 horas', 'OHE_Más de 30 horas',
       'FAMI_TIENECOMPUTADOR_Si', 'FAMI_TIENEINTERNET_Si'],
      dtype='object', length=109)
plt.figure(figsize=(10, 6))
sns.boxplot(x='PERIODO', y='PUNT_MATEMATICAS', data=saber11_n)
plt.title('Distribución de puntajes de matemáticas por periodo')
plt.xlabel('Periodo')
plt.ylabel('Puntaje de matemáticas')
plt.show()
# Seleccionar las columnas binarias asociadas con los estratos socioeconómicos
# columnas_estrato = ['OHE_Estrato 2', 'OHE_Estrato 3', 'OHE_Estrato 4', 'OHE_Estrato 5', 'OHE_Estrato 6', 'OHE_Sin Estrato']
# Crear una nueva columna en el DataFrame que represente el estrato socioeconómico
# saber11_n['Estrato'] = saber11_n[columnas_estrato].idxmax(axis=1)
# # Eliminar las columnas binarias originales
# saber11_n.drop(columns=columnas_estrato, inplace=True)
# Visualizar la distribución de puntajes de matemáticas por estrato socioeconómico
plt.figure(figsize=(10, 6))
sns.boxplot(x='Estrato', y='PUNT_MATEMATICAS', data=saber11_n)
plt.title('Distribución de puntajes de matemáticas por estrato socioeconómico')
plt.xlabel('Estrato socioeconómico')
plt.ylabel('Puntaje de matemáticas')
plt.show()
# columnas_jornada = ['OHE_SABATINA', 'OHE_TARDE', 'OHE_UNICA', 'OHE_MAÑANA', 'OHE_NOCHE']
# saber11_n['Jornada'] = saber11_n[columnas_jornada].idxmax(axis=1)
# saber11_n.drop(columns=columnas_jornada, inplace=True)
# Visualizamos la distribución de puntajes de matemáticas por jornada del estudiante
plt.figure(figsize=(10, 6))
sns.barplot(x='Jornada', y='PUNT_MATEMATICAS', data=saber11_n)
plt.title('Distribución de puntajes de matemáticas por jornada del estudiante')
plt.xlabel('Jornada del estudiante')
plt.ylabel('Puntaje de matemáticas')
plt.show()
# Calculamos el promedio de los puntajes de matemáticas por estrato
promedio_por_estrato = saber11_n.groupby('Estrato')['PUNT_MATEMATICAS'].mean().reset_index()
# Visualizamos la distribución de puntajes de matemáticas por estrato socioeconómico
plt.figure(figsize=(10, 6))
sns.barplot(x='Estrato', y='PUNT_MATEMATICAS', data=promedio_por_estrato)
plt.title('Promedio de puntajes de matemáticas por estrato socioeconómico')
plt.xlabel('Estrato socioeconómico')
plt.ylabel('Promedio de puntaje de matemáticas')
plt.show()
# Calculamos el promedio de los puntajes de matemáticas por estrato y período
promedio_por_estrato_periodo = saber11_n.groupby(['Estrato', 'PERIODO'])['PUNT_MATEMATICAS'].mean().reset_index()
# Visualizamos la distribución de puntajes de matemáticas por estrato socioeconómico y período
plt.figure(figsize=(18, 8))
sns.barplot(x='Estrato', y='PUNT_MATEMATICAS', hue='PERIODO', data=promedio_por_estrato_periodo)
plt.title('Promedio de puntajes de matemáticas por estrato socioeconómico y período')
plt.xlabel('Estrato socioeconómico')
plt.ylabel('Promedio de puntaje de matemáticas')
plt.legend(title='Período', loc='upper left')
plt.show()
plt.figure(figsize=(8, 6))
sns.boxplot(x='FAMI_TIENECONSOLAVIDEOJUEGOS', y='PUNT_MATEMATICAS', data=saber11)
plt.title('Distribución de puntajes de matemáticas por posesión de consola de videojuegos')
plt.xlabel('Posesión de consola de videojuegos')
plt.ylabel('Puntaje de matemáticas')
plt.show()
plt.figure(figsize=(8, 6))
sns.barplot(x='FAMI_TIENECONSOLAVIDEOJUEGOS', y='PUNT_MATEMATICAS', data=saber11, estimator=np.mean)
plt.title('Promedio de puntajes de matemáticas por posesión de consola de videojuegos')
plt.xlabel('Posesión de consola de videojuegos')
plt.ylabel('Puntaje promedio de matemáticas')
plt.show()
plt.figure(figsize=(8, 6))
sns.barplot(x='FAMI_COMELECHEDERIVADOS', y='PUNT_MATEMATICAS', data=saber11, estimator=np.mean)
plt.title('Promedio de puntajes de matemáticas por frecuencia de consumo de leche/derivados')
plt.xlabel('Frecuencia de consumo de leche/derivados')
plt.ylabel('Puntaje promedio de matemáticas')
plt.xticks(rotation=45)
plt.show()
plt.figure(figsize=(8, 6))
sns.barplot(x='FAMI_COMECARNEPESCADOHUEVO', y='PUNT_MATEMATICAS', data=saber11, estimator=np.mean)
plt.title('Promedio de puntajes de matemáticas por frecuencia de consumo de carne/pescado/huevo')
plt.xlabel('Frecuencia de consumo de carne/pescado/huevo')
plt.ylabel('Puntaje promedio de matemáticas')
plt.xticks(rotation=45)
plt.show()
plt.figure(figsize=(10, 6))
sns.barplot(x='ESTU_HORASSEMANATRABAJA', y='PUNT_MATEMATICAS', data=saber11, estimator=np.mean)
plt.title('Promedio de puntajes de matemáticas por horas semanales de trabajo del estudiante')
plt.xlabel('Horas semanales de trabajo')
plt.ylabel('Puntaje promedio de matemáticas')
plt.xticks(rotation=45)
plt.show()
# Obtener las categorías únicas de la situación laboral del padre
categorias_padre = saber11['FAMI_TRABAJOLABORPADRE'].unique()
# Creamos un diccionario para mapear cada categoría a un número
mapeo_categorias_padre = {categoria: i for i, categoria in enumerate(categorias_padre, start=1)}
# Creamos una nueva columna con los números correspondientes a cada categoría
saber11['FAMI_TRABAJOLABORPADRE_NUM'] = saber11['FAMI_TRABAJOLABORPADRE'].map(mapeo_categorias_padre)
plt.figure(figsize=(12, 6))
sns.barplot(x='FAMI_TRABAJOLABORPADRE_NUM', y='PUNT_MATEMATICAS', data=saber11, estimator=np.mean, palette='viridis')
plt.title('Promedio de puntajes de matemáticas por situación laboral del padre')
plt.xlabel('Situación laboral del padre')
plt.ylabel('Puntaje promedio de matemáticas')
# Generamos las etiquetas para el eje x
etiquetas_padre = [f"{mapeo_categorias_padre[categoria]}: {categoria}" for categoria in categorias_padre]
plt.xticks(range(len(categorias_padre)), etiquetas_padre, rotation=45, ha='right')
plt.tight_layout()
plt.show()
# Obtener las categorías únicas de la situación laboral del padre
categorias_padre = saber11['FAMI_TRABAJOLABORMADRE'].unique()
# Crear un diccionario para mapear cada categoría a un número
mapeo_categorias_padre = {categoria: i for i, categoria in enumerate(categorias_padre, start=1)}
# Crear una nueva columna con los números correspondientes a cada categoría
saber11['FAMI_TRABAJOLABORPADRE_NUM'] = saber11['FAMI_TRABAJOLABORPADRE'].map(mapeo_categorias_padre)
plt.figure(figsize=(12, 6))
sns.barplot(x='FAMI_TRABAJOLABORPADRE_NUM', y='PUNT_MATEMATICAS', data=saber11, estimator=np.mean, palette='viridis')
plt.title('Promedio de puntajes de matemáticas por situación laboral del padre')
plt.xlabel('Situación laboral del padre')
plt.ylabel('Puntaje promedio de matemáticas')
# Generar las etiquetas para el eje x
etiquetas_padre = [f"{mapeo_categorias_padre[categoria]}: {categoria}" for categoria in categorias_padre]
plt.xticks(range(len(categorias_padre)), etiquetas_padre, rotation=45, ha='right')
plt.tight_layout()
plt.show()
plt.figure(figsize=(10, 6))
sns.boxplot(x='ESTU_DEDICACIONLECTURADIARIA', y='PUNT_MATEMATICAS', data=saber11)
plt.title('Distribución de puntajes de matemáticas por dedicación diaria a la lectura')
plt.xlabel('Dedicación diaria a la lectura')
plt.ylabel('Puntaje de matemáticas')
plt.xticks(rotation=45)
plt.show()
# Reflexionar sobre el impacto de la educación remota en estudiantes de colegios públicos
estratos_bajos = ['OHE_Estrato 3','OHE_Estrato 2', 'OHE_Sin Estrato']
datos_estratos_bajos = saber11_n[saber11_n['Estrato'].isin(estratos_bajos)]
puntaje_promedio_estratos_bajos_antes_covid = datos_estratos_bajos[datos_estratos_bajos['PERIODO'].isin(periodos_antes_covid)]['PUNT_MATEMATICAS'].mean()
puntaje_promedio_estratos_bajos_durante_covid = datos_estratos_bajos[datos_estratos_bajos['PERIODO'].isin(periodos_durante_covid)]['PUNT_MATEMATICAS'].mean()
puntaje_promedio_estratos_bajos_despues_covid = datos_estratos_bajos[datos_estratos_bajos['PERIODO'].isin(periodos_despues_covid)]['PUNT_MATEMATICAS'].mean()
print("Puntaje promedio en estratos bajos antes del COVID-19:", puntaje_promedio_estratos_bajos_antes_covid)
print("Puntaje promedio en estratos bajos durante el COVID-19:", puntaje_promedio_estratos_bajos_durante_covid)
print("Puntaje promedio en estratos bajos después del COVID-19:", puntaje_promedio_estratos_bajos_despues_covid)
Puntaje promedio en estratos bajos antes del COVID-19: 53.639340206185565
Puntaje promedio en estratos bajos durante el COVID-19: 53.603437790531046
Puntaje promedio en estratos bajos después del COVID-19: 54.07104110750106
# Reflexionar sobre el impacto de la educación remota en estudiantes de colegios públicos
estratos_bajos = ['OHE_Estrato 4','OHE_Estrato 5', 'OHE_Estrato 6']
datos_estratos_bajos = saber11_n[saber11_n['Estrato'].isin(estratos_bajos)]
puntaje_promedio_estratos_bajos_antes_covid = datos_estratos_bajos[datos_estratos_bajos['PERIODO'].isin(periodos_antes_covid)]['PUNT_MATEMATICAS'].mean()
puntaje_promedio_estratos_bajos_durante_covid = datos_estratos_bajos[datos_estratos_bajos['PERIODO'].isin(periodos_durante_covid)]['PUNT_MATEMATICAS'].mean()
puntaje_promedio_estratos_bajos_despues_covid = datos_estratos_bajos[datos_estratos_bajos['PERIODO'].isin(periodos_despues_covid)]['PUNT_MATEMATICAS'].mean()
print("Puntaje promedio en estratos altos antes del COVID-19:", puntaje_promedio_estratos_bajos_antes_covid)
print("Puntaje promedio en estratos altos durante el COVID-19:", puntaje_promedio_estratos_bajos_durante_covid)
print("Puntaje promedio en estratos altos después del COVID-19:", puntaje_promedio_estratos_bajos_despues_covid)
Puntaje promedio en estratos altos antes del COVID-19: 63.445088124110164
Puntaje promedio en estratos altos durante el COVID-19: 62.729665195951206
Puntaje promedio en estratos altos después del COVID-19: 63.41948244601945
# Análisis de diferencias por acceso a computador
datos_con_computador = saber11_n[saber11_n['FAMI_TIENECOMPUTADOR_Si'] == 1]
datos_sin_computador = saber11_n[saber11_n['FAMI_TIENECOMPUTADOR_Si'] == 0]
puntaje_promedio_con_computador = datos_con_computador['PUNT_MATEMATICAS'].mean()
puntaje_promedio_sin_computador = datos_sin_computador['PUNT_MATEMATICAS'].mean()
print("Puntaje promedio con acceso a computador:", puntaje_promedio_con_computador)
print("Puntaje promedio sin acceso a computador:", puntaje_promedio_sin_computador)
Puntaje promedio con acceso a computador: 56.113439291435924
Puntaje promedio sin acceso a computador: 49.84799705816064
# Análisis de diferencias por acceso a internet
datos_con_internet = saber11_n[saber11_n['FAMI_TIENEINTERNET_Si'] == 1]
datos_sin_internet = saber11_n[saber11_n['FAMI_TIENEINTERNET_Si'] == 0]
puntaje_promedio_con_internet = datos_con_internet['PUNT_MATEMATICAS'].mean()
puntaje_promedio_sin_internet = datos_sin_internet['PUNT_MATEMATICAS'].mean()
print("Puntaje promedio con acceso a internet:", puntaje_promedio_con_internet)
print("Puntaje promedio sin acceso a internet:", puntaje_promedio_sin_internet)
  • Puntaje promedio con acceso a internet: 55.66399425631207
  • Puntaje promedio sin acceso a internet: 49.57813512929482
estratos_bajos_sin_internet = ['OHE_Estrato 4', 'OHE_Estrato 5', 'OHE_Estrato 6']
datos_estratos_bajos_sin_internet = saber11_n[(saber11_n['Estrato'].isin(estratos_bajos_sin_internet)) & (saber11_n['FAMI_TIENEINTERNET_Si'] == 0)]
# Calcular el puntaje promedio para estos estudiantes
puntaje_promedio_estratos_bajos_sin_internet_antes_covid = datos_estratos_bajos_sin_internet[datos_estratos_bajos_sin_internet['PERIODO'].isin(periodos_antes_covid)]['PUNT_MATEMATICAS'].mean()
puntaje_promedio_estratos_bajos_sin_internet_durante_covid = datos_estratos_bajos_sin_internet[datos_estratos_bajos_sin_internet['PERIODO'].isin(periodos_durante_covid)]['PUNT_MATEMATICAS'].mean()
puntaje_promedio_estratos_bajos_sin_internet_despues_covid = datos_estratos_bajos_sin_internet[datos_estratos_bajos_sin_internet['PERIODO'].isin(periodos_despues_covid)]['PUNT_MATEMATICAS'].mean()
print("Puntaje promedio en estratos altos sin acceso a internet antes del COVID-19:", puntaje_promedio_estratos_bajos_sin_internet_antes_covid)
print("Puntaje promedio en estratos altos sin acceso a internet durante el COVID-19:", puntaje_promedio_estratos_bajos_sin_internet_durante_covid)
print("Puntaje promedio en estratos altos sin acceso a internet después del COVID-19:", puntaje_promedio_estratos_bajos_sin_internet_despues_covid)
  • Puntaje promedio en estratos altos sin acceso a internet antes del COVID-19: 48.86785714285714
  • Puntaje promedio en estratos altos sin acceso a internet durante el COVID-19: 48.38167938931298
  • Puntaje promedio en estratos altos sin acceso a internet después del COVID-19: 47.903361344537814
estratos_bajos_sin_internet = ['OHE_Estrato 0', 'OHE_Estrato 3', 'OHE_Estrato 2']
datos_estratos_bajos_sin_internet = saber11_n[(saber11_n['Estrato'].isin(estratos_bajos_sin_internet)) & (saber11_n['FAMI_TIENEINTERNET_Si'] == 0)]
# Calcular el puntaje promedio para estos estudiantes
puntaje_promedio_estratos_bajos_sin_internet_antes_covid = datos_estratos_bajos_sin_internet[datos_estratos_bajos_sin_internet['PERIODO'].isin(periodos_antes_covid)]['PUNT_MATEMATICAS'].mean()
puntaje_promedio_estratos_bajos_sin_internet_durante_covid = datos_estratos_bajos_sin_internet[datos_estratos_bajos_sin_internet['PERIODO'].isin(periodos_durante_covid)]['PUNT_MATEMATICAS'].mean()
puntaje_promedio_estratos_bajos_sin_internet_despues_covid = datos_estratos_bajos_sin_internet[datos_estratos_bajos_sin_internet['PERIODO'].isin(periodos_despues_covid)]['PUNT_MATEMATICAS'].mean()
print("Puntaje promedio en estratos bajos sin acceso a internet antes del COVID-19:", puntaje_promedio_estratos_bajos_sin_internet_antes_covid)
print("Puntaje promedio en estratos bajos sin acceso a internet durante el COVID-19:", puntaje_promedio_estratos_bajos_sin_internet_durante_covid)
print("Puntaje promedio en estratos bajos sin acceso a internet después del COVID-19:", puntaje_promedio_estratos_bajos_sin_internet_despues_covid)
  • Puntaje promedio en estratos bajos sin acceso a internet antes del COVID-19: 49.73799030409872
  • Puntaje promedio en estratos bajos sin acceso a internet durante el COVID-19: 49.33871276392167
  • Puntaje promedio en estratos bajos sin acceso a internet después del COVID-19: 49.98374671176249

Analisis de promedio por localidades. (2023)

# Definir la lista de períodos que deseas conservar (solo 2023)
periodos_2023 = [20231, 20234]
# Filtrar el DataFrame para quedarse solo con los períodos de 2023
saber11_2023 = saber11_n[saber11_n['PERIODO'].isin(periodos_2023)]
saber11_2023['PERIODO'].unique()
array([20231, 20234])
#datos_colegios_2023 = {}
#localidades = saber11_2023['COLE_COD_DANE_SEDE'].unique()
#for localidad in localidades:
  #  obtener_datos_localidad(localidad, datos_colegios_2023)
# Guardar los datos en un archivo utilizando pickle
#with open('datos_colegios_2023.pkl', 'wb') as archivo:
  #    pickle.dump(datos_colegios_2023, archivo)
# Cargar los datos desde el archivo utilizando pickle
with open('/content/drive/MyDrive/icfes/datos_colegios_2023.pkl', 'rb') as archivo:
  datos_colegios_2023 = pickle.load(archivo)
localidades_shp["area"] = localidades_shp.area
localidades_shp["perimetro"] = localidades_shp.boundary
localidades_shp["NOMBRE"] = localidades_shp.NOMBRE
localidades_shp["centroide"] = localidades_shp.centroid
punto_inicial = localidades_shp["centroide"].iloc[0]
localidades_shp["distancia"] = localidades_shp["centroide"].distance(punto_inicial)
colegios_data = pd.DataFrame(datos_colegios_2023).T.reset_index()
colegios_data.columns = ['COLE_COD_DANE_SEDE', 'puntaje_promedio', 'latitud', 'longitud']
colegios_data['latitud'] = pd.to_numeric(colegios_data['latitud'])
colegios_data['longitud'] = pd.to_numeric(colegios_data['longitud'])
colegios_data['geometry'] = colegios_data.apply(lambda row: Point(row['longitud'], row['latitud']), axis=1)
colegios_data['categoria'] = colegios_data['puntaje_promedio'].apply(asignar_categoria)
colegios_geo = gpd.GeoDataFrame(colegios_data, geometry='geometry')
colegios_geo.crs = {'init': 'epsg:4326'}  # Sistema de coordenadas WGS84
localidades_shp = localidades_shp.to_crs(epsg=3116)
colegios_geo = colegios_geo.to_crs(epsg=3116)
colegios_localidades = gpd.sjoin(colegios_geo, localidades_shp, predicate='within')
promedios_localidades = colegios_localidades.groupby('NOMBRE')['puntaje_promedio'].mean().reset_index()
promedios_localidades['puntaje_promedio'] = pd.to_numeric(promedios_localidades['puntaje_promedio'], errors='coerce')
print("Promedio de puntaje de matemáticas por localidad")
for _, row in promedios_localidades.iterrows():
  print(f"{row['NOMBRE']}: {row['puntaje_promedio']:.2f}")
Promedio de puntaje de matemáticas por localidad
ANTONIO NARIÑO: 54.56
BARRIOS UNIDOS: 57.16
BOSA: 52.93
CANDELARIA: 56.86
CHAPINERO: 57.49
CIUDAD BOLIVAR: 51.84
ENGATIVA: 55.60
FONTIBON: 57.84
KENNEDY: 54.39
LOS MARTIRES: 55.12
PUENTE ARANDA: 56.92
RAFAEL URIBE URIBE: 54.29
SAN CRISTOBAL: 52.16
SANTA FE: 53.11
SUBA: 58.97
SUMAPAZ: 50.88
TEUSAQUILLO: 58.55
TUNJUELITO: 55.00
USAQUEN: 60.26
USME: 52.85
# Creamos las barras horizontales
fig, ax = plt.subplots(figsize=(10, 8))
ax.barh(promedios_localidades['NOMBRE'], promedios_localidades['puntaje_promedio'])
# Configuramos el título y las etiquetas de los ejes
ax.set_title('Promedio de Puntaje de Matemáticas por Localidad en Bogotá en el 2023')
ax.set_xlabel('Puntaje Promedio')
ax.set_ylabel('Localidad')
# Agregar los valores de promedio al final de cada barra
for i, v in enumerate(promedios_localidades['puntaje_promedio']):
  ax.text(v + 0.1, i, f'{v:.2f}', va='center')
  # Ajustar los márgenes y mostrar el gráfico
  fig.tight_layout()
  plt.show()

Analisis por encuenta.

Realizaremos un analisis de la encuesta realizada a los profesores de Bogotá. Iremos por las mas importantes, y resolveremos las preguntas respecto al avance que hemos hecho.

df_encuesta = pd.read_csv(path+'encuesta-61-docentes.csv', sep=',', engine='python')
df_encuesta.head()
Género:Edad:Nivel de estudios:Años de experiencia:Decreto:

CARACTERIZACIÓN DE LA INSTITUCION EDUCATIVA DISTRITAL DONDE LABORA:\n\nNombre de la I.E.D.:

Jornada:Característica:Clasificación según área de ubicación:Localidad:...
  1. ¿La SED en general o su IED en particular, ofrecieron programas de capacitación específicos para la enseñanza de las matemáticas en línea durante los años 2020 - 2022?
  1. Por su cuenta, ¿Ha participado en programas de capacitación específicos para la enseñanza de matemáticas de manera virtual entre los años 2018-2022?
  1. ¿Fueron accesibles los dispositivos tecnológicos de su IED para los docentes y estudiantes durante la pandemia de COVID-19?
  1. ¿Qué medidas implementaron el Gobierno Distrital y la SED para garantizar que los estudiantes tuvieran acceso a Internet desde sus hogares?
22. ¿Fueron efectivas dichas medidas?
  1. "¿Cuál es el estrato socioeconómico que predomina entre los estudiantes de su Institución Educativa Distrital?
  1. ¿Evidenció una relación negativa entre la falta de acceso a recursos tecnológicos y el rendimiento académico de los estudiantes en matemáticas durante la pandemia?
  1. ¿Considera que la combinación del contexto socioeconómico de sus estudiantes y la modalidad educativa remota durante la pandemia de COVID -19, influyeron en los resultados obtenidos por ellos en la prueba Saber 11 durante los años 2020 a 2022? [2020]
  1. ¿Considera que la combinación del contexto socioeconómico de sus estudiantes y la modalidad educativa remota durante la pandemia de COVID -19, influyeron en los resultados obtenidos por ellos en la prueba Saber 11 durante los años 2020 a 2022? [2021]
  1. ¿Considera que la combinación del contexto socioeconómico de sus estudiantes y la modalidad educativa remota durante la pandemia de COVID -19, influyeron en los resultados obtenidos por ellos en la prueba Saber 11 durante los años 2020 a 2022? [2022]
0FemeninoEntre 30 y 40 añosEspecializaciónEntre 5 y 10 años1278Pablo NerudaMañanaAcadémicoUrbano9 FONTIBON...NoNoPoco accesiblesObsequio simcardNo fueron efectivasEstrato 3Si, se evidenció una relacion negativaInfluyeron de manera negativaInfluyeron de manera muy negativaNo influyeron
1Femenino< de 30 añosLicenciaturaEntre 10 y 15 años1278Abel Rodriguez CespedesTardeAcadémicoUrbano10 ENGATIVA...NoNoPoco accesiblesTabletsNo fueron efectivasEstrato 3Si, se evidenció una relación muy negativaInfluyeron de manera negativaInfluyeron de manera muy negativaInfluyeron de manera negativa
2Masculino> 50 añosLicenciaturaEntre 5 y 10 años1278La Felicidad IEDÚnicaAcadémicoUrbano9 FONTIBON...NoSiAccesiblesSimcardmoderadamente efectivasEstrato 4No hubo relacion algunaNo influyeronNo influyeronNo influyeron
3FemeninoEntre 40 y 50 añosMaestria> 15 años1278Instituto Técnico Distrital Francisco José de ...MañanaTécnicoUrbano10 ENGATIVA...No lo seSiPoco accesiblesobsequiaron tabletsLevemente efectivasEstrato 3Si, se evidenció una relacion negativaNo influyeronInfluyeron de manera negativaNo influyeron
4Masculino> 50 añosEspecialización> 15 años2277IED Arborizadora AltaTardeAcadémicoUrbano19 CIUDAD BOLIVAR...No lo seSiPoco accesiblesningunaNo fueron efectivasEstrato 2Si, se evidenció una relación muy negativaInfluyeron de manera negativaInfluyeron de manera muy negativaInfluyeron de manera negativa

5 rows × 41 columns

df_encuesta.info()
Data columns (total 41 columns):
 #   Column                                                                                                                                                                                                                                                                                                                              Non-Null Count  Dtype
---  ------                                                                                                                                                                                                                                                                                                                              --------------  -----
 0   Género:                                                                                                                                                                                                                                                                                                                             61 non-null     object
 1   Edad:                                                                                                                                                                                                                                                                                                                               61 non-null     object
 2   Nivel de estudios:                                                                                                                                                                                                                                                                                                                  61 non-null     object
 3   Años de experiencia:                                                                                                                                                                                                                                                                                                                61 non-null     object
 4   Decreto:                                                                                                                                                                                                                                                                                                                            61 non-null     int64
 5   CARACTERIZACIÓN DE LA INSTITUCION EDUCATIVA DISTRITAL DONDE LABORA:

Nombre de la I.E.D.:                                                                                                                                                                                                                                           61 non-null     object
 6   Jornada:                                                                                                                                                                                                                                                                                                                            61 non-null     object
 7   Característica:                                                                                                                                                                                                                                                                                                                     61 non-null     object
 8   Clasificación según área de ubicación:                                                                                                                                                                                                                                                                                              61 non-null     object
 9   Localidad:                                                                                                                                                                                                                                                                                                                          61 non-null     object
 10  1. Durante el cierre de la IED debido a la pandemia por COVID-19 (años 2020 y 2021), los resultados del componente de matemáticas en Saber 11 desmejoraron en comparación a los obtenidos antes del mismo (2019). [2020]                                                                                                            61 non-null     object
 11  1. Durante el cierre de la IED debido a la pandemia por COVID-19 (años 2020 y 2021), los resultados del componente de matemáticas en Saber 11 desmejoraron en comparación a los obtenidos antes del mismo (2019). [2021]                                                                                                            61 non-null     object
 12  2. Posteriormente al cierre de la IED debido a la pandemia por COVID-19 (año 2022), los resultados del componente de matemáticas en Saber 11 mejoraron en comparación de los dos años anteriores? (2020 y 2021).                                                                                                                    61 non-null     object
 13  3. Durante el cierre escolar, su IED implementó medidas efectivas para garantizar una transición exitosa hacia la enseñanza en línea.                                                                                                                                                                                               61 non-null     object
 14  4. ¿Podría señalar las modalidades o enfoques que adaptó para la enseñanza de matemáticas durante la pandemia de COVID-19 ? (Puede señalar mas de una opción si lo requiere).                                                                                                                                                       61 non-null     object
 15  5. ¿Cuál o cuales considera que han sido las mas efectivas en relación con su proceso de enseñanza entre 2018 y 2022? (Señale una o varias opciones según lo requiera).                                                                                                                                                             61 non-null     object
 16  6. ¿Con qué frecuencia realizó encuentros virtuales o clases en línea con sus estudiantes durante el cierre escolar?                                                                                                                                                                                                                61 non-null     object
 17  7. ¿Cuál considera usted que fue el porcentaje promedio de asistencia de sus estudiantes a los encuentros virtuales o clases en línea que realizó durante el cierre de la IED?                                                                                                                                                      61 non-null     object
 18  8. ¿Fueron efectivas las estrategias de comunicación que utilizó su IED para llegar a los estudiantes sin acceso a dispositivos electrónicos o internet durante la pandemia de Covid-19?                                                                                                                                            61 non-null     object
 19  9. ¿Cómo llevó a cabo la evaluación de los estudiantes con los que no pudo establecer comunicación virtual durante el cierre de la IED? Nombre una o algunas de las estrategias o métodos que utilizó para este propósito."                                                                                                         61 non-null     object
 20  10. ¿Aumentó el nivel de deserción escolar en su colegio durante la pandemia de COVID-19?                                                                                                                                                                                                                                           61 non-null     object
 21  11. ¿Cuáles considera que fueron las principales razones que llevaron a los estudiantes a abandonar la escuela?" (Seleccione todas aquellas que considere).                                                                                                                                                                         61 non-null     object
 22  12. ¿Cambió el porcentaje de reprobación de los estudiantes de su IED durante la pandemia de COVID-19 ?                                                                                                                                                                                                                             61 non-null     object
 23  13. ¿Durante la pandemia, se implementaron políticas de promoción automática o flexibilización de criterios de promoción en su institución educativa?                                                                                                                                                                               61 non-null     object
 24  14. ¿Cree usted, que la promoción de los estudiantes que tuvieron dificultades para participar de las actividades académicas durante los años 2020 y 2021 (a causa del cierre escolar), afectó su desempeño en los resultados del componente de matemáticas de la prueba Saber 11 durante los años 2020, 2021 y 2022? [Saber 2020]  61 non-null     object
 25  14. ¿Cree usted, que la promoción de los estudiantes que tuvieron dificultades para participar de las actividades académicas durante los años 2020 y 2021 (a causa del cierre escolar), afectó su desempeño en los resultados del componente de matemáticas de la prueba Saber 11 durante los años 2020, 2021 y 2022? [Saber 2021]  61 non-null     object
 26  14. ¿Cree usted, que la promoción de los estudiantes que tuvieron dificultades para participar de las actividades académicas durante los años 2020 y 2021 (a causa del cierre escolar), afectó su desempeño en los resultados del componente de matemáticas de la prueba Saber 11 durante los años 2020, 2021 y 2022? [Saber 2022]  61 non-null     object
 27  15. Después de superada la emergencia sanitaria, ¿Considera que las medidas adoptadas en su IED para abordar la pérdida de aprendizaje causada por la pandemia fueron efectivas?                                                                                                                                                    61 non-null     object
 28  16. Qué estrategias educativas ha implementado para abordar la perdida de aprendizajes debida al cierre de la IED por el COVID-19?                                                                                                                                                                                                  61 non-null     object
 29  17. ¿Utilizó alguna plataforma o herramienta tecnológica en particular para facilitar la enseñanza de matemáticas en línea?                                                                                                                                                                                                         61 non-null     object
 30  ¿Cuál o cuales plataformas o herramientas tecnológicas?                                                                                                                                                                                                                                                                             61 non-null     object
 31  18. ¿La SED en general o su IED en particular, ofrecieron programas de capacitación específicos para la enseñanza de las matemáticas en línea durante los años 2020 - 2022?                                                                                                                                                         61 non-null     object
 32  19. Por su cuenta, ¿Ha participado en programas de capacitación específicos para la enseñanza de matemáticas de manera virtual entre los años 2018-2022?                                                                                                                                                                            61 non-null     object
 33  20. ¿Fueron accesibles los dispositivos tecnológicos de su IED para los docentes y estudiantes durante la pandemia de COVID-19?                                                                                                                                                                                                     61 non-null     object
 34  21. ¿Qué medidas implementaron el Gobierno Distrital y la SED para garantizar que los estudiantes tuvieran acceso a Internet desde sus hogares?                                                                                                                                                                                     61 non-null     object
 35  22. ¿Fueron efectivas dichas medidas?                                                                                                                                                                                                                                                                                               61 non-null     object
 36  23. "¿Cuál es el estrato socioeconómico que predomina entre los estudiantes de su Institución Educativa Distrital?                                                                                                                                                                                                                  61 non-null     object
 37  24. ¿Evidenció una relación negativa entre la falta de acceso a recursos tecnológicos y el rendimiento académico de los estudiantes en matemáticas durante la pandemia?                                                                                                                                                             61 non-null     object
 38  25. ¿Considera que la combinación del contexto socioeconómico de sus estudiantes y la modalidad educativa remota durante la pandemia de COVID -19, influyeron en los resultados obtenidos por ellos en la prueba Saber 11 durante los años 2020 a 2022? [2020]                                                                      61 non-null     object
 39  25. ¿Considera que la combinación del contexto socioeconómico de sus estudiantes y la modalidad educativa remota durante la pandemia de COVID -19, influyeron en los resultados obtenidos por ellos en la prueba Saber 11 durante los años 2020 a 2022? [2021]                                                                      61 non-null     object
 40  25. ¿Considera que la combinación del contexto socioeconómico de sus estudiantes y la modalidad educativa remota durante la pandemia de COVID -19, influyeron en los resultados obtenidos por ellos en la prueba Saber 11 durante los años 2020 a 2022? [2022]                                                                      61 non-null     object
dtypes: int64(1), object(40)
memory usage: 19.7+ KB

Ahora miremos cuantas filas y columnas hay

df_encuesta.shape

61 filas y 47 columnas, es decir, 61 profesores respondieron y hay 40 preguntas que iremos analizando.

df_encuesta = df_encuesta.fillna('No responde')
categorical_columns = ['Género:', 'Edad:', 'Nivel de estudios:', 'Años de experiencia:', 'Jornada:',
'Característica:', 'Clasificación según área de ubicación:', 'Localidad:']
df_encuesta_encoded = pd.get_dummies(df_encuesta, columns=categorical_columns)
df_encuesta_encoded
Decreto:

CARACTERIZACIÓN DE LA INSTITUCION EDUCATIVA DISTRITAL DONDE LABORA:\n\nNombre de la I.E.D.:

  1. Durante el cierre de la IED debido a la pandemia por COVID-19 (años 2020 y 2021), los resultados del componente de matemáticas en Saber 11 desmejoraron en comparación a los obtenidos antes del mismo (2019). [2020]
  1. Durante el cierre de la IED debido a la pandemia por COVID-19 (años 2020 y 2021), los resultados del componente de matemáticas en Saber 11 desmejoraron en comparación a los obtenidos antes del mismo (2019). [2021]
  1. Posteriormente al cierre de la IED debido a la pandemia por COVID-19 (año 2022), los resultados del componente de matemáticas en Saber 11 mejoraron en comparación de los dos años anteriores? (2020 y 2021).
  1. Durante el cierre escolar, su IED implementó medidas efectivas para garantizar una transición exitosa hacia la enseñanza en línea.
  1. ¿Podría señalar las modalidades o enfoques que adaptó para la enseñanza de matemáticas durante la pandemia de COVID-19 ? (Puede señalar mas de una opción si lo requiere).
  1. ¿Cuál o cuales considera que han sido las mas efectivas en relación con su proceso de enseñanza entre 2018 y 2022? (Señale una o varias opciones según lo requiera).
  1. ¿Con qué frecuencia realizó encuentros virtuales o clases en línea con sus estudiantes durante el cierre escolar?
  1. ¿Cuál considera usted que fue el porcentaje promedio de asistencia de sus estudiantes a los encuentros virtuales o clases en línea que realizó durante el cierre de la IED?
...Localidad:_18 RAFAEL URIBE URIBELocalidad:_19 CIUDAD BOLIVARLocalidad:_2 CHAPINEROLocalidad:_20 SUMAPAZLocalidad:_3 SANTA FELocalidad:_4 SAN CRISTOBALLocalidad:_5 USMELocalidad:_7 BOSALocalidad:_8 KENNEDYLocalidad:_9 FONTIBON
01278Pablo NerudaDesmejoraron significativamenteDesmejoraron significativamenteMejoraron significativamenteNi de acuerdo, ni en desacuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...OcasionalmenteEntre 50% y 75%...FalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
11278Abel Rodriguez CespedesDesmejoraron levementeDesmejoraron significativamenteNi mejoraron, ni desmejoraronDe acuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 2019)Todos los días> 75%...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
21278La Felicidad IEDNi mejoraron, ni desmejoraronMejoraron levementeNi mejoraron, ni desmejoraronDe acuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...Todos los días> 75%...FalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
31278Instituto Técnico Distrital Francisco José de ...Ni mejoraron, ni desmejoraronDesmejoraron levementeMejoraron levementeDe acuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...Todos los díasEntre 50% y 75%...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
42277IED Arborizadora AltaDesmejoraron levementeDesmejoraron significativamenteMejoraron levementeNi de acuerdo, ni en desacuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...Casi todos los díasEntre 25 y 50%...FalseTrueFalseFalseFalseFalseFalseFalseFalseFalse
..................................................................
561278COLEGIO ANTONIO NARIÑO (IED)Mejoraron levementeDesmejoraron levementeMejoraron levementeDe acuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...Casi todos los díasEntre 25 y 50%...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse
571278COLEGIO COSTA RICA (IED)Mejoraron levementeDesmejoraron levementeMejoraron levementeDe acuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...Casi todos los díasEntre 25 y 50%...FalseFalseFalseFalseFalseFalseFalseFalseFalseTrue
581278COLEGIO POLICARPA SALAVARRIETA (IED)Mejoraron levementeDesmejoraron levementeMejoraron levementeDe acuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...Casi todos los díasEntre 25 y 50%...FalseFalseFalseFalseTrueFalseFalseFalseFalseFalse
591278COLEGIO MISAEL PASTRANA BORRERO (IED)Mejoraron levementeDesmejoraron levementeMejoraron levementeDe acuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...Casi todos los díasEntre 25 y 50%...TrueFalseFalseFalseFalseFalseFalseFalseFalseFalse
601278COLEGIO LA GAITANA (IED)Mejoraron levementeDesmejoraron levementeMejoraron levementeDe acuerdoEncuentros virtuales o clases en línea (meet, ...Presencialidad antes de la pandemia (2018 - 20...Casi todos los díasEntre 25 y 50%...FalseFalseFalseFalseFalseFalseFalseFalseFalseFalse

61 rows × 74 columns

Porcentajes del estado actual de cada profesor.

# Calcular el porcentaje por respuesta para la variable Género
porcentajes_genero = df_encuesta.iloc[:, 0].value_counts(normalize=True) * 100
print("Porcentajes por género de cada profesor:")
for genero, porcentaje in porcentajes_genero.items():
  print(f"{genero}: {porcentaje:.2f}%")

Porcentajes por género de cada profesor:

  • Masculino: 52.46%
  • Femenino: 47.54%
# Calcular el porcentaje por respuesta para la variable Edad
porcentajes_edad = df_encuesta.iloc[:, 1].value_counts(normalize=True) * 100
print("Porcentajes por edad de cada profesor:")
for edad, porcentaje in porcentajes_edad.items():
  print(f"{edad}: {porcentaje:.2f}%")

Porcentajes por edad de cada profesor:

  • Entre 30 y 40 años: 36.07%
  • Entre 40 y 50 años: 29.51%
  • 50 años: 21.31%

  • < de 30 años: 13.11%
# Calcular el porcentaje por respuesta para la variable Nivel de estudios
porcentajes_estudios = df_encuesta.iloc[:, 2].value_counts(normalize=True) * 100
print("Porcentajes por nivel de estudio de cada profesor:")
for estudios, porcentaje in porcentajes_estudios.items():
  print(f"{estudios}: {porcentaje:.2f}%")

Porcentajes por nivel de estudio de cada profesor:

  • Maestria: 44.26%
  • Especialización: 26.23%
  • Licenciatura: 22.95%
  • Doctorado: 6.56%
# Calcular el porcentaje por respuesta para la variable  Años de experiencia
porcentajes_exp = df_encuesta.iloc[:, 3].value_counts(normalize=True) * 100
print("Porcentajes por experiencia de cada profesor:")
for exp, porcentaje in porcentajes_exp.items():
  print(f"{exp}: {porcentaje:.2f}%")

Porcentajes por experiencia de cada profesor:

  • 15 años: 39.34%

  • Entre 5 y 10 años: 27.87%
  • Entre 10 y 15 años: 26.23%
  • < 5 años: 6.56%
# Calcular el porcentaje por respuesta para la variable Jornada
porcentajes_exp = df_encuesta.iloc[:, 6].value_counts(normalize=True) * 100
print("Porcentajes por experiencia de cada profesor:")
for exp, porcentaje in porcentajes_exp.items():
  print(f"{exp}: {porcentaje:.2f}%")

Porcentajes por experiencia de cada profesor:

  • Mañana: 54.10%
  • Tarde: 37.70%
  • Única: 8.20%
# Calcular el porcentaje por respuesta para la variable Jornada
porcentajes_localidad = df_encuesta.iloc[:, 9].value_counts(normalize=True) * 100
print("Porcentajes por localidad de cada profesor:")
for localidad, porcentaje in porcentajes_localidad.items():
  print(f"{localidad}: {porcentaje:.2f}%")

Porcentajes por localidad de cada profesor:

  • 9 FONTIBON: 13.11%
  • 10 ENGATIVA: 13.11%
  • 3 SANTA FE: 9.84%
  • 18 RAFAEL URIBE URIBE: 8.20%
  • 8 KENNEDY: 8.20%
  • 19 CIUDAD BOLIVAR: 6.56%
  • 7 BOSA: 6.56%
  • 11 SUBA: 4.92%
  • 20 SUMAPAZ: 4.92%
  • 1 USAQUEN: 3.28%
  • 16 PUENTE ARANDA: 3.28%
  • 5 USME: 3.28%
  • 12 BARRIOS UNIDOS: 3.28%
  • 2 CHAPINERO: 3.28%
  • 14 LOS MARTIRES: 1.64%
  • 4 SAN CRISTOBAL: 1.64%
  • 17 LA CANDELARIA: 1.64%
  • 15 ANTONIO NARIÑO: 1.64%
  • 13 TEUSAQUILLO: 1.64%

Respondiendo segun el analisis las dudas y afirmaciones mas importantes por los profesores.

# Durante el cierre de la IED debido a la pandemia por COVID-19 (años 2020 y 2021),
# los resultados del componente de matemáticas en Saber 11 desmejoraron en comparación
# a los obtenidos antes del mismo (2019).
# Posteriormente al cierre de la IED debido a la pandemia por COVID-19 (año 2022),
# los resultados del componente de matemáticas en Saber 11 mejoraron en comparación
# de los dos años anteriores? (2020 y 2021).
porcentajes_pregunta_01 = df_encuesta.iloc[:, 10].value_counts(normalize=True) * 100
print("Porcentajes de cada profesor a la pregunta: Durante el cierre de la IED debido a la pandemia por COVID-19 (años 2020 y 2021), los resultados del componente de matemáticas en Saber 11 desmejoraron en comparación a los obtenidos antes del mismo (2019):
  ")
  for cierre, porcentaje in porcentajes_pregunta_01.items():
    print(f"{cierre}: {porcentaje:.2f}%")
    porcentajes_pregunta_02 = df_encuesta.iloc[:, 10].value_counts(normalize=True) * 100
    print("
    Porcentajes de cada profesor a la pregunta: Posteriormente al cierre de la IED debido a la pandemia por COVID-19 (año 2022), los resultados del componente de matemáticas en Saber 11 mejoraron en comparación de los dos años anteriores? (2020 y 2021).:
      ")
      for cierre, porcentaje in porcentajes_pregunta_02.items():
        print(f"{cierre}: {porcentaje:.2f}%")

Porcentajes de cada profesor a la pregunta: Durante el cierre de la IED debido a la pandemia por COVID-19 (años 2020 y 2021), los resultados del componente de matemáticas en Saber 11 desmejoraron en comparación a los obtenidos antes del mismo (2019):

  • Ni mejoraron, ni desmejoraron: 36.07%
  • Mejoraron levemente: 34.43%
  • Desmejoraron levemente: 26.23%
  • Desmejoraron significativamente: 3.28%

Porcentajes de cada profesor a la pregunta: Posteriormente al cierre de la IED debido a la pandemia por COVID-19 (año 2022), los resultados del componente de matemáticas en Saber 11 mejoraron en comparación de los dos años anteriores? (2020 y 2021).:

  • Ni mejoraron, ni desmejoraron: 36.07%
  • Mejoraron levemente: 34.43%
  • Desmejoraron levemente: 26.23%
  • Desmejoraron significativamente: 3.28%

Respondiendo a la primera pregunta desmejoraron significativamente durante el codiv en los años 2020 y 2021 respecto al año 2019.

Respondiendo a la segunda pregunta en el 2022 tuvo un aumento significativo en los primero periodos del año en la hora de apertura y regreso de los estudiantes el cual no se pudo sostener a lo largo de los años.

# ¿Podría señalar las modalidades o enfoques que adaptó para la enseñanza de matemáticas
# durante la pandemia de COVID-19? (Puede señalar más de una opción si lo requiere).
porcentajes_pregunta_04 = df_encuesta.iloc[:, 14].value_counts(normalize=True) * 100
print("
Porcentajes de cada profesor a la pregunta: ¿Podría señalar las modalidades o enfoques que adaptó para la enseñanza de matemáticas durante la pandemia de COVID-19? (Puede señalar más de una opción si lo requiere).:
  ")
  for respuesta, porcentaje in porcentajes_pregunta_04.items():
    print(f"{respuesta}: {porcentaje:.2f}%")
Porcentajes de cada profesor a la pregunta: ¿Podría señalar las modalidades o enfoques que adaptó para la enseñanza de matemáticas durante la pandemia de COVID-19? (Puede señalar más de una opción si lo requiere).:
Encuentros virtuales o clases en línea (meet, zoom, teams, etc), Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc): 60.66%
Encuentros virtuales o clases en línea (meet, zoom, teams, etc), Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc), Entrega de materiales en físico (cartillas, talleres, guías, hojas de trabajo, etc.), Alternancia, Presencialidad posterior a la apertura de las IED: 11.48%
Encuentros virtuales o clases en línea (meet, zoom, teams, etc), Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc), Alternancia: 9.84%
Encuentros virtuales o clases en línea (meet, zoom, teams, etc), Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc), Entrega de materiales en físico (cartillas, talleres, guías, hojas de trabajo, etc.): 6.56%
Encuentros virtuales o clases en línea (meet, zoom, teams, etc), Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc), Presencialidad posterior a la apertura de las IED: 3.28%
Encuentros virtuales o clases en línea (meet, zoom, teams, etc), Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc), Alternancia, Presencialidad posterior a la apertura de las IED: 3.28%
Encuentros virtuales o clases en línea (meet, zoom, teams, etc), Alternancia, Presencialidad posterior a la apertura de las IED: 1.64%
Encuentros virtuales o clases en línea (meet, zoom, teams, etc): 1.64%
Entrega de materiales en físico (cartillas, talleres, guías, hojas de trabajo, etc.): 1.64%```

Vemos que un 96% de los profesores prefieren modalidades virtuales, por preferencia, comodidad, o les resultó lo mejor en lo que podrían ofrecerle a la mayoría de estudiantes. Una de las variables más importantes que afectó en el icfes su rendimiento fue a los estudiantes que no podían conectarse a clases, no tenían internet o donde conectarse (computadora, celular, tablet, etc.). Está variable por debajo del estrato socioeconómico del estudiante, teniendo relación de si pueden o no costearse ese tipo de cosas.

# ¿Cuál o cuáles considera que han sido las más efectivas en relación con su
# proceso de enseñanza entre 2018 y 2022? (Señale una o varias opciones según lo requiera).
porcentajes_pregunta_05 = df_encuesta.iloc[:, 15].value_counts(normalize=True) * 100
print("
Porcentajes de cada profesor a la pregunta: ¿Cuál o cuáles considera que han sido las más efectivas en relación con su proceso de enseñanza entre 2018 y 2022? (Señale una o varias opciones según lo requiera).:
  ")
  for respuesta, porcentaje in porcentajes_pregunta_05.items():
    print(f"{respuesta}: {porcentaje:.2f}%")
Porcentajes de cada profesor a la pregunta: ¿Cuál o cuáles considera que han sido las más efectivas en relación con su proceso de enseñanza entre 2018 y 2022? (Señale una o varias opciones según lo requiera).:

Presencialidad antes de la pandemia (2018 - 2019): 49.18%
Presencialidad antes de la pandemia (2018 - 2019), Alternancia: 11.48%
Presencialidad antes de la pandemia (2018 - 2019), Alternancia, Presencialidad posterior a la reapertura de las IED (2022): 8.20%
Presencialidad antes de la pandemia (2018 - 2019), Encuentros virtuales o clases en línea (meet, zoom, etc), Alternancia: 6.56%
Presencialidad antes de la pandemia (2018 - 2019), Encuentros virtuales o clases en línea (meet, zoom, etc), Alternancia, Presencialidad posterior a la reapertura de las IED (2022): 4.92%
Presencialidad antes de la pandemia (2018 - 2019), Encuentros virtuales o clases en línea (meet, zoom, etc), Presencialidad posterior a la reapertura de las IED (2022): 4.92%
Presencialidad antes de la pandemia (2018 - 2019), Presencialidad posterior a la reapertura de las IED (2022): 3.28%
Presencialidad antes de la pandemia (2018 - 2019), Encuentros virtuales o clases en línea (meet, zoom, etc): 3.28%
Encuentros virtuales o clases en línea (meet, zoom, etc): 1.64%
Presencialidad antes de la pandemia (2018 - 2019), Encuentros virtuales o clases en línea (meet, zoom, etc), Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc), Alternancia, Presencialidad posterior a la reapertura de las IED (2022): 1.64%
Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc): 1.64%
Presencialidad antes de la pandemia (2018 - 2019), Encuentros virtuales o clases en línea (meet, zoom, etc), Otras mediaciones pedagógicas virtuales (whatsapp, class room, etc), Alternancia: 1.64%
Presencialidad antes de la pandemia (2018 - 2019), Encuentros virtuales o clases en línea (meet, zoom, etc), Entrega de materiales en físico (cartillas, talleres, guías, hojas de trabajo, etc.): 1.64%

Tenemos un 31% el cual concluye que por falta de conectividad, dispositivos y limitaciones económicas han abandonado las escuelas, para tener certeza de esto trataremos de generar graficas de como afecta al estudiante en el tema material, como economico y en su conectividad en clases. Ademas un punto cruzial es cuantas personas vive el estudiante ya que esto puede afectar en todas las variables.

plt.figure(figsize=(10, 6))
sns.boxplot(x='ESTU_DEDICACIONINTERNET', y='PUNT_MATEMATICAS', data=saber11)
plt.title('Distribución de puntajes de matemáticas por dedicación diaria a internet')
plt.xlabel('Dedicación diaria a internet')
plt.ylabel('Puntaje de matemáticas')
plt.xticks(rotation=45)
plt.show()
plt.figure(figsize=(10, 6))
sns.barplot(x='ESTU_DEDICACIONINTERNET', y='PUNT_MATEMATICAS', data=saber11)
plt.title('Distribución de puntajes de matemáticas por dedicación diaria a internet')
plt.xlabel('Dedicación diaria a internet')
plt.ylabel('Puntaje de matemáticas')
plt.xticks(rotation=45)
plt.show()
plt.figure(figsize=(8, 6))
sns.barplot(x='FAMI_TIENEINTERNET', y='PUNT_MATEMATICAS', data=saber11)
plt.title('Comparación de puntajes de matemáticas según la disponibilidad de internet en el hogar')
plt.xlabel('Disponibilidad de internet en el hogar')
plt.ylabel('Puntaje de matemáticas')
plt.show()
plt.figure(figsize=(10, 6))
sns.barplot(x='FAMI_PERSONASHOGAR', y='PUNT_MATEMATICAS', data=saber11)
plt.title('Relación entre el número de personas en el hogar y el puntaje de matemáticas')
plt.xlabel('Número de personas en el hogar')
plt.ylabel('Puntaje de matemáticas')
plt.xticks(rotation=45)
plt.show()
fig, axs = plt.subplots(2, 2, figsize=(12, 8))
fig.suptitle('Relación entre posesiones en el hogar y puntaje de matemáticas', fontsize=16)
sns.barplot(x='FAMI_TIENELAVADORA', y='PUNT_MATEMATICAS', data=saber11, ax=axs[0, 0])
axs[0, 0].set_title('Lavadora')
axs[0, 0].set_xlabel('Tiene lavadora')
axs[0, 0].set_ylabel('Puntaje de matemáticas')
sns.barplot(x='FAMI_TIENEHORNOMICROOGAS', y='PUNT_MATEMATICAS', data=saber11, ax=axs[0, 1])
axs[0, 1].set_title('Horno/Microondas')
axs[0, 1].set_xlabel('Tiene horno/microondas')
axs[0, 1].set_ylabel('Puntaje de matemáticas')
sns.barplot(x='FAMI_TIENEAUTOMOVIL', y='PUNT_MATEMATICAS', data=saber11, ax=axs[1, 0])
axs[1, 0].set_title('Automóvil')
axs[1, 0].set_xlabel('Tiene automóvil')
axs[1, 0].set_ylabel('Puntaje de matemáticas')
sns.barplot(x='FAMI_TIENEMOTOCICLETA', y='PUNT_MATEMATICAS', data=saber11, ax=axs[1, 1])
axs[1, 1].set_title('Motocicleta')
axs[1, 1].set_xlabel('Tiene motocicleta')
axs[1, 1].set_ylabel('Puntaje de matemáticas')
sns.barplot(x='FAMI_TIENEMOTOCICLETA', y='PUNT_MATEMATICAS', data=saber11, ax=axs[1, 1])
axs[1, 1].set_title('Motocicleta')
axs[1, 1].set_xlabel('Tiene motocicleta')
axs[1, 1].set_ylabel('Puntaje de matemáticas')
sns.barplot(x='FAMI_TIENECOMPUTADOR', y='PUNT_MATEMATICAS', data=saber11, ax=axs[1, 1])
axs[1, 1].set_title('Computador')
axs[1, 1].set_xlabel('Tiene computador')
axs[1, 1].set_ylabel('Puntaje de matemáticas')
plt.tight_layout()
plt.show()