#Regrasja liniowa
'''
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#Funcja wyznaczająca krzywą regresi

def regression (x,y):
    sum_of_xy = 0
    sum_x = 0
    sum_y = 0
    sum_x_squared = 0
    n = len(x)

    for x_value, y_value, in zip(x,y):
        sum_of_xy+=x_value * y_value
        sum_x += x_value
        sum_y += y_value
        sum_x_squared += x_value ** 2

    a = (n*sum_of_xy - sum_x * sum_y) / (n*sum_x_squared - sum_x ** 2)
    b = (sum_y - a * sum_x) / n

    print(f"Wzór y = {a}x + {b}")
    return a,b

#Ustawienie generatora liczb losowychdla powtarzalnych wynikow
np.random.seed(42)

#Generowanie 100 punktów x w zakracie od 0 do 50
X = np.linspace(0,50,100)

#Tworzenie wartości y=2x z losowym szumem (zakres -5 do 5)
noise = np.random.randint(-5,5,100) #Losowy szum
Y = 2*X-10 + noise

a,b = regression(X,Y)
Y_pred = a*X + b

#Rysowanie wykresu
plt.figure(figsize=(8,5))
plt.scatter(X,Y, color='blue', label='Punkty z szumem', alpha=0.6)
plt.plot(X,Y_pred, color= 'red', linewidth=2, label = "Linia regresji")

#Opisy wykresu
plt.xlabel("X")
plt.ylabel("Y")
plt.title("Punkty wokół prostej y = 2x - 10 z losowym szumem")
plt.legend()
plt.gray()

#Wyświetlenie wykresu
plt.show()
'''

import numpy as np
import matplotlib.pyplot as plt

# Dane

x = np.arange(1,11,dtype=float)
y_true = np.array([50,65,80,92,105,118,130,145,160,172])

# Ideksy brakujących
missing = np.array([3,6,8])
know = np.setdiff1d(np.arange(len(x)), missing)

# Regersja na znanych punktach
a,b = np.polyfit(x[know], y_true[know], 1)
y_pred= a * x + b

#Korekcja na znanych
r = np.corrcoef(x[know], y_true[know])[0,1]
print(f"Korelacja = {r:.4f}")
for i in missing:
    print(f"Poziom {int(x[i])}: prawdziwe {y_true}, przewidziane {y_pred[i]:.2f}, różnica {y_pred[i]-y_true[i]:.2f}")

#Wykres
plt.figure(figsize=(7,5))
plt.scatter(x[know], y_true[know], color="blue", label='Znane punkty')
plt.plot(x,y_pred, color="red", label="Linia regresji")
plt.scatter(x[missing], y_pred[missing], marker="x", color="green", s=100, label="Przewidziane")
plt.scatter(x[missing], y_true[missing], facecolors='none', edgecolors='orange', s=100, label="Rzeczywiste")
plt.title(f"RPG - obrażenia vs poziom (r={r:.2f})")
plt.xlabel("Poziom")
plt.ylabel("Obrażenia")
plt.legend()
plt.grid(True)
plt.show()