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

Na’lardan ve aykırılardan arınmış veri ile yeni model oluşturmak :

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.

Modelde logaritmik dönüşüm :

#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

Modelin MSE değerini hesaplama :

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

Modelde AIC BIC Yorumlama :

#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"

B0 içermeyen model için :

modelk <- lm(ACS~ Kills-1, data = valorant) #Bağımsız değişkenden 1 çıkararak modelden B0'ı çıkarıyoz.

2. UYGULAMA DERSİNDE ANLATILANLAR

#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

Ayni veri setimi baştan çekiyorum :

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 REGRESYON

#Ç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.