# CLASS IMBALANCE ANALYSIS # Examining target variable distribution to identify potential bias print(' TARGET VARIABLE DISTRIBUTION: \n') class_counts = df['EngagementLevel'].value_counts() for level, count in class_counts.items(): print(f' {level}: {count} players ({count/len(df)*100:.1f}%)') imbalance_ratio = class_counts.max() / class_counts.min() print(f'\nImbalance Ratio: {imbalance_ratio:.2f}:1') # Visualise class distribution plt.figure(figsize=(8, 5)) colours = {'High': '#2ecc71', 'Medium': '#f39c12', 'Low': '#e74c3c'} bars = plt.bar(class_counts.index, class_counts.values, color=[colours[x] for x in class_counts.index]) plt.title('Engagement Level Distribution') plt.xlabel('Engagement Level') plt.ylabel('Number of Players') # Add count labels on bars for bar, count in zip(bars, class_counts.values): plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 200, f'{count}', ha='center', fontweight='bold') plt.tight_layout() plt.show() print('\nNote: The Medium class is overrepresented. Stratified sampling will be') print('used during train/test split to maintain class proportions.')