# !pip install numpy pandas matplotlib seaborn scikit-learn scipy
import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
import matplotlib.pyplot as plt
import numpy as np

# Dataset
data = {
    'StudentID': [101, 102, 103, 104, 105, 106, 107, 108],
    'Hours_Study': [5, 10, 3, 8, 7, 2, 6, 4],
    'Attendance': [60, 75, 50, 80, 65, 45, 70, 55],
    'Result': ['Fail', 'Pass', 'Fail', 'Pass', 'Pass', 'Fail', 'Pass', 'Fail']
}

# 1. Load into DataFrame
df = pd.DataFrame(data)

# 2. Encode target variable (Pass=1, Fail=0)
df['Result'] = df['Result'].map({'Fail': 0, 'Pass': 1})

# 3. Split dataset (70% train, 30% test)
X = df[['Hours_Study', 'Attendance']]
y = df['Result']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 4. Train SVM classifier
svm_model = SVC(kernel='linear', C=1.0)
svm_model.fit(X_train, y_train)

# 5. Predict test results
y_pred = svm_model.predict(X_test)

# 6. Evaluate model
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Precision:", precision_score(y_test, y_pred))
print("Recall:", recall_score(y_test, y_pred))
print("F1-Score:", f1_score(y_test, y_pred))
print("\nClassification Report:\n", classification_report(y_test, y_pred))

# Visualization (on all data, just for demonstration)
plt.scatter(X['Hours_Study'], X['Attendance'], c=df['Result'], cmap='bwr', s=100)
w = svm_model.coef_[0]
b = svm_model.intercept_[0]
x_vals = np.array([X['Hours_Study'].min()-1, X['Hours_Study'].max()+1])
y_vals = -(w[0]/w[1]) * x_vals - b/w[1]
plt.plot(x_vals, y_vals, 'k--', label='Decision Boundary')
plt.xlabel('Hours of Study')
plt.ylabel('Attendance (%)')
plt.title('SVM Classification with Decision Boundary')
plt.legend()
plt.show()

