Hopp til innhald
Fagartikkel

Regresjon

På denne sida skal vi forklare kva regresjon er, gjennom eit døme. Vi tek utgangspunkt i at vi har kasta ein ball opp i lufta og gjort målingar av høgda på ballen som funksjon av tida etter at ballen forlet handa i kastet.

Kva er regresjon?

Regresjonsanalyse eller regresjon betyr for oss at vi har nokre samhøyrande verdiar for to variablar og prøver å finne ein samanheng mellom dei, ein samanheng i form av ein funksjon. Dette er det motsette av progresjon, som vi vanlegvis gjer der vi har modellen (funksjonen), og reknar ut samhøyrande verdiar for dei to variablane.

I dømet nedanfor kastar Camilla ein ball opp i lufta. Vi måler høgda h ballen har x sekund etter at han har forlate handa, og ønsker å finne ein matematisk funksjon hx som passar best mogleg til måleresultata. Til det bruker vi eit digitalt verktøy.

Døme: Kast med ball

Camilla kastar ein ball rett opp i lufta. Tabellen viser høgda til ballen h i meter etter x sekund.

Høgda ballen har over bakken

x, sekund

h, høgde over bakken

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

Her har vi samhøyrande verdiar for dei to variablane tid x og høgde h. Vi ønsker å komme fram til ein matematisk modell, ein funksjon, for høgda som passar med tala i tabellen. Funksjonen, hx, må vere slik at dersom vi set til dømes x=1,5, bør funksjonen gi eit svar nær 11,9. Vi kan bruke eit digitalt verktøy som GeoGebra eller programmering til denne jobben.

Regresjon med GeoGebra

Vi skriv tala inn i reknearkdelen i GeoGebra, markerer tala og vel verktøyet "Regresjonsanalyse" frå den andre verktøymenyen øvst oppe. Sjå figuren nedanfor.

Først kjem berre punkta frå reknearket opp. Grafen får vi først når vi vel ein regresjonsmodell. Sidan punkta ser ut som dei kan ligge på ein parabel, vel vi "Polynom" og "2" for å få ein andregradsfunksjon. GeoGebra bereknar då at den andregradsfunksjonen som passar best med tala, er

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

Vi kan sjå at grafen til denne funksjonen passar svært godt til målepunkta. Det skjer ikkje alltid.

For å få grafen over i det vanlege grafikkfeltet trykker vi på knappen med ein firkant og ei pil på øvst i regresjonsanalyseverktøyet og vel "Kopier til grafikkfeltet". Då kan vi lage ei skikkeleg grafisk framstilling av resultata og setje namn på aksane.

Regresjon med Python

Regresjon med Python kan gjerast på fleire måtar. Her har vi valt å bruke metoden curve_fit frå scipy.optimize sjølv om han gir oss meir data enn vi skal bruke her.

Metoden er basert på at vi skriv i koden kva slags type funksjon som skal brukast i den matematiske modellen. Dette gjer vi ved å definere modellen som ein eigendefinert pythonfunksjon, som vi vel å kalle modell. I vårt tilfelle ønsker vi å tilpasse målingane til ein andregradsfunksjon av typen hx=ax2+bx+c. Den eigendefinerte pythonfunksjonen modell kan då sjå slik ut:

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

Parametrane til modell er først den frie variabelen x, deretter konstantane som skal brukast i modellfunksjonen, som vi naturleg nok kallar a, b og c. Funksjonen modell blir brukt av metoden curve_fit saman med ei liste med x-verdiane og ei liste med y-verdiane i målingane. curve_fit gir tilbake to lister. Den eine inneheld dei tre konstantane a, b og c som gjer at den matematiske funksjonen vi definerte i modell, passar mest mogleg med måledataa. Den andre lista inneheld dei såkalla kovariansane, som vi ikkje skal bruke her.

Koden for heile programmet kan sjå 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        # lagar funksjonen som beskriv modellen
7def modell(x,a,b,c):
8  return a*x**2 + b*x + c
9  
10        # legg inn måledataa i lister
11x_verdiar = [0,0.5,1,1.5,2,2.5,3]
12y_verdiar = [1.8,7.6,11,11.9,10.4,6.4,0]
13
14        # bruker metoden curve_fit og legg resultata i to lister
15konstantar,kovarians = curve_fit(modell,x_verdiar,y_verdiar)
16
17        # hentar ut konstantane frå lista konstantar
18a, b, c = konstantar
19
20        # lagar utskrift av funksjonen
21print(f"Funksjonen blir h(x) = {a:.2f}x^2 {b:+.2f}x {c:+.2f}.")
22
23        # plottar data
24plt.plot(x_verdiar,y_verdiar,'o', label = "Målingar")
25
26        # plottar modell
27x_array = np.linspace(min(x_verdiar),max(x_verdiar),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 sekund") # tittel på x-aksen
32plt.ylabel("$h$, høgde i meter ")
33plt.grid(True)
34plt.show()
Kommentarar til koden i den andre kodeblokka

I linje 9 bruker vi éi linje på å legge verdiane frå lista konstantar over til dei tre variablane.

Lista kovarians bruker vi ikkje i programmet. Vi har vurdert dette med kovarians til å vere utanfor det som blir kravd i faget. Kovariansen seier noko om kor godt dataa passar til modellen.

I linje 21 har vi lagt til ein "+" i formateringskoden til utskrifta. Plussteiknet tvingar Python til å ta med forteiknet til variabelen anten det er pluss eller minus. På den måten får vi alltid riktig teikn mellom ledda i utskrifta av funksjonen.

I linje 24 bruker vi ein "o" i plot-kommandoen for at grafen skal bli runde punkt og ikkje ein samanhengande graf. Vi kunne òg ha brukt kommandoen scatter i staden for plot her.

Du treng kanskje ikkje kommandoen plt.show() til slutt for å få sjå plottet.

Køyring av koden gir denne utskrifta:

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

Vi får same funksjon h som med regresjon med GeoGebra. Det er ikkje alltid tilfelle sidan ulike program kan bruke ulike måtar å komme fram til funksjonane på.

CC BY-SA 4.0Skrive av Bjarne Skurdal.
Sist fagleg oppdatert 19.01.2024