Hopp til innhold
Fagartikkel

Regresjon

På denne siden skal vi forklare hva regresjon er, gjennom et eksempel. Vi tar utgangspunkt i at vi har kastet en ball opp i lufta og gjort målinger av høyden på ballen som funksjon av tida etter at ballen forlot hånda i kastet.

Hva er regresjon?

Regresjonsanalyse eller regresjon betyr for oss at vi har noen samhørende verdier for to variabler og prøver å finne en sammenheng mellom dem, en sammenheng i form av en funksjon. Dette er det motsatte av progresjon, som vi vanligvis gjør der vi har modellen (funksjonen), og regner ut samhørende verdier for de to variablene.

I eksempelet nedenfor kaster Camilla en ball opp i lufta. Vi måler høyden h ballen har x sekunder etter at den har forlatt hånda, og ønsker å finne en matematisk funksjon hx som passer best mulig til måleresultatene. Til det bruker vi et digitalt verktøy.

Eksempel: Kast med ball

Camilla kaster en ball rett opp i lufta. Tabellen viser ballens høyde h i meter etter x sekunder.

Ballens høyde over bakken

x, sekunder

h, høyde over bakken

01,8
0,57,6
111
1,511,9
210,4
2,56,4
30

Her har vi samhørende verdier for de to variablene tid x og høyde h. Vi ønsker å komme fram til en matematisk modell, en funksjon, for høyden som passer med tallene i tabellen. Funksjonen, hx, må være slik at hvis vi setter for eksempel x=1,5, bør funksjonen gi et svar nær 11,9. Vi kan bruke et digitalt verktøy som GeoGebra eller programmering til denne jobben.

Regresjon med GeoGebra

Vi skriver tallene inn i regnearkdelen i GeoGebra, markerer tallene og velger verktøyet "Regresjonsanalyse" fra den andre verktøymenyen øverst. Se figuren nedenfor.

Først vises bare punktene fra regnearket. Grafen får vi først når vi velger en regresjonsmodell. Siden punktene ser ut som de kan ligge på en parabel, velger vi "Polynom" og "2" for å få en andregradsfunksjon. GeoGebra beregner da at den andregradsfunksjonen som passer best med tallene, er

hx=-4,8952x2+14,0857x+1,7952

Vi kan se at grafen til denne funksjonen passer svært godt til målepunktene. Det skjer ikke alltid.

For å få grafen over i det vanlige grafikkfeltet trykker vi på knappen med en firkant og ei pil på øverst i regresjonsanalyseverktøyet og velger "Kopier til grafikkfeltet". Da kan vi lage en skikkelig grafisk framstilling av resultatene og sette navn på aksene.

Regresjon med Python

Regresjon med Python kan gjøres på flere måter. Her har vi valgt å bruke metoden curve_fit fra scipy.optimize selv om den gir oss mer data enn vi skal bruke her.

Metoden er basert på at vi angir i koden hva slags type funksjon som skal brukes i den matematiske modellen. Dette gjøres ved å definere modellen som en egendefinert pythonfunksjon, som vi velger å kalle modell. I vårt tilfelle ønsker vi å tilpasse målingene til en andregradsfunksjon av typen hx=ax2+bx+c. Den egendefinerte pythonfunksjonen modell kan da se slik ut:

python
1def modell(x,a,b,c):
2  return a*x**2 + b*x + c

Parametrene til modell er først den frie variabelen x, deretter konstantene som skal brukes i modellfunksjonen, som vi naturlig nok kaller a, b og c. Funksjonen modell brukes av metoden curve_fit sammen med ei liste med x-verdiene og ei liste med y-verdiene i målingene. curve_fit gir tilbake to lister. Den ene inneholder de tre konstantene a, b og c som gjør at den matematiske funksjonen vi definerte i modell, passer mest mulig med måledataene. Den andre lista inneholder de såkalte kovariansene, som vi ikke skal bruke her.

Koden for hele programmet kan se slik ut:

python
1        # importerer nødvendige bibliotek
2from scipy.optimize import curve_fit
3import numpy as np
4import matplotlib.pyplot as plt
5
6        # lager funksjonen som beskriver modellen
7def modell(x,a,b,c):
8  return a*x**2 + b*x + c
9  
10        # legger inn måledataene i lister
11x_verdier = [0,0.5,1,1.5,2,2.5,3]
12y_verdier = [1.8,7.6,11,11.9,10.4,6.4,0]
13
14        # bruker metoden curve_fit og legger resultatene i to lister
15konstanter,kovarians = curve_fit(modell,x_verdier,y_verdier)
16
17        # henter ut konstantene fra lista konstanter
18a, b, c = konstanter
19
20        # lager utskrift av funksjonen
21print(f"Funksjonen blir h(x) = {a:.2f}x^2 {b:+.2f}x {c:+.2f}.")
22
23        # plotter data
24plt.plot(x_verdier,y_verdier,'o', label = "Målinger")
25
26        # plotter modell
27x_array = np.linspace(min(x_verdier),max(x_verdier),300)
28y_array = modell(x_array,a,b,c)
29plt.plot(x_array,y_array,"brown", label = "Modell")
30plt.legend(bbox_to_anchor=(1,1))
31plt.xlabel("$x$, tid i sekunder") # tittel på x-aksen
32plt.ylabel("$h$, høyde i meter ")
33plt.grid(True)
34plt.show()
Kommentarer til koden i den andre kodeblokka

I linje 9 bruker vi éi linje på å legge verdiene fra lista konstanter over til de tre variablene.

Lista kovarians bruker vi ikke i programmet. Vi har vurdert dette med kovarians til å være utenfor det som kreves i faget. Kovariansen sier noe om hvor godt dataene passer til modellen.

I linje 21 har vi lagt til en "+" i formateringskoden til utskriften. Plusstegnet tvinger Python til å ta med fortegnet til variabelen enten det er pluss eller minus. På den måten får vi alltid riktig tegn mellom leddene i utskriften av funksjonen.

I linje 24 bruker vi en "o" i plot-kommandoen for at grafen skal bli runde punkter og ikke en sammenhengende graf. Vi kunne også ha brukt kommandoen scatter i stedet for plot her.

Du trenger kanskje ikke kommandoen plt.show() til slutt for å få se plottet.

Kjøring av koden gir følgende utskrift:

"Funksjonen blir h(x) = -4.90x^2 +14.09x +1.80."

Vi får samme funksjon h som med regresjon med GeoGebra. Det er ikke alltid tilfelle siden ulike programmer kan bruke ulike måter å komme fram til funksjonene på.

CC BY-SA 4.0Skrevet av Bjarne Skurdal.
Sist faglig oppdatert 19.01.2024