================================================================================
  Question 51: K-Means Clustering on Iris Dataset
================================================================================

FULL QUESTION:
Task:
Using the Iris dataset, perform unsupervised clustering without using target labels:
1. Standardize the dataset using StandardScaler.
2. Apply K-Means clustering for k = 2, 3, and 4.
3. Identify optimal k using the Elbow Method (Inertia plot).
4. Visualize feature distributions and 2D clusters using PCA.

SHORT QUESTION:
Unsupervised K-Means clustering, Elbow method optimization, and 2D PCA cluster visualization on the Iris dataset.

================================================================================
README & SETUP INSTRUCTIONS:
================================================================================
# Question 51: K-Means Clustering on Iris Dataset

- Prerequisites: Python 3.x, Scikit-Learn, Pandas, NumPy, Matplotlib (pip install scikit-learn pandas numpy matplotlib).
- Setup: Iris dataset is built into scikit-learn.
- How to Run: python question_51.py
- Expected Behavior: Computes K-Means clustering for k=2,3,4, plots Elbow curve, and shows 2D PCA cluster projections.

================================================================================
SOURCE CODE FILES:
================================================================================

1. question_51.py
--------------------------------------------------------------------------------
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)

print("Dataset shape:", X.shape)
print("First 5 rows:\n", X.head())

X.hist(bins=15, figsize=(10, 8), grid=False, color='skyblue', edgecolor='black')
plt.suptitle('Iris Feature Distributions', fontsize=14)
plt.tight_layout()
plt.show()

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

wcss = []
k_range = range(1, 11)

for k in k_range:
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    kmeans.fit(X_scaled)
    wcss.append(kmeans.inertia_)

plt.figure(figsize=(8, 5))
plt.plot(k_range, wcss, marker='o', linestyle='--', color='b')
plt.title('Elbow Method for Optimal k')
plt.xlabel('Number of Clusters (k)')
plt.ylabel('WCSS (Inertia)')
plt.grid(True)
plt.show()

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

k_values = [2, 3, 4]
fig, axes = plt.subplots(1, 3, figsize=(18, 5))

for i, k in enumerate(k_values):
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    cluster_labels = kmeans.fit_predict(X_scaled)

    scatter = axes[i].scatter(X_pca[:, 0], X_pca[:, 1], c=cluster_labels, cmap='viridis', alpha=0.8)

    centroids_pca = pca.transform(kmeans.cluster_centers_)
    axes[i].scatter(centroids_pca[:, 0], centroids_pca[:, 1], s=200, c='red', marker='X', label='Centroids')

    axes[i].set_title(f'K-Means Clustering (k = {k})')
    axes[i].set_xlabel('PCA Component 1')
    axes[i].set_ylabel('PCA Component 2')
    axes[i].legend()

plt.tight_layout()
plt.show()
--------------------------------------------------------------------------------
