Ana içeriğe geç

R Kontenjans Tabloları Eğitimi

Bu eğitimde, kontenjans tablolarını nasıl oluşturacağınızı ve bunlarda görülen ilişkileri nasıl test edip ölçümlendireceğinizi öğreneceksiniz.
· 10 dk. oku

Yapay Zeka ile Keşfedin

Tablo Nasıl Oluşturulur

Önce biraz veri alalım. MASS paketi, 1993 yılında ABD'de satışta olan 93 otomobile ilişkin veriler içerir. Bunlar Cars93 nesnesinde saklanır ve her bir araba için bazıları kategorik olan 27 özellik içerir. O halde MASS paketini yükleyelim ve cars93 içinde yer alan araç türlerine bakalım:

library(MASS)
Cars93$Type

##  [1] Small   Midsize Compact Midsize Midsize Midsize Large   Large  
##  [9] Midsize Large   Midsize Compact Compact Sporty  Midsize Van    
## [17] Van     Large   Sporty  Large   Compact Large   Small   Small  
## [25] Compact Van     Midsize Sporty  Small   Large   Small   Small  
## [33] Compact Sporty  Sporty  Van     Midsize Large   Small   Sporty
## [41] Sporty  Small   Compact Small   Small   Sporty  Midsize Midsize
## [49] Midsize Midsize Midsize Large   Small   Small   Compact Van    
## [57] Sporty  Compact Midsize Sporty  Midsize Small   Midsize Small  
## [65] Compact Van     Midsize Compact Midsize Van     Large   Sporty
## [73] Small   Compact Sporty  Midsize Large   Compact Small   Small  
## [81] Small   Compact Small   Small   Sporty  Midsize Van     Small  
## [89] Van     Compact Sporty  Compact Midsize
## Levels: Compact Large Midsize Small Sporty Van

Burada 6 tür araba var. table fonksiyonu her türden kaç tane olduğunu söyler:

table(Cars93$Type)

##
## Compact   Large Midsize   Small  Sporty     Van
##      16      11      22      21      14       9

prop.table bunu kesirlere dönüştürür:

prop.table(table(Cars93$Type))

##
##    Compact      Large    Midsize      Small     Sporty        Van
## 0.17204301 0.11827957 0.23655914 0.22580645 0.15053763 0.09677419

Aynısı arabaların menşei için de:

table(Cars93$Origin)

##
##     USA non-USA
##      48      45

prop.table(table(Cars93$Origin))

##
##      USA  non-USA
## 0.516129 0.483871

Kontenjans Tablosu Nasıl Oluşturulur

Harika, veri setimizin ABD ve ABD dışı araç sayısı bakımından benzer büyüklükte olduğunu ve en yaygın türlerin Midsize ve Small olduğunu gördük. Ancak, belki de ABD ve ABD dışı araçlar tür bakımından farklılık gösteriyordur?

Şimdi araç türlerine menşelerine göre bakalım. table fonksiyonunu yine kullanabiliriz, ancak bu kez iki argümanla. İlki satır değişkeni, ikincisi sütun değişkeni olur:

table(Cars93$Type, Cars93$Origin)

##          
##           USA non-USA
##   Compact   7       9
##   Large    11       0
##   Midsize  10      12
##   Small     7      14
##   Sporty    8       6
##   Van       5       4

Şimdi herkesin bildiğini gördük: Amerikalılar büyük araçları seviyor! Yukarıdaki tablo iki kategorik değişkenin (Type ve Origin) ortak dağılımını gösterir. Bu tür tablolara kontenjans tabloları denir.

Kontenjans Tablosundan Marjinaller Nasıl Alınır

rowSums ve colSums fonksiyonları oldukça kendini açıklayıcıdır

(tab1<-table(Cars93$Type, Cars93$Origin))

##          
##           USA non-USA
##   Compact   7       9
##   Large    11       0
##   Midsize  10      12
##   Small     7      14
##   Sporty    8       6
##   Van       5       4

rowSums(tab1)

## Compact   Large Midsize   Small  Sporty     Van
##      16      11      22      21      14       9

colSums(tab1)

##     USA non-USA
##      48      45

Kontenjans Tablosundan Yüzdeler Nasıl Alınır

table içine gömülü prop.table frekansları verir

prop.table(table(Cars93$Type, Cars93$Origin))

##          
##                  USA    non-USA
##   Compact 0.07526882 0.09677419
##   Large   0.11827957 0.00000000
##   Midsize 0.10752688 0.12903226
##   Small   0.07526882 0.15053763
##   Sporty  0.08602151 0.06451613
##   Van     0.05376344 0.04301075

Yüzdelere dönüştürme sadece 100 ile çarpmaktır:

prop.table(table(Cars93$Type, Cars93$Origin))*100

##          
##                 USA   non-USA
##   Compact  7.526882  9.677419
##   Large   11.827957  0.000000
##   Midsize 10.752688 12.903226
##   Small    7.526882 15.053763
##   Sporty   8.602151  6.451613
##   Van      5.376344  4.301075

Bu bir ortak olasılık dağılımıdır; buradan örneğin araçların yaklaşık %7,5'inin küçük ve Amerikan menşeli olduğunu görebiliriz.

Çoğu zaman, başka bir değişkenin oluşturduğu gruplar içinde bir değişkenin dağılımıyla ilgileniriz. Burada, ABD ve (ayrı ayrı) ABD dışı araçlar arasında araç türlerinin dağılımı ilginç görünüyor. Bunu elde etmek için prop.table fonksiyonunun margin argümanını kullanırız. Bu argüman, gruplayan değişkenin satırlarda (margin=1) mi yoksa sütunlarda (margin=2) mi olduğunu belirtir:

prop.table(table(Cars93$Type, Cars93$Origin), margin=2)*100

##          
##                 USA   non-USA
##   Compact 14.583333 20.000000
##   Large   22.916667  0.000000
##   Midsize 20.833333 26.666667
##   Small   14.583333 31.111111
##   Sporty  16.666667 13.333333
##   Van     10.416667  8.888889

Şimdi küçük arabaların veri setimizin ABD dışı kısmında, ABD kısmına göre iki kat daha sık olduğunu kolayca görebiliyoruz.

Ayrıca, yüzde değerlerinin sütunlarda 100'e toplandığına dikkat edin; ortak dağılım tablosunda (margin argümanı olmayan), 100 tüm tablonun toplamıydı.

(tab2<-prop.table(table(Cars93$Type, Cars93$Origin), margin=2)*100)

##          
##                 USA   non-USA
##   Compact 14.583333 20.000000
##   Large   22.916667  0.000000
##   Midsize 20.833333 26.666667
##   Small   14.583333 31.111111
##   Sporty  16.666667 13.333333
##   Van     10.416667  8.888889

colSums(tab2)

##     USA non-USA
##     100     100

Ki-kare Testi

Kontenjans tablolarından doğan en yaygın soru, satır ve sütun değişkenlerinin bağımsız olup olmadığıdır. Bunu yanıtlamanın en temel yolu bir ki-kare testi yapmaktır. Bu konu bu eğitimde ayrıntılı olarak ele alınmıştır. Type ve Origin bağımsız mı, kontrol edelim:

chisq.test(Cars93$Type, Cars93$Origin)

## Warning in chisq.test(Cars93$Type, Cars93$Origin): Chi-squared
## approximation may be incorrect

##
##  Pearson's Chi-squared test
##
## data:  Cars93$Type and Cars93$Origin
## X-squared = 14.08, df = 5, p-value = 0.01511

Görünüşe göre bağımsız değiller, ancak ayrıca Chi-squared approximation may be incorrect uyarısını da aldık. Bunun nedeni ki-kare istatistiğinin ki-kare dağılımını yalnızca yaklaşık olarak takip etmesidir. Gözlem sayısı arttıkça yaklaşım daha iyi olur. chisq.test fonksiyonu, beklenen sayımlardan herhangi biri 5'in altındaysa ("beklenen sayı"nın ne olduğuna ilişkin ayrıntılar için yukarıdaki eğitime bakın) yukarıdaki uyarıyı verir.

Fisher'in Kesin Testi

Fisher'in kesin testi, özellikle ki-kare yaklaşımının tatmin edici olmadığı durumlarda kullanılan bir alternatiftir. Çalıştıralım:

fisher.test(Cars93$Type, Cars93$Origin)

##
##  Fisher's Exact Test for Count Data
##
## data:  Cars93$Type and Cars93$Origin
## p-value = 0.007248
## alternative hypothesis: two.sided

Sonuçlar ki-kare ile oldukça benzerdir, ancak bu her zaman böyle olmaz. Fisher'in kesin testinin büyük tablolarda (veya büyük örneklemlerde) önemli bir dezavantajı, hesaplama açısından verimsiz hale gelmesidir.

G-testi

Bir diğer alternatif de G-testi olarak adlandırılır. İstatistiği yaklaşık olarak ki-kare dağılımına uyar, ancak küçük örneklemlerde bu yaklaşım ki-kare testinin kullandığı yaklaşımdan daha yakındır. G-testi için DescTools paketindeki GTest fonksiyonunu kullanabiliriz. Sonuçlar yine önceki iki teste oldukça benzer: Type ve Origin bağımsız değildir.

library(DescTools)
GTest(Cars93$Type, Cars93$Origin)

##
##  Log likelihood ratio (G-test) test of independence without
##  correction
##
## data:  Cars93$Type and Cars93$Origin
## G = 18.362, X-squared df = 5, p-value = 0.002526

Yates Düzeltmesi

2x2 kontenjans tablolarında, ki-kare testine Yates süreklilik düzeltmesi eklenebilir. Bu, ki-kare istatistiğindeki her | Gözlenen - Beklenen | teriminden basitçe 0,5 çıkarmaktır. Yeniden, burada kafanız karıştıysa bu eğitime bakın. Dahası, R gerekli olduğunda Yates düzeltmesini otomatik olarak uygular. ABD ve ABD dışı araçlarda manuel şanzıman seçeneğinin bulunabilirliğine bakalım:

(tab3<-table(Cars93$Man.trans.avail, Cars93$Origin))

##      
##       USA non-USA
##   No   26       6
##   Yes  22      39

chisq.test(tab3)

##
##  Pearson's Chi-squared test with Yates' continuity correction
##
## data:  tab3
## X-squared = 15.397, df = 1, p-value = 8.712e-05

Yates düzeltmesi otomatik olarak uygulandı ve R bize bunu bildirdi.

3 (veya daha fazla) Boyutlu Tablo

Man.trans.avail, Origin ve Type'a aynı anda bakalım. table, üçüncü olarak verilen değişkene göre veri setini böler:

table(Cars93$Man.trans.avail, Cars93$Origin, Cars93$Type)

## , ,  = Compact
##
##      
##       USA non-USA
##   No    2       0
##   Yes   5       9
##
## , ,  = Large
##
##      
##       USA non-USA
##   No   11       0
##   Yes   0       0
##
## , ,  = Midsize
##
##      
##       USA non-USA
##   No    9       4
##   Yes   1       8
##
## , ,  = Small
##
##      
##       USA non-USA
##   No    0       0
##   Yes   7      14
##
## , ,  = Sporty
##
##      
##       USA non-USA
##   No    0       0
##   Yes   8       6
##
## , ,  = Van
##
##      
##       USA non-USA
##   No    4       2
##   Yes   1       2

ftable daha sıkı bir görünüm sunar:

ftable(Cars93$Man.trans.avail, Cars93$Origin, Cars93$Type)

##              Compact Large Midsize Small Sporty Van
##                                                    
## No  USA            2    11       9     0      0   4
##     non-USA        0     0       4     0      0   2
## Yes USA            5     0       1     7      8   1
##     non-USA        9     0       8    14      6   2

Cochran-Mantel-Haenszel Testi

Yukarıdaki table sonuçlarından, Origin ile Man.trans.avail arasındaki ilişkinin Type'a göre farklılaştığı açık olmalı. Örneğin küçük ve sportif araçlarda bir ilişki yok: hem ABD hem de ABD dışı her küçük ya da sportif araç manuel versiyonla geliyor. Öte yandan, çoğu orta boy ABD aracında manuel versiyon yokken, bu türdeki ABD dışı araçların çoğunda var. Tabakalarda (strata) muhtemel farklı ilişkileri hesaba katmak için Cochran-Mantel-Haenszel testi kullanılabilir:

mantelhaen.test(Cars93$Man.trans.avail, Cars93$Origin, Cars93$Type)

##
##  Mantel-Haenszel chi-squared test with continuity correction
##
## data:  Cars93$Man.trans.avail and Cars93$Origin and Cars93$Type
## Mantel-Haenszel X-squared = 8.0153, df = 1, p-value = 0.004638
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
##   2.226531 76.891307
## sample estimates:
## common odds ratio
##          13.08438

mantelhaen.test'e verilen üçüncü argüman tabakaları tanımlar. Yukarıdaki sonuçları tabakalandırma olmadan elde edilenlerle (Yates düzeltmesi örneği) karşılaştırın. İlişki hâlâ mevcut, ancak buna dair kanıt çok daha zayıf.

İlişki Ölçüleri

Değişkenler arasında bazı ilişkiler keşfettikten sonra, sıra bunların gücünü ölçmeye gelir. Çok sayıda farklı ölçü türü vardır. Bunların çoğu burada açıklanmıştır. Şimdi en yaygın kullanılan iki tanesine odaklanacağım.

Cramer'in V'si

V, ki-kare istatistiğine dayanır:

$$ V = \sqrt{\frac{\chi^2/N}{\min(C-1, R-1)}}, $$ burada:

  • N, kontenjans tablosunun genel toplamıdır (tüm hücrelerinin toplamı),
  • C, sütun sayısıdır
  • R, satır sayısıdır.

V ∈ [0; 1]. V büyüdükçe, değişkenler arasındaki ilişki daha güçlüdür. V = 0 bağımsızlık olarak yorumlanabilir (V = 0 ancak ve ancak χ2 = 0 ise). V'nin temel dezavantajı kesin bir yorumunun olmamasıdır. V = 0,6 güçlü, orta mı yoksa zayıf bir ilişki midir?

DescTools paketindeki CramerV fonksiyonu bunu bizim için hesaplayabilir:

CramerV(Cars93$Type, Cars93$Origin)

## [1] 0.3890967

Yine: bu güçlü, orta mı yoksa zayıf bir ilişki mi?

Goodman ve Kruskal Lambda'sı

Goodman ve Kruskal lambda'sı, değişimde oransal azalmaya dayalı bir ölçüye örnektir. Bu tür ölçüler, doğrusal regresyondaki belirleme katsayısı R2'yi taklit etmeyi amaçlar:

  • [0, 1] aralığında değer alırlar
  • bağımsız değişkenin açıkladığı değişim payını ifade ederler.

Sütun değişkenini bağımsız olarak kullanalım. Bu durumda Goodman ve Kruskal lambda formülü: $$\lambda = \frac{L - \sum_j L_j}{L},$$ burada:

  • Lj, j. sütundaki mod dışı frekansların toplamıdır,
  • L, "toplam" sütundaki mod dışı frekansların toplamıdır

Bunu bir örnekle açıklamak en iyisidir. Type ve Origin'e bakalım; ikincisi bağımsızdır:

table(Cars93$Type, Cars93$Origin)

##          
##           USA non-USA
##   Compact   7       9
##   Large    11       0
##   Midsize  10      12
##   Small     7      14
##   Sporty    8       6
##   Van       5       4

ABD sütununun modu 11'dir, dolayısıyla L1 = 7 + 10 + 7 + 8 + 5 = 37. ABD dışı sütunun modu 14'tür, dolayısıyla L2 = 9 + 0 + 12 + 6 + 4 = 31. "Toplam" sütunu ise

rowSums(table(Cars93$Type, Cars93$Origin))

## Compact   Large Midsize   Small  Sporty     Van
##      16      11      22      21      14       9

Mod 22'dir, dolayısıyla L = 16 + 11 + 21 + 14 + 9 = 71 ve $$\lambda = \frac{71 - (37+31)}{71}=0.042$$

Bunun yerine DescTools paketindeki Lambda fonksiyonunu kullanabiliriz:

Lambda(Cars93$Type, Cars93$Origin, direction='row')

## [1] 0.04225352

direction parametresi bağımlı değişkenin nerede olduğunu (row veya column) belirler.

Origin, Type içindeki değişimin yalnızca yaklaşık %4'ünü açıklar. Formülden de görebileceğiniz gibi lambda, değişimi en büyük gruba ait olma ve olmama ikiliği olarak tanımlar.

Şunu da belirtmek gerekir ki, her sütunun mod kategorisi aynı olduğunda lambda sıfırdır. Şu tabloya bakın:

(lambdaTab<-cbind(c(0,100), c(49,51)))

##      [,1] [,2]
## [1,]    0   49
## [2,]  100   51

chisq.test(lambdaTab)

##
##  Pearson's Chi-squared test with Yates' continuity correction
##
## data:  lambdaTab
## X-squared = 62.279, df = 1, p-value = 2.981e-15

Her sütun için mod kategori aynıdır (ikinci satır). Bu nedenle, belirgin ve anlamlı ilişkiye rağmen lambda sıfır olmalıdır:

Lambda(lambdaTab, direction='row')

## [1] 0

R'de istatistik hakkında daha fazla bilgi edinmek isterseniz, DataCamp'in Statistical Modeling in R (Part 1) kursunu alın.

Konular

İlgili