blogs
Saber 11 · Exploración visual

Ciencia de Datos

Saber 11 · Exploración visual

Gráficas del puntaje de matemáticas por computador, internet, nivel socioeconómico, jornada y educación de los padres, y la relación entre el INSE y el puntaje.

27 jun 2024

6 min

HomeBlogsSaber 11 · Exploración visual

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.

Python
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.

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

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

Python
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

Python
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

Python
# 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

Python
# 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

Python
# 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

Python
# 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

Python
# 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

Python
# 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.