Modellierung#

Lineare Regression#

Lineare Regression zu Fuß#

Gegeben sind zwei numpy Arrays. Die Daten Zeigen das Verhähltnis zwischen Lernzeit und Note für 10 Studentinnen.

Lernzeit = np.array([2,7,11,17,20,22,30,35,39,41])

Note = np.array([5,5,4,3.7,3,3.7,2.7,2,2.3,1])

I. Plotten Sie die Daten auf ein Scatter Plot, wobei die Lernzeit auf der X-Achse und der Note auf der Y-Achse aufgetragen werden sollen.

II. Eine lineare Regression sucht die Gerade, die den quadratischen Abstand aller Messwerte zu jener Gerade minimiert. Folgend sind die beiden Formeln für die Steigung \(m\) und den y-Achsenabschnitt \(b\) der gesuchten Gerade. \(n\) ist die Anzahl der Datenpunkte.

\[\begin{split} m &= \frac{(n \cdot \sum xy) - (\sum x \cdot \sum y)}{(n \cdot \sum x^2) - ((\sum x)^2)}\\ b &= \frac{\sum y - (m \cdot \sum x)}{n} \end{split}\]

Berechnen Sie mit den gegebenen Daten und mithilfe der beiden Formeln die Gerade.

III. Speichern Sie die berechnete Gerade in einer Funktion und bennenen Sie diese.

Lösung I#

Hide code cell source
import numpy as np
import matplotlib.pyplot as plt

Lernzeit = np.array([2,7,11,17,20,22,30,35,39,41])
Note = np.array([5,5,4,3.7,3,3.7,2.7,2,2.3,1])

plt.scatter(Lernzeit,Note)
plt.xlabel('Lernzeit / St')
plt.ylabel('Note')
plt.show()
../../../../_images/dea1564a7a1c40aeaf9d71ca95dc4bec7a66306a4dbcac0f7080e96243d233a9.png

Lösung II#

Hide code cell source
#Steigung

x_summe = np.sum(Lernzeit)
y_summe = np.sum(Note)
xy_summe = np.sum(Lernzeit*Note)
xx_summe = np.sum(Lernzeit**2)

m = ((10*xy_summe)-(x_summe*y_summe))/((10*xx_summe)-(x_summe**2))
print(m)

#Achsenabschnitt

b = (y_summe-m*x_summe)/10
print(b)
Hide code cell output
-0.09101666264187402
5.278773243177978

Lösung III#

Hide code cell source
# y = m*x + b

def zufuss(Stunden):
    return -0.091*Stunden + 5.278

Lineare Regression mit np.polyfit()#

Berechnen Sie die Koeffizienten \(m\) und \(b\) mithilfe np.polyfit().

Lösung#

Hide code cell source
polyline = np.polyfit(Lernzeit,Note,1)
polyline
Hide code cell output
array([-0.09101666,  5.27877324])

Vergleichen der Lösungswege#

Plotten Sie die Datenpunkte, und beide berechnete Linien mit matplotlib.

Lösung#

Hide code cell source
plt.plot(Lernzeit, polyline[0]*Lernzeit + polyline[1], 'r', label='np.polyfit')
plt.plot(Lernzeit, zufuss(Lernzeit), '--y', label='Zufuß')
plt.scatter(Lernzeit, Note, label='Datenpunkte')
plt.xlabel('Lernzeit / St')
plt.ylabel('Note')
plt.legend()
plt.show()
Hide code cell output
../../../../_images/6037f79c38c4dccfa6a8c40d50db480b82c29b8cc3f5dc6956c84afea3a3a271.png

Schätzung#

Eine Regression erlaubt es, Erwartungswerte für Punkte zu erhalten, für die man keine Daten hat.
Was wäre die erwartete Note einer Studentin, die 25 Stunden gelernt hat?

Lösung#

Hide code cell source
print(zufuss(25))

plt.scatter(25, zufuss(25), c='g', label='Prediction')

plt.plot(Lernzeit, polyline[0]*Lernzeit + polyline[1], 'r', label='np.polyfit')
plt.plot(Lernzeit, zufuss(Lernzeit), '--y', label='Zufuß')
plt.scatter(Lernzeit, Note, label='Datenpunkte')
plt.xlabel('Lernzeit / St')
plt.ylabel('Note')
plt.legend()
plt.show()
Hide code cell output
3.0029999999999997
../../../../_images/6f738b874483551cd0d4e17853350adb63d9c3637ef596861820fdfede475262.png