실용적인 적용: 그룹화 기술을 사용한 데이터 분석
이제 데이터를 그룹화하는 여러 가지 방법을 이해했으므로 이러한 기술을 실제 문제에 적용하여 학생 기록 데이터 세트를 분석해 보겠습니다. 다양한 그룹화 방법을 사용하여 데이터에서 유용한 정보를 추출합니다.
예제 데이터 세트 설정
먼저 학생 기록 데이터 세트를 만들어 보겠습니다.
-
/home/labex/project 디렉토리에 student_analysis.py라는 새 파일을 만듭니다.
-
다음 코드를 추가하여 예제 데이터를 설정합니다.
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']}")
- 파일을 저장합니다.
defaultdict 를 사용하여 과목별로 학생 그룹화
각 과목을 수강하는 학생을 분석해 보겠습니다.
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}")
- 파일을 저장합니다.
과목별 평균 점수 계산
각 과목의 평균 점수를 계산해 보겠습니다.
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}")
- 파일을 저장합니다.
이제 itertools.groupby()를 사용하여 성적 분포를 분석해 보겠습니다.
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")
- 파일을 저장합니다.
기술 결합: 고급 분석
마지막으로 그룹화 기술을 결합하여 더 복잡한 분석을 수행해 보겠습니다.
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")
-
파일을 저장합니다.
-
전체 스크립트를 실행합니다.
python3 /home/labex/project/student_analysis.py
다음과 같은 학생 데이터에 대한 포괄적인 분석을 볼 수 있습니다.
- 학생 기록
- 과목별로 그룹화된 학생
- 과목별 평균 점수
- 전체 성적 분포
- 과목별 성적 분포
이 예제는 다양한 그룹화 기술을 결합하여 비교적 간단한 코드로 복잡한 데이터 분석을 수행하는 방법을 보여줍니다. 각 접근 방식에는 장점이 있습니다.
defaultdict는 키 존재 여부를 확인할 필요 없이 간단한 그룹화에 적합합니다.
itertools.groupby()는 정렬된 데이터를 처리하는 데 효율적입니다.
- 기술을 결합하면 다단계 그룹화 및 복잡한 분석이 가능합니다.
올바른 그룹화 기술을 선택하는 것은 특정 요구 사항과 데이터 구조에 따라 다릅니다.