import pandas as pd
import matplotlib.pyplot as plt

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

# 1. LOAD DATASET AND SELECT 3 FEATURES

df = pd.read_csv("StudentPerformanceFactors.csv")

features = ["Hours_Studied", "Attendance", "Previous_Scores"]

print(df.head())
print("Missing Values:\n", df[features].isnull().sum())

# 2. HANDLE MISSING VALUES AND STANDARDIZE

df = df.dropna(subset=features).copy()

X = df[features]

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 3 & 4. TEST DIFFERENT K VALUES - ELBOW METHOD

inertia = []

for k in range(1, 11):
    model = KMeans(n_clusters=k, random_state=42, n_init=10)
    model.fit(X_scaled)
    inertia.append(model.inertia_)
    print("K =", k, "Inertia =", model.inertia_)

plt.plot(range(1, 11), inertia, marker="o")
plt.xlabel("Number of Clusters (K)")
plt.ylabel("Inertia")
plt.title("Elbow Method")
plt.show()

k = int(input("Enter suitable K from elbow graph: "))

# 5. TRAIN FINAL K-MEANS

model = KMeans(n_clusters=k, random_state=42, n_init=10)
df["Cluster"] = model.fit_predict(X_scaled)

# VISUALIZE FINAL CLUSTERS IN 2D

plt.scatter(df["Attendance"], df["Previous_Scores"],
            c=df["Cluster"], cmap="viridis")

plt.xlabel("Attendance")
plt.ylabel("Previous Scores")
plt.title("Final Student Clusters")
plt.show()

# INTERPRET CLUSTERS

print("\nCluster Averages:")
print(df.groupby("Cluster")[features].mean().round(2))

print("\nOverall Averages:")
print(X.mean().round(2))

print("\nStudents per Cluster:")
print(df["Cluster"].value_counts())


# ENHANCED: Study-hours distribution; original elbow and cluster plots retained
X["Hours_Studied"].hist(bins=15)
plt.xlabel("Hours studied")
plt.title("Study-Hours Distribution")
plt.show()
