pip install krippendorff
def draw_coding_plot_fixed(coder1, coder2):
# Determine the number of codings (columns)
= max(len(coder1), len(coder2))
num_codings
# Create a figure and axis with a fixed size
= plt.subplots(figsize=(10, 5)) # Fixed size for better control
fig, ax
# Remove axis lines and ticks
'off')
ax.axis(
# Adding labels for Coders
-1, 2.5, 'Coder 1', fontsize=10, ha='right')
ax.text(-1, 1, 'Coder 2', fontsize=10, ha='right')
ax.text('equal')
ax.set_aspect(
# Function to draw circles
def draw_circles(codes, y_coord):
for index, code in enumerate(codes):
= 'black' if code == 1 else 'none'
circle_color +0.5, y_coord), 0.4, color=circle_color, ec='black', lw=1))
ax.add_patch(plt.Circle((index
# Drawing circles for codings
2.8)
draw_circles(coder1, 1.25)
draw_circles(coder2,
# Set plot limits
0, num_codings)
ax.set_xlim(0.5, 5)
ax.set_ylim(
# Show plot
plt.show()
import numpy as np
import krippendorff
def calculate_krippendorffs_alpha(coder1, coder2):
"""Calculate Krippendorff's Alpha."""
= np.vstack([coder1, coder2])
data = krippendorff.alpha(reliability_data=data, level_of_measurement='nominal')
alpha return alpha
def generate_controlled_coding(n_items, disagreement_rate):
# Generate coder1 coding
= np.random.choice([0, 1], size=n_items)
coder1
# Initially set coder2 to be the same as coder1
= np.copy(coder1)
coder2
# Calculate the number of disagreements
= int(n_items * (disagreement_rate / 100))
n_disagreements
# Introduce disagreements
= np.random.choice(n_items, n_disagreements, replace=False)
disagreement_indices for index in disagreement_indices:
= 1 - coder2[index]
coder2[index]
return coder1, coder2
# Example usage
= 65
n_items = 10 # 30% disagreement rate
disagreement_rate = generate_controlled_coding(n_items, disagreement_rate)
coder1, coder2
print(f"n: {n_items}")
print(f"Disagreement: {disagreement_rate}%")
print(f"Krippendorff's Alpha: {calculate_krippendorffs_alpha(coder1, coder2)}")
draw_coding_plot_fixed(coder1, coder2)
n: 65
Disagreement: 10%
Krippendorff's Alpha: 0.8164136622390892