R Dersleri - Ali Onur Gitmez

Ana Sayfa Ders 1 Ders 2 Ders 3 Ders 4 Ders 5 Ders 6 Ders 7 Ders 8 Ders 9 Ders 10 Ders 11 Ders 12 Ders 13 Ders 14 Ders 15

ISTATISTIK

R dersinin en önemli kısmına gelmiş olduk. Şu ana kadar öğrendiğimiz bütün konular burada öğreneceğimiz yöntemleri daha doğru uygulayabilmemiz içindi. İstatistik kısmında hem teorik hem de pratik uygulamar ile ilerleyeceğiz. Burada göreceğimiz konular

  • Olasılık ve Dağılımlar
  • Descriptive İstatistik
  • Inferential İstatistik
  • Regresyon Metodları

Olasılık bir olayın gerçekleşme ihtimalidir. 0 ve 1 arasında değer alır. 0 mümkün olmayan bir olayı 1 ise kesin gerçekleşecek bir olayı belirtir. Formül olarak şu şekilde gösterebiliriz:

\(P(A) = \frac{\text{Number of favorable outcomes for } A}{\text{Total number of outcomes in } S}\)

Mesela hileli olmayan bir parada yazı veya tura gelme ihtimali \(\frac{1}{2}\), yine hileli olmayan bir zar ile ise herhangi bir sayının gelme ihtimali \(\frac{1}{6}\).

Bütün istatistik mantığımızın temelini oluşturan olay bu. Bütün yöntemleri bu olasılık mantığının üstüne kurup ilerleyeceğiz.

Klasik olasılık teorik olarak bir temel oluştururken, deneysel olasılık bunun tekrarlı ve gerçek dünya verisinde nasıl iş yaptığına bakar. Bunu bir örnek ile inceleyelim:

set.seed(123)
para_deneme <- sample(c("Yazı", "Tura"), 
                      size = 100, replace = TRUE)
para_tura <- sum(para_deneme == "Tura") / 
  length(para_deneme)
para_tura
## [1] 0.43

Teorik beklentimiz 0.5 idi ancak gerçek dünya denemesinde bu oran 0.43 çıktı. Dünya versisi her zaman teorik olanı yansıtmak zorunda değil ancak eninde sonunda bu oran 0.5e yaklaşacaktır.

İki olaydan birisinin gerçekleşme ihtimalini hesaplarken iki farklı yöntem kullanırız. Eğer olaylar biribirinden bağımsızsa, mesela zar attığımızda 3 veya 4 gelme ihtimalini hesaplıyorsak:

\(P(A \cup B) = P(A) + P(B)\)

prob_3 <- 1 / 6
prob_4 <- 1 / 6
prob_3_or_4 <- prob_3 + prob_4
prob_3_or_4
## [1] 0.3333333

Öte yandan iki olay birbirine bağlı olabiliyorsa, mesela bir deste kart içinden papaz veya karo çekme ihtimalini hesaplıyorsak:

\(P(A \cup B) = P(A) + P(B) - P(A \cap B)\)

prob_papaz <- 4 / 52
prob_karo <- 13 / 52
prob_papaz_and_karo <- 1 / 52
prob_papaz_or_karo <- prob_papaz + 
  prob_karo - prob_papaz_and_karo
prob_papaz_or_karo
## [1] 0.3076923

Birbirinden bağımsız 2 olayın gerçekleşme olasılığını hesaplamak için ise:

\(P(A \cap B) = P(A) \times P(B)\)

Mesela üstüste tura gelme ihtimali

prob_tura_ilk <- 1 / 2
prob_tura_ikinci <- 1 / 2
prob_çift_tura <- prob_tura_ilk * prob_tura_ikinci
prob_çift_tura
## [1] 0.25

Bir olayın gerçekleşmeme ihtimali ise o olayın gerçekleşme ihtimalinin 1’den çıkarılmasıdır.

\(P(A^c) = 1- P(A)\)

prob_zar_3 <- 1 / 6
prob_not_3 <- 1 - prob_zar_3
prob_not_3
## [1] 0.8333333

Bağlı olasılık ise bir olayın gerçekleşmesine bağlı olarak başka bir olayın gerçekleşme olasılığıdır. Mesela çektiğimiz kartın maça olmasına bağlı olarak onun as olma ihtimalini hesaplayalım.

prob_as_and_maca <- 1 / 52
prob_maca <- 13 / 52
prob_as_given_maca <- prob_as_and_maca / prob_maca
prob_as_given_maca
## [1] 0.07692308

Randomness ve değişkenlerin random olması istatistik yöntemlerinin temelini oluşturur. Mesela zar atmadan hangi zarın geleceğini bilemeyiz. Random değişken tam olarak budur. Bir ankette insanlara gelirini sormadan veya siyasi görüşlerini sormadan onun ne olduğunu bilemeyiz. Ancak bunu öğrendiğimiz zaman bizim için bir değer alır ve bilinir olurlar. Random variable o ana kadar bir değeri olmayan ve her değeri alabilen değişkendir. Burada iki tip random variabla vardır.

  • Discrete random variable
  • Continious random variable

Discrete random variable sayılabilen düzeyde sonsuz ihtimali olan değişkenlere denir. Mesela 10 yazı-tura atışında gelecek tura sayısı 3-4 gibi belirli değerler alır. Burada her bir değere Probability Mass Function (PMF) kullanarak değer atarız. Discrete değerler olduğu için doğrudan olasılığın atamasını yapabiliriz.

n <- 10 
p <- 0.5
x <- 0:n
pmf <- dbinom(x, size = n, prob = p)
barplot(pmf, names.arg = x, main = 
          "PMF of Binomial Distribution", 
        xlab = "Number of Successes", 
        ylab = "Probability")

Continuous random variable’lar, belirli bir aralıkta sonsuz sayıda değer alabilen değişkenlerdir. Mesela, bir insanın boyunu düşünelim; bu boy 170 cm, 170.1 cm, 170.15 cm, hatta 170.15123 cm gibi sonsuz derecede hassas değerler alabilir. Burada belirli bir değere olasılık ataması yapmak yerine, Probability Density Function (PDF) kullanarak belli bir aralıktaki olasılık yoğunluğunu hesaplarız. Yani, bir değerin tam olarak alınma olasılığı sıfırdır; ancak belirli bir aralıktaki olasılık, PDF’nin altında kalan alanla ifade edilir. Yani burada belli bir nokta yerine bir aralığa bakıyoruz.

mu <- 0 
sigma <- 1
y <- seq(-4, 4, by = 0.01)
pdf <- dnorm(y, mean = mu, sd = sigma)
plot(y, pdf, type = "l", main = 
       "PDF of Normal Distribution", 
     xlab = "Value", ylab = "Density")

Orneklem Dağılımları

İstatistik konusunda ilerlemeden önce öğrenmemiz gereken temel konulardan birisi de örneklem dağılımları. Buna başlamadan önce öğrenmemiz gereken temel kavramlar var.

  • Popülasyon: Ülkedeki bütün insaların boylarını kaydettiğimiz bir veri olsun. Buna popülasyon deriz. Çünkü bu bizim evrenimizdeki bütün verileri içinde barındıran gruptur. Ancak gerçek dünyada bu tarz bir veriye ulaşmak mümkün olmayabilir. Bu yüzden ulaşımımız daha rahat olan sample yani örneklemleri kullanırız.

  • Sample: Popülasyon içinden belli bir sayıda çekilmiş kişilerin oluşturduğu alt gruptur. Yeterince sayıda olursa popülasyonu andırmaya başlar. Bunu örneklemi ise bu veri içinden çektiğimiz küçük bir grup olarak düşünün.

  • Sample Distribution ise bu sampleların popülasyon içinden defalarca çekilip ortalaması veya ortanca değerinin alınması ve bunun grafikleştirilmesi üstüne kuruludur.

Popülasyondan daha çok sayıda sample çektiğimiz durumda bu ortalamayı daha çok yakınsayacağı için verinin dağılımı da buna göre etkilenir ve ortada toplanmaya başlar. Bunun sebebi de daha çok veride her zaman için belli bir ortlamaya daha yakınlaşmaya başlamamız. Örnek olarak bakacak olursak.

set.seed(123)
population <- rnorm(10000, mean = 50, sd = 10)

sampling_distribution <- function(population, 
                                  sample_size, 
                                  num_samples) {
  means <- numeric(num_samples)
  for (i in 1:num_samples) {
    sample <- sample(population, size = 
                       sample_size, 
                     replace = TRUE)
    means[i] <- mean(sample)
  }
  return(means)
}
sample_size_5 <- sampling_distribution(population, 
sample_size = 5, 
num_samples = 1000)
sample_size_30 <- sampling_distribution(population, 
sample_size = 30, 
num_samples = 1000)
sample_size_100 <- sampling_distribution(population, 
sample_size = 100, 
num_samples = 1000)

df <- data.frame(
  Sample_Mean = c(sample_size_5, sample_size_30, 
                  sample_size_100),
  Sample_Size = factor(rep(c(5, 30, 100), 
                           each = 1000))
)
ggplot(df, aes(x = Sample_Mean, 
               fill = Sample_Size)) +
  geom_histogram(bins = 30, position 
                 = "identity", 
                 alpha = 0.6) +
  facet_wrap(~ Sample_Size, scales = "free") +
  labs(title = "Sampling Distributions
       of the Mean for Different Sample Sizes",
       x = "Sample Mean",
       y = "Frequency") +
  theme_minimal()

Law of Large Numbers bize sample sayısı arttığı zaman sample ortalamasının popülasyon ortalamasına yakınsamaya başladığını söylüyor. Mesela 10 kişiyle anket yapmak yerine 100 kişiyle yaparsak daha etkili ve 1000 kişiyle yaparsak daha da gerçeğe yakın sonuçlar elde etmiş oluruz. Bu da neden anketlerin az sayıda insanla işe yarar çıkarımlar yapabildiğimizi gösteriyor. Elbet burada random selection zorunlu. Bunu yapmadığımız durumda sonuçlar farklı olur. Örnek olarak:

set.seed(123)
population_mean <- mean(population)
sample_means <- sapply(1:1000, 
                       function(n) mean(sample(population, 
size = n, replace = TRUE)))
plot(1:1000, sample_means, type = "l", 
     col = "blue", lwd = 2,
     main = "Convergence of Sample Mean 
     to Population Mean",
     xlab = "Sample Size",
     ylab = "Sample Mean")
abline(h = population_mean, col = "red", 
       lwd = 2, lty = 2)
legend("topright", legend = c("Sample Mean", 
                              "Population Mean"), 
       col = c("blue", "red"), lwd = 2, 
       lty = c(1, 2))

Central Limit Theorem (CLT)

Burada gördüğümüz dağılıma normal dağılım deriz. CLT ise burada çok önemli bir kavram olarak önümüze çıkıyor. Bu kavram yapacağımız bütün istatistik testlerinin temeli aslında. Bu teorem bizim neden sample kullanarak popülasyonlar hakkında çıkarım yapabildiğimizi açıklıyor. Çünkü istatistiksel yöntemlerimi hep normal dağılım varmış gibi bir assumption ile yola çıkıyor ve matematiksel metodu buna bağlı olarak geliştiriyor. Eğer normal dağılımın dışına çıkarsak bu yöntemleri kullanamayız.

CLT bize şunu söylüyor. Eğer bir bu popülasyondan çokça sample seçersek ve bu örneklemlerin ortalamasını alıp grafiğe dökersek, bu grafik normal dağılımı andırır. Bunu da popülasyonun verisi normal dağılıma sahip olsun veya olmasın yapar. Yani popülasyonun orijinal dağılımı ne olursa olsun, yeterince sample çekip bunların ortalamasını aldığımız durumda elde edeceğimizg grafik normal dağılımı andıracaktır.

Bunun bizim için önemli olan tarafı, sample kullanarak popülasyonlar hakkında çıkarım yapmamıza olanak sağlaması. Mesela seçim sonuçlarını tahmin etmek için 1 sample yani 1 kişiyi kullanırsak elde edeceğimiz sonuç gerçeği yansıtmayacaktır. Ancak biz bu soruları gidip 100 kişiye, 1000 kişiye sorduğumuz zaman daha gerçekçi ve popülasyonun kendisini yansıtan cevaplar almaya başlarız.

Burada önemli olan bir nokta da bu seçimin random şekilde yapılması gerekliliği. Yani sadece Çankaya’da yaşayan veya sadece Bilkent’te okuyanlar Türkiye evreni yerine içlerinde bulundukları evreni yansıtırlar. Eğer biz Türkiye hakkında çıkarım yapmak istiyorsak da tüm Türkiye’den örnek almalıyız ve bu işlemin sonucunda Türkiye’yi yansıtan bir çıkarım yapabiliriz.

CLT ise bize burada yardımcı oluyor. Aldığımız tek sample normal dağılıma sahip olmak zorunda değil ancak CLT bize eğer böyle onlarca sample alıyor olsaydık onların dağılımının normal dağılımı andıracağını söylüyor. Böylece güven aralığı dediğimiz istatistik yöntemleri de buna bağlı kullanabileceğimizi söylüyor. İstatistik testleri de sample mean üstünden çalıştığı için popülasyon dağılımından bağımsız olarak normal dağılım varmış gibi davranabiliyor. ANCAK hatırlamamız gereken bir nokta var. Biz araştırma yaparken tek sample üstünden çalışıyoruz ve burada bir assumption üstünden iş yapıyoruz. O da bu çalıştığımız sample’ın o normal dağılımı oluşturan samplelardan birisi olduğu. Biz bu sample’ın o normal disrtributionı temsil ettiğini assume eder ve analizimizi yaparız.

Görsel örnek ile bakacak olursak da. Popülasyonun dağılımı şu şekilde olsun:

set.seed(123) 
population_size <- 100000 
population <- rexp(population_size, rate = 1)
ggplot(data.frame(x = population), aes(x = x)) +
  geom_histogram(aes(y = ..density..), 
                 bins = 40, color = "black", 
                 fill = "lightblue") +
  labs(title = "Population Distribution 
       (Exponential)", x = "Value", 
       y = "Density") +
  theme_minimal()

CLT kullandığımız zaman:

sample_sizes <- c(30, 100, 500)
sample_means <- list()
for (n in sample_sizes) {
  means <- replicate(1000, 
                     mean(sample(population, 
                                 size = n, 
                                 replace = TRUE)))
  sample_means[[as.character(n)]] <- means
  
  clt_plot <- ggplot(data.frame(means = means), 
                     aes(x = means)) +
    geom_histogram(aes(y = ..density..), 
                   bins = 30, color = "black", 
                   fill = "lightgreen") +
    labs(title = paste("Sampling Distribution 
                       of Means (n =", n, ")"),
         x = "Sample Mean", y = "Density") +
    stat_function(fun = dnorm, args = 
                    list(mean = mean(means),
                         sd = sd(means)),
                  color = "red", size = 1) +
    theme_minimal()
}
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
clt_plot

Burada gördüğümüz üzere dağılım normal dağılımı andırıyor. Bu da bizim bütün istatistik analizlerimizin temelini oluşturan bir mantık. Bundan sonraysa descriptive ve inferential dediğimiz istatistik yaklaşımlarına bakacağız ve uygulamalı olarak istatistik analizini göreceğiz.

Descriptive Statistics

Veri analizine başlamadan önce yapacağımız temel adımlardan birisi de budur. Veriyi temizlemiş ve düzenlemiş olsak bile veri hakkında bilgi almak için temel adımı tanımlayıcı istatistik ile atarız. Bu bize verinin nasıl göründüğü ve ne anlatabileceği hakkında bir fikir verir.

Bu aşama hem veri temizliği yapmamıza yardımcı olur(uç değerleri çıkarmak gibi) hem de istatistik analizine başlamadan önce veriyi anlamamıza ve analizmizin ne yöne gidebileceğini, ne yapmamız gerektiğini öğrenmemize yardımcı olur. Ayrıca veri üstüne bir sunum yapıyorsak da temel olarak bu verilerden çıkan sonuçları gösteririz.

Desciprtive Statistics önemli noktalara değinen farklı ölçümler ile yapılır.

    1. Measures of Central Tendency
    • Mean
    • Median
    • Mode
    1. Measures of Dispersion
    • Range
    • Interquartile Range (IQR)
    • Variance
    • Standard Deviation
    1. Measures of Position
    • Percentiles
    • Deciles
    • Quartiles
    1. Measures of Shape
    • Kurtosis
    • Skewness
    1. Measures of Relationship
    • Correlation
    • Covariance
library(moments)
set.seed(2024)
sayılar <- c(rnorm(980, mean = 50, sd = 10), 
             runif(20, min = 80, max = 100))

Mean: Ortalama anlamına gelir. Verisetindeki sayıların toplamının, verisetindeki toplam element sayısına bölümüdür.

\([ \bar{x} = \frac{1}{n} \sum_{i=1}^n x_i ]\)

mean_normal <- mean(sayılar)

Mean kullanımı en yaygın istatistik ölçülerinden birisidir. Özellikle çok uç değerleri olmayan veriler için kullanabiliriz. Ancak veride uç değerler yaygınsa ve bunların veriyi etkileme ihtimali varsa kullanmak çok doğru olmayacaktır. Bir örnek ile bakalım:

mean_veri <- data.frame(kisiler = 
                          c("Ali Koç", "Onur Gitmez", 
                            "Zeynep Önal", "Ece Uçar"),
                        gelir = c(1000000000, 
                                  50000, 45000, 
                                  60000))
mean_outlier <- mean(mean_veri$gelir)

Bu verisetindeki gelir ortlamasın aldığımız zaman çok yüksek bir sayı ile karşılaşıyoruz. Bunun sebebi de Ali Koç’un gelir değerinin çok yüksek olması. Bu durumun önüne geçmek için başka değerler kullanırız.

Median veya ortanca değer ise verieti küçükten büyüğe sıralandığı zaman ortada kalan sayıdır. Eğer veride çift sayıda eleman varsa ortada kalan iki elementin ortalamasını alarak buluruz.

median_outlier <- median(mean_veri$gelir)
median_normal <- median(sayılar)

Bunu kullandığımız zamansa verimizin gerçek halini daha çok yansıtan bir değeri buluyoruz. Ancak bunun da eksiği bütün veri noktalarını hesaba katmaması. Uç değerlerin de bizim için etkisi olabilir sonuçta.

Ancak istersek uç değerleri çıkarıp mean hesaplaması yapabiliriz. Burada alt ve üstten %10luk bir kesimi atıp ortalamayı hesapladık. Çok tercih edeceğimiz bir yöntem değil veri kaybı oluşturduğu ve çok arbitrary olduğu için.

mean(sayılar, trim = 0.1)
## [1] 50.45771
ggplot(data.frame(x = sayılar), aes(x = x)) +
  geom_histogram(binwidth = 2, fill = "skyblue", 
                 color = "black") +
  geom_vline(aes(xintercept = mean_normal, 
                 color = "Mean"), 
             linetype = "dashed", 
             linewidth = 1) +
  geom_vline(aes(xintercept = median_normal,
                 color = "Median"), 
             linetype = "dashed", linewidth = 1) +
  scale_color_manual(name = "Statistics", 
                     values = c(Mean = "red",
                                Median = "blue")) +
  labs(title = "Distribution with Mean and Median", 
       x = "Value", y = "Frequency")

data_with_outlier <- c(sayılar, 1000)
par(mfrow = c(1, 2))
boxplot(sayılar, main = "Original Data")
boxplot(data_with_outlier, main = "Data with Outlier")

Mod ise veride en çok tekrar eden değerdir. Numerik veriler için çok kullanılmasa bile kategorik verilerde kullanırız.

library(DescTools)
sehirler <- c("Ankara", "Istanbul", "Izmir", 
              "Bursa", "Adana", "Ankara")
Mode(sehirler)
## [1] "Ankara"
## attr(,"freq")
## [1] 2

Measures of Dispersion bize verinin nasıl ve ne derece bir yayılıma sahip olduğunu gösterir. Merkeze yönelik verilere ek olarak variability dediğimiz değişkenlik faktörünü de işin içine katar.

Range: Verideki minimum ve maksimum değerler arasındaki farktır. Basitçe de olsa veri dağılımını bize gösterir ancak uç değerler arasında verinin nasıl dağıldığını göstermez. Bundan dolayı da uç değerlerden çok etkilenir.

\(Range = Maximum - Minimum\)

range(sayılar)
## [1] 17.25714 98.15764
diff(range(sayılar))
## [1] 80.90049

IQR ise verinin %25.noktasında olan sayı ile %75.noktasında olan sayının arasındaki aralığı gösterir. Bunun bir avantajı uç değerlerden etkilenmeden verinin median çevresindeki dağılımını göstermesidir. Boxplot oluştururken de bunu kullanırız ve geçen hafta gördüğümüz üzere de outlier belirlemek için kullanırız.

Hatırlamak gerekirse

\(Q1-1.5IQR\) ve \(Q3+1.5IQR\) outlier olarak kabul edilir.

IQR(sayılar)
## [1] 13.64345

Varyans ise verilerin ortalamadan ne kadar ayrıldığını hesaplar. Karesini almamızın sebebi hem negatif hem de pozitif uzaklıkların olmasıdır. Karesini alarak sadece uzaklığına odaklanabiliriz.

\(\sigma^2 = \frac{\sum_{i=1}^{n} (x_i - \mu)^2}{n}\)

var(sayılar)
## [1] 124.2969

Standard Deviation ise varyansın karekök alınış halidir. Karesini aldığımız zaman varyans verinin gerçek halinden çok daha uzak olacağı için onu normal skalaya oturtmak için yardımcı olur. Zaten normal dağılımda verinin %68’i 1 standard sapma, %95’i iki standard sapma ve %99’u 3 standard sapma uzaklıktadır.

\(\sigma = \sqrt{\frac{\sum_{i=1}^{n} (x_i - \mu)^2}{n}}\)

Veri noktalarının ortalamadan ne kadar uzak olduğunu en iyi anlamamıza yardımcı olan metriktir.

sd(sayılar)
## [1] 11.14885
ggplot(data.frame(x = sayılar), aes(y = x)) +
  geom_boxplot(fill = "lightblue") +
  labs(title = "Boxplot of Sayilar Dataset", y = "Value")

ggplot(data.frame(x = sayılar), aes(x = x)) +
  geom_histogram(aes(y = after_stat(density)), 
                 binwidth = 2, fill = "skyblue", 
                 color = "black") +
  geom_density(color = "red") +
  labs(title = "Histogram with Normal Curve",
       x = "Value", y = "Density")

ggplot(data.frame(x = sayılar), aes(x = "", y = x)) +
  geom_violin(fill = "lightgreen") +
  labs(title = "Violin Plot of Large Dataset", 
       x = "", y = "Value")

Percentile verinin eşit olarak 100 kısma bölünmesiyle oluşturulur. Eğer biz 46.percentile diyorsak bu verilerin %46’sının altında kaldığı noktadır. Bunu isteğimize göre almak için:

quantile(sayılar, probs = 0.3)
##      30% 
## 45.08375

IQR kısmında gördüğümüz quartile ise bunun 4e bölünmüş halidir. Q1 %25, Q2 %50 yani median, Q3 ise %75’tir. Q4 ise kullanılmaz ancak max değerdir.

Z-score ise bir değerin ortalamadan kaç standard sapma uzaklıkta olduğunu göstermek için kullanılır. Değerden ortalamayı çıkarıp standard sapmaya bölerek buluruz.

\(Z-Score = (X- \mu) - \sigma\)

küçük_veri <- c(10, 20, 30, 40, 50)
scale(küçük_veri)
##            [,1]
## [1,] -1.2649111
## [2,] -0.6324555
## [3,]  0.0000000
## [4,]  0.6324555
## [5,]  1.2649111
## attr(,"scaled:center")
## [1] 30
## attr(,"scaled:scale")
## [1] 15.81139

Burada ortalama 30 olduğu için onun z score 0, ve aralıklar da eşit olduğu için diğer sayılar da ona göre dağılmış durumda.

Skewness dağılımın asimetrikliğini gösterir.

Positive skew verilerde sağ kuyruk uzundur. Genelin düşüklerde olduğu ancak az sayıda çok yüksek olan veriler bu tarzdır. Mesela gelir bunu takip eder. İnsaların çoğu ortalama bir gelire toplanmışken çok az sayıda zengin üst sıralarda olur.

Negative skew verilerde ise sol kuyruk uzundur. Gelişmiş ülkelerde ölüm yaşı buna örnek olabilir. İnsanların çoğu 70li 80li yaşlarını görürken erkenden ölen az sayıda insan alt kısımlarda olur.

Skewness
Skewness

Kurtosis ise bir dağılımda kuyrukların ne kadar kalın olduğu, yani kuyruklardaki verinin ne kadar sık bulunduğunu gösterir. 3 tipi vardır.

  • Mesokurtic dediğimiz ve normal dağılımda da gördüğümüz ortalama kurtosise sahip kuyruklar. Burada kurtosis değeri 3 civarındadır.
  • Platykurtic denilen, düşük kurtosise ve ince kuyruklara sahip yani outlier değerlerin seyrek olduğu veriler. Kurtosis değeri 3 altıdır. Merkezin tepesi daha düzdür.
  • Leptokurtic ise kalın kuyruklara, yüksek kurtosise yani daha bol outlier değerlere sahiptir. Kurtosis değeri 3 üstüdür. Merkezin tepesi daha sivridir.
Kurtosis
Kurtosis
library(e1071)
skewness(küçük_veri)
## [1] 0
kurtosis(küçük_veri)
## [1] -1.912
skewness(data_with_outlier)
## [1] 26.00211
kurtosis(data_with_outlier)
## [1] 766.9368

Q-Q Plot ise verimizdeki quantilelları, teorik ve normal bir dağılım ile karşılaştırır. Eeğer düz bir çizgiyti yakip ediyorsa veri normal dağılıyor diyebiliriz.

qqnorm(data_with_outlier)
qqline(data_with_outlier)

Covariance iki değişken arasındaki ilişkinin yönünü belirtir. İlişkinin gücü sayı ile belirtilir ancak bu sayı herhangi bir değeri alabilir ve standardize değildir. Bundan dolayı büyük sayının güçlü ilişki belirtip belirtmediğini bilemeyiz. Covarience sayısı iki verisetindeki sayıya bağlıdır.

\(Cov(X,Y) = E[(X - \mu_X)(Y - \mu_Y)]\)

a <- c(2,4,6,8,10) 

b <- c(1,11,3,33,5) 

print(cov(a, b, method = "spearman"))
## [1] 1.25

Correlation ise standardize ve verilerden bağımsızdır. -1 ve 1 arasında değer alır ve bu hem ilişkinin yönünü hem de gücünü gösterir. Verisetlerinden bağımsız olduğu için de farklı veriler arasında yorumlaması daha kolay olur. Genellikle değişken arasındaki linear ilişkiyi gösterir.

  • Pearson korelasyonu iki değişken arasındaki ilişkinin linear olduğunu varsayar. Outlierlardan çok etkilenir ve verilerin dağılımın normal olması gerekir. Continious dediğimiz verileri de analiz etmeye uygundur.

cor komutu default olarak pearons yapar.

cor(a,b)
## [1] 0.3629504
  • Spearman korelasyonu ise tek yönlü ilişkileri analiz eder ancak ilişkinin linear olmasına gerek yoktur. Ranker verileri yani liker scale gibi olan verileri de analiz etmemize yarar. Eğer ilişkinin linear olmayabileceğini düşünüyorsak bunu kullanabiliriz. Mesela gelir ve eğitim seviyesi arasındaki ilişkiyi bu şekilde ölçebiliriz.
cor(a,b, method = "spearman")
## [1] 0.5
  • Kendall’s Tau ise 2 ordinal veya 1 continious ve 1 ordinal değişken arasındaki ilişkiyi ölçer. Spearman’a göre küçük samplellarda daha iyi çalışır. -1 ve 1 arasındadır.
kendall_result <- cor.test(a, b, method = "kendall")
set.seed(690)
data <- data.frame(
    x = rnorm(100),
    y = rnorm(100),
    z = rnorm(100)
)

Korelasyon matrisi ilişklileri tablo halinde görmemizi sağlar.

cor_matrix <- cor(data)
cor_matrix
##             x          y          z
## x  1.00000000 0.03495521 -0.1362726
## y  0.03495521 1.00000000  0.0451805
## z -0.13627264 0.04518050  1.0000000

Korelasyon plotu da hem ilişkinin gücünü hem de yönünü görsel olarak 1 grafik içinde görmemizi sağlar.

library(corrplot)
## corrplot 0.94 loaded
corrplot(cor(data), method = "circle")

corrplot(cor(data), method = "color", 
         type = "upper", order = "hclust", 
         addCoef.col = "black", 
         tl.col = "black", tl.srt = 45,
         diag = FALSE)

Kategorik verilerde de descriptive statistics analizi yapabiliriz.

set.seed(2024)
categories <- factor(sample(c("A", "B", "C"), 
                            100, replace = TRUE))

Frequency Table her değerin kaç kere tekrar ettiğini görmemize yarar.

freq_table <- table(categories)
freq_table
## categories
##  A  B  C 
## 41 29 30

Proportion Table ise her değerin oranını berlirtir.

prop_table <- prop.table(freq_table)
prop_table
## categories
##    A    B    C 
## 0.41 0.29 0.30

Mod bulmak için R kodu yoktur ancak kendimiz yazabiliriz

find_mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}
mode_category <- find_mode(categories)
print(paste("Mode of the categorical 
            variable:", mode_category))
## [1] "Mode of the categorical \n            variable: A"

Cross-tab veya Contingency Table

Bu tablo ise 2 veya daha fazla gruplu verilerde elementlerin nasıl dağıldığını görmemize yarar. Sıkça gördüğümüz toplamlı tablolar aslında bu çeşittir.

groups <- factor(sample(c("Group1", "Group2"),
                        100, replace = TRUE))
cont_table <- table(categories, groups)
print(cont_table)
##           groups
## categories Group1 Group2
##          A     23     18
##          B     15     14
##          C     15     15

Buna toplarımları da ekleyebiliriz

cont_table_with_totals <- addmargins(cont_table)
cont_table_with_totals
##           groups
## categories Group1 Group2 Sum
##        A       23     18  41
##        B       15     14  29
##        C       15     15  30
##        Sum     53     47 100

Bunları proportion için de yapabiliriz

row_props <- prop.table(cont_table, margin = 1)
print(row_props)
##           groups
## categories    Group1    Group2
##          A 0.5609756 0.4390244
##          B 0.5172414 0.4827586
##          C 0.5000000 0.5000000
col_props <- prop.table(cont_table, margin = 2)
print(col_props)
##           groups
## categories    Group1    Group2
##          A 0.4339623 0.3829787
##          B 0.2830189 0.2978723
##          C 0.2830189 0.3191489
overall_props <- prop.table(cont_table)
print(overall_props)
##           groups
## categories Group1 Group2
##          A   0.23   0.18
##          B   0.15   0.14
##          C   0.15   0.15

SON