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(car)
## Zorunlu paket yükleniyor: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
library(pscl)
## Classes and Methods for R developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University
## Simon Jackman
## hurdle and zeroinfl functions by Achim Zeileis
library(ROCR)
library(caret)
## Zorunlu paket yükleniyor: lattice
library(glmnet)
## Zorunlu paket yükleniyor: Matrix
## Loaded glmnet 4.1-8
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(funModeling)
## Zorunlu paket yükleniyor: Hmisc
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:dplyr':
##
## src, summarize
## The following objects are masked from 'package:base':
##
## format.pval, units
## funModeling v.1.9 :)
## Examples and tutorials at livebook.datascienceheroes.com
## / Now in Spanish: librovivodecienciadedatos.ai
library(InformationValue)
##
## Attaching package: 'InformationValue'
## The following objects are masked from 'package:caret':
##
## confusionMatrix, precision, sensitivity, specificity
library(readxl)
data <- read.csv("AdvertisingData.csv")
View(data)
names(data)
## [1] "DailyTimeSpent" "Age" "AreaIncome"
## [4] "DailyInternetUsage" "Gender" "ClickedAd"
# Veri setim herhangi birinin belirli koşullar ve şartlara altında gösterilen reklama tıklayıp tıklamaması hakkında bilgi içeriyor.
# Veri setimde 1'i kategorik bağımlı olmak üzere 6 değişken var.
# "DailyTimeSpent" değişkeni kullanıcının sitede bir günde kaç dakika harcadığını gösteriyor.
# "Age" değişkeni kullanıcının yaşını gösteriyor.
# "AreaIncome" değişkeni kullanıcının ortalama gelirini gösteriyor.
# "DailyInternetUsage" değişkeni kullanıcının bir günde ne kadar internet kullandığını gösteriyor.
# "Gender" değişkeni kullanıcının cinsiyetini gösteriyor.
# "ClickedAd" değişkeni ise kullanıcının reklama tıklayıp (1) tıklamadığını gösteriyor (0).
# Burdaki amacım, kullanıcının sitede geçirdiği günlük zaman ve kullandığı internetle, yaşını, gelirini ve cinsiyetini de hesaba katarak sitede çıkan reklama tıklayıp tıklamadığını tahmin etmek.
#Veriyi inceleyerek işe başlıyorum :
dim(data) #Verimiz 1000 gozlemden ve 6 degiskenden olusuyor.
## [1] 1000 6
head(data) #Verimizin ilk bir kac gozlerime goz gezdirerek fikir sahibi olabiliyoruz.
## DailyTimeSpent Age AreaIncome DailyInternetUsage Gender ClickedAd
## 1 68.95 35 61833.90 256.09 0 0
## 2 80.23 31 68441.85 193.77 1 0
## 3 69.47 26 59785.94 236.50 0 0
## 4 74.15 29 54806.18 245.89 1 0
## 5 68.37 35 73889.99 225.58 0 0
## 6 59.99 23 59761.56 226.74 1 0
str(data) #Degiskenlerimizin yapisina bakiyoruz, Kategorik olan "ClickedAd" degiskenim int olarak gözüküyor, aykırı temizliğinden sonra faktör olarak atayacağız. (Cinsiyet değişkenini de 1,0 olduğundan dolayı faktör olarak atayacağım.)
## 'data.frame': 1000 obs. of 6 variables:
## $ DailyTimeSpent : num 69 80.2 69.5 74.2 68.4 ...
## $ Age : int 35 31 26 29 35 23 33 48 30 20 ...
## $ AreaIncome : num 61834 68442 59786 54806 73890 ...
## $ DailyInternetUsage: num 256 194 236 246 226 ...
## $ Gender : int 0 1 0 1 0 1 0 1 1 1 ...
## $ ClickedAd : int 0 0 0 0 0 0 0 1 0 0 ...
summary(data) #Veri setimde çok aykırı gözlemler gözüme çarpmasa da Na'ları görebiliyorum ve değişkenlerin değerleri hakkında fikir sahibi oluyorum.
## DailyTimeSpent Age AreaIncome DailyInternetUsage
## Min. :32.60 Min. :19.00 Min. :13996 Min. :104.8
## 1st Qu.:51.38 1st Qu.:29.00 1st Qu.:47051 1st Qu.:138.8
## Median :68.25 Median :35.00 Median :57010 Median :183.1
## Mean :65.03 Mean :36.01 Mean :54975 Mean :180.0
## 3rd Qu.:78.57 3rd Qu.:42.00 3rd Qu.:65421 3rd Qu.:218.8
## Max. :91.43 Max. :61.00 Max. :79485 Max. :270.0
## NA's :3 NA's :3
## Gender ClickedAd
## Min. :0.000 Min. :0.0
## 1st Qu.:0.000 1st Qu.:0.0
## Median :0.000 Median :0.5
## Mean :0.481 Mean :0.5
## 3rd Qu.:1.000 3rd Qu.:1.0
## Max. :1.000 Max. :1.0
##
#Eksik verileri kontrol ediyorum sonrasında doldurma metoduyla Na'lardan kurtuluyorum.
sum(is.na(data)) #Verimde 6 adet Na var.
## [1] 6
#Burada; impute sayisini 3 olarak belirliyorum ve pmm ile doldurma yapiyorum, ve Na iceren degerlere onerdigi 3 adet degere bakiyorum. Ardindan 3 oneriden 3. oneri ile doldurma yap diyerek verime atiyorum. Na'larin yerini doldurulan veriler aliyor.
imputed<-mice(data,m=3)
##
## iter imp variable
## 1 1 DailyTimeSpent AreaIncome
## 1 2 DailyTimeSpent AreaIncome
## 1 3 DailyTimeSpent AreaIncome
## 2 1 DailyTimeSpent AreaIncome
## 2 2 DailyTimeSpent AreaIncome
## 2 3 DailyTimeSpent AreaIncome
## 3 1 DailyTimeSpent AreaIncome
## 3 2 DailyTimeSpent AreaIncome
## 3 3 DailyTimeSpent AreaIncome
## 4 1 DailyTimeSpent AreaIncome
## 4 2 DailyTimeSpent AreaIncome
## 4 3 DailyTimeSpent AreaIncome
## 5 1 DailyTimeSpent AreaIncome
## 5 2 DailyTimeSpent AreaIncome
## 5 3 DailyTimeSpent AreaIncome
data <- complete(imputed,3)
View(data)
md.pattern(data) #Verimizde hiç Na kalmamıştır.
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## DailyTimeSpent Age AreaIncome DailyInternetUsage Gender ClickedAd
## 1000 1 1 1 1 1 1 0
## 0 0 0 0 0 0 0
cor(data) #Bağımsız değişkenlerim arasında etkili bağlantı söz konusu değildir.
## DailyTimeSpent Age AreaIncome DailyInternetUsage
## DailyTimeSpent 1.00000000 -0.32949657 0.3075076300 0.52276818
## Age -0.32949657 1.00000000 -0.1825369691 -0.36720856
## AreaIncome 0.30750763 -0.18253697 1.0000000000 0.33635843
## DailyInternetUsage 0.52276818 -0.36720856 0.3363584259 1.00000000
## Gender -0.01744937 -0.02104406 0.0009614953 0.02801233
## ClickedAd -0.74961181 0.49253127 -0.4741771004 -0.78653918
## Gender ClickedAd
## DailyTimeSpent -0.0174493729 -0.74961181
## Age -0.0210440637 0.49253127
## AreaIncome 0.0009614953 -0.47417710
## DailyInternetUsage 0.0280123263 -0.78653918
## Gender 1.0000000000 -0.03802747
## ClickedAd -0.0380274657 1.00000000
#Kategorik Değişkenimi inceliyorum :
unique(data$ClickedAd) #"0" ile "1" değerlerini alıyormuş, ( 0 Reklama tıklamayanlar, 1 Reklama tıklayanlar.)
## [1] 0 1
table(data$ClickedAd)# 500 adet "0" 500 adet "1" varmış.
##
## 0 1
## 500 500
#Reklama tıklayıp tıklamama hakkında herhangi bir bağımsızımla grafik oluşturarak yorumlamak istersem :
plot(data$ClickedAd, data$DailyTimeSpent)
#Sitede günlük az vakit geçirenler reklama tıklarken, çok vakit geçirenler tıklamıyor gibi basit bir yorum yapabiliyorum.
#summary(data)'da aykırılar çok gözüme çarpmadı fakat yine de bir aykırı temizliği yapıyorum :
#Burada; mahalanobis metoduyla aykırıları datamdan atmak için önce formül için gerekli olan cov ve center değerini hesaplıyorum. Ardından formülü hesaplıyorum ve bir cutoff noktası belirliyorum. Belirlediğim cutoff noktasından büyük uzaklık mesafelerini bir değere atıyorum ve o değeri ana datamdan çıkarıyorum. Aykırılardan arınmış yeni bir datam oluyor.
data.center <- colMeans(data)
data.cov <- cov(data)
distance <- mahalanobis(data, center = data.center, cov = data.cov)
cutoff <- qchisq(p=0.95, df=10)
index <- which(distance > cutoff)
datanew <- data[-index,]
nrow(data);nrow(datanew) #Verim eskisine göre azaldı (Aykırılar çıktı)
## [1] 1000
## [1] 983
table(datanew$ClickedAd) #Aykırı verilerin hepsi "Reklama tıklayanlar"mış.
##
## 0 1
## 500 483
# Kategorik değişkenlerimi faktör olarak atıyorum ve 2. aşamaya geçiyorum
datanew$ClickedAd <- as.factor(datanew$ClickedAd )
datanew$Gender <- as.factor(datanew$Gender)
class(datanew$ClickedAd);class(datanew$Gender) #Artık factor oldular.
## [1] "factor"
## [1] "factor"
# Kategorik bağımlı değişkenimi kategorilerinin içeriğince 2 ayrı veri olarak ele alıyorumki rahat ve eşit parçalama yapabileyim.
data0 <-datanew %>% filter(ClickedAd=="0")
data1 <-datanew %>% filter(ClickedAd=="1")
nrow(data0);nrow(data1)
## [1] 500
## [1] 483
#Bunu yapmamin sebebi veri ayristirma yaptigimizda herhangi birinden bi tarafa hic atmazsa veya az atarsa diye manuel olarak kontrolü ele alıyorum. Aslında verimde "0" ve "1"in eleman sayısı fazlasıyla yakındı ama yine de manuel parçalama yapmayı tercih ettim.
set.seed(155)
data0Index<-sample(1:nrow(data0),size=0.75*nrow(data0))
set.seed(155)
data1Index<-sample(1:nrow(data0),size=0.75*nrow(data0))
train1<-data1[data1Index, ]
train0<-data0[data0Index, ]
#Ardından tek bi trainsetin'de birleştirerek eşit dağıtılmış bir trainset elde ettim.
trainset<-rbind(train1,train0)
table(trainset$ClickedAd)
##
## 0 1
## 375 363
#Aynısını Test için de yapacağım :
test1 <- data1[ -data1Index, ]
test0 <- data0[ -data0Index, ]
testset <- rbind(test1, test0)
table(testset$ClickedAd)
##
## 0 1
## 125 120
#Boylece 0'in 1'e olan oranini hem train'de hem test'te korumus olduk.
model1<- glm(ClickedAd ~ .,family = "binomial",data=trainset) #Tüm bağımsızlarımı ekleyerek ilk modelimi oluşturuyorum.
summary(model1) #Bütün bağımsızlarım modele katkılı.
##
## Call:
## glm(formula = ClickedAd ~ ., family = "binomial", data = trainset)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.674e+01 8.092e+00 5.776 7.64e-09 ***
## DailyTimeSpent -3.032e-01 5.425e-02 -5.589 2.28e-08 ***
## Age 2.298e-01 6.656e-02 3.452 0.000557 ***
## AreaIncome -1.648e-04 4.217e-05 -3.909 9.25e-05 ***
## DailyInternetUsage -1.268e-01 2.383e-02 -5.321 1.03e-07 ***
## Gender1 -1.893e+00 8.087e-01 -2.341 0.019241 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1022.890 on 737 degrees of freedom
## Residual deviance: 54.921 on 732 degrees of freedom
## (12 observations deleted due to missingness)
## AIC: 66.921
##
## Number of Fisher Scoring iterations: 10
model2<- glm(ClickedAd ~ DailyTimeSpent + Age + AreaIncome + DailyInternetUsage,family = "binomial",data=trainset)
summary(model2) #En az katkısı olan tek yıldızlı değişkenim Gender'ı çıkarıp bakıyorum fakat AIC değerim yükseliyor yani kötü etkilemiş.
##
## Call:
## glm(formula = ClickedAd ~ DailyTimeSpent + Age + AreaIncome +
## DailyInternetUsage, family = "binomial", data = trainset)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.164e+01 6.553e+00 6.354 2.10e-10 ***
## DailyTimeSpent -2.774e-01 4.578e-02 -6.059 1.37e-09 ***
## Age 2.098e-01 6.000e-02 3.496 0.000473 ***
## AreaIncome -1.513e-04 3.765e-05 -4.018 5.87e-05 ***
## DailyInternetUsage -1.145e-01 1.985e-02 -5.768 8.00e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1022.890 on 737 degrees of freedom
## Residual deviance: 61.478 on 733 degrees of freedom
## (12 observations deleted due to missingness)
## AIC: 71.478
##
## Number of Fisher Scoring iterations: 10
#McFadden ile de bakabilirim :
pscl::pR2(model1)['McFadden'];pscl::pR2(model2)['McFadden'] #Model1 daha iyi duruyor.
## fitting null model for pseudo-r2
## McFadden
## 0.9463077
## fitting null model for pseudo-r2
## McFadden
## 0.9398979
#Modelde çoklu bağlantı sorunu kontrolü:
vif(model1) #Çoklu bağlantı sorunumuz yoktur.
## DailyTimeSpent Age AreaIncome DailyInternetUsage
## 3.370859 2.219015 2.553657 2.074506
## Gender
## 1.282276
anova(model1) #Resid. Dev : Her bir bağımsız değişkenin eklenmesinden sonra modelin verilere ne kadar iyi uyduğunu gösteren bir istatistik olduğundan modelimin iyi uyuştuğunu gösterir. "DailyTimeSpent" ve "DailyInternetUsage" değişkenlerim Resid. Dev değerinde maximum azaltmayı sağlamış. Her bir değişkenin modelin performansına anlamlı bir şekilde katkıda bulunduğunu söyleyebilirim.
## Analysis of Deviance Table
##
## Model: binomial, link: logit
##
## Response: ClickedAd
##
## Terms added sequentially (first to last)
##
##
## Df Deviance Resid. Df Resid. Dev
## NULL 737 1022.89
## DailyTimeSpent 1 564.11 736 458.78
## Age 1 86.80 735 371.97
## AreaIncome 1 105.27 734 266.70
## DailyInternetUsage 1 205.22 733 61.48
## Gender 1 6.56 732 54.92
varImp(model1) #Modele olan etkilerini inceliyorum.
## Overall
## DailyTimeSpent 5.589418
## Age 3.451809
## AreaIncome 3.909410
## DailyInternetUsage 5.320512
## Gender1 2.340832
# DailyTimeSpent değişkeni modelin tahminleme üzerinde en büyük etkiye sahip olan değişkenidir. Diğer değişkenlerin de modelin açıklanabilirliğine katkıda bulunduğunu söyleyebilirim.
exp(coef(model1)) # Odds oranlari hakkında yorum yapacak olursam :
## (Intercept) DailyTimeSpent Age AreaIncome
## 1.992743e+20 7.384317e-01 1.258309e+00 9.998352e-01
## DailyInternetUsage Gender1
## 8.809341e-01 1.506058e-01
# DailyTimeSpent değişkeninin odds oranı 0.7385038'dir, bu da her bir birimlik artışın yanıt değişkeni üzerinde %26.15'lik bir azalmayı temsil eder.
# Age değişkeninin odds oranı 1.259228'dir, bu da her bir birimlik artışın yanıt değişkeni üzerinde %25.92'lik bir artışı temsil eder.
#Testset üzerinde değerlendirme :
predict1<-predict(model1,testset,type="response") #Lojistik regresyon oldugu icin "Type=response" yazmak zorundayim
require(InformationValue) #InformationValue paketinin içindeki ConfusionMatrix fonksiyonuyla bir tahmin matrisi oluşturucagim
cm<-InformationValue::confusionMatrix(testset$ClickedAd,predictedScores = predict1)
cm #Elimizdeki veriler sayisal olmadigindan confusion matrix yapıyoruz ve Reklama tıklayanların kaçını "Tıkladı" tahmin etti, tıklamayanların kaçını "Tıklamadı" tahmin etti bize gösteriyor. Modelin doğru tahmin oranı çok fazla gözüküyor.
## 0 1
## 0 121 1
## 1 4 119
accuracy1 <- (cm[2,2]+cm[1,1])/sum(cm)
accuracy1
## [1] 0.9795918
#Modelimizin doğru tahmin ettiği gözlemlerin oranını görmek için accuracy yapıyorum ve çok yüksek çıkıyor.Ancak, doğruluk tek başına bir modelin performansını tam olarak yansıtmayabilir. Yüksek doğruluk değerleri yanıltıcı olabilir ve overfitting'ten şüpheleniyorum.
#Bu sebepten uygun metriklere de bakıyorum :
#Precision, Recall, F1 Skoru, Roc Eğrisi
#Toplam gözlem sayısını yanlış atamalara oranlayarak hata oranı metricini elde ediyorum.
errorRate1<-(cm[1,2]+cm[2,1])/sum(cm)
errorRate1 #Hata oranıda 1-accuracy olduğundan çok düşük çıkıyor.
## [1] 0.02040816
optCutoff<-InformationValue::optimalCutoff(testset$ClickedAd,predictedScores=predict1)
optCutoff # Farklı bir sonuç'u daha iyi bulabilmek için Cutoff noktası belirliyorum.
## [1] 0.91
cmOpt <-InformationValue::confusionMatrix(testset$ClickedAd,predictedScores = predict1, threshold = optCutoff )
cmOpt #Bunu yaparak "Reklama tıklamayanların" bulunma ihtimalini arttirdik, ama bi yandan da Reklama tıklayanları bulma performansı azıcık düştü . Eger amacimiz Reklama tıklamayanları bulmak olsaydı bu kullanılabilirdi.
## 0 1
## 0 123 2
## 1 2 118
#Uygun tüm bağımsızlar modele eklendi.
#Uygun olmayan bağımsızlar değişkenler bulunmadı.
#Tekrarlayan ölçüme rastlanmadı.
#Kayıp eksik veri(Na)'ler dolduruldu.
#Bağımsızlar arası çoklu bağlantı sorunu olmamalı.
#Aykırı değerler veri'den atıldı.
#Örneklem büyüklüğü yeterli.
# Az olan nadir goruleni yakalamak istiyorsam Precision ya da recall kullanmaliyim.
# Eger cok olani yakalamak istiyorsam o zaman specificity ve sensivity kullanilmali
#Bagimli degiskenim '0' ve '1' olarak neredeyse esit dagildigi icin, specifity ve sensivity kullanabilirim.
confmat<-as.matrix(table(testset$ClickedAd, predict1 > 0.35))
confmat
##
## FALSE TRUE
## 0 120 5
## 1 0 120
#Eger amacim reklama tiklayanlari kusursuz oranda yakalamaksa, olcutu '> 0.35' olarak ayarlarim ve reklama tiklayan herkesi %100 ihtimalle bulurken, tiklamayanlarda ufak sapmalar gerceklesir.
#Sensivity Gercek pozitiflerin model tarafindan ne kadarinin dogru bir sekilde tahmin edildigini gosterir.
sensivity<-(cmOpt[2,2])/(cmOpt[1,2]+cmOpt[2,2])
sensivity #Gercek pozitifler model tarafindan %98 ihtimalle dogru tahmin edilir.
## [1] 0.9833333
sensivity2<-(confmat[2,2])/(confmat[2,1]+confmat[2,2])
sensivity2
## [1] 1
#Specificity Gercek negatiflerin model tarafindan ne kadarinin dogru bir sekilde tahmin edildigini gosterir.
specificity1<-(cmOpt[1,1])/(cmOpt[2,1]+cmOpt[1,1])
specificity1 #Gercek negatifler model tarafindan %98 ihtimalle dogru tahmin edilir.
## [1] 0.984
specificity<-(confmat[1,1])/(confmat[1,2]+confmat[1,1])
specificity #Modelde reklama tiklayanlari daha iyi bulmak icin confmat kullanmamiz gerekirken, reklama tiklamayanlari daha iyi bulmak icin cutoff'lu cmOpt'u kullanmamiz gerekir
## [1] 0.96
#Roc egrisi hesaplama:
library(pROC)
rocModel<-roc(testset$ClickedAd~predict1)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(rocModel)
#Roc modelimiz sol üst köşeye neredeyse kusursuz yaklaşıyor yani performans açısından çok iyi bir model diyebiliriz.
#Nihai modelimiz : model1
model1
##
## Call: glm(formula = ClickedAd ~ ., family = "binomial", data = trainset)
##
## Coefficients:
## (Intercept) DailyTimeSpent Age AreaIncome
## 46.7412140 -0.3032267 0.2297689 -0.0001649
## DailyInternetUsage Gender1
## -0.1267724 -1.8930895
##
## Degrees of Freedom: 737 Total (i.e. Null); 732 Residual
## (12 observations deleted due to missingness)
## Null Deviance: 1023
## Residual Deviance: 54.92 AIC: 66.92
#Modelimizin yazılışı : Ý = 46.70 + -0.30DailySpentTime + 0.23Age + -0.0001AreaInCome + -0.12DailyInternetUsage + -1.91Gender1 (E'ler modelin Y sapkanin icindeki hatalar)
# Sayısal değerlerimizi "exp" ile çevirmeden olduğu haliyle kullanamayız. O sebepten Pozitiflik negatiflik yorumu yapacağım :
# Yorumlaması ise : Gender1(Erkek olma)'nın katsayısı negatif olduğundan Erkek olmanın Reklama basma olasılığını azalttığı yorumu yapılabilir.
# Yaş(age) değişkenin katsayısı pozitif olduğundan yaş arttıkça "Reklama tıklama" olasılığı artar.
# Bir de gerçek katsayı değeriyle yorum yapalım :
exp(-0.30) #0.74
## [1] 0.7408182
#DailySpentTime yani 1 günde sitede harcadığı süre eğer artarsa bağımlı değişkenimin olasılığı 0.74 kat artacağından Reklam Tıklama olasılığı üzerinde olumsuz bir etkiye sahip olarak, Günlük sitede geçirilen zamanda artan her birim reklam'a tıklanmama olasılığını arttırıyor.
#Modelimizi serbest kullanmak istersek :
#Ben denemek için Reklama tıklamayan yani 0 olan birinin verilerini girdim ve kusursuz sonuç verdi.
deneme <- data.frame(DailyTimeSpent = 80.23, Age = 31, AreaIncome = 68441, DailyInternetUsage = 193.77, Gender = factor(1)) #Kişinin verileri.
predicting<- predict(model1, newdata = deneme, type = 'response') #Tahmin fonksiyonunun kurulması.
predicted_class <- ifelse(predicting >= 0.5, "Reklama Tikladi", "Reklama Tiklamadi") # If-else fonksiyonuyla sınıfını seçiyoruz.
cat("Tahmin Edilen Olasılık:", predicting, "\n");cat("Tahmin Edilen Sinif :", predicted_class, "\n") #Ve çıktıda bize kusursuz sonuç veriyor.
## Tahmin Edilen Olasılık: 0.0002734118
## Tahmin Edilen Sinif : Reklama Tiklamadi
#Analiz boyunca ihtiyacim olan kutuphaneleri yukledim ve ardindan datami cekerek degisken isimlerini tanitip ne hakkinda analiz yapacagimi acikladim, ardindan verimi inceliyip gozlemler ve degiskenler hakkinda bilgi edindim ve verimdeki Na’lari doldurup daha sonrasinda bagimsizlarim arasinda iliski var mi diye korelasyonlarina baktim, anlamli korelasyon bulunmadi. Daha sonra verimdeki aykiri gozlemleri atmak icin mahalanobis uzakligini kullanip aykirisiz yeni bir veriseti elde ediyorum. En son kategorik degiskenlerimi faktor olarak atayip parcalanmaya geciyorum. Modelimde 0 ve 1ler neredeyse esit dagilmis olmasina ragmen daha guzel sonuc versin diye 0,1’in oranini test ve trainde esitliyorum ve model kurmaya hazir hale geliyorum. Once tum bagimsiz degiskenlerim ile modeli kurup daha sonra summary’de anlamsiz cikanlari cikararak 2. bir model kuruyorum ve bu 2 modeli McFadden metoduyla karsilastiriyorum, modellerde coklu baglanti sorunu olup olmadigini kontrol edip anova tablosunu ve degiskenlerin katkisini yorumluyorum. Daha sonra predict fonksiyonuyla testset’i tahminine bakiyorum ConfusionMatrix’ten yardim alarak bir matrix olusturuyorum ve 1,0’i 1 mi 0 mi tahmin etmis inceliyorum. Ardindan accuracy degerine bakiyorum ve metrik islemlerine geciyorum. Modelime uygun olan specificity ve sensivity metriginden yardim alarak modelimin performansini inceliyorum ve ardindan f1 skorunu hesaplayarak roc grafigini cizdiriyorum ve bunlarin sonucunda nihai modelime karar veriyorum.