<!DOCTYPE html>
Bilişimde süregelen devrimin istatistikler üzerinde bir etkisi var. Daha fazla grafik ve hesaplama otomatikleştirildikçe verilerin keşifsel analizi daha kolay hale geliyor. Çok büyük ve çok karmaşık veri kümelerinde istatistiksel çalışmalar yapmak artık mümkündür.
İstatistiksel çıkarım, örneklem istatistiklerin örnekleme dağılımlarına dayanmaktadır. Bir örnekleme dağılımı, popülasyondan birçok rastgele örnekleme dayanmaktadır. Bootstrap, örnekleme dağılımını, en azından yaklaşık olarak, yeniden örnekleme yöntemiyle sadece bir örneklemden alınan yeni örneklemler ile bulmanın bir yoludur.
Bradley Efron bunu ilk kez 1979’da bu makalede tanıttı.Bootstrap, örnek verilerin değiştirilmesi ile örneklemeye dayanır. Bu teknik, herhangi bir istatistiğin standart hatasını tahmin etmek ve bunun için bir güven aralığı (CI) elde etmek için kullanılabilir. Bootstrap özellikle Confidence Interval’nin kapalı bir formu olmadığında veya çok karmaşık bir formda olduğunda yararlıdır.
Orijinal veri setinden rastgele bir n gözlem örneği seçmekten oluşur. Daha sonra modeli değerlendirmek için bootstrap veri kümesi adı verilen bu alt küme kullanılır.Bu prosedür çok sayıda tekrarlanır ve daha sonra bootstrap tahmininin standart hatası hesaplanır. Sonuçlar, modellerin performansındaki varyansın bir göstergesidir.Örneklemenin değiştirme ile yapıldığına dikkat edin, bu da aynı gözlemin önyükleme veri kümesinde birden fazla kez olabileceği anlamına gelir.
Bu çalışmadaki amacımız model parametrelerini tahmin etmek için bootstrap yeniden örneklemenin nasıl kullanılacağını göstermektir.Buradaki modelleme hedefimiz ,TidyTuesday veri kümesine göre şeker bira üreticilerinin malta göre ne kadar kullandığını tahmin etmektir.Bunu yapmak için bootstrap yeniden örnekleme kullanacağız
library(knitr)
library(tidyverse)
library(tidyr)
library(lubridate)
library(janitor)
library(tidymodels)
library(gridExtra)
library(ggplot2)
library(plotly)
library(gapminder)
library(gganimate)
library(magick)
Bira Üretim verisi Alkol ve Tütün Vergisi ve Ticaret Bürosu’ndan (TTB) geliyor.Veri Seti 1440 gözlem ve 9 değişkneden oluşmaktadır.Bira üretim verisi için değişkenler aşağıdaki gibidir.
Değişkenler;
data_type
material_type : Tahıl ürünü, Toplamlar, Tahıl Dışı Ürün (temel olarak tahıllara karşı tahıllar)
year : Yıl
month : Ay
type : Malzeme türünden gerçek satır öğesi.
month_current : Bu yıl / ay için mevcut varil sayısı
month_prior_year : Aynı ay için önceki yıl varil sayısı
ytd_current : Cari yılın kümülatif yılı
ytd_prior_year : Önceki yıl için kümülatif yıl
brewing_materials <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-03-31/brewing_materials.csv')
brewing_materials
breawing_filtered<-brewing_materials %>%
filter(type %in% c("Malt and malt products","Sugar and syrups",
"Hops (dry)"),
year<2016,
month !=12) %>%
mutate(date=paste0(year,"-",month,"-01"),
date=lubridate::ymd(date))
Burada yaptığımız işlem ana veri kümesinden “Malt and malt products”,“Sugar and syrups”,“Hops (dry)” farklı bira demleme malzemlerininin 2016 yılından önceki gözlemleri aldık ve yeni bir değişken olarak date (tarih) değişkenini yıl/ay/gün olacak şekilde veriye ekledik.
breawing_filtered
Bazı farklı bira malzemeleri zamanla nasıl değiştini inceleyelim
ggplotly(ggplot(breawing_filtered,aes(date,month_current))+
geom_point(aes(color=type))+
ggtitle("Date - Month Current")+
xlab("Date")+
ylab("Month Current"))
breawing_filtered %>% filter(type==c("Malt and malt products","Sugar and syrups")) %>%
group_by(year) %>%
ggplot(., aes(date,month_current)) +
geom_point(size = 6,aes(color=type))+
labs(title = 'Date: {frame_time}', x = 'Date', y = 'Month Current') +
transition_time(date)
Veriyi analize hazır bir hale getirebildik sayılır devam edelim.
breawing_filtered %>%
select(date,type,month_current)
Veriden date,type,mont_current değişkenlerini seçildi
breawing_filtered %>% select(date,type,month_current) %>%
pivot_wider(names_from = type,
values_from=month_current)
Seçilen değişkenler type(malzeme türü) değişkenine göre pivotlandı(sütunlara ayrıldı) ve malzeme türlerinin sahip oldukları month_current(Bu yıl / ay için mevcut varil sayısı) değişkeni değerleri ile birleştirildi.
brewing_materials<-breawing_filtered %>% select(date,type,month_current) %>%
pivot_wider(names_from = type,
values_from=month_current) %>%
janitor::clean_names()
Bir data.frame döndürülerek değişken adları temizlendi
brewing_materials
“malt_and_malt_products”,“sugar_and_syrups”,“hops_dry” bira üretim malzemlerininin yıllara göre farklı kalıplarda/desenlerde olduğu grafikten söyleyebilriz.Bira üreticilerinin maltlara göre ne kadar şeker kullandığını ölçmek istiyoruz.
ggplotly(ggplot(brewing_materials,aes(malt_and_malt_products,sugar_and_syrups))+
geom_point(color ="orange")+
ggtitle("Malt ve Malt Ürünleri - Şeker ve Şuruplar")+
xlab("Malt ve Malt Ürünleri")+
ylab("Şeker ve Şuruplar"))
Bira üreticileri daha fazla malt kullanıyor ise bir nevi daha fazla şeker kullanıyorlar.Bu lineer durumu ve aralığı gösterebilmek adına lineer regresyon aralığını grafiğie ekleyelim.
ggplotly(ggplot(brewing_materials,aes(malt_and_malt_products,sugar_and_syrups))+
geom_point(color="orange")+
geom_smooth(method="lm")+
ggtitle("Malt ve Malt Ürünleri - Şeker ve Şuruplar")+
xlab("Malt ve Malt Ürünleri")+
ylab("Şeker ve Şuruplar"))
Bootstrap regresyonu, parametrik varsayımların geçersizliğinden etkilenmemektedir. Örneğin, basit doğrusal regresyonda bir Bootstrap algoritması aşağıdaki gibi hesaplanmaktadır: Öncelikle Xi ve Yi değişkenleri için n sayıda gözlemden oluşan bir örnek seti elde edilmektedir. Gözlemlerin yer değiştirmesiyle n adet gözlem yeniden örneklenmektedir. Yeni gözlem çifti (X* ij) , (Y* ij ) (i=1,…n; j=1,…B) olacaktır. En küçük kareler yöntemi kullanılarak ( boj ) ve (b1j) tahminleyicileri hesaplanmaktadır. Yeniden örnekleme, yeni gözlem çiftlerinin elde edilmesi ve regresyon katsayılarının tahminlenmesi işlemleri bir çok kez tekrarlanmaktadır. Örneğin 1000 kez bu basamaklar tekrarlandığında β 0 ve β1 için 1000 adet Bootstrap tahmini elde edilecektir. Bu tahminlerin ortalaması alınarak b0 ve b1 elde edilmektedir. Elde edilen bu tahminler Bootstrap regresyon tahminleridi
Bira üreticileri daha fazla malt kullandıklarında daha fazla şeker kullanıyorlar.Şeker kullanımı bağımlı değişken ve mal ve malt ürünleri bağımsız değişken olmak üzere lineer regresyon modelini kuralım.
beer_fit<-lm(sugar_and_syrups~ 0 + malt_and_malt_products,data=brewing_materials)
summary(beer_fit)
##
## Call:
## lm(formula = sugar_and_syrups ~ 0 + malt_and_malt_products, data = brewing_materials)
##
## Residuals:
## Min 1Q Median 3Q Max
## -30678583 -6462561 412298 8460012 22807661
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## malt_and_malt_products 0.207764 0.003432 60.54 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11150000 on 87 degrees of freedom
## Multiple R-squared: 0.9768, Adjusted R-squared: 0.9765
## F-statistic: 3665 on 1 and 87 DF, p-value: < 2.2e-16
qf(0.95,1,87)
## [1] 3.950587
F1,87,0.05 = 3.950587 olduğundan Fh = 3665 > 3.950587 veya p-değeri < 0.05 olduğundan H0 : β1 = 0 hipotezi reddedilir yani oluşturulan regresyon modeli anlamlıdır.
tidy(beer_fit)
Burada, malt-şeker ilişkisinin basitleştirilmiş bir görünümünü elde etmek için kesişmeyi sıfıra ayarlamayı seçiyoruz (yani, bira üreticileri malt kullanmıyorla ise şeker de kullanmıyorlar).Başka bir deyişle orjinden geçen basit doğrusal regresyon mdelini kuruyoruz. Bu durumu serbest bırakabiliriz hem beta_0 hem de beta_1 katsayısını tahmin edebiliriz.
Bootstrap yeniden örnekleme, daha sağlam tahminler ve güven aralıkları sağlar.Modelin estimate değerini en küçük kareler yöntemi ile bulabiliriz.Fakat bu değeri bulabilmenin daha farklı bir yolu olan bootstrapp metodunu inceleyeceğiz. Artık bootstrap ile güven aralığı oluşturmaya başlayabiliriz.
İlk olarak, bir dizi bootstrap örneği oluşturalım.
beer_boot<-bootstraps(brewing_materials,
times = 1000,
apparent = TRUE)
beer_boot
Ardından,bootstrap örneklerinin her birine bir lineer model geliştirelim.Bu sayede estimate değerleri için gelebilecek aralıkları görelim.Model sonuçlarının bir veri çerçevesini oluşturmak için map () ile tidy () öğesini kullanabiliriz.
beer_models<-beer_boot %>%
mutate(model = map(splits,~lm(sugar_and_syrups ~ 0 + malt_and_malt_products,
data=.)),
coef_info=map(model,tidy))
beer_coefs<-beer_models %>% unnest(coef_info)
beer_coefs
Veride estimate değerleri ile alakalı bootstrap ile bu şekilde bir aralık oluşturmak ve bunun üzerine yorum yapmak varsayımlarla hareket etmekten daha güçlü bir sonuç verir.Veriyi 1000 kez tekrarlayarak bir nevi kitleyi simule etmiş olduk. Ve daha güçlü bir tahmin elde ettik.
Bootstrap yeniden örnekleme ile elde ettiğimiz tahmin değerlerinin başka bir deyişle örnekleme dağılımını inceleyelim.
ggplotly(ggplot(beer_coefs,aes(estimate))+
geom_histogram(alpha=0.7, fill = "cyan3")+
ggtitle("Fistogram of Estimates")+
xlab("Estimate")+
ylab("Count"))
Daha önceden bahsetmiş olduğumuz örneklem histogramı ortaya çıktı.Bu dağılımın nerede merkezlendiğini ve bu görselleştirmeden ne kadar geniş olduğunu görebiliriz.Bu örneklem historamı tahmin parametresinin hangi aralıklta olabileceğine ilişkin bir aralıktır. Şimdi bir güven aralığı oluşturalım. Rsample paketi içersinde bunu yapabilmemizi sağlayan int_pctl() biçiminde basit bir komut bulunmaktadır
Genel olarak herhangi bir θ parametresi için güven aralığı, θ parametresinin nokta tahmininden daha fazla bilgi vermektedir. Güven aralıklarının oluşturulmasında çeşitli Bootstrap metodları önerilmektedir.
Klasik Bootstrap Metodu ile yaklaşık güven aralıklarının oluşturulmasında Bootstrap dağılışının örnek persentilleri kullanılmaktadır. B Bootstrap örnek sayısı ve , tahminleyicisi olmak üzere sıralanmış değerler, gibidir. Bootstrap güven aralığı, bootstrap sapmanın ve bootstrap standart hatanın tahminlemesine dayanmaktadır.
Yüzde 99 güven ile tahmin değerine ilişkin bir güven aralığı oluşturduk.
int_pctl(beer_models, coef_info,alpha = 0.01)
Ayrıca bu tahmin modellerinden bazılarını bootstrap örneklerine göre görselleştirebiliriz.İlk olarak, yeniden örneklenen her veri noktası için uygun değerleri almak üzere augment () yöntemini kullanalım.
beer_aug <- beer_models %>%
sample_n(200) %>%
mutate(augmented = map(model, augment)) %>%
unnest(augmented)
beer_aug
ggplotly(ggplot(beer_aug, aes(malt_and_malt_products, sugar_and_syrups)) +
geom_line(aes(y = .fitted, group = id), alpha = .2, col = "cyan3") +
geom_point())
lm_plot<-brewing_materials %>% ggplot(aes(malt_and_malt_products,sugar_and_syrups))+
geom_point(color="orange")+geom_smooth(method="lm")
bootstrapLm<-ggplot(beer_aug, aes(malt_and_malt_products, sugar_and_syrups)) +
geom_line(aes(y = .fitted, group = id), alpha = .1, col = "cyan3") +
geom_point(color="orange")
grid.arrange(bootstrapLm,lm_plot,nrow=1)
## `geom_smooth()` using formula 'y ~ x'