Her veri seti kendi içerisinde farklı hikayeler barındırır. Bu gizli hikayeleri ortaya çıkarmanın yollarından biri de değişkenler arasındaki ilişkileri incelemektir.

İki rassal değişken arasındaki istatistiksel ilişkiye korelasyon adı verilir. Korelasyon, keşifçi veri analizinin en önemli ve temel adımlarından biridir.

Korelasyon analizinin farklı sektörlerde farklı uygulamaları vardır. Korelasyon analizi finans sektöründe birbiriyle ilişkili hisselerin tespit edilerek riski dağıtmak için kullanılırken, pazarlama sektöründe hangi arama kelimelerinin satışa etki ettiğini bulmak için kullanılabilir.

Makine öğrenmesi için model oluştururken, modelde kullanılacak değişkenlerin belirlenmesinde korelasyon önemli bir rol oynar. Birbiriyle çok kuvvetli ilişkilere sahip değişkenler modelden çıkarılarak, tekrarlı bilgi girişi önlenebilir ve daha sade bir model elde edilebilir.

Korelasyona giriş yapmadan önce ilk olarak cevaplanması gereken soru, değişkenler arasındaki ilişkinin nasıl ölçüleceği olmalıdır.

Değişkenler arasındaki ilişki nasıl ölçülür?

Değişkenlerin birbirlerine göre nasıl değiştiğini ölçerek, değişkenler arasında ilişkilerin var olup olmadığını belirleyebiliriz.

Tek bir değişkenin, nasıl bir değişim gösterdiğini varyans ile ölçeriz. Varyans, bir değişkenin ne kadar yayıldığını gösterir ve şu formül ile hesaplanır:

Var (s2) = Σ(xi - x̄)2 / n-1

xi: Gözlem değeri 
x̄: Değişkenin ortalaması
n: Örneklem büyüklüğü

Formülü özetleyecek olursak:

  1. Değişkenin ortalaması hesaplanır.
  2. Değişkenin her bir gözleminden ortalama değeri çıkarılır ve sonucun karesi alınır.
  3. Son olarak bir önceki adımda hesaplanan toplam sonuç örneklem büyüklüğüne bölünür. Eğer elinizdeki veri seti bir örneklem ise düzeltme olarak örneklem büyüklüğünden 1 çıkarılır.

Python, R gibi yazılım dillerinde veya SPSS, Excel, SAS gibi veri analizi için kullanılan paket programlarında varyansı hesaplamak için özel fonksiyonlar bulunur. Python’da varyans, Pandas’ın .var() fonksiyonu ile hesaplanabilir.

İki değişken arasındaki ilişki kovaryans yardımı ile ölçülür. Kovaryans, iki değişkenin birbirine göre nasıl değiştiğinin ölçüsüdür. Kovaryans, aşağıdaki formül ile hesaplanır:

Kovaryans(x, y) = Σ(xi - x̄)(yi - ȳ) / n-1

xi: İlk değişkenin gözlem değeri 
yi: İkinci değişkenin gözlem değeri 
x̄: İlk değişkenin ortalaması
ȳ: İkinci değişkenin ortalaması
n: Örneklem büyüklüğü

Python’da kovaryans, Pandas’ın .cov() fonksiyonu ile hesaplanabilir.

  • Pozitif bir kovaryans değeri, iki değişkenin birlikte hareket ettiğini (azaldığını veya arttığını),
  • negatif bir kovaryans değeri ise iki değişkenin birlikte hareket etmediğini, yani ters yönde hareket ettiğini (biri azalırken diğeri artar veya biri artarken diğeri azalır) gösterir.

Kovaryansın bazı dezavantajları vardır ve bu nedenle kullanımı sınırlıdır. Kovaryans, farklı ölçeklere sahip değişkenlerin arasındaki ilişkiyi ölçmek için uygun değildir. Örneğin, kilogram cinsinden kilo ölçüsü ile santimetre cinsinden boy ölçüsü arasındaki ilişkiyi kovaryans ile ölçmek doğru değildir. Kovaryans değeri standardize olmadığı için kullanılan farklı ölçü birimlerine göre farklı kovaryans değerleri hesaplanacaktır.

Kovaryansın ölçeklerle ilgili dezavantajı nedeniyle değişkenler arasındaki ilişkiyi ölçmek için, ölçü biriminden etkilenmeyen, daha güçlü bir ölçü birimine ihtiyaç vardır. Bu ölçü birimi korelasyondur.

Korelasyon nedir?

Korelasyon, kovaryans gibi iki değişkenin birbirleriyle olan ilişkisini açıklayan istatistiksel bir ölçüdür. Korelasyon, bir değişkenin değeri değiştiği zaman, aralarındaki ilişkiye göre diğer değişkenin de belli bir yönde değişiklik göstereceğini belirtir. Birim farklılarından etkilenmeyen, güçlü bir ölçüm yöntemi olduğu için korelasyon kovaryanstan farklı olarak, sadece ilişkinin yönünü değil aynı zamanda ilişkinin kuvvetini de ölçmeye ve karşılaştırmaya olanak sağlar.

Korelasyon, iki veya daha fazla değişkenin aralarında ilişki olup olmadığı ve ilişkinin kuvveti ölçülmek istediği zaman kullanılır.

Korelasyon, kovaryans değerinin standart sapma ile standardize edilmesi ile hesaplanır.

ρx, y = Kovaryans(x, y) / σxσy

ρ: Korelasyon katsayısı
σx: İlk değişkenin standart sapması
σy: İkinci değişkenin standart sapması

Gerçek hayatta birçok farklı korelasyon örneğine rastlamak mümkündür. Korelasyona örnek olarak:

  • Gelirler ve giderler: İnsanların gelirleri arttıkça, orantılı olarak giderleri de artma eğilimi gösterir.
  • Mevsim ve dondurma satışı: Dondurma satışı mevsime göre değişiklik gösterir. Yaz aylarında dondurma satışı zirveye ulaşırken, diğer mevsimlerde daha düşük seyreder.
  • Okula devam ve notlar: Okula devamlılık ve alınan notlar arasında korelasyon vardır. Okula devamı az olan öğrencilerin, notlarının daha düşük olma eğilimi vardır.

Her korelasyonun şekli, yönü ve kuvveti vardır.

Korelasyon türleri nelerdir?

Korelasyon, şekli, yönü ve kuvvetine göre farklı türlerde sınıflandırılır. Bu sınıflandırma, korelasyon analizi yaparken iki değişken arasındaki ilişkiyi anlamlandırmak için kullanılmaktadır.

Şekline göre korelasyon türleri:

Korelasyon grafikleri şekline göre farklılıklar gösterir. Korelasyonun şekli, iki değişken arasındaki ilişkinin anlamlandırılması ve kullanılacak analiz türünün belirlenmesi açısından önemlidir.

1. Doğrusal (Lineer) korelasyon: İki değişken belirli, sabit bir oranda artıp veya azalıyorsa doğrusal ilişkiye sahiptir. İki değişkenin eğrisi düz bir çizgiyi takip eder. Bu ilişki matematiksel olarak “Y = aX + b” denklemini sağlar.

Farklı kuvvetlere sahip doğrusal (lineer) korelasyon grafikleri

2. Doğrusal olmayan (Non-lineer) korelasyon: Doğrusal korelasyonun tam tersi olarak, iki değişkenin sabit bir oranda değişim göstermediği ilişki türüdür. İki değişkenin eğrisi düz bir çizgi şeklinde değil, eğimli (hiperbolik, parabolik vs.) bir formu takip eder.

Doğrusal olmayan korelasyon grafikleri

3. Monoton korelasyon: Monoton korelasyon ilişkisinde, iki değişken aynı yönde hareket etse de, her zaman aynı oranda hareket etmeyebilir. Her doğrusal ilişki aynı zamanda monotondur fakat her monoton ilişki doğrusal değildir.

Monoton korelasyon grafikleri

Yönüne göre korelasyon türleri:

Korelasyonun yönü, iki değişkenin birlikte ne tarafa doğru hareket ettiklerini anlamaya yardımcı olur.

1. Pozitif yönlü ilişki/Pozitif korelasyon: İki değişken birlikte aynı yönde hareket eder. Bir değişken artarken, diğeri artar veya bir değişken azalırken diğeri de azalır.

2. Negatif yönlü ilişki/Negatif korelasyon: İki değişken ters yönde hareket eder. Bir değişken artarken diğeri azalır veya biri azalırken diğeri artar.

3. Korelasyon yok: İki değişken arasında doğrusal bir korelasyon bulunmaz.

Korelasyon nasıl ölçülür? Korelasyon kat sayısı türleri nelerdir?

Korelasyon katsayısı, iki değişken arasındaki ilişkinin yönünü ve gücünü/kuvvetini ifade eder. Katsayı değeri -1 ile +1 arasında yer alır.

Kuvvet/Güç

Korelasyon kat sayısının -1 veya +1 gibi uç değerlere sahip olması, iki değişken arasında kusursuz bir doğrusal ilişki olduğu anlamına gelir. Korelasyon katsayısını kullanarak yapılan ölçümlerde, iki değişkenin sahip olabileceği en yüksek korelasyon değeri +1 veya -1’dir. Bu tarz bir ilişkinin grafiğinde gözlem noktaları düz bir çizgi üzerinde yer alır. Gerçek dünyadaki veri setlerinde bu tarz bir kusursuz ilişki bulma olasılığı düşüktür.

Korelasyon kat sayısının 0 olması, iki değişken arasında lineer bir ilişki olmadığını gösterir. Diğer bir deyişle, bir değişkenin değeri değiştiği zaman, diğer değişkende herhangi bir değişiklik olmaz.

Korelasyon kat sayısının 0 ile -1 veya +1 arasında olması, doğrusal bir ilişkinin olduğunu fakat kusursuz bir doğrusal ilişki olmadığını gösterir. Bu nedenle, böyle bir ilişkiyi yansıtan grafikte gözlem noktalarının tamamı düz bir çizgiyi takip etmez.

Korelasyon kat sayısının değişikliği ile doğrusal ilişkinin kuvveti şu şekilde yorumlanabilir:

Korelasyon katsayı değeriYorumu
0.9 ile 1 veya -0.9 ile -1 arasıÇok kuvvetli doğrusal ilişki
0.7 ile 0.9 veya -0.7 ile -0.9 arasıKuvvetli doğrusal ilişki
0.5 ile 0.7 veya -0.5 ile -0.7 arasıOrta kuvvetli doğrusal ilişki
0.3 ile 0.5 veya -0.3 ile -0.5 arasıDüşük kuvvetli doğrusal ilişki
0.0 ile 0.3 veya 0.0 ile -0.3 arasıHiç ilişki yok veya çok düşük kuvvetli doğrusal ilişki

Yukarıdaki maddeleri özetlemek gerekirse, korelasyon katsayısı 1’e veya -1’e yaklaştıkça, doğrusala ilişkinin kuvveti artarken, uzaklaştıkça ilişkinin kuvveti azalır.

Farklı kuvvetlere sahip lineer korelasyon grafikleri

Yön

Korelasyon katsayısının pozitif veya negatif olması iki değişken arasındaki ilişkinin yönünü temsil eder.

  • Katsayının negatif/eksi bir değere sahip olması, ilişkinin negatif olduğunu,
  • Katsayının pozitif/artı bir değere sahip olması, ilişkinin pozitif olduğunu gösterir.

Farklı veri tipleri için kullanılan farklı korelasyon katsayıları vardır.

1. Pearson korelasyon katsayısı

Pearson korelasyon kat sayısı, iki sürekli değişken arasındaki doğrusal bir ilişkinin gücünü ve yönünü gösterir. Pearson korelasyon katsayısı popülasyon parametresi olarak rho (ρ), örneklem istatistiği olarak “r” ile temsil edilir.

Pearson korelasyon katsayısı, parametrik bir testtir. Yani, uygulanacak değişkenlerin normal dağılıma sahip olduğu varsayımı ile çalışır.

Pearson korelasyon katsayısı, iki değişkenin kovaryans değerinin, her bir değişkenin standart sapmasının çarpımına bölünmesi ile elde edilebilir. Katsayı değeri -1 ile +1 arasında olabilir.

Popülasyon için:

ρx, y = Kovaryans(x, y) / σxσy

ρ: Korelasyon katsayısı
σx: İlk değişkenin standart sapması
σy: İkinci değişkenin standart sapması

Örneklem için:

rx, y = Kovaryans(x, y) / sxsy

s: Korelasyon katsayısı
sx: İlk değişkenin standart sapması
sy: İkinci değişkenin standart sapması

Pearson korelasyon katsayısı ne zaman kullanılır?

Akılda tutulması ve dikkat edilmesi gereken bir nokta ise Pearson korelasyon katsayısının sadece ve sadece iki sürekli değişken arasındaki doğrusal/lineer ilişkiyi ölçebileceğidir. Pearson korelasyon katsayısı, doğrusal bir ilişkiye ve normal dağılıma sahip sürekli değişkenler arasındaki ilişkiyi ölçmek için kullanışlıdır.

Pearson korelasyon katsayısının kullanılabileceği örnek durumlar:

  • Boy ile kilo arasındaki ilişkinin incelenmesi
  • IQ skorları ile gelir arasındaki ilişkinin incelenmesi
  • Satışlarla reklam görüntülenmesi arasındaki ilişkinin incelenmesi
  • Hisse fiyatlarıyla reklam harcamaları arasındaki ilişkinin incelenmesi

Python’da Pearson bağıntı analizi

Python’da Pearson bağıntı analizi yapabilmek ve Pearson korelasyon katsayısını hesaplayabilmek için SciPy kütüphanesinin stats modülünden pearsonr() fonksiyonu kullanışlıdır.

stats.pearsonr(degisken_a, degisken_b)
(0.8071920346514349, 0.0)

pearsonr() fonksiyonu parametre olarak korelasyon analizi yapılacak değişkenleri kullanır. Yanıt olarak ise korelasyon katsayısını ve katsayının istatistiksel olarak anlamlı olup olmadığını anlamak için kullanılan p-değerini döndürür.

2. Spearman sıra korelasyon katsayısı

İngiliz psikolog Charles Spearman tarafından geliştirilen ve “Spearman korelasyon katsayısı” veya “Spearman’ın sıralama korelasyon katsayısı” olarak da bilinen korelasyon katsayısı non-parametrik yani verinin normal dağıldığı varsayımına ihtiyaç duymayan bir testtir.

Spearman korelasyon katsayısı aşağıdaki formül ile hesaplanır:

rs = 1 - (6 * Σd2 / n(n2 - 1))

d: Sıra farkı
n: örneklem büyüklüğü

Spearman korelasyon katsayısı ne zaman kullanılır?

Spearman korelasyon katsayısı, değişkenlerden birinin sıralı (ordinal) veri tipine sahip olduğu veya Pearson korelasyon katsayısının varsayımlarını sağlanamadığı durumlarda kullanılmalıdır. Spearman korelasyon katsayısı, Pearson’dan farklı olarak sadece doğrusal ilişkileri değil, monoton ilişkileri de ölçmekte kullanılır.

  • Pearson korelasyon katsayısı, aykırı değerlere çok duyarlı olduğundan, normal dağılıma uymayan sürekli değişkenler arası doğrusal ilişki incelemesinde Spearman analizi kullanılmalıdır.
  • Eğer saçılım grafiğinde (scatterplot) görünen dağılım doğrusal mı monoton ilişki mi olduğu konusunda şüphe yaratıyorsa, Spearman korelasyon katsayısını kullanmak daha doğru olur.

Not: Sıralı (ordinal) veri tipi en az 3 kategoriye sahip ve kategoriler arasında eşit ve doğal bir sıra bulunan verilerdir. Ör: Yılın ayları, yarışta alınan madalyalar (Altın, Gümüş, Bronz) vs.

Spearman korelasyon katsayısının kullanılabileceği örnek durumlar:

  • Sponsor destek bütçesi ile yarışı bitirme derecesi arasındaki ilişkinin incelenmesi
  • Yılın ayları ile reklam harcaması arasındaki ilişkinin incelenmesi

Python’da Spearman bağıntı analizi

Python’da Spearman bağıntı analizi yapabilmek ve Spearman korelasyon katsayısını hesaplayabilmek için SciPy kütüphanesinin stats modülünden spearmanr() fonksiyonu kullanışlıdır.

stats.spearmanr(degisken_a, degisken_b)
SpearmanrResult(correlation=0.8797254119455286, pvalue=0.0)

spearmanr() fonksiyonu parametre olarak korelasyon analizi yapılacak değişkenleri kullanır. Yanıt olarak ise Spearman korelasyon katsayısını ve katsayının istatistiksel olarak anlamlı olup olmadığını anlamak için kullanılan p-değerini döndürür.

3. Kendall’s tau-b korelasyon katsayısı

Bir diğer non-parametrik ve sıralı korelasyon katsayısı ise Kendall’s tau’dur. Kendall sıralama korelasyonu, miktarlara göre sıralandığında verilerin sıralanmasındaki benzerlikleri test etmek için kullanılır.

Kendall korelasyon katsayısı, gözlem çiftlerini kullanır ve çiftler arasındaki uyum ve uyumsuzluk üzerine desene dayalı olarak ilişkinin gücünü belirler.

Kendall korelasyon katsayısı ne zaman kullanılır?

İncelenen değişkenlerin biri veya her ikisi de sıralı (ordinal) değişkense Kendall’ın tau-b katsayısı kullanılması uygun seçenek olacaktır. Ayrıca, küçük örneklemlerde Spearman testine göre tercih edilebilir.

Kendall tau-b korelasyon katsayısının kullanılabileceği örnek durumlar:

  • Sponsor destek bütçesi ile yarışı bitirme derecesi arasındaki ilişkinin incelenmesi
  • Yılın ayları ile reklam harcaması arasındaki ilişkinin incelenmesi
  • Kilo ile çalışan memnuniyeti arasındaki ilişkinin incelenmesi

Python’da Kendall-tau bağıntı analizi

Python’da Kendall tau-b bağıntı analizi yapabilmek ve Kendall korelasyon katsayısını hesaplayabilmek için yine SciPy kütüphanesinin stats modülü kullanılabilir. Bu modüle ait kendalltau() fonksiyonu ilgili analizi uygular.

stats.kendalltau(degisken_a, degisken_b)
KendalltauResult(correlation=0.707857211942441, pvalue=0.0)

kendalltau() fonksiyonu parametre olarak korelasyon analizi yapılacak değişkenleri kullanır. Pearson ve Spearman analizinde olduğu gibi bu fonksiyon da yanıt olarak Kendall korelasyon katsayısını ve katsayının istatistiksel olarak anlamlı olup olmadığını anlamak için kullanılan p-değerini döndürür.

İncelediğimiz korelasyon katsayılarının hepsi, lineer olmayan ilişkileri ölçmede kullanılamaz. Eğer grafiksel olarak doğrusal veya monoton bir ilişki tespit edilemediği durumlarda bu yöntemlerin kullanılması önerilmemektedir.

4. Nokta çift serili korelasyon katsayısı

İncelenecek değişkenlerden birinin sürekli ve diğerinin ise iki kategorili (dichotomous) bir değişken (Ör: Cinsiyet) olduğu durumda nokta çift serili korelasyon katsayısı kullanılır.

Örnek olarak, cinsiyet ile IQ testi puanı arasında doğrusal bir ilişki olup olmadığı incelenmek istendiği durumda bu test kullanışlıdır.

Nokta çift serili korelasyon aşağıdaki formül ile hesaplanır:

rpb = ((x̄p - ȳq) / Sy) * √npnq / n(n-1)


p: İlk kategoriye dahil olan sürekli değişken gözlemlerinin ortalaması
ȳq: İkinci kategoriye dahil olan sürekli değişken gözlemlerinin ortalaması
Sy: Sürekli değişkenin standart sapması
np: İlk kategoriye dahil olan gözlem sayısı
nq: İkinci kategoriye dahil olan gözlem sayısı
n:  Toplam örneklem büyüklüğü

“Nokta Çift Serili Korelasyon Analizi” yönteminin 2 adet varsayımı vardır.

  1. Sürekli değişkenin normal dağılıma sahip olması.
  2. Sürekli değişkenin her bir kategori için eşit varyansa sahip olması.

İki kategorili değişken, doğal bir şekilde oluşabileceği gibi (Ör: Başarılı vs başarısız, sigara içer vs sigara içmez), gerçekte sürekli bir değişken yapay olarak da iki kategorili bir değişkene dönüştürülebilir. (Ör: 18 yaşından küçükler vs. 18 yaşından büyükler). Böyle bir durumda ilişkinin analizi için çift serili korelasyon katsayısı (biserial correlation) kullanılır.

Çift serili korelasyon aşağıdaki formül ile hesaplanır:

rpb = ((x̄p - ȳq) / Sy) * ((p * q) / H)

p: İlk kategoriye dahil olan sürekli değişken gözlemlerinin ortalaması
ȳq: İkinci kategoriye dahil olan sürekli değişken gözlemlerinin ortalaması
Sy: Sürekli değişkenin standart sapması
P: İlk kategoriye dahil olan gözlem sayısının tüm toplam gözlemlere oranı
q: İkinci kategoriye dahil olan gözlem sayısının tüm toplam gözlemlere oranı
H: Ordinat yüksekliği. Normal dağılımda iki alanı ayıran değerdir.

Python’da Nokta çift serili korelasyon analizi

Python’da Nokta çift serili korelasyon analizi yapabilmek ve korelasyon katsayısını hesaplayabilmek için SciPy kütüphanesinin stats modülünden pointbiserialr() fonksiyonu ilgili analizi uygular.

Nokta çift serili korelasyon analizini uygulamadan önce sürekli değişkenin normallik ve kategoriler için eşit varyans varsayımları test edilmelidir.

Ayrıca, kategorik değişken “label encoding” tekniklerinden biriyle metinden (Ör: Kadın vsErkek) sayıya (Ör: 0 vs 1) dönüştürülmelidir.

stats.pointbiserialr(degisken_a, degisken_b)
PointbiserialrResult(correlation=-0.02489007751317994, pvalue=0.012250613281735384)

pointbiserial() fonksiyonu parametre olarak korelasyon analizi yapılacak değişkenleri kullanır. Diğer korelasyon analizlerinde olduğu gibi bu fonksiyon da yanıt olarak korelasyon katsayısını ve katsayının istatistiksel olarak anlamlı olup olmadığını anlamak için kullanılan p-değerini döndürür.

5. Dörtlü (Phi) Korelasyon Katsayısı

İlk olarak Karl Pearson tarafından önerilen Pearson Phi korelasyon katsayısı (Φ) iki kategorili (binary), iki kategorik değişken arasındaki ilişkinin analizi için kullanılır. Daha sonrasında Brian W. Matthews tarafından önerilen Matthews korelasyon katsayısı (MCC) ile aynı şekilde tanımlandığı için zaman zaman birbiri yerine de kullanılır.

Phi korelasyon katsayısı 2×2 bir kontenjans tablosu üzerinden kolaylıkla hesaplanabilir. İki kategoriye sahip iki değişken ile kontenjans tablosu şöyle görünmektedir:

CinsiyetX – 1.kategoriX – 2.kategori
Y – 1.kategoriAB
Y – 2.kategoriCD

Fi korelasyon katsayısı aşağıdaki formüle göre hesaplanır:

Φ = (A*D) - (B*C) / √(A+B)*(C+D)*(A+C)*(B+D)

Alternatif olarak ki-kare istatistiği kullanılarak da hesaplanabilir:

Φ = √ χ2 / n

χ2: Ki-kare istatistiği
n: Örneklem büyüklüğü

Python’da Phi korelasyon katsayısının hesaplanması

Dörtlü (Phi) Korelasyon katsayısını hesaplayabilmek için SkLearn kütüphanesinden matthews_corrcoef() fonksiyonunu kullanabiliriz.

Bu fonksiyon uygulanmadan önce analize girecek kategorik değişkenler tekrardan işlenerek 0 ve 1’e dönüştürülmelidir. Daha sonrasında sklearn.metrics kütüphanesinden matthews_corrcoef() fonksiyonunu dosyaya çağırıp, analiz edilecek değişkenler parametre olarak girilmelidir.

from sklearn.metrics import matthews_corrcoef

mcc = matthews_corrcoef(x, y)
0.037271695731361444

matthews_corrcoef() fonksiyonu yanıt olarak korelasyon katsayısını döndürür.

6. Cramer’s V Korelasyon Katsayısı

Her ikisi veya herhangi biri 2’den fazla kategoriye sahip kategorik değişkenler arasındaki ilişkiyi tespit etmek için Cramer’s V korelasyon katsayısı kullanılır.

Cramer’s V korelasyon katsayısı hesaplanırken ki-kare istatistiğini kullanır. Ki-kare testi değişkenler arasında istatistiksel olarak anlamlı bir ilişki olup olmadığını anlamaya yardımcı olurken, ilişkinin gücü hakkında bilgi vermez. Cramer’s V testi bu bilgiyi sağlamak için kullanılan ekstra bir test işlevi görür.

V = √ (χ2 / n) / min(c-1, r-1)

χ2: Ki-kare istatistiği
n: Örneklem büyüklüğü
c: Kontenjans tablosunun toplam sütun sayısı
r: Kontenjans tablosunun toplam satır sayısı

Cramer’s V korelasyon katsayısı 0 ile 1 arasında değerler alır. Katsayı değerinin 0 olması iki değişken arasında ilişki olmadığını, 1 olması ise kusursuz/mükemmel bir ilişki olduğunu gösterir. Katsayı değeri arttıkça, ilişki güçlenir.

Cramer’s V korelasyon katsayısı iki kategorili iki değişken için kullanıldığında dörtlü (phi) korelasyon katsayısına eşit olur. Bu durumda, negatif değerler görülmesi mümkündür.

Ki-kare istatistiği artan satır ve sütun sayısından etkilenir ve bu nedenle Cramer’s V korelasyon katsayısı bu haliyle olması gerekenden daha abartılı (overestimate) bir şekilde tahmin eder. Bu nedenle, yanlılığın giderilmesi için düzeltme uygulanmalıdır.

V = √ (χ2 / n) / min(c˜−1,r˜−1)

χ2 / n = max(0, (χ2 / n) - ((c-1)*(r-1) / n-1))

c˜ = c - ((c-1)2 / n-1)
r˜ = r - ((r-1)2 / n-1)

χ2: Ki-kare istatistiği
n: Örneklem büyüklüğü
c: Kontenjans tablosunun toplam sütun sayısı
r: Kontenjans tablosunun toplam satır sayısı

Python’da Cramer’s V korelasyon analizi

Python’da Cramer’s V korelasyon katsayısını hesaplayabilmek için hazır bir fonksiyon bulunmuyor. Bu nedenle, yukarıda bahsi geçen formülü uygulayacak bir fonksiyon oluşturacağız.

Adım adım fonksiyonu açıklayalım:

def cramers_v(x, y):
    n = len(x)
    cont_table = pd.crosstab(x, y)
    chi_sq = stats.chi2_contingency(cont_table, correction=False)[0]
    phi_sq = chi_sq/n
    
    c, r = cont_table.shape
    
    c_corr = c - ((c - 1)**2 / n-1)
    r_corr = r - ((r - 1)**2 / n-1)
    
    phi_sq_corr = max(0, (chi_sq / n) - ((c-1)*(r-1) / n-1))
    
    corr_v = (phi_sq_corr / min(c_corr - 1, r_corr - 1)) ** 0.5
    
    return corr_v
  • cramers_v() adını verdiğimiz bir fonksiyon tanımladık. Bu fonksiyon, korelasyon analizine girecek kategorik değişkenleri temsil eden x ve y adında iki adet parametre ile çalışıyor.
  • Öncelikle formülde hesaplama sırasında kullanacağımız değerleri ayrı ayrı hesaplayıp değişkenlere sakladık.
    • n: Örneklem büyüklüğü. len() fonksiyonu ile değişkenin boyunu ölçtüğümüzde aynı zamanda örneklem büyüklüğünü hesaplamış olduk.
    • cont_table: Ki-kare istatistiğini hesaplayabilmek için Pandas’ın crosstab() fonksiyonunu kullanarak kontenjans tablosunu oluşturduk.
    • chi_sq: Ki-kare istatistiği. SciPy’ın stats modülünden chi2_contingency() fonksiyonunu kullanarak hesapladık. Bu fonksiyon parametre olarak kontenjans tablosunu kullanmaktadır. “correction = False” parametresi ile de Yates düzeltmesine ihtiyaç duymadığımızı belirttik.
    • phi_sq: Phi katsayısı. Ki-kare istatistiğinin örneklem büyüklüğüne bölünmesiyle hesaplanır.
    • c, r: Kontenjans tablosunun sütun ve satır sayısı. Pandas’ın shape nesnesini kullanarak oluşturduğumuz tablonun satır ve sütun sayısını bir tuple verisi olarak aldık ve bu değişkenlere atadık.
    • c_corr, r_corr: Satır ve sütun sayısının yanlılık düzeltilmesi uygulanmış versiyonları.
    • phi_sq_corr: Phi katsayısının yanlılık düzeltilmesi uygulanmış hali.
    • corr_v: Cramer’s V korelasyon katsayısının düzeltilmiş hali. Bir önceki satırlarda oluşturduğumuz düzeltilmiş satır, sütun sayısını ve phi katsayısını kullanarak hesaplandı. Son olarak, hesapladığımız bu değeri return ile döndürdük.

Oluşturduğumuz cramers_v() fonksiyonu sonuç olarak 0 ile 1 arasında bir korelasyon katsayısı döndürür.

Korelasyon analizi nedir?

Korelasyon analizi, iki veya daha fazla değişken arasında ilişki olup olmadığını, eğer ilişki varsa gücünü ve yönünü tespit etmek için yapılan istatistiksel bir analizdir.

Kısaca, korelasyon analizi değişkenler arasındaki ilişkileri açığa çıkaran bir analiz yöntemidir.

Korelasyon analizi neden yapılır?

Korelasyon analizinin sağladığı önemli faydalar vardır. Korelasyon analizi, keşifçi veri analizi sırasında veri setini tanımak, model geliştirme sırasında değişkenler belirlenirken veya gelecek araştırma çalışmalarını şekillendirmek adına başlangıç noktası oluşturmak istendiği zaman kullanılabilir.

Veri setini daha iyi anlamak için fırsat sunar.

Her veri seti kendi içerisinde özel bir hikaye barındırır. Bu hikayelere dair ipuçları bulmanın yollarından biri korelasyon analizidir. Korelasyon analizi, bir veri seti içerisindeki desenleri (pattern) bulmak için kullanışlıdır.

Korelasyon analizi ile hangi değişkenlerin birbirleri ile ilişkili olduğunu anladıktan sonra yanıt aranacak sorular üretilebilir.

Makine öğrenmesi modellerine dahil edilecek değişkenleri belirlemede önemlidir.

Makine öğrenmesi modelleri oluştururken hangi değişkenlerin modele dahil edileceğini belirlemek için korelasyon analizi kilit rol oynar. Çok kuvvetli ilişkiye sahip değişkenlerin modelden çıkarılması modeli daha sade bir hale getirir. Aynı zamanda, birbiriyle kuvvetli ilişkilere sahip değişkenleri modelden çıkararak çoklu doğrusallık (Multicollinearity) sorunun da üstesinden gelinir.

Nedenselliği açığa çıkarabilir.

Korelasyon, her zaman nedensel bir ilişki olduğu anlamına gelmez. Bazı zamanlarda, birbiriyle ilişki içerisinde olan değişkenlerden biri diğerinin nedeni olabilir. Bu tarz nedensellik ilişkilerinin keşfedilmesi için ilk adım olabilir.

Gelecek çalışmalar için temel oluşturabilir.

Değişkenler arasındaki ilişkileri tespit etmek, gelecek çalışmalarda test edilmesi gereken hipotezlerin oluşturulmasında kilit rol oynayabilir. Ayrıca, hali hazırda toplanmış, gözlemsel veri kullanıldığı için, daha maliyetli çalışmalar yapmadan önce temeli oluşturabilir.

Kayıp değerleri tahmin etmek ve atamak için kullanılabilir.

Birbirleriyle ilişkisi olan değişkenleri kullanarak, eksik verilerin yerine yeni değerler atanabilir.

Python ile korelasyon analizi

Korelasyon analizinin ne olduğunu, neden ve ne zaman yapıldığını tanımladıktan sonra artık aksiyona geçmeye hazırız. Yazı boyunca üzerinden geçtiğimiz konuları gerçek bir veri seti üzerinde deneyimleyeceğiz.

Yazının devamında kullanacağımız veri seti bir bankanın kayıp (churn) müşteri veri tabanı. Belli bir zaman dilimi içerisinde kaybedilmiş, 10,000’den fazla müşteriye dair demografik ve müşteri profiline yönelik bilgiler barındırıyor.


Örnek veri seti: Bir bankanın kredi katı müşterilerinden oluşan müşteri veri tabanı


İlk olarak, yazı boyunca kullanılacak kütüphaneleri çağıracağız.

Veri manipülasyonu için Pandas ve NumPy, verileri görselleştirmek için Matplotlib ve Seaborn kütüphanelerini kullanacağız. İstatistiksel hesaplamalar yapmak ve korelasyon testlerini uygulayabilmek için SciPy kütüphanesinden stats modülünü kullanacağız.

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy import stats

Kütüphaneleri çağırdıktan sonraki adım veri setinin çalışma dosyasına çağrılmasıdır. Pandas’ın read_csv() fonksiyonu ile veri setini çağıralım.

cus = pd.read_csv("BankChurners.csv")

Veri setini çağırdık. Korelasyon analizine başlamadan önce Pandas’ın hazır fonksiyonlarından info()‘yu kullanarak veri setini tanımak için hızlı bir göz atacağız.

cus.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10127 entries, 0 to 10126
Data columns (total 21 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   CLIENTNUM                 10127 non-null  int64  
 1   Attrition_Flag            10127 non-null  object 
 2   Customer_Age              10127 non-null  int64  
 3   Gender                    10127 non-null  object 
 4   Dependent_count           10127 non-null  int64  
 5   Education_Level           10127 non-null  object 
 6   Marital_Status            10127 non-null  object 
 7   Income_Category           10127 non-null  object 
 8   Card_Category             10127 non-null  object 
 9   Months_on_book            10127 non-null  int64  
 10  Total_Relationship_Count  10127 non-null  int64  
 11  Months_Inactive_12_mon    10127 non-null  int64  
 12  Contacts_Count_12_mon     10127 non-null  int64  
 13  Credit_Limit              10127 non-null  float64
 14  Total_Revolving_Bal       10127 non-null  int64  
 15  Avg_Open_To_Buy           10127 non-null  float64
 16  Total_Amt_Chng_Q4_Q1      10127 non-null  float64
 17  Total_Trans_Amt           10127 non-null  int64  
 18  Total_Trans_Ct            10127 non-null  int64  
 19  Total_Ct_Chng_Q4_Q1       10127 non-null  float64
 20  Avg_Utilization_Ratio     10127 non-null  float64
dtypes: float64(5), int64(10), object(6)
memory usage: 1.6+ MB
  • Veri setinde 21 değişken bulunuyor. Her bir değişkende 10,127 adet gözlem bulunuyor.
  • Hiç bir değişkende kayıp veri bulunmuyor.
  • İlk 8 sütunda müşteriye dair cinsiyet, yaş, eğitim seviyesi, medeni durumu, gelir durumu gibi demografik bilgileri barındıran değişkenler bulunuyor. Geri kalan değişkenler daha çok müşteri davranışlarına dair bilgileri saklıyor.
  • Değişkenlerin veri tipleri doğru kategorize edilmiş. Sayısal değerlere sahip değişkenler int ve float tiplerine sahipken, kategorik değişkenler string (object) olarak saklanıyor.
  • Veri tipleri ile ilgili tek istisna ilk değişken “CLIENTNUM”. Her bir müşterinin bireysel müşteri numarasını barındıran bu değişken sayı veri tipi ile kaydedilmiş fakat bu gözlemlerle herhangi bir matematiksel işlem yapmayacağımız için string’e çevireceğiz.

Not: Orjinal veri setinde 23 adet değişken bulunuyor. En son 2 sütunda yer alan değişkenler, farklı bir analiz amacıyla veri sahibi tarafından üretildiği için veri sahibinin de tavsiye ettiği üzere sildim.

Korelasyon analizine girişmeden önce “CLIENTNUM” değişkenini integer’dan string veri tipine dönüştürelim.

cus["CLIENTNUM"] = cus["CLIENTNUM"].astype("str")

Pandas’ın astype() fonksiyonunu kullanarak veri tipini “str” yani string’e çevirdik.

Artık korelasyon analizine başlamaya hazırız.

1. Adım: Korelasyon matrisi ile ön keşif.

Korelasyon analizi ile:

  1. Değişkenlerin hedef değişkeni ile nasıl bir ilişkisi olduğunu,
  2. Hangi değişkenlerin birbiriyle ilişki içinde olduğunu,
  3. Veri seti üzerinde önceden tahmin etmediğimiz sürpriz ilişkileri keşfetmeyi hedefliyoruz.

Korelasyon analizi adına yapacağımız ilk adım korelasyon matrisi ile bir ön keşif yapmak olacaktır. Korelasyon matrisi, veri setindeki her bir değişkenin bir diğeri ile korelasyon katsayısını gösteren bir tablodur. Tablo şeklinde kullanılabileceği gibi aynı zamanda görselleştirilebilir.

Korelasyon matrisinin avantajları:

  • Değişken sayısının az olduğu durumlarda hızlı çıkarımlar yapmaya olanak sağlar.
  • Beklenmedik ilişkileri keşfetme imkanı sağlar.

Korelasyon matrisinin dezavantajları:

  • Değişken sayısı arttığı zaman çıkarım yapmak zorlaşır.
  • Pandas’ın korelasyon matrisi fonksiyonu varsayılan olarak “Pearson korelasyon katsayısını” hesaplar. Varsayılan olarak sadece doğrusal ilişkileri anlamaya yardımcı olur. Ayrıca Pearson’un varsayımlarından biri değişkenlerin normal dağılıma sahip olduğudur. Korelasyon matrisi, değişkenlerin normal dağılıma sahip olduğunu varsayar ve korelasyon katsayısını hesaplar. Eğer, değişkenler normal dağılıma sahip değilse, hesaplanan korelasyon katsayısı yanıltıcı olur.

Dezavantajları nedeniyle, korelasyon matrisini “ön keşif” amaçlı kullanacağız. Daha sonra gözlemlerimizi teyit edebilmek için saçılım grafiğini (scatterplot) kullanacağız.

corr = np.round(cus.corr(),2)
  • Korelasyon matrisini Pandas’ın .corr() fonksiyonunu kullanarak uyguladık.
  • Noktadan sonra sadece ilk 2 ondalık rakamını almak ve 2 basamağa yuvarlamak için NumPy’ın round() fonksiyonunu kullandık.
  • round() fonksiyonu parametre olarak “değer” ve “ondalık basamak sayısını” kullanır. Değer olarak hesapladığımız korelasyon matrisini verdik.

Korelasyon matrisi

Veri setinde çok fazla değişken olduğu için okunabilirlik adına korelasyon matrisinin sadece ilk 4 değişkeni içeren bir bölümünü paylaştım.

  • Korelasyon matrisi, görüldüğü üzere ortadan çapraz bir çizgi çekildiği zaman iki yarıya ayrılır ve simetriktir.
  • Korelasyon matrisini okurken soldan bir satır seçip, kesişen sütundaki değişken ile değerine bakarız. Örneğin Dependent_count değişkeni ile Customer_Age değişkeninin korelasyonu -0.12’dir.
  • Ortadaki değerler 1’dir. İki aynı değişkenin korelasyonu doğal olarak yüzde yüz aynı olduğu için 1’dir.

Korelasyon matrisini yorumlamaya geçmeden önce görselleştireceğiz. Görsel olarak, yer alan desenleri daha hızlı tespit edebiliriz. Görselleştirme için Seaborn kütüphanesinden “heatmap” grafiğini kullanacağız.

fig, ax = plt.subplots(figsize = (14, 10))

sns.heatmap(ax = ax, \
            data = corr, \
            annot = True, \
            cmap = "coolwarm", \
            vmin = -1, vmax= 1, center = 0)

ax.set_title("Korelasyon Matrisi Grafiği")

plt.show()
  • fig, ax yapısı ile öncelikle grafiğin yer alacağı çerçeveyi oluşturduk ve figsize parametresi ile çerçevenin inç cinsinden genişlik ve yükseklik değerlerini belirledik.
  • heatmap() fonksiyonu ile korelasyon matrisinin grafiğini oluşturduk. Farklı parametreleri kullanarak grafiği özelleştirdik. Parametreleri tanıyalım:
    • ax: Grafiğin hangi ara bölümde yer alacağını belirtir. Grafik tek bir bölmeden oluştuğu için ax = ax.
    • data: Grafiğin kullanacağı veri setini belirttik. Daha önceden korelasyon matrisini “corr” değişkenine atamıştık.
    • annot: Korelasyon katsayısını kutucukların üzerine yazılmasını sağlar.
    • cmap: Renk paleti. Buradan farklı renk paletlerini inceleyebilirsiniz.
    • vmin: Sağda bulunan ölçeğin minimum değerini belirlemek için kullanılır. Seaborn varsayılan ayar olarak tablodaki en küçük korelasyon değerini atar.
    • vmax: Ölçeğin maksimum değerini belirlemek için kullanılır.
    • center: Ölçeğin orta değerini belirlemek için kullanılır.
  • Korelasyon katsayısı -1 ile +1 arasında yer aldığı için sağ taraftaki ölçeği, ayrıntıları daha rahat fark edebilmek için -1 ile +1 olarak şekilde güncelledik.
  • Son olarak grafiğe başlık ekleyip, plt.show() fonksiyonu ile grafiği yayınladık.

Korelasyon matrisinin yorumu:

  • Korelasyon grafiği ortadan çapraz olarak 2’ye bölünmüştür. Farklı renk paleti ile renkler farklı anlamlara gelebilir. Bu grafikte mavi renkler negatif korelasyonu, kırmızı renkler pozitif korelasyonu temsil eder.
  • Pandas’ın korelasyon matris fonksiyonu corr() varsayılan olarak “Pearson” analizini kullanır. Bu nedenle sayısal olmayan veri tipleri bu korelasyonun dışında kalmıştır.
  • Çok güçlü korelasyona (0.8 ile 1 veya -0.8 ile -1.0 arası değerler) sahip değişken çiftlerine bakalım:
    • “Total_Trans_Ct” ile “Total_Trans_Amt” – (0.81)
    • “Avg_Open_To_Buy” ile “Credit_Limit” – (1.0)
  • Güçlü korelasyonlar (0.6 ile 0.8 veya -0.6 ile -0.8 arası değerler):
    • “Months_on_book” ile “Customer_Age” – (0.79)
    • “Total_Revolving_Bal” ile “Avg_Utilization_Ratio” – (0.62)
  • Orta derece korelasyonlar (0.4 ile 0.6 veya -0.4 ile -0.6 arası değerler):
    • “Avg_Open_To_Buy” ile “Avg_Utilization_Ratio” – (-0.54)
    • “Credit_Limit” ile “Avg_Utilization_Ratio” – (-0.48)
  • Yukarıda listelediğimiz korelasyonlar dışında kayda değer güçlü bir ilişki göze çarpmıyor. Burada 3 ihtimal vardır:
    • Gerçekten çoğu değişken birbiri ile bir ilişki içerisinde değildir. (r < 0.2 veya r < -0.2)
    • Değişken çiftleri “Pearson” bağıntı analizinin varsayımlarını sağlamıyordur.
      • Analize giren değişken çiftlerinden biri veya her ikisi de sürekli veri tipine sahip değildir.
      • Değişkenler normal dağılıma sahip değildir.
      • Değişkenler arasında doğrusal bir ilişki yoktur.

Korelasyon matrisi ile keşfettiğimiz ilişkiler hakkında kesin hükümler vermeden önce Pearson bağıntı analizinin varsayımlarını sağlayıp sağlamadığını kontrol edelim.

2. Adım: Pearson bağıntı analizinin varsayımlarının test edilmesi.

Bir önceki adımda bahsettiğimiz gibi Pearson bağıntı analizinin güvenilir sonuçlar üretebilmesi için analize girecek değişkenlerin aşağıdaki 3 varsayımı sağlaması gerekmektedir.

  1. Sürekli veri tipine sahip olmak.
  2. Normal dağılıma sahip olmak.
  3. Doğrusal bir ilişkiye sahip olmak.

Değişkenlerin veri tipinin kontrol edilmesi.

İlk olarak korelasyon matrisine katılan değişkenlerin hangilerinin “sürekli veri” olma varsayımını ihlal ettiğini bulmak istiyorum.

Kesikli ve sürekli veri için kısa bir tanımlama yapacak olursak:

  • Kesikli veri: Genelde sayılabilen değişkenlerdir. (Ör: Öğrenci sayısı, yolcu sayısı)
  • Sürekli veri: Genelde sayılamayan, fakat ölçülebilen değişkenlerdir. Ölçülebildiği için iki değer arasında sonsuz değer alabilir. (Ör: Kilo, boy, havanın sıcaklığı vs.)

Veri setinde integer/tam sayı veri tipine sahip değişkenleri listeleyeceğiz.

cus.select_dtypes("int")

Pandas’ın select_dtypes() fonksiyonunu kullanarak veri tipi “int” olan yani tam sayı olan değişkenleri listeledik. Aşağıdaki değişkenlerin kesikli veri olarak işaretlenebileceğini görüyoruz. Değişkenler hakkında peşin hüküm vermeden önce incelemek daha doğru bir yaklaşım olacaktır.

  • Dependent_count: Ailedeki kişi sayısı bilgisi olduğunu düşünüyorum. Bu nedenle kesikli olduğuna eminim.
  • Total_Relationship_Count: Müşterinin bankaya dair sahip olduğu ürün sayısı. Kesinlikle kesikli veri.
  • Months_Inactive_12_mon: Müşterinin aktif olmadığı ay sayısı. Kesikli veri.
  • Contacts_Count_12_mon: Müşterinin, müşteri olarak geçirdiği ay sayısı. Kesikli veri.
  • Customer_Age: Müşterinin yaşı. Yaş değişkeni, nasıl saklandığına bağlı olarak kesikli veya sürekli olarak sayılabilecek bir değişken. Burada yıl olarak tam sayı şeklinde tutulduğu için kesikli olarak kabul ediyorum.
  • Total_Revolving_Bal, Total_Trans_Amt: Müşterinin limiti, hesabındaki bakiye gibi parasal bilgilerin tutulduğu değişkenler. Para konusu da yaş gibi tartışmaya açık. Teorik olarak, madeni ve kağıt para gibi düşünülmediği zaman sonsuz farklı değer alabileceği için (Bknz. Bitcoin) sürekli olarak kabul edilebilir. Tam sayı şeklinde saklandığı için kesikli olarak kabul edip Spearman testi de yapabilirsiniz. Mutlak bir doğrudan bahsetmek güç. Bu örnek boyunca, teorik açıdan değerlendirerek sürekli olarak edeceğim.

Yukarıdaki duruma göre “Dependent_count“, “Total_Relationship_Count“, “Months_Inactive_12_mon“, “Contacts_Count_12_mon” ve “Customer_Age” değişkenlerinin geçtiği çiftlerin Pearson korelasyon rakamları anlamsızdır. İlerleyen adımlarda bu değişkenlere Spearman ve Kendall testleri ile bir daha göz atacağız.

Normallik testinin yapılması.

Bir sonraki adımda, sürekli değişken olduğunu bildiğimiz/karar verdiğimiz değişkenlerin normal dağılıma uyup uymadığını kontrol edeceğiz.

Float yani ondalık sayı tipine sahip değişkenleri ve bir önceki örnekte listelediğimiz parasal metrikleri “sürekli” değişken olarak kabul ettik. Bu değişkenlerin normal dağılıma sahip olup olmadığını test etmek için tümünün histogramını çizdireceğiz.

int_vars = ["Total_Revolving_Bal", "Total_Trans_Amt"]

cont_vars = list(cus.select_dtypes("float").columns) + int_vars

df_cont = cus[cont_vars]
  • Bir önceki maddede sürekli olarak kabul ettiğimiz değişkenleri int_vars değişkenine liste olarak atadık.
  • select_dtypes() fonksiyonunu kullanarak “float” yani ondalık sayı veri tipine sahip değişkenleri filtreledik ve .columns ile DataFrame’den isim listesini indeks olarak aldık. Daha sonrasında list() fonksiyonunu kullanarak indek formatını listeye çevirdik.
  • İlk satırda kaydettiğimiz int_vars listesini ondalık sayı değişken listesi ile topladık ve final listeyi cont_vars değişkenin atadık.
  • Elimizdeki sürekli değişkenlerin isimlerinin listesi kullanarak cus DataFrame’inden filtreledik ve df_cont adında yeni bir DataFrame oluşturduk.

Oluşturduğumuz yeni tablodaki tüm değişkenlerin histogramını tek seferde oluşturmak için hazırız.

df_cont.hist(figsize = (14, 10), bins = 20)
plt.show()
  • Pandas’ın .hist() fonksiyonunu kullanarak tek bir seferde tüm değişkenlerin histogramını çizdirdik.
  • Her bir hücrenin net bir şekilde görünebilmesi için çerçeve boyutunu “figsize” parametresi ile güncelledik.
  • Histogramların yeterince ayırt edici olması için kutu sayısını “bins” parametresi ile 20 olarak belirledik.

Grafiğe baktığımızda tüm değişkenlerin normal dağılıma sahip olmadığını rahatlıkla söyleyebiliriz.

Bu noktada, bu değişken veya normal dağılmayan diğer tüm değişkenler için “veri dönüştürme işlemleri” uygulanarak Pearson testi tekrar uygulanabilir veya non-parametrik olan Spearman veya Kendall testleri alternatif olarak düşünülebilir.

Saçılım grafiği (scatterplot) ile ilişki şeklinin incelenmesi.

Pearson bağıntı analizinin varsayımlarından sonuncusu ise iki değişkenin arasındaki ilişkinin doğrusal (lineer) olmasıdır.

İki değişken arasındaki ilişkinin şeklini korelasyon katsayısına bakarak anlamak mümkün değildir. İlişkinin şeklini anlayabilmek için saçılım grafiğine (scatterplot) ihtiyaç duyarız.

Normallik testi için histogramları çizdirmeden önce sürekli değişkenleri “df_cont” adında bir tabloda toplamıştık. Seaborn’un “pairplot” grafiğini kullanarak tek bir seferde tüm değişkenlerin birbiriyle olan ilişkisini saçılım grafiği olarak çizdireceğiz.

sns.pairplot(df_cont)
plt.show()

Pairplot grafiği de aynı korelasyon matrisi gibi simetriktir. Değişken sayısı arttığı zaman detayları bulmak zorlaşabilir. Değişkenlerin birbiriyle saçılım grafiklerini çizdirdik.

Grafikte 2.satır & 1.sütuna denk gelen “Avg_Open_To_Buy” ile “Credit_Limit” değişkenlerinin arasındaki ilişki pozitif doğrusal bir ilişki olarak görünüyor.

Pearson bağıntı analizi değerlendirmesini tamamlamadan önce ilk adımda korelasyon matrisi ile tespit ettiğimiz ilişkilerin son durumuna bakalım:

Çok güçlü korelasyona (0.8 ile 1 veya -0.8 ile -1.0 arası değerler):

  • “Total_Trans_Ct” ile “Total_Trans_Amt” – (0.81)
    • Sürekli değişkenler
    • Normal dağılıma sahip değiller.
    • Doğrusal bir ilişkiye sahipler.
  • “Avg_Open_To_Buy” ile “Credit_Limit” – (1.0)
    • Sürekli değişkenler
    • Normal dağılıma sahip değiller.
    • Monotonik veya üstel bir ilişkiye sahipler.

Güçlü korelasyonlar (0.6 ile 0.8 veya -0.6 ile -0.8 arası değerler):

  • “Months_on_book” ile “Customer_Age” – (0.79)
    • Sürekli değişken değiller.
    • Normal dağılıma sahip değiller.
    • Saçılım grafiğini çizdirdiğimiz zaman doğrusal bir ilişkiye sahip olduklarını görüyoruz.
  • “Total_Revolving_Bal” ile “Avg_Utilization_Ratio” – (0.62)
    • Sürekli değişkenler.
    • Normal dağılıma sahip değiller.
    • Doğrusal olmayan ilişkiye sahip olduklarını görüyoruz.(Pairplot grafiği 6.satır & 5.sütun)

Orta derece korelasyonlar (0.4 ile 0.6 veya -0.4 ile -0.6 arası değerler):

  • “Avg_Open_To_Buy” ile “Avg_Utilization_Ratio” – (-0.54)
    • Sürekli değişkenler.
    • Normal dağılıma sahip değiller.
    • Doğrusal olmayan ilişkiye sahip olduklarını görüyoruz.(Pairplot grafiği 2.satır & 5.sütun)
  • “Credit_Limit” ile “Avg_Utilization_Ratio” – (-0.48)
    • Sürekli değişkenler.
    • Normal dağılıma sahip değiller.
    • Doğrusal olmayan ilişkiye sahip olduklarını görüyoruz.(Pairplot grafiği 5.satır & 1.sütun)

3. Adım: Pearson bağıntı analizi varsayımlarını sağlayamayan değişkenlerin korelasyonların incelenmesi.

Pearson korelasyon katsayısı ile ilgili varsayımları sağlayamayan veya en az bir sıralı veri tipine sahip bir değişkeni barındıran korelasyon analizlerinde Spearman bağıntı analizinin uygulanmasının doğru olacağından bahsetmiştik.

Öncelikle doğrusal olmayan (non-linear) bir ilişkiye sahip olan değişken çiftlerini Spearman veya Kendall tau testine de alamıyoruz. Bu nedenle aşağıdaki çiftler hakkındaki korelasyon katsayıları yanıltıcı olacaktır. Bu değişkenler arasındaki ilişkiler doğrusal değildir.

  • “Total_Revolving_Bal” ile “Avg_Utilization_Ratio” – (0.62)
  • “Avg_Open_To_Buy” ile “Avg_Utilization_Ratio” – (-0.54)
  • “Credit_Limit” ile “Avg_Utilization_Ratio” – (-0.48)

Ordinal veya sürekli veri tipine sahip olmayan değişkenlerin bulunduğu çiftler de Spearman veya Kendall tau korelasyon analizi için uygun değildir. “Customer_Age” değişkeni ordinal veya sürekli olmadığı için aşağıdaki değişken çiftini de es geçeceğiz:

  • “Months_on_book” ile “Customer_Age” – (0.79)
  • “Total_Trans_Ct” ile “Total_Trans_Amt” – (0.81)

Tüm bu elemeleri yaptıktan sonra geriye çok kuvvetli ilişkilere sahip fakat normal dağılıma uymayan 1 çift değişken grubu kaldı. Her ikisi için de Spearman ve Kendall korelasyon analizini uygulayacağız ve sonuçları karşılaştıracağız.

  • SciPy kütüphanesinin stats modülünden spearmanr() ve kendalltau() fonksiyonularını kullanarak sırasıyla Spearman ve Kendall Tau-b analizlerini gerçekleştirdik.
  • Spearman korelasyon katsayısı 0.87 olarak hesaplandı. Bu sonuç pozitif ve çok güçlü bir ilişki olduğuna işaret ediyor.
  • Kendall tau korelasyon katsayısı ise 0.70 olarak hesaplandı. Hala pozitif fakat Spearman’a görece daha az kuvvetli bir ilişki görünüyor.
  • Total_Trans_Ct değişkeni artarken, Total_Trans_Amt değişkenin de arttığını veya ikisinin de birlikte azaldığını söyleyebiliriz.
  • Daha net ve güvenilir bir sonuç elde etmek için iki değişken normalizasyon teknikleri ile normalize edilebilir ve/veya aykırı değer analizi ile aykırı değerlerden arındırılarak ilişki grafiksel olarak tekrar gözden geçirilebilir.

  • “Avg_Open_To_Buy” ile “Credit_Limit” – (1.0)
stats.spearmanr(cus["Avg_Open_To_Buy"], cus["Credit_Limit"])

stats.kendalltau(cus["Avg_Open_To_Buy"], cus["Credit_Limit"])
SpearmanrResult(correlation=0.9314309341271124, pvalue=0.0)

KendalltauResult(correlation=0.8050117727641529, pvalue=0.0)
  • Pearson korelasyon katsayısı, iki değişken arasında kusursuz bir pozitif doğrusal ilişki olduğu anlamına gelen +1 olarak hesaplanmıştı. Hatta pairplot’a bakıldığında gerçekten neredeyse iki değişken birbirinin aynısı gibi görünüyordu.
  • Her iki değişken de normal dağılıma sahip olmadığı için değişkenleri Spearman ve Kendall bağıntı analizine aldık. SciPy kütüphanesinin stats modülünden spearmanr() ve kendalltau() fonksiyonularını kullanarak sırasıyla Spearman ve Kendall Tau-b analizlerini gerçekleştirdik.
  • Spearman korelasyon katsayısı 0.93 olarak hesaplandı. Bu sonuç pozitif ve çok güçlü bir ilişki olduğuna işaret ediyor.
  • Kendall tau korelasyon katsayısı ise 0.80 olarak hesaplandı. Kendall korelasyon katsayısı, Spearman ve Pearson’dan düşük olmasına rağmen, yine çok güçlü bir pozitif doğrusal ilişkiyi gösteriyor.
  • Avg_Open_To_Buy değişkeni artarken, Credit_Limit değişkenin de arttığını veya ikisinin de birlikte azaldığını söyleyebiliriz.

4. Adım: İstatistiksel anlamlılık ve korelasyon katsayısının yorumlanması.

Korelasyon katsayısı, iki değişken arasındaki ilişki hakkında bilgiler verse de, bu bilgilerin yada yaptığımız çıkarımların “genelleştirilebilir” yani popülasyonun tamamı için de geçerli olup olmadığını bilmiyoruz.

Çoğunlukla, popülasyondan elde edilen bir örneklem verisi ile çalışıldığı için ve her örneklem de doğası gereği popülasyon hakkında sınırlı bilgiye sahip ve örneklemler arasında değişkenlikler (sampling variability) olduğu için farklı örneklemlerden edilen korelasyon katsayıları değişkenlik gösterecektir.

Popülasyon hakkında genelleştirilebilir çıkarımlar yapabilmek için istatistiksel hipotez testlerine ihtiyaç duyarız. Hipotez testleri, örneklem verisindeki bulgularımızın popülasyonda da geçerli olup olmadığını anlamamıza yardımcı olur.

Hipotez testini uygularken sıfır ve alternatif hipotezlere ihtiyaç duyarız.

  • Alternatif hipotez (H1): Kanıtlamak istenilen hipotez.
  • Sıfır hipotezi (H0): Karşı çıkabilmek için hakkında karşıt kanıt toplanan hipotez.

Korelasyon katsayısı için hipotez testi ile amaç popülasyon korelasyon katsayısı ρ (rho)’nun sıfırdan farklı olduğunu kanıtlamaktır. Bu, durum alternatif hipotezi (H1) oluşturur.

Başlangıçta iki değişken arasında bir korelasyon olmadığını yani ρ’nun sıfır olduğunu kabul ederiz ve bu hipoteze karşı çıkacak kanıt ararız. Bu da sıfır hipotezini (H0) oluşturur.

Korelasyon katsayısı için hipotez testini oluştururken sıfır ve alternatif hipotezleri şöyle yazabiliriz:

H0: ρ = 0 (Korelasyon katsayısı istatistiksel olarak anlamlı değildir.)
H1: ρ ≠ 0 (Korelasyon katsayısı istatistiksel olarak anlamlıdır.)

Hipotez testinin sonucunda hangi hipotezi destekleyeceğimize karar vermek için p-değerine ihtiyaç vardır. p-değeri, sıfır hipotezinin şans ile rastgele oluşma olasılığıdır. p-değerinin 0.04 olması, %4 olasılıkla örneklemden elde edilen çıkarımın şansla oluştuğu anlamına gelir. Bu nedenle, p-değeri küçüldükçe örneklemden elde edilen çıkarımın “tesadüf olmama” olasılığı artar.

  • Eğer p-değeri alfa (genellikle α = 0.05) değerinden küçük ise, H0 hipotezi red edilir ve iki değişken arasındaki korelasyonun anlamlı olduğunu söylemek için yeterli kanıt olduğunu söyleyebiliriz.
  • Eğer p-değeri alfa (genellikle α = 0.05) değerinden büyük ise, H0 hipotezi red edilemez ve iki değişken arasındaki korelasyonun anlamlı olduğunu söylemek için yeterli kanıt olmadığını söyleyebiliriz.

Hipotez testleri ve korelasyon katsayısının istatistiksel anlamlılığını teorik olarak inceledik. Tekrardan Spearman ve Kendall Tau-b testini uyguladığımız değişken çiftine dönerek, istatistiksel olarak anlamlı olup olmadıklarını inceleyelim.

  • “Avg_Open_To_Buy” ile “Credit_Limit” – (1.0)
stats.spearmanr(cus["Avg_Open_To_Buy"], cus["Credit_Limit"])

stats.kendalltau(cus["Avg_Open_To_Buy"], cus["Credit_Limit"])
SpearmanrResult(correlation=0.9314309341271124, pvalue=0.0)

KendalltauResult(correlation=0.8050117727641529, pvalue=0.0)

Tüm korelasyon bağıntı analizleri (Pearson, Spearman, Kendall vs.) sonuç olarak korelasyon katsayısı ve p-değerini döndürür.

Yukarıdaki sonuçlara göre p-değerinin hem Spearman hem de Kendall-tau b testleri için 0 olduğunu görüyoruz. Bu değer %95 güven seviyesinde (α = 0.05) alfa değerinden küçüktür. Sonuç olarak, H0 hipotezini %95 güven seviyesinde red ederiz. İki değişken arasında ilişkinin istatistiksel olarak anlamlı olduğunu söylemek için yeterli kanıt vardır. Yani, iki değişken arasındaki korelasyon istatistiksel olarak anlamlıdır.

5. Adım: Farklı veri tiplerine ait korelasyonların incelenmesi.

Sürekli değişkenlerin birbirleri ile arasındaki ilişkileri inceledikten sonra kategorik ve sıralı (ordinal) veri türüne sahip değişkenlere ait korelasyon analizine geçelim.

Veri setine tekrar göz attığımız zaman:

  • İki kategorili kategorik değişkenler: Gender, Attrition_Flag
  • Sıralı veri türüne sahip değişkenler: Education_Level, Income_Category

İki kategorili kategorik değişken ve sürekli bir değişken arasındaki ilişki

Veri setinde Cinsiyet (Gender) ve Müşteri Durumu (Attrition_Flag) gibi iki kategoriden oluşan (binary) kategorik değişkenler bulunmaktadır. Bu değişkenlerle son son çeyrek (Q4) ve yeni yılın ilk çeyreği (Q1) arasındaki harcama miktarı oranını belirten ve sürekli bir değişken olan “Total_Amt_Chng_Q4_Q1” ile korelasyonunu inceleyelim.

Değişkenler arasındaki ilişkiyi inceleyebilmek için “Nokta Çift Serili Korelasyon Analizi” yöntemini kullanacağız. Bu yöntemin 2 adet varsayımı vardır.

  1. Sürekli değişkenin normal dağılıma sahip olması.
  2. Sürekli değişkenin her bir kategori için eşit varyansa sahip olması.

İlk önce sürekli değişkenin normal dağılıma uyup uymadığını kontrol edelim. Normal dağılıma uygunluk testi için öncelikle grafiksel yöntemlerden faydalanacağız. Histogram ile başlayalım.

sns.histplot(data = cus["Total_Amt_Chng_Q4_Q1"])

Seaborn kütüphanesinden histplot() fonksiyonunu kullanarak değişkene ait histogramı çizdirdik.

  • Grafiğin sağ tarafında uzun bir kuyruk bulunuyor.
  • Bu da değişkenin sağa çarpık (pozitif) bir dağılıma sahip olduğunu gösteriyor.
  • Sağa doğru uzayan kuyrukta değerler görüyoruz. Değişkenin aykırı değerleri olduğunu gösteriyor. Aykırı değerler değişkenin simetrik bir dağılıma sahip olmasını engelliyor.

Değişkenin aykırı değerlere sahip olduğunu en iyi anlayabileceğimiz grafiklerden biri kutu grafiğidir. Kutu grafiği ile aykırı değerlerin varlığını kanıtlayacağız.

sns.boxplot(data = cus["Total_Amt_Chng_Q4_Q1"])

Seaborn kütüphanesinden boxplot() fonksiyonunun yardımıyla kutu grafiğini çizdirdik. Bıyık olarak tarif edilen alt ve üstteki paralel çizgilerin hem alt hem de üst tarafında noktalar görüyoruz. Bu noktalar verinin hem sol tarafında hem de sağ tarafında aykırı değerler bulunduğunu gösteriyor.

Öncelikle aykırı değer analizi yaparak aykırı değerleri tespit edip, daha sonrasında da uygun bir yöntem ile müdahale etmemiz gerekiyor. Aykırı değerleri sayısal olarak tespit etmek için güçlü bir yöntem olan Çift Ortanca Mutlak Sapma (Double MAD) yöntemini kullanacağız. Bu yöntemin detaylarını, avantaj ve dezavantajlarını aykırı değer analizi yazısında bulabilirsiniz.

def double_mad(val):
    c = 1.4826
    q2 = np.median(val)
     
    bot_val = [i for i in val if i <= q2]
    bot_mad = (np.median(abs(bot_val - q2))) * c   
     
    up_val = [i for i in val if i >= q2] 
    up_mad = (np.median(abs(up_val - q2))) * c  
     
    lower_t = q2 - (3 * bot_mad)
    upper_t = q2 + (3 * up_mad)
     
    return lower_t, upper_t
 
lower_t = double_mad(cus["Total_Amt_Chng_Q4_Q1"])[0]
upper_t = double_mad(cus["Total_Amt_Chng_Q4_Q1"])[1]
 
print(lower_t, upper_t)
0.268981 1.2786316
  • Ortanca Mutlak Sapma yöntemini uygulayabilmek için double_mad() adında ve uygulanacak değişkeni parametre olarak kullanan bir fonksiyon oluşturduk.
  • Bu fonksiyon ilk olarak parametre şeklinde girilen değişkenin ortanca değerini hesaplıyor.
  • Daha sonrasında değişkeni ortanca değerinden büyük ve küçük değerler olacak şekilde “alt” ve “üst” adını verebileceğimiz 2 gruba ayırıyor.
  • Daha sonrasında her bir grup için ortanca mutlak sapma değerini hesaplıyor. Formül (Ort (|x – Ort|) * C)
    • Ort: Grubun ortanca değeri
    • x: Grupta bulunan gözlem
    • c: Tutarlılık katsayısı
  • Hesaplamalardan sonra değişkene ait, biri alt grup diğeri de üst grup için, 2 adet ortanca mutlak sapma değeri üretiliyor.
  • Alt sınırı belirlemek için değişkenin ortanca değerinden alt grup için hesaplanmış mutlak ortanca sapma değerinin 3 katı çıkarılıyor.
  • Üst sınırı belirlemek için de ortanca değerine üst grup için hesaplanmış mutlak ortanca sapma değerinin 3 katı ekleniyor.
  • Fonksiyon yanıt olarak alt ve üst sınırı tuple veri tipinde döndürüyor.
  • Oluşturduğumuz fonksiyonu çalıştırarak alt sınırı ve üst sınırı belirledik ve lower_t, upper_t adlı değişkenlere kaydettik.
  • Sonuca göre 0.26’dan küçük ve 1.27’den büyük değerler bu değişken için aykırı değerdir.

0.26’dan küçük ve 1.27’den büyük gözlemleri filtreleyerek, ilgili değişkende kaç adet aykırı gözlem olduğunu bulalım.

cond = (cus["Total_Amt_Chng_Q4_Q1"] < lower_t) | (cus["Total_Amt_Chng_Q4_Q1"] > upper_t)

out_no_mad = len(cus[cond]["Total_Amt_Chng_Q4_Q1"])

print(out_no_mad)
302
  • İlk olarak “cond” adında bir değişken oluşturduk ve Pandas’da filtreleyeceğimiz şartı bu değişkene atadık.
  • lower_t’den küçük veya upper_t’den büyük gözlemleri filtreleyeceğiz. İki farklı koşulu “veya” ile “|” sembolünü kullanarak bağladık.
  • Son olarak len() fonksiyonu ile uyguladığımız koşulların kaç adet gözlemi döndürdüğünü saydırdık.

302 adet değişken aykırı olarak işaretlendi. Değişkende toplam 10,127 adet gözlem bulunmaktaydı. Yani, kabaca gözlemlerin %3’ü aykırı olarak işaretlendi.

Değişkenin çok küçük bir kısmı aykırı olarak işaretlendiği için bu gözlemleri değişkenden çıkaracağız. Bunu uygulayabilmek için aykırı değer alt ve üst sınırının içerisinde yer alan değerleri filtreleyeceğiz ve yeni bir DataFrame’e kaydedeceğiz.

filter_cond = (cus["Total_Amt_Chng_Q4_Q1"] > lower_t) & (cus["Total_Amt_Chng_Q4_Q1"] < upper_t)

new_df = cus[filter_cond][["Total_Amt_Chng_Q4_Q1", "Gender"]]

Yeni oluşturulan değişkenin histogramını çizdirerek yaptığımız işlemin etkisine bakalım.

sns.histplot(data = new_df["Total_Amt_Chng_Q4_Q1"])

Grafikte görüldüğü üzere, değişken neredeyse normal dağılıma sahiptir. Fakat hala sol ve sağ uçta uzun kuyruklar bulunuyor. Veri hala normal dağılım varsayımını sağlayamıyor.

Şimdi ikinci varsayıma bakalım. Sürekli değişkenin her bir kategori için eşit varyansa sahip olması gerekmektedir. Varyansın eşitliği için istatistiksel testler uygulanabileceği gibi grafiksel olarak da bir fikir elde edebiliriz. Sürekli değişkenin, histogram veya Kernel yoğunluk grafiğinde her bir kategori için benzer bir açıklığa/yayılıma sahip olmasını istiyoruz.

Üst üste çizilen histogramlar görüntü olarak yanıltıcı olabileceği için bu analizde Kernel yoğunluk grafiğini tercih edeceğiz.

sns.kdeplot(data = new_df, x = "Total_Amt_Chng_Q4_Q1", hue = "Gender")

Seaborn kütüphanesinden kdeplot() fonksiyonunu kullanarak Kernel yoğunluk grafiğini çizdirdik. Sürekli değişkenin her iki kategoride nasıl bir varyansa sahip olduğunu görmek için “hue” parametresi ile cinsiyete göre 2 farklı yoğunluk grafiği çizdirdik.

Grafiğe göre, sürekli değişkenin varyansı yada değişkenliği cinsiyetin kategorilerine göre farklılık göstermektedir. Bu duruumu istatistiksel olarak Levene testi ile de doğrulayalım. Levene testi iki farklı örneklem grubunun varyansının eşit olup olmadığını test etmek için kullanılan bir hipotez testidir.

İlk önce hipotezleri oluşturalım.

H0: İki grubun varyansı birbirine eşittir.
H1: İki grubun varyansı birbirine eşit değildir.

Varyansların test edileceği grupları oluşturalım. Bu gruplar, cinsiyete göre kategorize edilmiş, Q4 ve Q1 arasındaki harcama farkı verisidir.

group1 = new_df[(new_df["Gender"] == "M")]["Total_Amt_Chng_Q4_Q1"]
group2 = new_df[(new_df["Gender"] == "F")]["Total_Amt_Chng_Q4_Q1"]
  • Pandas’ın filtreleme yapısını kullanarak iki farklı kategori için gruplar oluşturduk.
  • İlk grup, cinsiyeti “erkek” olan ve “Total_Amt_Chng_Q4_Q1” değişkeninde yer alan değerlerden oluşuyor.
  • İkinci grup, cinsiyeti “kadın” olan ve “Total_Amt_Chng_Q4_Q1” değişkeninde yer alan değerlerden oluşuyor.

Levene testini uygulamak için SciPy kütüphanesinin stats modülündeki levene() fonksiyonunu kullanacağız.

stats.levene(group1, group2, center='mean')
LeveneResult(statistic=23.302026093190392, pvalue=1.4054137732925326e-06)
  • levene() fonksiyonu parametre olarak test edilecek grupları ve test için kullanılacak merkezi ölçü birimini kullanır.
  • Merkezi ölçü birimi olarak:
    • mean: Ortalama. Simetrik dağılıma sahip değişkenler için tavsiye edilir.
    • median: Ortanca. Sağa veya sola çarpık (simetrik olmayan) dağılımlar için tavsiye edilir.
    • trimmed: Uzun kuyrukları olan dağılımlar için tavsiye edilir.
  • levene() fonksiyonu sonuç olarak test istatistiği ve p-değerini döndürür.
  • p-değeri alfa değerinden küçük olduğu durumlarda H0 hipotezi red edilir.

Sonucu yorumladığımızda p-değerinin %95 güven seviyesinde alfa değeri olan 0.05’ten küçük olduğunu görüyoruz. Bu da H0 hipotezini red edeceğimiz anlamına geliyor. İki grubun varyansı birbirine eşit değildir. Grafikte fark ettiğimiz gözlemi istatistiksel olarak da doğruladık. Değişken maalesef ikinci varsayımı da sağlayamıyor.

Buraya kadar yaptığımız analiz:

  • Sürekli değişkenin analiz için uygun olmadığını, kullanılırsa sonuçların yanıltıcı olacağını söylüyor.

Önemli Not: Sürekli değişken normallik veya kategoriler eşit varyans varsayımlarından en az birini sağlayamıyorsa Nokta çift seri korelasyon analizi kullanılmamalıdır!

Veri setindeki diğer sürekli değişkenler de aykırı değer analizi ve veri dönüştürme yöntemlerine rağmen normallik varsayımını sağlamadığı için nokta çift serili korelasyon analizi bu veri setinde kullanıma uygun değildir.

İki kategorik değişken arasındaki ilişki

İki kategoriden oluşan (binary) kategorik değişkenlerin korelasyon analizi yapılırken Dörtlü (Phi) Korelasyon Analizi‘nden yararlanılır.

Cinsiyet ile müşteri durumu arasında bir korelasyon var mı?

Dörtlü (Phi) Korelasyon katsayısını hesaplayabilmek için SkLearn kütüphanesinden matthews_corrcoef() fonksiyonunu kullanabiliriz.

İlk önce matthews_corrcoef() fonksiyonunu kullanalım. Bu fonksiyonu uygulamadan önce analize girecek kategorik değişkenleri tekrardan işleyerek 0 ve 1’e dönüştüreceğiz.

gender_enc = {
    
    "M": 0,
    "F": 1
}

cus["gender_encoded"] = cus["Gender"].map(gender_enc)

attrition_enc = {
    
    "Existing Customer": 0,
    "Attrited Customer": 1
}

cus["attrition_encoded"] = cus["Attrition_Flag"].map(attrition_enc)
  • Öncelikle bir dictionary oluşturduk ve erkekleri temsil eden “M” harfini 0’a, kadınları temsil eden “F” harfini de 1’e eşledik.
  • Daha sonrasında “gender_encoded” adında yeni bir değişken oluşturarak, “Gender” değişkeni üzerinde dictionary’i kullanarak M ve F harflerine uygun gelen rakamları map() fonksiyonu ile eşleştirdik.
  • Aynı işlemi bir diğer binary kategorik değişken olan “Attrition_Flag” üzerinde de uyguladık. Aktif müşterilere 0, pasif müşterilere 1 değerini atadık.

Korelasyon analizini uygulamaya hazırız.

from sklearn.metrics import matthews_corrcoef

mcc = matthews_corrcoef(cus["gender_encoded"], cus["attrition_encoded"])

print(mcc)
0.037271695731361444
  • İlk önce kullanacağımız fonksiyonu SkLearn kütüphanesinin metrics modülünden dosyaya çağırdık.
  • Daha sonrasında yeniden işleyerek 0 ve 1’lere dönüştürdüğümüz kategorik değişkenleri fonksiyona parametre olarak girdik ve “mcc” adını verdiğimiz değişkene atadık.
  • Çıkan sonuç iki değişken arasında korelasyon olmadığını söylüyor. Yani, cinsiyet ile müşterinin durumu arasında herhangi bir bağıntı bulunmuyor.

Farklı senaryolarda izlenebilecek farklı stratejiler

Veri setindeki değişken sayısına göre korelasyon analizinde farklı stratejiler izlenebilir.

Az değişkene sahip veri setleri

Değişken sayısının az olduğu (< 10) veri setlerinde analize korelasyon matrisi ile başlamak yerine öncelikle histogram ve saçılım grafiği (scatterplot) kullanılarak değişkenlerin birbirleri arasında ne tür bir ilişkiye sahip olduğu ve normallik varsayımlarını test edip etmediği kontrol edilebilir.

Ön keşif yapıldıktan sonra korelasyon matrisi ile korelasyonun şiddeti, yönü ölçüldükten sonra istatistiksel anlamlılık kontrolü yapılabilir.

Çok değişkene sahip veri setleri

Değişken sayısının fazla olduğu (10>) veri setlerinde grafiklerden hızlı sonuç almak zorlaşır. Örnekte de görüldüğü gibi değişken sayısı artınca, grafikler daha karmaşıklaşır.

Böyle bir senaryoda korelasyon analizi yapmadan önce temel bileşenler analizi (PCA – Principal Component Analysis) ile veri setindeki değişken sayısı düşürülüp, kalan değişkenler üzerinden korelasyon analizi yapılabilir.

Korelasyon hakkında doğru bilinen yanlışlar

Korelasyon her zaman nedensellik değildir.

İki değişken arasındaki korelasyonu yorumlarken yapılan hatalardan bir tanesi, birinin diğerine sebep olduğu yanılgısıdır. Bu durum zaman zaman geçerli olabileceği gibi her zaman geçerli değildir. Bunun nedeni ise iki değişken üzerinde görünmez bir 3.değişkenin (confounding variable) etkisini göz ardı etmemizdir.

Bu durumu şöyle bir örnek ile açıklayabiliriz: New York’ta yapılan bir çalışmaya göre dondurma tüketimi ile cinayet sayısı arasında pozitif bir ilişki keşfedildi. Dondurma tüketimi arttıkça, öldürülen insan sayısı da artış gösteriyor. Peki, gerçekten de dondurma insanların ölmesine mi neden oluyor?

Dondurma tüketimi ve cinayet sayısı arasındaki saçılım grafiği

Bu örnekte fark edilmeyen üçüncü bir değişkenin etkisi var. Yaz aylarında dondurma tüketimi ve öldürülen insan sayısı tepe noktasına çıkıyor. Bu iki değişkeni de etkileyen diğer bir değişken ise “hava durumu”. Aslında, hava sıcaklığı arttıkça insanlar birbirleriyle daha çok etkileşime giriyor, birbirleriyle daha çok problemler yaşıyor ve daha çok cinayet işleniyor. Aynı zamanda, yine insanlar yaz aylarında daha çok dondurma tüketiyor. Bu iki değişken birbiri ile korelasyona sahip olsa da aslında birbiri ile alakasız.

Örneklemde keşfedilen korelasyon, popülasyonda da bulunur.

Veri bilimcisi/analisti olarak çoğunlukla, sağladığı birçok avantaj nedeniyle örneklem verisi ile çalışılır. Örneklemlerin en büyük dezavantajlarından biri popülasyonun içerisinden rastgele oluşturulmuş oldukları için birbirleri arasında farklılık göstermeleridir. Bu nedenle, örneklem verisinde keşfedilen korelasyon şansa oluşmuş olabilir ve popülasyonda mevcut olmayabilir. Örneklemde keşfedilen korelasyon popülasyona dair genelleştirilmeden önce korelasyon katsayısının istatistiksel olarak anlamlı olup olmadığı incelenmelidir.

Korelasyon analizinde yenilikçi yaklaşımlar

Korelasyon analizi istatistik ve veri bilimi için önemli bir yere sahiptir. Örnek veri seti ile yaptığımız analiz sırasında da zaman zaman karşılaştığımız zorluklar veri profesyonellerini farklı çözümler aramaya itmiştir. Yazıyı hazırlarken yaptığım araştırmalar sırasında keşfettiğim bazı yeni fakat henüz popülerlik kazanmamış yöntemleri şöyle özetleyebilirim:

1- Feature Space Diagram

Korelasyon matrisi, değişkenler arasındaki ilişkileri bir çırpıda görebilmek için kullanışlı bir yöntemdir. Fakat, örnekte karşılaştığımız gibi değişken sayısı arttıkça, korelasyon matrisini okumak ve çıkarım yapmak güçleşir. Korelasyon matrisinin bir diğer dezavantajı da tüm değişkenler arasındaki ilişkilerin doğrusal olup olmadığını göstermemesidir. Bu nedenle, korelasyon matrisini yorumlarken bazı potansiyel tuzaklar oluşur.

Matt Britton isimli bir veri bilimcisi korelasyon matrisine alternatif olarak “Feature Space Diagram” adını verdiği yeni bir yöntem önermiştir. Bu yöntem, kümeleme algoritmalarını kullanarak birbiri ile ilişkili değişkenleri bir araya toplayarak değişkenler arasındaki ilişkileri görselleştirmektedir.

Örnek bir veri seti üzerinde Feature Space Diagram uygulaması

2- Predictive Power Score

Değişken ve değişkenler arasındaki ilişkinin türüne göre kullanılacak korelasyon analizinin farklılık göstermesi, korelasyon katsayısının dezavantajlarını gidererek daha basit bir alternatif arayışı doğurmuştur.

Predictive Power Score, “değişkenlerin (Kategorik, ordinal, sürekli vs.) ve değişkenler arası ilişkilerin (Doğrusal, monoton vs.) türünden bağımsız bir şekilde, ilişkinin olup olmadığını gösterecek bir değer oluşturma” hayali ile Florian Wetschoreck tarafından oluşturuldu.

PPS, değişkenlerin türüne göre farklı hesaplama modelleri kullanarak korelasyon katsayısına alternatif bir değer üretir. Farklı değişken türlerine göre kullanılan farklı hesaplama modelleri, değişkenler arasındaki farklı türdeki ilişkileri yakalamaya yardımcı olmasına rağmen, korelasyon katsayısı gibi evrensel bir karşılaştırma imkanını ortadan kaldırmaktadır.

Örnek veri seti üzerinde korelasyon katsayısı ile PPS katsayısının karşılaştırması

3- Phik (𝜙k)

Korelasyon katsayısına alternatif olarak geliştirilen bir diğer yöntem ise “Phik (𝜙k) korelasyon katsayısıdır. “pandas-profiling” paketi içerisinde yer alan bu yöntem, kategorik, ordinal ve sürekli veriler ile kullanılabildiği gibi sadece doğrusal ilişkileri değil doğrusal olmayan ilişkileri de saptamaktadır.

Yazıda bahsettiğimiz Pearson, Spearman gibi yöntemlere göre daha karmaşık bir formülasyona sahip bir yöntem olduğu için daha külfetli bir yöntemdir. Ayrıca, bahsettiğimiz yöntemlere göre bir diğer dezavantajı ise ilişkinin yönünü göstermemesidir.

Örnek veri seti üzerinde phik korelasyon katsayısı ile Pearson ve Cramer korelasyon katsayılarının karşılaştırması

Yukarıda özetlediğimiz tüm yöntemler henüz yeni olduğu ve sektörde yaygınlaşmadığı için deneme-yanılmaya açıktır. Ayrıca, Pearson, Spearman gibi yöntemlere göre açıklaması daha zordur. Yenilikçi yöntemleri kullanırken, dezavantajlarını da hesaba katmanızı tavsiye ederim.

Sıkça sorulan sorular:

Korelasyon analizinde hangi değer hesaplanır ve anlamı nedir?

Korelasyon analizi ile korelasyon katsayısı değeri hesaplanır. Korelasyon katsayısı iki değişken arasındaki ilişkinin kuvvetini ve yönünü belirtir. Korelasyon katsayısının doğru sonuçlar vermesi için istatistiksel olarak anlamlılığının test edilmesi gerekir ve değişkenler arasındaki ilişkinin grafiksel olarak da analiz edilmesi gerekir.

Korelasyon katsayısına göre ilişkinin gücü nasıl yorumlanır?

Korelasyon katsayısı -1 ile +1 arasında bir değer alır. Katsayısı değeri uçlara yaklaştıkça ilişkinin kuvveti artarken 0 ile 0.20 veya 0 ile -0.20 arasındaki katsayı değeri korelasyonun neredeyse anlamsız olduğunu belirtir. Ayrıca korelasyon katsayısının negatif olması ilişkinin negatif, pozitif olması ise iki değişkenin pozitif bir ilişkiye sahip olduğunu gösterir.

Korelasyon ve regresyon analizi nedir ve bu iki analiz arasındaki ilişki nedir?

Korelasyon iki değişken arasındaki ilişkiyi gösterirken, regresyon analizi bir değişkenin diğerini nasıl etkilediğini gösterir.

İki yada daha çok değişken arasındaki ilişkiye ne ad verilir?

İki yada daha çok değişken arasındaki ilişki doğrusal (lineer), doğrusal olmayan (non-lineer), monoton (monotonic) olabilir. Değişkenler arasındaki ilişkinin belirlenebilmesi için saçılım grafiğinden (scatterplot) yararlanılmalıdır.

Korelasyon analizi ne tür sorulara cevap verir?

Korelasyon analizi, “Hangi değişkenler birbiri ile ilişkili?”, “Değişkenler arasındaki nasıl bir ilişki vardır?” sorularına yanıt verebilir.

Kaynakça:

Point-Biserial Correlation using SPSS Statistics

Point Biserial Correlation with Python

Spearman – SciPy

Matthews correlation coefficient

Cramer’s V

Everything You Need To Know About Correlation

Spearman’s Correlation Explained

The Search for Categorical Correlation