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()
ESTU_TIPODOCUMENTOobject
ESTU_NACIONALIDADobject
0
TI
COLOMBIA
1
TI
COLOMBIA
2
TI
COLOMBIA
3
TI
COLOMBIA
4
TI
COLOMBIA
# ¿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()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 520307 entries, 0 to 520306
Data columns (total 81 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ESTU_TIPODOCUMENTO 520307 non-null object
1 ESTU_NACIONALIDAD 520307 non-null object
2 ESTU_GENERO 520298 non-null object
3 ESTU_FECHANACIMIENTO 520307 non-null object
4 PERIODO 520307 non-null int64
5 ESTU_CONSECUTIVO 520307 non-null object
6 ESTU_ESTUDIANTE 520307 non-null object
7 ESTU_PAIS_RESIDE 520307 non-null object
8 ESTU_TIENEETNIA 516550 non-null object
9 ESTU_DEPTO_RESIDE 519541 non-null object
10 ESTU_COD_RESIDE_DEPTO 519541 non-null float64
11 ESTU_MCPIO_RESIDE 519541 non-null object
12 ESTU_COD_RESIDE_MCPIO 519541 non-null float64
13 FAMI_ESTRATOVIVIENDA 501797 non-null object
14 FAMI_PERSONASHOGAR 503727 non-null object
15 FAMI_CUARTOSHOGAR 503029 non-null object
16 FAMI_EDUCACIONPADRE 505768 non-null object
17 FAMI_EDUCACIONMADRE 505277 non-null object
18 FAMI_TRABAJOLABORPADRE 499160 non-null object
19 FAMI_TRABAJOLABORMADRE 501248 non-null object
20 FAMI_TIENEINTERNET 505113 non-null object
21 FAMI_TIENESERVICIOTV 503324 non-null object
22 FAMI_TIENECOMPUTADOR 498691 non-null object
23 FAMI_TIENELAVADORA 502648 non-null object
24 FAMI_TIENEHORNOMICROOGAS 501728 non-null object
25 FAMI_TIENEAUTOMOVIL 501043 non-null object
26 FAMI_TIENEMOTOCICLETA 501770 non-null object
27 FAMI_TIENECONSOLAVIDEOJUEGOS 501378 non-null object
28 FAMI_NUMLIBROS 504701 non-null object
29 FAMI_COMELECHEDERIVADOS 505042 non-null object
30 FAMI_COMECARNEPESCADOHUEVO 503466 non-null object
31 FAMI_COMECEREALFRUTOSLEGUMBRE 498496 non-null object
32 FAMI_SITUACIONECONOMICA 502543 non-null object
33 ESTU_DEDICACIONLECTURADIARIA 504294 non-null object
34 ESTU_DEDICACIONINTERNET 504128 non-null object
35 ESTU_HORASSEMANATRABAJA 501903 non-null object
36 ESTU_TIPOREMUNERACION 501203 non-null object
37 COLE_CODIGO_ICFES 520307 non-null int64
38 COLE_COD_DANE_ESTABLECIMIENTO 520307 non-null float64
39 COLE_NOMBRE_ESTABLECIMIENTO 520307 non-null object
40 COLE_GENERO 520307 non-null object
41 COLE_NATURALEZA 520307 non-null object
42 COLE_CALENDARIO 520307 non-null object
43 COLE_BILINGUE 434683 non-null object
44 COLE_CARACTER 505202 non-null object
45 COLE_COD_DANE_SEDE 520307 non-null float64
46 COLE_NOMBRE_SEDE 520307 non-null object
47 COLE_SEDE_PRINCIPAL 520307 non-null object
48 COLE_AREA_UBICACION 520307 non-null object
49 COLE_JORNADA 520307 non-null object
50 COLE_COD_MCPIO_UBICACION 520307 non-null int64
51 COLE_MCPIO_UBICACION 520307 non-null object
52 COLE_COD_DEPTO_UBICACION 520307 non-null int64
53 COLE_DEPTO_UBICACION 520307 non-null object
54 ESTU_PRIVADO_LIBERTAD 520307 non-null object
55 ESTU_COD_MCPIO_PRESENTACION 520099 non-null float64
56 ESTU_MCPIO_PRESENTACION 520099 non-null object
57 ESTU_DEPTO_PRESENTACION 520099 non-null object
58 ESTU_COD_DEPTO_PRESENTACION 520099 non-null float64
59 PUNT_LECTURA_CRITICA 520307 non-null int64
60 PERCENTIL_LECTURA_CRITICA 520307 non-null int64
61 DESEMP_LECTURA_CRITICA 520307 non-null int64
62 PUNT_MATEMATICAS 520307 non-null int64
63 PERCENTIL_MATEMATICAS 520307 non-null int64
64 DESEMP_MATEMATICAS 520307 non-null int64
65 PUNT_C_NATURALES 520307 non-null int64
66 PERCENTIL_C_NATURALES 520307 non-null int64
67 DESEMP_C_NATURALES 520307 non-null int64
68 PUNT_SOCIALES_CIUDADANAS 520307 non-null int64
69 PERCENTIL_SOCIALES_CIUDADANAS 520307 non-null int64
70 DESEMP_SOCIALES_CIUDADANAS 520307 non-null int64
71 PUNT_INGLES 519937 non-null float64
72 PERCENTIL_INGLES 520307 non-null int64
73 DESEMP_INGLES 520307 non-null object
74 PUNT_GLOBAL 520307 non-null int64
75 PERCENTIL_GLOBAL 520271 non-null float64
76 ESTU_INSE_INDIVIDUAL 505671 non-null float64
77 ESTU_NSE_INDIVIDUAL 505671 non-null float64
78 ESTU_NSE_ESTABLECIMIENTO 520253 non-null float64
79 ESTU_ESTADOINVESTIGACION 520307 non-null object
80 ESTU_GENERACION-E 520307 non-null object
dtypes: float64(11), int64(18), object(52)
memory usage: 321.5+ MB
# 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()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 520307 entries, 0 to 520306
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ESTU_GENERO 520298 non-null float64
1 FAMI_ESTRATOVIVIENDA 501797 non-null float64
2 FAMI_EDUCACIONPADRE 473956 non-null float64
3 FAMI_EDUCACIONMADRE 479494 non-null float64
4 FAMI_TIENEINTERNET 505113 non-null float64
5 FAMI_TIENECOMPUTADOR 498691 non-null float64
6 COLE_NATURALEZA 520307 non-null int64
7 ESTU_HORASSEMANATRABAJA 501903 non-null float64
8 COLE_AREA_UBICACION 520307 non-null int64
9 PUNT_GLOBAL 520307 non-null category
dtypes: category(1), float64(7), int64(2)
memory usage: 36.2 MB
# 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()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 520307 entries, 0 to 520306
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ESTU_GENERO 520307 non-null float64
1 FAMI_ESTRATOVIVIENDA 520307 non-null float64
2 FAMI_EDUCACIONPADRE 520307 non-null float64
3 FAMI_EDUCACIONMADRE 520307 non-null float64
4 FAMI_TIENECOMPUTADOR 520307 non-null float64
5 FAMI_TIENEINTERNET 520307 non-null float64
6 ESTU_HORASSEMANATRABAJA 520307 non-null float64
7 COLE_NATURALEZA 520307 non-null int64
8 COLE_AREA_UBICACION 520307 non-null int64
9 PUNT_GLOBAL 520307 non-null category
dtypes: category(1), float64(7), int64(2)
memory usage: 36.2 MB
# Instalamos statsmodels
!pip install statsmodels
Collecting statsmodels
Downloading statsmodels-0.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.9 MB)
|████████████████████████████████| 9.9 MB 33.1 MB/s
Requirement already satisfied: numpy>=1.17 in /shared-libs/python3.9/py/lib/python3.9/site-packages (from statsmodels) (1.21.4)
Requirement already satisfied: pandas>=0.25 in /shared-libs/python3.9/py/lib/python3.9/site-packages (from statsmodels) (1.2.5)
Collecting patsy>=0.5.2
Downloading patsy-0.5.2-py2.py3-none-any.whl (233 kB)
|████████████████████████████████| 233 kB 36.4 MB/s
Requirement already satisfied: scipy>=1.3 in /shared-libs/python3.9/py/lib/python3.9/site-packages (from statsmodels) (1.7.3)
Requirement already satisfied: python-dateutil>=2.7.3 in /shared-libs/python3.9/py-core/lib/python3.9/site-packages (from pandas>=0.25->statsmodels) (2.8.2)
Requirement already satisfied: pytz>=2017.3 in /shared-libs/python3.9/py/lib/python3.9/site-packages (from pandas>=0.25->statsmodels) (2021.3)
Requirement already satisfied: six in /shared-libs/python3.9/py-core/lib/python3.9/site-packages (from patsy>=0.5.2->statsmodels) (1.16.0)
Installing collected packages: patsy, statsmodels
Successfully installed patsy-0.5.2 statsmodels-0.13.1
WARNING: You are using pip version 21.2.3; however, version 21.3.1 is available.
You should consider upgrading via the '/root/venv/bin/python -m pip install --upgrade pip' command.
# 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())
OrderedModel Results
==============================================================================
Dep. Variable: PUNT_GLOBAL Log-Likelihood: -4.5141e+05
Model: OrderedModel AIC: 9.029e+05
Method: Maximum Likelihood BIC: 9.030e+05
Date: Fri, 17 Dec 2021
Time: 13:28:41
No. Observations: 520307
Df Residuals: 520295
Df Model: 12
===========================================================================================
coef std err z P>|z| [0.025 0.975]
-------------------------------------------------------------------------------------------
ESTU_GENERO 0.2592 0.006 44.824 0.000 0.248 0.271
FAMI_ESTRATOVIVIENDA 0.1395 0.003 44.595 0.000 0.133 0.146
FAMI_EDUCACIONPADRE 0.0639 0.001 44.753 0.000 0.061 0.067
FAMI_EDUCACIONMADRE 0.1373 0.002 88.456 0.000 0.134 0.140
FAMI_TIENECOMPUTADOR 0.3873 0.007 54.214 0.000 0.373 0.401
FAMI_TIENEINTERNET 0.4100 0.008 52.594 0.000 0.395 0.425
ESTU_HORASSEMANATRABAJA -0.1780 0.003 -68.310 0.000 -0.183 -0.173
COLE_NATURALEZA 0.3796 0.007 51.619 0.000 0.365 0.394
COLE_AREA_UBICACION 0.3586 0.008 43.634 0.000 0.342 0.375
0/1 -0.9262 0.012 -75.946 0.000 -0.950 -0.902
1/2 1.2346 0.002 605.470 0.000 1.231 1.239
2/3 1.3455 0.002 565.847 0.000 1.341 1.350
===========================================================================================
# 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())
Optimization terminated successfully.
Current function value: 0.867662
Iterations: 28
Function evaluations: 30
Gradient evaluations: 30
OrderedModel Results
==============================================================================
Dep. Variable: PUNT_GLOBAL Log-Likelihood: -4.5145e+05
Model: OrderedModel AIC: 9.029e+05
Method: Maximum Likelihood BIC: 9.031e+05
Date: Fri, 17 Dec 2021
Time: 13:32:25
No. Observations: 520307
Df Residuals: 520295
Df Model: 12
===========================================================================================
coef std err z P>|z| [0.025 0.975]
-------------------------------------------------------------------------------------------
ESTU_GENERO 0.1422 0.003 43.296 0.000 0.136 0.149
FAMI_ESTRATOVIVIENDA 0.0753 0.002 43.496 0.000 0.072 0.079
FAMI_EDUCACIONPADRE 0.0369 0.001 45.514 0.000 0.035 0.038
FAMI_EDUCACIONMADRE 0.0785 0.001 89.139 0.000 0.077 0.080
FAMI_TIENECOMPUTADOR 0.2185 0.004 53.304 0.000 0.210 0.226
FAMI_TIENEINTERNET 0.2309 0.004 52.185 0.000 0.222 0.240
ESTU_HORASSEMANATRABAJA -0.1019 0.001 -69.185 0.000 -0.105 -0.099
COLE_NATURALEZA 0.2260 0.004 54.037 0.000 0.218 0.234
COLE_AREA_UBICACION 0.2015 0.005 44.018 0.000 0.192 0.210
0/1 -0.4905 0.007 -73.970 0.000 -0.504 -0.478
1/2 0.6509 0.002 365.013 0.000 0.647 0.654
2/3 0.7495 0.002 362.766 0.000 0.745 0.754
===========================================================================================
# 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)
/root/venv/lib/python3.9/site-packages/statsmodels/miscmodels/ordinal_model.py:419: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version. Convert to a numpy array before indexing instead.
xb = xb[:, None]
[[0.00970622 0.22387488 0.70054146 0.06587745]
[0.00995421 0.22821924 0.69749983 0.06432671]
[0.03535382 0.4972699 0.44886503 0.01851126]
...
[0.00880433 0.20761892 0.71137688 0.07219988]
[0.05098989 0.57457659 0.36173205 0.01270147]
[0.00562743 0.14401312 0.74151391 0.10884553]]
# 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())
Fracción de predicciones de elección correcta
0.6005992615897922