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.
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¶
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()
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)
| 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 |
gerar_grafico(df_cc_2018)
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¶
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');
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])
]
gerar_grafico(dados_primeiro_quarteto)
gerar_grafico(dados_segundo_quarteto)
gerar_grafico(dados_terceiro_quarteto)
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?
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()
| 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 |
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¶
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])
]
gerar_grafico(dados_primeiro_quarteto_ec)
gerar_grafico(dados_segundo_quarteto_ec)
gerar_grafico(dados_terceiro_quarteto_ec)
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
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])
]
gerar_grafico(dados_primeiro_quarteto_si)
gerar_grafico(dados_segundo_quarteto_si)
gerar_grafico(dados_terceiro_quarteto_si)
# 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']]
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
nomes_discentes = df_computacao['nome_discente']
df_reingressantes = df_computacao[
nomes_discentes.isin(nomes_discentes[nomes_discentes.duplicated()])
].sort_values("nome_discente")
# 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'})
matricula_origem['curso_origem'].value_counts()
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
matricula_atual['curso_atual'].value_counts()
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/
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)
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)
| 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... |
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
| 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 |
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),
)
circos.plotfig()