# -*- coding: utf-8 -*-
"""
Created on Fri Oct  3 12:08:05 2025

@author: Moritz Romeike
"""

# ------------------------------------------------------------------------
# Programmcode 07 (Python): Lineare Regression (ohne Ausreißer)
# ------------------------------------------------------------------------
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

# Datei laden (im selben Ordner wie dieses Skript)
base_path = Path(__file__).resolve().parent
path_imputed = base_path / "Kap_2.2_Risk_Management_Data_Imputed.xlsx"
path_orig    = base_path / "Kap_2.2_Risk_Management_Data.xlsx"
data_path = path_imputed if path_imputed.exists() else path_orig

data = pd.read_excel(data_path)

# Numerik sicherstellen 
data["Likelihood"] = pd.to_numeric(data["Likelihood"], errors="coerce")
data["Risk_Score"] = pd.to_numeric(data["Risk_Score"], errors="coerce")

# IQR-Grenzen für Risk_Score
qs = data["Risk_Score"].quantile([0.25, 0.75])
q1, q3 = qs.iloc[0], qs.iloc[1]
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr

# Ausreißer identifizieren
outlier_mask = (data["Risk_Score"] < lower) | (data["Risk_Score"] > upper)
outliers = data.loc[outlier_mask].copy()

print("Identifizierte Ausreißer:")
print(outliers[["Project_ID", "Likelihood", "Impact", "Risk_Score"]].to_string(index=False))

# Clean-Daten ohne Ausreißer
clean_data = data.loc[~outlier_mask, ["Likelihood", "Risk_Score"]].dropna().copy()

# --- Regression ohne Zusatzpakete ---
# y = a*x + b
x = clean_data["Likelihood"].values
y = clean_data["Risk_Score"].values
a, b = np.polyfit(x, y, deg=1)

# Kennzahlen
y_pred = a * x + b
ss_res = np.sum((y - y_pred) ** 2)
ss_tot = np.sum((y - y.mean()) ** 2)
r2 = 1 - ss_res / ss_tot if ss_tot > 0 else np.nan
corr = np.corrcoef(x, y)[0, 1]

print("\n=== Lineare Regression (ohne Ausreißer; numpy) ===")
print(f"Formel: Risk_Score = {a:.6f} * Likelihood + {b:.6f}")
print(f"R^2    : {r2:.6f}")
print(f"Corr r : {corr:.6f}")
print(f"n      : {len(clean_data)}")

# --- Optional: ausführliche Tabelle via statsmodels, falls verfügbar ---
try:
    import statsmodels.api as sm
    X = sm.add_constant(x)  # Intercept
    model = sm.OLS(y, X).fit()
    print("\n=== Detaillierte Regression (statsmodels) ===")
    print(model.summary())
except Exception:
    print("\n(Hinweis) Für eine vollständige Regressionstabelle wie in R: pip install statsmodels")

# --- Plot (Scatter + Regressionslinie) ---
plt.figure()
plt.scatter(clean_data["Likelihood"], clean_data["Risk_Score"],
            label="Daten (ohne Ausreißer)", color="steelblue", alpha=0.7, s=50)
x_sorted = np.sort(x)
plt.plot(x_sorted, a * x_sorted + b, linewidth=2, color="red", label="OLS-Linie")  # <-- Rot eingefügt
plt.title("Lineare Regression (ohne Ausreißer): Risk_Score ~ Likelihood")
plt.xlabel("Likelihood")
plt.ylabel("Risk Score")
plt.legend()
plt.tight_layout()
# plt.savefig(base_path / "Regression_ohne_Ausreisser.png", dpi=150)
plt.show()
# ------------------------------------------------------------------------

