# Import pandas
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
%pylab inline
# Assign spreadsheet filename: file
file = '../data/imd_student_blind.xlsx'
# Load spreadsheet: xl
xl = pd.ExcelFile(file)
# Load a sheet into a DataFrame by index: df
df = xl.parse(0)
Todas as disciplinas
Aprovados: 2766 (57.12%)
Reprovados: 2076 (42.88%)
#print(df['status.disciplina'].value_counts())
df['status.disciplina'].value_counts().plot('bar')
Disciplina 3
Reprovados: 334 (61.74%)
Aprovados: 207 (38.26%)
Disciplina 5
Reprovado: 523 (66.80%)
Aprovados: 260 (33.20%)
df1 = pd.DataFrame(df[df.disciplina_ID == 3]["status.disciplina"].value_counts())
df2 = pd.DataFrame(df[df.disciplina_ID == 5]["status.disciplina"].value_counts())
df1['Key'] = 'Disc3'
df2['Key'] = 'Disc5'
DFF = pd.concat([df1,df2],keys=['Disc3','Disc5'])
DFF.plot(kind='bar', figsize = (14,6), title = "Status dos alunos nas diciplinas 3 e 5")
Como a disciplina 5 tem uma taxa de 25.19% de todas as reprovações dos 2 primeiros semestres então vamos trabalhar com ela
pd_disc5 = pd.DataFrame(df[df.disciplina_ID == 5])
pd_disc5["nota"].plot('hist', figsize = (14,6), title = "Notas dos alunos da disciplina 5")
def tableAnalytics(mydf, idDisc):
pd_mydf = pd.DataFrame(mydf[mydf.disciplina_ID == idDisc])
reprovados, aprovados, anoSemestre, valMin, quantile1, median, quantile3, valMax, mean, variance, standardDeviation, amplitude = list(), list(), list(), list(), list(), list(), list(), list(), list(), list(), list(), list()
for ano in range(2014, 2017):
for semestre in range (1, 3):
pd_aux = pd_mydf[pd_mydf.periodo_disciplina == semestre][pd_mydf.ano_disciplina == ano]
aprovados.append(str(pd_aux['status.disciplina'].value_counts()["Aprovado"])+" ("+str(round(pd_aux['status.disciplina'].value_counts(True)["Aprovado"]*100, 2))+"%)")
reprovados.append(str(pd_aux['status.disciplina'].value_counts()["Reprovado"])+" ("+str(round(pd_aux['status.disciplina'].value_counts(True)["Reprovado"]*100, 2))+"%)")
anoSemestre.append(str(ano)+"."+str(semestre))
valMin.append(pd_aux['nota'].min())
quantile1.append(pd_aux['nota'].quantile(q = 0.25))
median.append(pd_aux['nota'].median())
quantile3.append(pd_aux['nota'].quantile(q = 0.75))
valMax.append(pd_aux['nota'].max())
mean.append(pd_aux['nota'].mean())
variance.append(pd_aux['nota'].var())
standardDeviation.append(pd_aux['nota'].std())
summary = pd.DataFrame({
'_Aprovados': aprovados,
'_Reprovados': reprovados,
'AnoSemestre' : anoSemestre,
'ValueMin': valMin,
'Quantile1':quantile1,
'Median': median,
'Quantile3': quantile3,
'ValueMax': valMax,
'Average': mean,
'Variance': variance,
'StandardDeviation': standardDeviation})
return summary
tableAnalytics(df, 5)
#df[df.ano_disciplina == 2016][df.periodo_disciplina == 2].head()
df[df.ano_disciplina == 2016][df.periodo_disciplina == 1][df.disciplina_ID == 5]["nota"].plot.box(by=None, grid=True)
df[df.ano_disciplina == 2016][df.periodo_disciplina == 2][df.disciplina_ID == 3]["nota"].plot.box(by=None, grid=True)
from sklearn import linear_model
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
allPeriod = []
person = []
person2 = []
disciplineID = []
studentsFilter = []
for ano in range(2014, 2017):
for semestre in range(1, 3):
studentsFilter = df[df.ano_disciplina == ano][df.periodo_disciplina == semestre][df.disciplina_ID == 5]["a_ID"].unique()
classFilter = df[df.ano_disciplina == ano][df.periodo_disciplina == semestre]
for disId in range(0,7):
listKey = []
listRelative = []
for student in studentsFilter:
if not classFilter[classFilter.a_ID == student][classFilter.disciplina_ID == disId]["nota"].empty:
listKey.append(classFilter[classFilter.a_ID == student][classFilter.disciplina_ID == 5]["nota"].values)
listRelative.append(classFilter[classFilter.a_ID == student][classFilter.disciplina_ID == disId]["nota"].values)
disciplineID.append(disId)
allPeriod.append(str(ano)+"."+str(semestre))
person.append(pearsonr(listKey, listRelative)[0])
person2.append((pearsonr(listKey, listRelative)[0]**2)*100)
Foi usado o Coeficiente de correlação de Pearson para verificar a correlação da nota da disciplina5 com as outras que o aluno está cursando no mesmo semestre.
Não tendo uma regularidade nos resultados, não podemos afirmar que exista um correlação linear entre as disciplinas analisadas.
É possível que existam variáveis ocultas que estão interferindo nos valores, como dedicação dos alunos, material didático, habilidades de ensino dos professores e outros.
df_person = pd.DataFrame({
'anoSemestre': allPeriod,
'person': person,
'person²': person2,
'disciplineID' : disciplineID})
df_person.sort(['person²'])
from sklearn import linear_model
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
allPeriod = []
person = []
person2 = []
disciplineID = []
studentsFilter = []
for ano in range(2014, 2016):
for semestre in range(1, 3):
studentsFilter = df[df.ano_disciplina == ano][df.periodo_disciplina == semestre][df.disciplina_ID == 5]["a_ID"].unique()
classFilter = df[df.ano_disciplina == ano][df.periodo_disciplina == semestre]
for disId in range(2,3):
listKey = []
listRelative = []
for student in studentsFilter:
if not classFilter[classFilter.a_ID == student][classFilter.disciplina_ID == disId]["nota"].empty:
print(student) #estudantes que estão magicamente pagando dis3 e dis5
listKey.append(classFilter[classFilter.a_ID == student][classFilter.disciplina_ID == 5]["nota"].values)
listRelative.append(classFilter[classFilter.a_ID == student][classFilter.disciplina_ID == disId]["nota"].values)
disciplineID.append(disId)
allPeriod.append(str(ano)+"."+str(semestre))
person.append(pearsonr(listKey, listRelative)[0])
person2.append((pearsonr(listKey, listRelative)[0]**2)*100)
df_person = pd.DataFrame({
'anoSemestre': allPeriod,
'person': person,
'person2': person2,
'disciplineID' : disciplineID})
#df_person.sort(['person2'])
#df[df.a_ID == 219]