Análise de dados dos discentes da UFS¶

A partir do dataset disponibilizado em https://dados.ufs.br/, será feita uma análise sobre as taxas de evasão e de conclusão dos cursos da Universidade Federal de Sergipe (UFS), destaque para o curso de Ciência da Computação e aos demais cursos do Departamento de Computação (DCOMP), a saber, Engenharia da Computação e Sistemas de Informação.

Evasão e aprovação do curso de Ciência da Computação¶

  • Número de discentes aprovados, desistentes e ativos da turma de 2018
  • Comparativo do número de aprovações e desistências por turma
  • Acumulativo do número de aprovações e desistências ao longo do tempo
  • Verificar se e quantos discentes cancelaram a matrícula e se matricularam novamente
  • Verificar o status atual desses discentes

Evasão e aprovação dos cursos de Engenharia da Computação e Sistemas de Informação¶

  • Fazer as mesmas verificações do tópico anterior

Migração entre os cursos¶

  • Verificar se e quantos discentes cancelaram suas matrículas em um curso e se matricularam em outro do mesmo departamento

Evasão e aprovação dos cursos da UFS¶

  • Quais os cursos com maior e menor taxa de evasão
  • Qual turno com maior e menor taxa de evasão
  • Quais os departamentos com maior e menor taxa de evasão
  • Migração entre cursos

Evasão e aprovação do curso de Ciência da Computação¶

Primeira análise: discentes com matrículas ativas, canceladas e concluídas¶

Nesta primeira análise, será dada ênfase aos discentes matriculados em 2018, tanto por, em particular, ser a minha turma, quanto por das últimas turmas, ser a que apresenta o tempo mínimo para a conclusão da graduação.

In [ ]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from urllib.error import HTTPError
from sklearn.preprocessing import LabelEncoder

Importação dos dados¶

In [ ]:
def importar_dados():
  # monta o drive, tornando possível acessar os arquivos da minha conta
  from google.colab import drive
  drive.mount('/content/drive')

  path_arquivos = '/content/drive/MyDrive/Análises de Dados/res'
  nome_csv = 'discentes_ufs.csv'
  path_local = f'{path_arquivos}/{nome_csv}'

  path_dados_ufs = 'https://dados.ufs.br/dataset/discentes_graduacao/resource'

  try:
    df = pd.read_csv(path_local)
  except FileNotFoundError:
    df = pd.DataFrame([])

    for i in range(10, 24):
      sub_path_dados_ufs = f'dis-csv-discentes-de-graduacao-de-20{i}/download'
      path_remoto = f'{path_dados_ufs}/{sub_path_dados_ufs}'

      # acessa o arquivo .csv disponível no site da UFS
      df_consulta = pd.read_csv(path_remoto)
      df = pd.concat([df, df_consulta])
    # salva o arquivo .csv localmente no Google Dreive
    df.to_csv(path_local, index=False)

  return df


def gerar_grafico(df: pd.DataFrame):
  sns.set()

  # Crie um gráfico de barras usando o Seaborn e obtenha o objeto de eixo
  _, ax = plt.subplots(1, figsize=(24, 6))

  lista_status = df['status_discente'].unique()
  lista_status.sort()
  # Lista com uma cor para cada status
  lista_cores = ['#10175E', '#6B75E3', '#2635DE', '#2C315E', '#1D29AB', '#406CE5']

  cores_status = dict(zip(lista_status, lista_cores))

  primeiro_ano = df['ano_ingresso'].min()
  ultimo_ano = df['ano_ingresso'].max()

  # Use o objeto de eixo 'ax' para criar o gráfico de barras
  sns.countplot(
      data=df,
      x='ano_ingresso',
      hue='status_discente',
      ax=ax,
      palette=cores_status
  )

  # remove o frame que circunda o gráfico
  ax.spines['right'].set_visible(False)
  ax.spines['bottom'].set_visible(False)
  ax.spines['left'].set_visible(False)

  # Adicione os valores de contagem no topo de cada barra
  for p in ax.patches:
      height = p.get_height()
      ax.annotate(f'{int(height)}', (p.get_x() + p.get_width() / 2, height),
                  ha='center', va='bottom')

  # Defina os rótulos dos eixos e o título do gráfico
  ax.set_xlabel('Ano de Ingresso')
  ax.set_ylabel('Número de Discentes')
  ax.set_title(f'Status dos discentes por ano ({primeiro_ano} a {ultimo_ano})')

  # Gire os rótulos do eixo x para melhor visualização
  ax.set_xticklabels(ax.get_xticklabels())
  # remove o eixo y
  ax.get_yaxis().set_visible(False)

  # Mostre o gráfico
  ax.legend(
      loc='upper right',
      title='Status Discente',
      draggable=True
  )
  plt.show()
In [ ]:
encoder = LabelEncoder()

df_discentes = importar_dados()
df_discentes['nome_discente'] = encoder.fit_transform(df_discentes['nome_discente'])

df_computacao = df_discentes.loc[df_discentes['nome_unidade'] == 'DEPARTAMENTO DE COMPUTAÇÃO']
df_cc = df_computacao.loc[df_computacao['nome_curso'] == 'Ciência Da Computação Bacharelado/São Cristóvão (Vespertino)']
df_si = df_computacao.loc[df_computacao['nome_curso'] == 'Sistemas de Informação Bacharelado/São Cristóvão (Noturno)']
df_ec_mat = df_computacao.loc[df_computacao['nome_curso'] =='Engenharia de Computação Bacharelado/São Cristóvão (Matutino)']
df_ec_vesp = df_computacao.loc[df_computacao['nome_curso'] =='Engenharia de Computação Bacharelado/São Cristóvão (Vespertino)']
df_ec = pd.concat([df_ec_mat, df_ec_vesp])

# as seguintes colunas tem valores constantes para o curso de CC. Vamos descartá-los
df_cc.drop(['nome_curso', 'nome_unidade', 'nome_unidade_gestora', 'nivel_ensino'], axis=1, inplace=True)
df_cc_2018 = df_cc.loc[df_cc['ano_ingresso'] == 2018]

df_cc_2018.head()
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
<ipython-input-3-9f0aae307ba6>:14: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df_cc.drop(['nome_curso', 'nome_unidade', 'nome_unidade_gestora', 'nivel_ensino'], axis=1, inplace=True)
Out[ ]:
matricula nome_discente ano_ingresso periodo_ingresso tipo_discente status_discente modalidade_educacao
58239 201800083517 1448 2018 1 REGULAR CANCELADO PRESENCIAL
58355 201800016550 3261 2018 1 REGULAR ATIVO PRESENCIAL
58665 201800083590 7523 2018 1 REGULAR CANCELADO PRESENCIAL
58702 201800083642 8007 2018 1 REGULAR CANCELADO PRESENCIAL
58722 201800016579 8293 2018 1 REGULAR ATIVO PRESENCIAL
In [ ]:
gerar_grafico(df_cc_2018)
No description has been provided for this image

Em 2018, duas turmas de 50 discentes cada foram ingressadas ao curso. Os dados mostram que a quantidade equivalente a uma turma inteira desistiu.

Segunda análise: Evasão e conclusão do curso de ciência da computação¶

In [ ]:
df_cc_plot = df_cc.groupby(['ano_ingresso', 'status_discente']).size().reset_index(name='contagem')
df_cc_plot = df_cc_plot.pivot(index='ano_ingresso', columns='status_discente', values='contagem')

ax = df_cc_plot.plot(
    kind='line',
    figsize=(24, 8)
)

linhas_horizontais = [0, 20, 40, 60, 80, 100]
# remove o frame que circunda o gráfico
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)

for linha in linhas_horizontais:
    plt.axhline(y=linha, color='lightgray', linestyle='--')

ax.legend(loc='upper right')
ax.set_title('Status dos discentes de Ciência da Computação por Ano de Ingresso');
No description has been provided for this image
In [ ]:
primeiro_quarteto = (df_cc['ano_ingresso'].min(), df_cc['ano_ingresso'].min() + 3)
segundo_quarteto = (max(primeiro_quarteto) + 1, max(primeiro_quarteto) + 4)
terceiro_quarteto = (max(segundo_quarteto) + 1, max(segundo_quarteto) + 4)

# Filtre o DataFrame para incluir apenas os 4 primeiros anos (ajuste a condição conforme necessário)
dados_primeiro_quarteto = df_cc[
    df_cc['ano_ingresso'].between(primeiro_quarteto[0], primeiro_quarteto[1])
]
dados_segundo_quarteto = df_cc[
    df_cc['ano_ingresso'].between(segundo_quarteto[0], segundo_quarteto[1])
]
dados_terceiro_quarteto = df_cc[
    df_cc['ano_ingresso'].between(terceiro_quarteto[0], terceiro_quarteto[1])
]
In [ ]:
gerar_grafico(dados_primeiro_quarteto)
No description has been provided for this image
In [ ]:
gerar_grafico(dados_segundo_quarteto)
No description has been provided for this image
In [ ]:
gerar_grafico(dados_terceiro_quarteto)
No description has been provided for this image

Vamos analisar os discentes reingressantes, aqueles que cancelaram suas matrículas, mas matrcularam-se novamente posteriormente.

  • Qual a quantidade de alunos reingressantes
  • Em que ano há mais desistentes
  • Em que ano há mais reingressantes
  • Qual o status dos alunos reingressantes. Dessitiram novamente, ainda estão estudando ou se formaram?
In [ ]:
nomes_discentes = df_cc['nome_discente']

df_reingressantes = df_cc[
    nomes_discentes.isin(nomes_discentes[nomes_discentes.duplicated()])
].sort_values("nome_discente")

df_reingressantes.head()
Out[ ]:
matricula nome_discente ano_ingresso periodo_ingresso tipo_discente status_discente modalidade_educacao
59084 201800016597 12710 2018 1 REGULAR CANCELADO PRESENCIAL
53184 201700017180 12710 2017 1 REGULAR CANCELADO PRESENCIAL
65093 201900016830 12927 2019 1 REGULAR CANCELADO PRESENCIAL
46878 201600016644 12927 2016 1 REGULAR CANCELADO PRESENCIAL
59109 201800017253 13078 2018 1 REGULAR CANCELADO PRESENCIAL
In [ ]:
num_reingressantes = len(df_reingressantes['nome_discente'].unique())

ano_ingresso = df_reingressantes.groupby('nome_discente')['ano_ingresso'].idxmin()
ano_reingresso = df_reingressantes.groupby('nome_discente')['ano_ingresso'].idxmax()

df_ingresso = df_reingressantes.loc[ano_ingresso]
df_reingresso = df_reingressantes.loc[ano_reingresso]

cont_ano_ingresso = df_ingresso['ano_ingresso'].value_counts()
cont_ano_reingresso = df_reingresso['ano_ingresso'].value_counts()
cont_status = df_reingresso['status_discente'].value_counts()

lista_ingresso = [tuple((status, contagem)) for status, contagem in cont_ano_ingresso.items()]
lista_reingresso = [tuple((status, contagem)) for status, contagem in cont_ano_reingresso.items()]
lista_status = [tuple((status, contagem)) for status, contagem in cont_status.items()]

print(f'Existem {num_reingressantes} discentes reingressantes no curso de Ciência da Computação')
print(lista_ingresso)
print(lista_reingresso)
print(lista_status)
Existem 29 discentes reingressantes no curso de Ciência da Computação
[(2010, 5), (2016, 3), (2012, 3), (2013, 3), (2014, 3), (2017, 2), (2020, 2), (2015, 2), (2011, 2), (2018, 1), (2019, 1), (2022, 1), (2021, 1)]
[(2013, 5), (2022, 4), (2018, 3), (2019, 3), (2021, 3), (2020, 3), (2015, 3), (2016, 2), (2014, 1), (2017, 1), (2023, 1)]
[('CANCELADO', 15), ('ATIVO', 9), ('CONCLUÍDO', 5)]

Terceira análise: Evasão e conclusão do curso de Engenharia da Computação¶

In [ ]:
primeiro_quarteto_ec = (df_ec['ano_ingresso'].min(), df_ec['ano_ingresso'].min() + 3)
segundo_quarteto_ec = (max(primeiro_quarteto_ec) + 1, max(primeiro_quarteto_ec) + 4)
terceiro_quarteto_ec = (max(segundo_quarteto_ec) + 1, max(segundo_quarteto_ec) + 4)

# Filtre o DataFrame para incluir apenas os 4 primeiros anos (ajuste a condição conforme necessário)
dados_primeiro_quarteto_ec = df_ec[
    df_ec['ano_ingresso'].between(primeiro_quarteto_ec[0], primeiro_quarteto_ec[1])
]
dados_segundo_quarteto_ec = df_ec[
    df_ec['ano_ingresso'].between(segundo_quarteto_ec[0], segundo_quarteto_ec[1])
]
dados_terceiro_quarteto_ec = df_ec[
    df_ec['ano_ingresso'].between(terceiro_quarteto_ec[0], terceiro_quarteto_ec[1])
]
In [ ]:
gerar_grafico(dados_primeiro_quarteto_ec)
No description has been provided for this image
In [ ]:
gerar_grafico(dados_segundo_quarteto_ec)
No description has been provided for this image
In [ ]:
gerar_grafico(dados_terceiro_quarteto_ec)
No description has been provided for this image
In [ ]:
nomes_discentes = df_ec['nome_discente']

df_reingressantes = df_ec[
    nomes_discentes.isin(nomes_discentes[nomes_discentes.duplicated()])
].sort_values("nome_discente")

num_reingressantes = len(df_reingressantes['nome_discente'].unique())

ano_ingresso = df_reingressantes.groupby('nome_discente')['ano_ingresso'].idxmin()
ano_reingresso = df_reingressantes.groupby('nome_discente')['ano_ingresso'].idxmax()

df_ingresso = df_reingressantes.loc[ano_ingresso]
df_reingresso = df_reingressantes.loc[ano_reingresso]

cont_ano_ingresso = df_ingresso['ano_ingresso'].value_counts()
cont_ano_reingresso = df_reingresso['ano_ingresso'].value_counts()
cont_status = df_reingresso['status_discente'].value_counts()

lista_ingresso = [tuple((status, contagem)) for status, contagem in cont_ano_ingresso.items()]
lista_reingresso = [tuple((status, contagem)) for status, contagem in cont_ano_reingresso.items()]
lista_status = [tuple((status, contagem)) for status, contagem in cont_status.items()]

print(f'Existem {num_reingressantes} discentes reingressantes no curso de Engenharia da Computação')
print(lista_ingresso)
print(lista_reingresso)
print(lista_status)
Existem 11 discentes reingressantes no curso de Engenharia da Computação
[(2011, 3), (2016, 2), (2020, 2), (2012, 2), (2014, 1), (2018, 1)]
[(2015, 2), (2016, 2), (2014, 1), (2020, 1), (2023, 1), (2021, 1), (2019, 1), (2022, 1), (2018, 1)]
[('CANCELADO', 5), ('ATIVO', 5), ('CONCLUÍDO', 1)]

Quarta análise: Curso de Sistemas de Informação

In [ ]:
primeiro_quarteto_si = (df_si['ano_ingresso'].min(), df_si['ano_ingresso'].min() + 3)
segundo_quarteto_si = (max(primeiro_quarteto_si) + 1, max(primeiro_quarteto_si) + 4)
terceiro_quarteto_si = (max(segundo_quarteto_si) + 1, max(segundo_quarteto_si) + 4)

# Filtre o DataFrame para incluir apenas os 4 primeiros anos (ajuste a condição conforme necessário)
dados_primeiro_quarteto_si = df_si[
    df_si['ano_ingresso'].between(primeiro_quarteto_si[0], primeiro_quarteto_si[1])
]
dados_segundo_quarteto_si = df_si[
    df_si['ano_ingresso'].between(segundo_quarteto_si[0], segundo_quarteto_si[1])
]
dados_terceiro_quarteto_si = df_si[
    df_si['ano_ingresso'].between(terceiro_quarteto_si[0], terceiro_quarteto_si[1])
]
In [ ]:
gerar_grafico(dados_primeiro_quarteto_si)
No description has been provided for this image
In [ ]:
gerar_grafico(dados_segundo_quarteto_si)
No description has been provided for this image
In [ ]:
gerar_grafico(dados_terceiro_quarteto_si)
No description has been provided for this image
In [ ]:
# Curiosidade: discentes formados da minha turma de SI
# dados_segundo_quarteto_si.loc[(dados_segundo_quarteto_si['status_discente'] != 'CANCELADO') & (dados_segundo_quarteto_si['status_discente'] != 'ATIVO') & (dados_segundo_quarteto_si['ano_ingresso'] == 2016), ['nome_discente', 'status_discente']]
In [ ]:
nomes_discentes = df_si['nome_discente']

df_reingressantes = df_si[
    nomes_discentes.isin(nomes_discentes[nomes_discentes.duplicated()])
].sort_values("nome_discente")

num_reingressantes = len(df_reingressantes['nome_discente'].unique())

ano_ingresso = df_reingressantes.groupby('nome_discente')['ano_ingresso'].idxmin()
ano_reingresso = df_reingressantes.groupby('nome_discente')['ano_ingresso'].idxmax()

df_ingresso = df_reingressantes.loc[ano_ingresso]
df_reingresso = df_reingressantes.loc[ano_reingresso]

cont_ano_ingresso = df_ingresso['ano_ingresso'].value_counts()
cont_ano_reingresso = df_reingresso['ano_ingresso'].value_counts()
cont_status = df_reingresso['status_discente'].value_counts()

lista_ingresso = [tuple((status, contagem)) for status, contagem in cont_ano_ingresso.items()]
lista_reingresso = [tuple((status, contagem)) for status, contagem in cont_ano_reingresso.items()]
lista_status = [tuple((status, contagem)) for status, contagem in cont_status.items()]

print(f'Existem {num_reingressantes} discentes reingressantes no curso de Sistemas de Informação')
print(lista_ingresso)
print(lista_reingresso)
print(lista_status)
Existem 10 discentes reingressantes no curso de Sistemas de Informação
[(2014, 3), (2010, 2), (2012, 2), (2017, 2), (2016, 1)]
[(2016, 3), (2017, 2), (2018, 2), (2019, 1), (2015, 1), (2020, 1)]
[('CANCELADO', 6), ('ATIVO', 3), ('CONCLUÍDO', 1)]

Migração entre cursos de computação¶

Quero saber quantos discentes trocaram de curso para outro do mesmo departamento e qual o curso que os discentes mais saem e para o qual mais vão

In [ ]:
nomes_discentes = df_computacao['nome_discente']

df_reingressantes = df_computacao[
    nomes_discentes.isin(nomes_discentes[nomes_discentes.duplicated()])
].sort_values("nome_discente")
In [ ]:
# Encontre o ano de primeira matrícula (ano de ingresso mínimo) com curso de origem
matricula_origem = df_reingressantes.groupby('nome_discente').agg({'ano_ingresso': 'min', 'nome_curso': 'first'}).reset_index()

# Encontre o ano de reingresso (ano de ingresso máximo) com curso atual
matricula_atual = df_reingressantes.groupby('nome_discente').agg({'ano_ingresso': 'max', 'nome_curso': 'last'}).reset_index()

# Renomeie as colunas para melhor clareza
matricula_origem = matricula_origem.rename(columns={'ano_ingresso': 'ano_primeira_matricula', 'nome_curso': 'curso_origem'})
matricula_atual = matricula_atual.rename(columns={'ano_ingresso': 'ano_reingresso', 'nome_curso': 'curso_atual'})
In [ ]:
matricula_origem['curso_origem'].value_counts()
Out[ ]:
Ciência Da Computação Bacharelado/São Cristóvão (Vespertino)       90
Sistemas de Informação Bacharelado/São Cristóvão (Noturno)         49
Engenharia de Computação Bacharelado/São Cristóvão (Matutino)      33
Engenharia de Computação Bacharelado/São Cristóvão (Vespertino)    28
Name: curso_origem, dtype: int64
In [ ]:
matricula_atual['curso_atual'].value_counts()
Out[ ]:
Ciência Da Computação Bacharelado/São Cristóvão (Vespertino)       96
Sistemas de Informação Bacharelado/São Cristóvão (Noturno)         48
Engenharia de Computação Bacharelado/São Cristóvão (Matutino)      32
Engenharia de Computação Bacharelado/São Cristóvão (Vespertino)    24
Name: curso_atual, dtype: int64

Visualização de dados: migrações¶

Uma forma de visualizar migrações é com o uso do diagrama de cordas. A biblioteca pyCirclize será utilizada para experimentar esse tipo de gráfico para visualizar a migração de cursos.

Documentação: https://moshi4.github.io/pyCirclize/getting_started/

In [ ]:
pip install pycirclize
Requirement already satisfied: pycirclize in /usr/local/lib/python3.10/dist-packages (1.0.0)
Requirement already satisfied: biopython>=1.79 in /usr/local/lib/python3.10/dist-packages (from pycirclize) (1.81)
Requirement already satisfied: matplotlib>=3.5.2 in /usr/local/lib/python3.10/dist-packages (from pycirclize) (3.7.1)
Requirement already satisfied: numpy>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from pycirclize) (1.23.5)
Requirement already satisfied: pandas>=1.3.5 in /usr/local/lib/python3.10/dist-packages (from pycirclize) (1.5.3)
Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.5.2->pycirclize) (1.2.0)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.5.2->pycirclize) (0.12.1)
Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.5.2->pycirclize) (4.44.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.5.2->pycirclize) (1.4.5)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.5.2->pycirclize) (23.2)
Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.5.2->pycirclize) (9.4.0)
Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.5.2->pycirclize) (3.1.1)
Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.10/dist-packages (from matplotlib>=3.5.2->pycirclize) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.10/dist-packages (from pandas>=1.3.5->pycirclize) (2023.3.post1)
Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.10/dist-packages (from python-dateutil>=2.7->matplotlib>=3.5.2->pycirclize) (1.16.0)
In [ ]:
df_migracoes = matricula_origem.copy()

df_migracoes['ano_reingresso'] = matricula_atual['ano_reingresso']
df_migracoes['curso_atual'] = matricula_atual['curso_atual']
df_migracoes.head(10)
Out[ ]:
nome_discente ano_primeira_matricula curso_origem ano_reingresso curso_atual
0 11 2011 Engenharia de Computação Bacharelado/São Crist... 2014 Engenharia de Computação Bacharelado/São Crist...
1 407 2012 Sistemas de Informação Bacharelado/São Cristóv... 2019 Engenharia de Computação Bacharelado/São Crist...
2 557 2020 Sistemas de Informação Bacharelado/São Cristóv... 2021 Engenharia de Computação Bacharelado/São Crist...
3 1442 2010 Sistemas de Informação Bacharelado/São Cristóv... 2017 Sistemas de Informação Bacharelado/São Cristóv...
4 1749 2013 Engenharia de Computação Bacharelado/São Crist... 2015 Sistemas de Informação Bacharelado/São Cristóv...
5 1923 2012 Sistemas de Informação Bacharelado/São Cristóv... 2019 Engenharia de Computação Bacharelado/São Crist...
6 3092 2016 Sistemas de Informação Bacharelado/São Cristóv... 2020 Engenharia de Computação Bacharelado/São Crist...
7 3177 2018 Engenharia de Computação Bacharelado/São Crist... 2020 Ciência Da Computação Bacharelado/São Cristóvã...
8 3560 2010 Sistemas de Informação Bacharelado/São Cristóv... 2014 Ciência Da Computação Bacharelado/São Cristóvã...
9 5840 2011 Ciência Da Computação Bacharelado/São Cristóvã... 2020 Engenharia de Computação Bacharelado/São Crist...
In [ ]:
df_cont_migracoes = df_migracoes.groupby(['curso_origem', 'curso_atual']).size().sort_values(ascending=False)
df_cont_migracoes = pd.DataFrame(df_cont_migracoes.reset_index())
df_cont_migracoes.rename(columns={'curso_origem': 'Curso de origem', 'curso_atual': 'Curso atual', 0: 'Quantidade de migrantes'}, inplace=True)
df_cont_migracoes.replace(
    {'Engenharia de Computação Bacharelado/São Cristóvão (Matutino)': 'Engenharia de Comp. (Matutino)',
     'Sistemas de Informação Bacharelado/São Cristóvão (Noturno)': 'Sistemas de Informação',
     'Engenharia de Computação Bacharelado/São Cristóvão (Vespertino)': 'Engenharia de Comp. (Vespertino)',
     'Ciência Da Computação Bacharelado/São Cristóvão (Vespertino)': 'Ciência da Computação'
    },
    inplace=True
)
df_cont_migracoes
Out[ ]:
Curso de origem Curso atual Quantidade de migrantes
0 Sistemas de Informação Ciência da Computação 32
1 Ciência da Computação Ciência da Computação 27
2 Ciência da Computação Engenharia de Comp. (Matutino) 24
3 Ciência da Computação Sistemas de Informação 23
4 Engenharia de Comp. (Matutino) Ciência da Computação 21
5 Ciência da Computação Engenharia de Comp. (Vespertino) 16
6 Engenharia de Comp. (Vespertino) Ciência da Computação 16
7 Sistemas de Informação Sistemas de Informação 10
8 Engenharia de Comp. (Matutino) Sistemas de Informação 9
9 Engenharia de Comp. (Vespertino) Sistemas de Informação 6
10 Engenharia de Comp. (Vespertino) Engenharia de Comp. (Vespertino) 4
11 Sistemas de Informação Engenharia de Comp. (Matutino) 4
12 Sistemas de Informação Engenharia de Comp. (Vespertino) 3
13 Engenharia de Comp. (Matutino) Engenharia de Comp. (Matutino) 2
14 Engenharia de Comp. (Vespertino) Engenharia de Comp. (Matutino) 2
15 Engenharia de Comp. (Matutino) Engenharia de Comp. (Vespertino) 1
In [ ]:
from pycirclize import Circos
from pycirclize.parser import Matrix

matrix = Matrix.parse_fromto_table(df_cont_migracoes)

circos = Circos.initialize_from_matrix(
    matrix,
    space=3,
    cmap="viridis",
    ticks_interval=5,
    label_kws=dict(size=12, r=110),
    link_kws=dict(direction=1, ec="black", lw=0.5),
)
In [ ]:
circos.plotfig()
Out[ ]:
No description has been provided for this image
No description has been provided for this image

Conclusões¶

Evasão e aprovação dos cursos da UFS¶

Cursos com maior e menor taxa de evasão¶

Taxa de evasão por turno¶

Evasão por departamento¶