実践的な応用:グループ化技術によるデータ分析
データグループ化のいくつかの方法を理解したところで、これらの技術を適用して、現実の問題を解決してみましょう。具体的には、学生記録のデータセットを分析します。さまざまなグループ化方法を使用して、データから有用な情報を抽出します。
例のデータセットの設定
まず、学生記録のデータセットを作成しましょう。
-
/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()は、ソートされたデータを扱うのに効率的です。
- テクニックを組み合わせることで、多層的なグループ化と複雑な分析が可能になります。
適切なグループ化技術の選択は、特定のニーズとデータの構造によって異なります。