library(readxl)
valorant <- read.csv("Regresyon Analizi/valorantdata.csv")
View(valorant)
modelvalo <- lm(ACS ~ Kills, data = valorant) #Basit doğrusal regresyon modeli için "lm" komutunu kullanıyoruz.
#model = y şapka 152,425 + 4.441 Kills
#B0 şapka = 152,425 B1 şapka = 4.441
# lm( y ~ x, data = verimiz)
# x yerine x'ler girilebilir.
#Modelin summary’sine bakıyoruz.
summary(modelvalo) #P-value değeri 0'a çok yakın (4.423e-15) olduğu için Model anlamlıdır.
##
## Call:
## lm(formula = ACS ~ Kills, data = valorant)
##
## Residuals:
## Min 1Q Median 3Q Max
## -325.32 -33.86 -7.37 29.75 271.77
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 152.4254 10.2377 14.89 < 2e-16 ***
## Kills 4.4414 0.5294 8.39 4.42e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 63.55 on 237 degrees of freedom
## (13 observations deleted due to missingness)
## Multiple R-squared: 0.229, Adjusted R-squared: 0.2257
## F-statistic: 70.38 on 1 and 237 DF, p-value: 4.423e-15
#Şimdi Modelin açıklanabilirliği için Adj R2'ye bakılır : 0.2257, bağımsız değişkenin bağımlı değişkeni açıklaması %22'dir diyebiliriz. "Kills" değeri "ACS"un %22sini açıklıyor, farklı değişkenler ekleyerek daha fazlasını açıklayabiliriz. (Asist sayısı gibi) veya verideki aykırı,Na değerleri ayıklayarak R2'nin yükselmesine katkı sağlayabiliriz.
#ADJ R2 : 0 ile 1 arası değer alır ve 1e ne kadar yakınsa o kadar anlamlıdır.
#Verideki “Na” (kayıp gözlem) var mı diye kontrol ediyoruz.
sum(is.na(valorant)) #Verimizde kaç adet"Na" (missing value) olduğunu gösterir.
## [1] 26
#Verideki residuals (hata) değerlerini yorumlama :
summary(modelvalo)
##
## Call:
## lm(formula = ACS ~ Kills, data = valorant)
##
## Residuals:
## Min 1Q Median 3Q Max
## -325.32 -33.86 -7.37 29.75 271.77
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 152.4254 10.2377 14.89 < 2e-16 ***
## Kills 4.4414 0.5294 8.39 4.42e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 63.55 on 237 degrees of freedom
## (13 observations deleted due to missingness)
## Multiple R-squared: 0.229, Adjusted R-squared: 0.2257
## F-statistic: 70.38 on 1 and 237 DF, p-value: 4.423e-15
# Residuals:
# Min 1Q Median 3Q Max
# -325.32 -33.86 -7.37 29.75 271.77
# Aralığım biraz dengesiz görünüyor, outlier'lardan şüphelenebilirim.
#Outlier'lar (Aykırı değerler) :
artik <- as.numeric(modelvalo$residuals) #Artıkları numeric hale getirip grafikte gözlemliyorum :
plot(artik) #Modeldeki artıkların grafiğini çizerek outlier'ları daha rahat görebiliriz
#Grafiği incelediğimizde az da olsa outlier'ları görüyoruz.
plot(modelvalo)
#Aykırılar göze çarpıyor.
#2. grafik olan Q-Q plottan beklentim çizgi üzerinde olması, başta ve sonda biraz sıkıntılar var ama aykırı temizliği yapınca düzeleceğini düşünüyorum.
#4. grafikteki cook-distance'lar model üzerinden aykırıları görmemize yardımcı oluyor.
#Datayla daha rahat ilgilenmek için Na’lardan (Eksik veriler)den kurtuluyoruz :
valo <- na.omit(valorant[c("ACS","Kills")]) #Yaparak Valorant verisindeki ACS ve Kills değişkenlerinin Na'larını yok ettik.
sum(is.na(valo)) #Veride Na kalmadı : 0
## [1] 0
#Aykırı değerleri veriden atmak için MAHALANOBİS uzaklığını hesaplıyoruz :
valo.centre <- colMeans(valo) #Verinin center'ini aldık
valo.cov <- cov(valo) #Verinin kovaryansını aldık, bunları aşağıdaki formül için aldık lazım.
distance <- mahalanobis(valo, center = valo.centre, cov = valo.cov) #Formülü yazıp yerlerine koyduk
sort(distance) #Uzaklıkları görebiliyoruz son 7 gözlem aşırılaşmış
## 67 158 239 32 38 10
## 0.001475379 0.001843523 0.006707327 0.009258697 0.009258697 0.010702540
## 174 42 63 113 226 40
## 0.014884423 0.018798641 0.024437702 0.027782577 0.031043902 0.031794016
## 210 144 29 227 4 90
## 0.032871308 0.036955073 0.038058068 0.041044162 0.051370138 0.051370138
## 5 22 197 123 240 81
## 0.052728362 0.052728362 0.052728362 0.053435744 0.053435744 0.063778637
## 250 8 55 175 189 150
## 0.064841995 0.087782719 0.089151854 0.097199919 0.097456853 0.097841384
## 3 138 112 205 64 166
## 0.114942593 0.115970207 0.118768779 0.122370799 0.125309169 0.125309169
## 180 56 120 16 156 39
## 0.130236950 0.130511434 0.140723197 0.141770496 0.146060748 0.152446435
## 145 101 65 248 146 12
## 0.160541797 0.169371225 0.174122781 0.185555611 0.192900480 0.197793798
## 28 48 24 97 54 185
## 0.202327982 0.202327982 0.204129347 0.205209586 0.207084835 0.211628637
## 126 129 34 213 116 87
## 0.216467094 0.219697425 0.222671301 0.227596542 0.228932501 0.236901348
## 15 131 242 88 93 117
## 0.238353152 0.241278019 0.244762401 0.246237377 0.255471283 0.261868548
## 79 94 11 215 160 19
## 0.265713637 0.271329678 0.276272776 0.277416461 0.288059387 0.294922961
## 73 179 161 69 171 49
## 0.295139184 0.303324559 0.313580484 0.319183807 0.323343872 0.337892758
## 132 119 60 98 106 110
## 0.338808187 0.361108989 0.378248106 0.379900386 0.397614278 0.397614278
## 243 31 100 188 121 125
## 0.403520270 0.406655956 0.417000831 0.422683841 0.423801399 0.430978745
## 71 44 176 135 36 163
## 0.433806847 0.444529967 0.444529967 0.462079683 0.467725740 0.467725740
## 35 219 211 77 235 225
## 0.471308699 0.473666541 0.488776947 0.499405750 0.500375643 0.507920318
## 155 217 86 124 195 230
## 0.525593772 0.536847595 0.540533574 0.542085673 0.556294783 0.557695564
## 14 70 122 118 47 178
## 0.560706762 0.560706762 0.572947207 0.575258364 0.578122787 0.582208157
## 107 33 104 82 85 246
## 0.594105741 0.600229391 0.604891349 0.606076448 0.607167080 0.637507240
## 17 91 141 207 229 84
## 0.638830553 0.678891596 0.678891596 0.682241434 0.691838918 0.710073491
## 157 228 114 181 164 194
## 0.728805417 0.739641015 0.744256639 0.757643919 0.767459050 0.790192384
## 198 99 128 237 115 136
## 0.822942773 0.827068899 0.839403460 0.868339807 0.902897090 0.919773632
## 238 37 153 21 76 147
## 0.929122551 0.931147031 0.931147031 0.945910586 0.959296078 0.984674720
## 111 249 50 223 199 58
## 1.036948736 1.071293613 1.078904642 1.081622716 1.105386535 1.107914030
## 187 148 183 83 170 221
## 1.108376750 1.151027431 1.151027431 1.218694514 1.229998637 1.245487770
## 102 159 61 30 140 137
## 1.256468693 1.256468693 1.266277658 1.267057439 1.270985416 1.283436101
## 172 41 108 222 7 139
## 1.283436101 1.284025074 1.310900862 1.317509622 1.318070943 1.417501641
## 212 127 203 92 154 78
## 1.425733436 1.433277459 1.446822904 1.494119470 1.498598291 1.509062627
## 202 168 74 247 218 80
## 1.556038590 1.590335015 1.613368190 1.645838526 1.677821784 1.701576270
## 241 68 177 200 220 169
## 1.734271319 1.738440882 1.756804095 1.759346867 1.771525765 1.777403978
## 173 167 57 143 53 109
## 1.782363807 1.796741968 1.860253323 1.903353196 1.989922809 2.027654250
## 233 130 182 244 45 72
## 2.027654250 2.032975623 2.080050975 2.114885722 2.116062597 2.204494831
## 251 191 18 66 224 52
## 2.241454960 2.255124042 2.318894919 2.324578210 2.375001221 2.464734943
## 25 165 103 186 62 204
## 2.571696212 2.574932077 2.654794234 2.680114199 2.704877752 2.860843176
## 201 236 43 190 214 26
## 2.905688335 2.937679847 2.941810006 2.990147880 3.084840916 3.152930755
## 231 209 13 193 75 196
## 3.228063421 3.310580628 3.313150401 3.360265321 3.416637077 3.467359690
## 152 89 142 59 2 206
## 3.777858699 4.045813484 4.243298578 4.482212901 4.508689318 4.637530719
## 208 27 20 151 133 162
## 4.984597308 5.668078119 5.670372796 6.155290062 17.126253008 18.651655224
## 134 6 9 232 105
## 20.472515538 20.551667008 27.825033447 49.582776892 71.478684942
cutoff <- qchisq(p=0.95, df=2) #Cutoff noktası belirliyorum.
index <- which(distance > cutoff) #Distance değerim belirlediğim cutoff noktasından büyükse diyerek bi değere atıyorum.
#Bulduğumuz bu index değerlerini Verimizden çıkarıyoruz ve outlier'lardan kurtulmuş oluyoruz.
valonew <- valo[-index,] #Verimizin AYKIRI DEĞERSİZ hali
nrow(valonew);nrow(valo) #Veride 8 eksilme var yani 8 adet aykırı gözlem temizlenmiş.
## [1] 231
## [1] 239
modelvalo2 <- lm(ACS ~ Kills, data = valonew)
summary(modelvalo2)
##
## Call:
## lm(formula = ACS ~ Kills, data = valonew)
##
## Residuals:
## Min 1Q Median 3Q Max
## -94.737 -26.148 -6.805 19.738 126.229
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 57.1013 8.4608 6.749 1.21e-10 ***
## Kills 10.2458 0.4824 21.241 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 38.29 on 229 degrees of freedom
## Multiple R-squared: 0.6633, Adjusted R-squared: 0.6619
## F-statistic: 451.2 on 1 and 229 DF, p-value: < 2.2e-16
#Modelimiz hala anlamlı (p-value < 2.2e-16)
#Adj R2 değeri çok daha da iyi çıktı : 0.66 yani Kills değişkenimiz ACS değişkenini %66 açıklıyor.
#Model1 0.22 iken şu anki modelimiz 0.66'dir.
plot(modelvalo2) #Grafiklere bakıldığınıda bir kere daha aykırı kontrolü yapılması gerektiğini görüyoruz.
#Tekrar aykırı kontrolü yapıyoruz hızlıca :
valo.centre2 <- colMeans(valonew)
valo.cov2 <- cov(valonew)
distance2 <- mahalanobis(valo, center = valo.centre2, cov = valo.cov2)
sort(distance2)
## 10 123 240 63 227 32
## 2.434266e-03 5.347794e-02 5.347794e-02 5.767554e-02 6.579257e-02 6.603213e-02
## 38 239 250 67 16 56
## 6.603213e-02 7.154616e-02 9.648049e-02 1.073018e-01 1.115061e-01 1.144336e-01
## 210 175 158 29 138 205
## 1.231678e-01 1.326806e-01 1.333993e-01 1.420447e-01 1.551319e-01 1.825180e-01
## 185 64 166 112 81 144
## 1.907947e-01 2.132386e-01 2.132386e-01 2.174809e-01 2.312516e-01 2.383470e-01
## 174 180 40 42 120 160
## 2.445706e-01 2.494390e-01 2.651178e-01 2.678940e-01 2.687740e-01 2.765501e-01
## 93 161 65 39 215 15
## 2.831126e-01 2.890520e-01 2.951419e-01 2.964755e-01 3.041255e-01 3.130217e-01
## 113 97 248 156 189 129
## 3.155488e-01 3.173159e-01 3.232717e-01 3.382792e-01 3.423777e-01 3.446807e-01
## 179 243 24 213 100 125
## 3.528621e-01 3.826683e-01 3.874443e-01 3.989839e-01 4.005351e-01 4.197718e-01
## 226 5 22 197 116 119
## 4.269993e-01 4.366032e-01 4.366032e-01 4.366032e-01 4.604593e-01 4.667745e-01
## 36 163 211 12 150 121
## 5.118155e-01 5.118155e-01 5.153669e-01 5.183444e-01 5.213536e-01 5.269112e-01
## 217 146 106 110 47 19
## 5.389091e-01 5.464926e-01 5.636468e-01 5.636468e-01 5.709502e-01 5.976285e-01
## 4 90 14 70 44 176
## 6.059484e-01 6.059484e-01 6.229841e-01 6.229841e-01 6.399890e-01 6.399890e-01
## 77 49 28 48 229 3
## 6.603198e-01 6.619937e-01 6.725536e-01 6.725536e-01 6.936611e-01 6.957635e-01
## 94 35 126 84 242 131
## 6.970283e-01 7.019135e-01 7.160895e-01 7.166710e-01 7.330399e-01 7.363151e-01
## 157 87 8 79 246 34
## 7.410509e-01 7.477837e-01 7.496538e-01 7.544242e-01 7.574691e-01 7.813810e-01
## 55 88 91 141 117 11
## 7.818703e-01 8.072713e-01 8.329313e-01 8.329313e-01 8.549171e-01 8.666479e-01
## 178 104 122 37 153 60
## 9.400272e-01 9.419930e-01 9.548728e-01 9.568066e-01 9.568066e-01 1.000207e+00
## 195 82 155 230 124 136
## 1.008193e+00 1.012270e+00 1.012325e+00 1.018368e+00 1.019484e+00 1.022118e+00
## 98 228 71 188 223 128
## 1.060295e+00 1.069731e+00 1.069940e+00 1.083650e+00 1.125109e+00 1.140202e+00
## 249 86 115 17 187 181
## 1.220216e+00 1.230457e+00 1.230695e+00 1.235800e+00 1.236120e+00 1.239787e+00
## 132 114 170 99 73 102
## 1.296103e+00 1.307193e+00 1.322796e+00 1.323670e+00 1.355155e+00 1.360539e+00
## 159 145 171 137 172 148
## 1.360539e+00 1.376745e+00 1.386553e+00 1.399652e+00 1.399652e+00 1.414150e+00
## 183 58 69 101 237 85
## 1.414150e+00 1.418903e+00 1.419442e+00 1.429511e+00 1.431580e+00 1.434246e+00
## 108 207 54 212 41 139
## 1.440134e+00 1.600618e+00 1.611974e+00 1.615764e+00 1.664300e+00 1.674454e+00
## 7 83 31 76 218 225
## 1.687337e+00 1.688636e+00 1.737576e+00 1.809008e+00 1.812879e+00 1.820075e+00
## 235 194 21 247 111 118
## 1.882439e+00 1.906256e+00 1.943688e+00 1.975860e+00 2.005174e+00 2.088690e+00
## 143 107 109 233 57 154
## 2.132259e+00 2.159870e+00 2.180452e+00 2.180452e+00 2.216326e+00 2.282582e+00
## 199 164 135 45 168 61
## 2.320253e+00 2.366846e+00 2.456858e+00 2.459442e+00 2.496976e+00 2.559219e+00
## 220 224 173 238 127 182
## 2.606182e+00 2.626492e+00 2.638936e+00 2.650438e+00 2.670446e+00 2.754630e+00
## 72 147 244 191 78 66
## 2.760342e+00 2.780484e+00 2.782378e+00 2.802159e+00 2.838208e+00 2.910353e+00
## 165 62 140 30 68 130
## 2.946334e+00 2.949187e+00 3.013174e+00 3.061378e+00 3.120328e+00 3.140334e+00
## 204 241 198 25 43 103
## 3.142696e+00 3.155269e+00 3.204920e+00 3.222209e+00 3.247671e+00 3.314694e+00
## 219 26 231 74 209 13
## 3.352816e+00 3.534080e+00 3.539814e+00 3.579524e+00 3.633155e+00 3.762586e+00
## 52 196 221 53 33 18
## 3.845783e+00 3.887644e+00 3.941278e+00 3.967745e+00 4.040298e+00 4.136033e+00
## 167 201 202 89 222 92
## 4.192597e+00 4.624274e+00 4.968728e+00 5.004762e+00 5.084318e+00 5.209388e+00
## 193 214 206 59 200 152
## 5.228142e+00 5.553295e+00 5.709458e+00 5.901958e+00 6.655171e+00 6.679618e+00
## 50 190 142 27 20 203
## 6.680964e+00 6.972503e+00 6.995213e+00 7.025914e+00 7.124581e+00 7.265900e+00
## 151 186 177 169 75 251
## 7.651440e+00 8.227596e+00 8.272057e+00 8.789095e+00 8.860766e+00 9.715167e+00
## 236 80 2 208 133 134
## 9.886709e+00 9.986189e+00 1.084176e+01 1.109993e+01 2.592817e+01 3.254512e+01
## 162 6 9 232 105
## 9.808392e+01 1.120145e+02 1.485181e+02 2.656996e+02 3.808450e+02
cutoff2 <- qchisq(p=0.95, df=2)
index2 <- which(distance2 > cutoff2)
valonew2 <- valonew[-index2,]
modelvalo3 <- lm(ACS ~ Kills, data = valonew2)
summary(modelvalo3)
##
## Call:
## lm(formula = ACS ~ Kills, data = valonew2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -95.758 -26.354 -5.553 18.845 126.217
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 54.7198 8.7918 6.224 2.69e-09 ***
## Kills 10.3718 0.5041 20.573 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 38.02 on 205 degrees of freedom
## Multiple R-squared: 0.6737, Adjusted R-squared: 0.6721
## F-statistic: 423.3 on 1 and 205 DF, p-value: < 2.2e-16
plot(modelvalo3)
#Tekrar aykırı kontrolü yaparak aykırılardan arındırdığımızda AdjR2 %1 artıyor ve grafikler daha düzgün hale geliyor.
#ama ben bu model3'ü almadan model2 ile devam edeceğim.
#Artıklar normal dağılıyor mu :
shapiro.test(modelvalo2$residuals)
##
## Shapiro-Wilk normality test
##
## data: modelvalo2$residuals
## W = 0.94585, p-value = 1.42e-07
#Shapiro test sonucu 0,05'ten küçük olduğu için NORMAL DAĞILMIYOR. H0 red.
#Dönüşümler x'e de y'ye de uygulanabilir fakat y'ye uygularsak işlemden sonra ters dönüşüm uygulanmak zorundadır!!!
par(mfrow=c(2,2))
modellog <- lm(log(ACS)~Kills , data = valonew) #Sadece y değişkenine logaritma uyguladık
summary(modellog)
##
## Call:
## lm(formula = log(ACS) ~ Kills, data = valonew)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.43510 -0.10380 -0.02084 0.10056 0.52100
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.597384 0.038513 119.37 <2e-16 ***
## Kills 0.047261 0.002196 21.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1743 on 229 degrees of freedom
## Multiple R-squared: 0.6692, Adjusted R-squared: 0.6678
## F-statistic: 463.3 on 1 and 229 DF, p-value: < 2.2e-16
modelkarekok <- lm(ACS~ sqrt(Kills), data = valonew) # X değişkenine karekok dönüşüm uyguladık.
summary(modelkarekok)
##
## Call:
## lm(formula = ACS ~ sqrt(Kills), data = valonew)
##
## Residuals:
## Min 1Q Median 3Q Max
## -85.812 -27.087 -5.411 16.984 122.858
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -107.577 15.810 -6.804 8.78e-11 ***
## sqrt(Kills) 83.213 3.864 21.537 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 37.94 on 229 degrees of freedom
## Multiple R-squared: 0.6695, Adjusted R-squared: 0.668
## F-statistic: 463.9 on 1 and 229 DF, p-value: < 2.2e-16
predict(modellog, data.frame(Kills = c(42))) #Temp değeri 42 iken Ozone ne çıkar ona bakıyoruz. 6.67 çıkıyor buna ters dönüşüm yapmamız gerekiyor. (çünkü y üzerinde log dönüşümü yaptık)
## 1
## 6.582334
tersdonusum <- predict(modellog, data.frame(Kills = c(42)))
exp(tersdonusum) #Ters dönüşüm koduyla beraber ters dönüşüm yapıp 722 bulduk
## 1
## 722.2234
#Yani Kills değeri 42 iken ACS değeri 722 olarak tahmin edilir.
predict(modellog, data.frame(Kills = c(67,56,45,78))) #Temp değeri 67yken 56yken 45ken ve 78ken verdiğini Ozone değerlerini verir bize.
## 1 2 3 4
## 7.763853 7.243985 6.724117 8.283721
mse1 <- sum(modelvalo$residuals**2/length(modelvalo$residuals))
mse2 <- sum(modelvalo2$residuals**2/length(modelvalo2$residuals))
mse1;mse2 #2. modelin mse değeri daha iyidir.
## [1] 4004.464
## [1] 1453.587
#1. model 4004 çıktı 2. model 1453, küçük olması daha iyidir ki burdaki fark açık ara çok fazla
#AIC ve BIC değeri daha düşük olan model daha iyidir.
AIC(modelvalo, k=3) #k değeri "parametre sayısı + 1"dir.
## [1] 2669.797
BIC(modelvalo)
## [1] 2677.226
#AIC 2669 BIC 2677 çıktı
AIC(modelvalo2, k=3)
## [1] 2346.643
BIC(modelvalo2)
## [1] 2353.97
#AIC 2346 BIC 2353 geldi "model2 daha iyi"
modelk <- lm(ACS~ Kills-1, data = valorant) #Bağımsız değişkenden 1 çıkararak modelden B0'ı çıkarıyoz.
#Gerekli Kütüphaneleri yüklüyoruz.
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(broom)
library(ggpubr)
library(ISLR)
library(PerformanceAnalytics)
## Zorunlu paket yükleniyor: xts
## Zorunlu paket yükleniyor: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
## ######################### Warning from 'xts' package ##########################
## # #
## # The dplyr lag() function breaks how base R's lag() function is supposed to #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
## # source() into this session won't work correctly. #
## # #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## # #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## ###############################################################################
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
library(readxl)
valorant <- read.csv("Regresyon Analizi/valorantdata.csv")
View(valorant)
#Veri setimi işlem yapacağım değişkenler kalacak şekilde daraltıyorum : #Verideki Na’ları yok etmek yerine dolduruyorum :
valodata <- valorant[c('ACS','Kills')] #Verimizin sadece 2 değişkenini alarak yeni veri seti elde ettik.
names(valodata) #Verimizden 2 değişken alırken isimleri karıştırmamak için böyle bakabiliriz.
## [1] "ACS" "Kills"
#Korelasyon'a bakabilmek ve ilereyen işlemlerde sıkıntsı çıkarmasını engellemek için verideki Na'lardan kurtulmam lazım.
#Bunun için Na'ları doldurma yöntemiyle ilerleyeceğim
library(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
md.pattern(valodata) #Kayıp gözlemleri bu kod ile bulabiliyoruz, grafikli kısımda pembe olanlar kayıp gözlem, solunda yazan kaç adet olduğu, bulunduğu sütun ise hangi değişkende bulunduğudur. Böylelikle rahatça yorumlayabiliriz.
## ACS Kills
## 239 1 1 0
## 8 1 0 1
## 5 0 1 1
## 5 8 13
#Peki bu NA'ları nasıl doldururuz?
imputedd<-mice(valodata,m=5) #m impute sayısını vermektedir pmm ile doldurma yapıyoruz.
##
## iter imp variable
## 1 1 ACS Kills
## 1 2 ACS Kills
## 1 3 ACS Kills
## 1 4 ACS Kills
## 1 5 ACS Kills
## 2 1 ACS Kills
## 2 2 ACS Kills
## 2 3 ACS Kills
## 2 4 ACS Kills
## 2 5 ACS Kills
## 3 1 ACS Kills
## 3 2 ACS Kills
## 3 3 ACS Kills
## 3 4 ACS Kills
## 3 5 ACS Kills
## 4 1 ACS Kills
## 4 2 ACS Kills
## 4 3 ACS Kills
## 4 4 ACS Kills
## 4 5 ACS Kills
## 5 1 ACS Kills
## 5 2 ACS Kills
## 5 3 ACS Kills
## 5 4 ACS Kills
## 5 5 ACS Kills
names(imputedd)
## [1] "data" "imp" "m" "where"
## [5] "blocks" "call" "nmis" "method"
## [9] "predictorMatrix" "visitSequence" "formulas" "post"
## [13] "blots" "ignore" "seed" "iteration"
## [17] "lastSeedValue" "chainMean" "chainVar" "loggedEvents"
## [21] "version" "date"
imputedd$imp #Bilmem kaçıncı değere önerdiği 5 değeri gösteriyor
## $ACS
## 1 2 3 4 5
## 46 108 124 108 104 105
## 95 104 124 173 108 116
## 192 152 272 253 141 195
## 216 108 108 106 124 104
## 245 200 252 199 283 243
##
## $Kills
## 1 2 3 4 5
## 1 27 22 19 26 18
## 23 16 13 16 15 13
## 51 25 21 22 27 18
## 96 15 16 17 17 14
## 149 18 17 18 16 13
## 184 11 10 12 12 13
## 234 21 23 19 16 25
## 252 23 27 22 14 19
#Burda verimizdeki Na'ların yerine doldurabileceğin 5 adet veri üret dedik, doldurmayı pmm yöntemi ile kendisi yapıyor.
valodata <- complete(imputedd,3)
sum(is.na(valodata)) #Na'lardan kurtulup kurtulmadığımı test ediyorum. 0 diyor veride Na kalmamış. Hepsini uygunca doldurduk.
## [1] 0
#Şimdi verimizi parçalayacağız (TRAIN, TEST olmak üzere) :
#Set seed belirleriz.
set.seed(145)
#Veri setinin %80ini seçiyorum:
sampleIndex <- sample(1:nrow(valodata),size=0.8*nrow(valodata))
#Eğitim (train) setini oluşturalım, seçtiğim %80.
trainset <- valodata[sampleIndex,]
#Test setini oluşturalım, seçtiğim %80'i çıkararak kalan %20'yi test'e atıyorum.
testset <- valodata[-sampleIndex,]
#Korelasyonlarına bakalım
nrow(testset);nrow(trainset) #Test setinde 51 Train setinde 201 eleman var.
## [1] 51
## [1] 201
cor(trainset) #Korelasyonlarına bakmak istediğimde :
## ACS Kills
## ACS 1.000000 0.460372
## Kills 0.460372 1.000000
#ACS değişkeniyle Kills değişkeni arasındaki korelasyon katsayısı 0,46 yani ilişki var ve kuvvetli sayılır.
#Tekrardan Na’lı halleryile işlemlerime devam ediyorum (ileride Na’ları silmek yerine dolduracağım)
par(mfrow=c(2,2))
hist(trainset$ACS) #Trainset verisinin içindeki "ACS" değerinin histogram grafiğine bakıyoruz
hist(trainset$Kills) #Trainset verisinin içindeki "Kills" değerinin histogram grafiğine bakıyoruz
#Histogram grafikleri bize değişkenin hangi değerleri ne kadar aldığı, yoğunluk hangi değerde v.b bilgileri sunar.
#Kills değişkeninin çoğunluk gösterdiği değer 10-15 arası
#ACS değişkeninin çoğunluk gösterdiği değer 150-200 arası.
#Ama verim aykırılardan arınmadığı için histogram verilerine çok güvenmemeliyim, aykırılar arındıktan sonra daha net bilgiler görebilirim.
fig <- ggplot(data=trainset,aes(x=Kills, y=ACS)) +
geom_point(size=2) +
ylab('ACS') +
xlab('Kills')
#Bir saçılım grafiği elde ediyor.
#Grafiği yorumlayacak olursak, Kills değişkeni arttıkça AVC değişkenim doğru orantılı bir şekilde artıyor diyebilirim.
fig
#Aykırı kontrolüne başlamak için MAHALANOBİS uzaklığını hesaplıyoruz :
dist <- mahalanobis(trainset,center=colMeans(trainset),cov=cov(trainset)) #Mahalanobis distance hesapladık.
cutoff <- qchisq(p=0.95,df=2) #cutoff noktası belirledik.
ids <- which(dist > cutoff) #hesapladığımız distance değeri cutoff noktamızdan büyükse diyerek "ids" değerine atadık.
trainsetrem <- trainset[-ids,] #"ids" değerini trainset'ten çıkararak datayı aykırı gözlemlerden temizledik.
nrow(trainset);nrow(trainsetrem) #201 gözlemden 194 kalmış yani 7 adet aykırı gözlemi çıkarmışım
## [1] 201
## [1] 195
fig2 <- ggplot(data=trainsetrem,
aes(x=Kills,y=ACS))+
geom_point(size=2)+ylab('ACS')+
xlab('Kills')
fig2 #Grafik incelendiğinde aykırılara rastlanmamakta ve değişkenler arasındaki ilişki pozitif lineer yönde diyebiliriz.
#Şimdi bu yeni temiz train setimle model oluşturup önceki train setiyle oluşturduğum modeli karşılaştıracağım :
model1 <- lm(ACS~Kills,data=trainset)
model2 <- lm(ACS~Kills,data=trainsetrem)
summary(model1) #P-Value < 0, model anlamlıdır fakat AdjR2 : 0.20 olduğundan modelin açıklayıcılığı çok zayıftır.
##
## Call:
## lm(formula = ACS ~ Kills, data = trainset)
##
## Residuals:
## Min 1Q Median 3Q Max
## -318.58 -32.93 -8.29 35.89 246.48
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 155.992 11.283 13.825 < 2e-16 ***
## Kills 4.294 0.587 7.316 6.15e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 63.91 on 199 degrees of freedom
## Multiple R-squared: 0.2119, Adjusted R-squared: 0.208
## F-statistic: 53.52 on 1 and 199 DF, p-value: 6.147e-12
summary(model2) #P-Value <0, model anlamlıdır fakat AdjR2 : 0.65 modelin açıklayıcılığı kuvvetlidir diyebiliriz.
##
## Call:
## lm(formula = ACS ~ Kills, data = trainsetrem)
##
## Residuals:
## Min 1Q Median 3Q Max
## -101.40 -27.53 -6.29 19.31 123.16
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 51.6529 9.6798 5.336 2.65e-07 ***
## Kills 10.6943 0.5536 19.317 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 39.71 on 193 degrees of freedom
## Multiple R-squared: 0.6591, Adjusted R-squared: 0.6573
## F-statistic: 373.1 on 1 and 193 DF, p-value: < 2.2e-16
AIC(model1,k=3);AIC(model2,k=3) #Model1 AIC değeri 2245 iken Model2 AIC değeri 1996
## [1] 2248.708
## [1] 1996.173
BIC(model1);BIC(model2) #Model1 BIC değeri 2252 iken Model2 BIC değeri 2003
## [1] 2255.618
## [1] 2002.992
#AIC BIC değerinin düşük olması daha iyidir, her türlü kontrolde model2 açık ara daha açıklayıcıdır ve tercih edilmelidir.
#Test verisini kullanarak tahminleri değerlendirme :
#Test verisi üzerinden tahminleri değerlendirme
model1Pred <- predict(model1,testset)
model2Pred <- predict(model2,testset)
model1PredData <- data.frame("actuals"=testset$ACS,
"predictions"=model1Pred)
model2PredData <- data.frame("actuals"=testset$ACS,
"predictions"=model2Pred)
View(model1PredData) #Test setinde var olan değer ve birinci modelimizin tahmin ettiği değeri gösterir.
View(model2PredData) #Test setinde var olan değer ve ikinci modelimizin tahmin ettiği değeri gösterir.
#Model Hatasını hesaplama :
#Test setinin kendi değerinden tahmin edilen değer çıkarılarak bulunan sonuca model hatası denir
model1Hata <- model1PredData$actuals-model1PredData$predictions
model2Hata <- model2PredData$actuals-model2PredData$predictions
library(caret)
## Zorunlu paket yükleniyor: lattice
RMSE (model1PredData$predictions,model1PredData$actuals) #Model1'in RMSE'si
## [1] 60.24525
RMSE (model2PredData$predictions,model2PredData$actuals) #Model2'nin RMSE'si
## [1] 70.02866
MAE (model1PredData$predictions,model1PredData$actuals) #Model1'in MAE'si
## [1] 39.9513
MAE (model2PredData$predictions,model2PredData$actuals) #Model2'nin MAE'si
## [1] 36.68701
#Genel olarak 2.model daha iyi gözüksede model hata değerlerinde arada kaldığım için cross validation yapıyorum : #Cross validation eğitimi iyileştirmek için kullanılır.
library(caret)
train.control <- trainControl(method='cv', number= 10, verboseIter = TRUE)
model1CV <- train(ACS~ Kills,data=trainset,method='lm',trControl=train.control)
## + Fold01: intercept=TRUE
## - Fold01: intercept=TRUE
## + Fold02: intercept=TRUE
## - Fold02: intercept=TRUE
## + Fold03: intercept=TRUE
## - Fold03: intercept=TRUE
## + Fold04: intercept=TRUE
## - Fold04: intercept=TRUE
## + Fold05: intercept=TRUE
## - Fold05: intercept=TRUE
## + Fold06: intercept=TRUE
## - Fold06: intercept=TRUE
## + Fold07: intercept=TRUE
## - Fold07: intercept=TRUE
## + Fold08: intercept=TRUE
## - Fold08: intercept=TRUE
## + Fold09: intercept=TRUE
## - Fold09: intercept=TRUE
## + Fold10: intercept=TRUE
## - Fold10: intercept=TRUE
## Aggregating results
## Fitting final model on full training set
model2CV <- train(ACS~ Kills,data=trainsetrem,method='lm',trControl=train.control)
## + Fold01: intercept=TRUE
## - Fold01: intercept=TRUE
## + Fold02: intercept=TRUE
## - Fold02: intercept=TRUE
## + Fold03: intercept=TRUE
## - Fold03: intercept=TRUE
## + Fold04: intercept=TRUE
## - Fold04: intercept=TRUE
## + Fold05: intercept=TRUE
## - Fold05: intercept=TRUE
## + Fold06: intercept=TRUE
## - Fold06: intercept=TRUE
## + Fold07: intercept=TRUE
## - Fold07: intercept=TRUE
## + Fold08: intercept=TRUE
## - Fold08: intercept=TRUE
## + Fold09: intercept=TRUE
## - Fold09: intercept=TRUE
## + Fold10: intercept=TRUE
## - Fold10: intercept=TRUE
## Aggregating results
## Fitting final model on full training set
model1CV;model2CV
## Linear Regression
##
## 201 samples
## 1 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 180, 180, 181, 181, 181, 182, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 64.67436 0.4557913 46.37703
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
## Linear Regression
##
## 195 samples
## 1 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 176, 175, 175, 176, 176, 176, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 39.36414 0.6715195 31.08275
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
#RMSE VE MAE değeri olarak model2 düşüktür, Model1 R2 : 0,44 iken Model2 R2 : 0,67
#Model2 daha iyidir ve tercih edilmelidir.
#ÇOKLU DOĞRUSAL REGRESYONDA en önemli nokta X’lerin birbirleriyle bağımsızken sadece Y ile bağımlı olması beklenir. #Bunu öğrenmenin bir kaç yolu vardır fakat en bilineni ve ilk yol olarak verinin korelasyonuna bakılır (cor).
library(readxl)
valorant <- read.csv("Regresyon Analizi/valorantdata.csv")
View(valorant)
#Verimde kullanacağım değişkenleri seçiyorum
valorantt <- valorant[c("ACS","Elo.Gain","Econ","First.Bloods","Kills","Deaths","Assists")]
#Verimin içinden çalışmak istediğim değişkenleri seçiyorum.
#Korelasyon kontrolü
#Xlerin birbirleri arasındaki ilişki hakkında fikir sahibi olmak için na.omit ile korelasyonlarına bakıyorum :
cor(na.omit(valorantt))
## ACS Elo.Gain Econ First.Bloods Kills
## ACS 1.0000000 0.71350601 0.8466224 0.46999597 0.47022524
## Elo.Gain 0.7135060 1.00000000 0.6917888 0.32610039 0.31379764
## Econ 0.8466224 0.69178884 1.0000000 0.30996816 0.40843655
## First.Bloods 0.4699960 0.32610039 0.3099682 1.00000000 0.22716579
## Kills 0.4702252 0.31379764 0.4084366 0.22716579 1.00000000
## Deaths -0.3182714 -0.44976293 -0.4742013 0.12789451 0.02493393
## Assists -0.1175451 -0.04731852 -0.1698583 -0.01720468 -0.16594310
## Deaths Assists
## ACS -0.31827138 -0.11754514
## Elo.Gain -0.44976293 -0.04731852
## Econ -0.47420126 -0.16985826
## First.Bloods 0.12789451 -0.01720468
## Kills 0.02493393 -0.16594310
## Deaths 1.00000000 0.11880231
## Assists 0.11880231 1.00000000
# "Enemy.Losses" ve "Deaths" değişkenleri hariç x'lerin birbirleriyle ilişkisi yok denebilir.
#Aralarındaki korelasyonun grafiğini çizelim
pairs(na.omit(valorantt), pch=10) #pairs koduyla aralarındaki ilişkiyi grafikte görüyoruz
#pch= komutu bize ne uzaklıktan bakacağımızın kararını sunuyor.
chart.Correlation(na.omit(valorantt),histogram = TRUE, pch=10)
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
## Warning in par(usr): argument 1 does not name a graphical parameter
#Bu grafik ise hem ilişkileri hakkında hemde korelasyonları hakkında tablo sunuyor bize, en iyi seçenek olarak nitelendirilebilir.
#Grafiklerdede net bir şekilde görünüyorki "Econ" ve "Elo.Gain" arasında kuvvetli bir ilişki var.
#Bu sorun bize çoklu bağlantı problemini doğurabilir bunun için daha sonrasında "vif" komutunu kullanarak önlem alacağız!!
#KAYIP GÖZLEMLER(NA) ve onları doldurma
library(mice)
md.pattern(valorantt) #Kayıp gözlemleri bu kod ile bulabiliyoruz, grafikli kısımda pembe olanlar kayıp gözlem, solunda yazan kaç adet olduğu, bulunduğu sütun ise hangi değişkende bulunduğudur. Böylelikle rahatça yorumlayabiliriz.
## Elo.Gain First.Bloods Deaths Assists ACS Econ Kills
## 227 1 1 1 1 1 1 1 0
## 7 1 1 1 1 1 1 0 1
## 7 1 1 1 1 1 0 1 1
## 1 1 1 1 1 1 0 0 2
## 5 1 1 1 1 0 1 1 1
## 3 1 1 1 0 1 1 1 1
## 2 1 1 0 1 1 1 1 1
## 0 0 2 3 5 8 8 26
#Peki bu NA'ları nasıl doldururuz?
imputed<-mice(valorantt,m=5) #m impute sayısını vermektedir pmm ile doldurma yapıyoruz.
##
## iter imp variable
## 1 1 ACS Econ Kills Deaths Assists
## 1 2 ACS Econ Kills Deaths Assists
## 1 3 ACS Econ Kills Deaths Assists
## 1 4 ACS Econ Kills Deaths Assists
## 1 5 ACS Econ Kills Deaths Assists
## 2 1 ACS Econ Kills Deaths Assists
## 2 2 ACS Econ Kills Deaths Assists
## 2 3 ACS Econ Kills Deaths Assists
## 2 4 ACS Econ Kills Deaths Assists
## 2 5 ACS Econ Kills Deaths Assists
## 3 1 ACS Econ Kills Deaths Assists
## 3 2 ACS Econ Kills Deaths Assists
## 3 3 ACS Econ Kills Deaths Assists
## 3 4 ACS Econ Kills Deaths Assists
## 3 5 ACS Econ Kills Deaths Assists
## 4 1 ACS Econ Kills Deaths Assists
## 4 2 ACS Econ Kills Deaths Assists
## 4 3 ACS Econ Kills Deaths Assists
## 4 4 ACS Econ Kills Deaths Assists
## 4 5 ACS Econ Kills Deaths Assists
## 5 1 ACS Econ Kills Deaths Assists
## 5 2 ACS Econ Kills Deaths Assists
## 5 3 ACS Econ Kills Deaths Assists
## 5 4 ACS Econ Kills Deaths Assists
## 5 5 ACS Econ Kills Deaths Assists
names(imputed)
## [1] "data" "imp" "m" "where"
## [5] "blocks" "call" "nmis" "method"
## [9] "predictorMatrix" "visitSequence" "formulas" "post"
## [13] "blots" "ignore" "seed" "iteration"
## [17] "lastSeedValue" "chainMean" "chainVar" "loggedEvents"
## [21] "version" "date"
imputed$imp #Bilmem kaçıncı değere önerdiği 5 değeri gösteriyor
## $ACS
## 1 2 3 4 5
## 46 200 161 200 224 196
## 95 105 151 151 163 124
## 192 169 143 143 151 124
## 216 133 154 133 172 133
## 245 260 245 243 249 243
##
## $Elo.Gain
## [1] 1 2 3 4 5
## <0 rows> (or 0-length row.names)
##
## $Econ
## 1 2 3 4 5
## 1 66 90 104 103 90
## 21 84 100 104 109 84
## 62 31 21 21 21 40
## 97 90 82 74 86 86
## 116 83 66 65 62 81
## 159 50 61 48 39 39
## 222 90 96 90 103 103
## 248 61 58 54 44 53
##
## $First.Bloods
## [1] 1 2 3 4 5
## <0 rows> (or 0-length row.names)
##
## $Kills
## 1 2 3 4 5
## 1 28 18 21 20 28
## 23 13 13 12 14 13
## 51 20 28 26 27 29
## 96 14 18 12 12 10
## 149 13 10 15 17 16
## 184 9 9 10 12 12
## 234 17 18 14 16 48
## 252 25 30 25 29 29
##
## $Deaths
## 1 2 3 4 5
## 10 18 7 13 18 11
## 71 13 8 14 7 7
##
## $Assists
## 1 2 3 4 5
## 41 4 9 6 11 7
## 102 5 9 9 10 7
## 211 4 10 6 6 2
#Burda verimizdeki Na'ların yerine doldurabileceğin 5 adet veri üret dedik, doldurmayı pmm yöntemi ile kendisi yapıyor.
valoranttimp <- complete(imputed,2) #2. önerisini ile doldur diyorum.
View(valoranttimp) #Na'lı verimizin doldurulmuş hali.
md.pattern(valoranttimp) #Na'larım gitti mi diye kontrol ediyorum ve hepsinin doldurulmuş olduğunu görüyorum.
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## ACS Elo.Gain Econ First.Bloods Kills Deaths Assists
## 252 1 1 1 1 1 1 1 0
## 0 0 0 0 0 0 0 0
set.seed(145) #Randomize olmasın diye set.seed yapıyoruz.
sampleornek <- sample(1:nrow(valoranttimp), size = 0.8*nrow(valoranttimp)) #%80'e 20 olacak şekilde ayırdık
View(sampleornek)
trainsett <- valoranttimp[sampleornek,] #%80i train'e verdik
testsett <- valoranttimp[-sampleornek,] # -sampleornek diyerek %80den kalan %20yi de test'e verdik
#Train test hazır olduğuna göre model oluşturabilirim :
modell1 <- lm(ACS ~ Econ + First.Bloods + Elo.Gain + Kills + Deaths + Assists, data =trainsett)
#Eğer verimdeki tüm bağımsızları kullanıyorsam yerine . (nokta) koyabilirdim fakat 2 bağımsızı başta çıkarttım.
summary(modell1)
##
## Call:
## lm(formula = ACS ~ Econ + First.Bloods + Elo.Gain + Kills + Deaths +
## Assists, data = trainsett)
##
## Residuals:
## Min 1Q Median 3Q Max
## -115.550 -17.820 0.936 18.974 113.142
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.9371 17.2426 0.750 0.453984
## Econ 1.8682 0.1585 11.786 < 2e-16 ***
## First.Bloods 8.4664 1.6545 5.117 7.43e-07 ***
## Elo.Gain 1.8395 0.5169 3.559 0.000468 ***
## Kills 1.1620 0.3490 3.330 0.001040 **
## Deaths 0.5630 0.7423 0.759 0.449068
## Assists 0.8669 0.8450 1.026 0.306213
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 33.63 on 194 degrees of freedom
## Multiple R-squared: 0.7851, Adjusted R-squared: 0.7784
## F-statistic: 118.1 on 6 and 194 DF, p-value: < 2.2e-16
#P-value < 0.05, modelimiz anlamlıdır, AdjR2 0,77 olduğundan modelimizin açıklanabilirliği gayet yüksek ve iyidir diyebiliriz.
#"Econ","First.Bloods","Elo.Gain","Kills" değişkenleri bağımlı değişken üzerinde yüksek etkiye sahipken
#"Deaths" ve "Assists" değişkenlerimiz bağımlı değişkenle ilişkisiz görünüyor ve modele katkı sağlamıyor.
#Etkisiz değişkenleri modelden çıkararak yeni bir model elde ediyoruz
modell2 <- lm(ACS ~ Econ + First.Bloods + Elo.Gain + Kills, data =trainsett)
summary(modell2) #Model açıklanabilirliğinde gözle görülür bi değişiklik olmadı.
##
## Call:
## lm(formula = ACS ~ Econ + First.Bloods + Elo.Gain + Kills, data = trainsett)
##
## Residuals:
## Min 1Q Median 3Q Max
## -117.430 -17.152 1.299 17.985 110.416
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 29.7699 8.8769 3.354 0.000957 ***
## Econ 1.7950 0.1451 12.367 < 2e-16 ***
## First.Bloods 9.0630 1.5501 5.847 2.07e-08 ***
## Elo.Gain 1.7914 0.4966 3.608 0.000392 ***
## Kills 1.1994 0.3361 3.569 0.000451 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 33.62 on 196 degrees of freedom
## Multiple R-squared: 0.783, Adjusted R-squared: 0.7785
## F-statistic: 176.8 on 4 and 196 DF, p-value: < 2.2e-16
#Modellerin AIC BIC karşılaştırması :
AIC(modell1, k=8);AIC(modell2, k=6)
## [1] 2040.491
## [1] 2014.466
BIC(modell1);BIC(modell2)
## [1] 2018.918
## [1] 2010.286
#modell2'nin AIC BIC değerleri modell1'den daha düşüktür.
#modell2 ile yola devam ediyoruz :
plot(modell2) #Modelimin grafikleri bana aykırılar olduğunu gösteriyor.
#2. grafik olan Q-Q plottan beklendim çizgi üzerinde olması, başta ve sonda biraz sıkıntılar olduğundan ilk çözüm olarak aykırı temizliğine başvuracağız.
#4. grafikteki cook-distance'lar model üzerinden aykırıları görmemize yardımcı oluyor.
Değişen varyans kontrolü :
library(lmtest)
#test
#H0 : heteroscedasticity is not present (değişen varyans sorunu yok homojendir)
#H1 : heteroscedasticity is present (değişen varyans sorunu var)
bptest(modell2) #En anlamli buldugum model icin bptest yapiyorum.
##
## studentized Breusch-Pagan test
##
## data: modell2
## BP = 48.955, df = 4, p-value = 5.967e-10
#p-value 0'a çok yakın yani H0 red, Değişen varyans vardır.
#Değişen varyansı Çözmek
#Değişen varyans problemi aykırı değerler yüzünden olabilir, o yüzden önce aykırı değer kontrolü yapacağım :
#Cook distance hesabı ile belli bir noktadan sonraki verileri aykırı sayarız.
dist <- cooks.distance(modell2)
head(dist)
## 2 182 92 125 75 175
## 0.0056676678 0.0017589554 0.0022036632 0.0007651921 0.2688438065 0.0001595063
olcut1 <- mean(dist)*3
olcut2 <- 4/length(dist)
olcut1;olcut2 #olcutlerim arasındaki fark yüksek olduğundan küçük olan ölçütümü seçeceğim. (daha çok aykırı atması için)
## [1] 0.0500842
## [1] 0.0199005
olcut1Index <- which(dist>olcut1)
olcut2Index <- which(dist>olcut2)
length(olcut1Index);length(olcut2Index)
## [1] 5
## [1] 16
#Aykırı Gözlemleri Remove etme
trainsettrem <- trainsett[-olcut2Index,] #Aykırı gözlemleri çıkararak yeni bir isime atıyoruz,
nrow(trainsettrem) #186 eleman kalmış (aykırıların çıkmış hali)
## [1] 185
nrow(trainsett) #201 elemanı varmış
## [1] 201
#Aykırılardan arındırılmış yeni bir model (MODEL3)
modell3 <- lm(ACS ~ Econ + First.Bloods + Elo.Gain + Kills, data =trainsettrem)
#Anlamsız diye çıkardığım değişkenleri modelime yine katmadım.
summary(modell3) #Model2'ye göre Adj R2 çok artmıştır 0.77'den 0.87'ye çıkmıştır.
##
## Call:
## lm(formula = ACS ~ Econ + First.Bloods + Elo.Gain + Kills, data = trainsettrem)
##
## Residuals:
## Min 1Q Median 3Q Max
## -96.050 -15.131 -0.701 13.131 78.722
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.9173 6.8635 1.882 0.061446 .
## Econ 1.7347 0.1351 12.841 < 2e-16 ***
## First.Bloods 7.3733 1.2822 5.750 3.75e-08 ***
## Elo.Gain 1.2793 0.3724 3.436 0.000734 ***
## Kills 3.5281 0.4054 8.704 2.01e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 24.01 on 180 degrees of freedom
## Multiple R-squared: 0.8693, Adjusted R-squared: 0.8664
## F-statistic: 299.4 on 4 and 180 DF, p-value: < 2.2e-16
bptest(modell3) #0,05'ten küçük olduğu için H0 red. Yani değişen varyans sorunu hala vardır.
##
## studentized Breusch-Pagan test
##
## data: modell3
## BP = 19.429, df = 4, p-value = 0.0006472
modellogg <- lm(log(ACS)~Kills + Econ + First.Bloods + Elo.Gain , data = trainsettrem)
bptest(modellogg) #Log Dönüşümü yapsam bile 0,05'ten küçük kalıyor.
##
## studentized Breusch-Pagan test
##
## data: modellogg
## BP = 7.3222, df = 4, p-value = 0.1198
plot(modell3)
#Modell2 Modell3 AIC BIC karşılaştırılması :
AIC(modell2,k=6);AIC(modell3,k=6) #modell2 AIC = 2017, modell3 AIC = 1741
## [1] 2014.466
## [1] 1732.006
BIC(modell2);BIC(modell3) #modell2 BIC= = 2012, modell3 BIC = 1737
## [1] 2010.286
## [1] 1727.328
#AIC ve BIC değerleri modell3'te daha düşüktür, modell3 tercih edilmelidir.
#ÇOKLU BAĞLANTI SORUNU KONTROLÜ :
#X'lerin kendi arasında ilişkisi olmamasını, sadece Y'ye etki etmelerini isteriz, verimizi düzenlerken en başta bazı x'lerin ilişkileri hakkında cor fonksiyonu ile fikir sahibi olmuştuk, şimdi vif komutu ile çoklu bağlantı sorununu kontrol edeceğiz.
library(car)
## Zorunlu paket yükleniyor: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
vif(modell3) #Bağımsızlarımın vif değerleri gayet iyi olduğundan herhangi bir değişken ekle çıkar yapmamıza gerek yok.
## Econ First.Bloods Elo.Gain Kills
## 2.461047 1.131990 1.912922 1.711437
#İlişkili hatalar kontrolü (otokorelasyon)
#Durbin-Watson testiyle bakılabilir:
#0-4 aralığında gelen sonuc 2 etrafında şekilleniyorsa gözlemlerin arasında bağlantı yok demek, 0-2 arası pozitif bağlantı, 2-4 arası negatif bağlantı olduğunu işaret eder.
library(lmtest)
dwtest(modell3)
##
## Durbin-Watson test
##
## data: modell3
## DW = 1.9042, p-value = 0.2506
## alternative hypothesis: true autocorrelation is greater than 0
#Hipotezlerimiz şu şekildedir :
#H0: hatalar arasında korelasyon yoktur
#H1: hatalar Korelasyon vardır
#Sonuc 1,87 çıktığından hatalar arasında korelasyon sıkıntısı yoktur diyebiliriz, p-value ile de yorumlayalım:
#P-value 0.05'ten büyük çıktı, H0 reddedilemez yani hatalar arasında korelasyon yoktur.
#Breusch Godfrey testini de yapabiliriz :
lmtest::bgtest(modell3, order = 3)
##
## Breusch-Godfrey test for serial correlation of order up to 3
##
## data: modell3
## LM test = 0.27023, df = 3, p-value = 0.9655
#P-value > 0,05 olduğundan H0 reddedilemez yani hatalar arasında korelasyon yoktur.
#En baştaki veri setim olan "valorant" için yaptığım
#1) Kayıp gözlem doldurma
#2) Aykırı gözlemleri temizleme
#3) Dönüşüm sağlama
#4) Model varsayımlarını kontrol ederek yeni model oluşturma
#5) Otokorelasyon ve değişen varyans kontrolü
#İşlemlerinden sonra test setini ne kadar iyi tahmin ediyor diye bakabiliriz :
model2Pred <- predict(modell2,testsett)
model3Pred <- predict(modell3,testsett)
model2PredData <- data.frame("actuals"=testsett$ACS,
"predictions"=model2Pred)
model3PredData <- data.frame("actuals"=testsett$ACS,
"predictions"=model3Pred)
View(model2PredData) #Test setinde var olan değer ve ikinci modelimizin tahmin ettiği değeri gösterir.
View(model3PredData) #Test setinde var olan değer ve üçüncü modelimizin tahmin ettiği değeri gösterir.
#Model Hatasını hesaplama :
#Test setinin kendi değerinden tahmin edilen değer çıkarılarak bulunan sonuca model hatası denir
model2Hata <- model2PredData$actuals-model2PredData$predictions
model3Hata <- model3PredData$actuals-model3PredData$predictions
library(caret)
RMSE (model2PredData$predictions,model2PredData$actuals) #Model2'in RMSE'si
## [1] 26.13724
RMSE (model3PredData$predictions,model3PredData$actuals) #Model3'nin RMSE'si
## [1] 29.72856
MAE (model2PredData$predictions,model2PredData$actuals) #Model2'in MAE'si
## [1] 19.61092
MAE (model3PredData$predictions,model3PredData$actuals) #Model3'nin MAE'si
## [1] 20.47818
library(caret)
train.control <- trainControl(method='cv', number= 10, verboseIter = TRUE)
model2CV <- train(ACS~ Kills,data=trainsett,method='lm',trControl=train.control)
## + Fold01: intercept=TRUE
## - Fold01: intercept=TRUE
## + Fold02: intercept=TRUE
## - Fold02: intercept=TRUE
## + Fold03: intercept=TRUE
## - Fold03: intercept=TRUE
## + Fold04: intercept=TRUE
## - Fold04: intercept=TRUE
## + Fold05: intercept=TRUE
## - Fold05: intercept=TRUE
## + Fold06: intercept=TRUE
## - Fold06: intercept=TRUE
## + Fold07: intercept=TRUE
## - Fold07: intercept=TRUE
## + Fold08: intercept=TRUE
## - Fold08: intercept=TRUE
## + Fold09: intercept=TRUE
## - Fold09: intercept=TRUE
## + Fold10: intercept=TRUE
## - Fold10: intercept=TRUE
## Aggregating results
## Fitting final model on full training set
model3CV <- train(ACS~ Kills,data=trainsettrem,method='lm',trControl=train.control)
## + Fold01: intercept=TRUE
## - Fold01: intercept=TRUE
## + Fold02: intercept=TRUE
## - Fold02: intercept=TRUE
## + Fold03: intercept=TRUE
## - Fold03: intercept=TRUE
## + Fold04: intercept=TRUE
## - Fold04: intercept=TRUE
## + Fold05: intercept=TRUE
## - Fold05: intercept=TRUE
## + Fold06: intercept=TRUE
## - Fold06: intercept=TRUE
## + Fold07: intercept=TRUE
## - Fold07: intercept=TRUE
## + Fold08: intercept=TRUE
## - Fold08: intercept=TRUE
## + Fold09: intercept=TRUE
## - Fold09: intercept=TRUE
## + Fold10: intercept=TRUE
## - Fold10: intercept=TRUE
## Aggregating results
## Fitting final model on full training set
model2CV;model3CV
## Linear Regression
##
## 201 samples
## 1 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 181, 180, 181, 181, 181, 181, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 65.88584 0.5389502 47.4547
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
## Linear Regression
##
## 185 samples
## 1 predictor
##
## No pre-processing
## Resampling: Cross-Validated (10 fold)
## Summary of sample sizes: 166, 166, 167, 167, 166, 167, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 42.56354 0.6460457 31.97351
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
#Cross-Validation hesaplamasına göre :
#Model3 daha iyidir.