import pandas as pd import numpy as np import matplotlib.pyplot as plt # Data data = { 'Subjek': [f'S{i}' for i in range(1, 121)], '1.1': [3, 3, 4, 3, 3, 5, 5, 4, 2, 3, 5, 2, 3, 3, 2, 5, 4, 5, 2, 2, 4, 5, 4, 4, 3, 5, 2, 3, 5, 4, 3, 4, 2, 4, 2, 5, 3, 4, 2, 2, 2, 2, 2, 4, 4, 2, 2, 2, 3, 2, 3, 2, 4, 3, 4, 5, 3, 5, 5, 5, 2, 2, 3, 5, 3, 4, 2, 3, 4, 5, 5, 4, 3, 2, 2, 3, 2, 3, 2, 4, 5, 2, 4, 5, 4, 3, 2, 3, 3, 3, 5, 2, 5, 3, 5, 5, 2, 5, 2, 3, 3, 2, 5, 2, 3, 3, 2, 5, 2, 4, 2, 4, 5, 3, 5, 5, 3, 5, 4, 2], '1.2': [2, 5, 4, 2, 2, 3, 2, 2, 2, 3, 5, 2, 4, 5, 2, 5, 2, 2, 3, 3, 3, 4, 4, 2, 3, 5, 3, 4, 2, 2, 4, 3, 3, 2, 3, 5, 3, 3, 2, 3, 5, 4, 5, 3, 4, 2, 4, 2, 5, 2, 2, 5, 2, 3, 2, 2, 2, 2, 2, 4, 4, 3, 5, 3, 5, 3, 3, 2, 3, 2, 2, 4, 4, 5, 4, 3, 5, 5, 5, 2, 5, 3, 2, 4, 3, 3, 4, 3, 4, 4, 2, 2, 3, 5, 3, 2, 2, 2, 4, 5, 5, 2, 4, 3, 2, 5, 4, 4, 2, 3, 4, 2, 3, 2, 3, 3, 2, 4, 2, 2], '1.3': [2, 2, 3, 3, 5, 5, 4, 2, 2, 5, 2, 5, 3, 5, 4, 4, 2, 2, 2, 3, 5, 2, 2, 2, 5, 3, 4, 2, 4, 3, 2, 3, 4, 3, 4, 5, 4, 3, 4, 5, 4, 5, 4, 2, 4, 5, 4, 5, 2, 5, 3, 4, 2, 5, 2, 5, 3, 5, 3, 4, 4, 4, 5, 2, 5, 4, 2, 5, 3, 5, 2, 2, 3, 4, 3, 5, 2, 3, 4, 2, 4, 3, 3, 4, 5, 2, 4, 4, 5, 4, 4, 5, 5, 2, 2, 4, 3, 4, 2, 4, 4, 5, 3, 2, 4, 4, 3, 5, 4, 5, 3, 5, 5, 4, 2, 3, 2, 4, 2, 5], '2.1': [4, 4, 2, 4, 3, 2, 5, 4, 2, 5, 2, 2, 4, 2, 4, 5, 4, 3, 4, 2, 2, 2, 4, 2, 5, 4, 5, 4, 4, 5, 4, 5, 3, 3, 3, 5, 2, 3, 5, 2, 5, 2, 3, 3, 2, 5, 4, 4, 4, 4, 4, 4, 5, 2, 2, 4, 5, 5, 4, 5, 5, 5, 3, 5, 5, 4, 2, 2, 5, 5, 4, 4, 4, 5, 2, 2, 2, 2, 3, 2, 2, 5, 4, 5, 3, 5, 5, 3, 5, 2, 2, 2, 4, 2, 2, 2, 5, 5, 4, 2, 3, 4, 3, 3, 2, 4, 2, 4, 2, 2, 2, 2, 5, 4, 5, 2, 4, 5, 5, 2], '2.2': [2, 2, 3, 5, 4, 2, 2, 2, 5, 5, 3, 5, 5, 3, 5, 2, 3, 2, 3, 3, 3, 5, 5, 3, 4, 4, 4, 4, 5, 4, 4, 4, 5, 3, 2, 2, 5, 4, 4, 4, 3, 4, 5, 2, 4, 5, 2, 2, 2, 5, 4, 2, 4, 5, 3, 4, 5, 5, 2, 3, 2, 2, 4, 3, 5, 4, 4, 2, 5, 4, 5, 4, 5, 5, 5, 2, 2, 5, 5, 2, 4, 2, 5, 2, 2, 5, 3, 3, 4, 5, 2, 5, 4, 5, 2, 5, 4, 3, 3, 5, 4, 2, 4, 3, 2, 2, 2, 5, 3, 2, 3, 2, 4, 4, 5, 2, 3, 2, 2, 2], '2.3': [5, 3, 5, 4, 3, 4, 3, 3, 4, 4, 4, 4, 4, 3, 2, 4, 2, 3, 5, 2, 5, 3, 5, 4, 5, 4, 4, 4, 4, 2, 3, 3, 5, 3, 5, 5, 5, 3, 5, 2, 5, 4, 5, 4, 5, 4, 3, 4, 5, 3, 3, 2, 4, 3, 5, 2, 4, 5, 5, 3, 2, 4, 5, 3, 2, 5, 4, 5, 2, 3, 5, 3, 5, 3, 3, 2, 2, 5, 2, 4, 4, 3, 3, 5, 5, 5, 5, 5, 2, 5, 5, 3, 3, 4, 2, 5, 2, 4, 5, 5, 2, 2, 2, 4, 5, 5, 5, 4, 5, 5, 2, 5, 5, 3, 2, 2, 4, 4, 2, 5], '3.1': [5, 2, 2, 2, 3, 4, 5, 3, 5, 4, 5, 2, 4, 4, 4, 5, 5, 3, 4, 5, 2, 3, 4, 5, 3, 4, 2, 3, 3, 5, 2, 4, 2, 2, 2, 2, 5, 3, 4, 3, 5, 5, 3, 3, 5, 5, 3, 5, 2, 3, 5, 5, 5, 2, 4, 3, 3, 3, 5, 3, 2, 3, 3, 4, 4, 2, 5, 5, 5, 5, 2, 4, 4, 4, 5, 4, 5, 2, 4, 4, 4, 4, 3, 4, 2, 4, 5, 3, 4, 3, 4, 3, 3, 4, 3, 3, 3, 4, 5, 3, 5, 2, 5, 5, 4, 4, 4, 3, 4, 3, 5, 5, 5, 2, 5, 5, 4, 5, 4, 2], '3.2': [5, 2, 2, 3, 3, 5, 5, 2, 5, 2, 4, 4, 3, 4, 3, 4, 3, 5, 4, 4, 2, 4, 2, 5, 2, 3, 4, 5, 3, 3, 2, 5, 3, 2, 3, 3, 5, 2, 2, 3, 2, 2, 2, 2, 2, 4, 5, 3, 3, 4, 4, 5, 3, 4, 2, 2, 4, 3, 2, 2, 3, 4, 2, 3, 2, 2, 2, 2, 4, 4, 4, 3, 3, 5, 2, 3, 5, 4, 3, 3, 5, 5, 2, 2, 5, 4, 5, 4, 2, 3, 3, 2, 5, 2, 5, 3, 2, 5, 3, 5, 2, 2, 4, 4, 2, 4, 5, 2, 4, 3, 3, 2, 5, 4, 2, 5, 5, 4, 5, 3], '3.3': [4, 3, 4, 2, 5, 2, 3, 4, 5, 3, 5, 5, 3, 5, 5, 2, 5, 4, 5, 4, 5, 4, 5, 3, 2, 4, 2, 2, 3, 3, 3, 3, 4, 5, 4, 5, 5, 2, 5, 2, 2, 5, 5, 3, 3, 5, 2, 4, 4, 3, 3, 3, 3, 2, 5, 4, 4, 2, 3, 4, 3, 3, 4, 3, 3, 4, 4, 2, 5, 3, 2, 4, 2, 4, 5, 3, 3, 2, 3, 3, 2, 5, 5, 4, 5, 5, 2, 5, 4, 5, 3, 5, 5, 3, 3, 2, 2, 4, 4, 3, 4, 2, 2, 4, 3, 2, 2, 5, 3, 5, 5, 5, 5, 3, 2, 2, 5, 5, 3, 3], '4.1': [5, 4, 5, 2, 3, 4, 5, 2, 2, 5, 3, 2, 2, 3, 5, 5, 4, 3, 4, 2, 2, 3, 5, 5, 3, 2, 4, 4, 3, 3, 2, 4, 3, 5, 4, 2, 4, 5, 3, 5, 4, 5, 3, 4, 3, 3, 3, 3, 2, 5, 2, 4, 4, 4, 3, 5, 2, 4, 2, 5, 4, 5, 3, 4, 5, 2, 4, 5, 4, 5, 4, 2, 3, 2, 4, 2, 5, 4, 5, 5, 3, 5, 5, 4, 5, 5, 5, 5, 2, 4, 5, 2, 2, 5, 3, 3, 5, 2, 4, 2, 4, 5, 5, 2, 5, 2, 5, 5, 3, 5, 4, 3, 3, 2, 5, 5, 2, 2, 4, 2], '4.2': [4, 3, 5, 3, 5, 4, 2, 3, 2, 5, 3, 3, 2, 3, 4, 4, 3, 5, 3, 2, 5, 2, 2, 2, 4, 3, 5, 2, 4, 4, 2, 4, 4, 4, 2, 4, 4, 2, 2, 3, 5, 3, 4, 2, 4, 2, 3, 2, 2, 3, 4, 5, 2, 3, 3, 5, 4, 4, 5, 2, 3, 3, 4, 5, 3, 3, 5, 3, 2, 3, 4, 2, 5, 4, 5, 2, 4, 5, 5, 5, 4, 4, 5, 5, 5, 5, 4, 5, 5, 2, 5, 3, 5, 4, 3, 5, 4, 2, 5, 4, 5, 4, 4, 2, 2, 4, 4, 5, 4, 5, 3, 3, 3, 5, 4, 2, 3, 3, 4, 5], '4.3': [4, 3, 3, 3, 5, 5, 3, 3, 5, 3, 5, 3, 4, 3, 3, 3, 5, 2, 5, 2, 2, 2, 3, 2, 5, 2, 3, 5, 4, 5, 2, 4, 2, 4, 2, 5, 3, 2, 3, 4, 4, 3, 3, 3, 5, 2, 5, 3, 2, 4, 2, 4, 2, 4, 3, 4, 5, 5, 5, 2, 4, 4, 4, 4, 3, 4, 5, 2, 2, 3, 3, 4, 5, 5, 5, 3, 2, 3, 5, 4, 2, 3, 5, 5, 5, 2, 2, 3, 4, 5, 4, 3, 5, 3, 5, 2, 4, 4, 5, 3, 3, 4, 5, 4, 2, 4, 3, 2, 2, 2, 5, 2, 5, 2, 3, 2, 2, 4, 4, 2], } # Konversi ke DataFrame df = pd.DataFrame(data) # Menentukan rentang untuk peta Wright min_ability = df[['1.1', '1.2', '1.3', '2.1', '2.2', '2.3', '3.1', '3.2', '3.3']].min().min() max_ability = df[['1.1', '1.2', '1.3', '2.1', '2.2', '2.3', '3.1', '3.2', '3.3']].max().max() min_difficulty = 1 max_difficulty = 5 # Plot Wright Map plt.figure(figsize=(12, 8)) # Plotting Student Abilities for index, row in df.iterrows(): plt.plot([row['1.1'], row['1.2'], row['1.3'], row['2.1'], row['2.2'], row['2.3'], row['3.1'], row['3.2'], row['3.3']], [index]*9, 'o', color='blue', markersize=5, alpha=0.6) # Plotting Item Difficulties items = ['1.1', '1.2', '1.3', '2.1', '2.2', '2.3', '3.1', '3.2', '3.3'] for i, item in enumerate(items): plt.hlines(i+1, min_difficulty, max_difficulty, colors='red', linestyles='--', label=f'{item} Difficulty') plt.xlabel('Level of Ability/Difficulty') plt.ylabel('Student Index / Item Difficulty') plt.title('Wright Map') plt.legend(loc='upper right') plt.grid(True) plt.show()