# Complex demo: Load Iris, compute basic stats (mean, median, std, variance), visualize distributions with histograms/boxplots, integrate with preprocessing
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns

def advanced_iris_stats_demo():
    # Load and prep
    iris = load_iris()
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    df['Target'] = iris.target
    # Basic statistics
    stats = df.describe()  # Mean, std, etc.
    print("Basic Statistics for Iris Data:\n", stats)
    # Mean, median, mode
    mean_values = df.mean(numeric_only=True)
    median_values = df.median(numeric_only=True)
    mode_values = df.mode().iloc[0] if not df.mode().empty else df.median(numeric_only=True)
    variance_values = df.var(numeric_only=True)
    print(f"Mean: {mean_values}")
    print(f"Median: {median_values}")
    print(f"Mode: {mode_values}")
    print(f"Variance: {variance_values}")
    # Preprocessing with stats integration (e.g., normalize by mean)
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(df.drop('Target', axis=1))
    df_scaled = pd.DataFrame(X_scaled, columns=df.drop('Target', axis=1).columns)
    df_scaled['Target'] = df['Target']
    # Visualize distributions (histograms for mean/std)
    fig, axes = plt.subplots(2, 2, figsize=(10, 8))
    for i, col in enumerate(df.columns[:4]):
        ax = axes[i // 2, i % 2]
        ax.hist(df[col], bins=20, alpha=0.7, label=f'Mean: {mean_values[col]:.2f}, Std: {np.std(df[col]):.2f}')
        ax.set_title(f'Distribution of {col}')
        ax.set_xlabel(col)
        ax.set_ylabel('Frequency')
        ax.annotate(f'Std: {np.std(df[col]):.2f}', xy=(0.05, 0.95), xycoords='axes fraction', fontsize=10, ha='left')
    plt.tight_layout()
    plt.show()
    # Boxplots for variance/median
    plt.figure(figsize=(10, 6))
    df.boxplot(column=df.columns[:4])
    plt.title('Boxplot for Iris Data (Median and Variance Insights)')
    plt.annotate('High Variance', xy=(1, df['petal length (cm)'].var()), xytext=(0.8, df['petal length (cm)'].var() + 0.1), arrowprops=dict(facecolor='black', shrink=0.05))
    plt.show()

advanced_iris_stats_demo()