# -*- coding: utf-8 -*-
"""
Created on Fri Oct  3 11:59:00 2025

@author: Moritz Romeike
"""
# ------------------------------------------------------------------------
# Programmcode 06 (Python): Lineare Regression Risk_Score ~ Likelihood
# ------------------------------------------------------------------------
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

# Skript-Ordner robust bestimmen und Datei laden
base_path = Path(__file__).resolve().parent
data_path = base_path / "Kap_2.2_Risk_Management_Data_Imputed.xlsx"
if not data_path.exists():
    # Fallback, falls noch nicht imputiert wurde
    data_path = base_path / "Kap_2.2_Risk_Management_Data.xlsx"

data = pd.read_excel(data_path)

# Sicherstellen, dass die Spalten numerisch sind (wie as.numeric in R)
data["Likelihood"] = pd.to_numeric(data["Likelihood"], errors="coerce")
data["Risk_Score"] = pd.to_numeric(data["Risk_Score"], errors="coerce")

# Nur vollständige Zeilen verwenden
df = data[["Likelihood", "Risk_Score"]].dropna().copy()

# --- Regression ohne Zusatzpakete (numpy) ---
# y = a*x + b -> polyfit gibt [a, b]
a, b = np.polyfit(df["Likelihood"].values, df["Risk_Score"].values, deg=1)

# Vorhersagen + Gütemaße
y_pred = a * df["Likelihood"].values + b
ss_res = np.sum((df["Risk_Score"].values - y_pred)**2)
ss_tot = np.sum((df["Risk_Score"].values - np.mean(df["Risk_Score"].values))**2)
r2 = 1 - ss_res / ss_tot if ss_tot > 0 else np.nan
corr = np.corrcoef(df["Likelihood"].values, df["Risk_Score"].values)[0, 1]

print("=== Lineare Regression (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(df)}")

# --- Plot (Scatter + Regressionslinie) ---
plt.figure()
plt.scatter(df["Likelihood"], df["Risk_Score"], label="Datenpunkte")
# Linie sauber sortiert zeichnen
x_sorted = np.sort(df["Likelihood"].values)
plt.plot(x_sorted, a * x_sorted + b, linewidth=2, label="Lineare Regression")
plt.title("Lineare Regression: Risk_Score ~ Likelihood")
plt.xlabel("Likelihood")
plt.ylabel("Risk Score")
plt.legend()
plt.tight_layout()

# Optional speichern:
# plt.savefig(base_path / "Regression_RiskScore_Likelihood.png", dpi=150)
plt.show()

# --- Optional: detaillierte Regressionstabelle wie R::summary(lm) ---
# Wird nur genutzt, wenn statsmodels installiert ist
try:
    import statsmodels.api as sm
    X = sm.add_constant(df["Likelihood"].values)  # Intercept
    model = sm.OLS(df["Risk_Score"].values, X).fit()
    print("\n=== Detaillierte Regression (statsmodels) ===")
    print(model.summary())
except Exception as e:
    # Kein Fehler, nur Hinweis, wie man die volle Tabelle bekommt
    print("\n(Hinweis) Für eine vollständige Regressionstabelle wie in R installiere statsmodels:")
    print("pip install statsmodels   # oder conda install statsmodels")
# ------------------------------------------------------------------------
