import pandas as pd
import matplotlib.pyplot as plt

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix

# 1. LOAD DATASET

df = load_breast_cancer(as_frame=True).frame

# 1 = Malignant, 0 = Benign
df["diagnosis"] = (df["target"] == 0).astype(int)
df = df.drop("target", axis=1)

print(df.head())

print("Target: diagnosis")

# 2. EDA - MISSING VALUES, DISTRIBUTION, IMBALANCE

print("Missing Values:\n", df.isnull().sum())
print("Class Distribution:\n", df["diagnosis"].value_counts())
print("Class Percentage:\n", df["diagnosis"].value_counts(normalize=True) *
100)

df["diagnosis"].value_counts().plot(kind="bar")
plt.title("Class Distribution")
plt.xlabel("Diagnosis")
plt.ylabel("Count")
plt.show()

df[["mean radius", "mean texture", "mean area"]].hist()
plt.show()

# 3. PREPARE DATA AND SPLIT

df = df.dropna()

X = df.drop("diagnosis", axis=1)
y = df["diagnosis"]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# 4. TRAIN DECISION TREE

model = DecisionTreeClassifier(
    criterion="gini", max_depth=4, random_state=42
)

model.fit(X_train, y_train)

# 5. PREDICT CLASSES

y_pred = model.predict(X_test)

print("Predictions:", y_pred[:10])

# 6. MODEL EVALUATION

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("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
