# Start writing code here...
SELECT *
FROM 'exams.csv'
Trabajo Práctico Integrador
Análisis exploratorio
#1. Importar las librerias
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
# 2. Cargar los datos del Dataframe
df=pd.read_csv('exams.csv')
df
# Las primeras 5 filas
df.head()
#Las ultimas 5 filas
df.tail()
#Resumen estadistico
df.describe()
# 3. Revisar el tipo de datos
df.dtypes
# 4. Eliminar los datos 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()
# Cantidad de filas luego de eliminar los duplicados
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 las 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
# Eliminar los valores perdidos o nulos
# Encontrar los valores nulos
print(df.isnull().sum())
# Eliminar los valores perdidos
df = df.dropna()
# Despues de eliminar los nulos
print(df.isnull().sum())
# 8. Detectar los Outliers
sns.boxplot(x=df['Math score'], color='royalblue')
plt.show()
sns.boxplot(x=df['Physics score'], color='tomato')
plt.show()
sns.boxplot(x=df['Chemistry score'], color='crimson')
plt.show()
sns.boxplot(x=df['Algebra score'], color='dodgerblue')
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. Encontrar correlaciones y frecuencias
plt.hist(df['Algebra score'], color='dodgerblue', bins=20)
plt.title('Algebra')
plt.ylabel('Student count')
plt.xlabel('Score')
plt.show()
plt.hist(df['Chemistry score'], color='crimson', bins=20)
plt.title('Chemistry')
plt.ylabel('Student count')
plt.xlabel('Score')
plt.show()
plt.hist(df['Math score'], color='royalblue', bins=20)
plt.title('Math')
plt.ylabel('Student count')
plt.xlabel('Score')
plt.show()
plt.hist(df['Physics score'], color='tomato', bins=20)
plt.title('Physics')
plt.ylabel('Student count')
plt.xlabel('Score')
plt.show()
# Correlacion de los datos = Mapas de calor
c= df.corr()
print(c)
plt.figure(figsize=(20,10))
sns.heatmap(c,cmap="RdBu", annot=True)
plt.show()
# pandas.value_counts() --> devuelve una serie con valores unicos en orden descendente de frecuencia
labels = df['Gender'].value_counts().index
sizes = df['Gender'].value_counts()
colors = ['tomato', 'royalblue']
plt.pie(sizes, labels = labels, colors = colors, autopct='%1.2f%%')
plt.title('Gender')
plt.show()
#Repetimos para Etnia, Empleo y el resto de las variables categóricas
labels = df['Ethnicity'].value_counts().index
sizes = df['Ethnicity'].value_counts()
colors = ['tomato', 'royalblue', 'dodgerblue', 'coral', 'lightsalmon']
plt.pie(sizes, labels = labels,colors = colors, autopct='%1.2f%%')
plt.title('Ethnicity')
plt.show()
labels = df['Employed'].value_counts().index
sizes = df['Employed'].value_counts()
colors = ['tomato', 'royalblue']
plt.pie(sizes, labels = labels, colors = colors, autopct='%1.2f%%')
plt.title('Is the student employed?')
plt.show()
labels = df['Test preparation course'].value_counts().index
sizes = df['Test preparation course'].value_counts()
colors = ['tomato', 'royalblue']
plt.pie(sizes, labels = labels, colors = colors, 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()
colors = ['tomato', 'royalblue', 'dodgerblue', 'coral', 'lightsalmon', 'steelblue']
plt.pie(sizes, labels = labels, colors = colors, autopct='%1.2f%%')
plt.title('Parental level of education')
plt.show()
labels = df['Lunch'].value_counts().index
sizes = df['Lunch'].value_counts()
colors = ['tomato', 'royalblue']
plt.pie(sizes, labels = labels, colors = colors, 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 aplique 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=.5, fill=True)
sns.histplot(no['Average score'], color='red', alpha=.5, fill=True)
plt.show()
print('Realizaron el curso: ', si['Test preparation course'].count())
print('No realizaron el curso: ', no['Test preparation course'].count())
Conclusión: Si bien la cantidad de alumnos que no realizo el curso casi duplica a la de quienes lo han completado, esta diferencia no se ve reflejada significativamente en el promedio de las 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.