Aplicação Prática: Analisando Dados com Técnicas de Agrupamento
Agora que você entende vários métodos para agrupar dados, vamos aplicar essas técnicas para resolver um problema do mundo real: analisar um conjunto de dados de registros de alunos. Usaremos diferentes métodos de agrupamento para extrair informações úteis dos dados.
Configurando o Conjunto de Dados de Exemplo
Primeiro, vamos criar nosso conjunto de dados de registros de alunos:
-
Crie um novo arquivo chamado student_analysis.py no diretório /home/labex/project.
-
Adicione o seguinte código para configurar os dados de exemplo:
import itertools
from collections import defaultdict
## Sample student data
students = [
{"id": 1, "name": "Emma", "grade": "A", "subject": "Math", "score": 95},
{"id": 2, "name": "Noah", "grade": "B", "subject": "Math", "score": 82},
{"id": 3, "name": "Olivia", "grade": "A", "subject": "Science", "score": 90},
{"id": 4, "name": "Liam", "grade": "C", "subject": "Math", "score": 75},
{"id": 5, "name": "Ava", "grade": "B", "subject": "Science", "score": 88},
{"id": 6, "name": "William", "grade": "A", "subject": "History", "score": 96},
{"id": 7, "name": "Sophia", "grade": "B", "subject": "History", "score": 85},
{"id": 8, "name": "James", "grade": "C", "subject": "Science", "score": 72},
{"id": 9, "name": "Isabella", "grade": "A", "subject": "Math", "score": 91},
{"id": 10, "name": "Benjamin", "grade": "B", "subject": "History", "score": 84}
]
print("Student Records:")
for student in students:
print(f"ID: {student['id']}, Name: {student['name']}, Subject: {student['subject']}, Grade: {student['grade']}, Score: {student['score']}")
- Salve o arquivo.
Usando defaultdict para Agrupar Alunos por Disciplina
Vamos analisar quais alunos estão cursando cada disciplina:
- Adicione o seguinte código ao seu arquivo
student_analysis.py:
print("\n--- Students Grouped by Subject ---")
## Group students by subject using defaultdict
subject_groups = defaultdict(list)
for student in students:
subject_groups[student["subject"]].append(student["name"])
## Print students by subject
for subject, names in subject_groups.items():
print(f"{subject}: {names}")
- Salve o arquivo.
Calculando as Médias de Notas por Disciplina
Vamos calcular a média de notas para cada disciplina:
- Adicione o seguinte código ao seu arquivo
student_analysis.py:
print("\n--- Average Scores by Subject ---")
## Calculate average scores for each subject
subject_scores = defaultdict(list)
for student in students:
subject_scores[student["subject"]].append(student["score"])
## Calculate and print averages
for subject, scores in subject_scores.items():
average = sum(scores) / len(scores)
print(f"{subject} Average: {average:.2f}")
- Salve o arquivo.
Agora, vamos usar itertools.groupby() para analisar a distribuição das notas:
- Adicione o seguinte código ao seu arquivo
student_analysis.py:
print("\n--- Grade Distribution (using itertools.groupby) ---")
## Sort students by grade first
sorted_students = sorted(students, key=lambda x: x["grade"])
## Group and count students by grade
grade_counts = {}
for grade, group in itertools.groupby(sorted_students, key=lambda x: x["grade"]):
grade_counts[grade] = len(list(group))
## Print grade distribution
for grade, count in grade_counts.items():
print(f"Grade {grade}: {count} students")
- Salve o arquivo.
Combinando Técnicas: Análise Avançada
Finalmente, vamos realizar uma análise mais complexa combinando nossas técnicas de agrupamento:
- Adicione o seguinte código ao seu arquivo
student_analysis.py:
print("\n--- Advanced Analysis: Grade Distribution by Subject ---")
## Group by subject and grade
subject_grade_counts = defaultdict(lambda: defaultdict(int))
for student in students:
subject = student["subject"]
grade = student["grade"]
subject_grade_counts[subject][grade] += 1
## Print detailed grade distribution by subject
for subject, grades in subject_grade_counts.items():
print(f"\n{subject}:")
for grade, count in grades.items():
print(f" Grade {grade}: {count} students")
-
Salve o arquivo.
-
Execute o script completo:
python3 /home/labex/project/student_analysis.py
Você deve ver uma análise abrangente dos dados dos alunos, incluindo:
- Registros de alunos
- Alunos agrupados por disciplina
- Médias de notas por disciplina
- Distribuição geral das notas
- Distribuição das notas por disciplina
Este exemplo demonstra como diferentes técnicas de agrupamento podem ser combinadas para realizar análises de dados complexas com código relativamente simples. Cada abordagem tem seus pontos fortes:
defaultdict é excelente para agrupamento simples sem ter que verificar a existência da chave
itertools.groupby() é eficiente para trabalhar com dados ordenados
- A combinação de técnicas permite o agrupamento em vários níveis e análises complexas
A seleção da técnica de agrupamento correta depende de suas necessidades específicas e da estrutura de seus dados.