O que você vai fazer

Você vai trabalhar como analista de dados de uma escola e responder a 4 perguntas da diretoria usando Python e Pandas. Cada pergunta é dividida em passos pequenos, com explicação, dica e resposta para conferir.

Como estudar esta nota

  1. Leia a explicação.
  2. Tente escrever o código sozinho (os espaços ____ são para você completar).
  3. Só então abra a resposta (as caixas dobráveis abrem ao clicar no título).
  4. Se errou, tudo bem: leia a seção Erros comuns de iniciante, mais abaixo, e tente de novo.

No Google Colab, escreva cada bloco de código em uma célula e rode com Shift + Enter.

Quer o desafio completo, com SQL e casos mais difíceis? Veja a versão completa.


🧠 1. A ideia por trás de tudo

Imagine que a secretaria da escola guarda as informações em três cadernos separados:

CadernoO que guarda
📒 alunosquem são os alunos (nome, idade, cidade)
📗 cursosquais cursos existem e quanto custa a mensalidade
📘 matrículasqual aluno está em qual curso e se a matrícula está ativa

O problema: o caderno de matrículas só tem números. Ele diz “o aluno 1 está no curso 101”, mas não diz quem é o aluno 1 nem qual é o curso 101.

Para descobrir, você precisa procurar o número no outro caderno. Em Pandas, essa “procura e junção” se chama merge.

matrícula 1001:  aluno 1,  curso 101
                   │          │
                   ▼          ▼
         procura em alunos   procura em cursos
         → Ana Silva         → Python para Dados

Conceitos desta nota

  • Tabela (no Pandas: DataFrame): uma planilha com linhas e colunas.
  • Linha: um registro (um aluno, uma matrícula…).
  • Coluna: uma característica (nome, idade, status…).
  • Chave (id_aluno, id_curso): o número que identifica cada registro e permite ligar as tabelas.
  • merge: junta duas tabelas usando uma chave em comum.

📊 2. Os dados

📒 alunos

id_alunonome_alunoidadecidade
1Ana Silva21São Paulo
2Bruno Costa24Rio de Janeiro
3Carlos Souza19Belo Horizonte
4Diana Martins22São Paulo

📗 cursos

id_cursonome_cursopreco_mensalidade
101Python para Dados150
102Web Design Moderno120
103Banco de Dados SQL130

📘 matriculas

id_matriculaid_alunoid_cursostatus
10011101Ativo
10021103Ativo
10032101Ativo
10043102Cancelado
10054101Ativo

Antes de programar: pense

Olhando só as tabelas, sem código, tente responder:

  1. Quantas matrículas estão ativas?
  2. Quanto a escola recebe por mês com as matrículas ativas?

Anote suas respostas. Você vai conferi-las no final.


🛠️ 3. Passo a passo

Passo 1: criar as tabelas no Python

Primeiro importamos o Pandas (a biblioteca que trabalha com tabelas). Depois criamos cada tabela escrevendo, coluna por coluna, os valores que ela tem.

import pandas as pd
 
alunos = pd.DataFrame({
    'id_aluno':   [1, 2, 3, 4],
    'nome_aluno': ['Ana Silva', 'Bruno Costa', 'Carlos Souza', 'Diana Martins'],
    'idade':      [21, 24, 19, 22],
    'cidade':     ['São Paulo', 'Rio de Janeiro', 'Belo Horizonte', 'São Paulo'],
})
 
cursos = pd.DataFrame({
    'id_curso':          [101, 102, 103],
    'nome_curso':        ['Python para Dados', 'Web Design Moderno', 'Banco de Dados SQL'],
    'preco_mensalidade': [150, 120, 130],
})
 
matriculas = pd.DataFrame({
    'id_matricula': [1001, 1002, 1003, 1004, 1005],
    'id_aluno':     [1, 1, 2, 3, 4],
    'id_curso':     [101, 103, 101, 102, 101],
    'status':       ['Ativo', 'Ativo', 'Ativo', 'Cancelado', 'Ativo'],
})

Sempre olhe os dados depois de criar

Use print() para ver uma tabela e conferir se ficou como esperado.

print(matriculas)

Passo 2: juntar matrículas com alunos

Queremos trazer o nome do aluno para a tabela de matrículas. A coluna em comum é id_aluno.

consolidado = pd.merge(matriculas, alunos, on='id_aluno')
print(consolidado)

Passo 3: juntar o resultado com cursos

Agora trazemos o nome do curso e o preço. A coluna em comum é id_curso.

consolidado = pd.merge(consolidado, cursos, on='id_curso')
 
# Mostra só as colunas que interessam
print(consolidado[['id_matricula', 'nome_aluno', 'nome_curso', 'preco_mensalidade', 'status']])

Conferência rápida

A tabela consolidado deve ter 5 linhas, as mesmas 5 matrículas. Se tiver menos ou mais, algo deu errado no merge. Para contar:

print(len(consolidado))   # deve mostrar 5

📈 4. As quatro perguntas da diretoria

❓ Pergunta 1: Quem são os alunos com matrícula ativa?

Em português, em dois passos:

  1. Fique só com as linhas em que o status é Ativo.
  2. Mostre os nomes, sem repetir (a Ana tem duas matrículas).

Complete o código:

# Passo 1: filtrar
ativos = consolidado[consolidado['status'] == '____']
 
# Passo 2: nomes sem repetição
print(ativos['nome_aluno'].unique())

❓ Pergunta 2: Quantas matrículas ativas há por curso?

Em português: com as matrículas ativas (que você já filtrou), agrupe por curso e conte quantas linhas cada curso tem.

Complete o código:

print(ativos.groupby('____').size())

❓ Pergunta 3: Qual é o faturamento mensal?

Em português: com as matrículas ativas, some a coluna preco_mensalidade.

Complete o código:

total = ativos['____'].sum()
print(f'R$ {total:.2f}')

❓ Pergunta 4: Qual é a idade média dos alunos de “Python para Dados”?

Em português, em dois passos:

  1. Fique só com as linhas em que o curso é Python para Dados.
  2. Calcule a média da coluna idade.

Complete o código:

# Passo 1: filtrar o curso
python = consolidado[consolidado['nome_curso'] == '____']
 
# Passo 2: média das idades
media = python['idade'].____()
print(f'{media:.1f} anos')

✅ 5. Confira suas respostas

PerguntaResultado esperado
1. Alunos ativosAna Silva, Bruno Costa, Diana Martins
2. Matrículas ativas por cursoPython para Dados: 3 · Banco de Dados SQL: 1
3. Faturamento mensalR$ 580,00
4. Idade média em Python22,3 anos

Compare com o que você previu no começo

Quantas matrículas ativas você contou à mão? (O certo é 4.) E o faturamento? Se sua conta à mão bateu com o código, você entendeu a lógica. Se não bateu, descubra onde foi a diferença: ela costuma estar em uma matrícula cancelada ou em uma matrícula contada duas vezes.


🧯 Erros comuns de iniciante


📚 Mini glossário

TermoSignificaExemplo
DataFrameUma tabela no Pandasalunos
mergeJunta duas tabelas por uma coluna em comumpd.merge(matriculas, alunos, on='id_aluno')
FiltroMantém só as linhas que cumprem uma condiçãodf[df['status'] == 'Ativo']
unique()Valores sem repetiçãoativos['nome_aluno'].unique()
groupbySepara as linhas em gruposgroupby('nome_curso')
size()Conta quantas linhas há em cada grupo.size()
sum()Soma os valores de uma coluna['preco_mensalidade'].sum()
mean()Média dos valores de uma coluna['idade'].mean()
len()Quantidade de linhaslen(consolidado)

🚀 Próximos passos

Quando as quatro perguntas estiverem fáceis, tente estes desafios, do mais simples ao mais difícil:

  1. Mude um dado: troque o status da matrícula 1004 para 'Ativo' e rode tudo de novo. Antes de rodar, preveja: qual será o novo faturamento? (Dica: some 120.)
  2. Nova pergunta: quantos alunos moram em São Paulo? Use um filtro em alunos e len().
  3. Outra soma: qual é o faturamento só do curso Python para Dados? Combine filtro e sum().
  4. Ordenar: mostre os cursos do maior para o menor faturamento. Pesquise sort_values.
  5. Mesma atividade em SQL: o SQLite faz as mesmas coisas com outra linguagem. Veja a atividade analista dados educacionais versão completa.

Parabéns!

Se você chegou até aqui, já sabe juntar tabelas, filtrar, agrupar, somar e tirar médias. Essas cinco ações aparecem em quase toda análise de dados, de qualquer área.