# Complex demo: Load California Housing, preprocess, model with LinearRegression, evaluate, visualize with line/bar/scatter plots using Matplotlib/Seaborn, add annotations
import pandas as pd
import numpy as np
from sklearn.datasets import fetch_california_housing
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns

def advanced_housing_visual_demo():
    # Load and prep
    housing = fetch_california_housing()
    df = pd.DataFrame(housing.data, columns=housing.feature_names)
    df['Target'] = housing.target
    # Preprocessing
    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']
    # Descriptive stats integration
    stats = df_scaled.describe()
    print("Descriptive Stats for Housing:\n", stats)
    # Model and evaluate
    X_train, X_test, y_train, y_test = train_test_split(X_scaled, df['Target'], test_size=0.25, random_state=42)
    model = LinearRegression()
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    mse = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)
    print(f"MSE: {mse:.2f}, R2: {r2:.2f}")
    # Visualize with line plot (e.g., feature trends)
    mean_features = df_scaled.mean().drop('Target')
    plt.figure(figsize=(10, 6))
    plt.plot(mean_features.index, mean_features.values, marker='o')
    plt.title('Line Plot of Mean Feature Values')
    plt.xlabel('Features')
    plt.ylabel('Mean Scaled Value')
    plt.annotate('High Mean', xy=(0, mean_features.max()), xytext=(1, mean_features.max() + 0.5), arrowprops=dict(facecolor='black', shrink=0.05))
    plt.xticks(rotation=45)
    plt.show()
    # Bar plot for feature variances
    variances = df_scaled.var().drop('Target')
    plt.figure(figsize=(10, 6))
    sns.barplot(x=variances.index, y=variances.values)
    plt.title('Bar Plot of Feature Variances')
    plt.xlabel('Features')
    plt.ylabel('Variance')
    plt.annotate('High Variance', xy=(0, variances.max()), xytext=(1, variances.max() + 0.5), arrowprops=dict(facecolor='black', shrink=0.05))
    plt.xticks(rotation=45)
    plt.show()
    # Scatter plot for predictions
    plt.figure(figsize=(10, 6))
    plt.scatter(y_test, y_pred, alpha=0.5)
    plt.title('Scatter Plot of Housing Predictions')
    plt.xlabel('True Values')
    plt.ylabel('Predicted Values')
    plt.annotate('Best Fit', xy=(y_test.mean(), y_pred.mean()), xytext=(y_test.mean() + 0.5, y_pred.mean() + 0.5), arrowprops=dict(facecolor='black', shrink=0.05))
    plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)
    plt.show()

advanced_housing_visual_demo()