Aplicación práctica: Análisis de datos con técnicas de agrupación
Ahora que comprende varios métodos para agrupar datos, apliquemos estas técnicas para resolver un problema del mundo real: analizar un conjunto de datos de registros de estudiantes. Usaremos diferentes métodos de agrupación para extraer información útil de los datos.
Configuración del conjunto de datos de ejemplo
Primero, creemos nuestro conjunto de datos de registros de estudiantes:
-
Cree un nuevo archivo llamado student_analysis.py en el directorio /home/labex/project.
-
Agregue el siguiente código para configurar los datos de ejemplo:
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']}")
- Guarde el archivo.
Usando defaultdict para agrupar estudiantes por materia
Analicemos qué estudiantes están tomando cada materia:
- Agregue el siguiente código a su archivo
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}")
- Guarde el archivo.
Cálculo de las puntuaciones promedio por materia
Calculemos la puntuación promedio para cada materia:
- Agregue el siguiente código a su archivo
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}")
- Guarde el archivo.
Ahora usemos itertools.groupby() para analizar la distribución de las calificaciones:
- Agregue el siguiente código a su archivo
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")
- Guarde el archivo.
Combinando técnicas: Análisis avanzado
Finalmente, realicemos un análisis más complejo combinando nuestras técnicas de agrupación:
- Agregue el siguiente código a su archivo
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")
-
Guarde el archivo.
-
Ejecute el script completo:
python3 /home/labex/project/student_analysis.py
Debería ver un análisis exhaustivo de los datos de los estudiantes, que incluye:
- Registros de estudiantes
- Estudiantes agrupados por materia
- Puntuaciones promedio por materia
- Distribución general de calificaciones
- Distribución de calificaciones por materia
Este ejemplo demuestra cómo se pueden combinar diferentes técnicas de agrupación para realizar un análisis de datos complejo con un código relativamente simple. Cada enfoque tiene sus puntos fuertes:
defaultdict es excelente para la agrupación simple sin tener que verificar la existencia de claves
itertools.groupby() es eficiente para trabajar con datos ordenados
- La combinación de técnicas permite la agrupación de múltiples niveles y el análisis complejo
La selección de la técnica de agrupación correcta depende de sus necesidades específicas y de la estructura de sus datos.