Trabajo Práctico Integrador
Análisis Exploratorio
# 1. Importar las librerías
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 2. Cargar los datos en el dataframe
df = pd.read_csv('/work/exams.csv')
df
# Primeras 5 filas
df.head()
# Últimas filas
df.tail()
# Resumen estadístico
df.describe()
# Tipos de Datos
df.dtypes
# 4. Eliminar los duplicados
print(f'Original: {df.id.count()}filas')
duplicate_rows_df = df[df.duplicated()]
print(f'Cantidad de filas duplicadas: {duplicate_rows_df.id.count()}')
#Eliminar los duplicados
df = df.drop_duplicates()
#Filas restantes
print(f'Final: {df.id.count()}filas')
# 5. Eliminar las columnas irrelevantes
print(df.columns)
df = df.drop(['id'], axis=1)
print(df.columns)
# 6. Renombrar Columnas
df = df.rename(columns= {
"gender":"Gender",
"race/ethnicity":"Ethnicity",
"parental level of education":"Parental level of education",
"lunch":"Lunch",
"employed":"Employed",
"test preparation course":"Test preparation course",
"math score":"Math score",
"physics score":"Physics score",
"chemistry score":"Chemistry score",
"algebra_score":"Algebra_score"
})
df.columns
# Encontras y eliminar los valores perdidos o nulos
print(df.isnull().sum())
df = df.dropna()
#8. Detectar los outliers
sns.boxplot(x=df['Math score'])
plt.show()
sns.boxplot(x=df['Physics score'])
plt.show()
sns.boxplot(x=df['Algebra_score'])
plt.show()
sns.boxplot(x=df['Chemistry score'])
plt.show()
print(f'Antes: {df.Lunch.count()} filas/n')
Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1
print(IQR)
df = df[~((df < (Q1-1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).any(axis=1)]
print(f'/nDespués: {df.Lunch.count()} filas')
# 9. Encontras correlaciones y frecuencias
plt.hist(df['Algebra_score'], bins=20)
plt.title("Algebra")
plt.ylabel("Student count")
plt.xlabel("Score")
plt.show()
plt.hist(df['Chemistry score'], bins=20)
plt.title("Chemistry")
plt.ylabel("Student count")
plt.xlabel("Score")
plt.show()
plt.hist(df['Math score'], bins=20)
plt.title("Math")
plt.ylabel("Student count")
plt.xlabel("Score")
plt.show()
plt.hist(df['Physics score'], bins=20)
plt.title("Physics")
plt.ylabel("Student count")
plt.xlabel("Score")
plt.show()
# Correlación entre los datos = Mapas de calor
c = df.corr()
print(c)
plt.figure(figsize=(20,10))
sns.heatmap(c,cmap="BrBG",annot=True)
plt.show()
# pandas.value_counts() - Devuelve Serie de valores únicos en orden descendente de frecuencia
labels = df["Gender"].value_counts().index
sizes = df["Gender"].value_counts()
plt.pie(sizes, labels=labels, autopct='%1.2f%%')
plt.title('Gender')
plt.show()
labels = df["Ethnicity"].value_counts().index
sizes = df["Ethnicity"].value_counts()
plt.pie(sizes, labels=labels, autopct='%1.2f%%')
plt.title('Ethnicity')
plt.show()
labels = df["Employed"].value_counts().index
sizes = df["Employed"].value_counts()
plt.pie(sizes, labels=labels, autopct='%1.2f%%')
plt.title('Employed')
plt.show()
labels = df["Test preparation course"].value_counts().index
sizes = df["Test preparation course"].value_counts()
plt.pie(sizes, labels=labels, autopct='%1.2f%%')
plt.title('Test preparation course')
plt.show()
labels = df["Parental level of education"].value_counts().index
sizes = df["Parental level of education"].value_counts()
plt.pie(sizes, labels=labels, autopct='%1.2f%%')
plt.title('Parental level of education')
plt.show()
labels = df["Lunch"].value_counts().index
sizes = df["Lunch"].value_counts()
plt.pie(sizes, labels=labels, autopct='%1.2f%%')
plt.title('Lunch')
plt.show()
Respondiendo preguntas
Ejemplo: ¿Hay alguna relación entre el promedio de notas obtenidas y el hecho de haber realizado el curso preparatorio?
df['Average Score'] = df.mean(axis = 1)
#axis = 1 hace que aploque la función sobre los valores numéricos de la fila en lugar de las columnas
df
si = df[df['Test preparation course']== 'completed']
no = df[df['Test preparation course']== 'none']
sns.histplot(si['Average Score'], color = 'blue', alpha=.4, fill=True)
sns.histplot(no['Average Score'], color = 'red', alpha=.4, fill=True)
plt.show()
Conclusiones: Si bien la cantidad de alumnos que no realizó el curso preparatorio casi duplica a la de quiene lo han completado, esta diferencia no se ve reflejada significativamente en el promedio de notas.
Se recomienda auditar los contenidos del curso, a fines de lograr una mejora en el rendimiento académico y aumentar el interés del alumnado.