Kümeleme analizine geçmeden önce temel kavramları açıklamak konunun anlaşılması açısından önem taşıdığından ilk olarak kısaca bu kavramlara yer verilecektir.
Küme, benzer özellikleri içinde barındıran topluluk olarak tanımlanabilir. Bu topluluk insan topluluğu olabileceği gibi nesnelerin oluşturduğu topluluk da olabilir. Benzer özellikler taşıyan bu topluluklar diğer kümelerden farklılaşır.
Kümeleme analizini ise benzer özelliklere sahip toplulukları gruplara ayırma olarak açıklayabiliriz. Bu analizle bir nevi gruplama yapılmaktadır. Bu analiz türü aynı zamanda yapay zeka öğrenme türlerinden biri olan denetimsiz öğrenme (unsupervised learning)’nin denetimsiz sınıflama (unsupervised classification) başlığı altında değerlendirilir. Çünkü denetimli öğrenme (supervised learning)’de veri önceden tanımlanmış değildir veya önceden sınıflama (denetimli sınıflama) durumu bu analiz türünde söz konusu değildir. Küme analizi bir çok alanda kullanılabilmekle birlikte öne çıkan alanlar şöyle özetlenebilir;
- Sigorta
- Pazarlama
- Arazi kullanımı
- Şehir planlama
Kümele Analiz Metodları
- Herüstik yaklaşımlar
- K-Ortalama (k-means) Küme Analiz Metodu: Her bir küme, kümenin merkez noktasıyla temsil edilir.
- K-Medoidler (k-medoids) veya PAM Küme Analiz Metodu: Her bir küme, kümedeki nesnelerden biri tarafından temsil edilir.
Küme analizinin kalitesi, sınıf içi benzerlikleri yüksek ve kümeler arası benzerliklerin düşük kümelerin elde edilmesine bağlıdır.
Kısaca bunlardan bahsedildikten sonra örnek uygulamaya geçiş yapabiliriz. Örnek uygulama yapılacak veri, 19.02.2019 tarihinde TC. Merkez Bankasının veri tabanından indirilmiştir. Veri seti, yapılacak analizler için işlenerek analize uygun duruma getirilmiştir. Veri seti, 4 değişken ve 5067 gözlemden oluşmaktadır. Bu veri, 1999 yılı ile 18.02.2019 tarihleri arasında Merkez Bankası işlem günlerindeki günlük Dolar ve Euro döviz alış kuru (TL) içeren 5067 gözlemden oluşmaktadır. Bu yıldan başlanılmasının nedeni, eşit zaman serisi elde edilerek karşılaştırma yapılmak istenmesinden kaynaklanmaktadır. 2005 yılından geçerli olmak üzere TL’den 6 sıfır atıldığı için, karşılaştırma sağlanabilmesi adına bu yıldan önceki zaman serilerine ait veriler de ağırlıklandırılmıştır. Diğer bir deyişle, 2005 öncesi döviz kurlarına karşılık gelen TL tutarları 1 milyona bölünmüştür.
Veri setinin küme analizlerine geçmeden dilerseniz
önce veriyi biraz koklayalım :). Veri setini yükledikten sonra ilk olarak tanımlayıcı istatistikleri vererek işe başlayalım. Verinin işlenmesi ve analiz aşamasında R Programlama dili kullanılmıştır.
Yapılan uygulamaları ve analizleri daha iyi görebilmek adına işlenmiş veri setini aşağıdaki linkten indirebilirsiniz.
#Veri yolunu yazmak ve veriyi yüklemek için
library(readxl)
doviz <- read_excel("C:/Users/Tevfik Bulut/Desktop/doviz.xlsx",
col_types = c("numeric", "numeric", "numeric",
"numeric"))
View(doviz)
#Grafik ve tablo oluşturma için kurulumu yapılacak paketler
library(tidyverse)
library(gridExtra)
#İlk 12 Kaydı tablo olarak getirmek için
y<-head(doviz,20)
grid.arrange(tableGrob(y))

#Son 12 Kaydı tablo olarak getirmek için
z<-tail(doviz,12)
grid.arrange(tableGrob(z))

#Veri hakkında özetleyici tanımlayıcı istatistikler elde etmek ve değerlerin ondalık kısmını 2 haneli göstermek için;
install.packages("pastecs")
library(pastecs)
grid.arrange(tableGrob(round(stat.desc(doviz),2)))

#Kurulumu yapılacak grafik paketleri
library(tidyr)
library(dplyr)
library(ggplot2)
#Grafik kod bloğu (Yıllara göre Dolar Alış Kurunun dalga boyuna göre gösterimi için)
ggplot(doviz, aes(Yıl, USD_Alis))+
geom_line(size=1.5, col="Red")+
scale_x_continuous(breaks=seq(1999, 2019, 2))+
ggtitle("Yıllara Göre Dolar Döviz Alış Kuru") +
xlab("Yıl") + ylab("Dolar Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

#Aylık Dolar Alış Kurunun dalga boyuna göre gösterimi için
ggplot(doviz, aes(Ay, USD_Alis))+
geom_line(size=1.5, col="blue")+
geom_line() +
facet_wrap(Ay~. )+
theme_bw()+
ggtitle("Aylara Göre Dolar Döviz Alış Kuru") +
xlab("") + ylab("Dolar Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

#Aynı anda aylara göre dolar alış kurunun gösterimi için; bu grafik ile bir nevi aylara göre dolar alış kurunun izlediği seyrin röntgenini çekmiş oluyoruz.
ggplot(doviz, aes(Ay, USD_Alis, col=USD_Alis))+
geom_point(size=1)+
geom_jitter()+
scale_x_continuous(breaks=seq(1, 12, 1))+
ggtitle("Aylara Göre Dolar Döviz Alış Kuru") +
xlab("Ay") + ylab("Dolar Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

Şimdi aynı grafikleri bir de Euro alış kuru için sırasıyla yapalım.
#Grafik kod bloğu (Yıllara göre Euro Alış Kurunun dalga boyuna göre gösterimi için)
ggplot(doviz, aes(Yıl, EURO_Alis))+
geom_line(size=1.5, col="Brown")+
scale_x_continuous(breaks=seq(1999, 2019, 2))+
ggtitle("Yıllara Göre Euro Döviz Alış Kuru") +
xlab("Yıl") + ylab("Euro Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

#Aylık Euro Alış Kurunun dalga boyuna göre gösterimi için
ggplot(doviz, aes(Ay, EURO_Alis))+
geom_line(size=1.5, col="green")+
geom_line() +
facet_wrap(Ay~. )+
theme_bw()+
ggtitle("Aylara Göre Euro Döviz Alış Kuru") +
xlab("") + ylab("Euro Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

#Aynı anda aylara göre Euro döviz alış kurunun gösterimi için; bu grafik ile bir nevi aylara göre Euro alış kurunun izlediği seyrin röntgenini çekmiş oluyoruz.
ggplot(doviz, aes(Ay, EURO_Alis, col=EURO_Alis))+
geom_point(size=1)+
geom_jitter()+
scale_x_continuous(breaks=seq(1, 12, 1))+
ggtitle("Aylara Göre Euro Döviz Alış Kuru") +
xlab("Ay") + ylab("Euro Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

Döviz Alış Kurlarının Yıllık ve Aylık Ortalamalara Göre Sunumu
#Dolar Alış Kurunun Yıllık ortalamalara göre sunumu
m_yil<-as.data.frame(aggregate(x = doviz, by = list(doviz$Yıl), FUN = "mean"))
m_yil
ggplot(m_yil, aes(Yıl, USD_Alis))+
geom_line(size=1.5, col="Red")+
scale_x_continuous(breaks=seq(1999, 2019, 2))+
ggtitle("Yıllık Ortalamalara Göre Dolar Döviz Alış Kuru") +
xlab("Yıl") + ylab("Dolar Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

#Euro Alış Kurunun Yıllık ortalamalara göre sunumu
m_yil<-as.data.frame(aggregate(x = doviz, by = list(doviz$Yıl), FUN = "mean"))
m_yil
ggplot(m_yil, aes(Yıl, EURO_Alis))+
geom_line(size=1.5, col="Brown")+
scale_x_continuous(breaks=seq(1999, 2019, 2))+
ggtitle("Yıllık Ortalamalara Göre EURO Döviz Alış Kuru") +
xlab("Yıl") + ylab("Euro Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

#Dolar Alış Kurunun Aylık ortalamalara göre sunumu
m_ay<-as.data.frame(aggregate(x = doviz, by = list(doviz$Ay), FUN = "mean"))
m_ay
ggplot(m_yil, aes(Ay, USD_Alis))+
geom_line(size=1.5, col="red")+
scale_x_continuous(breaks=seq(1, 12, 1))+
ggtitle("Aylık Ortalamalara Göre Dolar Döviz Alış Kuru") +
xlab("Ay") + ylab("Dolar Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

#Euro Alış Kurunun Aylık ortalamalara göre sunumu
m_ay<-as.data.frame(aggregate(x = doviz, by = list(doviz$Ay), FUN = "mean"))
m_ay
ggplot(m_ay, aes(Ay, EURO_Alis))+
geom_line(size=1.5, col="dark blue")+
scale_x_continuous(breaks=seq(1, 12, 1))+
ggtitle("Aylık Ortalamalara Göre Euro Döviz Alış Kuru") +
xlab("Ay") + ylab("Euro Alış Kuru")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

Yukarıda gösterimi yapılan grafikler tek bir döviz cinsi üzerinden ayrı ayrı olarak yapılmıştı. Şimdi de dilerseniz bu iki döviz türünü aynı grafik içinde sunalım.Grafik sunumunda alış kurlarına ilişkin bütün gözlemler dikkate alınmıştır.
# Dolar ve Euro döviz alış kurunun aylara göre birlikte gösterimi: Izgara Tip Grafik Gösterimi
ggplot(doviz_sistematik, aes("", TL,col=Döviz))+
geom_point(size=1)+
geom_jitter()+
facet_wrap(Ay~.)+
facet_grid(Döviz ~ Ay)+
theme_bw()+
ggtitle("Aylara Göre Döviz Alış Kuru") +
xlab("") + ylab("Alış Kuru (TL)")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

# Dolar ve Euro döviz alış kurunun aylara göre birlikte gösterimi: Çizgi Grafik Gösterimi
ggplot(doviz_sistematik, aes(as.factor(Ay), TL,col=Döviz))+
geom_line(size=1.5)+
scale_x_discrete(breaks=seq(1, 12, 1))+
theme_bw()+
ggtitle("Aylara Göre Döviz Alış Kuru") +
xlab("") + ylab("Alış Kuru (TL)")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

# Dolar ve Euro döviz alış kurunun yıllara göre birlikte gösterimi: Izgara Tip Grafik Gösterimi
ggplot(doviz_sistematik, aes("", TL,col=Döviz))+
geom_point(size=1)+
geom_jitter()+
facet_wrap(Yıl~.)+
facet_grid(Döviz ~ Yıl)+
theme_bw()+
theme(strip.text.x = element_text(size=8, angle=90))+
ggtitle("Yıllara Göre Döviz Alış Kuru") +
xlab("") + ylab("Alış Kuru (TL)")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

# Dolar ve Euro döviz alış kurunun yıllara göre birlikte gösterimi: Çizgi Grafik Gösterimi
ggplot(doviz_sistematik, aes(as.factor(Yıl), TL,col=Döviz))+
geom_line(size=1.5)+
scale_x_discrete(breaks=seq(1999, 2019, 2))+
theme_bw()+
ggtitle("Yıllara Göre Döviz Alış Kuru") +
xlab("") + ylab("Alış Kuru (TL)")+
labs(caption = "Source: By Tevfik Bulut")+
theme(plot.title = element_text(family = "Trebuchet MS", face="bold", size=16, hjust=0.5)) +
theme(axis.title = element_text(family = "Trebuchet MS", face="bold", size=12))

Küme Analizleri
#Kurulumu Yapılacak Paketler
library(tidyverse) # veri manipulasyonu için
library(cluster) # kümeleme algoritmaları
library(factoextra) # kümelerin görselleştirilmesi
library(dendextend) # dendogramların karşılaştırılması
#Veriyi yüklemek için
library(readxl)
doviz <- read_excel("C:/Users/Tevfik Bulut/Desktop/doviz.xlsx",
col_types = c("numeric", "numeric", "numeric",
"numeric"))
View(doviz)
Optimal Küme Sayısını Belirleme
Optimal küme sayısını belirlemek için sırasıyla Ortalama Silüet Metodu, Elbow Metodu ve Gap İstatistik Metodları kullanılmıştır.
#Veriyi ölçeklendirmek için
scale_veri<- scale(doviz[,-2])
#Optimal küme sayısını hesaplamak için (Biraz uzun sürebilir sabırlı olunuz:).
#İlk olarak Ortalama Silüet Metodu (Average Silhouette Method) kullanılarak optimal küme sayısı K-Ortalamalar ve PAM Kümeleme Metodları özelinde verilecektir.
##PAM Küme Analizi için optimal küme sayısı
fviz_nbclust(scale_veri, FUN = pam, method = "silhouette")
##K-Ortalamalar Küme Analizi için optimal küme sayısı
fviz_nbclust(scale_veri, FUN = kmeans, method = "silhouette")
##Hiyerarşik Küme Analizi için optimal küme sayısını belirlemek için Elbow Metodu kullanılmıştır.
fviz_nbclust(scale_veri, FUN = hcut, method = "wss")



Hiyerarşik Küme Analizi Optimal Küme Sayısı
Optimal küme sayısı belirleme metodlarından biri olan Gap İstatistik Metodu kullanılarak toplam küme içi varyans da ortaya konulur. Burada, optimal küme sayıları GAP istatistiğini maksimize eder.
# GAP istatistikleri
## Hiyerarşik Kümeleme Metodu İçin
gap_stat <- clusGap(scale_veri, FUN = hcut, nstart = 25, K.max = 10, B = 50)
fviz_gap_stat(gap_stat)
## K-Ortalamalar Metodu İçin
gap_stat <- clusGap(scale_veri, FUN = kmeans, nstart = 25, K.max = 10, B = 50)
fviz_gap_stat(gap_stat)


K-Ortalamalar Kümeleme Metodu Gap İstatistiği
PAM Metodu
#PAM Küme Analiz Metodu sonuçları için (3 küme belirlenmiştir.)
pam.cluster <- pam(scale_veri, 3)
# Visualize pam clustering
fviz_cluster(pam.cluster, geom = "point", ellipse.type = "convex") #Alternatif 1
fviz_cluster(pam.cluster, geom = "point", ellipse.type = "euclid",labelsize = 9) #Alternatif 2
fviz_cluster(pam.cluster, geom = "point", ellipse.type = "norm") #Alternatif 3

Alternatif 1: PAM Metodu


Alternatif 3: PAM Metodu
CLARA Metodu
clara(scale_veri, 3, samples = 100, pamLike = TRUE)

K-Ortalamalar Metodu
k_ortalama <- kmeans(scale_veri, 3, nstart = 25)
# Görselleştirmek için
fviz_cluster(k_ortalama, data =scale_veri , geom = "point", ellipse.type = "convex") #Alternatif 1
fviz_cluster(k_ortalama, data =scale_veri , geom = "point", ellipse.type = "norm") #Alternatif 2
fviz_cluster(k_ortalama, data =scale_veri , geom = "point", ellipse.type = "euclid") #Alternatif 3

Alternatif 1: K-Ortalamalar Metodu

Alternatif 2: K-Ortalamalar Metodu

Alternatif 3: K-Ortalamalar Metodu
Hiyerarşik Küme Analiz Metodu
Öklidyen_uzaklık <- dist(scale_veri, method = "euclidean")
hiyerarsik <- hclust(Öklidyen_uzaklık, method = "ward.D2" )
plot(hiyerarsik, cex = 0.6, hang = -1) #Küme dendrogramı

manhattan_uzaklık <- dist(scale_veri, method = "manhattan")
hiyerarsik <- hclust(manhattan_uzaklık, method = "centroid" )
plot(hiyerarsik, cex = 0.6, hang = -1) #Küme dendrogramı

Centroid” (UPGMC) Metodu Kullanarak Hiyerarşik Küme Analizi
Yapılan bu çalışmayla döviz alış kurları veri setinden yola çıkılarak keşifsel veri analizi yapılarak veriye yönelik farklı bir bakış açısı kazandırılmak istenmiştir. Bunun yanında küme analizlerinin farklı küme analiz metodlarına göre ortaya konulmasıyla da bu alanda çalışma yapan veya yapacak kişi yada kurumlara önemli bir katkı sunulması amaçlanmıştır.
Faydalı olması dileğiyle…
Not: Emeğe saygı adına, yapılan çalışmanın başka bir mecrada ya da ortamda paylaşılması ve kullanılması halinde alındığı yer adının belirtilmesini rica ederim.
Saygılarımla.
Yararlanılan Kaynaklar
Türkiye Cumhuriyeti Devletinin Para Birimi Hakkında Kanun,
Kanun No: 5083, Resmi Gazete Tarihi: 31/01/2004, Resmi Gazete Sayısı: 25363 http://www.resmigazete.gov.tr/eskiler/2004/01/20040131.htm#3
https://evds2.tcmb.gov.tr/index.php?/evds/serieMarket/#collapse_2
https://tutorials.iq.harvard.edu/R/Rgraphics/Rgraphics.html
Kaufman, Leonard, and Peter Rousseeuw. (1990). Finding Groups in Data: An Introduction to Cluster Analysis. https://leseprobe.buch.de/images-adb/5c/cc/5ccc031f-49c1-452f-a0ac-22babc5e252e.pdf
http://www.stat.columbia.edu/~madigan/W2025/notes/clustering.pdf
http://web.stanford.edu/~hastie/Papers/gap.pdf
https://www.datanovia.com/en/lessons/determining-the-optimal-number-of-clusters-3-must-know-methods/
Charrad, Malika, Nadia Ghazzali, Véronique Boiteau, and Azam Niknafs. 2014. “NbClust: An R Package for Determining the Relevant Number of Clusters in a Data Set.” Journal of Statistical Software 61: 1–36. http://www.jstatsoft.org/v61/i06/paper.