blogs
Saber 11 · El cierre y las localidades

Ciencia de Datos

Saber 11 · El cierre y las localidades

El puntaje antes, durante y después del cierre por COVID-19, mapas de colegios por localidad de Bogotá y diferencias por estrato, computador e internet.

27 jun 2024

6 min

HomeBlogsSaber 11 · El cierre y las localidades

4. El cierre por COVID-19 y las localidades

Python
saber11_n['PERIODO'].unique()
salida
array([20181, 20182, 20191, 20194, 20201, 20204, 20211, 20214, 20221,
       20231, 20234])
Python
# 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)]
Python
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)
salida
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
Python
saber11_n['COLE_COD_DANE_SEDE']
COLE_COD_DANE_SEDE
266311001042667
267311001042667
268311001042667
269311001042667
270311001042667
......
2775242311001005451
2775259111001044385
2775260111001010928
2775264111001044385
2775267111001044385

423240 rows × 1 columns

Python
import geopandas as gpd
from shapely.geometry import Point
Python
# 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...
Python
import pickle
import requests
from requests.exceptions import ConnectTimeout
from requests.adapters import HTTPAdapter
Python
session = requests.Session()
connect_timeout = 0.1
read_timeout = 10
Python
datos_colegios = {}
localidades_fallidas = []
Python
proxies = {
'http': 'http://188.114.96.20:80',
}
Python
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)
Python
localidades = saber11_n['COLE_COD_DANE_SEDE'].unique()
#for localidad in localidades:
#  obtener_datos_localidad(localidad, datos_colegios)
Python
# Reintentar obtener datos para las localidades fallidas
# for localidad in localidades_fallidas:
#    obtener_datos_localidad(localidad, datos_colegios)
Python
# 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)
Python
# 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)
Python
len(datos_colegios)
Python
1252
Python
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
Python
localidades_shp["perimetro"] = localidades_shp.boundary
Python
localidades_shp["NOMBRE"] = localidades_shp.NOMBRE
Python
localidades_shp["centroide"] = localidades_shp.centroid
Python
punto_inicial = localidades_shp["centroide"].iloc[0]
Python
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
Python
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'
Python
colegios_data = pd.DataFrame(datos_colegios).T.reset_index()
colegios_data.columns = ['COLE_COD_DANE_SEDE', 'puntaje_promedio', 'latitud', 'longitud']
Python
colegios_data['latitud'] = pd.to_numeric(colegios_data['latitud'])
colegios_data['longitud'] = pd.to_numeric(colegios_data['longitud'])
Python
colegios_data['geometry'] = colegios_data.apply(lambda row: Point(row['longitud'], row['latitud']), axis=1)
Python
colegios_data['categoria'] = colegios_data['puntaje_promedio'].apply(asignar_categoria)
Python
colegios_geo = gpd.GeoDataFrame(colegios_data, geometry='geometry')
colegios_geo.crs = {'init': 'epsg:4326'}  # Sistema de coordenadas WGS84
Python
localidades_shp = localidades_shp.to_crs(epsg=3116)
colegios_geo = colegios_geo.to_crs(epsg=3116)
Python
conteo_categorias = colegios_geo.groupby('categoria').size().reset_index(name='cantidad')
Python
colores = {'Bajo': 'red', 'Medio': 'orange', 'Alto': 'lightgreen', 'Muy Alto': 'darkgreen'}
Python
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()
Python
colegios_localidades = gpd.sjoin(colegios_geo, localidades_shp, predicate='within')
Python
promedios_localidades = colegios_localidades.groupby('NOMBRE')['puntaje_promedio'].mean().reset_index()
Python
promedios_localidades['puntaje_promedio'] = pd.to_numeric(promedios_localidades['puntaje_promedio'], errors='coerce')
Python
mejor_localidad = promedios_localidades.loc[promedios_localidades['puntaje_promedio'].idxmax(), 'NOMBRE']
mejor_promedio = promedios_localidades.loc[promedios_localidades['puntaje_promedio'].idxmax(), 'puntaje_promedio']
Python
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()
Python
localidades_shp.plot("NOMBRE", figsize=(22, 8))
Python
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
Python
saber11_n.columns
salida
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)
Python
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()
Python
# 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()
Python
# 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()
Python
# 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()
Python
# 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()
Python
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()
Python
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()
Python
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()
Python
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()
Python
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()
Python
# 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()
Python
# 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()
Python
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()
Python
# 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)
Markdown
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
Python
# 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)
Markdown
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
Python
# 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)
Markdown
Puntaje promedio con acceso a computador: 56.113439291435924
Puntaje promedio sin acceso a computador: 49.84799705816064
Python
# 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
Python
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
Python
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)

Python
# 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)]
Python
saber11_2023['PERIODO'].unique()
salida
array([20231, 20234])
Python
#datos_colegios_2023 = {}
#localidades = saber11_2023['COLE_COD_DANE_SEDE'].unique()
#for localidad in localidades:
#  obtener_datos_localidad(localidad, datos_colegios_2023)
Python
# Guardar los datos en un archivo utilizando pickle
#with open('datos_colegios_2023.pkl', 'wb') as archivo:
#    pickle.dump(datos_colegios_2023, archivo)
Python
# 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)
Python
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)
Python
colegios_data = pd.DataFrame(datos_colegios_2023).T.reset_index()
colegios_data.columns = ['COLE_COD_DANE_SEDE', 'puntaje_promedio', 'latitud', 'longitud']
Python
colegios_data['latitud'] = pd.to_numeric(colegios_data['latitud'])
colegios_data['longitud'] = pd.to_numeric(colegios_data['longitud'])
Python
colegios_data['geometry'] = colegios_data.apply(lambda row: Point(row['longitud'], row['latitud']), axis=1)
Python
colegios_data['categoria'] = colegios_data['puntaje_promedio'].apply(asignar_categoria)
Python
colegios_geo = gpd.GeoDataFrame(colegios_data, geometry='geometry')
colegios_geo.crs = {'init': 'epsg:4326'}  # Sistema de coordenadas WGS84
Python
localidades_shp = localidades_shp.to_crs(epsg=3116)
colegios_geo = colegios_geo.to_crs(epsg=3116)
Python
colegios_localidades = gpd.sjoin(colegios_geo, localidades_shp, predicate='within')
Python
promedios_localidades = colegios_localidades.groupby('NOMBRE')['puntaje_promedio'].mean().reset_index()
Python
promedios_localidades['puntaje_promedio'] = pd.to_numeric(promedios_localidades['puntaje_promedio'], errors='coerce')
Python
print("Promedio de puntaje de matemáticas por localidad")
for _, row in promedios_localidades.iterrows():
  print(f"{row['NOMBRE']}: {row['puntaje_promedio']:.2f}")
salida
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
Python
# 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()