Veri Madenciliği (Data Mining): Metin Verisinin Keşifsel Veri Analizi Üzerine Bir Vaka Çalışması (Text Mining)

Veriden desen çıkarma işlemi anlamına gelen veri madenciliği bütün alanlarda kendine uygulama alanı bulan ve büyük veri (big data)’den farklı olan bir kavramdır. Bu kavram aynı zamanda veriyi keşfetmek olarak da tanımlanabilir. Veri madenciliği, veriden desen veya örüntü çıkarırken yapay zekayı , istatistiksel metotları ve diğer pek çok metodu kullanır. Büyük veride ise genel olarak yüksek hacim (volume), akışkanlık (velocity), çeşitlilik (variety), belirsizlik (veracity) söz konusudur. Bahsedilen bu özelliklerin aynı anda sağlanması gereklidir. Büyük veri, tek başına veri setinin büyük olduğu anlamına gelmez.

Veri madenciliğinin (data mining) bir kolunu oluşturan metin madenciliği (text mining) metotları, metinlerde en sık kullanılan anahtar kelimeleri vurgulamamıza ve görselleştirmemize olanak tanır. Bu metotlarla metin verisinden metin bulutu, etiket bulutu diyebileceğimiz kelime bulutu oluşturulabilir.

Kelime bulutu oluşturma prosedürü eğer R programlama dilinde uygulama adımları bilinirse çok zor değildir. Genel olarak R’da farklı paketler kullanılmakla birlikte genellikle metin madenciliği paketi (the text mining package ™) ve kelime bulutu oluşturucu paket (the word cloud generator package (wordcloud))’lerinin kullanıldığı görülmektedir. Bu paketler, metni hızlı analiz etmemize ve kelime bulutu olarak ortaya çıkan anahtar kelimeleri görselleştirmemize olanak tanır.

Bahsedilenler ışığında metin verisini sunmada kelime bulutunu kullanmanız gerektiği durumlar şunlardır:

  1. Kelime bulutları sadelik ve yalınlık sağlar. En sık kullanılan anahtar kelimeler, kelime bulutu içinde daha iyi kendini gösterir.
  2. Kelime bulutları potansiyel iletişim araçlarıdır. Kelime bulutlarının anlaşılması ve paylaşılması kolaydır ve kelime bulutları etkilidirler.
  3. Kelime bulutları bir tablo verisinden görsel olarak daha ilgi çekicidir.

Kelime bulutları, sektör ayrımı gözetilmeksizin bütün alanlarda kullanılabilmekle birlikte en sık kullanılan alanlarla en sık kullanılan meslek grupları şöyle özetlenebilir;

  1. Kalitatif (nitel) araştırma yapan araştırmacılar,
  2. Müşterilerin ihtiyaçlarının belirlenmesi noktasında pazarlamacılar,
  3. Temel konuları desteklemek için eğitimciler,
  4. Politikacı ve gazeteciler
  5. Kullanıcı görüşlerini toplayan, analiz eden ve paylaşan sosyal medya siteleri

R’da kelime bulutu oluşturma süreci genel olarak 5 adımda tamamlanmaktadır.

  1. Birinci adımda text (txt) uzantılı bir dosya oluşturulur. Oluşturulan bu metin dosyasının içine analiz edilecek metin (uzunluğu önemli değil) kaydedilir. Ancak bu metin dosyası txt uzantılı olarak web üzerinde de olabilir. Bu durumda txt dosyasının linki üzerinden sürece devam edilir.
  2. Gerekli R programlama dili paketleri kurulur ve yüklenir. Bu paketler;

     Install (kurulum için)

install.packages("tm")  # for text mining (metin madenciliği için)
install.packages("SnowballC") # for text stemming (metin için)
install.packages("wordcloud") # word-cloud generator (kelime bulutu oluşturucu)
install.packages("RColorBrewer") # color palettes (renk paletleri)

   Load (yüklemek için)

library("tm")
library("SnowballC")
library("wordcloud")
library("RColorBrewer")

3. 1. aşamada oluşturulan metin dokümanı yüklenir. Kullanılan R kodu genellikle şu şekildedir;

filePath<-library(readr)
ml <- read_csv("ml.txt")
View(ml)
text <- readLines(filePath) 
filePath<-library(readr)
ml <- read_csv("ml.txt")
View(ml)
text <- readLines(filePath)

Metin madenciliği denilen bu aşamada, analiz edilecek metin text mining ™ paketinde olan Corpus() fonksiyonu kullanılır ve metin indekslenir. Daha sonra, veri temizleme faaliyetlerine başlanır. İstenmeyen kelimeler, bağlaçlar, boşluklar, sayılar bu aşamada çıkarılır.

  1. Metin temizlendikten sonra metnin içindeki kelimelerin kullanılma sıklığını gösteren bir matris oluşturulur.
  2. Son aşamada ise sıklık matrisinden bir kelime bulutu oluşturularak süreç tamamlanır.

Uygulama adımları anlatıldıktan sonra özgün örnek bir olay üzerinden şimdi bir uygulama yapalım. Kolaylık olması ve daha anlaşılır olması adına txt (text) dosyası yüklenmesi yerine analiz edilecek metin fonksiyon içine yazılarak aşamalar kısaltılacaktır. Bilinirliğinden dolayı, örnek uygulamada kullanılan metin, Nutuk adlı eserden alınmıştır.

#Analizde Kullanılan Nutuk Adlı Eserden alınan Metin

Türk Gençliğine Bıraktığımız Kutsal Armağan Saygıdeğer baylar, sizi, günlerce işlerinizden alıkoyan uzun ve ayrıntılı sözlerim, en sonu tarihe mal olmuş bir dönemin öyküsüdür. Bunda, ulusum için ve yarınki çocuklarımız için dikkat ve uyanıklık sağlayabilecek kimi noktaları belirtebilmiş isem kendimi mutlu sayacağım.Baylar, bu söylevimle, ulusal varlığı sona ermiş sayılan büyük bir ulusun, bağımsızlığını nasıl kazandığını; bilim ve tekniğin en son ilkelerine dayanan ulusal ve çağdaş bir devleti nasıl kurduğunu anlatmaya çalıştım.Bugün ulaştığımız sonuç, yüzyıllardan beri çekilen ulusal yıkımların yarattığı uyanıklığın ve bu sevgili yurdun her köşesini sulayan kanların karşılığıdır.Bu sonucu, Türk gençliğine kutsal bir armağan olarak bırakıyorum.Ey Türk gençliği! Birinci ödevin; Türk bağımsızlığını, Türk Cumhuriyetini, sonsuzluğa değin korumak ve savunmaktır.Varlığının ve geleceğinin biricik temeli budur. Bu temel, senin en değerli hazinendir. Gelecekte de, seni bu kaynaktan yoksun etmek isteyen iç ve dış kötücüller bulunacaktır. Bir gün, bağımsızlığını ve cumhuriyetini savunmak zorunda kalırsan, ödeve atılmak için, içinde bulunacağın durumun olanaklarını ve koşullarını düşünmeyeceksin! Bu olanak ve koşullar çok elverişsiz bir nitelikte belirebilir. Bağımsızlığına ve cumhuriyetine kıymak isteyecek düşmanlar, bütün dünyada benzeri görülmedik bir utku kazanmış olabilirler.Zorla ve aldatıcı düzenlerle sevgili yurdunun bütün kaleleri alınmış, bütün gemilikleri ele geçirilmiş, bütün orduları dağıtılmış ve yurdun her köşesi fiilen işgal edilmiş olabilir. Bütün bu koşullardan daha acı ve daha korkunç olmak üzere, yurdunda, iş başında bulunanlar, aymazlık ve sapkınlık, üstelik, hainlik içinde olabilirler. Dahası iş başında bulunan bu kişiler, kendi çıkarlarını, yurduna girmiş olan düşmanların siyasal erekleriyle birleştirebilirler. Ulus, yoksulluk ve sıkıntı içinde ezgin ve bitkin düşmüş olabilir.Ey Türk geleceğinin çocuğu! İşte, bu ortam ve koşullar içinde bile ödevin, Türk bağımsızlığını ve Cumhuriyetini kurtarmaktır! Bunun için gereken güç, damarlarındaki soylu kanda vardır.

# Yukarıda bahsedilen paketlerin kurulumu ve yüklenme işlemi tamamlandıktan sonra, metni, indekslenmesi için ilk olarak corpus fonkyonu içinde tanımlanmış VectorSource fonksiyonu içine alıyoruz.

docs <- Corpus(VectorSource("Türk Gençliğine Bıraktığımız Kutsal Armağan Saygıdeğer baylar, sizi, günlerce işlerinizden alıkoyan uzun ve ayrıntılı sözlerim, en sonu tarihe mal olmuş bir dönemin öyküsüdür. Bunda, ulusum için ve yarınki çocuklarımız için dikkat ve uyanıklık sağlayabilecek kimi noktaları belirtebilmiş isem kendimi mutlu sayacağım.Baylar, bu söylevimle, ulusal varlığı sona ermiş sayılan büyük bir ulusun, bağımsızlığını nasıl kazandığını; bilim ve tekniğin en son ilkelerine dayanan ulusal ve çağdaş bir devleti nasıl kurduğunu anlatmaya çalıştım.Bugün ulaştığımız sonuç, yüzyıllardan beri çekilen ulusal yıkımların yarattığı uyanıklığın ve bu sevgili yurdun her köşesini sulayan kanların karşılığıdır.Bu sonucu, Türk gençliğine kutsal bir armağan olarak bırakıyorum.Ey Türk gençliği! Birinci ödevin; Türk bağımsızlığını, Türk Cumhuriyetini, sonsuzluğa değin korumak ve savunmaktır.Varlığının ve geleceğinin biricik temeli budur. Bu temel, senin en değerli hazinendir. Gelecekte de, seni bu kaynaktan yoksun etmek isteyen iç ve dış kötücüller bulunacaktır. Bir gün, bağımsızlığını ve cumhuriyetini savunmak zorunda kalırsan, ödeve atılmak için, içinde bulunacağın durumun olanaklarını ve koşullarını düşünmeyeceksin! Bu olanak ve koşullar çok elverişsiz bir nitelikte belirebilir. Bağımsızlığına ve cumhuriyetine kıymak isteyecek düşmanlar, bütün dünyada benzeri görülmedik bir utku kazanmış olabilirler.Zorla ve aldatıcı düzenlerle sevgili yurdunun bütün kaleleri alınmış, bütün gemilikleri ele geçirilmiş, bütün orduları dağıtılmış ve yurdun her köşesi fiilen işgal edilmiş olabilir. Bütün bu koşullardan daha acı ve daha korkunç olmak üzere, yurdunda, iş başında bulunanlar, aymazlık ve sapkınlık, üstelik, hainlik içinde olabilirler. Dahası iş başında bulunan bu kişiler, kendi çıkarlarını, yurduna girmiş olan düşmanların siyasal erekleriyle birleştirebilirler. Ulus, yoksulluk ve sıkıntı içinde ezgin ve bitkin düşmüş olabilir.Ey Türk geleceğinin çocuğu! İşte, bu ortam ve koşullar içinde bile ödevin, Türk bağımsızlığını ve Cumhuriyetini kurtarmaktır! Bunun için gereken güç, damarlarındaki soylu kanda vardır"))

#Dokuman incele fonksiyonu çalıştırılır.

inspect(docs)

#Metin dönüştürülür.

toSpace <- content_transformer(function (x , pattern ) gsub(pattern, " ", x))
docs <- tm_map(docs, toSpace, "/")
docs <- tm_map(docs, toSpace, "@")
docs <- tm_map(docs, toSpace, "\|")

#Veri temizlenir.

# Metni küçük harfe dönüştür.
docs <- tm_map(docs, content_transformer(tolower))
# Metinden rakamları ayıkla.
docs <- tm_map(docs, removeNumbers)
# Çıkarılmasını istediğiniz kelimeleri ve bağlaçları çıkar.
docs <- tm_map(docs, removeWords, c("her", "için", "bile", "bir", "bütün", "daha", "beri")) 
# Noktalama işaretlerini kaldır.
docs <- tm_map(docs, removePunctuation)
# Ekstra boşlukları kaldır.
docs <- tm_map(docs, stripWhitespace)

#Kelime sıklık matrisi oluşturulduktan sonra sıralı bir şekilde ilk 10 kelimeyi data frame (veri çerçevesi) formatında getirilir.

dtm <- TermDocumentMatrix(docs)
m <- as.matrix(dtm)
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)
head(d, 10)

Yukarıdaki fonksiyonlarının çalıştırılmasıyla elde edilen sıklık çerçeve tablosu aşağıdaki gibidir.

freqtable

#Kelime bulutu oluşturularak süreç tamamlanır. Bu aşamada her defasında aynı sonuçların ve düzenin elde edilebilmesi için set.seed() ve random.order=FALSE fonksiyonları kullanılır. Kelimeleri renklerdirmek için brewer.pal() fonksiyonu kullanılır.

set.seed(1234)
wordcloud(words = d$word, freq = d$freq, min.freq = 2,
          max.words=500, random.order=FALSE, rot.per=0.35, 
          colors=brewer.pal(8, "Dark2"))

Yukarıdaki fonksiyonlarının çalıştırılmasıyla elde edilen kelime bulutunun ilk görünümü aşağıdaki gibidir.

Rplot

Görüntüyü daha görsel bir hale sokmak sokmak için yukarıda elde edilen veri çerçevesine ilişkin alternatif kelime bulutları oluşturulmuştur.

Alternatif 1: Kelime Bulutu Kod Bloğu

wordcloud2(d, size=1.6)

Yukarıdaki kod bloğu çalıştırıldığında elde edilen görünüm aşağıdaki gibidir.

Alternatif 1: Kelime Bulutu (Word Cloud)

wordcloud2-1

Alternatif 2: Kelime Bulutu Kod Bloğu

wordcloud2(d, size=1.6, color='random-light', backgroundColor="black")

Yukarıdaki kod bloğu çalıştırıldığında elde edilen görünüm aşağıdaki gibidir.

Rplot02

Alternatif 3: Kelime Bulutu Kod Bloğu

wordcloud2(d, size = 2.3, minRotation = -pi/6, maxRotation = -pi/6, rotateRatio = 1)

Yukarıdaki kod bloğu çalıştırıldığında elde edilen görünüm aşağıdaki gibidir.

Rplot03

Son alternatif de benim sizlere süprizim olsun diyeceğim ama görüyorsunuz :).

Alternatif 3: Kelime Bulutu Kod Bloğu

wordcloud2(d, size = 0.7, shape = 'star')

Yukarıdaki kod bloğu çalıştırıldığında elde edilen görünüm aşağıdaki gibidir.

Rplot04

Kelime bulutu oluşturma süreci tamamladıktan sonra bu süreci biraz daha ileriye taşıyalım. Ortaya konulan kelime bulutlarının sıklıklarına göre grafikler oluşturalım.

Alternatif 1: Grafik Kod Bloğu

install.packages("tidyverse")
library(ggplot2)
str(d)
y<-head(d, 10)
y
ggplot(y)+geom_point(aes(freq, word),col="red",size=4, shape="+")+
labs(subtitle=NULL, y="Kelime Sayısı", x="Kelimeler",title="En Çok Karşılan İlk 10 Kelime", caption = "Source:TBulut")+
xlim(2,7)+
  theme(plot.title = element_text(family = "Trebuchet MS", color="#666666", face="bold", size=18, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", color="#666666", face="bold", size=12))

Yukarıdaki kod bloğunun çalıştırılmasıyla elde edilen grafik aşağıdaki gibidir.

nutukchart-1

Alternatif 2: Grafik Kod Bloğu

install.packages("tidyverse")
library(ggplot2) 
str(d) 
y<-head(d, 10) y
ggplot(y, aes(freq, word))+geom_point(col="red", size=4)+
labs(subtitle=NULL, y="Kelimeler", x="Kelime Sayısı",title="En Çok Karşılan İlk 10 Kelime", caption = "Source:TBulut")+
xlim(2,7)+
    theme(plot.title = element_text(family = "Trebuchet MS", color="#666666", face="bold", size=18, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", color="#666666", face="bold", size=12))

Yukarıdaki kod bloğunun çalıştırılmasıyla elde edilen grafik aşağıdaki gibidir.

wordcloudnutuk-2

Faydalı olması dileğiyle.

Saygılarımla.

Not: Emeğe saygı adına, burda yapılan çalışmanın başka bir mecrada ya da ortamda paylaşılması halinde alındığı yer adının belirtilmesini rica ederim.

Yararlanılan Kaynaklar

22HarvJLTech515.pdf erişimi için tıklayın

R Programlama Diliyle Sınıflandırma Problemlerinin Çözümünde Karar Ağacı Algoritmaları Üzerine Bir Vaka Çalışması: A Case Study on Decision Tree Algorithms in Solving Classification Problems with R Programming Language

Giriş

Günümüzde veri madenciliği uygulamalarının yaygınlaşması ve büyük veri kavramının öne çıkmasıyla birlikte analiz metotları da değişmiştir.

Bugüne kadar genellikle bulut (cloud) veri tabanları üzerindeki veri setleri indirilerek analize konu ediliyordu. Ancak gelişen teknoloji veri madenciliği yöntemlerinde de önemli değişiklikler ve bazı soruları beraberinde getirmiştir. Bu sorulardan bazıları şöyledir:

  1. Online veya offline olarak dokümanlarda analize konu edilecek veri metin verisi ise nasıl analiz edilecektir?
  2. Aynı zamanda metin verisiyle birlikte numerik veri içiçe geçmişse, yani hibrit bir veri türüyle karşı karşıya kalınırsa nasıl bir yöntem izlenecektir?
  3. Ya da xlsx, txt, csv ve diğer uzantılı dokümanlar online bir platform üzerinde ise nasıl analiz edilecektir?

İşte bu soruların cevabı istatistik biliminden de beslenerek ancak ondan öte bilgisayar mühendisliği alanına giren veri madenciliğinde yatmaktadır. Bu soruların arttırılması mümkündür.

Veri madenciliğin temel amacı veriyi analize uygun hale getirmektir. Bu amaçla geliştirilmiş bir çok programlama dili bulunmaktadır. Örnek uygulama yapılacak bu çalışma kapsamında kullanılacak programlama dili R olmakla birlikte Python, Julia gibi diğer programlama dilleri de kullanılabilmektedir.

Karar ağaçları hem sınıflandırma (kategorik veriler) hemde regresyon (numerik veriler) problemlerin çözümünde kullanılabilen veri madenciliği ve makine öğrenme algoritmasıdır. Rastgele Orman algoritmaları gibi çok güçlü algoritmalar olan karar ağaçları kompleks ve büyük veri setlerinin çözümünde oldukça yararlanılan denetimli öğrenme (supervised learning) algoritmaları ailesine aittir. Bunun yanında karar ağaçları rastgele orman (random forests) algoritmalarının temel bileşenleridir.

Karar ağaçları karar destek aracı olması yanında alınan kararların görselleştirilmesine de olanak tanır. Bir karar ağacının mimarisi Şekil 1’de verilmiştir.

Şekil 1: Karar Ağacının Mimarisi (Decision Tree Architecture)

Bir karar ağacı temel olarak 4 ana düğüm (node)’den oluşur. Bunlar sırasıyla kök (root) düğüm, iç düğümler ve yaprak (leaf) düğümlerden oluşur. Bu düğümler dallar aracılığıyla birbirine bağlanır. Şekil 1’deki karar ağacı iki daldan oluşmaktadır. Terminal ve yaprak düğümleri karar düğümleridir. Şekil 1’de kök düğümden sonraki iki kısım dalları, dalların uzantıları ise yaprakları göstermektedir. Biçimsel olarak ağaçtan, işleyiş olarak ise insan karar verme süreçinden ilham almaktadır.

Karar ağaçlarında hedef değişken (target variable) kategorik ise sınıflandırma algoritması, numerik (sürekli veya kesikli) değişken ise regresyon algoritması kullanılır. Karar ağaçları pek çok alanda kullanılmakla birlikte aşağıda belirtilen bir çok alanda kendine uygulama alanı bulmaktadır:

  1. İmalat sanayi
  2. Astronomi
  3. Moleküler biyololoji
  4. Biyomedikal mühendisliği
  5. Eczacılık
  6. Planlama
  7. Tıp

Karar ağacı algoritmaları hem sınıflandırma (classification) hem de regresyon (regression) problemlerinin çözümünde kullanılan algoritmalardır. Burada aslında sınıflandırma ve regresyondan kasıt tahmin edilecek bağımlı veya hedef değişkenin veri tipi ifade edilmektedir. Sınıflandırma ve regresyon için kullanılan veri tipleri Şekil 2’de sunulmuştur. Cevap değişkeni ya da bağımlı değişken kategorik ise karar ağaçlarında sınıflandırma, bağımlı değişken nicel ise karar ağaçlarında regresyon problemini çözmüş oluyorur.

Şekil 2: Karar Ağaçlarında Problem Sınıfına Göre Veri Türleri

Karar ağaçlarında kurulan modelin veya modellerin performansını değerlendirmede kullanılan hata metrikleri ise genel itibariyle Şekil 3’te verilmiştir. Şekil 3’te yer verilen hata metrikleri gerek makine öğrenme gerekse derin öğrenme modellerinin performansının testinde sıklıkla kullanılmaktadır.

Şekil 3: Hata Metrikleri

Şekil 3’te sınıflandırma problemlerinin çözümünde kullanılan hata metriklerini şimdi de ele alalım. Karışıklık matrisi (confusion matrix) olarak adlandırılan bu matris sınıflandırma problemlerinin çözümünde hata metriklerini ortaya koyarak kurulan modelin veya modellerin hata oranını değerlendirmektedir. Hata matrisinin makine ve derin öğrenme metotlarının değerlendirilmesinde sıklıkla kullanıldığı görülmektedir. Aşağıda yer alan tabloda sınıflandırma problemlerinde hata metriklerinin hesaplanmasına esas teşkil eden tablo verilmiştir. Bu tabloyla sınıflandırma hataları hesaplanabilmektedir. Tabloda yer verilen Tip 1 hata (Type 1 error) istatistikte alfa hatasını göstermektedir. Tip 1 hata H0 hipotezi (null hpypothesis) doğru olduğu halde reddedilmesidir. Tabloda Tip 2 hata (Type II error) olarak adlandırılan hata ise istatistikte Beta hatası olarak da bilinmektedir. Tip 2 hata ise H0 hipotezi (null hpypothesis) yanlış olduğu halde kabul edilmesidir.

Kaynak: Stanford Üniversitesi

Şekil 3’te de yer verildiği üzere literatürde sınıflandırma modellerinin performansını değerlendirmede aşağıdaki metriklerden yaygın bir şekilde yararlanıldığı görülmektedir.

  • Doğruluk (Accuracy): TP+TN / TP+TN+FP+FN eşitliği ile hesaplanır. Modelin genel performansını ortaya koyar. Bu sınıflandırma metriği ile aslında biz informal bir şekilde dile getirirsek doğru tahminlerin toplam tahminler içindeki oranını hesaplamış oluyoruz.
  • Kesinlik (Precision): TP / TP+FP eşitliği ile hesaplanır. Doğru tahminlerin ne kadar kesin olduğunu gösterir.
  • Geri çağırma (Recall)TP / TP+FN eşitliği ile hesaplanır. Gerçek pozitif örneklerin oranını verir.
  • Özgünlük (Specificity): TN / TN+FP eşitliği ile hesaplanır. Gerçek negatif örneklerin oranını gösterir.
  • F1 skoru : 2TP / 2TP+FP+FN eşitliği ile hesaplanır. Dengesiz sınıflar için yararlı hibrit bir metrik olup, kesinlik (precision) ve geri çağırma (recall) skorlarının ağırlıklı ortalamasını ifade etmektedir.
  • ROC (Receiver operating characteristic): Yukarıda karışıklık matrisinde belirtilen parametrelerden yararlanılarak hesaplanır. ROC eğrisi olarak da adlandırılmaktadır. ROC eğrileri, herhangi bir tahmin modelinin doğru pozitifler (TP) ve negatifler (TN) arasında nasıl ayrım yapabileceğini görmenin güzel bir yoludur. Sınıflandırma modellerinin performansını eşik değerler üzerinden hesaplar. ROC iki parametre üzerinden hesaplanır. Doğru Pozitiflerin Oranı (TPR) ve Yanlış Pozitiflerin Oranı (FPR) bu iki parametreyi ifade eder. Burada aslında biz TPR ile Geri Çağırma (Recall), FPR ile ise 1-Özgünlük (Specificity)‘ü belirtiyoruz.
  • Cohen Kappa: Kategorik cevap seçenekleri arasındaki tutarlılığı ve uyumu gösterir. Cohen, Kappa sonucunun şu şekilde yorumlanmasını önermiştir: ≤ 0 değeri uyumun olmadığını, 0,01–0,20 çok az uyumu, 0,21-0,40 az uyumu, 0,41-0,60 orta, 0,61-0,80 iyi uyumu ve 0,81–1,00 çok iyi uyumu göstermektedir. 1 değeri ise mükemmel uyum anlamına gelmektedir.

Metodoloji ve Uygulama Sonuçları

Bu kısımda kullanılan veri setine ve adım adım karar ağacı sınıflandırma algoritmalarının uygulamasına yer verilmiştir. Analizde R programlama dili kullanılmıştır. Uygulamaya esas veri seti “iris” bitkisi veri seti olup 150 gözlem ve 6 değişkenden oluşmaktadır. Bu veri seti R’da bulunmaktadır. Veri setindeki değişkenler sırasıyla şöyledir:

  1. sepal length (cm) : Veri tipi nicel ve süreklidir.
  2. sepal width (cm) : Veri tipi nicel ve süreklidir.
  3. petal length (cm) : Veri tipi nicel ve süreklidir.
  4. petal width (cm) : Veri tipi nicel ve süreklidir.
  5. species (türler) : Veri tipi nitel ve nominaldir.
    — Iris Setosa
    — Iris Versicolour
    — Iris Virginica

Metodoloji ve uygulama sonuçları başlığı altında yapılan uygulamalar olabilecek en yalın şekilde ele alınmaya çalışılmıştır. Çalışmada amaç species (bitki türleri) hedef değişkenini diğer bağımlı değişkenler kullanılarak tahmin etmektir. Analize başlamadan önce analiz için yüklenecek R kütüphaneleri verelim. Ardından keşifsel veri analizi (EDA) ile veri setini tanıyalım.

Yüklenecek kütüphaneler

kütüphaneler = c("dplyr","tibble","tidyr","ggplot2","formattable","readr","readxl","xlsx", "pastecs","randomForest", "aod", "fpc", "DescTools","factoextra","dendextend", "viridis","ggpurr","psych","writexl","ggfortify", "rattle","caret","yardstick","MASS")

sapply(kütüphaneler, require, character.only = TRUE)

Veri setinin xlsx dosyasına yazdırılması

İhtiyaç duymanız halinde fonksiyonu ile birlikte yeniden kodlanan veri seti aşağıdaki kod yardımıyla xlsx uzantılı olarak excel dosyasına yazdırılmıştır.

#veri setinin xlsx dosyasına yazdırılması
df1<-iris
write_xlsx(df1, "veriseti.xlsx")

Yukarıdaki R kod bloğunun çalıştırılması ile edilen veri seti dosyası xlsx uzantılı olarak aşağıda verilmiştir.

Veri setindeki değişkenlerin tanımlayıcı istatistikleri

df1<-iris

ti<-describe(iris[,-5])
formattable(tibble(Değişken=names(df1[,-5]), Aralık=ti$range, Ort=ti$mean, Medyan=ti$median, Ssapma=ti$sd, Carpıklık=ti$skew, Basıklık=ti$kurtosis) %>% mutate_if(is.numeric, round, 1))

#iris bitki türüne göre tanımlayıcı istatistikler
describe.by(df1, df1$Species)

formattable(head(df1,10))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen tanımlayıcı istatistikler aşağıdaki tabloda verilmiştir.

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen iris bitkisi türlerine göre tanımlayıcı istatistikler detaylı bir şekilde aşağıdaki tabloda verilmiştir.

Descriptive statistics by group 
group: setosa
             vars  n mean   sd median trimmed  mad min max range skew
Sepal.Length    1 50 5.01 0.35    5.0    5.00 0.30 4.3 5.8   1.5 0.11
Sepal.Width     2 50 3.43 0.38    3.4    3.42 0.37 2.3 4.4   2.1 0.04
Petal.Length    3 50 1.46 0.17    1.5    1.46 0.15 1.0 1.9   0.9 0.10
Petal.Width     4 50 0.25 0.11    0.2    0.24 0.00 0.1 0.6   0.5 1.18
Species*        5 50 1.00 0.00    1.0    1.00 0.00 1.0 1.0   0.0  NaN
             kurtosis   se
Sepal.Length    -0.45 0.05
Sepal.Width      0.60 0.05
Petal.Length     0.65 0.02
Petal.Width      1.26 0.01
Species*          NaN 0.00
--------------------------------------------------------- 
group: versicolor
             vars  n mean   sd median trimmed  mad min max range  skew
Sepal.Length    1 50 5.94 0.52   5.90    5.94 0.52 4.9 7.0   2.1  0.10
Sepal.Width     2 50 2.77 0.31   2.80    2.78 0.30 2.0 3.4   1.4 -0.34
Petal.Length    3 50 4.26 0.47   4.35    4.29 0.52 3.0 5.1   2.1 -0.57
Petal.Width     4 50 1.33 0.20   1.30    1.32 0.22 1.0 1.8   0.8 -0.03
Species*        5 50 2.00 0.00   2.00    2.00 0.00 2.0 2.0   0.0   NaN
             kurtosis   se
Sepal.Length    -0.69 0.07
Sepal.Width     -0.55 0.04
Petal.Length    -0.19 0.07
Petal.Width     -0.59 0.03
Species*          NaN 0.00
--------------------------------------------------------- 
group: virginica
             vars  n mean   sd median trimmed  mad min max range  skew
Sepal.Length    1 50 6.59 0.64   6.50    6.57 0.59 4.9 7.9   3.0  0.11
Sepal.Width     2 50 2.97 0.32   3.00    2.96 0.30 2.2 3.8   1.6  0.34
Petal.Length    3 50 5.55 0.55   5.55    5.51 0.67 4.5 6.9   2.4  0.52
Petal.Width     4 50 2.03 0.27   2.00    2.03 0.30 1.4 2.5   1.1 -0.12
Species*        5 50 3.00 0.00   3.00    3.00 0.00 3.0 3.0   0.0   NaN
             kurtosis   se
Sepal.Length    -0.20 0.09
Sepal.Width      0.38 0.05
Petal.Length    -0.37 0.08
Petal.Width     -0.75 0.04
Species*          NaN 0.00

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen veri setinin ilk 10 satırı aşağıda verilmiştir.

Veri setindeki değişkenlerin özellikleri

str(df1)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra veri setindeki değişkenlerin veri tipi ve faktör (kategori) seviyeleri aşağıda verilmiştir.

'data.frame':	150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Veri setindeki eksik gözlemlerin (NAs)’nin tespiti

sapply(df1, function(x) sum(is.na(x)))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen çıktı aşağıda verilmiştir. Veri setinde eksik gözlem (missing data) bulunmamaktadır.

 Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
           0            0            0            0            0

Veri setinin eğitilecek veri setine ve test veri setine ayrılması

Bu kısımda basit tekrarsız tesadüfi örnekleme (SRS without replacement) yöntemi kullanılarak veri setindeki gözlemlerin % 70’i eğitilecek veri setine, % 30 ise test edilecek veri setine atanmıştır. Veri setinin eğitilecek veri seti ve test veri setine ayrılmasında genel olarak 70:30 kuralı uygulansa da bu kuralın mutlak olmadığı unutulmamalıdır. Veri setindeki gözlem sayısına göre 70:30 kuralı değişiklik gösterebilmektedir. Veri setindeki gözlem sayısı çok azsa 60:40, veri setindeki gözlem sayısı çok fazla ise 80:20 ve hatta 90:10 olabilmektedir. Şimdi soru burada şu olabilir; neden biz 80:20 veya 90:10 olarak belirliyoruz? Genel olarak buna verilebileceğim cevap şu: Bilgisayar işlemcisine bağlı olarak eğer çok yüksek gözlem sayıları ile çalışıyorsanız bu işlem çok uzun sürmesi kuvvetle muhtemeldir ki bu durumda test veri setinin oranını düşürmek analizinizi hızlandırır ve daha çabuk sonuç alırsınız.

set.seed(111)
orneklem<- sample(1:NROW(df1), NROW(df1)*0.7)
train <- df1[orneklem, ]  
test <- df1[-orneklem, ]

Modelin kurulması

model <- rpart(formula = Species ~ .,data = df1, method = "class")
model

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen model sonuçları aşağıda verilmiştir.

n= 150 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

1) root 150 100 setosa (0.33333333 0.33333333 0.33333333)  
  2) Petal.Length< 2.45 50   0 setosa (1.00000000 0.00000000 0.00000000) *
  3) Petal.Length>=2.45 100  50 versicolor (0.00000000 0.50000000 0.50000000)  
    6) Petal.Width< 1.75 54   5 versicolor (0.00000000 0.90740741 0.09259259) *
    7) Petal.Width>=1.75 46   1 virginica (0.00000000 0.02173913 0.97826087) *

Kurulan modele ilişkin karar ağacı

rpart.plot(model

Değişkenlerin önem düzeyleri

onem<-model$variable.importance
agirlik<-as_tibble(onem)
onemduzey<-cbind(Değişken= names(onem),  "Önem Düzeyleri"=agirlik) %>% as_tibble() %>% rename(Düzey=value)

formattable(onemduzey, 
            list(formatter(
              "span", style = ~ style(color = "grey",font.weight = "bold")),
`Düzey` = color_bar("#00FF7F")
))

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen modeldeki değişkenlerin önem düzeyleri büyükten küçüğe doğru aşağıdaki tabloda verilmiştir.

Karışıklık parametresi (complexity parameter: CP)’nin hesaplanması

printcp(model) # CP sonuçlarını diğer hata metrikleriyle verme
plotcp(model) # CP sonuçları grafiğe taşıma

Yukarıdaki kod bloğunun çalıştırılmasından sonra kurulan modele ilişkin CP değerleri aşağıda verilmiştir.

Classification tree:
rpart(formula = Species ~ ., data = df1, method = "class")

Variables actually used in tree construction:
[1] Petal.Length Petal.Width 

Root node error: 100/150 = 0.66667

n= 150 

    CP nsplit rel error xerror     xstd
1 0.50      0      1.00   1.18 0.050173
2 0.44      1      0.50   0.75 0.061237
3 0.01      2      0.06   0.10 0.030551

Yukarıdaki kod bloğunun çalıştırılmasından sonra kurulan modele ilişkin CP değerleri aşağıdaki grafikte verilmiştir.

Tahmin edilen değerler ile gözlem değerlerinin karşılaştırılması

tahmin<- predict(object = model, newdata = test, type = "class")

karsilastirma<-tibble(Gozlem=as.factor(test$Species), Tahmin=tahmin)
#ilk ve son 10 tahmin değerini gözlem değerleriyle karşılaştırma 
ilk10<-head(karsilastirma, 10) %>% rename(Gozlemİlk_10=Gozlem, Tahminİlk_10=Tahmin)
son10<-tail(karsilastirma, 10) %>% rename(GozlemSon_10=Gozlem, TahminSon_10=Tahmin)
formattable(cbind(Id=seq(1,10),ilk10, son10))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modelden elde edilen ilk ve son 10 sınıflandırma tahmini değerleri gözlemlenen sınıflandırma değerleri ile birlikte aşağıdaki tabloda karşılaştırmalı olarak verilmiştir.

Karışıklık matrisi (confusion matrix)’nin oluşturulması

Karışıklık matrisi kurulan model ile tahmin edilen hedef değişken bulgularını gözlemlenen hedef değişken bulguları ile karşılaştırır. Bu matris bir nevi sınıflandırma tablosu olup, gerçekleşen sınıflandırma bulguları ile tahmin edilen sınıflandırma bulgularının frekansı (n)’nı verir.

tahmin<- predict(object = model,  
                            newdata = test, type = "class")
karsilastirma<-tibble(Gozlem=as.factor(test$Species), Tahmin=tahmin)

cm <- karsilastirma %>%
  conf_mat(Gozlem, Tahmin)

#karışıklık matrisi (confusion matrix) grafiği
autoplot(cm, type = "heatmap)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisinin grafiği ise aşağıda verilmiştir.

Hata metrikleri

Kurulan modele ait sınıflandırma hata parametrelerinin elde edilmesine yönelik yazılan R kod bloğu aşağıda verilmiştir.

confusionMatrix(karsilastirma$Gozlem, karsilastirma$Tahmin

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen hata metrikleri bir bütün olarak hata metrikleri ile birlikte aşağıda verilmiştir. karar ağaçları metoduyla kurulan model iris bitki türlerini yaklaşık % 98 doğruluk (accuracy) oranı ile tahmin etmektedir. Uyumu gösteren Kappa katsayısı ise bu modelde 0,96 olup, tahmin edilen iris bitki türleri ile gözlemlenen bitki türleri arasında mükemmele yakın bir uyum olduğu görülmektedir. Bu bulgu aynı zamanda doğruluk oranını da doğrular niteliktedir.

Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         13         0
  virginica       0          1        16

Overall Statistics
                                          
               Accuracy : 0.9778          
                 95% CI : (0.8823, 0.9994)
    No Information Rate : 0.3556          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.9666          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 1.0000            0.9286           1.0000
Specificity                 1.0000            1.0000           0.9655
Pos Pred Value              1.0000            1.0000           0.9412
Neg Pred Value              1.0000            0.9688           1.0000
Prevalence                  0.3333            0.3111           0.3556
Detection Rate              0.3333            0.2889           0.3556
Detection Prevalence        0.3333            0.2889           0.3778
Balanced Accuracy           1.0000            0.9643           0.9828

Gözlem ve tahmin sınıflandırma sonuçlarının xlsx dosyasına yazdırılması

tahmin<- predict(object = model, newdata = test, type = "class")
karsilastirma<-tibble(Gozlem=as.factor(test$Species), Tahmin=tahmin)
write_xlsx(karsilastirma, "karsilastirma1.xlsx")

Yukarıdaki R kod bloğunun çalıştırılmasıyla elde edilen tahmin sonuçları gözlem değerleriyle birlikte xlsx uzantılı olarak aşağıdan indirebilirsiniz.

Ağaç budama işlemi (pruning)

Bu işlemde optimal karar ağaçlarına karar vermek için karışıklık parametre (CP) değeri en düşük olan değer alınarak modele sokularak kurulan model iyileştirilir. Kurulan modelin özetinde başta CP değerleri verilmişti. Ancak aşağıda yazılan küçük bir kodla tekrar verebiliriz.

#CP tablosu
cptablo<-as_tibble(model$cptable)
formattable(cptablo, 
            list(formatter(
              "span", style = ~ style(color = "grey",font.weight = "bold")),
`CP` = color_bar("#FF0000")
))
#min CP değeri
model$cptable[which.min(model$cptable[,"xerror"]),"CP"]

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen CP tablosu aşağıda verilmiştir.

Tabloda görüleceği üzere minimum CP değeri 0,01’dir. Ancak yukarıdaki kod bloğunda belirtildiği üzere doğrudan minimum CP değeri bulunmak istenirse kod bloğunun son satırındaki kodun yazılması yeterlidir.

Minimum CP değerini bulduktan sonra şimdi ağaç budama işlemini yapabiliriz aşağıda yazılan kod bloğu ile.

#minimum CP değeri
minimumcp<-model$cptable[which.min(model$cptable[,"xerror"]),"CP"]

# pruning the tree
budama<- prune(model, cp=minimumcp)
budama

#budanmış karar ağacını çizme
fancyRpartPlot(budama, uniform=TRUE,main="Budanmış Karar Ağacı")

Yukarıdaki R kod bloğu çalıştırıldıktan sonra budama işlemi yapılmış karar ağacı aşağı verilmiştir.

Budama işleminden sonra karışıklık matrisi ve hata metrikleri

Kurulan modelin budanmasından sonra sınıflandırma hata parametrelerinin elde edilmesine yönelik yazılan R kod bloğu aşağıda verilmiştir.

budama<- prune(model, cp=minimumcp)
budamatahmin<- predict(budama, test, type = 'class')

bkarsilastirma<-tibble(Gozlem=as.factor(test$Species), Tahmin=budamatahmin)
cm<-confusionMatrix(bkarsilastirma$Gozlem, bkarsilastirma$Tahmin)
cm

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen hata metrikleri bir bütün olarak hata metrikleri ile birlikte aşağıda verilmiştir. karar ağaçları metoduyla kurulan model iris bitki türlerini yaklaşık % 98 doğruluk (accuracy) oranı ile tahmin etmektedir. Uyumu gösteren Kappa katsayısı ise bu modelde 0,96 olup, tahmin edilen iris bitki türleri ile gözlemlenen bitki türleri arasında mükemmele yakın bir uyum olduğu görülmektedir. Bu bulgu aynı zamanda doğruluk oranını da doğrular niteliktedir. Budama işleminden sonra ve öncesi elde edilen doğruluk oranı, Kappa katsayı ve karışıklık matrisi değerleri aynıdır. Sonuç olarak budama işlemi (pruning) başlangıçta kurulan modelde ilave bir iyileştirme yapmamıştır.

Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         13         0
  virginica       0          1        16

Overall Statistics
                                          
               Accuracy : 0.9778          
                 95% CI : (0.8823, 0.9994)
    No Information Rate : 0.3556          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.9666          
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 1.0000            0.9286           1.0000
Specificity                 1.0000            1.0000           0.9655
Pos Pred Value              1.0000            1.0000           0.9412
Neg Pred Value              1.0000            0.9688           1.0000
Prevalence                  0.3333            0.3111           0.3556
Detection Rate              0.3333            0.2889           0.3556
Detection Prevalence        0.3333            0.2889           0.3778
Balanced Accuracy           1.0000            0.9643           0.9828

Sonuç

Bu çalışmada sınıflandırma (classification) probleminin çözümüne yönelik karar ağacı algoritmaları kullanılarak ayrıntılı karşılaştırmalı deneysel bir çalışma yapılmıştır. Ortaya konulan bulgular, sınıflandırma probleminin çok başarılı bir şekilde, diğer bir ifadeyle çok yüksek bir doğruluk oranı ve uyumluluk (Kappa katsayısı) ile çözüme kavuşturulduğu görülmektedir.

Yüksek doğruluk oranı elde edilen bir diğer algoritma olan Rastgele Orman (Random Forest) algoritması kullanarak sınıflandırma problemlerinin çözümüne yönelik yaptığım çalışma ile ilgilenenler için de linki aşağıda verilmiştir.

R Programlama Diliyle Sınıflandırma Problemlerinin Çözümünde Rastgele Orman Algoritması Üzerine Bir Vaka Çalışması

Yapılan bu çalışma ile özellikle veri bilimi (data science) ile ilgilenen akademi ve saha çalışanlarına önemli bir katkı sunulacağı düşünülmektedir.

Faydalı olması ve farkındalık oluşturması dileğiyle.

Bilimle ve teknolojiyle kalınız.

Saygılarımla.

Not: Kaynak gösterilmeden alıntı yapılamaz veya kopyalanamaz.

Note: It can not be cited or copied without referencing.

Yararlanılan Kaynaklar

R Programlama Diliyle Sınıflandırma Problemlerinin Çözümünde Küme Algoritmaları Üzerine Bir Vaka Çalışması: A Case Study on Cluster Algorithms in Solving Classification Problems with R Programming Language

Giriş

Küme geçmeden önce temel kavramları açıklamak konunun anlaşılması açısından önem taşıdığından ilk olarak kısaca bu kavramlara yer verilmiştir.

Küme, benzer özellikleri içinde barındıran topluluk olarak tanımlanabilir. Bu topluluk insan, hayvan, bitki topluluğu olabileceği gibi nesnelerin oluşturduğu topluluk da olabilir. Benzer özellikler taşıyan bu topluluklar diğer kümelerden farklılaşır.

Kümeleme (clustering) analizini ise benzer özelliklere sahip toplulukları gruplara ayırma olarak açıklayabiliriz. Bu analizle bir nevi gruplama yapılmaktadır. Bu analiz türü aynı zamanda yapay zeka öğrenme türlerinden biri olan denetimsiz öğrenme (unsupervised learning)’nin denetimsiz sınıflama (unsupervised classification) başlığı altında değerlendirilir. Çünkü denetimli öğrenme (supervised learning)’de veri önceden tanımlanmış değildir veya önceden sınıflama (denetimli sınıflama) durumu bu analiz türünde söz konusu değildir. Küme analizi bir çok alanda kullanılabilmekle birlikte öne çıkan alanlar şöyle özetlenebilir;

  • Hastalık Teşhisi
  • Tedavi Yöntemleri
  • Sigorta
  • Pazarlama
  • Arazi kullanımı
  • Şehir planlama

Küme Analiz Metodları

  • Herüstik yaklaşımlar
    1. K-Ortalama (k-means) Küme Analiz Metodu: Her bir küme, kümenin merkez noktasıyla temsil edilir.
    2. K-Medoidler (k-medoids) veya PAM Küme Analiz Metodu: Her bir küme, kümedeki nesnelerden biri tarafından temsil edilir.

Küme analizinin kalitesi, sınıf içi benzerlikleri yüksek (varyans düşük) ve kümeler arası benzerliklerin düşük (varyans yüksek) kümelerin elde edilmesine bağlıdır.

Küme algoritmaları hem sınıflandırma (classification) hem de regresyon (regression) problemlerinin çözümünde kullanılan makine öğrenmenin denetimsiz öğrenme (unsupervised) kısmında yer alan algoritmalardır. Burada aslında sınıflandırma ve regresyondan kasıt tahmin edilecek bağımlı veya hedef değişkenin veri tipi ifade edilmektedir. Sınıflandırma ve regresyon için kullanılan veri tipleri Şekil 2’de sunulmuştur. Cevap değişkeni ya da bağımlı değişken kategorik ise küme algoritmalarında sınıflandırma, bağımlı değişken nicel ise küme algoritmalarında regresyon problemini çözmüş oluyorur.

Şekil 2: Küme Analizlerinde Problem Sınıfına Göre Veri Türleri

Küme analizlerinde kurulan modelin veya modellerin performansını değerlendirmede kullanılan hata metrikleri ise genel itibariyle Şekil 3’te verilmiştir. Şekil 3’te yer verilen hata metrikleri gerek makine öğrenme gerekse derin öğrenme modellerinin performansının testinde sıklıkla kullanılmaktadır.

Şekil 3: Hata Metrikleri

Şekil 3’te sınıflandırma problemlerinin çözümünde kullanılan hata metriklerini şimdi de ele alalım. Karışıklık matrisi (confusion matrix) olarak olarak adlandırılan bu matris sınıflandırma problemlerinin çözümünde hata metriklerini ortaya koyarak kurulan modelin veya modellerin hata oranını değerlendirmektedir. Hata matrisinin makine ve derin öğrenme metotlarının değerlendirilmesinde sıklıkla kullanıldığı görülmektedir. Aşağıda yer alan tabloda sınıflandırma problemlerinde hata metriklerinin hesaplanmasına esas teşkil eden tablo verilmiştir. Bu tabloyla sınıflandırma hataları hesaplanabilmektedir. Tabloda yer verilen Tip 1 hata (Type 1 error) istatistikte alfa hatasını göstermektedir. Tip 1 hata H0 hipotezi (null hpypothesis) doğru olduğu halde reddedilmesidir. Tabloda Tip 2 hata (Type II error) olarak adlandırılan hata ise istatistikte Beta hatası olarak da bilinmektedir. Tip 2 hata ise H0 hipotezi (null hpypothesis) yanlış olduğu halde kabul edilmesidir.

Kaynak: Stanford Üniversitesi

Şekil 3’te de yer verildiği üzere literatürde sınıflandırma modellerinin performansını değerlendirmede aşağıdaki metriklerden yaygın bir şekilde yararlanıldığı görülmektedir.

  • Doğruluk (Accuracy): TP+TN / TP+TN+FP+FN eşitliği ile hesaplanır. Modelin genel performansını ortaya koyar. Bu sınıflandırma metriği ile aslında biz informal bir şekilde dile getirirsek doğru tahminlerin toplam tahminler içindeki oranını hesaplamış oluyoruz.
  • Kesinlik (Precision): TP / TP+FP eşitliği ile hesaplanır. Doğru tahminlerin ne kadar kesin olduğunu gösterir.
  • Geri çağırma (Recall)TP / TP+FN eşitliği ile hesaplanır. Gerçek pozitif örneklerin oranını verir.
  • Özgünlük (Specificity): TN / TN+FP eşitliği ile hesaplanır. Gerçek negatif örneklerin oranını gösterir.
  • F1 skoru : 2TP / 2TP+FP+FN eşitliği ile hesaplanır. Dengesiz sınıflar için yararlı hibrit bir metrik olup, kesinlik (precision) ve geri çağırma (recall) skorlarının ağırlıklı ortalamasını ifade etmektedir.
  • ROC (Receiver operating characteristic): Yukarıda karışıklık matrisinde belirtilen parametrelerden yararlanılarak hesaplanır. ROC eğrisi olarak da adlandırılmaktadır. ROC eğrileri, herhangi bir tahmin modelinin doğru pozitifler (TP) ve negatifler (TN) arasında nasıl ayrım yapabileceğini görmenin güzel bir yoludur. Sınıflandırma modellerinin performansını eşik değerler üzerinden hesaplar. ROC iki parametre üzerinden hesaplanır. Doğru Pozitiflerin Oranı (TPR) ve Yanlış Pozitiflerin Oranı (FPR) bu iki parametreyi ifade eder. Burada aslında biz TPR ile Geri Çağırma (Recall), FPR ile ise 1-Özgünlük (Specificity)‘ü belirtiyoruz.
  • Cohen Kappa: Kategorik cevap seçenekleri arasındaki tutarlılığı ve uyumu gösterir. Cohen, Kappa sonucunun şu şekilde yorumlanmasını önermiştir: ≤ 0 değeri uyumun olmadığını, 0,01–0,20 çok az uyumu, 0,21-0,40 az uyumu, 0,41-0,60 orta, 0,61-0,80 iyi uyumu ve 0,81–1,00 çok iyi uyumu göstermektedir. 1 değeri ise mükemmel uyum anlamına gelmektedir.

Metodoloji ve Uygulama Sonuçları

Bu kısımda kullanılan veri setine ve adım adım küme algoritmalarının uygulamasına yer verilmiştir. Analizde R programlama dili kullanılmıştır. Uygulamaya esas veri seti “iris” bitkisi veri seti olup 150 gözlem ve 6 değişkenden oluşmaktadır. Bu veri seti R’da bulunmaktadır. Veri setindeki değişkenler sırasıyla şöyledir:

  1. sepal length (cm) : Veri tipi nicel ve süreklidir.
  2. sepal width (cm) : Veri tipi nicel ve süreklidir.
  3. petal length (cm) : Veri tipi nicel ve süreklidir.
  4. petal width (cm) : Veri tipi nicel ve süreklidir.
  5. species (türler) : Veri tipi nitel ve nominaldir.
    — Iris Setosa
    — Iris Versicolour
    — Iris Virginica

Metodoloji ve uygulama sonuçları başlığı altında olabilecek en yalın şekilde ele alınmaya çalışılmıştır. Çalışmada amaç species hedef değişkenini diğer bağımlı değişkenler kullanılarak tahmin etmektir. Bu kısımda k-ortalamalar (k-means) ve k-medoidler (k-medoids) hata metrikleri açısından performansları karşılaştırılmıştır. Analize başlamadan önce analiz için yüklenecek R kütüphaneleri verelim. Ardından keşifsel veri analizi (EDA) ile veri setini tanıyalım.

Yüklenecek kütüphaneler

kütüphaneler = c("dplyr","tibble","tidyr","ggplot2","formattable","readr","readxl","xlsx", "pastecs","randomForest", "aod", "fpc", "DescTools","factoextra","dendextend", "viridis","ggpurr","psych","writexl","ggfortify", "caret","cluster", "yardstick","MASS")

sapply(kütüphaneler, require, character.only = TRUE)

Veri setinin xlsx dosyasına yazdırılması

İhtiyaç duymanız halinde fonksiyonu ile birlikte yeniden kodlanan veri seti aşağıdaki kod yardımıyla xlsx uzantılı olarak excel dosyasına yazdırılmıştır.

#veri setinin xlsx dosyasına yazdırılması
write_xlsx(df1, "veriseti.xlsx")

Yukarıdaki R kod bloğunun çalıştırılması ile edilen veri seti dosyası xlsx uzantılı olarak aşağıda verilmiştir.

Veri setindeki değişkenlerin tanımlayıcı istatistikleri

df1<-iris

ti<-describe(iris[,-5])
formattable(tibble(Değişken=names(df1[,-5]), Aralık=ti$range, Ort=ti$mean, Medyan=ti$median, Ssapma=ti$sd, Carpıklık=ti$skew, Basıklık=ti$kurtosis) %>% mutate_if(is.numeric, round, 1))

#iris bitki türüne göre tanımlayıcı istatistikler
describe.by(df1, df1$Species)

formattable(head(df1,10))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen tanımlayıcı istatistikler aşağıdaki tabloda verilmiştir.

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen iris bitkisi türlerine göre tanımlayıcı istatistikler detaylı bir şekilde aşağıdaki tabloda verilmiştir.

Descriptive statistics by group 
group: setosa
             vars  n mean   sd median trimmed  mad min max range skew
Sepal.Length    1 50 5.01 0.35    5.0    5.00 0.30 4.3 5.8   1.5 0.11
Sepal.Width     2 50 3.43 0.38    3.4    3.42 0.37 2.3 4.4   2.1 0.04
Petal.Length    3 50 1.46 0.17    1.5    1.46 0.15 1.0 1.9   0.9 0.10
Petal.Width     4 50 0.25 0.11    0.2    0.24 0.00 0.1 0.6   0.5 1.18
Species*        5 50 1.00 0.00    1.0    1.00 0.00 1.0 1.0   0.0  NaN
             kurtosis   se
Sepal.Length    -0.45 0.05
Sepal.Width      0.60 0.05
Petal.Length     0.65 0.02
Petal.Width      1.26 0.01
Species*          NaN 0.00
--------------------------------------------------------- 
group: versicolor
             vars  n mean   sd median trimmed  mad min max range  skew
Sepal.Length    1 50 5.94 0.52   5.90    5.94 0.52 4.9 7.0   2.1  0.10
Sepal.Width     2 50 2.77 0.31   2.80    2.78 0.30 2.0 3.4   1.4 -0.34
Petal.Length    3 50 4.26 0.47   4.35    4.29 0.52 3.0 5.1   2.1 -0.57
Petal.Width     4 50 1.33 0.20   1.30    1.32 0.22 1.0 1.8   0.8 -0.03
Species*        5 50 2.00 0.00   2.00    2.00 0.00 2.0 2.0   0.0   NaN
             kurtosis   se
Sepal.Length    -0.69 0.07
Sepal.Width     -0.55 0.04
Petal.Length    -0.19 0.07
Petal.Width     -0.59 0.03
Species*          NaN 0.00
--------------------------------------------------------- 
group: virginica
             vars  n mean   sd median trimmed  mad min max range  skew
Sepal.Length    1 50 6.59 0.64   6.50    6.57 0.59 4.9 7.9   3.0  0.11
Sepal.Width     2 50 2.97 0.32   3.00    2.96 0.30 2.2 3.8   1.6  0.34
Petal.Length    3 50 5.55 0.55   5.55    5.51 0.67 4.5 6.9   2.4  0.52
Petal.Width     4 50 2.03 0.27   2.00    2.03 0.30 1.4 2.5   1.1 -0.12
Species*        5 50 3.00 0.00   3.00    3.00 0.00 3.0 3.0   0.0   NaN
             kurtosis   se
Sepal.Length    -0.20 0.09
Sepal.Width      0.38 0.05
Petal.Length    -0.37 0.08
Petal.Width     -0.75 0.04
Species*          NaN 0.00

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen veri setinin ilk 10 satırı aşağıda verilmiştir.

Veri setindeki değişkenlerin özellikleri

str(df1)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra veri setindeki değişkenlerin veri tipi ve faktör (kategori) seviyeleri aşağıda verilmiştir.

'data.frame':	150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Veri setindeki eksik gözlemlerin (NAs)’nin tespiti

sapply(df1, function(x) sum(is.na(x)))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen çıktı aşağıda verilmiştir. Veri setinde eksik gözlem (missing data) bulunmamaktadır.

 Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
           0            0            0            0            0

Model 1: K Ortalamalar (K Means) Metodu

1 nolu modelin oluşturulması

set.seed(1923)
sonuc <- kmeans(df1[,-5], 3)
sonuc

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen model sonuçları aşağıda verilmiştir.

K-means clustering with 3 clusters of sizes 21, 33, 96

Cluster means:
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1     4.738095    2.904762     1.790476   0.3523810
2     5.175758    3.624242     1.472727   0.2727273
3     6.314583    2.895833     4.973958   1.7031250

Clustering vector:
  [1] 2 1 1 1 2 2 2 2 1 1 2 2 1 1 2 2 2 2 2 2 2 2 2 2 1 1 2 2 2 1 1 2 2 2 1 2
 [37] 2 2 1 2 2 1 1 2 2 1 2 1 2 2 3 3 3 3 3 3 3 1 3 3 1 3 3 3 3 3 3 3 3 3 3 3
 [73] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3 1 3 3 3 3 3 3 3 3 3
[109] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[145] 3 3 3 3 3 3

Within cluster sum of squares by cluster:
[1]  17.669524   6.432121 118.651875
 (between_SS / total_SS =  79.0 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"    
[5] "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault"     

Karışıklık matrisi (confusion matrix)’nin oluşturulması

Karışıklık matrisi kurulan model ile tahmin edilen hedef değişken bulgularını gözlemlenen hedef değişken bulguları ile karşılaştırır. Bu matris bir nevi sınıflandırma tablosu olup, gerçekleşen sınıflandırma bulguları ile tahmin edilen sınıflandırma bulgularının frekansı (n)’nı verir.

karsilastirma<-tibble(Küme=ifelse(sonuc$cluster==1, "setosa",ifelse(sonuc$cluster==2, "versicolor", "virginica")), Tahmin=df1$Species)%>% group_by(Küme, Tahmin) %>% summarise(Sayi=n()) 
karsilastirma %>% spread(Tahmin, Sayi, fill = 0)

#alternatif

karsilastirmak<-tibble(Gercek=ifelse(sonuc$cluster==1, "setosa",ifelse(sonuc$cluster==2, "versicolor", "virginica")), Tahmin=df1$Species)%>% mutate_if(is.character, as.factor)
cm <- karsilastirmak %>%
  conf_mat(Tahmin, Gercek)
cm
#karışıklık matriks (confusion matrix) grafiği
autoplot(cm, type = "heatmap

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisi aşağıda tabloda verilmiştir.

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisinin grafiği ise aşağıda verilmiştir.

Hata metrikleri

Kurulan 1 nolu modele ait hata parametrelerinin elde edilmesine yönelik yazılan R kod bloğu aşağıda verilmiştir.

confusionMatrix(karsilastirmak$Gercek, karsilastirmak$Tahmin)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen hata metrikleri bir bütün olarak hata metrikleri ile birlikte aşağıda verilmiştir. K-ortalamalar metoduyla kurulan model iris bitki türlerini yaklaşık % 45 doğruluk (accuracy) oranı ile tahmin etmektedir. Uyumu gösteren Kappa katsayısı ise bu modelde 0,17 olup, tahmin edilen iris bitki türleri ile gözlemlenen bitki türleri arasında uyumun çok düşük olduğu göstermektedir. Bu bulgu aynı zamanda doğruluk oranını da doğrular niteliktedir.

Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         17          4         0
  versicolor     33          0         0
  virginica       0         46        50

Overall Statistics
                                          
               Accuracy : 0.4467          
                 95% CI : (0.3655, 0.5299)
    No Information Rate : 0.3333          
    P-Value [Acc > NIR] : 0.002528        
                                          
                  Kappa : 0.17            
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 0.3400            0.0000           1.0000
Specificity                 0.9600            0.6700           0.5400
Pos Pred Value              0.8095            0.0000           0.5208
Neg Pred Value              0.7442            0.5726           1.0000
Prevalence                  0.3333            0.3333           0.3333
Detection Rate              0.1133            0.0000           0.3333
Detection Prevalence        0.1400            0.2200           0.6400
Balanced Accuracy           0.6500            0.3350           0.7700

Gözlem ve tahmin sınıflandırma sonuçlarının xlsx dosyasına yazdırılması

kortalama<-tibble(Gözlem=ifelse(sonuc$cluster==1, "setosa",ifelse(sonuc$cluster==2, "versicolor", "virginica")), Tahmin=df1$Species)
write_xlsx(kortalama, "kortalama.xlsx")

Yukarıdaki R kod bloğunun çalıştırılmasıyla elde edilen tahmin sonuçları gözlem değerleriyle birlikte xlsx uzantılı olarak aşağıdan indirebilirsiniz.

Kümelerin grafikle gösterilmesi

set.seed(1923)
sonuc <- kmeans(df1[,-5], 3)
fviz_cluster(sonuc, df1[, -5], ellipse.type = "norm")

Yukarıdaki R kod bloğunun yazılmasından sonra elde k-ortalamalar küme grafiği aşağıda verilmiştir. Kümelerin çok iç içe girdiği birbirinden ayrışmadığı görülmektedir. Bu durum sınıflandırmanın çok da iyi olmadığını göstermektedir.

Model 2: K-Medoidler (K Medoids) Metodu

2 nolu modelin oluşturulması

set.seed(1900)
psonuc <- pamk(df1[,-5],3)
psonuc

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen model sonuçları aşağıda verilmiştir.

$pamobject
Medoids:
      ID Sepal.Length Sepal.Width Petal.Length Petal.Width
[1,]   8          5.0         3.4          1.5         0.2
[2,]  79          6.0         2.9          4.5         1.5
[3,] 113          6.8         3.0          5.5         2.1
Clustering vector:
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [37] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [73] 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3
[109] 3 3 3 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3
[145] 3 3 2 3 3 2
Objective function:
    build      swap 
0.6709391 0.6542077 

Available components:
 [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
 [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"      

$nc
[1] 3

$crit
[1] 0.000000 0.000000 0.552819

Karışıklık matrisi (confusion matrix)’nin oluşturulması

karsilastirma<-tibble(Küme=ifelse(psonuc$pamobject$clustering==1, "setosa",ifelse(psonuc$pamobject$clustering==2, "versicolor", "virginica")), Tahmin=df1$Species)%>% group_by(Küme, Tahmin) %>% summarise(Sayi=n()) 
karsilastirma<-karsilastirma %>% spread(Tahmin, Sayi, fill = 0)
formattable(karsilastirma)

#alternatif

karsilastirmat<-tibble(Gercek=ifelse(psonuc$pamobject$clustering==1, "setosa",ifelse(psonuc$pamobject$clustering==2, "versicolor", "virginica")), Tahmin=df1$Species)%>% mutate_if(is.character, as.factor)
cm <- karsilastirmat %>%
  conf_mat(Tahmin, Gercek)
cm
#karışıklık matriks (confusion matrix) grafiği
autoplot(cm, type = "heatmap")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisi aşağıda tabloda verilmiştir.

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisinin grafiği ise aşağıda verilmiştir.

Hata metrikleri

Kurulan 2 nolu modele ait hata metriklerinin elde edilmesine yönelik yazılan R kod bloğu aşağıda verilmiştir.

confusionMatrix(karsilastirmak$Gercek, karsilastirmak$Tahmin)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen hata metrikleri bir bütün olarak hata metrikleri ile birlikte aşağıda verilmiştir. K-medoidler metoduyla kurulan model iris bitki türlerini % 89 doğruluk (accuracy) oranı ile tahmin etmektedir. Uyumu gösteren Kappa katsayısı ise bu modelde 0,84 olup, tahmin edilen iris bitki türleri ile gözlemlenen bitki türleri arasında uyumun çok yüksek olduğu göstermektedir. Bu bulgu aynı zamanda yüksek doğruluk oranını da doğrular niteliktedir.

            Truth
Prediction   setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         48        14
  virginica       0          2        36
Confusion Matrix and Statistics

            Reference
Prediction   setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         48        14
  virginica       0          2        36

Overall Statistics
                                          
               Accuracy : 0.8933          
                 95% CI : (0.8326, 0.9378)
    No Information Rate : 0.3333          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.84            
                                          
 Mcnemar's Test P-Value : NA              

Statistics by Class:

                     Class: setosa Class: versicolor Class: virginica
Sensitivity                 1.0000            0.9600           0.7200
Specificity                 1.0000            0.8600           0.9800
Pos Pred Value              1.0000            0.7742           0.9474
Neg Pred Value              1.0000            0.9773           0.8750
Prevalence                  0.3333            0.3333           0.3333
Detection Rate              0.3333            0.3200           0.2400
Detection Prevalence        0.3333            0.4133           0.2533
Balanced Accuracy           1.0000            0.9100           0.8500

Gözlem ve tahmin sınıflandırma sonuçlarının xlsx dosyasına yazdırılması

kmedoidler<-tibble(Gözlem=ifelse(psonuc$pamobject$clustering==1, "setosa",ifelse(psonuc$pamobject$clustering==2, "versicolor", "virginica")), Tahmin=df1$Species)
write_xlsx(kmedoidler, "kmedoidler.xlsx")

Yukarıdaki R kod bloğunun çalıştırılmasıyla elde edilen tahmin sonuçları gözlem değerleriyle birlikte xlsx uzantılı olarak aşağıdan indirebilirsiniz.

Kümelerin grafikle gösterilmesi

set.seed(1900)
psonuc <- pam(df1[,-5],3)
fviz_cluster(psonuc, geom = "point", ellipse.type = "norm")

Yukarıdaki R kod bloğunun yazılmasından sonra elde edilen k-medoidler küme grafiği aşağıda verilmiştir.

Sonuç

Bu çalışmada sınıflandırma (classification) probleminin çözümüne yönelik küme analiz metodlarından k-ortalama ve k-medoidler kullanılarak ayrıntılı karşılaştırmalı deneysel bir çalışma yapılmıştır. Ortaya konulan bulgular, sınıflandırma probleminin k-medoidler tarafından başarılı bir şekilde, diğer bir ifadeyle yüksek bir doğruluk oranıyla çözüme kavuşturulduğu görülmektedir.

Her iki yöntem sınıflandırma hata metrikleri açısından karşılaştırıldığında öne çıkan bulgular şöyledir: K-medoidler bağımlı değişken olan “species” değişkenini çok daha iyi tahmin etmektedir. Bu yöntemde doğruluk (accuracy) oranı % 89,3 düzeyindeyken, k-ortalamalar yönteminde bu oran yaklaşık % 45 düzeyinde kalmıştır. Diğer bir ifadeyle k-medoidler yöntemi bağımlı değişkeni k-ortalamalar yönteminden neredeyse iki kat daha iyi tahmin etmektedir. Elde edilen sonuçların uyumunu gösteren Kappa katsayısı da bunun iyi bir göstergesidir. Yüksek katsayı yüksek uyumu gösterir ve bu istenen bir durumdur. K-ortalamalar yönteminden elde Kappa katsayısı çok düşük (0,17) iken, bu katsayı k-medoidler yönteminde çok yüksek (0,84)’tir.

Yapılan bu çalışma ile özellikle veri bilimi (data science) ile ilgilenen akademi ve saha çalışanlarına önemli bir katkı sunulacağı düşünülmektedir.

Faydalı olması ve farkındalık oluşturması dileğiyle.

Bilimle ve teknolojiyle kalınız.

Saygılarımla.

Not: Kaynak gösterilmeden alıntı yapılamaz veya kopyalanamaz.

Note: It can not be cited or copied without referencing.

Yararlanılan Kaynaklar

R Programlama Diliyle Regresyon Problemlerinin Çözümünde Rastgele Orman Algoritması Üzerine Bir Vaka Çalışması: A Case Study on Random Forest (RF) Algorithm in Solving Regression Problems with R Programming Language

Giriş

Rastgele Orman (RF) algoritması , 2001 yılında Breiman tarafından karar ağaçlarının bir kombinasyonu olarak önerilmiştir. RF en iyi “her ağaç, bağımsız olarak örneklenen ve ormandaki tüm ağaçlar için aynı dağılıma sahip rastgele bir vektörün değerlerine bağlı olacak şekilde ağaç belirleyicilerinin kombinasyonu” olarak tanımlanan bir topluluk makine öğrenme algoritmasıdır. Topluluk algoritması gerek regresyon gerekse sınıflandırma problemlerinde varyansı ve hatayı azaltarak daha iyi hedef değişken veya bağımlı değişkeni tahmin etmemize olanak tanır. Bunu da yeniden örnekleme yöntemi (bootstrap aggregation or bagging)’yle yapar. Bu yöntemde sırasıyla tesadüfi tekrarlı örneklem yöntemi (simple random sampling with replacement) kullanılarak veri seti alt örneklem kümelerine, diğer bir ifade ile alt örneklem ağaç kümelerine ayrılır. Bunların tamamı kurulan modelde hatayı azaltmaya yöneliktir. Anlatılanı Şekil 1 üzerinde gösterelim. Şekilde modellerin paralel düzende inşa edildiğine dikkat etmek gerekir. Modellerin oluşturulmasında çaprazlama bulunmamaktadır.

Şekil 1: Rastgele Orman Algoritmasında Yeniden Örnekleme (Bootstrapping)

RF, karar ağaçlarına dayanır. Makine öğreniminde karar ağaçları, tahmin modelleri oluşturan denetimli öğrenme tekniğidir. Bunlara karar ağaçları (decision trees) adı verilmektedir. Bu yöntemin özellikle mühendislik bilimlerinde başta sağlık sektörü olmak üzere pek çok sektörde yaygın bir şekilde kullanıldığı görülmektedir.

Rastgele orman algoritmaları hem sınıflandırma (classification) hem de regresyon (regression) problemlerinin çözümünde kullanılan makine öğrenmenin denetimli öğrenme (supervised) kısmında yer alan tahmin oranı yüksek algoritmalardır. Burada aslında sınıflandırma ve regresyondan kasıt tahmin edilecek bağımlı veya hedef değişkenin veri tipi ifade edilmektedir. Sınıflandırma ve regresyon için kullanılan veri tipleri Şekil 2’de sunulmuştur. Cevap değişkeni ya da bağımlı değişken kategorik ise rastgele orman algoritmasında sınıflandırma, bağımlı değişken nicel ise rastgele orman algoritmasında regresyon problemini çözmüş oluyoruz. RF analizlerde uç değerler (outliers)’e duyarlı değildir.

Şekil 2: Rastgele Orman (RF) Algoritmasında Proplem Sınıfına Göre Veri Tüleri

RF’te kurulan modelin veya modellerin performansını değerlendirmede kullanılan hata metrikleri ise genel itibariyle Şekil 3’te verilmiştir. Şekil 3’te yer verilen hata metrikleri gerek makine öğrenme gerekse derin öğrenme modellerinin performansının testinde sıklıkla kullanılmaktadır.

Şekil 3: Rastgele Orman Algoritması Hata Metrikleri

Şekil 3’te sınıflandırma problemlerinin çözümünde kullanılan hata metriklerini şimdi de ele alalım. Karışıklık matrisi (confusion matrix) olarak olarak adlandırılan bu matris sınıflandırma problemlerinin çözümünde hata metriklerini ortaya koyarak kurulan modelin veya modellerin hata oranını değerlendirmektedir. Hata matrisinin makine ve derin öğrenme metotlarının değerlendirilmesinde sıklıkla kullanıldığı görülmektedir. Aşağıda yer alan tabloda hata metriklerinin hesaplanmasına esas teşkil eden tablo verilmiştir. Bu tabloyla sınıflandırma hataları hesaplanabilmektedir. Tabloda yer verilen Tip 1 hata (Type 1 error) istatistikte alfa hatasını göstermektedir. Tip 1 hata H0 hipotezi (null hpypothesis) doğru olduğu halde reddedilmesidir. Tabloda Tip 2 hata (Type II error) olarak adlandırılan hata ise istatistikte Beta hatası olarak da bilinmektedir. Tip 2 hata ise H0 hipotezi (null hpypothesis) yanlış olduğu halde kabul edilmesidir.

Kaynak: Stanford Üniversitesi

Şekil 3’te de yer verildiği üzere literatürde sınıflandırma modellerinin performansını değerlendirmede aşağıdaki metriklerden yaygın bir şekilde yararlanıldığı görülmektedir. Sınıflandırma problemlerinin çözümüne yönelik Rastgele Orman Algoritması (RF) kullanarak R’da yapmış olduğum çalışmanın linkini ilgilenenler için aşağıda veriyorum.

R Programlama Diliyle Sınıflandırma Problemlerinin Çözümünde Rastgele Orman Algoritması Üzerine Bir Vaka Çalışması: A Case Study on Random Forest (RF) Algorithm in Solving Classification Problems with R Programming Language

Sınıflandırma Metrikleri

  • Doğruluk (Accuracy): TP+TN / TP+TN+FP+FN eşitliği ile hesaplanır. Modelin genel performansını ortaya koyar. Bu sınıflandırma metriği ile aslında biz informal bir şekilde dile getirirsek doğru tahminlerin toplam tahminler içindeki oranını hesaplamış oluyoruz.
  • Kesinlik (Precision): TP / TP+FP eşitliği ile hesaplanır. Doğru tahminlerin ne kadar kesin olduğunu gösterir.
  • Geri çağırma (Recall)TP / TP+FN eşitliği ile hesaplanır. Gerçek pozitif örneklerin oranını verir.
  • Özgünlük (Specificity): TN / TN+FP eşitliği ile hesaplanır. Gerçek negatif örneklerin oranını gösterir.
  • F1 skoru : 2TP / 2TP+FP+FN eşitliği ile hesaplanır. Dengesiz sınıflar için yararlı hibrit bir metrik olup, kesinlik (precision) ve geri çağırma (recall) skorlarının ağırlıklı ortalamasını ifade etmektedir.
  • ROC (Receiver operating characteristic): Yukarıda karışıklık matrisinde belirtilen parametrelerden yararlanılarak hesaplanır. ROC eğrisi olarak da adlandırılmaktadır. ROC eğrileri, herhangi bir tahmin modelinin doğru pozitifler (TP) ve negatifler (TN) arasında nasıl ayrım yapabileceğini görmenin güzel bir yoludur. Sınıflandırma modellerin perfomansını eşik değerler üzerinden hesaplar. ROC iki parametre üzerinden hesaplanır. Doğru Pozitiflerin Oranı (TPR) ve Yanlış Pozitiflerin Oranı (FPR) bu iki parametreyi ifade eder. Burada aslında biz TPR ile Geri Çağırma (Recall), FPR ile ise 1-Özgünlük (Specificity)‘ü belirtiyoruz.
  • Cohen Kappa: Kategorik cevap seçenekleri arasındaki tutarlılığı ve uyumu gösterir. Cohen, Kappa sonucunun şu şekilde yorumlanmasını önermiştir: ≤ 0 değeri uyumun olmadığını, 0,01–0,20 çok az uyumu, 0,21-0,40 az uyumu, 0,41-0,60 orta, 0,61-0,80 iyi uyumu ve 0,81–1,00 çok iyi uyumu göstermektedir. 1 değeri ise mükemmel uyum anlamına gelmektedir.

Şekil 3’te yer verilen regresyon modellerinin performansını değerlendirmede literatürde aşağıdaki metriklerden yaygın bir şekilde yararlanılmaktadır. Regresyon metrikleri eştiliklerinin verilmesi yerine sade bir anlatımla neyi ifade ettiği anlatılacaktır. Böylece formüllere boğulmamış olacaksınız.

Regresyon Metrikleri

  • SSE (Sum of Square Error): Tahmin edilen değerler ile gözlem değerleri arasındaki farkların kareleri toplamını ifade eder.
  • MSE (Mean Square Error): Ortalama kare hatası olarak adlandırılan bu hata tahmin edilen değerler ile gözlem değerleri arasındaki farkların karelerinin ortalamasını ifade eder.
  • RMSE (Root Mean Square Error): Kök ortalama kare hatası olarak adlandırılan bu hata ortalama kare hatasının karekökünü ifade etmektedir.
  • MAE (Mean Absolute Error): Ortalama mutlak hata olarak adlandırılan bu hata türü ise tahmin edilen değerler ile gözlem değerleri arasındaki farkların mutlak değerlerinin ortalamasını ifade etmektedir.
  • MAPE (Mean Absolute Percentage Error): Ortalama mutlak yüzdesel hata olarak adlandırılan bu hata türünde ilk olarak tahmin edilen değerler ile gözlem değerleri arasındaki farkların mutlak değerleri hesaplanır. Daha sonra hesaplanan farkları mutlak değerleri mutlak değerleri alınan gözlem değerlerine bölünür. En son durumda ise elde edilen bu değerlerin ortalaması alınır.
  • Bias: Tahmin edilen değerler ile gözlem değerleri arasındaki farkların ortalamasıdır. Bu yönüyle ortalama mutlak hata (MAE)’ya benzemektedir.

Regresyon metriklerini anlattıktan sonra daha kalıcı olması ve öğrenilmesi adına hazırladığım excel üzerinde bahsedilen bu metriklerin nasıl hesaplandığı gösterilmiştir. Excel dosyasını aşağıdaki linkten indirebilirsiniz.

Metodoloji ve Uygulama Sonuçları

Bu kısımda kullanılan veri setine ve adım adım Rastgele Orman algoritmasının regresyon problemlerinin çözümünde nasıl uygulandığına yer verilmiştir. Analizde R programlama dili kullanılmıştır. Uygulamaya esas veri seti Amerikan Ulusal Ekonomik Araştırmalar Bürosu (the National Bureau of Economic Research) kısa adıyla NBER’in resmi web sitesinden alınmıştır. Web sitesinin linki: https://data.nber.org/ dir. Veri setinin alındığı linkin tam adı ise http://data.nber.org/nberces/nberces5811/naics5811.xls dir.

Veri seti 1958’den 2011’e kadar ABD imalat sektöründeki katma değer ve toplam faktör verimliliği (TFV) göstergelerinden oluşan zengin ve hacmi geniş bir veri setidir. Orjinal (ingilizce) xlsx uzantılı veri setini aşağıdaki linkten indirebilirsiniz. Veri setindeki toplam gözlem sayısı 25542, değişken sayısı ise 25’tir.

R’da analize uygun hale getirdiğim aynı veri setinin Türkçe versiyonunu ise aşağıdaki linkten indirebilirsiniz. Veri setinin Türkçeye çevrilmesinin nedeni anlaşılırlığın artırılmak istenmesidir.

Veri seti “sira” hariç 8 değişkenden oluşmakta olup, anlaşılırlığı artırmak adına Türkçeye çevrilmiştir. Değişkenlerin tamamının veri türü nicel ve sürekli olup orjinal (ingilizce) adlarıyla birlikte aşağıda verilmiştir:

  1. tistihdam: Toplam istihdamı göstermekte olup, orjinal veri setindeki adı “emp” dir. İstihdam değerleri 1000’e bölünerek verilmiştir. Bağımsız değişken olarak alınmıştır.
  2. maas: Sektör çalışanlarının maaşlarını göstermekte olup, orjinal veri setindeki adı “pay” dir. Maaş değerleri 1 milyon $’a bölünerek verilmiştir. Bağımsız değişken olarak alınmıştır.
  3. iistihdam: Üretim bandında çalışanların sayısını göstermekte olup, orjinal veri setindeki adı “prode” dur. Çalışan sayısı değerleri 1000’e bölünerek verilmiştir. Bağımsız değişken olarak alınmıştır.
  4. icsaati: Üretim bandında çalışanların çalışma saatlerini göstermekte olup, orjinal veri setindeki adı “prodeh” dır. Çalışma saatleri 1 milyona bölünerek verilmiştir. Bağımsız değişken olarak alınmıştır.
  5. sbu: Üretim bandında çalışanların ücretlerini göstermekte olup, orjinal veri setindeki adı “prodew” dır. Çalışma ücretleri 1 milyon $’a bölünerek verilmiştir. Bağımsız değişken olarak alınmıştır.
  6. netsatis: Ne satışları göstermekte olup, orjinal veri setindeki adı “vship” tir. Net satışlar 1 milyon $’a bölünerek verilmiştir. Bağımsız değişken olarak alınmıştır.
  7. mmaliyeti: Malzeme maliyetlerini göstermekte olup, orjinal veri setindeki adı “matcost” tur. Maliyetler 1 milyon $’a bölünerek verilmiştir. Bağımsız değişken olarak alınmıştır.
  8. katmadeger: Katma değeri göstermekte olup, orjinal veri setindeki adı “vadd” tir. Katma değer 1 milyon $’a bölünerek verilmiştir. Bağımlı / hedef değişken (target variable) olarak alınmıştır.

Çalışmanın amacı yukarıda belirtilen bağımsız değişkenler ile bağımlı değişken olan “katmadeger” değişkenini tahmin etmektir.

Metodoloji ve uygulama sonuçları başlığı altında Rastgele Orman algoritmasına üzerine kurulan modeller olabilecek en yalın şekilde karşılaştırmalı olarak ele alınmaya çalışılmıştır. Daha sonra kurulan bu modeller hata metrikleri açısından karşılaştırılmıştır.

Analize başlamadan önce analiz için yüklenecek R kütüphaneleri verelim. Ardından keşifsel veri analizi (EDA) ile veri setini tanıyalım.

Yüklenecek kütüphaneler

kütüphaneler = c("dplyr","tibble","tidyr","ggplot2","formattable","readr","readxl","xlsx", "pastecs","randomForest", "aod", "DescTools", "ggpurr","psych","writexl","ggfortify", "caret","Metrics", "performanceEstimation", "yardstick","MASS")

sapply(kütüphaneler, require, character.only = TRUE)

Veri setinin kaynak web sitesinden okunması

url <- "http://data.nber.org/nberces/nberces5811/naics5811.xls"
dosyaadi <- "naics5811.xls"
curl::curl_download(url, dosyaadi)
veri <- read_excel(dosyaadi)
veri

Veri setinin Türkçeye dönüştürülmesi ve analiz değişkenlerinin belirlenmesi

df<-veri[,3:10] %>% as_tibble() %>% rename(tistihdam=emp, maas=pay, iistihdam=prode, icsaati=prodh, sbu=prodw, netsatis=vship, mmaliyeti=matcost, katmadeger=vadd) %>% rowid_to_column() %>% rename(sira=rowid)
df

Veri setindeki eksik gözlemlerin (Missing Data: NA) tespit edilmesi ve veri setinden çıkarılması

#Eksik gözlemlerin (NAs) sayısının değişkene göre belirlenmesi
nan<-sapply(df, function(x) sum(is.na(x))) %>% as_tibble()
nan<-cbind(Değişken=names(df), n=nan) %>% as_tibble()
formattable(nan)

#Eksik gözlemlerin (NAs) veri setinden çıkarılması
df1<-na.omit(df)
nan1<-sapply(df1, function(x) sum(is.na(x))) %>% as_tibble()
nan1<-cbind(Değişken=names(df), n=nan1) %>% as_tibble()
formattable(nan1)

#ilk 10 kayıt
formattable(head(df1, 10))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra veri setinde değişkenlere göre belirlenen eksik veri (NA) diğer bir ifadeyle eksik gözlem sayısı aşağıdaki tabloda verilmiştir.

Yukarıdaki R kod bloğunun çalıştırılmasından sonra veri setinde değişkenlere göre belirlenen eksik gözlemler veri setinden çıkarılmış olup aşağıdaki tabloda son durumda veri setindeki eksik gözlem sayıları gösterilmiştir.

Veri setinin xlsx dosyasına yazdırılması

İhtiyaç duymanız halinde fonksiyonu ile birlikte eksik gözlemler (NAs)’den arındırılmış veri seti aşağıdaki kod yardımıyla xlsx uzantılı olarak excel dosyasına yazdırılmıştır.

writexl::write_xlsx(df1, "verisetiturkcekayipsizveri.xlsx")

Yukarıdaki R kod bloğunun çalıştırılması ile edilen veri seti dosyası xlsx uzantılı olarak aşağıda verilmiştir.

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen veri setinin ilk 10 satırı aşağıda verilmiştir.

Veri setindeki değişkenlerin özellikleri

str(df1)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra veri setindeki değişkenlerin veri tipleri, gözlem sayılarıyla birlikte aşağıda verilmiştir.

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	25386 obs. of  9 variables:
 $ sira      : int  1 2 3 4 5 6 7 8 9 10 ...
 $ tistihdam : num  18 17.9 17.7 17.5 17.6 17.1 16.6 16 16.1 16.7 ...
 $ maas      : num  81.3 82.5 84.8 87.4 90.2 89.8 90.8 90.8 96.1 105 ...
 $ iistihdam : num  12 11.8 11.7 11.5 11.5 11 10.6 10.2 10.2 11 ...
 $ icsaati   : num  25.7 25.5 25.4 25.4 25.2 23.9 23.5 22.7 22.6 23.9 ...
 $ sbu       : num  49.8 49.4 50 51.4 52.1 52.1 52.2 51.8 53.9 61.3 ...
 $ netsatis  : num  1042 1051 1050 1120 1176 ...
 $ mmaliyeti : num  752 759 753 804 853 ...
 $ katmadeger: num  267 269 270 288 294 ...
 - attr(*, "na.action")= 'omit' Named int  1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 ...
  ..- attr(*, "names")= chr  "1729" "1730" "1731" "1732" ...

Tanımlayıcı istatistikler

ti<-describe(df1[,-1])
formattable(tibble(Değişken=names(df1[,-1]), Aralık=ti$range, Ort=ti$mean, Medyan=ti$median, Ssapma=ti$sd, Carpıklık=ti$skew, Basıklık=ti$kurtosis) %>% mutate_if(is.numeric, round, 1))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen tanımlayıcı istatistikler aşağıdaki tabloda verilmiştir.

Değişkenler arasındaki korelasyon

Nicel ve sürekli değişkenlerin korelasyon katsayılarını hesaplamak için Pearson korelasyon katsayısı kullanılmış olup, yazılan R kod bloğu aşağıdadır.

com<-round(cor(df1[,-1]), 1)
com<-cbind(Değisken=names(df[,-1]), com) %>% as_tibble()
formattable(com)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen korelasyon katsayıları aşağıdaki tabloda verilmiştir.

Veri setinin eğitilecek veri ve test setine ayrılması

set.seed(1919)
#Eğitilecek veri seti (training set)
train1 <- df1 %>% sample_frac(.70)
train1
#Test edilecek veri seti
test1  <- anti_join(df1, train1, by = 'sira')#Anti join fonksiyonu eşleşmeyen kayıtları yani geri kalan kayıtları getirir ve onları test setine atar.
test1

Model 1

1 nolu modelin oluşturulması

model1<-randomForest(katmadeger ~ ., train1[,-1])

print(model1)

summary(model1)

plot(model1, main="Model 1: Rastgele Orman (RF) Algoritmasının Hata Oranı")

Yukarıdaki kod bloğunun çalıştırılmasından sonra kurulan modele ilişkin açıklanan varyans (% 96,05) aşağıda verilmiştir.

Call:
 randomForest(formula = katmadeger ~ ., data = train1[, -1]) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 2

          Mean of squared residuals: 956776.9
                    % Var explained: 96.05

Yukarıdaki kod bloğunun çalıştırılmasından sonra çizilen modelin grafiği aşağıda verilmiştir. Bu grafik rastgele orman modelindeki regresyon hata oranlarını göstermektedir. Ağaç sayısı (ntree) arttıkça hata oranı sıfıra yaklaşır ve belirli noktadan sonra durağanlaşır. Burada ağaç sayısının az olması elde edilecek sonuçların varyansını artırarak hatayı yükseltir.

1 nolu modeldeki değişkenlerin önem düzeyleri

k<-importance(model1)
k<-tibble(Değişken=as.vector(row.names(k)), Dugum_Safligi=as.vector(importance(model1)))%>%arrange(desc(Dugum_Safligi))
formattable(k, 
            list(formatter(
              "span", style = ~ style(color = "grey",font.weight = "bold")),
`Dugum_Safligi` = color_bar("#00FF7F")
))

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen modeldeki değişkenlerin önem düzeyleri düğüm saflıkları (Inc Node Purity)’na göre büyükten küçüğe doğru aşağıdaki tabloda verilmiştir.

Tahmin edilen değerler ile gözlem değerlerinin karşılaştırılması

pred1<-predict(model1, test1)

karsilastirma<-tibble(Gercek=test1$katmadeger, Tahmin=pred1)

#ilk ve son 10 tahmin değerini gerçek değerle karşılaştırma 
ilk10<-head(karsilastirma, 10) %>% rename(Gercekİlk_10=Gercek, Tahminİlk_10=Tahmin) %>% mutate_if(is.numeric, round, 1)

son10<-tail(karsilastirma, 10) %>% rename(GercekSon_10=Gercek, TahminSon_10=Tahmin) %>% mutate_if(is.numeric, round, 1)

formattable(cbind(Sıra=seq(1,10),ilk10, son10))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modelden elde edilen ilk ve son 10 gözlem değerleri ile tahmin değerleri aşağıdaki tabloda karşılaştırmalı olarak verilmiştir.

Regresyon metrikleri

Kurulan 1 nolu modele ait hata metriklerinin elde edilmesine yönelik yazılan R kod bloğu aşağıda verilmiştir.

karsilastirma<-tibble(Gercek=test1$katmadeger, Tahmin=pred1)
metrik<-tibble(SSE=sse(karsilastirma$Gercek, karsilastirma$Tahmin), MSE=mse(karsilastirma$Gercek, karsilastirma$Tahmin),RMSE=rmse(karsilastirma$Gercek, karsilastirma$Tahmin), MAE= mae(karsilastirma$Gercek, karsilastirma$Tahmin),MAPE= mape(karsilastirma$Gercek, karsilastirma$Tahmin), Bias= bias(karsilastirma$Gercek, karsilastirma$Tahmin))%>% mutate_if(is.numeric, round, 1)
formattable(metrik)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait hata parametre değerleri aşağıda verilmiştir.

Çapraz performans testi (Cross validation test)

Çapraz performans testi veri setindeki gözlem sayısına ve bilgisayar işlemci kapasitelerine bağlı olarak uzun sürebilmektedir. Sabırlı olmakta fayda var 🙂

set.seed(1919)
cv<- performanceEstimation(
  PredTask(katmadeger ~ ., df1[,-1]),
    workflowVariants(learner=("randomForest")),
 EstimationTask(metrics = c("mse", "mae", "rmse"),
                method = CV(nReps = 1, nFolds = 10)))
summary(cv)
plot(cv)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait elde edilen performans parametre değerleri aşağıda verilmiştir.

== Summary of a  Cross Validation Performance Estimation Experiment ==

Task for estimating  mse,mae,rmse  using
 1 x 10 - Fold Cross Validation
	 Run with seed =  1234 

* Predictive Tasks ::  df1[, -1].katmadeger
* Workflows  ::  randomForest 

-> Task:  df1[, -1].katmadeger
  *Workflow: randomForest 
              mse       mae      rmse
avg      757383.7 195.22316  842.1489
std      399589.1  17.73925  231.3462
med      600792.8 190.91481  774.9974
iqr      722966.5  27.63886  415.4534
min      277804.7 168.18802  527.0718
max     1310045.6 222.07900 1144.5722
invalid       0.0   0.00000    0.0000

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait elde edilen performans parametre değerleri aşağıdaki grafikte verilmiştir.

Model 2

2 nolu modelin oluşturulması

which.min(model1$mse)#1. modelde büyütülecek ağaçlarının sayısını minimum yapan hata

set.seed(1920)
model2<-randomForest(katmadeger ~ ., train1[,-1], ntree=54, mtry=8/3)#modelde mtyr her bölümde rastgele aday olarak örneklenen değişken sayısını (p=değişken sayısı/3) göstermektedir. 

print(model2)

summary(model2)

plot(model2, main="Model 2: Rastgele Orman (RF) Algoritmasının Hata Oranı")

Yukarıdaki kod bloğunun çalıştırılmasından sonra kurulan modele ilişkin açıklanan varyans (% 97,26) aşağıda verilmiştir.

Call:
 randomForest(formula = katmadeger ~ ., data = train1[, -1], ntree = 54,      mtry = 8/3) 
               Type of random forest: regression
                     Number of trees: 54
No. of variables tried at each split: 3

          Mean of squared residuals: 719121.7
                    % Var explained: 97.26

Yukarıdaki kod bloğunun çalıştırılmasından sonra çizilen modelin grafiği aşağıda verilmiştir. Bu grafik rastgele orman modelindeki regresyon hata oranlarını göstermektedir. Ağaç sayısı (ntree) arttıkça hata oranı sıfıra yaklaşır ve belirli noktadan sonra durağanlaşır. Burada ağaç sayısının çok az veya fazla olması elde edilecek sonuçların varyansını artırarak hatayı yükseltebilir.

2 nolu modeldeki değişkenlerin önem düzeyleri

k<-importance(model2)
k<-tibble(Değişken=as.vector(row.names(k)), Dugum_Safligi=as.vector(importance(model2)))%>%arrange(desc(Dugum_Safligi))
k

formattable(k, 
            list(formatter(
              "span", style = ~ style(color = "grey",font.weight = "bold")),
`Dugum_Safligi` = color_bar("#B0C4DE")
))

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen modeldeki değişkenlerin önem düzeyleri düğüm saflıkları (Inc Node Purity)’na göre büyükten küçüğe doğru aşağıdaki tabloda verilmiştir.

Regresyon metrikleri

Kurulan 2 nolu modele ait hata metriklerinin elde edilmesine yönelik yazılan R kod bloğu aşağıda verilmiştir.

pred2<-predict(model2, test1)

karsilastirma2<-tibble(Gercek=test1$katmadeger, Tahmin=pred2)

metrik<-tibble(SSE=sse(karsilastirma2$Gercek, karsilastirma2$Tahmin), MSE=mse(karsilastirma2$Gercek, karsilastirma2$Tahmin),RMSE=rmse(karsilastirma2$Gercek, karsilastirma2$Tahmin), MAE= mae(karsilastirma2$Gercek, karsilastirma2$Tahmin),MAPE= mape(karsilastirma2$Gercek, karsilastirma2$Tahmin), Bias= bias(karsilastirma2$Gercek, karsilastirma2$Tahmin))%>% mutate_if(is.numeric, round, 1)
formattable(metrik)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 2 nolu modele ait hata parametre değerleri aşağıda verilmiştir.

set.seed(1920)
cv<- performanceEstimation(
  PredTask(katmadeger ~ ., df1[,-1]),
  workflowVariants(learner="randomForest", learner.pars=list(ntree=54, mtry=8/3)),
 EstimationTask(metrics = c("mse", "mae", "rmse"),
                method = CV(nReps = 1, nFolds = 10)))
summary(cv)

#rankWorkflows(cv, top = 3)

plot(cv)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 2 nolu modele ait elde edilen performans parametre değerleri aşağıda verilmiştir.

== Summary of a  Cross Validation Performance Estimation Experiment ==

Task for estimating  mse,mae,rmse  using
 1 x 10 - Fold Cross Validation
	 Run with seed =  1234 

* Predictive Tasks ::  df1[, -1].katmadeger
* Workflows  ::  randomForest 

-> Task:  df1[, -1].katmadeger
  *Workflow: randomForest 
              mse       mae      rmse
avg      620028.2 154.33328  767.2455
std      311613.2  14.63084  186.6741
med      545472.8 154.55071  736.9520
iqr      295773.3  20.45502  201.6927
min      309424.4 123.09429  556.2593
max     1231557.9 167.92314 1109.7558
invalid       0.0   0.00000    0.0000

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 2 nolu modele ait elde edilen performans parametre değerleri aşağıdaki grafikte verilmiştir.

Sonuç

Bu çalışmada regresyon (regression) probleminin çözümüne yönelik Rastgele Orman (RF) algoritması kullanılarak ayrıntılı deneysel bir çalışma yapılmıştır. Ortaya konulan bulgular, kurulan regresyon modelleri içerisinde 1. modeldeki bağımsız değişkenler bağımlı değişkendeki varyansın % 96’sını, 2. model ise varyansın % 97’sini açıklamaktadır. Modellere ilişkin çapraz performans testi sonuçları aşağıdaki tabloda verilmiş olup, 2. modelde üretilen ortalamalar hatalar 1. modele göre daha az olduğu için 2. model bağımlı değişken olan “katmadeger” i daha iyi tahmin ettiği söylenebilir.

ModelMSEMAERMSE
Model 1757383.7195.2842.2
Model 2620028.2154.3767,3

Yapılan bu çalışmanın özellikle veri bilimi (data science) ile ilgilenen akademi ve saha çalışanlarına önemli bir katkı sunacağı düşünülmektedir.

Faydalı olması ve farkındalık oluşturması dileğiyle.

Bilimle ve teknolojiyle kalınız.

Saygılarımla.

Not: Kaynak gösterilmeden alıntı yapılamaz veya kopyalanamaz.

Note: It can not be cited or copied without referencing.

Yararlanılan Kaynaklar

R Programlama Diliyle Sınıflandırma Problemlerinin Çözümünde Rastgele Orman Algoritması Üzerine Bir Vaka Çalışması: A Case Study on Random Forest (RF) Algorithm in Solving Classification Problems with R Programming Language

Giriş

Rastgele Orman (RF) algoritması , 2001 yılında Breiman tarafından karar ağaçlarının bir kombinasyonu olarak önerilmiştir. RF en iyi “her ağaç, bağımsız olarak örneklenen ve ormandaki tüm ağaçlar için aynı dağılıma sahip rastgele bir vektörün değerlerine bağlı olacak şekilde ağaç belirleyicilerinin kombinasyonu” olarak tanımlanan bir topluluk makine öğrenme algoritmasıdır. Topluluk algoritması gerek regresyon gerekse sınılandırma problemlerinde varyansı ve hatayı azaltarak daha iyi hedef değişken veya bağımlı değişkeni tahmin etmemize olanak tanır. Bunu da yeniden örnekleme yöntemi (bootstrap aggregation or bagging)’yle yapar. Bu yöntemde sırasıyla tesadüfi tekrarlı örneklem yöntemi (simple random sampling with replacement) kullanılarak veri seti alt örneklem kümelerine, diğer bir ifade ile alt örneklem ağaç kümelerine ayrılır. Bunların tamamı kurulan modelde hatayı azaltmaya yöneliktir. Anlatılanı Şekil 1 üzerinde gösterelim. Şekilde modellerin paralel düzende inşa edildiğine dikkat etmek gerekir. Modellerin oluşturulmasında çaprazlama bulunmamaktadır.

Şekil 1: Rastgele Orman Algoritmasında Yeniden Örnekleme (Bootstrapping)

RF, karar ağaçlarına dayanır. Makine öğreniminde karar ağaçları, tahmin modelleri oluşturan denetimli öğrenme tekniğidir. Bunlara karar ağaçları (decision trees) adı verilmektedir. Bu yöntemin özellikle mühendislik bilimlerinde başta sağlık sektörü olmak üzere pek çok sektörde yaygın bir şekilde kullanıldığı görülmektedir.

Rastgele orman algoritmaları hem sınıflandırma (classification) hem de regresyon (regression) problemlerinin çözümünde kullanılan makine öğrenmenin denetimli öğrenme (supervised) kısmında yer alan tahmin oranı yüksek algoritmalardır. Burada aslında sınıflandırma ve regresyondan kasıt tahmin edilecek bağımlı veya hedef değişkenin veri tipi ifade edilmektedir. Sınıflandırma ve regresyon için kullanılan veri tipleri Şekil 2’de sunulmuştur. Cevap değişkeni ya da bağımlı değişken kategorik ise rastgele orman algoritmasında sınıflandırma, bağımlı değişken nicel ise rastgele orman algoritmasında regresyon problemini çözmüş oluyoruz. RF analizlerde uç değerler (outliers)’e duyarlı değildir.

Şekil 2: Rastgele Orman (RF) Algoritmasında Proplem Sınıfına Göre Veri Tüleri

RF’te kurulan modelin veya modellerin performansını değerlendirmede kullanılan hata metrikleri ise genel itibariyle Şekil 3’te verilmiştir. Şekil 3’te yer verilen hata metrikleri gerek makine öğrenme gerekse derin öğrenme modellerinin performansının testinde sıklıkla kullanılmaktadır.

Şekil 3: Rastgele Orman Algoritması Hata Metrikleri

Şekil 3’te sınıflandırma problemlerinin çözümünde kullanılan hata metriklerini şimdi de ele alalım. Karışıklık matrisi (confusion matrix) olarak olarak adlandırılan bu matris sınıflandırma problemlerinin çözümünde hata metriklerini ortaya koyarak kurulan modelin veya modellerin hata oranını değerlendirmektedir. Hata matrisinin makine ve derin öğrenme metotlarının değerlendirilmesinde sıklıkla kullanıldığı görülmektedir. Aşağıda yer alan tabloda hata metriklerinin hesaplanmasına esas teşkil eden tablo verilmiştir. Bu tabloyla sınıflandırma hataları hesaplanabilmektedir. Tabloda yer verilen Tip 1 hata (Type 1 error) istatistikte alfa hatasını göstermektedir. Tip 1 hata H0 hipotezi (null hpypothesis) doğru olduğu halde reddedilmesidir. Tabloda Tip 2 hata (Type II error) olarak adlandırılan hata ise istatistikte Beta hatası olarak da bilinmektedir. Tip 2 hata ise H0 hipotezi (null hpypothesis) yanlış olduğu halde kabul edilmesidir.

Kaynak: Stanford Üniversitesi

Şekil 3’te de yer verildiği üzere literatürde sınıflandırma modellerinin performansını değerlendirmede aşağıdaki metriklerden yaygın bir şekilde yararlanıldığı görülmektedir.

  • Doğruluk (Accuracy): TP+TN / TP+TN+FP+FN eşitliği ile hesaplanır. Modelin genel performansını ortaya koyar. Bu sınıflandırma metriği ile aslında biz informal bir şekilde dile getirirsek doğru tahminlerin toplam tahminler içindeki oranını hesaplamış oluyoruz.
  • Kesinlik (Precision): TP / TP+FP eşitliği ile hesaplanır. Doğru tahminlerin ne kadar kesin olduğunu gösterir.
  • Geri çağırma (Recall)TP / TP+FN eşitliği ile hesaplanır. Gerçek pozitif örneklerin oranını verir.
  • Özgünlük (Specificity): TN / TN+FP eşitliği ile hesaplanır. Gerçek negatif örneklerin oranını gösterir.
  • F1 skoru : 2TP / 2TP+FP+FN eşitliği ile hesaplanır. Dengesiz sınıflar için yararlı hibrit bir metrik olup, kesinlik (precision) ve geri çağırma (recall) skorlarının ağırlıklı ortalamasını ifade etmektedir.
  • ROC (Receiver operating characteristic): Yukarıda karışıklık matrisinde belirtilen parametrelerden yararlanılarak hesaplanır. ROC eğrisi olarak da adlandırılmaktadır. ROC eğrileri, herhangi bir tahmin modelinin doğru pozitifler (TP) ve negatifler (TN) arasında nasıl ayrım yapabileceğini görmenin güzel bir yoludur. Sınıflandırma modellerin perfomansını eşik değerler üzerinden hesaplar. ROC iki parametre üzerinden hesaplanır. Doğru Pozitiflerin Oranı (TPR) ve Yanlış Pozitiflerin Oranı (FPR) bu iki parametreyi ifade eder. Burada aslında biz TPR ile Geri Çağırma (Recall), FPR ile ise 1-Özgünlük (Specificity)‘ü belirtiyoruz.
  • Cohen Kappa: Kategorik cevap seçenekleri arasındaki tutarlılığı ve uyumu gösterir. Cohen, Kappa sonucunun şu şekilde yorumlanmasını önermiştir: ≤ 0 değeri uyumun olmadığını, 0,01–0,20 çok az uyumu, 0,21-0,40 az uyumu, 0,41-0,60 orta, 0,61-0,80 iyi uyumu ve 0,81–1,00 çok iyi uyumu göstermektedir. 1 değeri ise mükemmel uyum anlamına gelmektedir.

Metodoloji ve Uygulama Sonuçları

Bu kısımda kullanılan veri setine ve adım adım Rastgele Orman algoritması uygulamasına yer verilmiştir. Analizde R programlama dili kullanılmıştır. Uygulamaya esas veri seti https://archive.ics.uci.edu/ml/machine-learning-databases/car/&#8221; veri tabanından alınmıştır. Veri seti araba seçimi yapan bireylerin cevaplarından oluşmaktadır. Orjinal (ingilizce) veri setini aşağıdaki linkten indirebilirsiniz.

R’da analize uygun hale getirdiğim aynı veri setinin Türkçe versiyonunu ise aşağıdaki linkten indirebilirsiniz. Veri setinin Türkçeye çevrilmesinin nedeni anlaşılırlığın artırılmak istenmesidir.

Veri seti ID (Sıra) hariç 7 değişkenden oluşmakta olup, anlaşılırlığı artırmak adına Türkçeye çevrilerek yeniden kodlanmıştır. Değişkenlerin tamamının veri türü kategorik olup değişkenler sırasıyla şöyledir:

  1. Fiyat: Araba fiyatlarını belirtmekte olup , “Düşük”, “Orta”, “Yüksek” ve “Çok Yüksek” cevap seviyelerinden oluşmaktadır.
  2. Bakım: Araba bakımını belirtmekte olup , “Düşük”, “Orta”, “Yüksek” ve “Çok Yüksek” cevap seviyelerinden oluşmaktadır.
  3. Kapı: Arabadaki kapı sayısını belirtmekte olup “5 ve Yukarı”, “2”, “3” ve “4” cevap seviyelerinden oluşmaktadır.
  4. Kişi: Arabanın kaç kişilik olduğunu göstermekte olup “5 ve Yukarı”, “2” ve “4” cevap seviyelerinden oluşmaktadır.
  5. Bagaj: Arabadaki bagaj hacmini değerlendirmeye yönelik “Büyük”, “Orta” ve “Küçük” cevap seviyelerinden oluşmaktadır.
  6. Güvenlik: Arabanın oluşturduğu güvenlik algısını değerlendirmeye yönelik “Yüksek”, “Orta” ve “Düşük” cevap seviyelerinden oluşmaktadır.
  7. Karar: Araba satın alma durumunu değerlendirmeye yönelik “Kabul”, “İyi”, “Red” ve “Çok İyi” cevap seviyelerinden oluşmaktadır.

Metodoloji ve uygulama sonuçları başlığı altında Rastgele Orman algoritmasına üzerine kurulan iki model olabilecek en yalın şekilde ele alınmaya çalışılmıştır. Daha sonra kurulan bu iki model hata metrikleri açısından performansları karşılaştırılmıştır. Analize başlamadan önce analiz için yüklenecek R kütüphaneleri verelim. Ardından keşifsel veri analizi (EDA) ile veri setini tanıyalım.

Yüklenecek kütüphaneler

kütüphaneler = c("dplyr","tibble","tidyr","ggplot2","formattable","readr","readxl","xlsx", "pastecs","randomForest", "aod", "DescTools", "readstata13","viridis","ggpurr","writexl","ggfortify", "caret", "yardstick","MASS")
sapply(kütüphaneler, require, character.only = TRUE)

Veri setinin okunması ve değişken kategorilerinin yeniden kodlanması

df <- read.csv("car.data", header=FALSE) %>% as_tibble()
df <- df %>% rename(Fiyat=V1, Bakim=V2, Kapi=V3, Kisi=V4, Bagaj=V5, Guvenlik=V6, Karar=V7) %>% rowid_to_column() %>% rename(ID=rowid)
df
df1<-df %>% mutate(Fiyat=recode_factor(Fiyat, "low"="Düşük", "med"="Orta", "high"="Yüksek", "vhigh"="Çok Yüksek"))%>% mutate(Bakim=recode_factor(Bakim, "low"="Düşük", "med"="Orta", "high"="Yüksek", "vhigh"="Çok Yüksek")) %>% mutate (Kapi= recode_factor(Kapi, "5more" = "5 ve Yukarı")) %>% mutate (Kisi= recode_factor(Kisi, "more" = "5 ve Yukarı")) %>% mutate (Bagaj= recode_factor(Bagaj, "big" = "Büyük", "med" = "Orta", "small" = "Küçük")) %>% mutate (Guvenlik= recode_factor(Guvenlik, "high" = "Yüksek", "med" = "Orta", "low" = "Düşük"))%>% mutate (Karar= recode_factor(Karar, "acc" = "Kabul", "good" = "İyi", "unacc" = "Red","vgood" = "Çok İyi"))
df1
formattable(head(df1))

Veri setinin xlsx dosyasına yazdırılması

İhtiyaç duymanız halinde fonksiyonu ile birlikte yeniden kodlanan veri seti aşağıdaki kod yardımıyla xlsx uzantılı olarak excel dosyasına yazdırılmıştır.

write_xlsx(df1, "veriseti.xlsx")

Yukarıdaki R kod bloğunun çalıştırılması ile edilen veri seti dosyası xlsx uzantılı olarak aşağıda verilmiştir.

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen veri setinin ilk 6 satırı aşağıda verilmiştir.

Veri setindeki değişkenlerin özellikleri

str(df1)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra veri setindeki değişkenlerin veri tipi ve faktör (kategori) seviyeleri aşağıda verilmiştir.

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	1728 obs. of  8 variables:
 $ ID      : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Fiyat   : Factor w/ 4 levels "Düşük","Orta",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ Bakim   : Factor w/ 4 levels "Düşük","Orta",..: 4 4 4 4 4 4 4 4 4 4 ...
 $ Kapi    : Factor w/ 4 levels "5 ve Yukarı",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ Kisi    : Factor w/ 3 levels "5 ve Yukarı",..: 2 2 2 2 2 2 2 2 2 3 ...
 $ Bagaj   : Factor w/ 3 levels "Büyük","Orta",..: 3 3 3 2 2 2 1 1 1 3 ...
 $ Guvenlik: Factor w/ 3 levels "Yüksek","Orta",..: 3 2 1 3 2 1 3 2 1 3 ...
 $ Karar   : Factor w/ 4 levels "Kabul","İyi",..: 3 3 3 3 3 3 3 3 3 3 ...

Veri setindeki eksik gözlemlerin tespiti

sapply(df1, function(x) sum(is.na(x)))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen çıktı aşağıda verilmiştir.

 ID    Fiyat    Bakim     Kapi     Kisi    Bagaj Guvenlik    Karar 
  0        0        0        0        0        0        0        0 

Değişkenler arasındaki korelasyon

Kategorik değişkenlerin korelasyon katsayılarını hesaplamak için yazılan R kod bloğu aşağıdadır. Değişkenler arasındaki korelasyonu hesaplamak için Kikare testi kullanılmıştır. Bunun nedeni korelasyon katsayısı hesaplanacak her iki değişkenin de nitel ve nominal olmasından kaynaklanmaktadır. Korelasyon katsayısı hesaplanacak değişkenlerden biri ordinal (sıralı) olsaydı bu durumda Spearman korelasyon (SpearmanRho) katsayısının hesaplanması gerekecekti. Diğer taraftan, eğer her iki değişken nicel (sürekli ve kesikli) olsaydı bu durumda Pearson korelasyon katsayısını hesaplayacaktık.

p<-data.frame(lapply(df1[,-c(1,8)], function(x) chisq.test(table(x,df1$Karar), simulate.p.value = TRUE)$p.value))
pvalue<-p %>% as_tibble() %>% pivot_longer(cols = Fiyat:Guvenlik, names_to="Degisken", values_to = "p") %>% mutate(Sonuc=ifelse(p<0.05,"Anlamlı", "Anlamlı Değil")) %>% mutate_if(is.numeric, round, 4)
chi<-data.frame(lapply(df1[,-c(1,8)], function(x) chisq.test(table(x,df1$Karar), simulate.p.value = TRUE)$statistic))
chivalue<-chi %>% as_tibble() %>% pivot_longer(cols = Fiyat:Guvenlik, names_to="Degisken", values_to = "Kikare Test İstatistiği")%>% mutate_if(is.numeric, round, 2)
formattable(cbind(chivalue, pvalue[,-1]))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen korelasyon katsayıları aşağıdaki tabloda verilmiştir.

Veri setinin eğitilecek ve test setine ayrılması

set.seed(1)
#Eğitilecek veri seti (training set)
train1 <- df1 %>% sample_frac(.70)
train1
#Test edilecek veri seti
test1  <- anti_join(df1, train1, by = 'ID')#Anti join fonksiyonu eşleşmeyen kayıtları yani geri kalan kayıtları getirir ve onları test setine atar.
test1

Model 1

1 nolu modelin oluşturulması

model1<-randomForest(Karar ~ ., train1[,-1])
model1
summary(model1)
plot(model1, main="Model 1: Rastgele Orman (RF) Algoritmasının Hata Oranı")

Yukarıdaki kod bloğunun oluşturulmasından sonra çizilen 1 nolu modelin grafiği aşağıda verilmiştir. Bu grafik rastgele orman modelinin sınıf hata oranlarını göstermektedir. Ağaç sayısı arttıkça hata oranı sıfıra yaklaşır.

1 nolu modeldeki değişkenlerin önem düzeyleri

k<-importance(model1)
k<-tibble(Değişken=as.vector(row.names(k)), Ortalama_Gini_Katsayısı=as.vector(importance(model1)))%>%arrange(desc(Ortalama_Gini_Katsayısı))
formattable(k)
ggplot(k, aes(x=Ortalama_Gini_Katsayısı, y = Değişken, label=round(Ortalama_Gini_Katsayısı,2)))+
   geom_point()+
    xlab("Ortalama Gini Katsayısı")+
    ylab("Değişken")+
    geom_text(vjust = 0, nudge_y = 0.1)+
    theme_hc()

Yukarı kod bloğunun çalıştırılmasından sonra elde edilen modeldeki değişkenlerin önem düzeyleri ortalama gini katsayısına göre büyükten küçüğe doğru aşağıdaki tabloda verilmiştir.

Yukarı kod bloğunun çalıştırılmasından sonra elde edilen modeldeki değişkenlerin önem düzeylerine ilişkin grafik ise aşağıda verilmiştir.

Tahmin edilen değerler ile gözlem değerlerinin karşılaştırılması

pred1<-predict(model1, test1)
karsilastirma<-tibble(Gercek=test1$Karar, Tahmin=pred1)
#ilk ve son 10 tahmin değerini gerçek değerle karşılaştırma 
ilk10<-head(karsilastirma, 10) %>% rename(Gercekİlk_10=Gercek, Tahminİlk_10=Tahmin)
son10<-tail(karsilastirma, 10) %>% rename(GercekSon_10=Gercek, TahminSon_10=Tahmin)
formattable(cbind(Id=seq(1,10),ilk10, son10))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modelden elde edilen ilk ve son 10 sınıflandırma değerleri gerçekleşen sınıflandırma değerleri ile birlikte aşağıdaki tabloda karşılaştırmalı olarak verilmiştir.

Karışıklık matrisi (confusion matrix)’nin oluşturulması

pred1<-predict(model1, test1)
karsilastirma<-tibble(Gercek=test1$Karar, Tahmin=pred1)
#alternatif cm ve grafik
cm <- karsilastirma %>%
  conf_mat(Gercek, Tahmin)
cm
autoplot(cm, type = "heatmap")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisi aşağıda verilmiştir.

     Truth
Prediction Kabul İyi Red Çok İyi
   Kabul     118   1   4       1
   İyi         1  22   2       0
   Red         7   0 345       0
   Çok İyi     0   4   0      13

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisinin grafiği ise aşağıda verilmiştir.

Hata parametreleri

Kurulan 1 nolu modele ait hata parametrelerinin elde edilmesine yönelik yazılan R kod bloğu aşağıda verilmiştir.

cm<-confusionMatrix(karsilastirma$Tahmin, karsilastirma$Gercek)
cm

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait hata parametre değerleri aşağıda verilmiştir.

Confusion Matrix and Statistics
          Reference
Prediction Kabul İyi Red Çok İyi
   Kabul     118   1   4       1
   İyi         1  22   2       0
   Red         7   0 345       0
   Çok İyi     0   4   0      13
Overall Statistics
                                         
               Accuracy : 0.9614         
                 95% CI : (0.941, 0.9763)
    No Information Rate : 0.6776         
    P-Value [Acc > NIR] : < 2.2e-16      
                                         
                  Kappa : 0.9192         
                                         
 Mcnemar's Test P-Value : NA             
Statistics by Class:
                     Class: Kabul Class: İyi Class: Red Class: Çok İyi
Sensitivity                0.9365    0.81481     0.9829        0.92857
Specificity                0.9847    0.99389     0.9581        0.99206
Pos Pred Value             0.9516    0.88000     0.9801        0.76471
Neg Pred Value             0.9797    0.98986     0.9639        0.99800
Prevalence                 0.2432    0.05212     0.6776        0.02703
Detection Rate             0.2278    0.04247     0.6660        0.02510
Detection Prevalence       0.2394    0.04826     0.6795        0.03282
Balanced Accuracy          0.9606    0.90435     0.9705        0.96032

Bağımlı değişken kategorilerine göre sınıflandırma metrikleri

class<-cm$byClass#sınıfa göre hata oranları
class<-class %>% as_tibble(class) %>% add_column(Class = c("Kabul", "İyi", "Red", "Çok İyi"), .before = "Sensitivity")
class
class1<-class[, c(1, 2,3,6, 7, 8)]
pivot<-class1 %>% pivot_longer(-Class, names_to = "Parameters", values_to = "Değer")
ggplot(pivot, aes(x="", y = Değer, fill = Class))+
geom_bar(position="stack", stat="identity")+
scale_fill_viridis(discrete = T, option = "E")+
facet_grid(Class~  Parameters)+
xlab("")+
labs(fill = "Kategori")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen bağımlı değişken kategorilerine göre sınıflandırma metrikleri aşağıdaki grafikte verilmiştir.

Çapraz performans testi (Cross validation test)

set.seed(124)
cv<- performanceEstimation(
  PredTask(Karar ~ ., df1[,-1]),
    workflowVariants(learner=("randomForest")),
 EstimationTask(metrics = c("acc","err"),
                method = CV(nReps = 1, nFolds = 10)))
summary(cv)
plot(cv)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait elde edilen performans parametre değerleri aşağıda verilmiştir.

== Summary of a  Cross Validation Performance Estimation Experiment ==
Task for estimating  acc,err  using
 1 x 10 - Fold Cross Validation
	 Run with seed =  1234 
* Predictive Tasks ::  df1[, -1].Karar
* Workflows  ::  randomForest 
-> Task:  df1[, -1].Karar
  *Workflow: randomForest 
               acc         err
avg     0.96860465 0.031395349
std     0.01980161 0.019801612
med     0.96802326 0.031976744
iqr     0.03052326 0.030523256
min     0.94186047 0.005813953
max     0.99418605 0.058139535
invalid 0.00000000 0.000000000

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait elde edilen performans parametre değerleri aşağıdaki grafikte verilmiştir.

Yeniden örnekleme (bootstrapping) perfomans kontrolü testi

set.seed(1200)
bootstrap <- performanceEstimation(
  PredTask(Karar ~ ., df1[,-1]),
    workflowVariants(learner=("randomForest")),
  EstimationTask(metrics=c("err", "acc"),method=Bootstrap(nReps=100)))
summary(bootstrap)
topPerformers(bootstrap)
plot(bootstrap)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait elde edilen performans parametre değerleri aşağıda verilmiştir.

== Summary of a  Bootstrap Performance Estimation Experiment ==
Task for estimating  err,acc  using
100  repetitions of  e0  Bootstrap experiment
	 Run with seed =  1234 
* Predictive Tasks ::  df1[, -1].Karar
* Workflows  ::  randomForest 
-> Task:  df1[, -1].Karar
  *Workflow: randomForest 
                err         acc
avg     0.039839321 0.960160679
std     0.008783018 0.008783018
med     0.039563417 0.960436583
iqr     0.010807524 0.010807524
min     0.020408163 0.938871473
max     0.061128527 0.979591837
invalid 0.000000000 0.000000000

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait elde edilen performans parametre değerleri aşağıda verilmiştir.

Model 2

2 nolu modelin oluşturulması

2 nolu modelde randomForest() içerisinde ntree parametresi büyütülecek ağaç sayısını göstermektedir. Yazılmadığında otomatik (default) olarak 500 alınmaktadır. Bu sayı çok küçük bir sayıya ayarlanmamalıdır. Ağaç sayısı artıkça kurulan modelde hata oranı azalmaktadır. Fonksiyon içerisinde yer verilen mtyr parametresi ise her bir alt bölünmede tesadüfi bir şekilde örneklenen değişkenlerin sayısını göstermektedir. Fonksiyon içerisinde yer verilen importance parametresi ise değerlendirilecek değişkenlerin önem düzeyini göstermektedir.

model2 <- randomForest(Karar ~ ., train1[,-1], ntree = 500, mtry = 6, importance = TRUE)
model2
summary(model2)
plot(model2, main="Model 1: Rastgele Orman (RF) Algoritmasının Hata Oranı")

Yukarıdaki kod bloğunun oluşturulmasından sonra kurulan 2 nolu modele ait sınılandırma ve hata oranı aşağıda verilmiştir.

Call:
 randomForest(formula = Karar ~ ., data = train1[, -1], ntree = 500,      mtry = 6, importance = TRUE) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 6
        OOB estimate of  error rate: 1.32%
Confusion matrix:
        Kabul İyi Red Çok İyi class.error
Kabul     250   4   2       2  0.03100775
İyi         0  42   0       0  0.00000000
Red         6   1 852       0  0.00814901
Çok İyi     1   0   0      50  0.01960784

Yukarıdaki kod bloğunun oluşturulmasından sonra çizilen 2 nolu modelin grafiği aşağıda verilmiştir. Bu grafik rastgele orman modelinin sınıf hata (cevap değişkeni) oranlarını göstermektedir. Ağaç sayısı arttıkça hata oranı sıfıra yaklaşır.

2 nolu modeldeki değişkenlerin önem düzeyleri

k<-importance(model2)
ok<-k%>% as_tibble() 
ok<-ok[, c(5,6)]
ok
ok1<-tibble(Değişken=as.vector(row.names(k)), Ortalama_Doğruluk=ok$MeanDecreaseAccuracy,Ortalama_Gini=ok$MeanDecreaseGini )%>%mutate_if(is.numeric, round, 2)%>% arrange(desc(Ortalama_Gini))
formattable(ok1)
ogk<-ggplot(ok1, aes(x=Ortalama_Gini, y = Değişken, label=round(Ortalama_Gini,2)))+
   geom_point(color="red")+
    xlab("Ortalama Gini")+
    ylab("Değişken")+
    geom_text(vjust = 0, nudge_y = 0.1)
odk<-ggplot(ok1, aes(x=Ortalama_Doğruluk, y = Değişken, label=round(Ortalama_Doğruluk,2)))+
   geom_point(color="blue")+
    xlab("Ortalama Doğruluk")+
    ylab("Değişken")+
    geom_text(vjust = 0, nudge_y = 0.1)
ggarrange(ogk, odk, nrow=2)

Yukarı kod bloğunun çalıştırılmasından sonra elde edilen modeldeki değişkenlerin önem düzeyleri ortalama gini katsayısına göre büyükten küçüğe doğru aşağıdaki tabloda verilmiştir.

Yukarı kod bloğunun çalıştırılmasından sonra elde edilen modeldeki değişkenlerin önem düzeylerine ilişkin grafik ise aşağıda verilmiştir.

Tahmin edilen değerler ile gözlem değerlerinin karşılaştırılması

pred1<-predict(model2, test1)
karsilastirma2<-tibble(Gercek=test1$Karar, Tahmin=pred2)
#ilk ve son 10 tahmin değerini gerçek değerle karşılaştırma 
ilk10<-head(karsilastirma2, 10) %>% rename(Gercekİlk_10=Gercek, Tahminİlk_10=Tahmin)
son10<-tail(karsilastirma2, 10) %>% rename(GercekSon_10=Gercek, TahminSon_10=Tahmin)
formattable(cbind(Id=seq(1,10),ilk10, son10))

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 2 nolu modelden elde edilen ilk ve son 10 sınıflandırma değerleri gerçekleşen sınıflandırma değerleri ile birlikte aşağıdaki tabloda karşılaştırmalı olarak verilmiştir.

Karışıklık matrisi (confusion matrix)’nin oluşturulması

pred2<-predict(model2, test1)
karsilastirma<-tibble(Gercek=test1$Karar, Tahmin=pred2)
#alternatif cm ve grafik
cm <- karsilastirma %>%
  conf_mat(Gercek, Tahmin)
cm
autoplot(cm, type = "heatmap")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisi aşağıda verilmiştir.

 Truth
Prediction Kabul İyi Red Çok İyi
   Kabul     119   3   2       0
   İyi         0  24   2       0
   Red         6   0 347       0
   Çok İyi     1   0   0      14

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen karışıklık matrisinin grafiği ise aşağıda verilmiştir.

Hata parametreleri

Kurulan 1 nolu modele ait hata parametrelerinin elde edilmesine yönelik yazılan R kod bloğu aşağıda verilmiştir.

cm<-confusionMatrix(karsilastirma2$Tahmin, karsilastirma2$Gercek)
cm

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 1 nolu modele ait hata parametre değerleri aşağıda verilmiştir.

Confusion Matrix and Statistics
          Reference
Prediction Kabul İyi Red Çok İyi
   Kabul     119   3   2       0
   İyi         0  24   2       0
   Red         6   0 347       0
   Çok İyi     1   0   0      14
Overall Statistics
                                          
               Accuracy : 0.973           
                 95% CI : (0.9551, 0.9851)
    No Information Rate : 0.6776          
    P-Value [Acc > NIR] : < 2.2e-16       
                                          
                  Kappa : 0.9433          
                                          
 Mcnemar's Test P-Value : NA              
Statistics by Class:
                     Class: Kabul Class: İyi Class: Red Class: Çok İyi
Sensitivity                0.9444    0.88889     0.9886        1.00000
Specificity                0.9872    0.99593     0.9641        0.99802
Pos Pred Value             0.9597    0.92308     0.9830        0.93333
Neg Pred Value             0.9822    0.99390     0.9758        1.00000
Prevalence                 0.2432    0.05212     0.6776        0.02703
Detection Rate             0.2297    0.04633     0.6699        0.02703
Detection Prevalence       0.2394    0.05019     0.6815        0.02896
Balanced Accuracy          0.9658    0.94241     0.9763        0.99901

Bağımlı değişken kategorilerine göre sınıflandırma metrikleri

cm<-confusionMatrix(karsilastirma2$Tahmin, karsilastirma2$Gercek)
cm
class<-cm$byClass#sınıfa göre hata oranları
class<-class %>% as_tibble(class) %>% add_column(Class = c("Kabul", "İyi", "Red", "Çok İyi"), .before = "Sensitivity")
class
class1<-class[, c(1, 2,3,6, 7, 8)]
pivot<-class1 %>% pivot_longer(-Class, names_to = "Parameters", values_to = "Değer")
ggplot(pivot, aes(x="", y = Değer, fill = Class))+
geom_bar(position="stack", stat="identity")+
scale_fill_viridis(discrete = T, option = "E")+
facet_grid(Class~  Parameters)+
xlab("")+
labs(fill = "Kategori")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra elde edilen bağımlı değişken kategorilerine göre sınıflandırma metrikleri aşağıdaki grafikte verilmiştir.

Çapraz performans testi (Cross validation test)

set.seed(12)
cv<- performanceEstimation(
  PredTask(Karar ~ ., df1[,-1]),
    workflowVariants(learner="randomForest", learner.pars=list(ntree = 500, mtry = 6, importance = TRUE)),
 EstimationTask(metrics = c("acc","err"),
                method = CV(nReps = 1, nFolds = 10)))
summary(cv)
plot(cv)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 2 nolu modele ait elde edilen performans parametre değerleri aşağıda verilmiştir.

== Summary of a  Cross Validation Performance Estimation Experiment ==
Task for estimating  acc,err  using
 1 x 10 - Fold Cross Validation
	 Run with seed =  1234 
* Predictive Tasks ::  df1[, -1].Karar
* Workflows  ::  randomForest 
-> Task:  df1[, -1].Karar
  *Workflow: randomForest 
               acc         err
avg     0.98255814 0.017441860
std     0.01162791 0.011627907
med     0.98837209 0.011627907
iqr     0.02180233 0.021802326
min     0.96511628 0.005813953
max     0.99418605 0.034883721
invalid 0.00000000 0.000000000

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 2 nolu modele ait elde edilen performans parametre değeri aşağıdaki grafikte verilmiştir.

Yeniden örnekleme (bootstrapping) perfomans kontrolü testi

set.seed(1234)
bootstrap <- performanceEstimation(
  PredTask(Karar ~ ., df1[,-1]),
    workflowVariants(learner="randomForest", learner.pars=list(ntree = 500, mtry = 6, importance = TRUE)),
  EstimationTask(metrics=c("err", "acc"),method=Bootstrap(nReps=100)))
summary(bootstrap)
topPerformers(bootstrap)
plot(bootstrap)

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 2 nolu modele ait elde edilen performans parametre değerleri aşağıda verilmiştir.

== Summary of a  Bootstrap Performance Estimation Experiment ==
Task for estimating  err,acc  using
100  repetitions of  e0  Bootstrap experiment
	 Run with seed =  1234 
* Predictive Tasks ::  df1[, -1].Karar
* Workflows  ::  randomForest 
-> Task:  df1[, -1].Karar
  *Workflow: randomForest 
                err         acc
avg     0.024709802 0.975290198
std     0.007599525 0.007599525
med     0.025197100 0.974802900
iqr     0.011384685 0.011384685
min     0.004680187 0.952978056
max     0.047021944 0.995319813
invalid 0.000000000 0.000000000

Yukarıdaki R kod bloğunun çalıştırılmasından sonra 2 nolu modele ait elde edilen performans parametre değerleri aşağıda verilmiştir.

Sonuç

Bu çalışmada sınıflandırma (classification) probleminin çözümüne yönelik Rastgele Orman (RF) algoritması kullanılarak ayrıntılı deneysel bir çalışma yapılmıştır. Ortaya konulan bulgular, sınıflandırma probleminin RF algoritması tarafından çok başarılı bir şekilde, diğer bir ifadeyle çok yüksek bir doğruluk oranıyla çözüme kavuşturulduğu görülmektedir.

Her iki Rastgele Orman modeli (Model 1 ve 2) performans ölçüleri açısından karşılaştırıldığında öne çıkan bulgular şöyledir: Kurulan 2. model 1. modele göre bağımlı değişken olan “Karar” değişkenini daha iyi tahmin etmektedir. Model 2’de doğruluk (accuracy) oranı performans ölçüm metotlarından capraz kontrol (cross validation)’de % 98,26 iken, model 1’de bu oran % 96,86’da kalmıştır. Aşağıdaki tabloda her iki modelin hata ve doğruluk oranları verilmiştir. Performans ölçüm metotlarından yeniden örnekleme (bootstrapping) kullanıldığında model 2’den üretilen doğruluk oranı % 97,53 (yaklaşık % 98) iken bu oran model 1’de % 96,02’dir. Tabloda belirtilen hata (error) oranı 1-Doğruluk eşitliğinden hesaplanmaktadır. Buradan doğruluk oranı artıkça hata oranının azalacağı anlamı çıkarılması gerekir.

Yukarıdaki tablonun elde edilmesine yönelik yazılan R kod bloğu aşağıdadır. Aşağıdaki kod bloğunda aynı zamanda yukarıdaki tabloda verilen parametreler aşağıda yazılan kod bloğu aracılığıyla grafiğe taşınmıştır.

model1<-tibble(Model=rep("Model 1", 4), Performans_Metodu= c(rep("Capraz Kontrol",2), rep("Yeniden Örnekleme",2)), Parametre=rep(c("Doğruluk", "Hata Oranı"),2), Değer=c(round(0.96860465*100,2),round(0.03139535*100,2), round(0.960160679*100,2), round(0.039839321*100,2)))
         
model2<-tibble(Model=rep("Model 2", 4), Performans_Metodu= c(rep("Capraz Kontrol",2), rep("Yeniden Örnekleme",2)), Parametre=rep(c("Doğruluk", "Hata Oranı"),2), Değer=c(round(0.98255814*100,2),round(0.017441860*100,2), round(0.975290198*100,2), round(0.024709802*100,2)))
modeltum<-bind_rows(model1, model2)
formattable(modeltum)
  ggplot(modeltum, aes(x=Parametre, y = Değer, fill = Model))+
  geom_bar(position="stack", stat="identity")+
  scale_fill_viridis(discrete = T, option = "C")+
  facet_grid(Performans_Metodu~ Model)+
  xlab("Parametre")+
  ylab("Değer (%)")
  labs(fill = "Kategori")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra kurulan her iki Rastgele Orman (RF) modeli hata metrikleri açısından aşağıdaki grafikte karşılaştırılmıştır.

Yapılan bu çalışmanın özellikle veri bilimi (data science) ile ilgilenen akademi ve saha çalışanlarına önemli bir katkı sunacağı düşünülmektedir.

Faydalı olması ve farkındalık oluşturması dileğiyle.

Bilimle ve teknolojiyle kalınız.

Saygılarımla.

Not: Kaynak gösterilmeden alıntı yapılamaz veya kopyalanamaz.

Note: It can not be cited or copied without referencing.

Yararlanılan Kaynaklar

R’da Karar Ağacı Üzerine Bir Vaka Çalışması: A Case Study on Decision Tree in R

Günümüzde veri madenciliği uygulamalarının yaygınlaşması ve büyük veri kavramının öne çıkmasıyla birlikte analiz metotları da değişmiştir.

Bugüne kadar genellikle bulut (cloud) veri tabanları üzerindeki veri setleri indirilerek analize konu ediliyordu. Ancak gelişen teknoloji veri madenciliği yöntemlerinde de önemli değişiklikler ve bazı soruları beraberinde getirmiştir. Bu sorulardan bazıları şöyledir:

  1. Online veya offline olarak dokümanlarda analize konu edilecek veri metin verisi ise nasıl analiz edilecektir?
  2. Aynı zamanda metin verisiyle birlikte numerik veri içiçe geçmişse, yani hibrit bir veri türüyle karşı karşıya kalınırsa nasıl bir yöntem izlenecektir?
  3. Ya da xlsx, txt, csv ve diğer uzantılı dokümanlar online bir platform üzerinde ise nasıl analiz edilecektir?

İşte bu soruların cevabı istatistik biliminden de beslenerek ancak ondan öte bilgisayar mühendisliği alanına giren veri madenciliğinde yatmaktadır. Bu soruların arttırılması mümkündür.

Veri madenciliğin temel amacı veriyi analize uygun hale getirmektir. Bu amaçla geliştirilmiş bir çok programlama dili bulunmaktadır. Örnek uygulama yapılacak bu çalışma kapsamında kullanılacak programlama dili R olmakla birlikte Python, Julia gibi diğer programlama dilleri de kullanılabilmektedir.

Karar ağaçları hem sınıflandırma (kategorik veriler) hemde regresyon (numerik veriler) problemlerin çözümünde kullanılabilen veri madenciliği ve makine öğrenme algoritmasıdır. Çok güçlü algoritmalar olan karar ağaçları kompleks ve büyük veri setlerinin çözümünde oldukça yararlanılan denetimli öğrenme algoritmaları ailesine aittir. Bunun yanında karar ağaçları rastgele orman (random forests) algoritmalarının temel bileşenleridir.

Karar ağaçları karar destek aracı olması yanında alınan kararların görselleştirilmesine de olanak tanır. Bir karar ağacının mimarisi Şekil 1’de verilmiştir.

Şekil 1: Karar Ağacının Mimarisi (Decision Tree Architecture)

Bir karar ağacı temel olarak 4 ana düğüm (node)’den oluşur. Bunlar sırasıyla kök (root) düğüm, iç düğümler ve yaprak (leaf) düğümlerden oluşur. Bu düğümler dallar aracılığıyla birbirine bağlanır. Şekil 1’deki karar ağacı iki daldan oluşmaktadır. Terminal ve yaprak düğümleri karar düğümleridir. Şekil 1’de kök düğümden sonraki iki kısım dalları, dalların uzantıları ise yaprakları göstermektedir. Biçimsel olarak ağaçtan, işleyiş olarak ise insan karar verme süreçinden ilham almaktadır.

Karar ağaçlarında hedef değişken (target variable) kategorik ise sınıflandırma algoritması, numerik (sürekli veya kesikli) değişken ise regresyon algoritması kullanılır. Karar ağaçları pek çok alanda kullanılmakla birlikte aşağıda belirtilen bir çok alanda kendine uygulama alanı bulmaktadır:

  1. İmalat sanayi
  2. Astronomi
  3. Moleküler biyololoji
  4. Biyomedikal mühendisliği
  5. Eczacılık
  6. Planlama
  7. Tıp

Çalışma kapsamında özgün bir çalışma olması adına ABD Tarım Departmanı Ekonomik Araştırma Servisi (United States Department of Agriculture Economic Research Service) internet sayfasında yer alan ABD Eyalet ve İlçe Düzeyi İşsizlik ve Medyan Hanehalkı Geliri (Unemployment and median household income for the U.S., States, and counties) veri seti kullanılmıştır. Kullanılan veri setinin indirilebilir linkine aşağıda yer verilmiştir.

https://www.ers.usda.gov/webdocs/DataFiles/48747/Unemployment.xls?v=9115.7

Çalışma kapsamında veri seti içerisindeki 2018 yılına ait işssizlik oranı hesaplanmasında kullanılan veriler alınmıştır. Veri setinde İşsizlik oranı verisi ile birlikte bu verinin (Unemployment Rate) hesaplanmasına temel oluşturan değişkenler sırasıyla şöyledir:

  1. İşgücü (Labor Force)
  2. İstihdam (Employment)
  3. İşsizlik (Unemployment)

Amaç: 2018 İşsizlik Oranı verileri ordinal kategorik veriye dönüştürülerek karar ağacı algoritmalarından sınıflandırma algoritması ile bağımlı değişkenin ne kadarlık bir doğrulukla tahmin edileceğini ortaya koymak amaçlanmıştır. Burada, işsizlik oranı (unemployment rate) kategorik veriye dönüştürülerek hedef değişken olarak belirlenmiştir.

R programlama dili kullanılarak R kod blokları ve R kod bloklarının çalıştırılmasıyla elde edilen çıktı (output)’lara aşama aşama yer verilerek gösterilmiştir.

R Kod Bloğu 1 (R1)

R1 run edilerek yukarıda bahsedilen siteden veri seti online kaynaktan okunmuştur. Ancak bilgisayara indirilmemiştir.

library(readxl)# Excel dokümanlarını okumak için
url <- "https://www.ers.usda.gov/webdocs/DataFiles/48747/Unemployment.xls?v=9115.7"
destfile <- "Unemployment_xls_v_9115.xls"
curl::curl_download(url, destfile)
Unemployment<- read_excel(destfile, range = "A8:BB3283")#Veri setindeki ilgili hücrelerdeki verileri almak için
Unemployment

R Kod Bloğu 2 (R2)

R2’nin çalıştırılması ile sırasıyla;

  1. Veri setindeki değişken isimleri verilmiştir.
  2. Veri setinin kaç değişkenden ve gözlemden oluştuğu verilmiştir.
  3. library(tidyr) ve library(dplyr) paketleri yüklenerek eksik verilerin (Missing Data: NA) olduğu satırlar çıkarılmıştır.
  4. NA (Not Available) değerleri çıkarıldıktan sonraki gözlem sayısı gözden geçirilmiştir.
  5. Veri setinden 2018 yılına ait değişkenler alınmıştır.
  6. 2018 yılına ait veri setinin tanımlayıcı istatistikleri verilmiştir.
  7. 2018 yılına ait veri setindeki değişken adları değiştirilmiştir.
  8. 2018 yılına ait veri setinin ilk 6 satırı verilmiştir.
  9. 2018 yılı veri setindeki işsizlik oranı (unemployment rate) değişkeni “Low”, “Middle”, “High” ve “Very High” olarak kategorize edilerek tanımlayıcı istatistikleri verilmiştir.
  10. Analiz kapsamında değerlendirilecek değişkenler ve bunlara ait veri seti esnek ve gelişmiş tablo içine alınarak ilk 6 satırı verilmiştir.
names(Unemployment)
str(Unemployment)#3275 obs. of  54 variables:
library(tidyr)
library(dplyr)
df<-Unemployment %>% drop_na()#Missing Data (NA) olan değerler veri setinden çıkarılmıştır.
str(df)# NA değerleri çıkarıldıktan sonraki gözlem değerleri gözden geçirilmiştir.

df1<-df[, 51:54]#2018 yılı değişkenlerinin olduğu sütunların seçilmesi
df1
summary(df1)#2018 yılı işsizlik veri seti tanımlayıcı istatistikleri

df2<-df1 %>% rename(Labor_Force=Civilian_labor_force_2018, Employed=Employed_2018,Unemployed=Unemployed_2018, Unemployment_Rate= Unemployment_rate_2018)#değişken adlarının değiştirilmesi
names(df2)#Değişkenlerin yeni adları

library(tibble)#esnek ve gelişmiş tablo oluşturmak için
df_20<-cut(df2$Unemployment_Rate, breaks = 4, labels = c("Low", "Middle", "High", "Very High"))#İşsizlik oranı verisinin kategorize edilerek ordinal veri türüne dönüştürülmesi için

library(Hmisc)
describe(df_20)#Kategorize edilen veriye ait tanımlayıcı istatistikleri vermek için

t10<-tibble(Labor_Force=df2$Labor_Force, Employment=df2$Employed, Unemployment=df2$Unemployed, Classification=df_20)#Gelişmiş ve esnek tablo formatı içine analiz kapsamında değerlendirilecek değişkenler ve bunlara ait veri seti alınmıştır.

library(formattable)
formattable(head(t10))# Veri setinin ilk 6 satırını vermek için

R2 kod bloğunun çalıştırılmasından sonra elde edilen çıktılar (outputs) sırasıyla aşağıda verilmiştir.

Değişken isimleri: Output (O1)

 [1] "FIPS"                            "State"                           "Area_name"                      
 [4] "Rural_urban_continuum_code_2013" "Urban_influence_code_2013"       "Metro_2013"                     
 [7] "Civilian_labor_force_2007"       "Employed_2007"                   "Unemployed_2007"                
[10] "Unemployment_rate_2007"          "Civilian_labor_force_2008"       "Employed_2008"                  
[13] "Unemployed_2008"                 "Unemployment_rate_2008"          "Civilian_labor_force_2009"      
[16] "Employed_2009"                   "Unemployed_2009"                 "Unemployment_rate_2009"         
[19] "Civilian_labor_force_2010"       "Employed_2010"                   "Unemployed_2010"                
[22] "Unemployment_rate_2010"          "Civilian_labor_force_2011"       "Employed_2011"                  
[25] "Unemployed_2011"                 "Unemployment_rate_2011"          "Civilian_labor_force_2012"      
[28] "Employed_2012"                   "Unemployed_2012"                 "Unemployment_rate_2012"         
[31] "Civilian_labor_force_2013"       "Employed_2013"                   "Unemployed_2013"                
[34] "Unemployment_rate_2013"          "Civilian_labor_force_2014"       "Employed_2014"                  
[37] "Unemployed_2014"                 "Unemployment_rate_2014"          "Civilian_labor_force_2015"      
[40] "Employed_2015"                   "Unemployed_2015"                 "Unemployment_rate_2015"         
[43] "Civilian_labor_force_2016"       "Employed_2016"                   "Unemployed_2016"                
[46] "Unemployment_rate_2016"          "Civilian_labor_force_2017"       "Employed_2017"                  
[49] "Unemployed_2017"                 "Unemployment_rate_2017"          "Civilian_labor_force_2018"      
[52] "Employed_2018"                   "Unemployed_2018"                 "Unemployment_rate_2018"

Gözlem ve Değişken Sayısı: Output 2 (O2)

Veri seti görüleceği üzere 54 değişken 3275 gözlemden oluşmaktadır. Aynı zamanda O2’de değişkenlerin veri türü de görülmektedir.

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	3275 obs. of  54 variables:
 $ FIPS                           : num  0 1000 1001 1003 1005 ...
 $ State                          : chr  "US" "AL" "AL" "AL" ...
 $ Area_name                      : chr  "United States" "Alabama" "Autauga County, AL" "Baldwin County, AL" ...
 $ Rural_urban_continuum_code_2013: num  NA NA 2 3 6 1 1 6 6 3 ...
 $ Urban_influence_code_2013      : num  NA NA 2 2 6 1 1 6 6 2 ...
 $ Metro_2013                     : num  NA NA 1 1 0 1 1 0 0 1 ...
 $ Civilian_labor_force_2007      : num  1.52e+08 2.18e+06 2.44e+04 8.27e+04 1.03e+04 ...
 $ Employed_2007                  : num  1.45e+08 2.09e+06 2.36e+04 8.01e+04 9.68e+03 ...
 $ Unemployed_2007                : num  7034959 86485 806 2560 650 ...
 $ Unemployment_rate_2007         : num  4.6 4 3.3 3.1 6.3 4.1 3.2 9.4 6.2 3.9 ...
 $ Civilian_labor_force_2008      : num  1.54e+08 2.18e+06 2.47e+04 8.32e+04 1.02e+04 ...
 $ Employed_2008                  : num  1.45e+08 2.05e+06 2.34e+04 7.94e+04 9.27e+03 ...
 $ Unemployed_2008                : num  8900745 123012 1267 3851 894 ...
 $ Unemployment_rate_2008         : num  5.8 5.7 5.1 4.6 8.8 5.8 4.7 10.5 8.5 5.7 ...
 $ Civilian_labor_force_2009      : num  1.54e+08 2.16e+06 2.47e+04 8.25e+04 1.00e+04 ...
 $ Employed_2009                  : num  1.40e+08 1.92e+06 2.23e+04 7.44e+04 8.57e+03 ...
 $ Unemployed_2009                : num  14230757 238252 2402 8048 1431 ...
 $ Unemployment_rate_2009         : num  9.3 11 9.7 9.8 14.3 13.3 10 15.6 16.4 11.1 ...
 $ Civilian_labor_force_2010      : num  1.54e+08 2.20e+06 2.57e+04 8.35e+04 1.02e+04 ...
 $ Employed_2010                  : num  1.39e+08 1.96e+06 2.34e+04 7.51e+04 8.96e+03 ...
 $ Unemployed_2010                : num  14862528 231483 2282 8339 1262 ...
 $ Unemployment_rate_2010         : num  9.63 10.5 8.9 10 12.3 11.4 9.8 11.8 13.6 11.4 ...
 $ Civilian_labor_force_2011      : num  1.55e+08 2.20e+06 2.58e+04 8.50e+04 9.85e+03 ...
 $ Employed_2011                  : num  1.41e+08 1.99e+06 2.37e+04 7.74e+04 8.71e+03 ...
 $ Unemployed_2011                : num  13840507 212257 2159 7627 1137 ...
 $ Unemployment_rate_2011         : num  8.95 9.6 8.4 9 11.5 10.5 8.7 11.6 12.5 10.3 ...
 $ Civilian_labor_force_2012      : num  1.55e+08 2.18e+06 2.57e+04 8.44e+04 9.36e+03 ...
 $ Employed_2012                  : num  1.43e+08 2.00e+06 2.40e+04 7.81e+04 8.28e+03 ...
 $ Unemployed_2012                : num  12518793 173047 1779 6349 1079 ...
 $ Unemployment_rate_2012         : num  8.07 8 6.9 7.5 11.5 8.5 6.9 10.4 11.5 8.9 ...
 $ Civilian_labor_force_2013      : num  1.55e+08 2.17e+06 2.58e+04 8.53e+04 9.10e+03 ...
 $ Employed_2013                  : num  1.44e+08 2.02e+06 2.42e+04 7.96e+04 8.17e+03 ...
 $ Unemployed_2013                : num  11467541 156957 1605 5654 931 ...
 $ Unemployment_rate_2013         : num  7.38 7.2 6.2 6.6 10.2 7.9 6.3 9.4 10.3 8.8 ...
 $ Civilian_labor_force_2014      : num  1.56e+08 2.16e+06 2.56e+04 8.64e+04 8.84e+03 ...
 $ Employed_2014                  : num  1.46e+08 2.01e+06 2.41e+04 8.11e+04 7.91e+03 ...
 $ Unemployed_2014                : num  9618992 146552 1495 5301 932 ...
 $ Unemployment_rate_2014         : num  6.17 6.8 5.8 6.1 10.5 7.2 6.1 8.8 8.6 8 ...
 $ Civilian_labor_force_2015      : num  1.57e+08 2.16e+06 2.56e+04 8.77e+04 8.61e+03 ...
 $ Employed_2015                  : num  1.49e+08 2.03e+06 2.43e+04 8.29e+04 7.85e+03 ...
 $ Unemployed_2015                : num  8287559 131395 1330 4859 765 ...
 $ Unemployment_rate_2015         : num  5.28 6.1 5.2 5.5 8.9 6.6 5.4 7.9 7.6 7 ...
 $ Civilian_labor_force_2016      : num  1.59e+08 2.18e+06 2.60e+04 9.07e+04 8.42e+03 ...
 $ Employed_2016                  : num  1.51e+08 2.05e+06 2.46e+04 8.58e+04 7.72e+03 ...
 $ Unemployed_2016                : num  7727644 127238 1321 4831 700 ...
 $ Unemployment_rate_2016         : num  4.87 5.8 5.1 5.3 8.3 6.4 5.4 6.8 6.9 6.5 ...
 $ Civilian_labor_force_2017      : num  1.60e+08 2.18e+06 2.60e+04 9.21e+04 8.32e+03 ...
 $ Employed_2017                  : num  1.53e+08 2.08e+06 2.50e+04 8.83e+04 7.83e+03 ...
 $ Unemployed_2017                : num  6980076 96567 1014 3748 486 ...
 $ Unemployment_rate_2017         : num  4.36 4.4 3.9 4.1 5.8 4.4 4 4.9 5.5 5 ...
 $ Civilian_labor_force_2018      : num  1.62e+08 2.20e+06 2.60e+04 9.38e+04 8.37e+03 ...
 $ Employed_2018                  : num  1.55e+08 2.11e+06 2.50e+04 9.05e+04 7.94e+03 ...
 $ Unemployed_2018                : num  6296445 86490 942 3393 433 ...
 $ Unemployment_rate_2018         : num  3.9 3.9 3.6 3.6 5.2 4 3.5 4.7 4.8 4.7 ...

Eksik Verilerin (Missing Data: NA) Veri Setinden Çıkarılması: Output 3 (O3)

O3’te eksik veriler veri setinden çıkarılarak gözlem sayısı yeniden güncellenmiştir. Yeni durumda veri setindeki gözlem sayısı 3275’ten 3214’e düşmüştür.

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	3214 obs. of  54 variables:
 $ FIPS                           : num  1001 1003 1005 1007 1009 ...
 $ State                          : chr  "AL" "AL" "AL" "AL" ...
 $ Area_name                      : chr  "Autauga County, AL" "Baldwin County, AL" "Barbour County, AL" "Bibb County, AL" ...
 $ Rural_urban_continuum_code_2013: num  2 3 6 1 1 6 6 3 6 6 ...
 $ Urban_influence_code_2013      : num  2 2 6 1 1 6 6 2 5 6 ...
 $ Metro_2013                     : num  1 1 0 1 1 0 0 1 0 0 ...
 $ Civilian_labor_force_2007      : num  24383 82659 10334 8791 26629 ...
 $ Employed_2007                  : num  23577 80099 9684 8432 25780 ...
 $ Unemployed_2007                : num  806 2560 650 359 849 ...
 $ Unemployment_rate_2007         : num  3.3 3.1 6.3 4.1 3.2 9.4 6.2 3.9 6.5 4.2 ...
 $ Civilian_labor_force_2008      : num  24687 83223 10161 8749 26698 ...
 $ Employed_2008                  : num  23420 79372 9267 8241 25453 ...
 $ Unemployed_2008                : num  1267 3851 894 508 1245 ...
 $ Unemployment_rate_2008         : num  5.1 4.6 8.8 5.8 4.7 10.5 8.5 5.7 14.4 5.7 ...
 $ Civilian_labor_force_2009      : num  24703 82451 10003 8742 26480 ...
 $ Employed_2009                  : num  22301 74403 8572 7581 23832 ...
 $ Unemployed_2009                : num  2402 8048 1431 1161 2648 ...
 $ Unemployment_rate_2009         : num  9.7 9.8 14.3 13.3 10 15.6 16.4 11.1 19.6 11.7 ...
 $ Civilian_labor_force_2010      : num  25713 83459 10221 8934 24906 ...
 $ Employed_2010                  : num  23431 75120 8959 7914 22460 ...
 $ Unemployed_2010                : num  2282 8339 1262 1020 2446 ...
 $ Unemployment_rate_2010         : num  8.9 10 12.3 11.4 9.8 11.8 13.6 11.4 14.9 10.6 ...
 $ Civilian_labor_force_2011      : num  25836 85045 9849 8933 25123 ...
 $ Employed_2011                  : num  23677 77418 8712 7996 22939 ...
 $ Unemployed_2011                : num  2159 7627 1137 937 2184 ...
 $ Unemployment_rate_2011         : num  8.4 9 11.5 10.5 8.7 11.6 12.5 10.3 12 9.7 ...
 $ Civilian_labor_force_2012      : num  25740 84414 9362 8798 24960 ...
 $ Employed_2012                  : num  23961 78065 8283 8047 23244 ...
 $ Unemployed_2012                : num  1779 6349 1079 751 1716 ...
 $ Unemployment_rate_2012         : num  6.9 7.5 11.5 8.5 6.9 10.4 11.5 8.9 9.9 8 ...
 $ Civilian_labor_force_2013      : num  25810 85280 9099 8705 24887 ...
 $ Employed_2013                  : num  24205 79626 8168 8016 23325 ...
 $ Unemployed_2013                : num  1605 5654 931 689 1562 ...
 $ Unemployment_rate_2013         : num  6.2 6.6 10.2 7.9 6.3 9.4 10.3 8.8 8 6.6 ...
 $ Civilian_labor_force_2014      : num  25592 86384 8845 8559 24527 ...
 $ Employed_2014                  : num  24097 81083 7913 7942 23023 ...
 $ Unemployed_2014                : num  1495 5301 932 617 1504 ...
 $ Unemployment_rate_2014         : num  5.8 6.1 10.5 7.2 6.1 8.8 8.6 8 6.7 5.8 ...
 $ Civilian_labor_force_2015      : num  25613 87741 8613 8576 24485 ...
 $ Employed_2015                  : num  24283 82882 7848 8009 23163 ...
 $ Unemployed_2015                : num  1330 4859 765 567 1322 ...
 $ Unemployment_rate_2015         : num  5.2 5.5 8.9 6.6 5.4 7.9 7.6 7 6 5.4 ...
 $ Civilian_labor_force_2016      : num  25966 90670 8417 8623 24623 ...
 $ Employed_2016                  : num  24645 85839 7717 8067 23298 ...
 $ Unemployed_2016                : num  1321 4831 700 556 1325 ...
 $ Unemployment_rate_2016         : num  5.1 5.3 8.3 6.4 5.4 6.8 6.9 6.5 5.5 5 ...
 $ Civilian_labor_force_2017      : num  25972 92090 8317 8550 24725 ...
 $ Employed_2017                  : num  24958 88342 7831 8174 23726 ...
 $ Unemployed_2017                : num  1014 3748 486 376 999 ...
 $ Unemployment_rate_2017         : num  3.9 4.1 5.8 4.4 4 4.9 5.5 5 4.1 4.1 ...
 $ Civilian_labor_force_2018      : num  25957 93849 8373 8661 25006 ...
 $ Employed_2018                  : num  25015 90456 7940 8317 24128 ...
 $ Unemployed_2018                : num  942 3393 433 344 878 ...
 $ Unemployment_rate_2018         : num  3.6 3.6 5.2 4 3.5 4.7 4.8 4.7 3.9 3.6 ...

2018 Veri Setindeki Değişkenlerin Tanımlayıcı İstatistikleri: Output (O4)

 Civilian_labor_force_2018 Employed_2018     Unemployed_2018    Unemployment_rate_2018
 Min.   :    102           Min.   :     98   Min.   :     4.0   Min.   : 1.300        
 1st Qu.:   4961           1st Qu.:   4730   1st Qu.:   208.0   1st Qu.: 3.100        
 Median :  11423           Median :  10962   Median :   496.5   Median : 3.900        
 Mean   :  50628           Mean   :  48638   Mean   :  1989.8   Mean   : 4.294        
 3rd Qu.:  31052           3rd Qu.:  29739   3rd Qu.:  1288.8   3rd Qu.: 4.900        
 Max.   :5136341           Max.   :4896512   Max.   :239829.0   Max.   :19.900    

2018 Veri Setindeki Değişkenlerin Adlarının Değiştirilmesi: Output (O4)

[1] "Labor_Force"       "Employed"          "Unemployed"        "Unemployment_Rate"

2018 Veri Setindeki İlk 6 Satır: Output (O5)

Labor_Force Employed Unemployed Unemployment_Rate
25957	25015	942	3.6	
93849	90456	3393	3.6	
8373	7940	433	5.2	
8661	8317	344	4.0	
25006	24128	878	3.5	
4776	4552	224	4.7	

2018 Veri Setindeki İşsizlik Oranı Değişkeninin Kategorize Edilmesi : Output (O7)

2018 yılı veri setindeki işsizlik oranı (unemployment rate) değişkeni “Low”, “Middle”, “High” ve “Very High” olarak kategorize edilerek tanımlayıcı istatistikleri aşağıda verilmiştir.

df_20 
       n  missing distinct 
    3214        0        4 
                                                  
Value            Low    Middle      High Very High
Frequency       2856       304        43        11
Proportion     0.889     0.095     0.013     0.003

2018 Veri Setinin Revizyonlardan Sonraki İlk 6 Satırı: Output (O8)

R Kod Bloğu 3 (R3)

R3’nin çalıştırılması ile sırasıyla;

  1. Değişkenler arasındaki ilişkiler işsizlik oranı sınıflandırılması temelinde log dönüşümü de uygulanarak karşılaştırmalı olarak çoklu saçılım grafikleriyle verilmiştir.
#Yüklü değilse indiriniz: install.packages("tidyverse")
##Yüklü değilse indiriniz: install.packages("ggplot2")
library(ggplot2)

#Yüklü değilse indiriniz: install.packages("ggpubr")
library(ggpubr)

#Değişkenler arasındaki ilişkiler işsizlik oranı sınıflandırılması temelinde çoklu saçılım grafiklerle verilmiştir.
v1<-t10%>%ggplot(aes(x=Labor_Force, y=Employment, color = 
    factor(Classification)))+
    geom_point()+
    facet_grid(. ~ Classification, scales = "free")+
    labs(color = "Classification:") +
    theme(legend.title = element_text(color = "chocolate",
                                    size = 14, face = "bold"))


v2<-t10%>%ggplot(aes(x=log(Labor_Force), y=log(Employment), color = 
    factor(Classification)))+
    geom_point()+
    facet_grid(. ~ Classification, scales = "free")+
    labs(color = "Classification:") +
    theme(legend.title = element_text(color = "chocolate",
                                    size = 14, face = "bold"))

ggarrange(v1, v2, ncol = 1, nrow = 2, common.legend = TRUE)

v3<-t10%>%ggplot(aes(x=Labor_Force, y=Unemployment, color = 
    factor(Classification)))+
    geom_point()+
    facet_grid(. ~ Classification, scales = "free")+
    labs(color = "Classification:") +
    theme(legend.title = element_text(color = "chocolate",
                                    size = 14, face = "bold"))

v4<-t10%>%ggplot(aes(x=log(Labor_Force), y=log(Unemployment), color = 
    factor(Classification)))+
    geom_point()+
    facet_grid(. ~ Classification, scales = "free")+
    labs(color = "Classification:") +
    theme(legend.title = element_text(color = "chocolate",
                                    size = 14, face = "bold"))

ggarrange(v3, v4, ncol = 1, nrow = 2, common.legend = TRUE)

v5<-t10%>%ggplot(aes(x=Employment, y=Unemployment, color = 
    factor(Classification)))+
    geom_point()+
    facet_grid(. ~ Classification, scales = "free")+
    labs(color = "Classification:") +
    theme(legend.title = element_text(color = "chocolate",
                                    size = 14, face = "bold"))

v6<-t10%>%ggplot(aes(x=log(Employment), y=log(Unemployment), color = 
    factor(Classification)))+
    geom_point()+
    facet_grid(. ~ Classification, scales = "free")+
    labs(color = "Classification:") +
    theme(legend.title = element_text(color = "chocolate",
                                    size = 14, face = "bold"))

ggarrange(v5, v6, ncol = 1, nrow = 2, common.legend = TRUE)

Değişkenler Arasındaki İlişkilerin Çoklu Saçılım Grafiklerle Gösterimi: Output (O9)

R Kod Bloğu 4 (R4)

R4’ün çalıştırılması ile sırasıyla;

  1. Değişkenler arasındaki ilişkiler işsizlik oranı sınıflandırılması temelinde log dönüşümü de uygulanarak karşılaştırmalı olarak çoklu saçılım grafiklerle R3’tekine alternatif olarak verilmiştir.
#Ayrıksı eksenler oluşturarak çoklu saçılım grafikleri oluşturma

v11<-t10%>%ggplot(aes(x=Labor_Force, y=Employment, color = 
     factor(Classification)))+
     geom_point()+
     facet_grid(. ~ Classification, scales = "free")+
     labs(color = "Classification:") +
     theme(legend.title = element_text(color = "chartreuse4",
                                    size = 10, face = "bold"))+
     facet_wrap(~ Classification, nrow = 2, scales = "free")

v11

v12<-t10%>%ggplot(aes(x=log(Labor_Force), y=log(Employment), color = 
     factor(Classification)))+
     geom_point()+
     facet_grid(. ~ Classification, scales = "free")+
     labs(color = "Classification:") +
     theme(legend.title = element_text(color = "chartreuse4",
                                    size = 10, face = "bold"))+
     facet_wrap(~ Classification, nrow = 2, scales = "free")

v12

v13<-t10%>%ggplot(aes(x=Labor_Force, y=Unemployment, color = 
     factor(Classification)))+
     geom_point()+
     facet_grid(. ~ Classification, scales = "free")+
     labs(color = "Classification:") +
     theme(legend.title = element_text(color = "chartreuse4",
                                    size = 10, face = "bold"))+
     facet_wrap(~ Classification, nrow = 2, scales = "free")

v13


v14<-t10%>%ggplot(aes(x=log(Labor_Force), y=log(Unemployment), color = 
     factor(Classification)))+
     geom_point()+
     facet_grid(. ~ Classification, scales = "free")+
     labs(color = "Classification:") +
     theme(legend.title = element_text(color = "chartreuse4",
                                    size = 10, face = "bold"))+
     facet_wrap(~ Classification, nrow = 2, scales = "free")

v14

v15<-t10%>%ggplot(aes(x=Employment, y=Unemployment, color = 
     factor(Classification)))+
     geom_point()+
     facet_grid(. ~ Classification, scales = "free")+
     labs(color = "Classification:") +
     theme(legend.title = element_text(color = "chartreuse4",
                                    size = 10, face = "bold"))+
     facet_wrap(~ Classification, nrow = 2, scales = "free")

v15

v16<-t10%>%ggplot(aes(x=log(Employment), y=log(Unemployment), color = 
     factor(Classification)))+
     geom_point()+
     facet_grid(. ~ Classification, scales = "free")+
     labs(color = "Classification:") +
     theme(legend.title = element_text(color = "chartreuse4",
                                    size = 10, face = "bold"))+
     facet_wrap(~ Classification, nrow = 2, scales = "free")

v16

Değişkenler Arasındaki İlişkilerin Çoklu Saçılım Grafiklerle Alternatif Gösterimi: Output (O10)

Genel olarak R3 ve R4 kod bloklarının çalıştırılmasıyla elde edilen saçılım grafiklerden değişken veri setlerine logaritmik (log) dönüşüm uygulandığında değişkenler arasında pozitif korelasyon olduğu görülmektedir.

Buraya kadar yapılan işlemlerde daha çok veriyi online bir kaynaktan okuma, verinin temizlenmesi ve değişkenler arasındaki ilişkilerin gösterimi adı altında veri madenciliği işlemleri yapılmıştır. Burada veri madenciliği konu alanı altında pek çok diğer işlem de yapılabilir. Bu durum verinin türüne, kaynağına, analizin ve araştırmanın amacına göre farklılık göstermektedir. Bu aşamadan sonra ise analize uygun hale getirilen veri yine veri madenciliği algoritmalarından olan karar ağacı algoritması kullanılarak analiz edilecektir.

R Kod Bloğu 5 (R5): Karar Ağacı Oluşturma-1

R5’in çalıştırılmasıyla;

  1. Veri seti basit tesadüfi örneklem çekilerek eğitilecek ve test edilecek veri setine ayrılır. Daha sonra veri setindeki “Classification” değişkeni hedef değişken belirlenerek modele sokulmuştur. Elde edilen sonuçlar karar ağacında görselleştirildikten sonra hata ve doğruluk oranları verilmiştir.
library(DMwR2)#Karar ağacı kütüphanesini yüklemek için
set.seed(1923)
n=NROW(t10)#veri setindeki satır sayısı
SRS <- sample(sample(1:n, size = round(0.7*n), replace=FALSE))#veri setinden basit tesadüfi örneklem çekilerek eğitilecek veri seti ve test setine ayırmak için
training <- t10[SRS, ]#eğitilecek veri seti
test <- t10[-SRS, ]#test edilecek veri seti
model <- rpartXse(Classification ~ ., training, se=0.5)

pred1 <- predict(model, test, type="class")
head(pred1)

library(rpart.plot)#karar ağacının görselleştirilmesi için
prp(model, type=0, extra=101)

(cm <- table(pred1, test$Classification))

error_rate<-100*(1-sum(diag(cm))/sum(cm))

print(paste('Error Rate is %', round(error_rate))) # the error rate (hata oranı)
accuracy_test <- sum(diag(cm)) / sum(cm)
print(paste('Accuracy for test is %', 100*accuracy_test))#Accuracy rate(doğruluk oranı)

Kurulan modele ilişkin karar ağacı aşağıdaki gibidir.

Modele ilişkin hata oranı (error rate) ve doğruluk oranı (accuracy rate) aşağıda verilmiştir. Kurulan model % 5 hata oranı (error rate) ve % 95 doğruluk oranı (accuracy rate) ise hedef değişkeni tahmin etmiştir.

pred1       Low Middle High Very High
  Low       845     25    0         0
  Middle      9     67    5         1
  High        0      1    7         3
  Very High   0      0    0         1
[1] "Error Rate is % 5"
[1] "Accuracy for test is % 95"

R Kod Bloğu 6 (R6): Karar Ağacı Oluşturma2

R6’nın çalıştırılmasıyla;

  1. Veri seti basit tesadüfi örneklem çekilerek eğitilecek ve test edilecek veri setine ayrılır. Daha sonra veri setindeki “Classification” değişkeni hedef değişken belirlenerek numerik değişkenlere logaritmik (log) dönüşüm uygulanarak modele sokulmuştur. Elde edilen sonuçlar karar ağacında görselleştirildikten sonra hata ve doğruluk oranları verilmiştir.
lf<-log(t10$Labor_Force)
e<-log(t10$Employment)
u<-log(t10$Unemployment)
t11<-tibble(Labor_Force=lf, Employment=e, Unemployment=u, Classification=t10$Classification)

set.seed(1071)
n=NROW(t11)#veri setindeki satır sayısı
SRS <- sample(sample(1:n, size = round(0.7*n), replace=FALSE))#veri setinden basit tesadüfi örneklem çekilerek eğitilecek veri seti ve test setine ayırmak için
training <- t11[SRS, ]#eğitilecek veri seti
test <- t11[-SRS, ]#test edilecek veri seti
model <- rpartXse(Classification ~ ., training, se=0.5)

pred1 <- predict(model, test, type="class")
head(pred1)

library(rpart.plot)#karar ağacının görselleştirilmesi için
prp(model, type=0, extra=101)

(cm <- table(pred1, test$Classification))

error_rate<-100*(1-sum(diag(cm))/sum(cm))

print(paste('Error Rate is %', round(error_rate))) # the error rate (hata oranı)
accuracy_test <- sum(diag(cm)) / sum(cm)
print(paste('Accuracy for test is %', 100*accuracy_test))#Accuracy rate(doğruluk oranı)

Log dönüşümü uygulanarak kurulan modele ilişkin karar ağacı aşağıdaki gibidir.

Log dönüşümü uygulandıktan sonra modele ilişkin hata oranı (error rate) ve doğruluk oranı (accuracy rate) aşağıda verilmiştir. Kurulan model % 5 hata oranı (error rate) ve % 95 doğruluk oranı (accuracy rate) hedef değişkeni tahmin etmiştir. Elde edilen sonuçlar log dönüşümü uygulanmadan önceki elde edilen sonuçlarla aynıdır.

pred1       Low Middle High Very High
  Low       849     24    0         0
  Middle     14     60    3         0
  High        0      3    9         0
  Very High   0      0    1         1
[1] "Error Rate is % 5"
[1] "Accuracy for test is % 95"

R Kod Bloğu 7 (R7): Karar Ağacı Oluşturma3

R7’nin çalıştırılmasıyla;

  1. Veri seti basit tesadüfi örneklem çekilerek eğitilecek ve test edilecek veri setine ayrılır. Daha sonra veri setindeki “Classification” değişkeni hedef değişken belirlenerek numerik değişkenler normalize edilerek modele sokulmuştur. Elde edilen sonuçlar karar ağacında görselleştirildikten sonra hata ve doğruluk oranları verilmiştir.
lf<-scale(t10$Labor_Force)
e<-scale(t10$Employment)
u<-scale(t10$Unemployment)
t12<-tibble(Labor_Force=lf, Employment=e, Unemployment=u, Classification=t10$Classification)

set.seed(1331)
n=NROW(t12)
SRS <- sample(sample(1:n, size = round(0.7*n), replace=FALSE))#veri setinden basit tesadüfi örneklem çekilerek eğitilecek veri seti ve test setine ayırmak için
training <- t12[SRS, ]#eğitilecek veri seti
test <- t12[-SRS, ]#test edilecek veri seti
model <- rpartXse(Classification ~ ., training, se=0.5)

pred1 <- predict(model, test, type="class")
head(pred1)

library(rpart.plot)#karar ağacının görselleştirilmesi için
prp(model, type=0, extra=101)

(cm <- table(pred1, test$Classification))

error_rate<-100*(1-sum(diag(cm))/sum(cm))

print(paste('Error Rate is %', round(error_rate))) # the error rate (hata oranı)
accuracy_test <- sum(diag(cm)) / sum(cm)
print(paste('Accuracy for test is %', 100*accuracy_test))#Accuracy rate(doğruluk oranı)

Veri seti normalize edilerek kurulan modele ilişkin karar ağacı aşağıdaki gibidir.

Veri seti normalize edildikten sonra modele ilişkin hata oranı (error rate) ve doğruluk oranı (accuracy rate) aşağıda verilmiştir. Kurulan model % 5 hata oranı (error rate) ve % 95 doğruluk oranı (accuracy rate) ile hedef değişkeni tahmin etmiştir. Elde edilen sonuçlar önceki sonuçlarla aynıdır.

pred1       Low Middle High Very High
  Low       850     23    0         0
  Middle     13     63    6         2
  High        0      0    4         3
  Very High   0      0    0         0
[1] "Error Rate is % 5"
[1] "Accuracy for test is % 95"

R Kod Bloğu 8 (R8): Karar Ağacı Oluşturma-4

R8’in çalıştırılmasıyla;

  1. İlk olarak “Classification” değişkenine temel oluşturan işssizlik oranı (unemployment rate) değişkeni ve bağımlı değişkenlerin logaritmik dönüşümü yapılmıştır. Daha sonra veri seti basit tesadüfi örneklem çekilerek eğitilecek ve test edilecek veri setine ayrılmıştır. Elde edilen sonuçlar karar ağacında görselleştirildikten sonra hata ve doğruluk oranları verilmiştir.
df_20_log<-cut(log(df2$Unemployment_Rate), breaks = 4, labels = c("Low", "Middle", "High", "Very High"))

t_log<-tibble(Labor_Force=log(df2$Labor_Force), Employment=log(df2$Employed), Unemployment=log(df2$Unemployed), Classification=df_20_log)

set.seed(2001)
n=NROW(t_log)
SRS <- sample(sample(1:n, size = round(0.7*n), replace=FALSE))
training <- t_log[SRS, ]
test <- t_log[-SRS, ]
model <- rpartXse(Classification ~ ., training, se=0.5)

pred1 <- predict(model, test, type="class")
head(pred1)

library(rpart.plot)#karar ağacının görselleştirilmesi için
prp(model, type=0, extra=101)

(cm <- table(pred1, test$Classification))

error_rate<-100*(1-sum(diag(cm))/sum(cm))

print(paste('Error Rate is %', round(error_rate))) # the error rate (hata oranı)
accuracy_test <- sum(diag(cm)) / sum(cm)
print(paste('Accuracy for test is %', 100*accuracy_test))#Accuracy rate(doğruluk oranı)

Veri setindeki değişkenlerin tamamına logaritmik (log) dönüşüm uygulandıktan sonra kurulan modele ilişkin karar ağacı aşağıdaki gibidir.

Veri setinin tamanına log dönüşümü uygulandıktan sonra modele ilişkin hata oranı (error rate) ve doğruluk oranı (accuracy rate) aşağıda verilmiştir. Kurulan model % 10 hata oranı (error rate) ve % 90 doğruluk oranı (accuracy rate) ile hedef değişkeni tahmin etmiştir.

pred1       Low Middle High Very High
  Low        62     15    0         0
  Middle     29    647   27         0
  High        0     14  153         8
  Very High   0      0    1         8
[1] "Error Rate is % 10"
[1] "Accuracy for test is % 90"

Yapılan işlemlerden sonra örneklem seçimi ile elde edilen en düşük CP (Complexity Paramater) değeri ile yeni model inşa edilir. Daha sonra aşırı öğrenme (overfitting) ve eksik öğrenmeyi (underfitting) önlemek için ağaç budama (pruning) işlemi yapılarak karar ağacı sonlandırılır.

Örnek uygulama kapsamında yukarıda kurulan modeller diğer makine öğrenme ve derin öğrenme yöntemleri ile de analiz edilerek elde edilen sonuçlar kıyaslanarak buradaki problemin çözümünde en iyi yöntem belirlenebilir.

Faydalı olması ve farkındalık oluşturulması dileğiyle.

Saygılarımla.

Yararlanılan Kaynaklar

cs229-notes-dt.pdf erişimi için tıklayın

https://www.ers.usda.gov/data-products/county-level-data-sets/download-data/

https://www.r-project.org/

https://www.python-course.eu/Decision_Trees.php

https://tevfikbulut.com/2019/12/03/web-uzerindeki-verinin-kesifsel-analizine-yonelik-bir-vaka-calismasi-a-case-study-for-exploratory-analysis-of-data-on-the-web/

Medium.com adresinde görüntüleyin

https://www.guru99.com/

Web Üzerindeki Verinin Keşifsel Analizine Yönelik Bir Vaka Çalışması: A Case Study for Exploratory Analysis of Data on the Web

Günümüzde veri madenciliği uygulamalarının yaygınlaşması ve büyük veri kavramının öne çıkmasıyla birlikte analiz metotları da değişmiştir.

Bugüne kadar genellikle bulut (cloud) veri tabanları üzerindeki veri setleri indirilerek analize konu ediliyordu. Ancak gelişen teknoloji veri madenciliği yöntemlerinde de önemli değişiklikler getirmiştir. Artık veri, programlama dilleri kullanılarak da analiz edilebilmektedir.

Genel olarak veri türü istatistik biliminde 3 gruba ayrılmaktadır.

  1. Nominal (Kategorik): örneğin, cinsiyet (dikotomik veriler), medeni durum gibi cevap seçenekleri
  2. Ordinal: Sosyo-ekonomik gelişmişlik durumu, eğitim düzeyi
  3. Rasyo (Numerik): Ölçülebilir ve sayılabilir nitelikteki veriler rasyo veriler olarak nitelendirilir.

Ancak uygulamada yukarıdaki sınıflandırma çok da geçerli olmayabilir. Diğer bir ifadeyle, online veya offline olarak dokümanlarda analize konu edilecek veri metin verisi ise nasıl analiz edilecektir? Aynı zamanda metin verisiyle birlikte numerik veri içiçe geçmişse, yani hibrit bir veri türüyle karşı karşıya kalınırsa nasıl bir yöntem izlenecektir. Ya da xlsx, txt, csv ve diğer uzantılı dokümanlar online bir platform üzerinde ise nasıl analiz edilecektir? İşte bu soruların cevabı istatistik biliminden de beslenerek ancak ondan öte bilgisayar mühendisliği alanına giren veri madenciliğinde yatmaktadır. Veri madenciliğin temel amacı veriyi analize uygun hale getirmektir. Bu amaçla geliştirilmiş bir çok programlama dili bulunmaktadır. Örnek uygulama yapılacak bu çalışma kapsamında kullanılacak programlama dili R olmakla birlikte Python, Julia gibi diğer programlama dilleri de kullanılabilmektedir.

Çalışma kapsamında özgün bir çalışma olması adına ABD Tarım Departmanı Ekonomik Araştırma Servisi (United States Department of Agriculture Economic Research Service) internet sayfasında yer alan ABD Eyalet ve İlçe Düzeyi İşsizlik ve Medyan Hanehalkı Geliri (Unemployment and median household income for the U.S., States, and counties) veri seti kullanılmıştır. Kullanılan veri setinin indirilebilir linkine aşağıda yer verilmiştir.

https://www.ers.usda.gov/webdocs/DataFiles/48747/Unemployment.xls?v=9115.7

R programlama dili kullanılarak R kod blokları ve R kod bloklarının çalıştırılmasıyla elde edilen çıktı (output)’lara aşama aşama yer verilerek gösterilmiştir.

R Kod Bloğu 1 (R1)

R1 run edilerek yukarıda bahsedilen siteden veri seti online kaynaktan okunmuştur. Ancak bilgisayara indirilmemiştir.

library(readxl)# Excel dokümanlarını okumak için
url <- "https://www.ers.usda.gov/webdocs/DataFiles/48747/Unemployment.xls?v=9115.7"
destfile <- "Unemployment_xls_v_9115.xls"
curl::curl_download(url, destfile)
Unemployment<- read_excel(destfile, range = "A8:BB3283")#Veri setindeki ilgili hücrelerdeki verileri almak için
Unemployment

R Kod Bloğu 2 (R2)

R2’nin çalıştırılması ile sırasıyla;

  1. Veri setindeki değişken isimleri
  2. Kaç değişkenden ve gözlemden oluştuğu
  3. library(tidyr) ve library(dplyr) paketleri yüklenerek eksik verilerin (Missing Data: NA) olduğu satırlar çıkarılmıştır.
  4. NA (Not Available) değerleri çıkarıldıktan sonraki gözlem sayısı gözden geçirilmiştir.
  5. Veri setinden 2018 yılına ait değişkenler alınmıştır.
  6. 2018 yılına ait veri setinin tanımlayıcı istatistikleri verilmiştir.
  7. 2018 yılına ait veri setindeki değişken adları değiştirilmiştir.
  8. 2018 yılına ait veri setinin ilk 6 satırı verilmiştir.
names(Unemployment)
str(Unemployment)#3275 obs. of  54 variables:
library(tidyr)
library(dplyr)
df<-Unemployment %>% drop_na()#Missing Data (NA) olan değerler veri setinden çıkarılmıştır.
str(df)# NA değerleri çıkarıldıktan sonraki gözlem değerleri gözden geçirilmiştir.
df1<-df[, 51:54]#2018 yılı değişkenlerinin olduğu sütunların seçilmesi
df1
summary(df1)#2018 yılı işsizlik veri seti tanımlayıcı istatistikleri
df2<-df1 %>% rename(Labor_Force=Civilian_labor_force_2018, Employed=Employed_2018,Unemployed=Unemployed_2018, Unemployment_Rate= Unemployment_rate_2018)#değişken adlarının değiştirilmesi
names(df2)#Değişkenlerin yeni adları

R2 kod bloğunun çalıştırılmasından sonra elde edilen çıktılar (outputs) sırasıyla aşağıda verilmiştir.

Değişken isimleri: Output (O1)

 [1] "FIPS"                            "State"                           "Area_name"                      
 [4] "Rural_urban_continuum_code_2013" "Urban_influence_code_2013"       "Metro_2013"                     
 [7] "Civilian_labor_force_2007"       "Employed_2007"                   "Unemployed_2007"                
[10] "Unemployment_rate_2007"          "Civilian_labor_force_2008"       "Employed_2008"                  
[13] "Unemployed_2008"                 "Unemployment_rate_2008"          "Civilian_labor_force_2009"      
[16] "Employed_2009"                   "Unemployed_2009"                 "Unemployment_rate_2009"         
[19] "Civilian_labor_force_2010"       "Employed_2010"                   "Unemployed_2010"                
[22] "Unemployment_rate_2010"          "Civilian_labor_force_2011"       "Employed_2011"                  
[25] "Unemployed_2011"                 "Unemployment_rate_2011"          "Civilian_labor_force_2012"      
[28] "Employed_2012"                   "Unemployed_2012"                 "Unemployment_rate_2012"         
[31] "Civilian_labor_force_2013"       "Employed_2013"                   "Unemployed_2013"                
[34] "Unemployment_rate_2013"          "Civilian_labor_force_2014"       "Employed_2014"                  
[37] "Unemployed_2014"                 "Unemployment_rate_2014"          "Civilian_labor_force_2015"      
[40] "Employed_2015"                   "Unemployed_2015"                 "Unemployment_rate_2015"         
[43] "Civilian_labor_force_2016"       "Employed_2016"                   "Unemployed_2016"                
[46] "Unemployment_rate_2016"          "Civilian_labor_force_2017"       "Employed_2017"                  
[49] "Unemployed_2017"                 "Unemployment_rate_2017"          "Civilian_labor_force_2018"      
[52] "Employed_2018"                   "Unemployed_2018"                 "Unemployment_rate_2018"

Gözlem ve Değişken Sayısı: Output 2 (O2)

Veri seti görüleceği üzere 54 değişken 3275 gözlemden oluşmaktadır. Aynı zamanda O2’de değişkenlerin veri türü de görülmektedir.

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	3275 obs. of  54 variables:
 $ FIPS                           : num  0 1000 1001 1003 1005 ...
 $ State                          : chr  "US" "AL" "AL" "AL" ...
 $ Area_name                      : chr  "United States" "Alabama" "Autauga County, AL" "Baldwin County, AL" ...
 $ Rural_urban_continuum_code_2013: num  NA NA 2 3 6 1 1 6 6 3 ...
 $ Urban_influence_code_2013      : num  NA NA 2 2 6 1 1 6 6 2 ...
 $ Metro_2013                     : num  NA NA 1 1 0 1 1 0 0 1 ...
 $ Civilian_labor_force_2007      : num  1.52e+08 2.18e+06 2.44e+04 8.27e+04 1.03e+04 ...
 $ Employed_2007                  : num  1.45e+08 2.09e+06 2.36e+04 8.01e+04 9.68e+03 ...
 $ Unemployed_2007                : num  7034959 86485 806 2560 650 ...
 $ Unemployment_rate_2007         : num  4.6 4 3.3 3.1 6.3 4.1 3.2 9.4 6.2 3.9 ...
 $ Civilian_labor_force_2008      : num  1.54e+08 2.18e+06 2.47e+04 8.32e+04 1.02e+04 ...
 $ Employed_2008                  : num  1.45e+08 2.05e+06 2.34e+04 7.94e+04 9.27e+03 ...
 $ Unemployed_2008                : num  8900745 123012 1267 3851 894 ...
 $ Unemployment_rate_2008         : num  5.8 5.7 5.1 4.6 8.8 5.8 4.7 10.5 8.5 5.7 ...
 $ Civilian_labor_force_2009      : num  1.54e+08 2.16e+06 2.47e+04 8.25e+04 1.00e+04 ...
 $ Employed_2009                  : num  1.40e+08 1.92e+06 2.23e+04 7.44e+04 8.57e+03 ...
 $ Unemployed_2009                : num  14230757 238252 2402 8048 1431 ...
 $ Unemployment_rate_2009         : num  9.3 11 9.7 9.8 14.3 13.3 10 15.6 16.4 11.1 ...
 $ Civilian_labor_force_2010      : num  1.54e+08 2.20e+06 2.57e+04 8.35e+04 1.02e+04 ...
 $ Employed_2010                  : num  1.39e+08 1.96e+06 2.34e+04 7.51e+04 8.96e+03 ...
 $ Unemployed_2010                : num  14862528 231483 2282 8339 1262 ...
 $ Unemployment_rate_2010         : num  9.63 10.5 8.9 10 12.3 11.4 9.8 11.8 13.6 11.4 ...
 $ Civilian_labor_force_2011      : num  1.55e+08 2.20e+06 2.58e+04 8.50e+04 9.85e+03 ...
 $ Employed_2011                  : num  1.41e+08 1.99e+06 2.37e+04 7.74e+04 8.71e+03 ...
 $ Unemployed_2011                : num  13840507 212257 2159 7627 1137 ...
 $ Unemployment_rate_2011         : num  8.95 9.6 8.4 9 11.5 10.5 8.7 11.6 12.5 10.3 ...
 $ Civilian_labor_force_2012      : num  1.55e+08 2.18e+06 2.57e+04 8.44e+04 9.36e+03 ...
 $ Employed_2012                  : num  1.43e+08 2.00e+06 2.40e+04 7.81e+04 8.28e+03 ...
 $ Unemployed_2012                : num  12518793 173047 1779 6349 1079 ...
 $ Unemployment_rate_2012         : num  8.07 8 6.9 7.5 11.5 8.5 6.9 10.4 11.5 8.9 ...
 $ Civilian_labor_force_2013      : num  1.55e+08 2.17e+06 2.58e+04 8.53e+04 9.10e+03 ...
 $ Employed_2013                  : num  1.44e+08 2.02e+06 2.42e+04 7.96e+04 8.17e+03 ...
 $ Unemployed_2013                : num  11467541 156957 1605 5654 931 ...
 $ Unemployment_rate_2013         : num  7.38 7.2 6.2 6.6 10.2 7.9 6.3 9.4 10.3 8.8 ...
 $ Civilian_labor_force_2014      : num  1.56e+08 2.16e+06 2.56e+04 8.64e+04 8.84e+03 ...
 $ Employed_2014                  : num  1.46e+08 2.01e+06 2.41e+04 8.11e+04 7.91e+03 ...
 $ Unemployed_2014                : num  9618992 146552 1495 5301 932 ...
 $ Unemployment_rate_2014         : num  6.17 6.8 5.8 6.1 10.5 7.2 6.1 8.8 8.6 8 ...
 $ Civilian_labor_force_2015      : num  1.57e+08 2.16e+06 2.56e+04 8.77e+04 8.61e+03 ...
 $ Employed_2015                  : num  1.49e+08 2.03e+06 2.43e+04 8.29e+04 7.85e+03 ...
 $ Unemployed_2015                : num  8287559 131395 1330 4859 765 ...
 $ Unemployment_rate_2015         : num  5.28 6.1 5.2 5.5 8.9 6.6 5.4 7.9 7.6 7 ...
 $ Civilian_labor_force_2016      : num  1.59e+08 2.18e+06 2.60e+04 9.07e+04 8.42e+03 ...
 $ Employed_2016                  : num  1.51e+08 2.05e+06 2.46e+04 8.58e+04 7.72e+03 ...
 $ Unemployed_2016                : num  7727644 127238 1321 4831 700 ...
 $ Unemployment_rate_2016         : num  4.87 5.8 5.1 5.3 8.3 6.4 5.4 6.8 6.9 6.5 ...
 $ Civilian_labor_force_2017      : num  1.60e+08 2.18e+06 2.60e+04 9.21e+04 8.32e+03 ...
 $ Employed_2017                  : num  1.53e+08 2.08e+06 2.50e+04 8.83e+04 7.83e+03 ...
 $ Unemployed_2017                : num  6980076 96567 1014 3748 486 ...
 $ Unemployment_rate_2017         : num  4.36 4.4 3.9 4.1 5.8 4.4 4 4.9 5.5 5 ...
 $ Civilian_labor_force_2018      : num  1.62e+08 2.20e+06 2.60e+04 9.38e+04 8.37e+03 ...
 $ Employed_2018                  : num  1.55e+08 2.11e+06 2.50e+04 9.05e+04 7.94e+03 ...
 $ Unemployed_2018                : num  6296445 86490 942 3393 433 ...
 $ Unemployment_rate_2018         : num  3.9 3.9 3.6 3.6 5.2 4 3.5 4.7 4.8 4.7 ...

Eksik Verilerin (Missing Data: NA) Veri Setinden Çıkarılması: Output 3 (O3)

O3’te eksik veriler veri setinden çıkarılarak gözlem sayısı yeniden güncellenmiştir. Yeni durumda veri setindeki gözlem sayısı 3275’ten 3214’e düşmüştür.

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	3214 obs. of  54 variables:
 $ FIPS                           : num  1001 1003 1005 1007 1009 ...
 $ State                          : chr  "AL" "AL" "AL" "AL" ...
 $ Area_name                      : chr  "Autauga County, AL" "Baldwin County, AL" "Barbour County, AL" "Bibb County, AL" ...
 $ Rural_urban_continuum_code_2013: num  2 3 6 1 1 6 6 3 6 6 ...
 $ Urban_influence_code_2013      : num  2 2 6 1 1 6 6 2 5 6 ...
 $ Metro_2013                     : num  1 1 0 1 1 0 0 1 0 0 ...
 $ Civilian_labor_force_2007      : num  24383 82659 10334 8791 26629 ...
 $ Employed_2007                  : num  23577 80099 9684 8432 25780 ...
 $ Unemployed_2007                : num  806 2560 650 359 849 ...
 $ Unemployment_rate_2007         : num  3.3 3.1 6.3 4.1 3.2 9.4 6.2 3.9 6.5 4.2 ...
 $ Civilian_labor_force_2008      : num  24687 83223 10161 8749 26698 ...
 $ Employed_2008                  : num  23420 79372 9267 8241 25453 ...
 $ Unemployed_2008                : num  1267 3851 894 508 1245 ...
 $ Unemployment_rate_2008         : num  5.1 4.6 8.8 5.8 4.7 10.5 8.5 5.7 14.4 5.7 ...
 $ Civilian_labor_force_2009      : num  24703 82451 10003 8742 26480 ...
 $ Employed_2009                  : num  22301 74403 8572 7581 23832 ...
 $ Unemployed_2009                : num  2402 8048 1431 1161 2648 ...
 $ Unemployment_rate_2009         : num  9.7 9.8 14.3 13.3 10 15.6 16.4 11.1 19.6 11.7 ...
 $ Civilian_labor_force_2010      : num  25713 83459 10221 8934 24906 ...
 $ Employed_2010                  : num  23431 75120 8959 7914 22460 ...
 $ Unemployed_2010                : num  2282 8339 1262 1020 2446 ...
 $ Unemployment_rate_2010         : num  8.9 10 12.3 11.4 9.8 11.8 13.6 11.4 14.9 10.6 ...
 $ Civilian_labor_force_2011      : num  25836 85045 9849 8933 25123 ...
 $ Employed_2011                  : num  23677 77418 8712 7996 22939 ...
 $ Unemployed_2011                : num  2159 7627 1137 937 2184 ...
 $ Unemployment_rate_2011         : num  8.4 9 11.5 10.5 8.7 11.6 12.5 10.3 12 9.7 ...
 $ Civilian_labor_force_2012      : num  25740 84414 9362 8798 24960 ...
 $ Employed_2012                  : num  23961 78065 8283 8047 23244 ...
 $ Unemployed_2012                : num  1779 6349 1079 751 1716 ...
 $ Unemployment_rate_2012         : num  6.9 7.5 11.5 8.5 6.9 10.4 11.5 8.9 9.9 8 ...
 $ Civilian_labor_force_2013      : num  25810 85280 9099 8705 24887 ...
 $ Employed_2013                  : num  24205 79626 8168 8016 23325 ...
 $ Unemployed_2013                : num  1605 5654 931 689 1562 ...
 $ Unemployment_rate_2013         : num  6.2 6.6 10.2 7.9 6.3 9.4 10.3 8.8 8 6.6 ...
 $ Civilian_labor_force_2014      : num  25592 86384 8845 8559 24527 ...
 $ Employed_2014                  : num  24097 81083 7913 7942 23023 ...
 $ Unemployed_2014                : num  1495 5301 932 617 1504 ...
 $ Unemployment_rate_2014         : num  5.8 6.1 10.5 7.2 6.1 8.8 8.6 8 6.7 5.8 ...
 $ Civilian_labor_force_2015      : num  25613 87741 8613 8576 24485 ...
 $ Employed_2015                  : num  24283 82882 7848 8009 23163 ...
 $ Unemployed_2015                : num  1330 4859 765 567 1322 ...
 $ Unemployment_rate_2015         : num  5.2 5.5 8.9 6.6 5.4 7.9 7.6 7 6 5.4 ...
 $ Civilian_labor_force_2016      : num  25966 90670 8417 8623 24623 ...
 $ Employed_2016                  : num  24645 85839 7717 8067 23298 ...
 $ Unemployed_2016                : num  1321 4831 700 556 1325 ...
 $ Unemployment_rate_2016         : num  5.1 5.3 8.3 6.4 5.4 6.8 6.9 6.5 5.5 5 ...
 $ Civilian_labor_force_2017      : num  25972 92090 8317 8550 24725 ...
 $ Employed_2017                  : num  24958 88342 7831 8174 23726 ...
 $ Unemployed_2017                : num  1014 3748 486 376 999 ...
 $ Unemployment_rate_2017         : num  3.9 4.1 5.8 4.4 4 4.9 5.5 5 4.1 4.1 ...
 $ Civilian_labor_force_2018      : num  25957 93849 8373 8661 25006 ...
 $ Employed_2018                  : num  25015 90456 7940 8317 24128 ...
 $ Unemployed_2018                : num  942 3393 433 344 878 ...
 $ Unemployment_rate_2018         : num  3.6 3.6 5.2 4 3.5 4.7 4.8 4.7 3.9 3.6 ...

2018 Veri Setindeki Değişkenlerin Tanımlayıcı İstatistikleri: Output (O4)

 Civilian_labor_force_2018 Employed_2018     Unemployed_2018    Unemployment_rate_2018
 Min.   :    102           Min.   :     98   Min.   :     4.0   Min.   : 1.300        
 1st Qu.:   4961           1st Qu.:   4730   1st Qu.:   208.0   1st Qu.: 3.100        
 Median :  11423           Median :  10962   Median :   496.5   Median : 3.900        
 Mean   :  50628           Mean   :  48638   Mean   :  1989.8   Mean   : 4.294        
 3rd Qu.:  31052           3rd Qu.:  29739   3rd Qu.:  1288.8   3rd Qu.: 4.900        
 Max.   :5136341           Max.   :4896512   Max.   :239829.0   Max.   :19.900    

2018 Veri Setindeki Değişkenlerin Adlarının Değiştirilmesi: Output (O4)

[1] "Labor_Force"       "Employed"          "Unemployed"        "Unemployment_Rate"

2018 Veri Setindeki İlk 6 Satır: Output (O5)

Labor_Force Employed Unemployed Unemployment_Rate
25957	25015	942	3.6	
93849	90456	3393	3.6	
8373	7940	433	5.2	
8661	8317	344	4.0	
25006	24128	878	3.5	
4776	4552	224	4.7	

R Kod Bloğu 3 (R3)

R3’nin çalıştırılması ile sırasıyla;

  1. Değişkenler arasındaki ilişkiler çoklu çizgi grafiklerle verilmiştir.
  2. Değişkenlerin dağılım yapısını incelemek çoklu histogramı çizilmiştir.
  3. Veri setindeki uç değerleri görmek için çoklu Boxplot’lar çizilmiştir.
#Yüklü değilse indiriniz: install.packages("tidyverse")
##Yüklü değilse indiriniz: install.packages("ggplot2")
library(ggplot2)

#Yüklü değilse indiriniz: install.packages("ggpubr")
library(ggpubr)

#Değişkenler arasındaki ilişkiler çizgi çoklu grafiklerle verilmiştir.
x1<-df2%>%ggplot(aes(Labor_Force,Employed))+
  geom_line(colour = "brown")+
  ggtitle("İşgücü İstihdam İlişkisi")
  #geom_smooth(method = "lm", se = FALSE)

x2<-df2%>%ggplot(aes(Labor_Force,Unemployed))+
  geom_line(colour = "green")+
  ggtitle("İssizlik İşgücü İlişkisi")
  #geom_hline(yintercept = mean(df2$Labor_Force))+
  #geom_abline()
x3<-df2%>%ggplot(aes(Labor_Force,Unemployment_Rate))+
  geom_line(colour = "blue")+
   ggtitle("İşsizlik Oranı İşgücü İlişkisi")

x4<-df2%>%ggplot(aes(Employed,Unemployment_Rate))+
  geom_line(colour = "red")+
  ggtitle("İstihdam İşsizlik Oranı İlişkisi")

ggarrange(x1, x2, x3, x4, ncol = 2, nrow = 2, common.legend = TRUE)

#Değişkenlerin dağılım yapısını incelemek çoklu histogramı çizilmiştir.
h1<-df2%>%ggplot(aes(Labor_Force))+
  geom_histogram(fill = "blue")+
   ggtitle("İşgücü")

h2<-df2%>%ggplot(aes(Employed))+
  geom_histogram(fill = "red")+
   ggtitle("İstihdam")

h3<-df2%>%ggplot(aes(Unemployed))+
  geom_histogram(fill = "green")+
   ggtitle("İşsizlik")
   
h4<-df2%>%ggplot(aes(Unemployment_Rate))+
  geom_histogram(fill = "brown")+
   ggtitle("İşsizlik Oranı")
ggarrange(h1, h2, h3, h4, ncol = 2, nrow = 2, common.legend = TRUE)

#Veri setindeki uç değerleri görmek için çoklu Boxplot'lar çizilmiştir.

b1<-df2%>%ggplot(aes(y=Labor_Force))+
  geom_boxplot(fill = "blue", outlier.colour = "red")

b2<-df2%>%ggplot(aes(y=Unemployed))+
  geom_boxplot(fill = "red", outlier.colour = "red")

b3<-df2%>%ggplot(aes(y=Employed))+
  geom_boxplot(fill = "green", outlier.colour = "red")
   
b4<-df2%>%ggplot(aes(y=Unemployment_Rate))+
  geom_boxplot(fill = "brown", outlier.colour = "red")
ggarrange(b1, b2, b3, b4, ncol = 2, nrow = 2, common.legend = TRUE)

Değişkenler Arasındaki İlişkilerin Çoklu Çizgi Grafiklerle Gösterimi: Output (O6)

Değişkenlerin Dağılım Yapısını Ortaya Koyan Çoklu Histogram: Output (O7)

Veri Setinde Değişkenlere Ait Uç Değerlerin Çoklu Boxplot Grafiklerle Gösterimi: Output (O8)

R Kod Bloğu 4 (R4)

R4’ün çalıştırılmasıyla sırasıyla;

  1. Veri setinde Labor_Force (İşgücü) değişkenine ait tanımlayıcı istatistiklerle birlikte gözlem sayısı ile logaritması da alınarak kutu diyagramları (boxplots) çizilmiştir.
  2. Veri setinde boxplot formülü ile uç değerler hesaplanacaktır.
  3. Son durumda bulunan uç değerler veri setinden çıkarılarak tanımlayıcı istatistiklerle gözlem sayısı ile logaritması da alınarak kutu diyagramları (boxplots) çizilmiştir.
df22<-df2$Labor_Force
summary(df22)
NROW(df22)##Veri setindeki satır sayısı veya gözlem sayısı

#Boxplot 
b11<-df2%>%ggplot(aes(y=Labor_Force))+
  geom_boxplot(fill = "brown", outlier.colour = "red")

b22<-df2%>%ggplot(aes(y=log(Labor_Force)))+
  geom_boxplot(fill = "brown", outlier.colour = "red")#işgücü değişkeninin logaritması alınarak boxplot çizilmesi

ggarrange(b11, b22, ncol = 2, nrow = 1, common.legend = TRUE)

#Boxplot yaklaşımı

v1<-31052+1.5*IQR(df22)

#data subsetting
df22[df22>70188.5]

df22[df22<70188.5]

df23<-df22[df22<v1]

NROW(df23)# Uç değerler çıkarıldıktan sonra veri setinde kalan satır sayısı veya gözlem sayısı
summary(df23)#tanımlayıcı istatistikler

#Uç değerler çıkarıldıktan sonraki kutu diyagramlar
par(mfrow=c(1,2))#grid kutu diyagramlar çizilebilmesi için
boxplot(df23, ylab="Labor_Force", col = "orange", border = "blue")
boxplot(log(df23), ylab="Log(Labor_Force)", col = "red", border = "blue")

İşgücü Değişkenine Ait Tanımlayıcı İstatistikler: Output (O8)

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    102    4961   11423   50628   31052 5136341
ve Gözlem Sayısı
[1] 3214

İşgücü Değişkenine Ait Kutu Diyagramlar (Box Plots): Output (O9)

Uç Değerler Çıkarıldıktan Sonra İşgücü Değişkenine Ait Tanımlayıcı İstatistikler: Output (O9)

 Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    102    4308    9130   14525   19571   70132 
ve Gözlem Sayısı
[1] 2759

Uç Değerler Çıkarıldıktan Sonra İşgücü Değişkenine Ait Box Plot: Output (O10)

Şimdiye kadar yapılan işlemlerle daha çok veri madenciliğinin de amacına hizmet eden verinin online kaynaklardan verinin okunması ve analize uygun hale getirilmesi amaçlanmıştır. Bu aşamadan sonra veri seti ileri düzey analizlere hazır hale getirilmiştir. Burada veri madenciliği konu alanı altında pek çok diğer işlem de yapılabilir. Bu durum verinin türüne, kaynağına, analizin ve araştırmanın amacına göre farklılık göstermektedir.

Faydalı olması ve farkındalık oluşturulması dileğiyle.

Saygılarımla.

Yararlanılan Kaynaklar

https://www.ers.usda.gov/data-products/county-level-data-sets/download-data/

https://www.r-project.org/

Nitel Araştırmalarda Duygu Analizi (Sentiment Analysis) Üzerine Bir Vaka Çalışması-II

Bu çalışmanın birinci kısmında leksikonlardan NRC leksikonu örnek teşkil eden vaka çalışması niteliğinde örnek bir uygulama yapılmıştı. Şimdi ise,  “BING”, “AFINN” ve “SYUZHET” leksikonları bir önceki çalışmada kullanılan metin üzerinden örnek bir uygulaması yapılacaktır. Afinn leksikonu  Finn Årup Nielsen, Bing leksikonu ise Bing Liu ve arkadaşları tarafından geliştirilmiş olup, literatürde kendine uygulama alanı bulan leksikonlardır. SyuzhetNebraska Dil Bilim Laboratuarında (Nebraska Literary Lab) geliştirilmiş bir duygu sözlüğüdür.

Afinn leksikonunda, negatif ve pozitif kelimeler,  -5 ile +5 arasında ölçeklenir. Bing leksikonunda ise duygular basit bir şekilde negatif ve pozitif olarak sınıflandırılarak skorlanır. 

AFINN Leksikonu

Afinn leksikonundan elde edilen tanımlayıcı istatistikler aşağıda özetlenmiştir.

Elde edilen skorların toplamı 97 olduğundan ve pozitif yönlü olduğundan metinde pozitiflik hissi hakim olduğu söylenebilir. Bunu yukarıdaki tabloda ortalamanın (mean) pozitif yönlü olmasından da anlıyoruz.

Cümle sayılarına elde edilen grafik ise aşağıda gösterilmiştir.

BING Leksikonu

Bing leksikonundan elde edilen toplam skor 25 olduğundan ve pozitif yönlü olduğundan metinde pozitiflik hissi hakim olduğu söylenebilir.

SYUZHET Leksikonu

Syuzhet leksikonuna göre elde edilen tanımlayıcı istatistikler aşağıda özetlenmiştir.

Elde edilen skorların toplamı 97 olduğundan ve pozitif yönlü olduğundan metinde pozitiflik hissi hakim olduğu söylenebilir. Bunu yukarıdaki tabloda ortalamanın (mean) pozitif yönlü olmasından da anlıyoruz.

Çalışmanın 1. ve 2. kısmında, analizi yapılan bütün leksikonlar pozitiflik hissini ortaya koymuştur. Dolayısıyla ortaya konulan sonuçların birbiriyle tutarlı olduğu rahatlıkla söylenebilir.

R’da 27 Şubat 2021 tarihinde duygu analizi üzerine yaptığım “R’da Duygu Analizi Üzerine Vaka Çalışmaları: Case Studies on Sentiment Analysis in R” adlı çalışmaya aşağıdaki linkten ulaşabilirsiniz.

R’da Duygu Analizi Üzerine Vaka Çalışmaları: Case Studies on Sentiment Analysis in R

Yapılan bu çalışmaların, özellikle keşifsel veri analizi (exploratory data analysis), fikir madenciliği (opinion mining) ve nitel araştırma alanına önemli bir katkı sunacağı inancındayım.

Faydalı olması dileğiyle…

Kaynaklar

kdd04-revSummary.pdf erişimi için tıklayın

Not: Emeğe saygı adına, yapılan çalışmanın başka bir mecrada ya da ortamda paylaşılması halinde alındığı yer adının belirtilmesini rica ederim.

Saygılarımla.

Veri Madenciliği: Web Sitelerinin Keşifsel Veri Analizi Üzerine Bir Vaka Çalışması

Önceki çalışmalarda hem web ortamında hem de bilgisayarda kayıtlı “TXT” formatında kayıtlı metin verisinin kelime bulutunu oluşturmaya yönelik örnekler yapılmış ve bu verilerin hiyerarşik küme analizi yapılmıştır. Şimdi ise yapacağım örnek uygulamada, “HTML” uzantılı  web siteleri, kelime bulutu (word cloud), tanımlayıcı istatistikler ve hiyerarşik küme analizi açısından değerlendirilecektir.  Bu örnek için seçilen web sitesi “http://www.bbc.com/&#8221; ve baz alınan tarih 05/08/2018‘dir.

Uygulama adımları bir önceki örnekte açıklansa da yine adımlar detaylı bir şekilde anlatılmaya çalışılacaktır.

İlk olarak analiz için R paketleri kurulup, yüklenecektir.

#Kurulum için
install.packages(c("tm", "SnowballC", "wordcloud", "RColorBrewer", "RCurl", "XML"))

#Yüklemek için
library("tm")
library("SnowballC")
library("wordcloud")
library("RColorBrewer")
library("rvest") #HTML uzantılı web adreslerinden alınan veriyi işlemek için

Paketler yüklendikten sonra kelime bulutu oluşturulacak sitenin adresi yoluyla birlikte tanımlanır. Tanımlanan yoldan sonra, web sitesi, corpus() fonksiyonu ile indekslenerek veri temizleme işlemine geçilir. Daha sonra, kelimeler,  veri çercevesi (data frame)’ne dönüştürülerek sıklıklarına göre büyükten küçüğe doğru sıralanır. Yapılan işlemlere ilişkin kod bloğuna aşağıda yer verilmiştir.

#Veri Yolu
data    <- read_html("http://www.bbc.com/", language="en")
data   <- html_text(data)
###Veri indeksleme, temizleme ve matrise dönüştürme işlemleri
docs<-Corpus(VectorSource(data))
inspect(docs)
toSpace <- content_transformer(function (x , pattern ) gsub(pattern, " ", x))
docs <- tm_map(docs, toSpace, "/")
docs <- tm_map(docs, toSpace, "@")
docs <- tm_map(docs, toSpace, "\\|")
docs <- tm_map(docs, content_transformer(tolower))
docs <- tm_map(docs, removeNumbers)
docs <- tm_map(docs, removeWords, c("the", "for", "of","does","was","bbccook", "window","bbc","dot","com", "static", "bbc","icouk", "that","are","and","has","wwhp","cdata", "var","is","his","her","about", "will", "bbcdotcom", "bbcicouk", "bbcico","uk","typeof"))
docs <- tm_map(docs, removeWords, stopwords("english"))
docs <- tm_map(docs, removePunctuation)
docs <- tm_map(docs, stripWhitespace)
docs <- tm_map(docs, stemDocument)
#Dokuman matriksinin oluşturulması
dtm <- TermDocumentMatrix(docs)
m <- as.matrix(dtm)
#Kelimelerin sıralanarak veri çercevesine dönüştürülmesi
v <- sort(rowSums(m),decreasing=TRUE)
d <- data.frame(word = names(v),freq=v)

Veri temizleme işlemleri yapıldıktan ve veri çercevesi oluşturulduktan sonra aşağıdaki kod bloğuyla kelime bulutu oluşturulur. Kelime bulutu, kelimelerin tekrarlanma sıklığı en az 4 olan maksimum 200 kelime içinde yer alacak şekilde tanımlanmıştır.

set.seed(1234)
wordcloud(words = d$word, freq = d$freq, min.freq = 4,
max.words=200, random.order=FALSE, rot.per=0.35, 
colors=brewer.pal(8, "Dark2"))

Yukarıdaki kod bloğundan sonra 05/08/2018 tarihi itibariyle http://www.bbc.com/ haber sitesinin aşağıdaki kelime bulutu elde edilmiş olur.

Kelime bulutu oluşturulduktan sonra en sık karşılaşılan ilk 10 kelime, kod bloğu ile birlikte aşağıda verilmiştir.

library(gridExtra)
grid.table(head(d, 10))

Buna göre öne çıkan tanımlayıcı (descriptive) istatistik niteliğinde ilk 10 kelime sıklıklarına (frequencies) göre aşağıda verilmiştir.

Yapılan bu çalışmaların, özellikle keşifsel veri analizi (exploratory data analysis) ve nitel araştırma alanına giren içerik analizi (content analysis) noktasında önemli bir katkı sunacağı inancındayım.

Faydalı olması dileğiyle…

Not: Emeğe saygı adına, yapılan çalışmanın başka bir mecrada ya da ortamda paylaşılması halinde alındığı yer adının belirtilmesini rica ederim.

Saygılarımla.