import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Step 1 - laod dataset

df = pd.read_csv('healthcare-dataset-stroke-data.csv')

# Step 2 - Handle missing values

print(df.isnull().sum())
 
df['bmi'] = df['bmi'].fillna(df['bmi'].mode()[0])

print("Missing values after handling:")
print(df.isnull().sum())



# Visualization
plt.figure(figsize=(15, 5))  # Adjusted width for better spacing

numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns[:3]  # Get first 3 numeric columns

for i, col in enumerate(numeric_cols):
    plt.subplot(1, 3, i+1)
    sns.boxplot(x=df[col])
    plt.title(f"Boxplot for {col}")
    plt.xlabel(col)

plt.tight_layout()  # Apply layout after all subplots are added
plt.show()



# Step 3 - Copy data for processing
data = df.copy()

# Step 4 - Outlier detection using IQR
def detect_outliers_iqr(column):
    if column.dtype in ['int64', 'float64']:  # Only apply to numerical columns
        Q1 = column.quantile(0.25)
        Q3 = column.quantile(0.75)
        IQR = Q3 - Q1
        lower_bound = Q1 - 1.5 * IQR
        upper_bound = Q3 + 1.5 * IQR
        return (column < lower_bound) | (column > upper_bound)
    else:
        return pd.Series([False] * len(column))  # For non-numeric columns

# Apply the function to each column
for col in data.columns:
    data[f'{col}_Outlier'] = detect_outliers_iqr(data[col])

# Filter to show only rows with any outliers
outliers_only = data[data.filter(like='_Outlier').any(axis=1)]

# Display outliers
outliers_only