Öne çıkan

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

Giriş

Genel olarak pozitif, negatif  ve nötr dilin ölçümü anlamına gelen duygu analizi, fikir madenciliği (opinion mining) olarak da anılır. Nitel araştırmanın bir yönünü oluşturan bu analizle ürünlerden, reklamlardan, lokasyonlardan, reklamlardan ve hatta rakiplerden ortaya çıkan müşteri düşüncelerini açığa çıkarılabilmektedir. Müşterilerin hoşlandığı veya hoşlanmadığı ürünlerin tespitinde bu analiz önemli rol oynayarak ürün gamı ve ürünün kalitesi şekillendirilebilmektedir. Diğer bir deyişle, firmalar müşterilerin ne hissettiğini ve düşündüğünü bilerek müşteri beklentilerini daha iyi karşılayabilir. Sağlık sektöründe de benzer durum söz konusu olabilir. Hasta beklentileri, algıları ve yönetiminin analizleri ile sağlık krizlerinde fikirlerin analizinde duygu analizlerinin yoğun bir şekilde kullanıldığı literatürden yakinen bilinmektedir. Literatürde aynı zamanda duygu analizlerinden önce kelime bulutlarının oluşturulduğu da görülmektedir.

Veri madenciliğinin (data mining) bir kolunu oluşturan metin madenciliği (text mining) metotları içinde kelime bulutları (word clouds) metinlerde en sık kullanılan anahtar kelimeleri vurgulamamıza ve görselleştirmemize olanak tanır. Bu metotlarla metin verisinden metin bulutu veya etiket bulutu diyebileceğimiz kelime bulutu oluşturulabilir. Kelime bulutları 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ı, 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

Duygu analizi (sentiment analysis) ise kendisine bir çok farklı alanda uygulama alanı bulmakta olup başlıca kullanım alanları Şekil 1 üzerinde verilmiştir:

Şekil 1: Duygu Analizi Kullanım Alanları

Duygu analizlerinde temel veri kaynaklarının sosyal medya platformları, bilim veri tabanları ve arama motorları verileri olduğu görülmektedir. Duygu analizi çalışmalarında duygu sözlükleri adı verilen “leksikon” lardan yaygın bir şekilde yararlandığı görülmektedir. Literatürde yer alan başlıca leksikonlar Şekil 2’de verilmiştir.

Şekil 2: Duygu Analizinde Kullanılan Duygu Sözlükleri

Şimdi sırayla Şekil 2’de verdiğimiz leksikonlardan kısaca bahsedelim.

Polarite Testi

En basit duygu sözlüğünü oluşturan bu testte skorlar -1 ile 1 arasında değerler almaktadır. Kelime ve cümle bazında yapılan sınıflandırmalarda negatif ve pozitif olmak iki kategori bulunmaktadır.

NRC Leksikonu

Analizde kullanılan metin NRC lexiconu açısından analiz edilmiştir. NRC lexiconu hesaplamalı dil bilimci Saif Mohammad tarafından geliştirilmiş olup bu leksikon sözlüğünde 10 duygu bulunmaktadır. Bu hisler şöyledir;

  1. positive
  2. negative
  3. Anger
  4. Anticipation
  5. Disgust
  6. Fear
  7. Joy
  8. Sadness
  9. Surprise
  10. Trust

Afinn Leksikonu

Afinn dil sözlüğü, 2009 ve 2011 yılları arasında Finn Årup Nielsen tarafından geliştirilmiş olup dil sözlüğünde skorlar -5 (negatif) ve +5 (pozitif) arasında tamsayı değerleri almaktadır.

Bing Leksikonu

Bing leksikonunda ise duygular basit bir şekilde negatif ve pozitif olarak sınıflandırılarak skorlanır.

Syuzhet Leksikonu

Syuzhet, Nebraska Dil Bilim Laboratuarında (Nebraska Literary Lab) geliştirilmiş bir duygu sözlüğüdür. “Syuzhet” adı, metni “fabula” ve “syuzhet” olmak üzere iki bileşene ayıran Rus formalist Victor Shklovsky ve Vladimir Propp’tan gelmektedir.

Loughran Leksikonu

Finansal belgelerde kullanılmak üzere geliştirilmiş duygu sözlüğüdür. Bu sözlük, kelimeleri finansal bağlamlarında ele almakta olup altı duygu kategorisinden oluşmaktadır: “olumsuz”, “pozitif”, “ihtilaflı”, “belirsizlik”, “kısıtlayıcı” veya “gereksiz” (“negative”, “positive”, “litigious”, “uncertainty”, “constraining”, or “superfluous”).

Esasında bu platform üzerinde R programlama dili kullanarak duygu analizleri üzerine 2018 yılında, kelime bulutları üzerine ise farklı tarihlerde örnek uygulamalar yapmıştım. Ancak R kodları açık kaynak olarak paylaşmamıştım. Bu çalışma kapsamında yapılan örnek uygulama ile ilk olarak metnin kelime bulutları oluşturulmuş, ardından ise dil sözlükleri kullanılarak eş zamanlı olarak duygu analizleri yapılmıştır. Aşağıda göreceğiniz üzere en ince ayrıntısına kadar bütün R kodları paylaşılmıştır. Yapacağınız tek şey minor değişikliklerle kendi çalışmalarınıza uyarlamanızdır. Ancak temel R programlama bilginizin olması tavsiye edilir.

Metodoloji ve Uygulama Sonuçları

Örnek uygulama kapsamında ilk metin verisi 30.01.2021 tarihinde ücretsiz e-kitapların çeşitli formatlarda yayınlandığı https://www.gutenberg.org/ebooks/50540 adresinden alınmıştır. Metin verisi olarak alınan eserin adı Zeyneb Hanoum tarafından kaleme alınan Bir Türk Kadınının Avrupa İzlenimleri (A Turkish Woman’s European Impressions)‘dir. Eser 23 Kasım 2015 tarihinde https://www.gutenberg.org sitesinde yayınlanmıştır. Bu metin verisi ile yukarıda linki verilen web uygulaması üzerinden kelime bulutları oluşturulacaktır. Örnek uygulama metnini word (docx) formatında aşağıdaki linkten indirebilirsiniz.

Bir Türk Kadınının Avrupa İzlenimleri

Örnek uygulama kapsamında ikinci metin pdf formatında olup, Dünya Bankası tarafından 5 Ocak 2021 tarihinde 234 sayfalık Küresel Ekonomik Beklentiler (Global Economic Prospects) raporudur. Rapor https://openknowledge.worldbank.org/bitstream/handle/10986/34710/9781464816123.pdf?sequence=15&isAllowed=y url adresinde yayınlanmıştır.  Bu raporla ilgili 22 Şubat 2021 tarihinde blog sitemde, 23 Şubat 2021 tarihinde ise Sanayi Gazetesi’nde “Küresel Ekonomik Beklentiler 2021 Ocak Dönemi Raporuadlı yazım yayımlanmıştır. Raporu incelediğim için acaba bu raporun kelime bulutu ve duygu analizini de yapsam nasıl olur diye kendime sordum 🙂 . Neticede denemesi bedava 🙂 . Bu soru beni bu raporun kelime bulutlarını oluşturmaya ve duygu analizlerini yapmaya itmiştir. Bu çalışma kaynağından okunarak hem kelime bulutları çıkarılmış, ardından duygu analizleri yapılmıştır. İlk örnek uygulamanın aksine bu çalışma pdf formatında olan metinlerin analizini içerdiğinden bu yönüyle farklılık göstermektedir. Bu kısımdaki analiz 3. PDF dokümanların kelime bulutlarının çıkarılması ve duygu analizlerinin yapılması başlığı altında ele alınmıştır.

Örnek uygulama kapsamında 3. çalışma sentetik veriler üretilip kelime bulutlarının oluşturulmasıdır. 3. çalışma kapsamında sentetik olarak üretilen kelimelerin büyük bir çoğunluğu İstiklal Marşımızdan alınmıştır. Burada sentetik verilerin üretilmesinde tekrarlı örnekleme tekniği kullanılmış ve 10.000 gözlem üretilmiştir. Bu gözlemler üzerinde kelime bulutları oluşturulmuştur. Bu bölümdeki analiz ise 4. Sentetik veriler üzerinden kelime bulutlarının oluşturulması başlığı altında irdelenmiştir.

Çalışma kapsamında ilk olarak metnin kelime bulutları oluşturulmuş, ardından ise dil sözlükleri kullanılarak duygu sözlüklerine göre duygu analizleri yapılmıştır. İlk olarak analizde kullanılacak R kütüphanelerini vererek işe başlayalım. Aşağıda gerekenden fazla kütüphane verdiğimi biliyorum. Ancak daha çok esneklik ve estetik tasarım tanıdığı için genellikle olması gerekenden fazla kütüphane ile çalışıyorum. Kelime bulutlarının oluşturulması ve duygu analizlerinde kullanılan temel paketler “sentimentr”,”webshot”,”stringr”, “wordcloud”, “wordcloud2″,”RColorBrewer”, “htmlwidgets”,”syuzhet” paketleridir. Analizlerde R programlama dili kullanılmıştır. Bulguların çalışma kitaplarına yazdırılmasında ise xlsx uzantılı Microsoft Excel çalışma kitapları kullanılmıştır.

Yüklenecek Kütüphaneler

#Kütüphaneler

kütüphane<-c("dplyr","tibble","tidyr","ggplot2","ggthemes","readr","readxl","ggpubr","formattable", "ggstance", "pastecs","writexl", "psych", "GGally","pander", "rstatix", "stringr", "sentimentr","webshot","stringr","wordcloud", "wordcloud2","RColorBrewer", "htmlwidgets","syuzhet")
yükle<-sapply(kütüphane, require, character.only = TRUE)

#Kütüphane yüklenme durumunu gösteren tablo

tablo=suppressWarnings(yükle, classes = "warning")
  
isim=names(tablo)
  
deger=as_tibble(tablo)
  
data.frame(sira=1:length(isim), kutuphane=isim, yuklenme_durumu=deger$value) %>% mutate(yuklenme_durumu=if_else(yuklenme_durumu==TRUE, "Yuklendi", "Paket Kurulumu Gerekli")) %>% pander(caption="Kütüphane Yüklenme Bilgisi")

Yukarıdaki R kod bloğunun çalıştırılmasından sonra yukarıdaki kütüphanelerin yüklenip yüklenmediğine dair aşağıdaki gibi mantıksal vektör sonuçları gelecektir. Eğer mantıksal vektör sonuçlarının hepsi TRUE ise kütüphanelerin hepsini yüklenmiştir demektir. Kolaylık sağlaması açısından yukarıda kütüphanelerin yüklenmesini gösterir tabloyu da elde etmek ve daha kolay okumanız için yukarıdaki kod bloğu içerisinden kısa bir kod yazdım. Bu kod çalıştırıldığında aşağıdaki tabloda görüleceği üzere bütün kütüphaneler yüklenmiştir. Eğer ilgili kütüphane yüklenmemiş olursa “Paket Kurulumu Gerekli” ifadesi satırda yazacaktır. Satırda yazan bu uyarı metnine göre paketi ya kurar yada yüklersiniz. Bir paketin kurulması ile yüklenmesinin aynı şey olmadığını burada ifade etmek gerekir konuyu yabancı olanlar için. Paket kurulumu ilk defa yapılan bir işlem iken, paketin yüklenmesi zaten kurulan bir paketin yüklenmesi yani çalışır duruma getirilmesidir. İlk defa bir paket kurulumu gerçekleştiriliyorsa install.packages() fonksiyonunu, zaten bir paket kurulumu gerçekleştirilmiş ise ilgili paketin veya kütüphanenin yüklenmesi veya okunması için library() veya require() fonksiyonlarını kullanıyoruz. Fonksiyonlardaki parantez () içerisine yüklenecek paket veya kütüphane adını yazıyoruz.

---------------------------------------
 sira    kutuphane     yuklenme_durumu 
------ -------------- -----------------
  1        dplyr          Yuklendi     

  2        tibble         Yuklendi     

  3        tidyr          Yuklendi     

  4       ggplot2         Yuklendi     

  5       ggthemes        Yuklendi     

  6        readr          Yuklendi     

  7        readxl         Yuklendi     

  8        ggpubr         Yuklendi     

  9     formattable       Yuklendi     

  10      ggstance        Yuklendi     

  11      pastecs         Yuklendi     

  12      writexl         Yuklendi     

  13       psych          Yuklendi     

  14       GGally         Yuklendi     

  15       pander         Yuklendi     

  16      rstatix         Yuklendi     

  17      stringr         Yuklendi     

  18     sentimentr       Yuklendi     

  19      webshot         Yuklendi     

  20      stringr         Yuklendi     

  21     wordcloud        Yuklendi     

  22     wordcloud2       Yuklendi     

  23    RColorBrewer      Yuklendi     

  24    htmlwidgets       Yuklendi     

  25      syuzhet         Yuklendi     
---------------------------------------

Table: Kütüphane Yüklenme Bilgisi

1. Kelime bulutlarının oluşturulması

Bu kısımda bahse konu metin üzerinden adım adım kelime bulutları oluşturulacaktır. Kelime bulutlarının oluşturulması frekanslara göre oluşturulduğundan metnin dili çok belirleyici olmamaktadır. Ancak duygu analizinde durum biraz farklıdır. Yani duygu analizi yapıyorsanız metnin bulunduğu dili destekleyen bir R kütüphanesi ile çalışmak zorundasınız. Bunu da yeri gelmişken burada ifade etmekte yarar olduğunu düşünüyorum.

Veri setinin okunması

bs1 <- read.delim("metin.txt", col.names = "cumle")
bs1

Veri setindeki ilk 10 satırı tablo formatında aşağıda yazılan kod bloğu ile verebiliriz.

bs1 %>% head(10) %>% formattable()

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

Veri setinin yapısının incelenmesi

Aşağıda yazılan kod bloğu ile veri setindeki değişken tipi ve gözlem sayısı ortaya konulmuştur.

glimpse(bs1)

#alternatif
str(bs1)

Yukarıdaki kod bloğu çalıştırıldığında aşağıda verildiği üzere veri setinin 3,264 gözlemden yani cümleden oluştuğu, değişken tipinin ise karakter yani nominal olduğu görülmektedir. Veri setinin 1 değişkenden oluştuğu ve değişkenin “cumle” olduğu da görülmektedir.

Rows: 3,264
Columns: 1
$ cumle <chr> "This eBook is for the use of anyone anywhere at no cost and with", "almost no restrictions w...

Metin verisinin kelime bulutu oluşturulmadan önce temizlenmesi ve çıkarılacak kelimelerin belirlenmesi

Bu kısımda ilk olarak aşağıda yazılan kelimeler metinden çıkarılacaktır. Bu kısımda ister Türkçe isterse diğer dillerde çıkarılacak kelimeleri belirleyebilirsiniz.

rmv1<-c("may", "can","years","age","mean","diet", "qol","based","dog","two","per","model","will","is","aarc","results","label","among","are","level","cancer", "used","many", "nlm", "data", "study", "p", "n", "net", "biochar", "aloe", "ses", "systems","avs", "acid","rate","aha","year","time","since","stroke", "however", "p lt", "ssris", "score", "index","hia", "largest", "current", "ncds", "found", "labelobjective", "It","yet","models", "vera","total", "also", "ptsd", "lt", "sroi", "icdm", "scores", "new", "arm", "china", "sample", "semen", "survey", "labelconclusions","within","labelbacground","range","followed","tagsnps","mbovis","labeldesign","increased","published", "likely", "nlmcategorymethods", "acids", "fatty", "employersponsored","labelmethods", "using", "conclusions","setting", "whether","findings","crosssectional", "one", "three","review","associated", "analysis", "studies", "nlmcategory", "background", "nlmcategorymethods", "in", "of", "and", "as", "19", "the","have","were","an", "was", "during", "to", "for","a", "cth","or","hcs", "this", "u","ci", "t", "la", "043d", "064a","043b", "062a", "trastuzumab","ewars","research", "either", "ipps73","ippss","87,017", "ofips", "15,000", "eshre","tdabc","thaihealth", "0.157", "and", "analyzed", "methods", "terms", "subjects", "being", "there", "compared", "while",  "when", "their","these","between", "his","her", "which", "that","who", "after","related","higher","group", "other","each","those","lower", "number","rates","first", "about", "groups","through","including", "across", "should", "must", "have","months","adjusted", "analyses", "estimated", "could", "would", "without", "further", "versus", "cross", "method", "follow", "general", "under", "below", "estimate","following", "received", "available", "before", "aimed", "collected", "often", "often","include","relevant","having","therefore","because","thus", "gutenberg","almost", "license", "ebook", "anyone", "anywhere", "title", "author", "enough", "nothing", "cannot", "really", "never", "again", "wwwgutenbergorg", "whatsoever", "editor", "chapter","perhaps", "shall", "every","where", "been", "more", "than", "even", "with", "what",  "who", "when", "only", "your", "into", "in", "on", "always", "online", "copy", "away", "back", "myself", "still")

Bu kısımda aşağıda yazılan kod bloğundaki satırlarda sırasıyla;

  • Metindeki harflerin tamamı küçük harfe dönüştürülmüştür.
  • Metindeki noktalama işaretleri kaldırılmıştır.
  • Metinle iç içe geçmiş (kızgın325 gibi) rakam ve sayılar metinden ayıklanmıştır.
  • Metinden rakam ve sayılar çıkarılmıştır.
  • Yukarıdaki belirtilen kelimeler metinden çıkarılmıştır. Burada dikkat edilirse çıkarılan kelimeler daha çok zamir, sıfat, edat ve bağlaçlardır. İsteğe bağlı olarak burada değişiklikler yapabilirsiniz.
  • Karakter sayısı 3’ten büyük kelimeler filtrelenmiştir. İsteğe bağlı olarak burada değişiklikler yapabilirsiniz.
  • Metin istenmeyen formatta kelimeler varsa ve bu kelimeleri çıkarmanız analize zarar verecekse yerine kelimeler atayabilirsiniz.
  • Metnin değişiklikler sonrası “tibble” tablo düzenine dönüştürülmüştür.
tr<-bs1 %>% mutate(word=str_to_lower(cumle))%>% unnest_tokens(word, cumle) # Metindeki harflerin tamamı küçük harfe dönüştürülmüştür.
tr<-tr %>% mutate(word=removePunctuation(word)) # Metindeki noktalama işaretleri kaldırılmıştır.
tr<-tr %>% mutate(word=str_squish(word)) # Metinle iç içe geçmiş (kalem325) rakam ve sayılar metinden ayıklanmıştır.
tr<-tr %>% mutate(word=removeNumbers(word)) # Metinden rakam ve sayılar çıkarılmıştır.
tr<-tr %>% filter(!word %in% rmv1) # Yukarıdaki belirtilen kelimeler metinden çıkarılmıştır. Burada dikkat edilirse çıkarılan kelimeler daha çok zamir, sıfat, edat ve bağlaçlardır. İsteğe bağlı olarak burada değişiklikler yapabilirsiniz.
tr<-tr %>% filter(str_length(word)>3) # Karakter sayısı 3'ten büyük kelimeler filtrelenmiştir. İsteğe bağlı olarak burada değişiklikler yapabilirsiniz.
tr<-str_replace(tr$word, "[ı]", "i") # Metin istenmeyen formatta kelimeler varsa ve bu kelimeleri çıkarmanız analize zarar verecekse yerine kelimeler atayabilirsiniz.
tr<-tr %>% as_tibble()%>%rename(word=value) # Metnin değişiklikler sonra tibble tablo düzenine dönüştürülmüştür.
tr

Kelime sıklıklarının ortaya konulması

Aşağıda yazılan kod bloğunda metindeki kelimelerin sıklıkları bulunmuş, ardından ise frekansı en yüksek ilk 50 kelime verilmiştir. En sonda ise kelimeler ve frekansları xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmıştır.

# Kelime sıklıklarının elde edilmesi
sayi<-tr %>% group_by(word) %>% count() %>% arrange(desc(n))
sayi<-sayi %>% add_column(id=1:NROW(sayi),.before = "word")
sayi

#Frekansı en yüksek ilk 50 kelime
sayi %>% head(50)  %>% pander(caption="Frekansı En Yüksek İlk 50 Kelime")

#xlsx uzantılı çalışma kitabına sıklıklarına göre kelimelerin yazdırılması
write_xlsx(sayi, "kelimeler.xlsx")

Yukarıdaki kod bloğunda ikinci alt blok çalıştırıldığında elde edilen frekansı en yüksek ilk 50 kelime aşağıda verilmiştir.

---------------------------
 id        word         n  
---- ---------------- -----
 1         they        250 

 2       turkish       154 

 3         from        138 

 4        women        130 

 5         life        97  

 6        little       84  

 7         them        82  

 8        woman        79  

 9       country       66  

 10        know        66  

 11       people       64  

 12        same        55  

 13        come        54  

 14        like        54  

 15       zeyneb       54  

 16       turkey       52  

 17        here        50  

 18        much        50  

 19        very        50  

 20        said        47  

 21        some        47  

 22       think        46  

 23        most        44  

 24        such        43  

 25        then        43  

 26       harem        42  

 27        find        40  

 28       great        40  

 29        long        38  

 30        west        38  

 31      western       38  

 32       friend       37  

 33        ever        36  

 34        over        35  

 35        seen        35  

 36       asked        34  

 37        came        34  

 38     understand     34  

 39       house        32  

 40       paris        32  

 41        went        32  

 42        made        31  

 43        read        31  

 44        told        31  

 45        left        30  

 46      thought       30  

 47   constantinople   29  

 48       seemed       29  

 49        tell        29  

 50      another       28  
---------------------------

Table: Frekansı En Yüksek İlk 50 Kelime

Yukarıdaki kod bloğunda üçüncü alt blok çalıştırıldığında elde edilen kelimeler ve frekansları xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmış olup aşağıda linkten indirebilirsiniz.

Kelime bulutlarının oluşturulması

Bu kısımda aynı metinden birden fazla kelime bulutu oluşturulacaktır. İlk kelime bulutunu wordcloud kütüphanesini kullanarak aşağıdaki kod bloğunda verelim. Aşağıda yazılan kod bloğunda kelime frekansımız minimum 20, maksimum 200 olacak şekilde düzenledik. Dilerseniz wordcloud fonksiyonu içerisindeki parametreleri değiştirerek farklı alternatifler deneyebilirsiniz.

set.seed(1923) # Aynı sonuçları almak için sabitlenmiştir.
wordcloud(words = sayi$word, freq = sayi$n, min.freq = 20,
          max.words=200, random.order=FALSE, rot.per=0.35, 
          colors=brewer.pal(8, "Dark2"))

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde ettiğimiz kelime bulutu aşağıda verilmiştir. Aşağıdaki kelime bulutunda dikkat edeceğiniz üzere metinde hala temizlenmeyi bekleyen “they”, “whom”, “till”, “does”, “over”, “from”, “just”, “here”, “some” gibi zamir, yardımcı fiiller ve yer zarfları bulunmaktadır. Literatürde yapılan çalışmalarda bu hususa çok dikkat edildiği söylenemez ama siz dikkat etmelisiniz iyi bir araştırma ortaya koymak açısından. Metin verisinin kelime bulutu oluşturulmadan önce temizlenmesi ve çıkarılacak kelimelerin belirlenmesi başlığı altında yer alan kod bloğundaki vektör içerisine bahsettiğim bu kelimeleri girerek kelime bulutundan bu kelimeleri çıkarabilirsiniz.

Şimdi de diğer kütüphanemiz olan wordcloud2‘yi kullanarak kelime bulutları oluşturalım. Burada aynı zamanda oluşturulan kelime bulutu png ve html uzantılı olarak da kaydedilmektedir. Aşağıda yazılan kod bloğunda en yüksek frekansa sahip ilk 250 satırdaki kelimelerin frekansı ele alınmıştır.

#kelime bulutunun oluşturulması
hw1=wordcloud2(head(sayi[,2:3], 250), size=1, minSize = 10, shape = "circle", color = "random-light",backgroundColor = "black")

#html ve png olarak kaydedilmesi
saveWidget(hw1,"26.html",selfcontained = F)
webshot::webshot("26.html","hw1.png",vwidth = 1800, vheight = 1000, delay =10)

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde ettiğimiz kelime bulutu aşağıda verilmiştir.

Farklı düzenlerde kelime bulutunu elde etmek mümkündür. Yıldız şeklinde eğer kelime bulutu elde etmek istersek yazacağımız kod bloğunda yapacağımız tek şey shape parametresinde “star” şeklinde değişiklik yapmaktır.

#kelime bulutunun oluşturulması
hw1=wordcloud2(head(sayi[,2:3], 250), size=1, minSize = 10, shape = "star", color = "random-light",backgroundColor = "black")

#html ve png olarak kaydedilmesi
saveWidget(hw2,"27.html",selfcontained = F)
webshot::webshot("27.html","hw1.png",vwidth = 1800, vheight = 1000, delay =10)

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde ettiğimiz kelime bulutu aşağıda verilmiştir.

Şimdide aşağıda yazılan kod bloğunda beşgen (pentagon) düzeninde ve gri arka planında başka bir kelime bulutu oluşturalım. Aynı zamanda veri setinde frekansı en yüksek ilk 350 kelimeyi baz alalım.

#kelime bulutunun oluşturulması
hw1=wordcloud2(head(sayi[,2:3], 350), size=1, minSize = 10, shape = "pentagon", color = "random-light",backgroundColor = "grey")

#html ve png olarak kaydedilmesi
saveWidget(hw2,"27.html",selfcontained = F)
webshot::webshot("27.html","hw1.png",vwidth = 1800, vheight = 1000, delay =10)

Yukarıda yazılan kod bloğunun çalıştırılmasından sonra elde edilen beşgen (pentagon) düzeninde ve gri arka planında kelime bulutu aşağıda verilmiştir.

2. Duygu analizlerinin yapılması

Bu kısımda yukarıda giriş kısmında bahsedilen dil sözlükleri kullanılarak duygu analizleri yapılacaktır.

Polarite testi

Bu kısımda aşağıda yazılan kod bloğu ile kelime bazlı polarite testi yapılmıştır. Cümle bazlı polarite testi yapılabileceğini hatırlatmakta fayda vardır.

polarite<-sentiment(tr$word)

tablo<-cbind(tr$word, polarite[,c(3,4)])

  ggplot(tablo, aes(word_count, sentiment))+
  geom_point(color="blue")+
  geom_hline(yintercept = mean(tablo$sentiment), color="red", size=1)+
  labs(y = "Skor", x = "Kelimelerin Frekansı") +
  theme_igray()+
  labs(caption = "Veri Kaynağı: A Turkish Woman’s European Impressions adlı eserden Tevfik Bulut tarafından analiz edilmiştir.") +
  theme(plot.caption = element_text(hjust = 0, face = "italic"))

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen polarite skorları aşağıdaki grafikte verilmiştir. Daha önce polarite skorlarının -1 ile +1 arasında değiştiğini ifade etmiştik. Elde edilen bulgular eserde hakim olan duygunun nötr (0)’e yakın olduğunu göstermektedir.

Polarite test sonuçlarına ilişkin tanımlayıcı istatistikler ise aşağıda yazılan kod bloğu ile elde edilmiştir.

stat.desc(polarite$sentiment, basic=T) %>% pander()

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Polarite testi tanımlayıcı istatistikleri aşağıdaki tabloda verilmiştir. Elde edilen ortalama (0,02947) polarite test değeri nötr (0)’e yakın bir görünüm sergilemektedir.

----------------------------------------------------------------------------
 nbr.val   nbr.null   nbr.na   min   max   range    sum    median    mean   
--------- ---------- -------- ----- ----- ------- ------- -------- ---------
  14754     10936       0      -1     1      2     434.8     0      0.02947 
----------------------------------------------------------------------------

Table: Table continues below

 
-------------------------------------------------------
 SE.mean    CI.mean.0.95    var     std.dev   coef.var 
---------- -------------- -------- --------- ----------
 0.002724     0.00534      0.1095   0.3309     11.23   
-------------------------------------------------------

Bing leksikonu

Aşağıda yazılan kod bloğu ile Bing leksikonu duygu grupları (pozitif ve negatif) elde edilmiştir.

d6<-sayi[,-1] %>% inner_join(get_sentiments("bing"),by="word")
d6[,c(1,3,2)]%>% group_by(sentiment) %>% arrange(desc(n)) %>%
  top_n(10) %>%
  ggplot(aes(x=reorder(word,n), y=n, fill = sentiment)) +
  geom_col(show.legend = FALSE) +
  facet_wrap(~sentiment, scales = "free_y") +
  labs(
    y = "Kelime",
    x = "Sıklık"
  ) +
  coord_flip()+
 theme_hc()+
 labs(caption = "A Turkish Woman’s European Impressions adlı eserden Tevfik Bulut tarafından analiz edilmiştir.")+
 theme(plot.caption = element_text(hjust = 0, face = "italic"))

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Bing leksikonu sonuçları kelime frekansı en yüksek olan ilk 10 kelimeye göre aşağıdaki grafikte verilmiştir. Elde edilen bulgular metinde baskın olan duygunun olumlu (pozitif) olduğunu göstermektedir.

Bing leksikonuna ilişkin tanımlayıcı istatistikler ise aşağıda yazılan kod bloğunda verilmiştir.

d6<-sayi[,-1] %>% inner_join(get_sentiments("bing"),by="word")
#duygu grubuna göre frekanslar
d6[,c(1,3,2)]%>% group_by(sentiment) %>% summarise(toplam=sum(n)) %>% mutate(oran=round(toplam/sum(toplam)*100,2)) %>% arrange(desc(oran)) %>% formattable()

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Bing leksikonu tanımlayıcı istatistikleri aşağıdaki tabloda verilmiştir. Aşağıda verilen bulgudan şu bilgi çıkarılmalıdır: Metinde pozitif kelimelerin frekansı ve frekansların oranı (n=1119, frekansların toplam içindeki oranı = %52,09) negatif olanlardan daha yüksek olduğundan metinde pozitif duygu daha ağır basmaktadır.

Afinn leksikonu

Afinn dil sözlüğünde skorlar -5 (negatif) ve +5 (pozitif) arasında tamsayı değerleri almaktadır. Afinn leksikonu bulguları aşağıda yazılan kod bloğu ile elde edilmiştir.

#Afinn leksikon değerlerinin elde edilmesi
d6<-tr %>% inner_join(get_sentiments("afinn"),by="word")

#Tanımlayıcı istatistikler
stat.desc(d6$value, basic=T) %>% pander()

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Afinn leksikonu tanımlayıcı istatistikleri aşağıdaki tabloda verilmiştir. Aşağıda verilen bulgudan şu bilgi çıkarılmalıdır: Afinn leksikon sonuçlarına bakıldığında merkezi dağılım ölçülerinden biri olan ortalama 0,3821 olduğu için metinde nötr (0)’ün biraz üstünde ve pozitife yakın duyguların daha ağırlıkta olduğu söylenebilir.

-------------------------------------------------------------------------
 nbr.val   nbr.null   nbr.na   min   max   range   sum   median    mean  
--------- ---------- -------- ----- ----- ------- ----- -------- --------
  1879        0         0      -4     4      8     718     1      0.3821 
-------------------------------------------------------------------------

Table: Table continues below

 
-----------------------------------------------------
 SE.mean   CI.mean.0.95    var    std.dev   coef.var 
--------- -------------- ------- --------- ----------
 0.04935      0.0968      4.577    2.139     5.599   
-----------------------------------------------------

Loughran leksikonu

Loughran leksikonunda kelimeler altı duygu kategorisinde ele alınır: “olumsuz”, “pozitif”, “ihtilaflı”, “belirsizlik”, “kısıtlayıcı” veya “gereksiz” (“negative”, “positive”, “litigious”, “uncertainty”, “constraining”, or “superfluous”). Loughran leksikonu bulguları aşağıda yazılan kod bloğu ile elde edilmiştir.

#Loughran leksikon değerlerinin elde edilmesi
l1<-tr %>% inner_join(get_sentiments("loughran"),by="word")

#Duygu grubuna göre frekanslar
l1 %>% group_by(sentiment) %>% summarise(toplam=n()) %>% mutate(oran=round(toplam/sum(toplam)*100,2)) %>% arrange(desc(oran)) %>% formattable()

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Loughran leksikonu tanımlayıcı istatistikleri aşağıdaki tabloda verilmiştir. Aşağıda verilen bulgudan şu sonuç çıkarılmalıdır: %45,53 ile negatif duygunun metnin genelinde baskın olduğu görülmektedir. Metinde negatif duyguyu pozitif ve belirsizlik duyguları izlemiştir.

Loughran leksikonu sonuçları aşağıda yazılan kod bloğu ile grafik üzerinde de verebiliriz.

  l1 %>% 
  group_by(sentiment) %>% summarise(n=n())%>%
  ggplot(aes(reorder(sentiment, n), n, fill=sentiment)) +
  geom_bar(stat="identity", show.legend = FALSE)+
  labs(y = "Frekans", x = "Duygu")+
  theme_igray()+
  labs(caption = "Veri Kaynağı: A Turkish Woman’s European Impressions adlı eserden Tevfik Bulut tarafından analiz edilmiştir.")+
  theme(plot.caption = element_text(hjust = 0, face = "italic"))

Yukarıdaki kod bloğu çalıştırıldığında Loughran leksikonuna göre metinden elde edilen duygular aşağıdaki grafikte verilmiştir.

Dil sözlükleri içerisinde duygu kategorisine filtreleme yapmak oldukça kolaydır. Örnek teşkil teşkil etmesi adına Loughran leksikonunda pozitif olarak etiketlenen kelimelerden ilk 50’sini aşağıda yazılan kod bloğu ile verelim. Dilersek pozitif olarak etiketlenen kelimelerin tamamı elde edebilir ve xlsx uzantılı çalışma kitaplarına yazdırabiliriz. Benzer işlemleri diğer dil sözlüklerinde de yapabiliriz.

l1 %>% filter(sentiment=='positive') %>% head(50) %>% pander(caption="Pozitif olarak etiketlenen ilk 50 kelime")

Yukarıdaki kod bloğunun çalıştırılmasından sonra metinde pozitif olarak etiketlenen ilk 50 kelime aşağıdaki tabloda verilmiştir.

-------------------------
    word       sentiment 
------------- -----------
    good       positive  

    dream      positive  

    great      positive  

    easy       positive  

   better      positive  

    great      positive  

  greatest     positive  

 diligently    positive  

  progress     positive  

 exclusively   positive  

    great      positive  

    great      positive  

  happiness    positive  

  pleasure     positive  

    great      positive  

    great      positive  

   highest     positive  

  beautiful    positive  

   pleased     positive  

  strength     positive  

   better      positive  

  pleasure     positive  

   perfect     positive  

  delighted    positive  

   impress     positive  

    great      positive  

    best       positive  

  stronger     positive  

  beautiful    positive  

  beautiful    positive  

   winner      positive  

    great      positive  

  satisfied    positive  

    great      positive  

    great      positive  

  beautiful    positive  

    happy      positive  

  greatest     positive  

    easy       positive  

    great      positive  

    great      positive  

  pleasure     positive  

    able       positive  

  stronger     positive  

   invent      positive  

    great      positive  

   better      positive  

   leading     positive  

 compliment    positive  

    great      positive  
-------------------------

Table: Pozitif olarak etiketlenen ilk 50 kelime

Şimdide Loughran leksikonunda duygulara göre etiketlenmiş kelimelerin tamamını aşağıda yazılan kod bloğu ile verelim.

l1<-tr %>% inner_join(get_sentiments("loughran"),by="word")
write_xlsx(l1, "loughranleksikonu.xlsx")

Yukarıdaki kod bloğunun çalıştırılmasından sonra Loughran leksikonundaki duygu kategorilerine göre etiketlenmiş metindeki bütün kelimeler xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmış olup aşağıdaki linkten indirebilirsiniz.

Loughran leksikonundaki duygu kategorilerine göre etiketlenmiş 50 kelimeyi olasılıklı örnekleme yöntemlerden biri olan ve önyargı (bias) içermeyen tekrarsız basit tesadüfi örnekleme yöntemi kullanarak seçmek için aşağıdaki gibi basit bir kod satırı yazalım.

set.seed(1985) # Örneklemde aynı gözlem birimlerinin elde edilmesi için sabitlenmiştir.
tr %>% inner_join(get_sentiments("loughran"),by="word") %>% sample_n(50) %>% pander(caption="Basit Tekrarsız Örnekleme Yöntemi İle Seçilen Kelimeler ve Duygu Etiketleri")

Loughran leksikonundaki duygu kategorilerine göre etiketlenmiş 50 kelime tekrarsız basit tesadüfi örnekleme yöntemi kullanarak belirlenmiş ve aşağıdaki tabloda verilmiştir.

-----------------------------
     word        sentiment   
-------------- --------------
 exceptional      positive   

  neglected       negative   

     poor         negative   

    doubt       uncertainty  

    unjust        negative   

  delighted       positive   

    strict      constraining 

     hurt         negative   

   possible     uncertainty  

   pleased        positive   

     risk       uncertainty  

    great         positive   

 disastrously     negative   

    error         negative   

    slowly        negative   

     good         positive   

     late         negative   

   probably     uncertainty  

   believed     uncertainty  

    risked      uncertainty  

     good         positive   

    great         positive   

   exposed        negative   

 permissible    constraining 

    force         negative   

   perfect        positive   

    great         positive   

    great         positive   

    ceased        negative   

    might       uncertainty  

 unknowingly      negative   

     lost         negative   

   against        negative   

    strong        positive   

    court        litigious   

    great         positive   

   pleasure       positive   

   suddenly     uncertainty  

  satisfied       positive   

  exaggerate      negative   

    vague       uncertainty  

   believed     uncertainty  

  excitement      positive   

     best         positive   

    great         positive   

  criticism       negative   

   harmful        negative   

 disappointed     negative   

   pleasure       positive   

  suffering       negative   
-----------------------------

Table: Basit Tekrarsız Örnekleme Yöntemi İle Seçilen Kelimeler ve Duygu Etiketleri

Nrc leksikonu

NRC dil sözlüğünde 10 duygu bulunmaktadır. Bu duygular şöyledir:

  1. positive
  2. negative
  3. Anger
  4. Anticipation
  5. Disgust
  6. Fear
  7. Joy
  8. Sadness
  9. Surprise
  10. Trust

Aşağıda yazılan kod bloğu ile Nrc leksikonuna göre metindeki duygular ortaya konulmuştur.

#Nrc leksikon değerlerinin elde edilmesi
nrc<-tr %>% inner_join(get_sentiments("nrc"),by="word")

#Duygu grubuna göre frekanslar
nrc %>% group_by(sentiment) %>% summarise(toplam=n()) %>% mutate(oran=round(toplam/sum(toplam)*100,2)) %>% arrange(desc(oran)) %>% formattable()

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Nrc leksikonu tanımlayıcı istatistikleri aşağıdaki tabloda verilmiştir. Aşağıda verilen bulgudan şu sonuç çıkarılmalıdır: %22,12 ile pozitif duygunun metnin genelinde baskın olduğu görülmektedir. Metinde pozitif duyguyu negatif ve güven (trust) duyguları izlemiştir.

Nrc leksikonu sonuçlarına frekansı en yüksek ilk 5 kelime duygu kategorilerine göre aşağıda yazılan kod bloğu ile grafik üzerinde de verilmiştir.

   nrc  %>% 
   group_by(sentiment) %>% 
   count(word, sort=T) %>% 
   top_n(5) %>% 
   ggplot(aes(reorder(word, n), n, fill=sentiment)) +
   geom_bar(stat="identity", show.legend = FALSE) +
   facet_wrap(~sentiment, scales="free_y", ncol=5) +
   labs(y = "Frekans", x = NULL) +
   coord_flip()+
   labs(caption = "Veri Kaynağı: A Turkish Woman’s European Impressions adlı eserden Tevfik Bulut tarafından analiz edilmiştir.")+
   theme(plot.caption = element_text(hjust = 0, face = "italic"))

Yukarıdaki kod bloğu çalıştırıldığında Nrc leksikonuna göre metinden elde edilen duygular aşağıdaki grafikte verilmiştir.

Syuzhet leksikonu

Syuzhet leksikonu -1 +1 değeri arasında değer almaktadır. Bu leksikona dair bulgular aşağıda yazılan kod bloğu ile elde edilmiştir.

#Syuzhet leksikon değerlerinin elde edilmesi
sskor=get_sentiment(as.vector(tr$word), method="syuzhet")
syuzhet=tibble(kelime=tr$word, skor=sskor)

#Tanımlayıcı istatistikler
stat.desc(syuzhet$skor, basic=T) %>% pander()

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Syuzhet leksikonu tanımlayıcı istatistikleri aşağıdaki tabloda verilmiştir. Aşağıda verilen bulgudan şu bilgi çıkarılmalıdır: Syuzhet leksikon sonuçlarına bakıldığında merkezi dağılım ölçülerinden biri olan ortalama 0,02742 olduğu için metinde nötr (0)’ün biraz üstünde ve pozitife yakın duyguların daha ağırlıkta olduğu söylenebilir. Syuzhet testinde elde edilen ortalama değer ile polarite (negatif ve pozitif duygular) testi sonucu elde edilen ortalama (0,02947) değer birbirine oldukça yakındır.

----------------------------------------------------------------------------
 nbr.val   nbr.null   nbr.na   min   max   range    sum    median    mean   
--------- ---------- -------- ----- ----- ------- ------- -------- ---------
  14754     11031       0      -1     1      2     404.5     0      0.02742 
----------------------------------------------------------------------------

Table: Table continues below

 
-------------------------------------------------------
 SE.mean    CI.mean.0.95    var     std.dev   coef.var 
---------- -------------- -------- --------- ----------
 0.002631     0.005157     0.1021   0.3196     11.66   
-------------------------------------------------------

3. PDF dokümanların kelime bulutlarının çıkarılması ve duygu analizlerinin yapılması

Bu kısımda bahse konu metin üzerinden adım adım kelime bulutları oluşturulacaktır. Kelime bulutlarının oluşturulması frekanslara göre oluşturulduğundan metnin dili çok belirleyici olmamaktadır.

Veri setinin kaynağından okunması

#Raporun bulunduğu URL adresi
url="https://openknowledge.worldbank.org/bitstream/handle/10986/34710/9781464816123.pdf?sequence=15&isAllowed=y"
# Pdf fonksiyonu içerisinde URL adresinin tanımlanması ve dilin ingilizce olarak belirlenmesi doküman ingilizce olduğu için
rapor<- readPDF(control=list(text="-layout"))(elem=list(uri=url), language="en")
rapor <- rapor$content
#Rapor içeriğinin tibble tablo formatına dönüştürülmesi
rp=as_tibble(rapor) %>% rename(cumle=value)
rp

Veri setinin yapısının incelenmesi

Aşağıda yazılan kod bloğu ile veri setindeki değişken tipi ve gözlem sayısı ortaya konulmuştur.

glimpse(rp)

#alternatif
str(rp)

Yukarıdaki kod bloğu çalıştırıldığında aşağıda verildiği üzere veri setinin 234 gözlemden yani cümleden oluştuğu, değişken tipinin ise karakter yani nominal olduğu görülmektedir. Veri setinin 1 değişkenden oluştuğu ve değişkenin “cumle” olduğu da görülmektedir. Bu veri setinde her bir gözlem raporun bir sayfasını göstermektedir. Zira söz konusu rapor da 234 sayfadan oluşmaktadır.

Rows: 234
Columns: 1
$ cumle <chr> "A World Bank Group\r\nFlagship Report\r\n                   JANUARY 2021\r\n

Metin verisinin kelime bulutu oluşturulmadan önce temizlenmesi ve çıkarılacak kelimelerin belirlenmesi

Bu kısımda ilk olarak aşağıda yazılan kelimeler metinden çıkarılacaktır. Bu kısımda ister Türkçe isterse diğer dillerde çıkarılacak kelimeleri belirleyebilirsiniz.

rmv1<-c("may", "can","years","age","mean","diet", "qol","based","dog","two","per","model","will","is","aarc","results","label","among","are","level","cancer", "used","many", "nlm", "data", "study", "p", "n", "net", "biochar", "aloe", "ses", "systems","avs", "acid","rate","aha","year","time","since","stroke", "however", "p lt", "ssris", "score", "index","hia", "largest", "current", "ncds", "found", "labelobjective", "It","yet","models", "vera","total", "also", "ptsd", "lt", "sroi", "icdm", "scores", "new", "arm", "china", "sample", "semen", "survey", "labelconclusions","within","labelbacground","range","followed","tagsnps","mbovis","labeldesign","increased","published", "likely", "nlmcategorymethods", "acids", "fatty", "employersponsored","labelmethods", "using", "conclusions","setting", "whether","findings","crosssectional", "one", "three","review","associated", "analysis", "studies", "nlmcategory", "background", "nlmcategorymethods", "in", "of", "and", "as", "19", "the","have","were","an", "was", "during", "to", "for","a", "cth","or","hcs", "this", "u","ci", "t", "la", "043d", "064a","043b", "062a", "trastuzumab","ewars","research", "either", "ipps73","ippss","87,017", "ofips", "15,000", "eshre","tdabc","thaihealth", "0.157", "and", "analyzed", "methods", "terms", "subjects", "being", "there", "compared", "while",  "when", "their","these","between", "his","her", "which", "that","who", "after","related","higher","group", "other","each","those","lower", "number","rates","first", "about", "groups","through","including", "across", "should", "must", "have","months","adjusted", "analyses", "estimated", "could", "would", "without", "further", "versus", "cross", "method", "follow", "general", "under", "below", "estimate","following", "received", "available", "before", "aimed", "collected", "often", "often","include","relevant","having","therefore","because","thus", "gutenberg","almost", "license", "ebook", "anyone", "anywhere", "title", "author", "enough", "nothing", "cannot", "really", "never", "again", "wwwgutenbergorg", "whatsoever", "editor", "chapter","perhaps", "shall", "every","where", "been", "more", "than", "even", "with", "what",  "who", "when", "only", "your", "into", "in", "on", "always", "online", "copy", "away", "back", "myself", "still", "from", "figure", "over", "such")

Bu kısımda aşağıda yazılan kod bloğundaki satırlarda sırasıyla;

  • Metindeki harflerin tamamı küçük harfe dönüştürülmüştür.
  • Metindeki noktalama işaretleri kaldırılmıştır.
  • Metinle iç içe geçmiş (kızgın325 gibi) rakam ve sayılar metinden ayıklanmıştır.
  • Metinden rakam ve sayılar çıkarılmıştır.
  • Yukarıdaki belirtilen kelimeler metinden çıkarılmıştır. Burada dikkat edilirse çıkarılan kelimeler daha çok zamir, sıfat, edat ve bağlaçlardır. İsteğe bağlı olarak burada değişiklikler yapabilirsiniz.
  • Karakter sayısı 3’ten büyük kelimeler filtrelenmiştir. İsteğe bağlı olarak burada değişiklikler yapabilirsiniz.
  • Metin istenmeyen formatta kelimeler varsa ve bu kelimeleri çıkarmanız analize zarar verecekse yerine kelimeler atayabilirsiniz.
  • Metnin değişiklikler sonrası “tibble” tablo düzenine dönüştürülmüştür.
tr<-rp %>% mutate(word=str_to_lower(cumle))%>% unnest_tokens(word, cumle) # Metindeki harflerin tamamı küçük harfe dönüştürülmüştür.
tr<-tr %>% mutate(word=removePunctuation(word)) # Metindeki noktalama işaretleri kaldırılmıştır.
tr<-tr %>% mutate(word=str_squish(word)) # Metinle iç içe geçmiş (kalem325) rakam ve sayılar metinden ayıklanmıştır.
tr<-tr %>% mutate(word=removeNumbers(word)) # Metinden rakam ve sayılar çıkarılmıştır.
tr<-tr %>% filter(!word %in% rmv1) # Yukarıdaki belirtilen kelimeler metinden çıkarılmıştır. Burada dikkat edilirse çıkarılan kelimeler daha çok zamir, sıfat, edat ve bağlaçlardır. İsteğe bağlı olarak burada değişiklikler yapabilirsiniz.
tr<-tr %>% filter(str_length(word)>3) # Karakter sayısı 3'ten büyük kelimeler filtrelenmiştir. İsteğe bağlı olarak burada değişiklikler yapabilirsiniz.
tr<-str_replace(tr$word, "[ı]", "i") # Metin istenmeyen formatta kelimeler varsa ve bu kelimeleri çıkarmanız analize zarar verecekse yerine kelimeler atayabilirsiniz.
tr<-str_replace(tr$word, "emdes", "emde") # Metin istenmeyen formatta kelimeler varsa ve bu kelimeleri çıkarmanız analize zarar verecekse yerine kelimeler atayabilirsiniz.
rpc<-tr %>% as_tibble() %>% rename(word=value) # Metnin değişiklikler sonrası tibble tablo düzenine dönüştürülmüştür.
rpc

Kelime sıklıklarının ortaya konulması

Aşağıda yazılan kod bloğunda metindeki kelimelerin sıklıkları bulunmuş, ardından ise frekansı en yüksek ilk 100 kelime verilmiştir. En sonda ise kelimeler ve frekansları xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmıştır. Veri setindeki yeni gözlem sayısı 68,142’dir. Yani xlsx uzantılı çalışma kitabında 68,142 satır bulunmaktadır. Bu yüzden çalışma kitabını açarken biraz beklemeniz gerekebilir.

sayi<-rpc %>% group_by(word) %>% count() %>% arrange(desc(n))
sayi<-sayi %>% add_column(id=1:NROW(sayi),.before = "word")
sayi

#Frekansı en yüksek ilk 100 kelime
sayi %>% head(100)  %>% pander(caption="Frekansı En Yüksek İlk 100 Kelime")

#xlsx uzantılı çalışma kitabına sıklıklarına göre kelimelerin yazdırılması

write_xlsx(sayi, "kelimelerrapor.xlsx")

Yukarıdaki kod bloğunda ikinci alt blok çalıştırıldığında elde edilen frekansı en yüksek ilk 100 kelime aşağıda verilmiştir. Raporda frekansı en yüksek ilk 4 kelime sırasıyla “growth”, “emde”, “bank”, “pandemic” kelimeleridir. emde kelimesi gelişmekte olan ve gelişmiş ekonomilerin kısaltmasıdır.

----------------------------
 id        word         n   
----- --------------- ------
  1       growth       1108 

  2        emde        922  

  3        bank        716  

  4      pandemic      704  

  5       global       628  

  6        world       626  

  7       percent      578  

  8        debt        570  

  9      economies     563  

 10       policy       523  

 11      economic      487  

 12      countries     426  

 13       covıd       407  

 14      financial     400  

 15        asset       381  

 16     investment     379  

 17       fiscal       372  

 18       market       326  

 19        term        324  

 20      monetary      281  

 21      advanced      276  

 22        long        276  

 23       output       275  

 24      expected      270  

 25      purchase      265  

 26       central      252  

 27     washington     231  

 28     government     225  

 29   ınternational   225  

 30       average      222  

 31       prices       222  

 32      programs      217  

 33       capital      216  

 34      forecasts     212  

 35      recovery      212  

 36       income       190  

 37    productivity    187  

 38       effects      185  

 39       economy      181  

 40      potential     177  

 41      emerging      173  

 42       reform       173  

 43      activity      172  

 44       support      169  

 45       january      167  

 46        some        167  

 47      prospects     166  

 48       country      158  

 49     developing     158  

 50        asia        156  

 51      measures      156  

 52        paper       154  

 53        risk        154  

 54       crisis       153  

 55     development    152  

 56      forecast      150  

 57       africa       148  

 58      purchases     147  

 59       working      147  

 60       reforms      146  

 61        bond        144  

 62        risks       143  

 63        labor       141  

 64        large       141  

 65       region       137  

 66      policies      136  

 67        last        134  

 68       capita       133  

 69      increase      133  

 70       outlook      133  

 71       public       133  

 72       markets      130  

 73        trade       125  

 74       decade       124  

 75        fund        120  

 76    announcements   118  

 77       crises       116  

 78     percentage     115  

 79      projected     113  

 80      exchange      112  

 81        here        112  

 82      inflation     112  

 83       yields       110  

 84        note        109  

 85      economics     108  

 86       health       108  

 87       impact       108  

 88       levels       107  

 89        south       107  

 90        lıcs       106  

 91        cases       105  

 92       losses       104  

 93       change       103  

 94      includes      103  

 95       sector       102  

 96       demand       100  

 97      education     100  

 98      episodes      100  

 99       private      100  

 100      remain       100  
----------------------------

Table: Frekansı En Yüksek İlk 100 Kelime

Yukarıdaki kod bloğunda üçüncü alt blok çalıştırıldığında elde edilen kelimeler ve frekansları xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmış olup aşağıda linkten indirebilirsiniz.

Kelime bulutlarının oluşturulması

Bu kısımda wordcloud2 kütüphanesini kullanarak aşağıdaki kod bloğunda verelim. Burada aynı zamanda oluşturulan kelime bulutu png ve html uzantılı olarak da kaydedilmektedir. Aşağıda yazılan kod bloğunda en yüksek frekansa sahip ilk 350 satırdaki kelimelerin frekansı ele alınmıştır. Dilerseniz wordcloud2 fonksiyonu içerisindeki parametreleri değiştirerek farklı alternatifler deneyebilirsiniz.

sayi<-rpc %>% group_by(word) %>% count() %>% arrange(desc(n))
sayi<-sayi %>% add_column(id=1:NROW(sayi),.before = "word")

#kelime bulutunun oluştuurlması
rp <- wordcloud2(head(sayi[,2:3], 350), size=1, minSize = 10, color = "random-light",backgroundColor = "dark", shape = "circle")

#html ve png olarak kaydedilmesi
saveWidget(rp,"28.html",selfcontained = F)
webshot::webshot("28.html","rp.png",vwidth = 1800, vheight = 1000, delay =10)

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde ettiğimiz kelime bulutu aşağıda verilmiştir.

Duygu analizlerinin yapılması

Bu kısımda Loughran dil sözlüğü kullanılarak duygu analizi yapılmıştır. Loughran leksikonunda kelimeler altı duygu kategorisinde ele alınır: “olumsuz”, “pozitif”, “ihtilaflı”, “belirsizlik”, “kısıtlayıcı” veya “gereksiz” (“negative”, “positive”, “litigious”, “uncertainty”, “constraining”, or “superfluous”). Loughran leksikonu bulguları aşağıda yazılan kod bloğu ile elde edilmiştir.

#Loughran leksikon değerlerinin elde edilmesi
l2<-rpc %>% inner_join(get_sentiments("loughran"),by="word")
 
#Duygu grubuna göre frekanslar
l2 %>% group_by(sentiment) %>% summarise(toplam=n()) %>% mutate(oran=round(toplam/sum(toplam)*100,2)) %>% arrange(desc(oran)) %>% formattable()

Yukarıdaki kod bloğunun çalıştırılmasından sonra elde edilen Loughran leksikonu tanımlayıcı istatistikleri aşağıdaki tabloda verilmiştir. Aşağıda verilen bulgudan şu sonuç çıkarılmalıdır: %57,70 ile negatif duygunun 2021 Küresel Ekonomik Beklentiler (Global Economic Prospects) raporunun genelinde baskın olduğu görülmektedir. Metinde negatif duyguyu pozitif ve belirsizlik duyguları izlemiştir. Aslında duygu analizi bulguları, dünya ekonomisinde yaşanan durumu da ortaya koymaktadır.

Loughran leksikonu sonuçları aşağıda yazılan kod bloğu ile grafik üzerinde de verebiliriz.

l2 %>% 
group_by(sentiment) %>% summarise(n=n())%>%
ggplot(aes(reorder(sentiment, n), n, fill=sentiment)) +
geom_bar(stat="identity", show.legend = FALSE)+
geom_text(aes(label=n), vjust=-0.3, size=3.5)+
labs(y = "Frekans", x = "Duygu")+
theme_economist_white()+
labs(caption = "Veri: Global Economic Prospects adlı 2021 raporundan Tevfik Bulut tarafından analiz edilmiştir.")+
theme(plot.caption = element_text(hjust = 0, face = "italic"))

Yukarıdaki kod bloğu çalıştırıldığında Loughran leksikonuna göre 2021 Küresel Ekonomik Beklentiler raporundan elde edilen duygular aşağıdaki grafikte verilmiştir.

Duygu sözlükleri içerisinde duygu kategorisine filtreleme yapmak oldukça kolaydır. Örnek teşkil teşkil etmesi adına Raporda Loughran leksikonuna göre negatif olarak etiketlenen kelimelerden ilk 50’sini aşağıda yazılan kod bloğu ile verelim. Dilersek pozitif olarak etiketlenen kelimelerin tamamı elde edebilir ve xlsx uzantılı çalışma kitaplarına yazdırabiliriz. Benzer işlemleri diğer dil sözlüklerinde de gerçekleştirebiliriz.

l2 %>% filter(sentiment=='negative') %>% head(50) %>% pander(caption="Negatif olarak etiketlenen ilk 50 kelime")

Yukarıdaki kod bloğunun çalıştırılmasından sonra metinde negatif olarak etiketlenen ilk 50 kelime aşağıdaki tabloda verilmiştir.

-----------------------------
      word         sentiment 
----------------- -----------
     errors        negative  

    omissions      negative  

  discrepancies    negative  

     failure       negative  

   limitation      negative  

   disclaimer      negative  

      error        negative  

   disclaimer      negative  

    infringe       negative  

     claims        negative  

  infringement     negative  

    critical       negative  

    dangerous      negative  

 disappointments   negative  

      lost         negative  

   persistent      negative  

    deficits       negative  

   challenges      negative  

   challenges      negative  

   challenges      negative  

 disappointments   negative  

    weakness       negative  

   weaknesses      negative  

   downgraded      negative  

   downgraded      negative  

   downgrades      negative  

     crisis        negative  

   downgrades      negative  

     adverse       negative  

    dangerous      negative  

      lost         negative  

   persistent      negative  

    deficits       negative  

   challenges      negative  

    inaction       negative  

   challenges      negative  

     delayed       negative  

     crises        negative  

     damage        negative  

     adverse       negative  

     errors        negative  

     losses        negative  

    setbacks       negative  

    setbacks       negative  

   persistence     negative  

    setbacks       negative  

    setbacks       negative  

    setbacks       negative  

   devastating     negative  

   devastating     negative  
-----------------------------

Table: Negatif olarak etiketlenen ilk 50 kelime

Şimdide Loughran leksikonunda duygulara göre etiketlenmiş kelimelerin tamamını aşağıda yazılan kod bloğu ile verelim.

l2<-rpc %>% inner_join(get_sentiments("loughran"),by="word")
write_xlsx(l2, "rapor_loughranleksikonu.xlsx")

Yukarıdaki kod bloğunun çalıştırılmasından sonra Loughran leksikonundaki duygu kategorilerine göre etiketlenmiş metindeki bütün kelimeler xlsx uzantılı Microsoft Excel çalışma kitabına yazdırılmış olup aşağıdaki linkten indirebilirsiniz.

Loughran leksikonundaki duygu kategorilerine göre etiketlenmiş 50 kelimeyi olasılıklı örnekleme yöntemlerden biri olan ve önyargı (bias) içermeyen tekrarsız basit tesadüfi örnekleme yöntemi kullanarak seçmek için aşağıdaki gibi basit bir kod satırı yazalım.

set.seed(61) 
rpc %>% inner_join(get_sentiments("loughran"),by="word") %>% sample_n(50) %>% pander(caption="Basit Tekrarsız Tesadüfi Örnekleme Yöntemi İle Seçilen Kelimeler ve Duygu Etiketleri")

Loughran leksikonundaki duygu kategorilerine göre etiketlenmiş 50 kelime tekrarsız basit tesadüfi örnekleme yöntemi kullanarak belirlenmiş ve aşağıdaki tabloda verilmiştir.

-----------------------------
     word        sentiment   
-------------- --------------
   exposed        negative   

    crisis        negative   

   despite        positive   

   impaired     constraining 

 forbearance     litigious   

   friendly       positive   

 improvement      positive   

  deviation       negative   

  recessions      negative   

   greater        positive   

   whereas       litigious   

    crises        negative   

    gains         positive   

   success        positive   

    risks       uncertainty  

    crisis        negative   

  challenges      negative   

    risks       uncertainty  

    better        positive   

  effective       positive   

    risks       uncertainty  

    easing        negative   

   negative       negative   

  aggravate       negative   

    risks       uncertainty  

     poor         negative   

   require      constraining 

  discourage      negative   

  regulatory     litigious   

   advances       positive   

    damage        negative   

  aggravate       negative   

   stronger       positive   

    crises        negative   

  uncertain     uncertainty  

    crises        negative   

    sudden      uncertainty  

  excessive       negative   

 transparency     positive   

 forbearance     litigious   

    boost         positive   

  regulatory     litigious   

    severe        negative   

 probability    uncertainty  

    gains         positive   

     good         positive   

 difficulties     negative   

   despite        positive   

   advances       positive   

   adverse        negative   
-----------------------------

Table: Basit Tekrarsız Tesadüfi Örnekleme Yöntemi İle Seçilen Kelimeler ve Duygu Etiketleri

Dünya Bankasının raporu üzerinden sadece Loughran leksikonu kullanarak duygu analizi yapılmıştır. Burada 2. bölümde belirttiğim diğer duygu sözlükleri uygulama adımları kullanılarak diğer leksikonlara göre de duygu analizi yapılabilir.

4. Sentetik veriler üzerinden kelime bulutlarının oluşturulması

Örnek uygulama kapsamında son çalışma sentetik veriler üretilip kelime bulutlarının oluşturulmasıdır. Bu çalışma kapsamında sentetik olarak üretilen kelimelerin büyük bir çoğunluğu İstiklal Marşımızdan alınmıştır. Burada sentetik verilerin üretilmesinde tekrarlı örnekleme tekniği kullanılmış ve 10.000 gözlem üretilmiştir. Bu gözlemler üzerinde kelime bulutları oluşturulmuştur. Şimdi adım adım kelime havuzu oluşturup, ardından tekrarlı örnekleme tekniğini kullanarak 10000 gözlem üretelim. Ardından ise kelime bulutlarını oluşturalım. İlk olarak aşağıda yazılan kod bloğu ile vektör içerisinde kelime havuzumuzu oluşturalım.

#kelime havuzu oluşturma
havuz=c("anadolu", "türkiye", "vatan", "mehmetçik", "istanbul", "ankara", "başkent", "istiklal", "güvenlik","türk", "anıtkabir","fatih", "atatürk","ertuğrul", "diriliş", "lonca","kültür", "asker", "göktürk", "bağımsızlık", "zafer", "ulus","sancak","yurt","siper","hilal","hür", "toprak","millet","hürriyet","izmihlal", "ezan", "şüheda", "inklap","cumhuriyet", "bayrak", "şafak","iman", "medeniyet","ecdat","arş", "hür","hakk", "hüda","secde", "cüdâ", "şafak", "ay","yıldız", "bayrak")

Şimdi aşağıda yazılan kod bloğu ile tibble tablo düzeni içerisinde tekrarlı basit tesadüfi örnekleme yöntemiyle 10000 gözlemden oluşan bir tablo oluşturalım.

#tekrarlı örnekleme tekniği ile kelime tablosu oluşturma
set.seed(1299) # Aynı örneklem birimlerini almanız için sabitlenmiştir. 
orneklem= tibble(kelime=sample(havuz, size=10000, replace = TRUE))

Kelime tablomuzu oluşturduğumuza göre aşağıda yazılan kod bloğu ile kelimelerin sıklıklarını (frekanslarını) hesaplayabiliriz.

deneme<-orneklem %>% group_by(kelime) %>% count() %>% arrange(desc(n))
deneme<-deneme %>% add_column(id=1:NROW(sayi),.before = "kelime")
deneme

Kelime sıklık tablosunu oluşturduk. Şimdi sıra aşağıda yazılan kod bloğu ile kelime bulutlarını oluşturmaya gelmiştir. Aşağıda kod bloğunda kelime bulutunu hem png hem html olarak kaydedebilirsiniz. Size bu noktada bir tavsiye vereyim böyle bir durumda yani farklı formatta dosyaları aynı dosyaya kaydetmesi için R çalışma sayfasını çalışmaya başlamadan önce oluşturduğunuz bir klasör içerisinde açınız.

#kelime bulutunun oluşturulması
bulut1<- wordcloud2(head(deneme[,-1],150), size=0.5, color = "random-light", backgroundColor = "grey")

#html ve png olarak kaydedilmesi
saveWidget(bulut1,"bulut1.html",selfcontained = F)
webshot::webshot("bulut1.html","bulut1.png",vwidth = 1800, vheight = 1000, delay =10)

Yukarıdaki kod bloğunun çalıştırılmasından sonra sentetik verilerden ürettiğimiz kelime bulutu daire (circle) düzeninde aşağıda verilmiştir.

Son olarak aşağıda yazılan kod bloğu ile yıldız (star) düzeninde kelime bulutunu oluşturalım. Kelime bulutunda arka fonumuz kutsal bayrağımız rengi olan kırmızı, yıldızımız ise beyaz olsun.

#kelime bulutunun oluşturulması
bulut2<- wordcloud2(deneme[,-1], size=0.4, color = "white", backgroundColor = "red", shape="star", minRotation = -pi/6, maxRotation = -pi/6, rotateRatio = 1)

#html ve png olarak kaydedilmesi
saveWidget(bulut2,"bulut2.html",selfcontained = F)
webshot::webshot("bulut2.html","bulut2.png",vwidth = 1800, vheight = 1000, delay =10)

Yukarıdaki kod bloğunun çalıştırılmasından sonra sentetik verilerden ürettiğimiz kelime bulutu yıldız (star) düzeninde aşağıda verilmiştir.

“4. Sentetik veriler üzerinden kelime bulutlarının oluşturulması” başlığı altındaki bu çalışmayı yüce milletimize her koşulda hizmet eden şehit ve gazi kahraman Mehmetçiklerimize atfediyorum.

Yapılan bu özgün çalışmalar ile özellikle keşifsel veri analizi (exploratory data analysis), metin ve fikir madenciliği (text and opinion mining) alanlarına katkı sunulması amaçlanmıştır.

Veri bilimine gönül vermiş öğrenci, akademisyen ve saha çalışanlarına faydalı olması 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

Öne çıkan

R’da Metin Madenciliği Üzerine Vaka Çalışmaları: Case Studies on Text Mining in R

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 bulutları 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ı, 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

Bugün daha önce R programlama dili kullanarak R Shiny üzerinde geliştirdiğim metin madenciliği (text mining) web uygulamasından bahsedeceğim. İlk olarak sade bir tasarıma sahip geliştirdiğim metin madenciliği uygulamasının 3. versiyonunun linkini vererek işe başlayayım. Aşağıdaki linkten bu uygulamayı açabilirsiniz.

Metin Madenciliği Uygulaması

Uygulama ile boyut, büyüklük ve dil sınırı olmaksızın bütün metinlerin kelime bulutunu oluşturabilirsiniz hem de farklı tasarım varyasyonları ile birlikte. Versiyon 3’te ilave olarak uygulamanın arka planında Türkçe ve ingilizce dillerinde metinden çıkarılacak edat ve bağlaçlarının sayısı artırılarak kullanıcının veri temizleme (data cleaning) işlemi kısaltılmak istenmiştir. Burada adım adım uygulamadan bahsedildikten sonra örnek bir metin üzerinden gidilerek kelime bulutu oluşturulacaktır.

Aşağıda uygulaması ve anlaşılması kolay olabilmesi adına oldukça sade ve fonksiyonel tasarımla geliştirilen uygulamanın ekran görüntüsü verilmiştir. Aşağıdaki uygulama ekran görüntüsünde sol panelde sırasıyla Metni giriniz, Kelime sıklığı, Maksimum kelime sayısı, Renk seçiniz, Kelime bulutu oluştur sekmelerini görüyorsunuz. Sağ panelde ise Kelime Bulutu alanına ve altında uyarı metinlerine yer verilmiştir. Dilerseniz sırasıyla kısaca sol panel alanlarından bahsedelim.

Sol panel sekmeleri

  1. Metni giriniz: Bu alana kopyalanan metin girilmektedir. Yani bu alana kopyala-yapıştır (copy-paste) yapmanız yeterlidir. Metni giriniz sekmesindeki metin kutucuğu sağ alt köşeden genişleyebilmekte ve girdiğiniz metnin tamamını bu sayede daha rahat görebilirsiniz. Bu kutucu metin verisi girildiğinde sağ panelde yer alan “Uyarı 1: Metin alanı boş geçilemez” uyarı metni ortadan kalkacaktır.
  2. Kelime sıklığı: Metni giriniz sekmesinde yer alan kutucuğa metin verisi girildikten sonra sıra kelime sıklıklarını belirlemek gelmektedir. Bu sekmede mouse ile 0’dan büyük olacak şekilde kelime sıklığı belirmememiz gerekir. Aksi takdirde bildiğiniz üzere 🙂 kelime bulutu oluşmaz. Kelime sıklığı 0’dan büyük olduğunda sağ panelde yer alan “Uyarı 2: Kelime sıklığı 0’dan büyük olmalıdır” uyarı metni ortadan kalkacaktır.
  3. Maksimum kelime sayısı: İlk iki sekmelere yani Metni giriniz ve Kelime sıklığı sekmelerine istenen şekilde metin verisi girildikten sonra sıra “Maksimum kelime sayısı” nın belirlenmesine gelmektedir. Maksimum kelime sayısı 0’dan büyük olduğunda sağ panelde yer alan Uyarı 3: Maksimum kelime sayısı 0’dan büyük olmalıdır uyarı metni ortadan kalkacaktır. Böylece Uyarı 3 ile birlikte diğer uyarılar da hep birlikte ortadan kalkacaktır. Buraya anlatılanlar kelime bulutu oluşturulması için yeterlidir. Bu aşamadan sonra Kelime bulutu oluştur butonuna tıklayarak kelime bulutu oluşturabilirsiniz. Oluşturduğunun kelime bulutu sağ panelde Kelime Bulutu başlığı altında yer alacaktır.
  4. Renk seçiniz: Bu sekme daha çok kelime bulutunun tasarımı yani rengi ile ilgili olup, zorunlu değildir. Default (otomatik) olarak belirlenen renk üzerinden doğrudan kelime bulutu elde edilebilir. Ancak çok daha seçenek sunulması ve daha estetik bir görünüm elde edilebilmesi adına bu sekmeyi uygulamaya entegre ettim. Renk ölçeğinin üzerine tıkladıktan sonra ileri-geri ilerleyerek dileğiniz renge göre kelime bulutu elde edebilirsiniz.

Örnek Uygulamalar

a) İngilizce Metinlerde Uygulama

Örnek uygulama kapsamında metin verisi 30.01.2021 tarihinde ücretsiz e-kitapların çeşitli formatlarda yayınlandığı https://www.gutenberg.org/ebooks/50540 adresinden alınmıştır. Metin verisi olarak alınan eserin adı Zeyneb Hanoum tarafından kaleme alınan Bir Türk Kadınının Avrupa İzlenimleri (A Turkish Woman’s European Impressions)‘dır. Eser 23 Kasım 2015 tarihinde https://www.gutenberg.org sitesinde yayınlanmıştır. Bu metin verisi ile yukarıda linki verilen web uygulaması üzerinden kelime bulutları oluşturulacaktır. Aynı zamanda metni word formatında aşağıdaki linkten indirebilirsiniz.

  1. İlk uygulama parametrelerimiz şöyle olsun: Default renk seçeneği ile kelime sıklığı 524, maksimum kelime sayısı ise 83 olsun. Bu durumda kelime bulutumuz aşağıdaki gibi olacaktır. Kelime bulutu uygulaması içerisindeki algoritma kelimeleri random atadığı için aynı kelime düzenini elde edemeyebilirsiniz. Bunu burada belirtmek gerekir. Uygulamada kelime üzerine tıkladığınızda ilgili kelimenin metinde ne kadar sıklıkla kullanıldığını görebilirsiniz.

2. İkinci uygulama parametrelerimiz şöyle olsun: #00FFC4 renk seçeneği ile kelime sıklığı 403, maksimum kelime sayısı ise 50 olsun. Bu durumda kelime bulutumuz aşağıdaki gibi olacaktır.

b) Türkçe Metinlerde Uygulama

Bu kısımda Atatürk’ün Dehâsı, Davranışları ve Çalışma Biçimleri adlı makale analiz edilerek kelime bulutu oluşturulmuştur. Metin 30.01.2021 tarihinde Milli Eğitim Bakanlığı’nın http://meb.gov.tr/ataturk/Makaleler adresinden alınmıştır. Uygulamada kullanılan metin aşağıda verilmiştir.

Dehâ ve dâhi kavramı türlü biçimlerde ele alınmış ve tarif edilmiştr. Bunların başlıcalarını anıyoruz.
a) Doğuştan olağanüstü işler görmek ve eserler yaratmak kabiliyetinde olmak, yani olağanüstü yaratıcı bir dimağ taşımak.
b) Herkesten çok önce anlamak görmek, sezmek, kavramak, duymak ve duygulanmak.
c) Anlaşılması ve anlatılması imkânsız olan doğuştan büyüklük ve ululuk.
d) İnsanlığın gelişmesi sırasında ulaşabileceği en yüksek zirveleri görüp göstermek ve topluluğu oraya götürecek olağanüstü yaradılışta olmak.
e) Bazıları dehâyı uzun bir sabır diye tarif etmişlerdir.
f) Bir akşam sofrada (1926 yazı) dâhinin tarifi yapılır ve herkes bir görüş ortaya atarken, Atatürk şunu demiştir: 'Dâhi odur ki, ileride herkesin takdir ve kabul edeceği şeyleri ilk ortaya koyduğunda herkes onlara delilik der.'
Atatürk'ün taşıdığı vasıflar, bu tariflerin hepsine ayrı ayrı uyar. Onun dehâsının belirtilerini incelersek şunları görürüz. O, olağanüstü seziş, kavrayış ve duyuş hassalarına şu yönleri de eklerdi:
Ortaya çıkması muhtemel konu, sorun ve olayları çok önceden tahmin edip, onlar üzerinde derinden derine dimağını işletir, en kötü ihtimallere kadar her şeyi gözönünde bulundurarak gereken tedbirleri kararlaştırır ve durumun ilerdeki gelişme derecelerine göre bunları kafasında sıralardı. Amaçlarını iyice tesbit ederdi; kafasında hiç dağınıklığa yer vermezdi ve hiç bir olay onu boş bulmazdı.

Yukarıda Çanakkale vuruşmaları sırasında onun bu gibi davranıp ve görüşlerine rastladık. 6 Ağustos 1915 de başlayan İngiliz saldırıları dolayısiyle iki ay önce uyarılmaya çalışmış olduğu Liman von Sanders ve Esat Paşalar için: '... fikren hazırlanmamış oldukları harekât-ı hasmane karşısında pek nakıs tedbirlerle vaziyet-i umumiyeyi ve vatana pek büyük tehlikeye maruz bıraktıklarına vakayı şahit oldu' diye yazmıştır. İmlediğimiz üç kelime Mustafa Kemal'in büyük önem verdiği bir yönü aydınlatmaktadır.
Conkbayırı'nın geri alınması sorunu dolayısiyle O, şunu yazmıştır: 'Muharebede kuvvetten ziyade, kuvveti maksada muvafık sevk ve idare etmek mühim olduğu düşünülmüyordu.'

Yine bu Conkbayırı işinde kendisi üst ve alt makamlardakilerin inançlarına aykırı davranmaya karar vermesini izahı için şunları yazmıştır: 'Bazı kanaatler vardır ki onların hesap ve mantıkla izahı pek güçtür. Bahusus muharebenin kanlı ve ateşli safhasında duyguların tevlit ettiği kanaatler... Bittabi her kanaat ve karar, içinde bulunulan ahval ve şerait tetkik ve bu tetkikat netayicini teferrüs (sezmek) ve takdir sayesinde tevellüt ener.'

Başarı onun dehâsının verdği 'sezme' gücünün sonucudur. Ancak O, bunun da, durumu tetkike ve ona göre karar vermeye bağlı olduğunu açıklamaktadır. Yani doğuştan olan 'seziş' kabiliyetine ek olarak dimağı çalıştırmanın esas olduğunu belirtmektedir.

Atatürk'ün pek çok karar ve davranışları uzun inceleme ve düşüncelerin sonucu olmakla birilikte ani olaylar karşısında çarçabuk en uygun yolu seçmekte büyük kabiliyeti vardı. Arıburnu'nda ve Conkbayır'ındaki davranışları buna örnektir. Atatürk önem verdiği güç ve sıkıcı bir durumu çözdükten sonra rahatlardı ve bu yüzünden belli olurdu. Bu gibi durumlarda 'beynime saplanmış bir çiviyi söküp attım' dediği olmuştur.

Atatürk'ün çalışma tarzının bir önemli yönü de kendine öz bir danışma yolu seçmiş olmasıdır. O, böyle davranmakla hiç geriye doğru adım atmak zorunda kalmadan en şaşılacak devrimleri ve ileriye atılışları gerçekleştirmiştir. Pek çokları sanarlar ki Atatürk gerçekleştireceği devrimlere ve daha genel olarak göreceği önemli işlere birden bire ve kendi başına karar verip onları yürütürdü. Gerçektense onun demin dediğimiz gibi kendine öz bir danışma yolu vardır. Yapmak istediğini önce, bazen işin esasını pek belli etmeden ve nazari bir şey üzerinde konuşuyormuş gibi, sofrada söz konusu ederdi, içki ağızları daha kolay açtığı için leh veya aleyhte söyleyenler olurdu, konuşanların özel düşünce ve inançlarını bildiğinden söylediklerini ona göre değerlendirirdi. Bazı arkadaşlariyle ve halkla temaslarında, köylü ve kentli her türlü iş güç sahipleriyle konuşurken yine pek belli etmeden tasarısının uyandıracağı tepkiler üzerinde bilgi ve duygu edinirdi. Yalnız aldığı karşılıklardan değil, konuştuğu adamın yüzünden ve kımıltılarından da sonuçlar çıkarırdı. Böylelikle tasarladığı devrimin veya herhangi önemli işin nasıl bir tepki göreceğini ne ölçüde kolaylık veya güçlükle karşılaşacağını anlamış olur ve ona göre davranırdı.

Özet olarak; dehâsı onu olağanüstü ve başka kimsenin yüreklenmeyeceği işleri görmeğe iterken O, çok esaslı psikolojik ve sosyal yoklama ve incelemelere girişmeden önemli hiç bir adım atmazdı. Bazen onun en yakınları arasında bile kendi gözleri önünde yapılmış olan bu yoklama ve çalışmaların anlamını sezmediklerinden atılan adımların delice ve tek başına alınmış kararların sonucu olduğunu sananlar bulunurdu. Bunun aksine olarak da onun bu yoklama usullerini bilmeyenler veya anlayacak kabiliyette olmayalar yapılan tartışmalar sırasında kendi savundukları görüşe uygun bir karar uygulanırsa kerameti kendilerinde sanmış ve Atatürk öldükten sonra söz veya yazı ile övüntülerde bulunmuşlardır. Bazen de bu gibi övünmeler büsbütün uydurma olaylar üzerine yapılmıştır.

Atatürk göreceği işin eski deyişle 'eşref saatte' yapılmasına da çok önem verirdi. Ancak onun eşref saatini falcı veya müneccim değil, durumun derinden derine incelenmesinden doğan inanç tesbit ederdi. Yukarda anılan yoklama ve danışmalar da bu anın tesbitinde rolü büyüktü. Elde edilen bir başarıdan azami verimi elde etmesini bildiği gibi nerede durulması gerektiğini de iyice tesbit etmesini bilirdi.

Bu yazdıklarımız bazılarınca Atatürk üzerinde beslenen bir sanıyı da düzeltmeye yarar. Sanılır ki; O, hiç itiraz kabul etmez ve kimse onula tartışmaya yüreklenemez. Bu sanı baştan başa yanlıştır. O, tartışmaların kızışmasını, hele o işten anlayanların ne olursa olsun konuşmalarını, isterdi ve bunu yapmayanlara kızardı, 'bilir, ancak bildiğini ortaya koymaz, ne yapayım böyle adamı' dediği olurdu. Şu kadar var ki tartışmalarda içtenlik şarttı; içten olmayarak ayrıca gizli düşünceler besleyerek, fesat ve tezvir için konuşanlara ise kızardı. Atatürk türlü yoklama ve tartışmalardan sonra bir karara vardı mıydı onu her ne olursa olsun yürütürdü. Uzun tartışmaların bir faydası da görülecek işin uygulanmasiyle görevlendirilecek olanların onun bütün yönlerine nüfuz etmelerini sağlamaktı. Atatürk buna çok önem verirdi. Tartışmalar ayna zamanda kararlaştırılan işe bir çok yanıt sağlamaya da yarardı. Ondaki azim ve irade de olağanüstü idi. Yenemeyeceği hiç bir güçlük, deviremiyeceği hiç bir engel yoktu. Her engeli sabır, tedbir veya zor ile yenerdi. Sakarya vuruşmasiyle Ağustos 1922 deki son büyük saldırı arasındaki süre içinde Mecliste pek çok ve acı tenkitlere uğramış, parasızlık ve türlü imkânsızlıklar yüzünden ordunun artık ayakta tutulamayacağı söyleniledurmuştu. O sıralarda Meclisin bir kapalı oturumunda, şunları söylemiş olduğu dışarda duyulmuştu: 'Para var ordu var, para yok ordu yok. Ben böyle şey bilmen para olsa da olmasa da. ordu olacaktır.'
1919'daki yıkımlı durumdan 1922 parlak zaferini çıkaran etkenlerin başında Türk azim ve iradesini temsil eden Atatürk'ün bu azmi ve iradesi bulunmaktadır.

Atatürk'ün çalışma ve yorgunluğa dayanıma kabiliyeti de olağanüstü idi. Sakarya vuruşmasında üç kaburga kemiği kırık olarak bir koltuğa mıhlanmış ve hemen hiç uyumadan yirmi iki gün yirmi iki gece vuruşmayı yöneltmiştir. 1927 de okuduğu büyük Nutuk'u hazırlarken de dosyalar içinde aylarca sabahladığı olmuştur.

Yukarda yazdıklarımız O'nun çok hesaplı oluğunu gösterir. Boş gösterişden ve övünmelerden , cafcadatan hiç hoşlanmazdı, ancak kesin lüzum görürse lüzumsuz sanılabilecek kahramanlıklarda bulunurdu.
Bu gibi duyguları dolayısiyledir ki yukarda anılan 'Vatan ve Hürriyet' Cemiyeti kurulurken ölmekten bahsedenlere, amacın ölmek değil yaşamak ve yaşatmak olduğunu söylemişti.

Ankara'da daha çok, ilk devirlerde, henüz nüfuzu pek kökleşmemiş iken tasarladığı bazı işleri bir takım tartışmalar sonucunda başka birine, o kimseyi tasarının kendi öz düşüncesi olduğuna içten inandırarak ileri sürdürürdü ve kendisi gerekirse onu desteklemekle yetinirdi. Bazen de tasarladıklarını onlara karşın olan birine önertmeği şaşılacak biçimde becerirdi. Bir takım devlet adamları vardır ki karar verirken yurttan önce o işte kendi çıkarlarını düşünür ve ona göre bir yol tutarlar. Bu yüzden çok kere isabetsiz bir yola girilir ve bunun sonucunda, kendini zeki sanan açık göz devlet adamı da, yurt işlerinin kötü gidişinden manen ve maddeten zarar görür. Atatürk kesin olarak bu gibi küçüklüklerin üstünde kalmış ve daima yurt için ve güdülen dâva için en gerekli yolu tutmuştur. Bunun sonucunda da kendi mevkii yurdunki gibi daima ve adeta otomatik biçimde yüksele durmuştur. Bu yön başka bir biçimde ifade edilmek istenilirse denilebilir ki: Atatürk daima kendi çıkarını yurt ve ulusun çıkariyle birleştirmeyi ve birlikte yürütmeyi bilmiştir.

Gerçek dâhi eğer dâvasını içtenlikle benimsemişse diktatör olmaya muhtaç değildir, çünkü bir dâhi doğru yolu göstermek ve onun doğruluğuna inandırmak gücünü kendinde görmeli ve bulmalıdır. Atatürk'ün yanında bulunmuş ve çalışmış olanlar aylar ve yıllar boyunca onunla tartıştıktan sonra sonuçta onun düşüncelerinin daima yerinde ve yararlı olduğunu göre göre onun en isabetli yolu seçeceğine o derece inanmışlardır ki her şeyde ona uymayı gerekli bilmişlerdir. Dolaysiyle eğer Atatürk'e diktatör denilecekse bu, onun üstün görüş ve anlayışına olan inançtan doğan uysallığın doğurduğu diktatörlük sayılmalıdır. Olayların daima kendisini haklı çıkarmasından ona karşı doğmuş olan güvene, onun pek büyük olan inandırma kuvvet ve kabiliyetinin de yanındakiler üzerindeki etkisini eklemek gerekir. Ancak şu yönü de belirtmeliyiz: Atatürk yalnız bir konuda genel serbest tartışmaya izin vermemiştir. O da dinin riyakarane sömürülmesi konusudur. Bir tedbirin yurt ve ulusun yarar veya zararına olduğu konusu üzerinde tartışılırken herhangi bir kimse veya parti bunu bilim, siyasal, hukuk ve saire bakımından inceleyeceğime o yönleri bırakıp halka açıkça veya el altından 'bu yapılırsa cehennemde cayır cayır yanarsın' cinsinden telkinlerde bulunursa bu gibileriyle akıl ve mantık yolundan giderek tartışarak hak kazanmak doğal olarak ka'bil olamazdı. Buna göz yumulunca da Türkiye devletini Osmanlı'nın uğradığı yıkımdan kurtarmanın imkânı kalmazdı. Bir zamanlar basımevleri, modern bilimler, yeniçerilere yeni silâhların gerektirdiği talimler şeriate aykırı gösterilmiş ve baştakilerle halk cehennem azabiyle korkutularak bu yenilikler yüzyıllar boyunca Osmanlı ülkesine sokulmamıştı. Bu yüzden de XVI ncı yüzyılın en güçlü devleti her bakımdan geri bırakılıp git gide sönmüş ve bir hiç olmuştu.
Atatürk'ün diktatörlüğü ancak ve ancak bu yönde kendini göstermiş ve tek parti usûlü, filî bakımdan, ancak ve ancak bu yüzden kurulup yaşamıştır.
İlerde göreceğimiz gibi Kâzım Karabekir'in ve daha sonra Fethi Okyar'ın başkanlık ettikleri partiler, baştakiler istemeseler bile, hep bu gibi dini dünya işlerinde gericilik uğrunda kullananların desteğine mazhar oldukları için kapanmışlardır.

Birinci Büyülk Millet Meclisi'nde O'nun ne kadar çetin saldırılarla karşılaştığı ve en 'parlamanter' bir başbakan gibi uğraşmak zorunda kaldığı düşünülürse dünya ve devlet işleri 'ahiret' tehdidi altında görülmeye kalkışılmadıkça O'nun hiç bir muhalefetten çekinmeyeceğini anlarlar.

Atatürk hem doğuştan, hem de çok akıllı ve hesaplı olduğundan doğru ve vefalı olmaya, kimseyi aldatmamaya, özet olarak güven sağlamaya büyük önen verirdi. Aksini ileri sürenler ve ondan vefasızlık gördüklerini söyleyenler, bunu ya düşmanlıklarından yaparlar veya Atatürk'ün görerek edindiği uyarılarını anlayamamış, yahut da onlara önem verip aldırmamış olduklarından böyle bir sonuçla karşılaşmışlardır. Buna karşılık Atatürk kendisini bile bile aldatmış olanları mimler ve bir daha onlara güvenmezdi. Ancak taşıdığı yüksek duyguları, meselâ ölümünden az önce, yüzellilikleri affettirmekle göstermiştir. Biliyordu ki kendisinden sonra kimse bu işe yüreklenemezdi ve onbeş yıllık sürgünü yeter bulmuştu.

Atatürk mahiyetindekilerin sorumlu oldukları işlere karışmaktan ve ayrıntılarla uğraşmaktan sakınır, bazen bunu yapsa da dostçasına yapardı, 'işi mesulüne bırakalım' sözünü kendisinden çok işittim. Keza bir bakan onunla danışırsa düşüncesini söylemekle birlikte 'ben böyle düşünüyorum amma işin sorumlusu sensin, ona göre düşün, taşın ve karar ver' derdi.
Ancak çok önemli işlerde ve anlarda bütün ayrıntılara bile el koyduğu ve hemen her şeyi kendisi yaptığı görülmüştür. Conkbayır'ı geri alırken veya 1922 Ağustos'unda başlayan büyük saldırıyı yöneltirken böyle yapmıştır. Bunu yaparken de başarının şerefini yine mahiyetine bırakacak biçimde davranmak büyüklüğünü göstermiştir. Bu gibi durumlar dışında genel bakımdan işlere karışmayı sevmez ve herhangi bir (kolda işler iyi gitmezse bazen dediği gibi 'baştakini değiştirmekle' yetinirdi. Hemen bütün yeni çığırlara onun 'inisiyatif'i ile girilmiş olmakla birlikte o yeni bir işi yoluna koyduktan sonra onun devam ettirilmesini bir ehline bırakmayı görenek edinmişti ve bunu yapınca içi rahat ederdi.

Genel olarak O, başka birinin görebileceği bir işi kendi üzerine almaz veya üzerinde tutmazdı. Pek çok iktidar sahibinde görülen ve onları yanlış yollara iten bir zaaf Atatürk'de yoktu. Birisi aleyhinde bir söz söylenildi miydi
onu söyleyen ne kadar yakını ve güvendiği biri olursa olsun ona inanmadan önce işi yansız bildiği bir veya bir kaç kişiye inceletir, ondan sonra bir karara varırdı. Eğer söyleyen ve aleyhinde söylenilen kimselerin ikisi de yakını ise onları yüzleştirir ve edindiği duygulara göre bir inanca varırdı. Bu yüzden Atatürk'ün yanında iftira ve tevzir makinesi işleyemezdi.

Atatürk sevmek, sevilmek, gönül almak konularında çok duygulu idi; neşeli olmak ve yanındakilerde neşeli kılmak ve görmek onun için adeta bir ihtiyaçtı. Şahsi cazibesi de bu işte kendisine çok yardım ederdi. Eğlence âlemlerini çok sevdiği bilinen bir yöndür, ancak yukarda yazdıklarımızdan anlaşılacağı gibi sofrası yalnız eğlenceye ayrılmış olmayıp orada çağırılmış olanların seviyesine göre siyasal, yönetimsel ve bilimsel pek çok konular ele alınır. Onun en önem verdiği yönlerden biri de her bir başarıyı, her bir büyük işi kendine değil Türk ulusuna mal etmekti. Her ne yapmışsa 'Türk ulusundan, aldığı ilhamla' yaptığını söylemekten zevk alırdı ve yukarda anlattığımız yoklama ve danışımı usulleri bu sözünü doğrulayacak özdeydi. 'Atatürk İnkılâpları' denilmesini de istemezdi ve bu gibi sözleri hep 'Türk İnkılâpları' biçiminde düzeltirdi.

Atatürk'ün önemli bir özelliği de yaşayışının hiç bir kısmının gizli kalmasını istememesidir. Açıkça içer ve açıkça her türlü eğlencelere dalardı. Doğuştan açıklığı sevmekte olmasından (başka bu yolu tutmasının iki etkeni vardı:
1) gizlilik onun eğlencelerine katılanlardan veya onları bilenlerden bu konular üzerinde kimseye bir şey söylememelerini istemeye varırdı ki bu Atatürk'ün bir nevi minnet altına girmesi demekti. O ise hiç bir minneti kabul edecek huyda değildi.
2) O, şu inançta idi ki, açıklık aleyhteki propagandaları etkisiz bırakmak için en iyi çaredir. Eğer halk kendisini içerken görürse ondan sonra düşman propagandacılar ona ayyaş deseler halk 'onu biliyoruz gördük başka yeni bir şey söyle' karşılığında bulunur ve propaganda suya düşer. Devlet sırlarını saklama bakımından da kendine öz bir yolu vardı. Sofrasında her şey kondurduğundan yabancı casuslar sofra da bulunmuş konuklarının, meselâ dönüşte şoförler duyacak biçim de aralarında konuşmaları veya sofracı ve türlü hizmetçilerin gevezeliği sayesinde her şeyden hiç olmazsa dolayısiyle, yarım yamalak da olsa az çok haber aldıklarını sanar ve edindikleri türlü ip uçlarına derinleştirmekle yetinirlerdi. Halbuki gerçek sırrın pek az olduğuna inanan Atatürk onlar üzerinde en yakın ilgililer dışında hiç kimse ile konuşmaz, bazen aksini sandıracak konuşmalar yapar ve haberler yayarak casusları gafil avlardı. 1922 Ağustos'undaki büyük saldırı, 1926'daki Bozkurt vapurunun batması dolayısiyle La Hay'de görülen dâva için Adliye Vekili Mahmut Esat (Bozkurt)'a verilen yönergelerden kimsenin bir şey sezememesi bunun örneklerindendir.

Özet olarak diyeceğiz ki; Atatürk Samsun'a çıktığı andan itibaren Türk ulusunun gerçek önderi olmuştur. Artık dilediği gibi çalışmak ve Türklüğün kurtuluş işini bir baş olarak ele almak imkânına sahiptir. Artık uzun tartışmalar sonucunda kile olsa her önemli işte son söz onun olacaktır. Gerçi bir çok birbirine zıt unsurlarla anlaşmak, onları gidilmesi gereken doğru yolun hangisi olduğuna inandırmak için epey uğraşmak gerekecektir. Ancak O'nun bu yoldaki uğraşları önderliği esas bakımdan kabul edilmiş bir kimsenin çabalarıdır; dolayısiyle de, daha önce olduğu gibi anlayışsız, kavrayışsız veya ürkek üstlere gerçek kurtuluş yollunu tutturmak için yapılması gereken uğraşlardan daha kolay ve daha az üzücüdür.
O'nun hem askerlik hem de siyasal bakımından isabetli bir görüşe sahip olduğu genel savaş sırasındaki başarı ve zaferlerinden, yine o sırada ve daha önce İttihat ve Terakki ile Hükümete gerçek durumu ve doğru yolu göstermek için yaptığı uğraşlardan anlaşılmıştır; aydınların pek çoğu ve hatta kısmen de halk kütleleri bunu bilmektedirler.
O, elinde bu kozlar olarak işe koyulacaktır.

1. İlk uygulama parametrelerimiz şöyle olsun: #00FF99 renk seçeneği ile maksimum kelime sıklığı 1000, maksimum kelime sayısı ise 100 olsun. Bu durumda kelime bulutumuz aşağıdaki gibi olacaktır.

2. İlk uygulama parametrelerimiz şöyle olsun: #00FFCC renk seçeneği ile maksimum kelime sıklığı 500, maksimum kelime sayısı ise 500 olsun. Bu durumda kelime bulutumuz aşağıdaki gibi olacaktır.

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

Bilimle ve teknolojiyle kalınız.

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

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

Yararlanılan Kaynaklar

Öne çıkan

R’da Kelime Bulutu Uygulaması Geliştirilmesi Üzerine Bir Vaka Çalışması: A Case Study on Developing a Word Cloud Application in R

Burada yapılan çalışmayla R programlama dili kullanılarak veri madenciliğinin bir dalı olan metin madenciliği (text mining) alanında bir uygulama geliştirilmiştir. Böylece kolay kullanım arayüzü sunan uygulama ile nitel araştırmalar yapan saha ve akademi çalışanlarına kolaylık sağlanması amaçlanmıştır.

Çalışma kapsamında geliştirilen uygulamadan bir ekran kesiti aşağıda verilmiştir.

Uygulamaya ise aşağıdaki linkten ulaşabilirsiniz.

https://buluttevfik.shinyapps.io/kelimebulutuv2/

Faydalı olması dileğiyle.

Yararlanılan Kaynaklar

Öne çıkan

R’da Büyük Veri Analizi ve “sparklyr” Arayüzü : Big Data Analysis and Interface “sparklyr” in R

sparklyr, R ile Apache Spark arasında bir arayüz sağlayarak R’daki büyük verileri işlemek için kullanılan açık kaynaklı küme hesaplama mantığında çalışan bir kütüphanedir.

Adı geçmişken biraz küme hesaplamadan bahsetmekte fayda var. 1967’de IBM’den Gene Amdahl tarafından yayınlanan bir makalede, paralel çalışma yapmanın bir yolu olarak küme hesaplamanın temelini adını taşıdığı Amdahl Yasası ile resmen ortaya koymuştur.

Küme hesaplama (cluster computing), hesaplama görevlerini birden çok bilgisayar arasında paylaşma işlemidir ve bu bilgisayarlar veya makineler kümeyi oluşturur. Kümeler, işlenen verilerin veya içeriğin kritikliği ve beklenen yüksek işleme hızı açısından yaygın olarak kullanılmaktadır. Kesinti süresi olmadan uzatılmış kullanılabilirlik ve ağır yük dengeleme yeteneği bekleyen siteler ve uygulamalar, bu kümeleri büyük ölçüde kullanmaktadır. Diğer bir ifadeyle, küme hesaplama, birçok bilgisayarın bir ağa bağlı olduğu ve tek bir varlık gibi çalıştığı anlamına gelir. Ağa bağlı her bilgisayara bir düğüm adı verilir. Küme hesaplama daha yüksek hesaplama hızı ve gelişmiş veri entegrasyonu sağlayarak karmaşık problemlere çözümler sunmaktadır. Küme hesaplama ağlar ile dağıtık sistem üzerinde çalışır. Bir küme hesaplama mimarisi gözümüzde canlanması adına aşağıdaki şekilde verilmiştir.

Kaynak: https://www.educba.com

İş uygulamalarına, performans optimizasyonuna ve yük dengeleme kümeleri, yüksek kullanılabilirlik (HA) kümeleri, yüksek performanslı (HP) kümeleri gibi mimari tercihlere bağlı olarak çeşitli küme hesaplama türleri kullanılır. Avantajlarından bazıları, işlem hızı, maliyet etkinliği, ölçeklenebilirlik ve kaynakların yüksek kullanılabilirliğidir. Küme hesaplamanın popüler uygulama alanları arasında Google arama motoru, Deprem Simülasyonu, Petrol Rezervuarı Simülasyonu ve Hava Tahmini sistemleri yer almaktadır.

Yapılan bir analizde Spark alt yapısının Hadoop’a göre Lojistik regresyon analizinde yaklaşık 110 kat daha hızlı olduğu bulunmuştur. Aşağıdaki grafikte Hadoop ve Spark Lojistik regresyon analizindeki hızları bakımından karşılaştırılmıştır. Diğer taraftan Spark’ın bağımsız küme modunu kullanarak EC2’de, Hadoop YARN’de, Mesos’ta veya Kubernetes’te çalıştırabilirsiniz. HDFS, Apache Cassandra, Apache HBase, Apache Hive ve diğer yüzlerce veri kaynağındaki verilere Spark ile ulaşabilirsiniz.

Kaynak: https://spark.apache.org/mllib/

Sparklyr kütüphanesi ile büyük veriyi bir Spark kümesi içerisinde analiz edebilirsiniz. Bu paket, hem bellekte hem de bellek dışında veri çerçevesi nesneleriyle çalışmak için popüler bir araç olan dplyr paketi için eksiksiz bir zemin oluşturmaktadır. R kodunu Spark SQL’e çevirmek için dplyr kullanabilirsiniz. Sparklyr ayrıca MLlib‘i destekler, böylece Spark’ta verileriniz üzerinde sınıflandırma, regresyon, küme, karar ağaçları ve daha birçok makine öğrenimi algoritmasını çalıştırabilirsiniz. MLlib, Apache Spark’ın ölçeklenebilir makine öğrenimi kütüphanesidir. Java, Scala, Python programlama dilllerinde de kullanılabilir. Sparklyr ile, geleneksel olarak R belleğini aşan büyük miktarda veriyi analiz edebilir, daha fazla görselleştirme ve dokümantasyon için Spark’tan R’a sonuçlar toplayabilirsiniz.

Sparklyr paketi hakkında kısa bir bilgi verdikten sonra şimdi R’da Sparklyr paketini yükleyerek adım adım örnek uygulama yapalım.

Aşağıdaki kod bloğu ile sparklyr paketini CRAN‘dan kurabilirsiniz.

install.packages("sparklyr")

sparklyr paketini kurduktan sonra sparklyr kütüphanesini çağırmak için aşağıdaki R kod bloğunu yazıyoruz. 2. satırdaki ve 3. satırdaki kodlar sparklyr paketinin güncel paketini yükleme amaçlı kullanılmaktadır. En güncel versiyonu yüklemek için RStudio IDE‘yi de kullanabilirsiniz.

library(sparklyr)
spark_install(version = "2.1.0")
#yada
devtools::install_github("rstudio/sparklyr")# en son versiyonu yüklemek için

sparklyr arayüz paketi ile Spark’a bağlanmak için aşağıdaki R kod bloğu yazılır. Hem yerel Spark kümesine hem de uzak Spark kümelerine bağlanabilirsiniz. Burada, spark_connect işlevi aracılığıyla yerel bir Spark kümesine bağlanacağız:

library(sparklyr)
#Yerel Spark ile bağlantı kurmak için
sc <- spark_connect(master = "local")
#Spark ile bağlantıyı kesmek istiyorsak: Bunu genelde yapılan işlem tamamlandıktan sonra yaparız.
spark_disconnect(sc)#başlangıçta çalıştırmayınız.
#eğer "databricks" metodu ile Spark ile bağlantı kurmak istersek
sc <- spark_connect(method = "databricks")

Artık mevcut tüm dplyr paketi özellikleri küme içindeki tablolarda kullanabiliriz. R’den Spark kümesine bazı veri kümelerini kopyalayarak başlayacağız. Basit ve bilinen bir mtcar veri seti ile başlayalım.

mtcars_tbl<-sdf_copy_to(sc, mtcars, "mymtcars", overwrite = TRUE)#birden çalıştırmak istediğim için overwrite = TRUE bileşenini kullandım.
mtcars_tbl %>% select(-carb) %>% head()#ilk 6 kaydı getirmek için. Burada carb değişkeni dışarıda bırakılmıştır sayfaya sığmadığı için

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

mtcars veri setinde cyl (silindir)‘ye göre basit bir filtreleme yapacak olursak;

mtcars_tbl %>% select(-carb) %>% filter(cyl == 6) %>% head() #silindiri 6'ya eşit olanların ilk 6 kaydı. Burada carb değişkeni dışarıda bırakılmıştır sayfaya sığmadığı için.

Yukarıdaki R kod bloğunun çalıştırılmasından sonra filtrelemeye göre elde edilen ilk 6 kayıt aşağıda verilmiştir.

Son olarak aynı veri setinden ggplot paketi kullanarak spark üzerinde grafik oluşturalım. mtcars veri seti setinde vites tipi olan “am” değişkeni iki kategoriden oluşmakta olup 0 otomatik vitesi, 1 ise manuel vitesi gösterecek şekilde recode edildikten sonra vites türüne göre hp (beygir gücü) ve mpg (galon yakıt başına gidilen mil) değişken değerleri grafik üzerinde verilmiştir.

library(ggplot2)
mtcars_tbl %>% select(mpg, cyl,hp, am) %>% mutate(am=if_else(am==0,"automatic", "manuel")) %>% ggplot(aes(hp, mpg, fill=am)) +
  geom_point() +
  geom_smooth() +
  facet_wrap(~am)+
  theme_light()

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

İşlemimizi tamamladığımız varsayımıyla Spark ile bağlantıyı kesmek için spark_disconnect() fonksiyonunu kullanıyoruz.

#Spark ile bağlantıyı kesmek istiyorsak: Bunu genelde işlem tamamlandıktan sonra yaparız.
spark_disconnect(sc)#başlangıçta çalıştırmayınız:)

Özetle R ile Apache Spark arasında bir arayüz sağlayan ve büyük verinin analizinde kullanılan sparklyr R paketi ile hacimsel olarak küçük bir veri seti üzerinde örnek bir uygulama yapılarak söz konusu paketin kullanımı hakkında farkındalık oluşturulmaya çalışılmıştır.

Faydalı olması 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

UKEssays. (November 2018). Cluster Computing: History, Applications and Benefits. Retrieved from https://www.ukessays.com/essays/computer-science/cluster-computing-history-applications-9597.php?vref=1

https://databricks.com./

https://therinspark.com/intro.html

https://www.educba.com/what-is-cluster-computing

https://spark.apache.org/docs/latest/cluster-overview.html

https://spark.rstudio.com/

https://spark.apache.org/mllib/

https://databricks-prod-cloudfront.cloud.databricks.com/public/4027ec902e239c93eaaa8714f173bcfc/2961012104553482/3725396058299890/1806228006848429/latest.html

https://stat.ethz.ch/R-manual/R-devel/library/datasets/html/mtcars.html

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

Prediction of Birth Rates in the USA Using LM, ANN, SVMs Methods

Introduction

The aim of this study is to predict the birth rate from the data sets of United States Department of Agriculture (Economic Research Service) and the United States’ Census Bureau using different analysis methods. The methods used in the regression problem are linear regression (LM), artificial neural network (ANN), radial, and linear support vector machines (SVMs).

SVMs are dealt with in the supervised learning class of artificial intelligence (AI) and machine learning (ML). In this analysis, ANN method can be considered as DNN (Deep Neural Network) because it has ANN architecture with more than one hidden layer. In the other hand, DNN can be evaluated in the supervised learning class of AI, and in in the field of deep learning (DL).

The results indicate that when Mean Square Error (MSE) and Mean Absolute Error (MAE) error types are compared, the SVM method including the radial basis parameter predicts the birth rates better than the other methods.

Sources of data sets utilized in analysis are given below

  1. https://www.ers.usda.gov/data-products/county-level-data-sets/download-data/
  2. https://www.census.gov/data/tables/time-series/demo/popest/2010s-state-detail.html
  3. https://www.census.gov/data/tables/time-series/demo/health-insurance/acs-hi.2017.htmlNA (Not Available) values are removed from data set.

Data set is consisted of 3141 observations of 11 variables. The variables selected in the analysis are listed below.

  1. Birth_Rate (Target Variable or Dependent Variable)
  2. Death_Rate
  3. Net_Migration_Rate
  4. Unemployment_Rate
  5. less_high_school
  6. high_school
  7. associate
  8. bachelor_or_higher
  9. Poverty_Percent
  10. Marriage_Rate
  11. Percent_Uninsured

The procedures and methods used in the analysis are explained step by step in the next sections.

Loading libraries

rm(list=ls())

lapply(c("xlsx","dplyr", "tibble", "tidyr", "ggplot2", "GGally","NeuralNetTools" ,"neuralnet", "formattable", "performanceEstimation", "e1071", "DMwR", "caret"), require, character.only = TRUE)

Loading data set

df <- read.xlsx('data_end_2017.xlsx', sheetName='data')

Defining variables in Tibble and data cleaning

df1<-tibble(Birth_Rate=round(df$Birth_Rate,1), Death_Rate=round(df$Death_Rate, 1),Net_Migration_Rate=round(df$Net_Migration_Rate, 1), Unemployment_Rate=df$Unemployment_Rate,less_high_school=df$V5, high_school=df$V6, associate=df$V7, bachelor_or_higher=df$V8, Poverty_Percent=df$Poverty_Percent, Marriage_Rate=round(df$Marriage_Rate, 1), Percent_Uninsured=df$Percent_Uninsured)

formattable(tibble(ID=1:11, Variables=names(df1))) #Names of variables

str(df1)#3142 observations of  11 variables

df1<-df1 %>% drop_na()#Removing NA (Not Available) values from data set

str(df1)##3141 observations of  11 variables

dim(df1)# Dimensions of data sets: 3141   11

summary(df1)

head(df1)

Names of variables

Data types of variables and number of observations after removing NA values

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':	3141 obs. of  11 variables:
 $ Birth_Rate        : num  11.9 10.9 10.7 12 11.5 12.2 11.7 11.4 10.8 8.4 ...
 $ Death_Rate        : num  9.3 10.1 11.7 9.7 12.4 11.3 13.1 12.6 13.6 13.8 ...
 $ Net_Migration_Rate: num  1 22.5 -25 -3.1 6.4 -21 -5.2 -1.8 2.5 6.9 ...
 $ Unemployment_Rate : num  3.9 4.1 5.8 4.4 4 4.9 5.5 5 4.1 4.1 ...
 $ less_high_school  : num  12.3 9.8 26.9 17.9 20.2 28.6 18.9 16.8 19.1 20.5 ...
 $ high_school       : num  33.6 27.8 35.5 43.9 32.3 36.6 40.4 32.2 38.4 38.2 ...
 $ associate         : num  29.1 31.7 25.5 25 34.4 21.4 24.5 33.1 29.1 28.9 ...
 $ bachelor_or_higher: num  25 30.7 12 13.2 13.1 13.4 16.1 17.9 13.3 12.5 ...
 $ Poverty_Percent   : num  13.4 10.1 33.4 20.2 12.8 34.4 21.3 17.7 18.2 17.2 ...
 $ Marriage_Rate     : num  7 7 7 7 7 7 7 7 7 7 ...
 $ Percent_Uninsured : num  16 16 16 16 16 16 16 16 16 16 ...

Descriptive statistics of variables

   Birth_Rate      Death_Rate    Net_Migration_Rate Unemployment_Rate
 Min.   : 0.00   Min.   : 1.20   Min.   :-68.3000   Min.   : 1.500   
 1st Qu.: 9.90   1st Qu.: 8.60   1st Qu.: -5.4000   1st Qu.: 3.500   
 Median :11.30   Median :10.40   Median :  0.5000   Median : 4.300   
 Mean   :11.38   Mean   :10.27   Mean   :  0.9654   Mean   : 4.598   
 3rd Qu.:12.60   3rd Qu.:12.10   3rd Qu.:  7.5000   3rd Qu.: 5.300   
 Max.   :28.80   Max.   :21.30   Max.   :150.2000   Max.   :19.600   
 less_high_school  high_school      associate     bachelor_or_higher
 Min.   : 1.10    Min.   : 7.30   Min.   : 8.80   Min.   : 4.70     
 1st Qu.: 9.00    1st Qu.:30.00   1st Qu.:27.00   1st Qu.:14.70     
 Median :12.40    Median :34.80   Median :30.60   Median :19.00     
 Mean   :13.81    Mean   :34.42   Mean   :30.56   Mean   :21.21     
 3rd Qu.:17.70    3rd Qu.:39.40   3rd Qu.:34.00   3rd Qu.:25.30     
 Max.   :58.70    Max.   :54.90   Max.   :46.70   Max.   :78.10     
 Poverty_Percent Marriage_Rate   Percent_Uninsured
 Min.   : 3.00   Min.   : 5.50   Min.   : 3.00    
 1st Qu.:10.90   1st Qu.: 6.00   1st Qu.:11.00    
 Median :14.40   Median : 6.80   Median :15.00    
 Mean   :15.38   Mean   : 6.86   Mean   :18.66    
 3rd Qu.:18.40   3rd Qu.: 7.10   3rd Qu.:23.00    
 Max.   :56.70   Max.   :28.60   Max.   :48.00  

Scatter pair plots of variables: Base mode

pairs(df1[,1:4], pch = 18, cex = 1, col=as.factor(1:3), lower.panel=NULL)

pairs(df1[,c(1,5:8)], pch = 18, cex = 1, col=as.factor(1:3), lower.panel=NULL)

pairs(df1[,c(1,9:11)], pch = 18, cex = 1, col=as.factor(1:2), lower.panel=NULL)

Plot 1: Scatter pair plots of variables: Base mode

Plot 2: Scatter pair plots of variables: Base mode

Plot 3: Scatter pair plots of variables: Base mode

Scatter pair plots and correlation coefficients: Ggpairs mode

ggpairs(df1[,1:4])
ggpairs(df1[,c(1,5:8)])
ggpairs(df1[,c(1,9:11)])

Plot 1: Scatter pair plots and correlation coefficients: Ggpairs mode

Plot 2: Scatter pair plots and correlation coefficients: Ggpairs mode

Plot 3: Scatter pair plots and correlation coefficients: Ggpairs mode

Splitting data set into training and test sets

Data set is splitted into training (70%) and test (30%) sets by simple random sampling (SRS) without replacement.

set.seed(1150)
n=NROW(df1)

SRS<-sample(sample(1:n, size = round(0.7*n), replace=FALSE))
training<-df1[SRS,]
test<-df1[-SRS, ]

Building Linear Model (LM) and Predicting

lm.fit <- glm(Birth_Rate~., data=training)
summary(lm.fit)

pr.lm <- predict(lm.fit,test)

Summary of LM

Call:
glm(formula = Birth_Rate ~ ., data = training)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.6431   -1.2701    0.0494    1.2338   17.5226  

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)        -1.210336  86.506626  -0.014    0.989    
Death_Rate         -0.196533   0.022653  -8.676  < 2e-16 ***
Net_Migration_Rate -0.040544   0.004030 -10.061  < 2e-16 ***
Unemployment_Rate  -0.069103   0.036281  -1.905    0.057 .  
less_high_school    0.238640   0.864714   0.276    0.783    
high_school         0.090654   0.865317   0.105    0.917    
associate           0.201731   0.865124   0.233    0.816    
bachelor_or_higher  0.123188   0.865118   0.142    0.887    
Poverty_Percent     0.019001   0.012121   1.568    0.117    
Marriage_Rate      -0.012984   0.031243  -0.416    0.678    
Percent_Uninsured  -0.022913   0.004762  -4.812  1.6e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 5.620194)

    Null deviance: 14742  on 2198  degrees of freedom
Residual deviance: 12297  on 2188  degrees of freedom
AIC: 10050

Number of Fisher Scoring iterations: 2

Building Artificial Neural Network (ANN) Model

nn<- neuralnet(Birth_Rate ~ Death_Rate + Unemployment_Rate + Net_Migration_Rate+less_high_school+high_school+high_school+associate+bachelor_or_higher+Poverty_Percent+Marriage_Rate+Percent_Uninsured, training, hidden=c(3,2), linear.output=T, threshold=0.01) 

summary(nn)

nn$result.matrix#Generating the error of the neural network model

plot(nn)#ANN Architecture

plotnet(nn, cex_val = 1, alpha_val = 1, prune_lty = "dashed")#NN Architecture

Summary of ANN

                    Length Class      Mode    
call                    6  -none-     call    
response             2199  -none-     numeric 
covariate           21990  -none-     numeric 
model.list              2  -none-     list    
err.fct                 1  -none-     function
act.fct                 1  -none-     function
linear.output           1  -none-     logical 
data                   11  data.frame list    
exclude                 0  -none-     NULL    
net.result              1  -none-     list    
weights                 1  -none-     list    
generalized.weights     1  -none-     list    
startweights            1  -none-     list    
result.matrix          47  -none-     numeric

Generating error of ANN model

error                           7.190738e+03
reached.threshold               9.953213e-03
steps                           5.492700e+04
Intercept.to.1layhid1          -1.420848e+00
Death_Rate.to.1layhid1          1.729804e+00
Unemployment_Rate.to.1layhid1   3.007492e-01
Net_Migration_Rate.to.1layhid1 -4.764154e-01
less_high_school.to.1layhid1    8.628385e-01
high_school.to.1layhid1         1.072833e+00
associate.to.1layhid1           1.401955e+00
bachelor_or_higher.to.1layhid1 -1.783482e-01
Poverty_Percent.to.1layhid1    -9.234006e-01
Marriage_Rate.to.1layhid1      -4.927336e-01
Percent_Uninsured.to.1layhid1   2.478482e+00
Intercept.to.1layhid2           2.723703e-01
Death_Rate.to.1layhid2         -1.700317e+00
Unemployment_Rate.to.1layhid2   5.703225e-01
Net_Migration_Rate.to.1layhid2 -2.078499e+00
less_high_school.to.1layhid2   -1.010006e+00
high_school.to.1layhid2         1.714122e+00
associate.to.1layhid2           4.837800e-01
bachelor_or_higher.to.1layhid2  1.039985e+00
Poverty_Percent.to.1layhid2     9.512370e-01
Marriage_Rate.to.1layhid2      -5.561333e-01
Percent_Uninsured.to.1layhid2  -3.077538e-01
Intercept.to.1layhid3          -1.322371e+00
Death_Rate.to.1layhid3         -7.556517e-01
Unemployment_Rate.to.1layhid3   4.942474e-01
Net_Migration_Rate.to.1layhid3 -3.532218e-01
less_high_school.to.1layhid3    1.597219e-01
high_school.to.1layhid3         5.478689e-01
associate.to.1layhid3           1.378378e+00
bachelor_or_higher.to.1layhid3  1.820102e-01
Poverty_Percent.to.1layhid3     1.701603e+00
Marriage_Rate.to.1layhid3      -5.974305e-02
Percent_Uninsured.to.1layhid3   8.631418e-01
Intercept.to.2layhid1          -5.147527e+00
1layhid1.to.2layhid1           -6.029849e+00
1layhid2.to.2layhid1            1.672761e+02
1layhid3.to.2layhid1           -5.579418e+00
Intercept.to.2layhid2           1.244695e+01
1layhid1.to.2layhid2            1.278534e+01
1layhid2.to.2layhid2            1.912635e+00
1layhid3.to.2layhid2            1.174542e+01
Intercept.to.Birth_Rate         4.943155e+00
2layhid1.to.Birth_Rate          3.305572e+00
2layhid2.to.Birth_Rate          3.178053e+00

ANN architecture with two hidden layers

Importance levels of variables in ANN model

In the ANN model, importance levels of variables are calculated using “olden” function because of multiple hidden layers (hidden=c(3,2)), and given below.

olden(nn)+ theme(axis.text.x = element_text(angle = 90, hjust = 1))#Variable importance in ANNs including multiple hidden layers 

Importance levels of variables in ANN model

Predicting Birth Rate using ANN

predict_nn <- compute(nn,test[,2:11])

Building SVM (Support Vector Machine) model with Radial Basis parameter, and Prediction

model1 <- svm(Birth_Rate~ ., training, kernel="radial", cost=1, epsilon=0.1, gamma=0.1)

summary(model1)

pred1 <- predict(model1, test)

Summary of SVM with Radial Basis parameter

Call:
svm(formula = Birth_Rate ~ ., data = training, kernel = "radial", 
    cost = 1, epsilon = 0.1, gamma = 0.1)


Parameters:
   SVM-Type:  eps-regression 
 SVM-Kernel:  radial 
       cost:  1 
      gamma:  0.1 
    epsilon:  0.1 


Number of Support Vectors:  1902

Building SVM (Support Vector Machine) model with Linear parameter, and Prediction

model1 <- svm(Birth_Rate~ ., training, kernel="linear")

pred2 <- predict(model1, test)

summary(model1)

Summary of SVM with Linear parameter

Call:
svm(formula = Birth_Rate ~ ., data = training, kernel = "linear")


Parameters:
   SVM-Type:  eps-regression 
 SVM-Kernel:  linear 
       cost:  1 
      gamma:  0.1 
    epsilon:  0.1 


Number of Support Vectors:  1929

Validation Tests by Methods

1.Cross Validation for LM

r <- performanceEstimation(
  PredTask(Birth_Rate ~ .,df1),
  workflowVariants(learner = "lm",
                   learner.pars = list(se = c(0, 0.25, 0.5, 1, 2))),
  EstimationTask(metrics = c("mse", "mae"),
                 method = CV(nReps = 3, nFolds = 10)))
rankWorkflows(r, top = 1)

getWorkflow("lm.v1", r)# AVG MSE: 5.61858 and AVG MAE:1.673429

plot(r)

Average MSE, and average MAE for LM model

$df1.Birth_Rate
$df1.Birth_Rate$mse
  Workflow Estimate
1    lm.v1 5.613821

$df1.Birth_Rate$mae
  Workflow Estimate
1    lm.v1 1.674253

Plotting MSE and MAE values for LM model

2. Cross Validation for ANN

#Repeated k-fold Cross Validation
train_control <- trainControl(method="repeatedcv", number=10, repeats=3)

# Train the model
model <- train(Birth_Rate~., data=df1, trControl=train_control, method="nnet")

print(model)

Average MAE for ANN model

It is used Repeated k-fold Cross Validation (NN) as validation test in package “caret” insead of “performanceEstimation” package.

initial  value 403331.122522 
final  value 359465.140000 
converged
Neural Network 

3141 samples
  10 predictor

No pre-processing
Resampling: Cross-Validated (10 fold, repeated 3 times) 
Summary of sample sizes: 2827, 2827, 2826, 2827, 2828, 2827, ... 
Resampling results across tuning parameters:

  size  decay  RMSE      Rsquared     MAE     
  1     0e+00  10.69727          NaN  10.38151
  1     1e-04  10.69727  0.002990157  10.38151
  1     1e-01  10.69729  0.018808431  10.38152
  3     0e+00  10.69727          NaN  10.38151
  3     1e-04  10.69727  0.024056622  10.38151
  3     1e-01  10.69728  0.017597580  10.38152
  5     0e+00  10.69727          NaN  10.38151
  5     1e-04  10.69727  0.011161407  10.38151
  5     1e-01  10.69728  0.022457815  10.38151

RMSE was used to select the optimal model using the smallest value.
The final values used for the model were size = 1 and decay = 0.

3. Cross Validation for SVM (Support Vector Machine) with Radial Basis parameter

pr1 <- performanceEstimation(
 PredTask(Birth_Rate ~ .,df1),
 workflowVariants(learner="svm",
                  learner.pars=list(kernel="radial",cost=1, epsilon=0.1, gamma=0.1)),
 EstimationTask(metrics = c("mse", "mae"),
                 method = CV(nReps = 3, nFolds = 10)))
summary(pr1)# AVG MSE:5.0181919 and AVG MAE:1.52361665

rankWorkflows(pr1, top = 1)

getWorkflow("svm", pr1)

plot(pr1)

Average MSE, and average MAE for SVM (Support Vector Machine) with Radial Basis parameter

-> Task:  df1.Birth_Rate
  *Workflow: svm 
              mse        mae
avg     5.0237890 1.52349784
std     0.7941622 0.08445783
med     4.8739686 1.51075518
iqr     0.9747409 0.10690584
min     3.5181964 1.37328251
max     6.4726952 1.71792661
invalid 0.0000000 0.00000000
$df1.Birth_Rate
$df1.Birth_Rate$mse
  Workflow Estimate
1      svm 5.023789

$df1.Birth_Rate$mae
  Workflow Estimate
1      svm 1.523498


Workflow Object:
	Workflow ID       ::  svm 
	Workflow Function ::  standardWF
	     Parameter values:
		 learner.pars  -> kernel=radial cost=1 epsilon=0.1 gamma=0.1 
		 learner  -> svm 

Plotting MSE and MAE values for SVM (Support Vector Machine) with Radial Basis parameter

4. Cross Validation for SVM (Support Vector Machine) with Linear parameter

pr1 <- performanceEstimation(
 PredTask(Birth_Rate ~ .,df1),
 workflowVariants(learner="svm",
                  learner.pars=list(kernel="linear")),
 EstimationTask(metrics = c("mse", "mae"),
                 method = CV(nReps = 3, nFolds = 10)))
summary(pr1)# AVG MSE:5.671183 and AVE MAE:1.6563516

rankWorkflows(pr1, top = 1)

getWorkflow("svm", pr1)

plot(pr1)

Average MSE, and average MAE for SVM (Support Vector Machine) with Linear parameter


##### PERFORMANCE ESTIMATION USING  CROSS VALIDATION  #####

** PREDICTIVE TASK :: df1.Birth_Rate

++ MODEL/WORKFLOW :: svm 
Task for estimating  mse,mae  using
 3 x 10 - Fold Cross Validation
	 Run with seed =  1234 
Iteration :******************************

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

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

* Predictive Tasks ::  df1.Birth_Rate
* Workflows  ::  svm 

-> Task:  df1.Birth_Rate
  *Workflow: svm 
              mse        mae
avg     5.6742841 1.65745175
std     0.8087646 0.08828428
med     5.7814504 1.66599466
iqr     1.0277489 0.12239844
min     4.1506266 1.51514278
max     7.1174248 1.81856657
invalid 0.0000000 0.00000000
$df1.Birth_Rate
$df1.Birth_Rate$mse
  Workflow Estimate
1      svm 5.674284

$df1.Birth_Rate$mae
  Workflow Estimate
1      svm 1.657452


Workflow Object:
	Workflow ID       ::  svm 
	Workflow Function ::  standardWF
	     Parameter values:
		 learner.pars  -> kernel=linear 
		 learner  -> svm 

Plotting MSE and MAE values for SVM (Support Vector Machine) with Linear parameter

The models built were validated using “performanceEstimation” and “caret” packages. As validation test,  Repetitive k-Fold cross validation test (nReps = 3) was used. The MAE and MSE results of the methods used are given in the table 1 below after being presented code block.

Method<-c("LM", "ANN", "SVM Radial", "SVM Linear")
MSE<-list(5.61858, "Not available in packages caret and performanceEstimation",5.0181919,5.671183)
MAE<-c(1.673429, 10.38152,1.52361665,1.6563516)
formattable(tibble(Method=Method, MSE=MSE, MAE=MAE))

Table 1: The MAE and MSE Results of the Methods by Validation Tests

Plotting the results of actual and predicted birth rates by methods

Visual comparison of performance of methods is conducted in terms of actual test values and predicted ones, and were shown below.

#ANN: Comparison of actual and predictive birth rates
results <- data.frame(actual = test$Birth_Rate, predictionNN = round(predict_nn$net.result,1))

#LM: Comparison of actual and predictive birth rates
results1 <- data.frame(actual = test$Birth_Rate, predictionLM = round(pr.lm,1))

#SVM with Radial Basis Parameter: Comparison of actual and predictive birth rates
results3 <- data.frame(actual = round(test$Birth_Rate,1), predictionSVMKernel = round(pred1,1))

#SVM with Linear Parameter: Comparison of actual and predictive birth rates
results4 <- data.frame(actual = round(test$Birth_Rate,1), predictionSVMLinear = round(pred2,1))

comp<-cbind(Birth_Rate=results[,1],NN=results[,2], LM=results1[, 2], SVMRadial=results3[, 2], SVMLinear=results4[, 2])

comparison<-formattable(as_tibble(comp))

plot(test$Birth_Rate,predict_nn$net.result,col='red',main='Real vs predicted NN',pch=18,cex=0.7, xlab="Birth Rate", ylab = "Prediction" )
points(test$Birth_Rate, pr.lm,col='blue',pch=18,cex=0.7) 
points(test$Birth_Rate, comparison$SVMRadial,col='brown',pch=18,cex=0.7)
points(test$Birth_Rate, comparison$SVMLinear,col='green',pch=18,cex=0.7) 
abline(0,1,lwd=2)
legend("topright",legend=c('NN','LM', 'SVMRadial','SVMLinear'),pch=18,col=c('red','blue', 'brown', 'green'))

Writing results containing actual and predicted birth rates by method into the file with “xlsx” extension

write.xlsx(comparison, file = "comparison_results.xlsx", 
           sheetName="results", append=TRUE)

The file called “comparison_results” actual and predicted birth rates by method can be downloaded from the link below.

Showing first ten findings containing actual and predicted values by method

After being presented code block, the first ten rows of actual and predicted birth rates by method used are given in Table 2.

formattable(head(comparison,10))

Table 2: The First Ten Findings Containing Actual and Predicted Birth Rates by Method

Conclusion

As can be seen from the validation test results in the Table 1 above, SVM including Radial Basis Parameter is the best method in terms of MAE and MSE values obtained. Therefore, it is recommended that SVM with Radial Basis Parameter can be used in prediction of birth rates.

Hope to be useful and raise awareness.

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

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

References

  1. https://www.ers.usda.gov/data-products/county-level-data-sets/download-data/
  2. https://www.census.gov/data/tables/time-series/demo/popest/2010s-state-detail.html
  3. https://www.census.gov/data/tables/time-series/demo/health-insurance/acs-hi.2017.html
  4. https://www.r-project.org/
  5. https://datascienceplus.com/neuralnet-train-and-test-neural-networks-using-r/
  6. http://cs229.stanford.edu/notes/cs229-notes3.pdf
  7. http://www.cs.columbia.edu/~kathy/cs4701/documents/jason_svm_tutorial.pdf
  8. http://svms.org/tutorials/BurbidgeBuxton2001.pdf
  9. https://course.ccs.neu.edu/cs5100f11/resources/jakkula.pdf
  10. https://med.nyu.edu/chibi/sites/default/files/chibi/Final.pdf
  11. http://ijarcet.org/wp-content/uploads/IJARCET-VOL-1-ISSUE-10-185-189.pdf
  12. http://www.ijastnet.com/journals/Vol_7_No_2_June_2017/2.pdf
  13. https://www.demographic-research.org/volumes/vol20/25/20-25.pdf
  14. https://www.hindawi.com/journals/cmmm/2013/487179/
  15. http://www.cinc.org/Proceedings/2005/pdf/0247.pdf
  16. https://scialert.net/fulltext/?doi=jai.2016.33.38
  17. https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2894370
  18. https://www.ijeat.org/wp-content/uploads/papers/v9i1/A9386109119.pdf
  19. https://www.ijitee.org/wp-content/uploads/papers/v8i9S/I11460789S19.pdf
  20. https://biomedpharmajournal.org/vol11no3/emg-signal-analysis-for-diagnosis-of-muscular-dystrophy-using-wavelet-transform-svm-and-ann/
  21. https://canvas.harvard.edu/courses/12656/files/3151019/download?verifier=62k2w6mW3Glg0caFIRHfXACHlC0iS5JzwJTfTZZr&wrap=1
  22. https://scholar.harvard.edu/files/javierzazo/files/svms.pdf

R’da Türk Alfabesi Karakterleri ile Tekrarlı ve Tekrarsız Şifre Üretimi Üzerine Vaka Çalışmaları (Case Studies on with Replacament and without Replacament Password Generation with Turkish Alphabet Characters in R)

Günümüzde ve hayatın pek çok alanında şifreler yaygın bir şekilde kullanılmaktadır. Güvenli girişi sağlamak ve kullanım izinlerine düzenleme getiren şifreler bankacılık, telefon operatörlerini içine alan telekom sektöründe, veri tabanı uygulamaları gibi adını sayamayacağımız birçok alanda yoğun bir şekilde kullanılmaktadır.

Şifre belirleme işlemi genellikle rastgele üretilen sayılardan oluştuğu gözlenmekle birlikte güvenlik kaygısından dolayı daha fazla kombinasyona ve haneye ihtiyaç duyulmaktadır. Artan dijitalleşme ve her geçen gün gelişen teknoloji sayesinde kullanılan bu şifreleri kırarak kişiler, şirketler ve kamu kurum veya kuruluşları tarafında güvenlik açığı ortaya çıkarmaktadır. Son dönemlerde ülkemize yapılan siber saldırıların yoğunluk kazanması da güvenli ve güçlü şifre oluşturulmasını zorunlu hale getirmiştir.

Şifre uygulamalarına bakıldığında genellikle ya sadece rakamlardan oluşmakta ya da daha güçlü bir şifre oluşturulması adına harf ve rakam kombinasyonlarından oluştuğu görülmektedir. Harf kombinasyonunda ise 26 harften oluşan İngiliz alfabesindeki harflerin yaygın bir şekilde kullanıldığı gözlenmektedir.

Bu çalışmada Cumhuriyetimizin 96. yıl anısına 7 haneli harf ve rakam kombinasyonlarından oluşan Türk alfabesi kullanılarak özgün şifre oluşturma uygulaması yapılmıştır. İstenirse aşağıda verilen R kod bloğu içerisindeki fonksiyonlarla çok daha fazla veya az haneli şifreler üretilebilir. Bu durum tamamen kullanıcının kararına ve ihtiyacına bağlıdır. Şifre kombinasyonunda Türk alfabesindeki harflere de yer verilmesinin nedeni hem çok daha güçlü şifre kombinasyonu oluşturulmasından ve hem de yerli olması amaçlanmasından kaynaklanmaktadır. Türk alfabesinin kullanılmasındaki bir diğer neden, 26 harften oluşan İngiliz alfabesinin aksine Türk alfabesinin 29 harften oluşuyor olmasıdır. Bu durum çok daha fazla kombinasyonda güvenli şifre oluşturulmasına imkan tanımaktadır.

Örnek uygulamada 7 haneli şifre oluşturmada kullanılan harf seti Tablo 1’de verilmiştir.

Tablo 1. Harf ve Rakamlar

Şifre oluşturma adımında rakam olarak belirlenen set ise 0’dan 9 (dahil)’a kadar olan rakamlardan oluşmaktadır.

Her bir haneye harflerin ve/veya rakamların atanmasında tekrarlı örneklem seçim tekniği (sampling technique with replacement) ve tekrarsız örneklem seçim tekniği (sampling technique without replacement) kullanılarak iki farklı 7 haneli şifre oluşturma uygulaması yapılmıştır.

İlk şifre oluşturma uygulaması tekrarlı örneklem seçim tekniği kullanılarak yapılmıştır. Örnek uygulamaya ilişkin R kod bloğu aşağıda verilmiştir.

Tekrarlı Şifre Uygulaması İçin R Kod Bloğu-1

# Gelişmiş ve esnek tablo (data frame) oluşturmak için.
library(tibble)

#Elde edilen sonucu sabitlemek, diğer bir deyişle kod bloğunun her çalıştırılmasında aynı sonucu almak için
set.seed(1923)

#Türk Alfabesinde 1'den 29'a kadar ID (sıra) numarası atayarak harfleri tablo formatında vermek için

Harf<-tibble(ID=1:29, Alfabe=c("A","B", "C", "Ç", "D", "E","F","G", "Ğ", "H", "I", "İ", "J", "K", "L", "M", "N", "O", "Ö", "P", "R", "S", "Ş", "T", "U", "Ü", "V", "Y", "Z"))

X1<-sample(Harf$Alfabe, 1, replace = T)#Harf tablosundan Alfabe adlı değişken veri setinin elemanları içerisinden tekrarlı örneklem seçim tekniği kullanılarak harf seçimi yapmak için.

X2<-sample(0:9, size=1, replace= T)#0'dan 9 (dahil)'a  kadar olan rakam seti içerisinden tekrarlı örneklem seçim tekniği kullanılarak rakam seçmek için.

X3<-sample(Harf$Alfabe, 1, replace = T)#Harf tablosundan Alfabe adlı değişken veri setinin elemanları içerisinden tekrarlı örneklem seçimi yapmak için.

X4<-sample(0:9, size=1, replace= T)#0'dan (dahil)'a  kadar olan rakam seti içerisinden tekrarlı örneklem seçim tekniği kullanılarak rakam seçmek için.

X5<-sample(0:9, size=1, replace= T)#0'dan 9 (dahil)'a kadar olan rakam seti içerisinden tekrarlı örneklem seçim tekniği kullanılarak rakam seçmek için.

X6<-sample(0:9, size=1, replace= T)#0'dan 9 (dahil)'a kadar olan rakam seti içerisinden tekrarlı örneklem seçim tekniği kullanılarak rakam seçmek için.

X7<-sample(0:9, size=1, replace= T)#0'dan 9 (dahil)'a kadar olan rakam seti içerisinden tekrarlı örneklem seçim tekniği kullanılarak rakam seçmek için.

hane1<-sample(c(X1, X2, X3, X4, X5, X6, X7), 1, replace= T)

hane2<-sample(c(X1, X2, X3, X4, X5, X6, X7), 1, replace= T)

hane3<-sample(c(X1, X2, X3, X4, X5, X6, X7), 1, replace= T)

hane4<-sample(c(X1, X2, X3, X4, X5, X6, X7), 1, replace= T)

hane5<-sample(c(X1, X2, X3, X4, X5, X6, X7), 1, replace= T)

hane6<-sample(c(X1, X2, X3, X4, X5, X6, X7), 1, replace= T)

hane7<-sample(c(X1, X2, X3, X4, X5, X6, X7), 1, replace= T)

#Elde edilen şifrenin 7 haneli olarak birarada gözükmesi için

sifre<-paste0("Yedi Haneli Şifreniz:",hane1, hane2, hane3, hane4, hane5, hane6, hane7)

sifre

Yukarıdaki R kod bloğunun run (CTRL + ALT + I) edilmesiyle elde edilen şifre aşağıda verilmiştir.

Tekrarlı Şifre Uygulaması Kod Bloğu Sonucu-1 (Output-1)

"Yedi Haneli Şifreniz:990M981"

Yukarıdaki tekrarlı 7 haneli şifre oluşturma uygulamasına alternatif olarak hazırlanan diğer bir R kod bloğu, R’da fonksiyon (function) özelliği kullanılarak aşağıda verilmiştir.

Tekrarlı Şifre Uygulaması İçin R Kod Bloğu-2


#Elde edilen sonucu sabitlemek, diğer bir deyişle kod bloğunun her çalıştırılmasında aynı sonucu almak için

set.seed(96)

# Gelişmiş ve esnek tablo (data frame) oluşturmak için.
library(tibble)

#Görevleri yapmak üzere tanımlanan fonksiyon

tekrarli_sifre <- function(uzunluk, satir_sayisi){

  tablo<-cbind(1:satir_sayisi,matrix(ncol=0,nrow=satir_sayisi))

  rakam <- 0:9

  harf <- c("A","B", "C", "Ç", "D", "E","F","G", "Ğ", "H", "I", "İ", "J", "K", "L", "M", "N", "O", "Ö", "P", "R", "S", "Ş", "T", "U", "Ü", "V", "Y", "Z")#Türk Alfabesinde 1'den 29'a kadar ID (sıra) numarası atayarak harfleri tablo formatında vermek için

  birlesik <- c(rakam, harf)

  olasılık <- c(rep(10/39, 10), rep(29/39, 29))#rakamların ve harflerin popülasyon içindeki oranı: bu oranlar örneklem seçiminde olasılık (prob) değerlerinin belirlenmesi için yapılmıştır.
  sifre<-replicate(nrow(tablo),paste0(sample(birlesik, uzunluk, TRUE, prob = olasılık), collapse = ""))#örneklem seçim tekniği olarak (T=TRUE) tekrarlı olan alınmıştır.
  tablo<-tibble(Sıra=1:satir_sayisi, Şifreleriniz=sifre)#sıra numarası ile birlikte belirlenen şifreleri tablo formatında vermek için.
  return(tablo)
}
tekrarli_sifre(uzunluk = 7, satir_sayisi = 10)# tanımlanan fonksiyona göre 10 satırlık ve 7 haneli şifre oluşturulur.

Yukarıdaki R kod bloğunun run (CTRL + ALT + I) edilmesiyle elde edilen 10 adet şifre aşağıda verilmiştir.

Tekrarlı Şifre Uygulaması Kod Bloğu Sonucu-2 (Output-2)

Sıra  Şifreleriniz
1	Ğ32U7Z5			
2	NECVU3I			
3	IKINGMT			
4	GÜRLIR7			
5	5BGCZKH			
6	Ğ79ÖBÇS			
7	YYEGUVB			
8	JBUPCMY			
9	ZARLFUL			
10	51İDFŞH

İstenirse yukarıdaki kod bloğundaki fonksiyonla daha uzun (daha çok haneli) ve daha çok sayıda (satır olarak) şifre üretilebilir. Söz gelimi tekrarli_sifre(uzunluk = 10, satir_sayisi = 100) fonksiyonu yazılmış olursa 10 haneli 100 satırlık şifre oluşturulmuş olur. R kod bloğundaki set.seed()” fonksiyonu kaldırıldıktan sonra run (CTR + ALT + I) ederek her defasında yeni şifreler üretebilirsiniz.

İlk şifre oluşturma uygulaması tekrarlı örneklem seçim tekniği kullanılarak yukarıda yapılmıştı. Şimdi ise tekrarsız örneklem seçim tekniği kullanılarak 7 haneli şifre uygulaması yapılmıştır. Örnek uygulamaya ilişkin R kod bloğu aşağıda verilmiştir. Bir önceki kod bloğu içinde kullanılan fonksiyon ve onu oluşturan parametreler açıklandığından aşağıdaki kod bloğunda bu açıklamalara tekrar yer verilmemiştir.

Tekrarsız Şifre Uygulaması İçin R Kod Bloğu-3

set.seed(1923)
library(tibble)
tekrarsiz_sifre <- function(uzunluk, satir_sayisi){
  tablo<-cbind(1:satir_sayisi,matrix(ncol=0,nrow=satir_sayisi))
  rakam <- 0:9
  harf <- c("A","B", "C", "Ç", "D", "E","F","G", "Ğ", "H", "I", "İ", "J", "K", "L", "M", "N", "O", "Ö", "P", "R", "S", "Ş", "T", "U", "Ü", "V", "Y", "Z")
  birlesik <- c(rakam, harf)
  olasılık <- c(rep(10/39, 10), rep(29/39, 29))
  sifre<-replicate(nrow(tablo),paste0(sample(birlesik, uzunluk, FALSE, prob = olasılık), collapse = ""))
  tablo<-tibble(Sıra=1:satir_sayisi, Şifreleriniz=sifre)
  return(tablo)
}
tekrarsiz_sifre(uzunluk = 7, satir_sayisi = 10)

Yukarıdaki R kod bloğunun run (CTRL + ALT + I) edilmesiyle elde edilen tekrarsız 10 adet şifre aşağıda verilmiştir.

Tekrarsız Şifre Uygulaması Kod Bloğu Sonucu-3 (Output-3)

Sıra  Şifreleriniz
1	ÜRHŞP72			
2	7OÜÇLHG			
3	6MDĞZCE			
4	57İFÜTÖ			
5	26KCRNU			
6	AJÜPTFS			
7	UR3SDP8			
8	GJKCNFE			
9	TONADİS			
10	4LĞDYRP

İhtiyaç duyulması halinde yukarıdaki kod bloğundaki fonksiyonla daha uzun (daha çok haneli) ve daha çok sayıda (satır olarak) şifre üretilebilir. Söz gelimi tekrarsiz_sifre(uzunluk = 9, satir_sayisi = 50) fonksiyonu yazılmış olursa 9 haneli 50 satırlık tekrarsız şifre oluşturulmuş olur. R kod bloğundaki set.seed()” fonksiyonu kaldırıldıktan sonra run (CTR + ALT + I) ederek her defasında yeni şifreler üretebilirsiniz.

Özetle, şifre belirleme tekniği olarak iki farklı örneklem seçim tekniği kullanılarak 7 haneli şifre oluşturma uygulaması yapılmıştır. Ancak tekrarlı seçim tekniği kullanılarak üretilecek şifre adeti tekrarsız seçime göre çok daha fazla olması olasıdır. Ancak istenirse yukarıdaki örnekte de olduğu gibi tekrarsız seçim tekniği de kullanılarak şifre üretilebilir.

Yapılan çalışma yapacağınız çalışmalara rahatlıkla uyarlanabilme özelliği taşıdığından tek yapılması gereken şey, kod bloğu içerisindeki fonksiyonların ihtiyacınıza uygun (şifrenin kaç haneden oluşacağı) düzenlenmesidir.

Faydalı olması dileğiyle.

Bilimle ve teknolojiyle kalınız.

Saygılarımla.

Not: Emeğe saygı adına, bu sitede yer alan çalışmanın başka bir ortamda paylaşılması halinde alındığı yer adının belirtilmesini rica ederim.

Note: For the sake of respect for labor, I kindly ask you to indicate the name of the place where the work on this site is shared in another environment.

Yararlanılan Kaynak

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

https://tevfikbulut.com/2019/10/30/microsoft-excelde-turk-alfabesi-karakterleri-ile-sifre-uretimi-uzerine-bir-vaka-calismasi-a-case-study-on-password-generation-with-turkish-alphabet-characters-in-microsoft-excel/

https://www.listendata.com/

https://www.tutorialspoint.com/

R Programlama Dilinde Şifre Üretimi Üzerine Bir Vaka Çalışması (A Case Study On Password Generation In R Programming Language)

Günümüzde ve hayatın pek çok alanında şifreler yaygın bir şekilde kullanılmaktadır. Güvenli girişi sağlamak ve kullanım izinlerine düzenleme getiren şifreler bankacılık, telefon operatörlerini içine alan telekom sektöründe, veri tabanı uygulamaları gibi adını sayamayacağımız birçok alanda yoğun bir şekilde kullanılmaktadır.

Şifre belirleme işlemi genellikle rastgele üretilen sayılardan oluştuğu gözlenmekle birlikte güvenlik kaygısından dolayı daha fazla kombinasyona ve haneye ihtiyaç duyulmaktadır. Artan dijitalleşme ve her geçen gün gelişen teknoloji sayesinde kullanılan bu şifreleri kırarak kişiler, şirketler ve kamu kurum veya kuruluşları tarafında güvenlik açığı ortaya çıkarmaktadır.

Bu çalışmada 6 haneli harf ve rakam kombinasyonlarından oluşan özgün şifre oluşturma uygulaması yapılacaktır. Şifre kombinasyonunda harflere de yer verilmesinin nedeni olabildiğince güçlü şifre kombinasyonu oluşturulmak istenmesinden kaynaklanmaktadır. 6 haneli şifre üretilmesindeki sebep, yaygın kullanım alanına sahip olmasıdır. İstenirse çok daha fazla veya az haneli şifreler üretilebilir. Bu durum tamamen kullanıcının kararına ve ihtiyacına bağlıdır.

Örnek uygulamada 6 haneli şifre oluşturmada harf ve rakam seti kullanılmıştır.

Rakam olarak belirlen set, 0’dan 9 (dahil)’a kadar olan rakamlardan oluşmaktadır. Harfler ise 26 harfli ingiliz alfabesi harflerinden oluşmaktadır. Her bir haneye harflerin ve rakamların atanmasında tekrarlı örneklem seçim tekniği (sampling technique with replacement) kullanılmıştır.

Örnek uygulama kapsamında ilk olarak soldan sağa 6 haneli şifre oluşturulmuş olup, 1 nolu kod bloğunda kullanılan fonksiyonlara yer verilmiştir.

1 Nolu R Kod Bloğu (R Code Block 1)

#SOLDAN SAĞA DOĞRU 6 HANELİ ŞİFRE OLUŞTURMA
x1<-sample(0:9, size=1, replace=F)
x2<-sample(LETTERS, size=1, replace=F)
X3<-sample(0:9, size=1, replace=F)
x4<-sample(LETTERS, size=1, replace=F)
x5<-sample(0:9, size=1, replace=F)
x6<-sample(LETTERS, size=1, replace=F)

head(paste0("şifreniz"," ", x1, x2, x3, x4,x5,x6), 1)

1 nolu kod bloğunun çalıştırılması (run) ile elde edilen sonuç aşağıda verilmiştir.

1 Nolu R Kod Bloğu: Sonuç (R Code Block 1: Output )

[1] "şifreniz 5U1K4W"

Sağdan sola doğru 6 haneli şifre oluşturulmuş olup, 2 nolu kod bloğunda kullanılan fonksiyonlara yer verilmiştir.

2 Nolu R Kod Bloğu (R Code Block 2)

#SAĞDAN SOLA DOĞRU 6 HANELİ ŞİFRE OLUŞTURMA
x1<-sample(0:9, size=1, replace=F)
x2<-sample(LETTERS, size=1, replace=F)
X3<-sample(0:9, size=1, replace=F)
x4<-sample(LETTERS, size=1, replace=F)
x5<-sample(0:9, size=1, replace=F)
x6<-sample(LETTERS, size=1, replace=F)
head(paste("şifreniz"," ",x6, x5, x4, x3, x2, x1), 1)

2 nolu kod bloğunun çalıştırılması (run) ile elde edilen sonuç aşağıda verilmiştir.

2 Nolu R Kod Bloğu: Sonuç (R Code Block 2: Output )

[1] "şifreniz   F 3 D 1 Q 0"

Ortadan sağa doğru 6 haneli şifre oluşturulmuş olup, 3 nolu kod bloğunda kullanılan fonksiyonlara yer verilmiştir.

3 Nolu R Kod Bloğu (R Code Block 3)

#ORTADAN SAĞA DOĞRU 6 HANELİ ŞİFRE OLUŞTURMA
x1<-sample(0:9, size=1, replace=F)
x2<-sample(LETTERS, size=1, replace=F)
X3<-sample(0:9, size=1, replace=F)
x4<-sample(LETTERS, size=1, replace=F)
x5<-sample(0:9, size=1, replace=F)
x6<-sample(LETTERS, size=1, replace=F)

head(paste0("şifreniz"," ", x4, x5, x6, x1,x2,x3), 1)

3 nolu kod bloğunun çalıştırılması (run) ile elde edilen sonuç aşağıda verilmiştir.

3 Nolu R Kod Bloğu: Sonuç (R Code Block 3: Output )

[1] "şifreniz F0R0K1"

Ortadan sola doğru 6 haneli şifre oluşturulmuş olup, 4 nolu kod bloğunda kullanılan fonksiyonlara yer verilmiştir.

4 Nolu R Kod Bloğu (R Code Block 4)

#ORTADAN SOLA DOĞRU 6 HANELİ ŞİFRE OLUŞTURMA
x1<-sample(0:9, size=1, replace=F)
x2<-sample(LETTERS, size=1, replace=F)
X3<-sample(0:9, size=1, replace=F)
x4<-sample(LETTERS, size=1, replace=F)
x5<-sample(0:9, size=1, replace=F)
x6<-sample(LETTERS, size=1, replace=F)
head(paste0("şifreniz"," ", x3, x2, x1, x6,x5,x4), 1)

4 nolu kod bloğunun çalıştırılması (run) ile elde edilen sonuç aşağıda verilmiştir.

4 Nolu R Kod Bloğu: Sonuç (R Code Block 4: Output )

[1] "şifreniz 1C2V7W"

Yukarıdaki R kod blokları run edilerek her defasında yeni şifreler üretebilirsiniz.

Şifre seçim tekniği olarak tekrarlı seçim tekniği kullanılarak üretilecek şifre adeti tekrarsız seçime göre çok daha fazla olması sağlanmıştır. Ancak istenirse tekrarsız seçim tekniği de kullanılarak şifre üretilebilir.

Yapılan çalışma yapacağınız çalışmalara rahatlıkla uyarlanabilme özelliği taşıdığından tek yapılması gereken sütun veya satır sayısını artırmak ve azaltmak.

Faydalı olması dileğiyle.

Bilimle ve teknolojiyle kalınız.

Saygılarımla.

Not: Emeğe saygı adına, bu sitede yer alan çalışmanın başka bir ortamda paylaşılması halinde alındığı yer adının belirtilmesini rica ederim.

Note: For the sake of respect for labor, I kindly ask you to indicate the name of the place where the work on this site is shared in another environment.

Yararlanılan Kaynaklar

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

R ve Python’da Tekrarlı Basit Tesadüfi Örnekleme Üzerine Bir Vaka Çalışması: A Case Study on Simple Random Sampling (SRS) with Replacement in R and Python

Basit tesadüfi örnekleme, popülasyondaki birimlerinden örnekleme seçilme olasılığı bilinen ve seçilme olasılığı sıfır olmayan örnekleme türüdür. Bu örnekleme türü aynı zamanda olasılıklı örnekleme tekniklerinden biri olup, popülasyon hakkında çıkarımsal (inferential) istatistikler ortaya koymaya ve örneklemden elde edilen bulguların hedef popülasyona genellebilmesine olanak tanır.

Basit tesadüfi örnekleme, tekrarlı (popülasyondaki birimlerin eşit ve birden fazla seçilme olasılığı) ve varsayımsal bir örnek üzerinden uygulamalı olarak gösterilecektir. Tekrarlı seçilme olasılığı, topların olduğu torbadan seçilmiş bir topun tekrar torbanın içine atılarak tekrar seçilme olasılığının tanındığı bir olasılık tekniği olarak ele alınabilir. Benzer işlem burada örneklem seçiminde de yapılacaktır. Bu kapsamda Microsoft Excel kullanılacaktır. Aşağıdaki excel dokümanını ihtiyacınıza uygun uyarlayarak kolaylıkla uygulayabilirsiniz.

Örnek Olay (Example)

Popülasyon büyüklüğü (N) 850 firma arasından 120 firma (n: örneklem büyüklüğü) tekrarlı basit tesadüfi örnekleme yapılarak örnekleme seçilecektir. Daha sonra örnekleme seçilen bu firmalar üzerinde araştırma yapılacaktır. Bir kez seçilmiş firmalara 1. soru kağıdı, birden fazla seçilmiş firmalara cevaplarının tutarlılığını ölçümlemek için belirli zaman aralıklarıyla 1. soru kağıdı ile birlikte 2. ve 3. soru kağıtları firmaların cevaplaması için gönderilecektir.

Not 1: Örneklem seçimine geçmeden önce elde edilen firma listesinin mükerrer kayıtlardan arındırılması (firmaların benzersiz olması) ve her bir firmaya küçükten büyüğe doğru numara ataması yapılması gerekmektedir.

Not 2: Eğer tabakalı örnekleme yapılacaksa her bir tabaka için örneklem büyüklüğü belirlenmesi gerekir ve her bir tabaka için ayrı ayrı tekrarsız basit tesadüfi örnekleme yapılır. Eğer örneklemde tabaka yoksa 120 firma tekrarsız olarak seçilmesi yeterli olacaktır.

Örnek olayın çözümüne ilişkin ilk uygulama, R programlama dili kullanılarak yapılacaktır.

Çözüm 1: R Kod Bloğu (Solution 1)

#Aşağıda tamsayı bileşenli "sample" fonksiyonu kullanılmıştır. Bunun nedeni Firma sayısının tamsayı olmasıdır. Buna göre firma sayısı 850 olup, 1'den 850'ye kadar numaralandırılmıştır. Fonksiyon içindeki 120, örneklem büyüklüğü (sample size)'dür. Fonksiyon içerisindeki replace= TRUE ise örneklemin tekrarlı olacağı, diğer bir deyişle popülasyondaki firmalara birden fazla seçilme şansı verileceği anlamına gelir. İlaveden sort fonksiyonu ilave edilerek seçilen firmaların küçükten büyüğe doğru sıralanması sağlanmıştır. matrix fonksiyonu ise elde edilen firma numaralarının matris olarak 12 satır ve 10 sütun düzeninde verileceğini gösterir. İlk satırdaki set.seed (sabitleme) fonksiyonu ise her defasında örnekleme seçilen firmaların aynı kalacağı anlamına gelir. Bu fonksiyon duruma göre kullanılabilir de kullanılmayabilir de. Tamamen karar vericiye bağlıdır.

set.seed(123)
orneklem<- matrix(sort(sample.int(850, 120, replace=TRUE)), 12, 10)
orneklem

Çözüm 1‘e ait R kod bloğunun run edilmesiyle elde edilen sonuç aşağıda yer almaktadır.

        [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1  109  188  279  353  411  518  603  689   767
 [2,]   21  112  197  283  355  416  521  604  691   778
 [3,]   36  118  199  292  370  435  535  613  693   796
 [4,]   39  121  208  300  374  449  545  641  730   800
 [5,]   39  122  210  314  376  463  556  642  751   806
 [6,]   52  126  227  319  382  467  558  645  754   811
 [7,]   80  126  234  323  386  469  559  665  757   812
 [8,]   81  130  245  327  389  477  566  670  757   812
 [9,]   88  149  246  344  397  487  568  671  759   814
[10,]   88  160  257  348  397  498  576  676  760   819
[11,]   95  176  271  350  405  506  588  677  761   838
[12,]  104  184  273  352  407  510  589  680  765   846

Örnek olayın Pyhton programlama dili kullanılarak üretilen çözümü ise aşağıdaki gibi olacaktır.

Çözüm 2: Python Kod Bloğu (Solution 2)

#Örneklemden tesadüfi ve tekrarlı olanı çağrılır.
from random import sample
#Aşağıdaki random.seed fonksiyonu ise her defasında örnekleme seçilen firmaların aynı kalacağı anlamına gelir. Bu fonksiyon duruma göre kullanılabilir de kullanılmayabilir de. Bu durum, tamamen karar vericiye bağlıdır.
import random
random.seed(123)
#Populasyon aralığı belirlenir (1'den 850'ye kadar olan firmalar) 
Populasyon = range(1,851)
#Popülasyondan örnekleme seçilen firmalar belirlenir.
print("Tekrarlı Basit Tesadüfi Örnekleme", random.choices(Populasyon, k=120))

Çözüm 2‘ye ait Python kod bloğunun run edilmesiyle elde edilen sonuç aşağıda yer almaktadır.

Tekrarlı Basit Tesadüfi Örnekleme [45, 75, 347, 92, 767, 33, 456, 283, 725, 136, 287, 284, 209, 2, 371, 75, 508, 60, 269, 382, 770, 79, 121, 672, 19, 775, 488, 226, 713, 654, 292, 682, 176, 518, 449, 688, 268, 339, 654, 436, 583, 543, 567, 757, 414, 569, 319, 28, 642, 155, 698, 777, 560, 145, 287, 333, 63, 389, 488, 286, 161, 75, 535, 11, 300, 195, 453, 616, 773, 543, 844, 820, 536, 199, 412, 151, 844, 378, 639, 38, 115, 165, 218, 300, 232, 370, 358, 93, 54, 302, 76, 369, 8, 456, 63, 591, 344, 838, 224, 402, 639, 285, 297, 544, 825, 752, 357, 611, 578, 317, 200, 67, 748, 49, 441, 457, 125, 558, 779, 660]

Sonuç olarak, yukarıda çözüm 1 veya çözüm 2’ye göre ortaya konulan çıktıdan (output) numaralara karşılık gelen firmalarla araştırmaya başlanır.

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.

Note: In the name of respect for labor, I would kindly request that the name of the place where this work is taken if the work done on this web site is shared in another medium or environment.

Yararlanılan Kaynaklar

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

https://www.python.org/

https://colab.research.google.com (Python)

https://rstudio.cloud/

Microsoft Excel’de Tekrarlı Basit Tesadüfi Örnekleme Üzerine Bir Vaka Çalışması: A Case Study on Simple Random Sampling (SRS) with Replacement in Microsoft Excel

Basit tesadüfi örnekleme, popülasyondaki birimlerinden örnekleme seçilme olasılığı bilinen ve seçilme olasılığı sıfır olmayan örnekleme türüdür. Bu örnekleme türü aynı zamanda olasılıklı örnekleme tekniklerinden biri olup, popülasyon hakkında çıkarımsal (inferential) istatistikler ortaya koymaya ve örneklemden elde edilen bulguların hedef popülasyona genellebilmesine olanak tanır.

Basit tesadüfi örnekleme, tekrarlı (popülasyondaki birimlerin eşit ve birden fazla seçilme olasılığı) ve varsayımsal bir örnek üzerinden uygulamalı olarak gösterilecektir. Tekrarlı seçilme olasılığı, topların olduğu torbadan seçilmiş bir topun tekrar torbanın içine atılarak tekrar seçilme olasılığının tanındığı bir olasılık tekniği olarak ele alınabilir. Benzer işlem burada örneklem seçiminde de yapılacaktır. Bu kapsamda Microsoft Excel kullanılacaktır. Aşağıdaki excel dokümanını ihtiyacınıza uygun uyarlayarak kolaylıkla uygulayabilirsiniz.

Örnek Olay (Example)

Popülasyon büyüklüğü (N) 850 firma arasından 120 firma (n: örneklem büyüklüğü) tekrarlı basit tesadüfi örnekleme yapılarak örnekleme seçilecektir. Daha sonra örnekleme seçilen bu firmalar üzerinde araştırma yapılacaktır. Bir kez seçilmiş firmalara 1. soru kağıdı, birden fazla seçilmiş firmalara cevaplarının tutarlılığını ölçümlemek için belirli zaman aralıklarıyla 1. soru kağıdı ile birlikte 2. ve 3. soru kağıtları cevaplaması için gönderilecektir.

Not 1: Örneklem seçimine geçmeden önce elde edilen firma listesinin mükerrer kayıtlardan arındırılması (firmaların benzersiz olması) ve her bir firmaya küçükten büyüğe doğru numara ataması yapılması gerekmektedir.

Not 2: Eğer tabakalı örnekleme yapılacaksa her bir tabaka için örneklem büyüklüğü belirlenmesi gerekir ve her bir tabaka için ayrı ayrı tekrarsız basit tesadüfi örnekleme yapılır. Eğer örneklemde tabaka yoksa 120 firma tekrarlı olarak seçilmesi yeterli olacaktır.

Örnek olayın çözümüne aşağıdaki linkte xlsx uzantılı Microsoft Excel dokümanını indirerek ulaşabilirsiniz.

İndirmek için tıklayınız: Tekrarlı Basit Tesadüfi Örneklem Seçimi (SRS With Replacement)

Sonuç olarak, yukarıda Microsft Excel’de ortaya konulan sonuçlara göre seçilmiş olan firmalarla araştırmaya başlanır.

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.

Note: In the name of respect for labor, I would kindly request that the name of the place where this work is taken if the work done on this web site is shared in another medium or environment.

Yararlanılan Kaynak

Microsoft Office 2016

Microsoft Excel’de Tekrarsız Basit Tesadüfi Örnekleme Üzerine Bir Vaka Çalışması: A Case Study on Simple Random Sampling (SRS) without Replacement in Microsoft Excel

Basit tesadüfi örnekleme, popülasyondaki birimlerinden örnekleme seçilme olasılığı bilinen ve seçilme olasılığı sıfır olmayan örnekleme türüdür. Bu örnekleme türü aynı zamanda olasılıklı örnekleme tekniklerinden biri olup, popülasyon hakkında çıkarımsal (inferential) istatistikler ortaya koymaya ve örneklemden elde edilen bulguların hedef popülasyona genellebilmesine olanak tanır.

Basit tesadüfi örnekleme, tekrarsız (popülasyondaki birimlerin eşit ve bir kez seçilme olasılığı) ve varsayımsal bir olay üzerinden uygulamalı olarak gösterilecektir. Bu kapsamda Microsoft Excel kullanılacaktır. Aşağıdaki excel dokümanını ihtiyacınıza uygun uyarlayarak kolaylıkla uygulayabilirsiniz.

Örnek Olay (Example)

Popülasyon büyüklüğü (N) 850 firma arasından 120 firma (n: örneklem büyüklüğü) tekrarsız basit tesadüfi örnekleme yapılarak örnekleme seçilecektir. Daha sonra örneklem seçilen bu firmalar üzerinde araştırma yapılması planlanmaktadır.

Not 1: Örneklem seçimine geçmeden önce elde edilen firma listesinin mükerrer kayıtlardan arındırılması (firmaların benzersiz olması) ve her bir firmaya küçükten büyüğe doğru numara ataması yapılması gerekmektedir.

Not 2: Eğer tabakalı örnekleme yapılacaksa her bir tabaka için örneklem büyüklüğü belirlenmesi gerekir ve her bir tabaka için ayrı ayrı tekrarsız basit tesadüfi örnekleme yapılır. Eğer örneklemde tabaka yoksa 120 firma tekrarsız olarak seçilmesi yeterli olacaktır.

Örnek olayın çözümüne aşağıdaki linkte xlsx uzantılı Microsoft Excel dokümanını indirerek ulaşabilirsiniz.

İndirmek için tıklayınız: Tekrarsız Basit Tesadüfi Örneklem Seçimi (SRS Without Replacement)

Sonuç olarak, yukarıda Microsft Excel’de ortaya konulan sonuçlara göre seçilmiş olan firmalarla araştırmaya başlanır.

Faydalı olması dileğiyle.

Saygılarımla.

Yararlanılan Kaynaklar

Microsoft Office 2016