Sulla base della lettura di un file CSV, calcola i coefficienti della retta di regressione, le incertezze dei parametri e il coeff. di correlazione. Visualizza i risultati in due grafici a dispersione: il primo comprendente i dati, il secondo i residui.
import numpy as np
import matplotlib.pyplot as plt
nome_file = input("Inserire il nome del file CSV: ")
file_in = open(nome_file, "r")
# per es. esempio3-completo.csv
coppie_dati = np.loadtxt(file_in, delimiter = ",", comments = '#', usecols = (0,1))
n = len(coppie_dati)
nparrayX_Y = coppie_dati.transpose()
dati_x = nparrayX_Y[0]
dati_y = nparrayX_Y[1]
file_in.close()
XY = dati_x * dati_y
quadrato_x = dati_x**2
delta = (n*sum(quadrato_x) - sum(dati_x)**2)
a = (n*sum(XY) - sum(dati_x)*sum(dati_y)) / delta
b = (sum(dati_y) - a*sum(dati_x))/n
previsioni_y = a*dati_x + b
residui = dati_y - previsioni_y
sigma = np.sqrt(sum(residui**2)/(n-2))
sigma_a = sigma*np.sqrt(n/delta)
sigma_b = sigma*np.sqrt(sum(quadrato_x)/delta)
media_x = np.mean(dati_x)
media_y = np.mean(dati_y)
coeff_correlazione = sum((dati_x-media_x)*(dati_y-media_y))/np.sqrt(sum((dati_x-media_x)**2)*sum((dati_y-media_y)**2))
min_x = min(dati_x)
max_x = max(dati_x)
min_y = min(dati_y)
max_y = max(dati_y)
delta_x = (max_x-min_x)/15
delta_y = (max_y-min_y)/15
x = np.linspace(min_x-delta_x, max_x+delta_x, 100)
y = a*x + b
y_sup = (a+sigma_a)*x + (b+sigma_b)
y_inf = (a-sigma_a)*x + (b-sigma_b)
massimo_residui = max(abs(residui))
if a>=0:
posizione_txt = max_x - 4*delta_x
elif a<0:
posizione_txt = min_x + delta_x
Parte grafica: dispersione dei dati.
plt.grid(which = 'both', color = '.85', linestyle = '-', linewidth=1)
plt.vlines(dati_x, dati_y-sigma, dati_y+sigma, linewidth = .5, color = 'b')
plt.fill_between(x, y_inf, y_sup, alpha = .1, linewidth = 0, color='r')
plt.plot(x, y, color = 'red', linewidth = 2, label = 'retta di regressione')
plt.scatter(dati_x, dati_y, s = 20, c = 'cornflowerblue', zorder = 3, label = 'dati rilevati')
plt.title("Retta di regressione e fascia di incertezza")
plt.xlabel('grandezza X')
plt.ylabel('grandezza Y')
plt.text(posizione_txt, min_y+delta_y/2, 'y = ('+str(round(a,2))+')x + ('+str(round(b,2))+')\n a = '+str(round(a,2))+' $\pm$ '+str(round(sigma_a,2))+'\n b = '+str(round(b,2))+' $\pm$ '+str(round(sigma_b,2))+'\n r = '+str(round(coeff_correlazione,2)), c = 'r')
plt.legend()
plt.show()
Dispersione dei residui.
plt.grid(which = 'both', color = '.85', linestyle = '-', linewidth=1)
plt.xlim([min_x-delta_x, max_x+delta_x])
plt.ylim([-13/10*massimo_residui, 13/10*massimo_residui])
plt.vlines(dati_x, np.zeros(n), residui, linewidth = .5, color = 'orange')
plt.fill_between(x, -sigma, sigma, alpha =.1, linewidth = 0, color = 'r')
plt.plot(x, np.zeros(100), color = 'red', linewidth = 2)
plt.scatter(dati_x, residui, s = 8, c = 'cornflowerblue', zorder = 3, label = 'residui: $y_i-ax_i-b$')
plt.title("Distribuzione dei residui\n devSt $\sigma=$" + str(round(sigma,2)))
plt.xlabel('grandezza X')
plt.ylabel('residui')
plt.legend()
plt.show()