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.43896821185664Python
saber11_n['COLE_COD_DANE_SEDE']| COLE_COD_DANE_SEDE | |
|---|---|
| 266 | 311001042667 |
| 267 | 311001042667 |
| 268 | 311001042667 |
| 269 | 311001042667 |
| 270 | 311001042667 |
| ... | ... |
| 2775242 | 311001005451 |
| 2775259 | 111001044385 |
| 2775260 | 111001010928 |
| 2775264 | 111001044385 |
| 2775267 | 111001044385 |
423240 rows × 1 columns
Python
import geopandas as gpd
from shapely.geometry import PointPython
# localidades de Bogotá D.C
localidades_shp = gpd.read_file("/content/drive/MyDrive/icfes/bogota/localidades.shp")
localidades_shp| OBJECTID | NOMBRE | CODIGO_LOC | DECRETO | LINK | SIMBOLO | ESCALA_CAP | FECHA_CAPT | SHAPE_AREA | SHAPE_LEN | geometry | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | SANTA FE | 3 | Acuerdo 117 de 2003 | None | None | None | NaT | 4.517065e+07 | 43779.905440 | POLYGON ((100996.362 103506.019, 101013.606 10... |
| 1 | 11 | PUENTE ARANDA | 16 | Acuerdo 8 de 1977 | None | None | None | NaT | 1.731115e+07 | 17854.555403 | POLYGON ((95475.458 104555.873, 95837.202 1049... |
| 2 | 13 | CIUDAD BOLIVAR | 19 | Acuerdo 14 de 1983 | None | None | None | NaT | 1.299864e+08 | 77732.027669 | POLYGON ((91716.74 100390.427, 91714.771 10033... |
| 3 | 6 | BARRIOS UNIDOS | 12 | Acuerdo 8 de 1977 | None | None | None | NaT | 1.190345e+07 | 13426.542795 | POLYGON ((102251.61 110024.092, 101669.946 106... |
| 4 | 2 | SUBA | 11 | Acuerdo 8 de 1977 | None | None | None | NaT | 1.005606e+08 | 65665.349126 | POLYGON ((103891.168 125935.111, 103894.608 12... |
| 5 | 14 | ANTONIO NARIÑO | 15 | Acuerdo 117 de 2003 | None | None | None | NaT | 4.879543e+06 | 12085.873823 | POLYGON ((94092.947 99681.858, 94269.388 99673... |
| 6 | 20 | CANDELARIA | 17 | Acuerdo 117 de 2003 | None | None | None | NaT | 2.060243e+06 | 7444.083075 | POLYGON ((101257.966 100768.507, 101258.45 100... |
| 7 | 4 | ENGATIVA | 10 | Acuerdo 8 de 1977 | None | None | None | NaT | 3.588097e+07 | 32351.036738 | POLYGON ((94467.113 115606.642, 94463.029 1157... |
| 8 | 5 | FONTIBON | 9 | Acuerdo 8 de 1977 | None | None | None | NaT | 3.328100e+07 | 35674.375625 | POLYGON ((91349.527 113469.012, 91426.279 1134... |
| 9 | 17 | SAN CRISTOBAL | 4 | Acuerdo 117 de 2003 | None | None | None | NaT | 4.909850e+07 | 40291.316126 | POLYGON ((101322.246 98588.942, 101325.293 985... |
| 10 | 8 | TEUSAQUILLO | 13 | Acuerdo 8 de 1977 | None | None | None | NaT | 1.419317e+07 | 16432.566183 | POLYGON ((98204.005 107725.863, 98248.098 1076... |
| 11 | 3 | USAQUEN | 1 | Acuerdo 8 de 1977 | None | None | None | NaT | 6.531573e+07 | 46996.167978 | POLYGON ((102251.61 110024.092, 103089.422 115... |
| 12 | 7 | CHAPINERO | 2 | Acuerdo 8 de 1977 | None | None | None | NaT | 3.815586e+07 | 36833.382799 | POLYGON ((102251.61 110024.092, 102811.332 109... |
| 13 | 18 | USME | 5 | Acuerdo 15 de 1993 | None | None | None | NaT | 2.150664e+08 | 108895.163760 | POLYGON ((94611.356 94313.174, 94612.246 94313... |
| 14 | 19 | SUMAPAZ | 20 | Acuerdo 9 de 1986 | None | None | None | NaT | 7.809523e+08 | 216244.441198 | POLYGON ((92731.192 67235.182, 92781.136 67270... |
| 15 | 16 | RAFAEL URIBE URIBE | 18 | Acuerdo 117 de 2003 | None | None | None | NaT | 1.383408e+07 | 19333.547847 | POLYGON ((94395.307 99591.788, 94424.204 99568... |
| 16 | 15 | TUNJUELITO | 6 | Acuerdo 117 de 2003 | None | None | None | NaT | 9.910940e+06 | 23330.007022 | POLYGON ((93314.583 99851.296, 93993.58 99712.... |
| 17 | 12 | LOS MARTIRES | 14 | Acuerdo 8 de 1977 | None | None | None | NaT | 6.514046e+06 | 11013.197559 | POLYGON ((100522.914 102123.105, 100491.468 10... |
| 18 | 9 | KENNEDY | 8 | Acuerdo 8 de 1977 | None | None | None | NaT | 3.858973e+07 | 31422.417887 | POLYGON ((91005.069 107357.708, 91018.543 1073... |
| 19 | 10 | BOSA | 7 | Acuerdo 14 de 1983 | None | None | None | NaT | 2.393545e+07 | 34117.517640 | POLYGON ((87997.629 105621.791, 88093.812 1053... |
Python
import pickle
import requests
from requests.exceptions import ConnectTimeout
from requests.adapters import HTTPAdapterPython
session = requests.Session()
connect_timeout = 0.1
read_timeout = 10Python
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
1252Python
datolocalidades_shp["area"] = localidades_shp.area
localidades_shp["area"]| area | |
|---|---|
| 0 | 4.517065e+07 |
| 1 | 1.731115e+07 |
| 2 | 1.299864e+08 |
| 3 | 1.190345e+07 |
| 4 | 1.005606e+08 |
| 5 | 4.879543e+06 |
| 6 | 2.060243e+06 |
| 7 | 3.588097e+07 |
| 8 | 3.328100e+07 |
| 9 | 4.909850e+07 |
| 10 | 1.419317e+07 |
| 11 | 6.531573e+07 |
| 12 | 3.815586e+07 |
| 13 | 2.150664e+08 |
| 14 | 7.809523e+08 |
| 15 | 1.383408e+07 |
| 16 | 9.910940e+06 |
| 17 | 6.514046e+06 |
| 18 | 3.858973e+07 |
| 19 | 2.393545e+07 |
Python
localidades_shp["perimetro"] = localidades_shp.boundaryPython
localidades_shp["NOMBRE"] = localidades_shp.NOMBREPython
localidades_shp["centroide"] = localidades_shp.centroidPython
punto_inicial = localidades_shp["centroide"].iloc[0]Python
localidades_shp["distancia"] = localidades_shp["centroide"].distance(punto_inicial)
localidades_shp["distancia"]| distancia | |
|---|---|
| 0 | 0.000000 |
| 1 | 8721.119096 |
| 2 | 18630.258749 |
| 3 | 9333.201006 |
| 4 | 19231.446216 |
| 5 | 7418.334999 |
| 6 | 3990.679376 |
| 7 | 14611.909834 |
| 8 | 14828.435114 |
| 9 | 6001.140480 |
| 10 | 7584.230824 |
| 11 | 16412.080486 |
| 12 | 5643.472536 |
| 13 | 25477.855485 |
| 14 | 66360.150822 |
| 15 | 9088.162443 |
| 16 | 11276.094681 |
| 17 | 5924.795690 |
| 18 | 13538.483689 |
| 19 | 17825.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 WGS84Python
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()| OBJECTID | NOMBRE | CODIGO_LOC | DECRETO | LINK | SIMBOLO | ESCALA_CAP | FECHA_CAPT | SHAPE_AREA | SHAPE_LEN | geometry | area | perimetro | centroide | distancia | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | SANTA FE | 3 | Acuerdo 117 de 2003 | None | None | None | NaT | 4.517065e+07 | 43779.905440 | POLYGON ((1000992.557 1003507.35, 1001009.803 ... | 4.517065e+07 | MULTILINESTRING ((100996.362 103506.019, 10101... | POINT (104587.385 99751.307) | 0.000000 |
| 1 | 11 | PUENTE ARANDA | 16 | Acuerdo 8 de 1977 | None | None | None | NaT | 1.731115e+07 | 17854.555403 | POLYGON ((995473.963 1004557.322, 995835.597 1... | 1.731115e+07 | LINESTRING (95475.458 104555.873, 95837.202 10... | POINT (96221.311 102214.378) | 8721.119096 |
| 2 | 13 | CIUDAD BOLIVAR | 19 | Acuerdo 14 de 1983 | None | None | None | NaT | 1.299864e+08 | 77732.027669 | POLYGON ((991716.342 1000393.903, 991714.368 1... | 1.299864e+08 | LINESTRING (91716.74 100390.427, 91714.771 100... | POINT (90628.777 87412.595) | 18630.258749 |
| 3 | 6 | BARRIOS UNIDOS | 12 | Acuerdo 8 de 1977 | None | None | None | NaT | 1.190345e+07 | 13426.542795 | POLYGON ((1002247.94 1010022.688, 1001666.173 ... | 1.190345e+07 | LINESTRING (102251.61 110024.092, 101669.946 1... | POINT (100442.088 108113.433) | 9333.201006 |
| 4 | 2 | SUBA | 11 | Acuerdo 8 de 1977 | None | None | None | NaT | 1.005606e+08 | 65665.349126 | POLYGON ((1003888.431 1025927.164, 1003891.869... | 1.005606e+08 | LINESTRING (103891.168 125935.111, 103894.608 ... | POINT (100186.402 118472.415) | 19231.446216 |
Python
saber11_n.columnssalida
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.07104110750106Python
# 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.41948244601945Python
# 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.84799705816064Python
# 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 WGS84Python
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.85Python
# 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()