#Gerekli kütüphaneler
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
dataset = pd.read_csv("sirket_giderleri.csv")
dataset.head()
Arge | Yonetim | Pazarlama | Sehir | Kar | |
---|---|---|---|---|---|
0 | 165349.20 | 136897.80 | 471784.10 | Ankara | 192261.83 |
1 | 162597.70 | 151377.59 | 443898.53 | Istanbul | 191792.06 |
2 | 153441.51 | 101145.55 | 407934.54 | Bursa | 191050.39 |
3 | 144372.41 | 118671.85 | 383199.62 | Ankara | 182901.99 |
4 | 142107.34 | 91391.77 | 366168.42 | Bursa | 166187.94 |
dataset.isnull().sum()
Arge 0 Yonetim 0 Pazarlama 0 Sehir 0 Kar 0 dtype: int64
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 4].values
Kategorik verimiz 4. değişken olduğundan dolayı, bu sütun üzerinde işlem yapmak istiyoruz. Python'da indekleme 0'dan başladığı için bunu 3. sütun olarak işleme sokacağız. Değişkenimize baktığımızda 3 farklı şehir ismi yer alıyor. Bu her bir şehir için yeni bir sütun demek oluyor.Yani artık 4. sütun yerine, her şehir için yeni bir sütun oluşturuyoruz.Eğer veri setinde şehir Ankara ise 1 yaz, diğer şehirlere ait hücrelere 0 yaz. Bunu yapmamızdaki asıl sebep şehirlerin birbirleri arasında üstünlüğünün olmamasını sağlamak. Çünkü 4. sütunda Ankara yerine 1, Bursa yerine 2, İstanbul yerine 3 yazmış olsaydık, İstanbulun diğer iki şehirden daha üstün olduğu anlamına gelecekti.
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder = LabelEncoder()
X[:, 3] = labelencoder.fit_transform(X[:, 3])
onehotencoder = OneHotEncoder(categorical_features = [3])
X = onehotencoder.fit_transform(X).toarray()
print(pd.DataFrame(X).head())
0 1 2 3 4 5 0 1.0 0.0 0.0 165349.20 136897.80 471784.10 1 0.0 0.0 1.0 162597.70 151377.59 443898.53 2 0.0 1.0 0.0 153441.51 101145.55 407934.54 3 1.0 0.0 0.0 144372.41 118671.85 383199.62 4 0.0 1.0 0.0 142107.34 91391.77 366168.42
Yukarıdaki tabloda görüldüğü üzere 0,1 ve 2 numaralı değişkenlerimiz şehir değişkeni için oluşturduğumuz dummy features'u temsil ediyor.
Ankara -> 1. Sütun
Bursa-> 2. Sütun
İstanbul->3. Sütun
#Farklı olan şehirlerin sayısı
dataset['Sehir'].value_counts()
Ankara 17 Istanbul 17 Bursa 16 Name: Sehir, dtype: int64
Aşağıda örneğe baktığmızda merkezi A,B,C den oluşan ve kayıp değeri olan bir tablo görüyoruz.
Center Loss
A ------- 12.4
A ------- 10.7
B ------- 9.1
B ------- 11.5
C ------- 8.5
C ------- 11.8
Bu tablodaki kategorik değerlerin numerik ifadelere çevirdiğimizde şöyle bir taablo elde ederiz.
dummy_a dummy_b dummy_c Loss
1--------------------0-----------0---------12.4
1------------------- 0---------- 1--------- 10.7
0------------------- 1---------- 0--------- 9.1
0------------------- 1---------- 0--------- 11.5
0------------------- 0---------- 1--------- 8.5
0------------------- 0---------- 1--------- 11.8
and the matrix regression equation y = X β + ε would look like this:
[ 12.4 ] [ 1 1 0 0 ]
[ 20.7 ] [ 1 1 0 0 ] [ beta0 ]
[ 9.1 ] = [ 1 0 1 0 ] [ alpha1 ] + epsilon
[ 11.5 ] [ 1 0 1 0 ] [ alpha2 ]
[ 8.5 ] [ 1 0 0 1 ] [ alpha3 ]
[ 11.8 ] [ 1 0 0 1 ]
Bu yüzden oluşturduğumuz dummy değerlerinden herhangi birisini bırakmamız gerekiyor. Yani m tane değerimiz varsa m - 1 değer için çözmemiz gerekiyor. Bu yüzden ben sayısı en az olan Bursa sütununu düşüreceğim. Herhangi bir satırda İstanbul ve Ankara değeri 0 olduğunda Bursa için bu değer 1 olarak iişlem yapılıyor. Böylece tuzağa düşmemiş oluyoruz.
# Dummy Variable Tuzağından Kaçınma
X = X[:, 1:]
# Training ve Test split olarak verimizi iki parçaya ayıralım
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
# Çoklu Modelimizi Eğitelim
'''Multiple Linear Regression Linear REgression sınıfından olduğu için LinearRegression class'ını yüklüyoruz '''
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
# Test Sonuçlarını Tahmin Edelim
y_pred = regressor.predict(X_test)
y_pred
array([ 103015.20159797, 132582.27760815, 132447.73845175, 71976.09851258, 178537.48221055, 116161.24230165, 67851.69209675, 98791.73374687, 113969.43533013, 167921.06569551])
Algoritmaları öğrenmeye başlarken en çok araştırdığım konu buydu sanırım. Bütun değişkenleri dahil ediyor muyuz? Ya da hangilerini seçmemiz gerekiyor. Bunun için birkaç yöntem mevcut bunlardan birisi de backward elemination.(Geriye doğru eleme)
#Backward elemination işlemini gerçekleştirmek için gerekli kütüphanemizi dahil edelim
import statsmodels.formula.api as sm
y = β0 + X1β1 + X2β2 + X3β3 + ε
Yukarıda formulde gördüğünüz gibi beta0 değeri sabit olup 1' e eşitir. Fakat bu değer bizim bağımsız değişkenlerimizin bulunduğu lisete (X) yok. Sabit 1 değerini bu listeye eklememiz gerekiyor.Bunun için Numpy' ın' append() ve ones() methodunu kullanacağız. Normalde append fonksiyonuna 1.değer olarak listemizi 2. değer olarak ise eklemek istediğimiz değeri veririz.Fakat böyle yaptığımız beta0' ı listemizin en sonuna ekleriz.Fakat bu değişkeni ilk eleman olarak eklemek istiyoruz.Bunun için np.ones()'ı append() methoduna ilk eleman olarak, X' i ise 2. eleman olarak yazıyoruz. Böylece beta0 değerlerini başa almış oluyoruz.
# X' bakarsanız 50 satırdan oluşuyor. Bu yüzden 50 satırlık 1 değerini np.ones(50,1) ile oluşturuyoruz.
X = np.append(arr = np.ones((50, 1)).astype(int), values = X, axis = 1)
X_opt = X[:, [0, 1, 2, 3,4,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
# summary() fonksiyonu ile istatiksek bir çok değere ulaşabiliriz.
regressor_OLS.summary()
Dep. Variable: | y | R-squared: | 0.951 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.945 |
Method: | Least Squares | F-statistic: | 169.9 |
Date: | Sat, 14 Oct 2017 | Prob (F-statistic): | 1.34e-27 |
Time: | 15:28:33 | Log-Likelihood: | -525.38 |
No. Observations: | 50 | AIC: | 1063. |
Df Residuals: | 44 | BIC: | 1074. |
Df Model: | 5 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 5.008e+04 | 6952.587 | 7.204 | 0.000 | 3.61e+04 | 6.41e+04 |
x1 | 240.6758 | 3338.857 | 0.072 | 0.943 | -6488.349 | 6969.701 |
x2 | 41.8870 | 3256.039 | 0.013 | 0.990 | -6520.229 | 6604.003 |
x3 | 0.8060 | 0.046 | 17.369 | 0.000 | 0.712 | 0.900 |
x4 | -0.0270 | 0.052 | -0.517 | 0.608 | -0.132 | 0.078 |
x5 | 0.0270 | 0.017 | 1.574 | 0.123 | -0.008 | 0.062 |
Omnibus: | 14.782 | Durbin-Watson: | 1.283 |
---|---|---|---|
Prob(Omnibus): | 0.001 | Jarque-Bera (JB): | 21.266 |
Skew: | -0.948 | Prob(JB): | 2.41e-05 |
Kurtosis: | 5.572 | Cond. No. | 1.47e+06 |
X_opt = X[:, [0, 1,3,4,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
regressor_OLS.summary()
Dep. Variable: | y | R-squared: | 0.951 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.946 |
Method: | Least Squares | F-statistic: | 217.2 |
Date: | Sat, 14 Oct 2017 | Prob (F-statistic): | 8.49e-29 |
Time: | 15:28:33 | Log-Likelihood: | -525.38 |
No. Observations: | 50 | AIC: | 1061. |
Df Residuals: | 45 | BIC: | 1070. |
Df Model: | 4 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 5.011e+04 | 6647.870 | 7.537 | 0.000 | 3.67e+04 | 6.35e+04 |
x1 | 220.1585 | 2900.536 | 0.076 | 0.940 | -5621.821 | 6062.138 |
x2 | 0.8060 | 0.046 | 17.606 | 0.000 | 0.714 | 0.898 |
x3 | -0.0270 | 0.052 | -0.523 | 0.604 | -0.131 | 0.077 |
x4 | 0.0270 | 0.017 | 1.592 | 0.118 | -0.007 | 0.061 |
Omnibus: | 14.758 | Durbin-Watson: | 1.282 |
---|---|---|---|
Prob(Omnibus): | 0.001 | Jarque-Bera (JB): | 21.172 |
Skew: | -0.948 | Prob(JB): | 2.53e-05 |
Kurtosis: | 5.563 | Cond. No. | 1.40e+06 |
X_opt = X[:, [0,3,4,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
regressor_OLS.summary()
Dep. Variable: | y | R-squared: | 0.951 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.948 |
Method: | Least Squares | F-statistic: | 296.0 |
Date: | Sat, 14 Oct 2017 | Prob (F-statistic): | 4.53e-30 |
Time: | 15:28:33 | Log-Likelihood: | -525.39 |
No. Observations: | 50 | AIC: | 1059. |
Df Residuals: | 46 | BIC: | 1066. |
Df Model: | 3 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 5.012e+04 | 6572.353 | 7.626 | 0.000 | 3.69e+04 | 6.34e+04 |
x1 | 0.8057 | 0.045 | 17.846 | 0.000 | 0.715 | 0.897 |
x2 | -0.0268 | 0.051 | -0.526 | 0.602 | -0.130 | 0.076 |
x3 | 0.0272 | 0.016 | 1.655 | 0.105 | -0.006 | 0.060 |
Omnibus: | 14.838 | Durbin-Watson: | 1.282 |
---|---|---|---|
Prob(Omnibus): | 0.001 | Jarque-Bera (JB): | 21.442 |
Skew: | -0.949 | Prob(JB): | 2.21e-05 |
Kurtosis: | 5.586 | Cond. No. | 1.40e+06 |
X_opt = X[:, [0,3,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
regressor_OLS.summary()
Dep. Variable: | y | R-squared: | 0.950 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.948 |
Method: | Least Squares | F-statistic: | 450.8 |
Date: | Sat, 14 Oct 2017 | Prob (F-statistic): | 2.16e-31 |
Time: | 15:28:33 | Log-Likelihood: | -525.54 |
No. Observations: | 50 | AIC: | 1057. |
Df Residuals: | 47 | BIC: | 1063. |
Df Model: | 2 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 4.698e+04 | 2689.933 | 17.464 | 0.000 | 4.16e+04 | 5.24e+04 |
x1 | 0.7966 | 0.041 | 19.266 | 0.000 | 0.713 | 0.880 |
x2 | 0.0299 | 0.016 | 1.927 | 0.060 | -0.001 | 0.061 |
Omnibus: | 14.677 | Durbin-Watson: | 1.257 |
---|---|---|---|
Prob(Omnibus): | 0.001 | Jarque-Bera (JB): | 21.161 |
Skew: | -0.939 | Prob(JB): | 2.54e-05 |
Kurtosis: | 5.575 | Cond. No. | 5.32e+05 |
X_opt = X[:, [0,5]]
regressor_OLS = sm.OLS(endog = y, exog = X_opt).fit()
regressor_OLS.summary()
Dep. Variable: | y | R-squared: | 0.559 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.550 |
Method: | Least Squares | F-statistic: | 60.88 |
Date: | Sat, 14 Oct 2017 | Prob (F-statistic): | 4.38e-10 |
Time: | 15:28:33 | Log-Likelihood: | -580.18 |
No. Observations: | 50 | AIC: | 1164. |
Df Residuals: | 48 | BIC: | 1168. |
Df Model: | 1 | ||
Covariance Type: | nonrobust |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 6e+04 | 7684.530 | 7.808 | 0.000 | 4.46e+04 | 7.55e+04 |
x1 | 0.2465 | 0.032 | 7.803 | 0.000 | 0.183 | 0.310 |
Omnibus: | 4.420 | Durbin-Watson: | 1.178 |
---|---|---|---|
Prob(Omnibus): | 0.110 | Jarque-Bera (JB): | 3.882 |
Skew: | -0.336 | Prob(JB): | 0.144 |
Kurtosis: | 4.188 | Cond. No. | 4.89e+05 |