In this project the goal was to find a method to take a group of 100 students and form 5 teams of students where the average team score was balanced.
Current State
The students are originally grouped into 7 teams shown below.
Each student has an average score based on the categories: Reading, Writing, Math, and Science.
Team Distribution of Average Student Scores
The average of the teams ranged from 43.25 to 50.85. The difference between the teams is relatively small, but let's see if we can improve the teams.
Future State
For the future state teams, I'll be using Linear Programming to minimize the difference between the average team score. Making the teams as balanced as possible.
New team constraints:
There will be 5 new teams
Each student can only be assigned to 1 team
Team size will have the specified size, team_sizes = [15, 25, 20, 20, 20]
There will be at least 1 student with a score of 70 or more in each of the categories 'Reading', 'Writing', 'Math', and 'Science'.
The constraints were used to create a Linear Programming model with the following results.
The team averages are more balanced than the current state while following the constraints.
In the chart above you can see each students score. I also clustered the students based on the category scores, to help find students of similar skill level. The clustering did not affect the results of the linear optimization. It was more for identification of student groupings.
One benefit was that I was able to write some code that allowed for finding a similar student.
In the example below with student 99, the nearest students are student 4 and student 87.
Conclusion
I was able to build a model that could rebalance the students while following a set of constraints on the new teams.