#!/usr/bin/env python # coding: utf-8 # In[1]: from datetime import datetime print(f'Päivitetty {datetime.now().date()} / Aki Taanila') # # Useamman selittäjän lineaarinen regressio # In[2]: import pandas as pd import matplotlib.pyplot as plt import seaborn as sns sns.set_style('whitegrid') # Tuon lineaarisen regressiomallin from sklearn.linear_model import LinearRegression # Perinteisempään regressio-statistiikkaan tarvitsen statsmodels-kirjastoa import statsmodels.api as sm # ## Datan tarkastelua # In[3]: # Avaan datan (kesämökkien hintoja tuhansina euroina) df = pd.read_excel('http://taanila.fi/mokki.xlsx') df # In[4]: # Riippuvuuksien tarkastelua seaborn-kirjaston hajontakaavioina sns.pairplot(df, kind='reg') # In[5]: # Riippuvuuksien tarkastelua korrelaatiokertoimien avulla correlation_matrix = df.corr().round(2) sns.heatmap(data=correlation_matrix, annot=True) # ## Mallin sovittaminen # In[6]: # Selittävät muuttujat X = df[['ranta', 'pinta-ala', 'sähkö']] # Ennustettava muuttuja y = df['hinta'] # In[7]: malli = LinearRegression().fit(X,y) # ## Mallin tarkastelua # In[8]: malli.coef_ # regressiosuoran kulmakerroin # Esimerkiksi rantaviivan kulmakertoimesta näemme: Jos muut tekijät pysyvät vakiona, niin 1 metri lisää rantaviivaa kasvattaa mallin mukaan hintaa noin 2 yksiköllä (2000 tuhatta euroa). # In[9]: malli.intercept_ # regressiosuoran vakiotermi # In[10]: malli.score(X,y) # selityskerroin # Selityskertoimen mukaan noin 98 % hintojen vaihtelusta voidaan selittää selittävien muuttujien vaihtelulla. # In[11]: # Mallin virhetermit pistekaaviona plt.scatter(malli.predict(X), malli.predict(X) - y) # Vaakaviiva nollapoikkeaman kohdalle plt.hlines(y = 0, xmin = 50, xmax = 250) plt.xlabel('Ennuste') plt.ylabel('Poikkeama todellisesta') # On hyvä jos virheet vaihtelevat sattumanvaraisesti nollan molemmin puolin # In[12]: # Todellisen hinnan ja mallin antamien ennusteiden vastaavuus pistekaaviona plt.scatter(y, malli.predict(X)) plt.xlabel('Todellinen hinta') plt.ylabel('Ennuste') # On hyvä jos pisteet seuraavat suoraa viivaa vasemmasta alakulmasta oikeaan yläkulmaan # In[13]: # Perinteisempi regressio-statistiikka statsmodels-kirjastosta # Seuraava rivi tarvitaan, jotta malliin lasketaan vakiotermi X = sm.add_constant(X) # Mallin sovitus (OLS = Ordinary Least Squares) malli_sm = sm.OLS(y, X).fit() print(malli_sm.summary()) # Kannattaa tarkistaa selittäviin muuttujiin liittyvät p-arvot P>|t| -sarakkeesta # On hyvä jos p-arvot (sarake P>|t|) ovat pienempiä kuin 0.05 # ## Ennustaminen mallin avulla # In[14]: # Avaan uuden datan, jossa samat muuttujat kuin selittävinä muuttujina Xuudet = pd.read_excel('http://taanila.fi/mokkinew.xlsx') Xuudet # In[15]: # Hintaennusteet Xuudet['Hintaennuste'] = malli.predict(Xuudet) Xuudet #

Lisätietoa

# # Data-analytiikka Pythonilla: https://tilastoapu.wordpress.com/python/