Regresjon med Python

Fra tidligere har du lært å gjøre regresjon i GeoGebra og kanskje også i Excel. Regresjon er å finne en funksjon som passer dine datapunkter så godt som mulig.

Når du har laget en regresjonsmodell, kan du bruke den til å interpolere (regne ut nye y-verdier innenfor de x-verdiene du har data for) og ekstrapolere (regne ut nye y-verdier utenfor).

Ekstrapolering XKCD

Vi skal bruke disse datapunktene i eksemplene:

In [50]:
import pylab

data_x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
data_y = [3, 5, 8, 13, 17, 18, 21, 23, 23, 25, 24]

pylab.plot(data_x, data_y, '.')
Out[50]:
[<matplotlib.lines.Line2D at 0x2093b4ca550>]

Lineær regresjon

Det ser ut som datapunktene ligger på en rett linje. Som du husker, så kan vi skrive rette linjer slik:

$f(x) = a\cdot x + b$

Vi skal nå få Python til å regne ut koeffisientene $a$ og $b$. Har vi disse, kan vi tegne linja som passer datapunktene best.

In [54]:
# fortsetter fra forrige kodecelle

def polynom1(x, a, b):
    # formel for et førstegradspolynom (en rett linje)
    return a*x + b

a1, b1 = pylab.polyfit(data_x, data_y, deg=1) 
# deg=1 forteller funksjonen at vi er ute etter et uttrykk med "degree" 1,
# altså et førstegradspolynom (som er en rett linje)

print(f"f(x) = {a1:.2f}x + {b1:.2f}")

# Nå skal vi tegne plotte funksjonen
x = pylab.linspace(0, 10, 1000)
y1 = polynom1(x, a1, b1)

pylab.plot(data_x, data_y, '.')
pylab.plot(x, y1)
f(x) = 2.31x + 4.82
Out[54]:
[<matplotlib.lines.Line2D at 0x2093b1a6c40>]

Regresjon andregradsfunksjon

Kanskje det passer bedre med en andregradsfunksjon? Som du husker, ser en andregradsfunksjon slik ut:

$f(x) = a\cdot x^2 + b\cdot x + c$

Det eneste vi gjør annerledes, er å hente ut én ekstra koeffisient fra pylab.polyfit ved å bruke deg=2:

In [61]:
# fortsetter fra forrige kodecelle

def polynom2(x, a, b, c):
    # formel for et andregradspolynom
    return a*x**2 + b*x + c

a2, b2, c2 = pylab.polyfit(data_x, data_y, deg=2)

print(f"f(x) = {a2:.2f}x**2 + {b2:.2f}x + {c2:.2f}")

x = pylab.linspace(0, 10, 1000)
y2 = polynom2(x, a2, b2, c2)

pylab.plot(data_x, data_y, '.', label='Datapunkter')
pylab.plot(x, y1, label='Lineær')
pylab.plot(x, y2, label='Andregrad')

pylab.legend()
f(x) = -0.21x**2 + 4.45x + 1.60
Out[61]:
<matplotlib.legend.Legend at 0x2093c732850>

Regresjon av høyere ordens polynomer

Du kan lage polynomer av så høy orden du bare vil. Da kan du enten hente ut koeffisientene på samme måte som i eksemplene, eller behandle dem som en liste for å slippe å lage så mange variabler.

Oppgaver

  1. Moskus på Dovre
    1. Last ned og les inn data fra fila moskus_dovre.csv. Tegn datapunktene.
    2. Lag et andregradsuttrykk og et tredjegradsuttrykk som passer dataene.
    3. Tegn modellene dine i samme diagram som datapunktene. La dem bruke x-verdier helt frem til 2040.
    4. Ifølge dine modeller: Hvor mange moskus er det i år 2030? La programmet regne det ut og skrive til konsollen.
  2. Grunnstoffer
    1. Last ned og les inn data fra fila grunnstoffer.txt. Tegn atomnummer langs x-aksen og atommasse langs y-aksen.
    2. Utforst dataene ved hjelp av regresjon.
  3. Hvor populært er ordet 'Einstein'?
    1. Last ned og les inn data fra fila frekvens_einstein.txt. Den inneholder informasjon om hvor mange % av alle ord i alle engelske tekster som er ordet 'einstein' i årene 1800 til 2019.
    2. Utforsk dataene ved hjelp av regresjon.