import pandas as pd # Libreria para el tratamiento de DataFrames
import matplotlib.pyplot as plt # Libreria gráfica
import seaborn as sns # Libreria Gráfica
import numpy as np # Libreria de algebra lineal
# Lectura del dataset
saber_11 = pd.read_csv("/work/datos_saber_11_2020.csv")
saber_11.head()
# ¿Que columnas tienen los datos?
saber_11.columns
# ¿Que tamaño tienen los datos?
saber_11.shape
# ¿Hay nulos en los datos?
saber_11.info()
# Como se distribuyen las variables numéricas
saber_11.describe()
# Como se comportan las variables categoricas
saber_11.describe(include=["O"])
# Procedemos a seleccionar nuestras columnas de interes
saber_11 = saber_11[["ESTU_GENERO", "FAMI_ESTRATOVIVIENDA", "FAMI_EDUCACIONPADRE", "FAMI_EDUCACIONMADRE",
"FAMI_TIENECOMPUTADOR", "FAMI_TIENEINTERNET", "ESTU_HORASSEMANATRABAJA",
"COLE_NATURALEZA", "COLE_AREA_UBICACION", "PUNT_GLOBAL"]]
# Observamos las primeras 5 filas
saber_11.head()
# Creación de las categorias del ICFES para la variable puntaje global
bins = [-1,175, 250, 350,500]
category = ["Insuficiente", "Mínimo", "Satisfactorio", "Avanzado"]
saber_11["PUNT_GLOBAL"] = pd.cut(saber_11["PUNT_GLOBAL"], bins, labels=category)
# Resultados y género
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "ESTU_GENERO",
palette="rocket",
multiple = "dodge")
plt.title("Gráfica 1. Puntaje global y género")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Resultados y estrato socioeconómico
plt.figure(figsize=(9,9))
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "FAMI_ESTRATOVIVIENDA",
palette="mako", multiple = "dodge")
plt.title("Gráfica 2. Puntaje global y estrato socioeconómico")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Resultados y naturaleza del colegio
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "COLE_NATURALEZA",
palette="magma", multiple = "dodge")
plt.title("Gráfico 3. Puntaje gobal y naturaleza del colegio")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Resultados y área de ubicación
plt.figure(figsize=(7,7))
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "COLE_AREA_UBICACION",
palette="viridis", multiple = "dodge")
plt.title("Gráfico 4. Puntaje global y área de ubicación")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Resultados y naturaleza del colegio
plt.figure(figsize=(7,7))
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "ESTU_HORASSEMANATRABAJA",
palette="rocket_r", multiple = "dodge")
plt.title("Gráfica 5. Puntaje gobal y horas de trabajo")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Resultados y acceso a computador
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "FAMI_TIENECOMPUTADOR",
palette="YlOrBr", multiple = "dodge")
plt.title("Gráfico 5. Puntaje global y acceso a computador")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Resultados y acceso a internet
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "FAMI_TIENEINTERNET",
palette="icefire", multiple = "dodge")
plt.title("Gráfica 6. Puntaje global y acceso a internet")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Resultados y educación del padre
plt.figure(figsize=(9,9))
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "FAMI_EDUCACIONPADRE",
palette="icefire", multiple = "dodge")
plt.title("Gráfica 7. Puntaje global y educación del padre")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Resultados y educación de la madre
plt.figure(figsize=(9,9))
sns.histplot(data = saber_11,
x = "PUNT_GLOBAL",
hue = "FAMI_EDUCACIONMADRE",
palette="Spectral", multiple = "dodge")
plt.title("Gráfica 8. Puntaje global y educación de la madre")
plt.ylabel("Estudiantes")
plt.xlabel("Resultados")
plt.show()
# Creación de variables dummys
saber_11["ESTU_GENERO"] = saber_11.ESTU_GENERO.map({"F":0, "M":1})
saber_11["FAMI_ESTRATOVIVIENDA"] = saber_11.FAMI_ESTRATOVIVIENDA.map({"Sin Estrato":0,
"Estrato 1":1,
"Estrato 2":2,
"Estrato 3":3,
"Estrato 4":4,
"Estrato 5":5,
"Estrato 6":6})
saber_11["FAMI_EDUCACIONPADRE"] = saber_11.FAMI_EDUCACIONPADRE.map({"Ninguna":0,
"No Aplica":1,
"No sabe":2,
"Primaria incompleta":3,
"Primaria completa":4,
"Secundaria (Bachillerato) incompleta":5,
"Secundaria (Bachillerato) completa":6,
"T�cnica o tecnol�gica incompleta":7,
"T�cnica o tecnol�gica completa":8,
"Educaci�n profesional completa":9,
"Educaci�n profesional completa":10,
"Postgrado":11})
saber_11["FAMI_EDUCACIONMADRE"] = saber_11.FAMI_EDUCACIONMADRE.map({"Ninguna":0,
"No Aplica":1,
"No sabe":2,
"Primaria incompleta":3,
"Primaria completa":4,
"Secundaria (Bachillerato) incompleta":5,
"Secundaria (Bachillerato) completa":6,
"T�cnica o tecnol�gica incompleta":7,
"T�cnica o tecnol�gica completa":8,
"Educaci�n profesional completa":9,
"Educaci�n profesional completa":10,
"Postgrado":11})
saber_11["FAMI_TIENEINTERNET"] = saber_11.FAMI_TIENEINTERNET.map({"No":0,
"Si":1})
saber_11["FAMI_TIENECOMPUTADOR"] = saber_11.FAMI_TIENECOMPUTADOR.map({"No":0,
"Si":1})
saber_11["ESTU_HORASSEMANATRABAJA"] = saber_11.ESTU_HORASSEMANATRABAJA.map({"0":0,
"Menos de 10 horas":1,
"Entre 11 y 20 horas":2,
"Entre 21 y 30 horas":3,
"M�s de 30 horas":4})
saber_11["COLE_NATURALEZA"] = saber_11.COLE_NATURALEZA.map({"OFICIAL":0,
"NO OFICIAL":1})
saber_11["COLE_AREA_UBICACION"] = saber_11.COLE_AREA_UBICACION.map({"RURAL":0,
"URBANO":1})
saber_11["PUNT_GLOBAL"] = saber_11.PUNT_GLOBAL.map({"Insuficiente":0,
"Mínimo":1,
"Satisfactorio":2,
"Avanzado":3})
# Observamos los datos nulos
saber_11[["ESTU_GENERO",
"FAMI_ESTRATOVIVIENDA",
"FAMI_EDUCACIONPADRE",
"FAMI_EDUCACIONMADRE",
"FAMI_TIENEINTERNET",
"FAMI_TIENECOMPUTADOR",
"COLE_NATURALEZA",
"ESTU_HORASSEMANATRABAJA",
"COLE_AREA_UBICACION",
"PUNT_GLOBAL"]].info()
# Calculamos la mediana
saber_11[["ESTU_GENERO",
"FAMI_ESTRATOVIVIENDA",
"FAMI_EDUCACIONPADRE",
"FAMI_EDUCACIONMADRE",
"FAMI_TIENEINTERNET",
"FAMI_TIENECOMPUTADOR",
"COLE_NATURALEZA",
"ESTU_HORASSEMANATRABAJA",
"COLE_AREA_UBICACION",
"PUNT_GLOBAL"]].median()
# Imputación de los datos
saber_11["ESTU_GENERO"] = saber_11["ESTU_GENERO"].fillna(0.0)
saber_11["FAMI_ESTRATOVIVIENDA"] = saber_11["FAMI_ESTRATOVIVIENDA"].fillna(2.0)
saber_11["FAMI_EDUCACIONPADRE"] = saber_11["FAMI_EDUCACIONPADRE"].fillna(5.0)
saber_11["FAMI_EDUCACIONMADRE"] = saber_11["FAMI_EDUCACIONMADRE"].fillna(6.0)
saber_11["FAMI_TIENEINTERNET"] = saber_11["FAMI_TIENEINTERNET"].fillna(1.0)
saber_11["FAMI_TIENECOMPUTADOR"] = saber_11["FAMI_TIENECOMPUTADOR"].fillna(1.0)
saber_11["ESTU_HORASSEMANATRABAJA"] = saber_11["ESTU_HORASSEMANATRABAJA"].fillna(0.0)
# Revisamos los datos nuevamente
saber_11.info()
# Instalamos statsmodels
!pip install statsmodels
# Importamos el modelo a utilizar
from statsmodels.miscmodels.ordinal_model import OrderedModel
# Modelo logit ordenado
mod_log = OrderedModel(saber_11["PUNT_GLOBAL"],
saber_11[["ESTU_GENERO",
"FAMI_ESTRATOVIVIENDA",
"FAMI_EDUCACIONPADRE",
"FAMI_EDUCACIONMADRE",
"FAMI_TIENECOMPUTADOR",
"FAMI_TIENEINTERNET",
"ESTU_HORASSEMANATRABAJA",
"COLE_NATURALEZA",
"COLE_AREA_UBICACION"]],
distr="logit")
res_log = mod_log.fit(method='bfgs', disp = False)
print(res_log.summary())
# Modelo probit ordinal
mod_prob = OrderedModel(saber_11["PUNT_GLOBAL"],
saber_11[["ESTU_GENERO",
"FAMI_ESTRATOVIVIENDA",
"FAMI_EDUCACIONPADRE",
"FAMI_EDUCACIONMADRE",
"FAMI_TIENECOMPUTADOR",
"FAMI_TIENEINTERNET",
"ESTU_HORASSEMANATRABAJA",
"COLE_NATURALEZA",
"COLE_AREA_UBICACION"]],
distr="probit")
res_prob = mod_prob.fit(method='bfgs')
print(res_prob.summary())
# Predicción
predicted = res_log.model.predict(res_log.params, exog=saber_11[["ESTU_GENERO",
"FAMI_ESTRATOVIVIENDA",
"FAMI_EDUCACIONPADRE",
"FAMI_EDUCACIONMADRE",
"FAMI_TIENECOMPUTADOR",
"FAMI_TIENEINTERNET",
"ESTU_HORASSEMANATRABAJA",
"COLE_NATURALEZA",
"COLE_AREA_UBICACION"]])
print(predicted)
# Predicciones correcta del modelo
pred_choice = predicted.argmax(1)
print('Fracción de predicciones de elección correcta')
print((np.asarray(saber_11['PUNT_GLOBAL'].values.codes) == pred_choice).mean())