Øvingsoppgaver

Ta utgangspunkt i det klassiske datasettet som inneholder informasjon om størrelsen (lende og bredde) av begerbladene (engelsk: sepal) (de ytre bladene i en blomst) og kronbladene (engelsk: petal) til tre ulike typer Iris (setosa, versicolor og virginica) - på norsk hhv.: villiris, praktiris og blått flagg iris). Dere skal bruke dette datasettet til å se nærmere på lineær regresjon.

Oppgave 1

a) Les inn iris-datasettet med scikit-learn:

from sklearn import datasets 
import pandas as pd
iris_data = datasets.load_iris()
print(iris_data.keys())
print(iris_data["feature_names"])
print(iris_data["target_names"])
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
['setosa' 'versicolor' 'virginica']

b) Få dataene inn i et Pandas-dataframe med riktige kolonnenavn. Man kan lage et dataframe av en numpy-array med flere kolonner ved å spesifisere hva kolonnene skal hete. Kolonnenavnene finnes i datasettet fra sklearn. Prøv deg fram og få evt. hjelp av en venn. Under er et eksempel, men du må selv finne ut hva du skal sette inn for data og columns når du lager dataframe. Lag en ny kolonne som inneholder navnet til de ulike iris-typene (target 0: setosa, 1: versicolor, 2: virginica).

Eksempelkode som kanskje er litt til hjelp:

import pandas as pd
df = pd.DataFrame(data, columns=columns)
display(df)

Løsningsforslag:

import numpy as np

# Create a DataFrame
df = pd.DataFrame(data=iris_data.data, columns=iris_data.feature_names)

# Add a column with the target names
df['species'] = pd.Categorical.from_codes(iris_data.target, iris_data.target_names)

display(df)
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
... ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica

150 rows × 5 columns

c) Lag en lineær modell som beskriver sammenhengen mellom lengden og bredden til begerbladene for en av de tre ulike typene Iris.

  • Plot modellen sammen med populasjonen?
  • Hva blir koeffisentene til modellen?

Løsningsforslag:

import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.linear_model import LinearRegression

# Filter the DataFrame for one species, e.g., setosa
setosa_df = df[df['species'] == 'setosa']

# Define the model
model = LinearRegression()

# Fit the model
X = setosa_df[['sepal length (cm)']]
y = setosa_df[['sepal width (cm)']]
model.fit(X, y)

# Get the coefficients
intercept = model.intercept_[0]
slope = model.coef_[0][0]
print(f"Intercept: {intercept}, Slope: {slope}")

# Plot the data and the model
plt.figure(figsize=(10, 6))
sns.scatterplot(x='sepal length (cm)', y='sepal width (cm)', data=setosa_df, label='Data')
plt.plot(setosa_df['sepal length (cm)'], model.predict(X), color='red', label='Linear model')
plt.xlabel('Sepal Length (cm)')
plt.ylabel('Sepal Width (cm)')
plt.title('Linear Regression Model for Setosa Sepal Dimensions')
plt.legend()
plt.show()
Intercept: -0.5694326730396502, Slope: 0.7985283006471534

d) Fortsett med modellen over og finn 95% konfidensintervall for koeffisentene.

Avgjør om det er en sammenheng mellom lengden og bredden av begerbladene ved å sette opp en hypotesetest og vurder den ut fra bla. p-verdi.

import statsmodels.api as sm

X = sm.add_constant(X)
model = sm.OLS(y, X).fit()

conf_int = model.conf_int(alpha=0.05)
print("95% confidence intervals for the coefficients:")
print(conf_int)

hypothesis_test = model.t_test([0, 1])
print("Hypothesis test result:")
print(hypothesis_test)
95% confidence intervals for the coefficients:
                          0         1
const             -1.618405  0.479539
sepal length (cm)  0.589493  1.007564
Hypothesis test result:
                             Test for Constraints                             
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
c0             0.7985      0.104      7.681      0.000       0.589       1.008
==============================================================================

Det er helt klart en ikke-spuriøs sammenheng mellom lengde og bredde av begebladene.