Veri Bilimi İyi Alışkanlıklar

ne-yapiyoruz.png

Veri bilimi uygulamaları genelde üç aşamadan oluşur:

1 Prototip ve uygulama ayrımı

1.1 Prototip aşaması:

dongu.png

  • Veri, yerel makinada dahi olsa değiştirilemez kabul edilmelidir.
  • Bu aşamada verinin tamamı kullanılmak zorunda değildir. Prototip aşamasını hızlandırmak için verinin rastgele seçilmiş bir alt kümesi kullanılabilir.
  • Verinin dönüştürülmesi gerekiyorsa mutlaka yeni bir kopyası yapılmalıdır. Asla eldeki verinin üzerine değişiklik yapılmamalıdır.
  • Kullanılan dilin

    • esnek olması (mesela dynamically typed)
    • defter (notebook) ya da REPL desteği vermesi

    faydalı olacaktır. Örneğin: R, python, lisp, clojure.

  • Yapılan her işlem, ya baştan otomatize edilmeli ya da her adım ayrıntılı bir şekilde raporlanmalıdır.
  • Her deney kodu, ya elle numaralandırılmalı ya da bir sürüm kontrol yazılımıyla takip edilmelidir.
  • Yazdığınız her şeyi bir iş arkadaşınızın okuyup takip etmeye çalışacağını düşünerek yazın. Bu iş arkadaşınız sizin 6 ay sonraki haliniz olabileceğini de unutmayın.

Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.

1.2 Ürün aşaması:

Ürün aşamasında artık deneylerimiz bittiği ve ne yapacağımızı bildiğimiz için gerçek kodumuzu yazabiliriz.

sonuc.png

Bu aşamada seçilecek dilin

  • Veri analizimizin üzerinde çalıştırılacağı platform tarafından desteklenen
  • Statically typed
  • Debugging ve profiling destekleyen

bir dil olması tercih edilmelidir. Örneğin: C++, Java, Scala, Haskell.

2 Deney yapılırken dikkat edilmesi gereken noktalar

  • Eğer veri ve kod aynı makina üzerinde olacaksa o zaman kod, veri ve raporların dizinlerinin ayrı olmasına dikkat edin.
  • Eger veri üzerinde işlem uygulayacaksanız, ya da değişiklik yapacaksanız (örneğin veriyi temizlemek gibi) verinin yeni biçimi için yeni bir sürüm açın.
  • Yaptığınız her deneyi, hem raporlayın, hem de açıklayın. Unutmayın ki, yazdığınız koda ve yeni ürettiğiniz veriye eninde sonunda geri dönüp bakacaksınız. Gelecekteki kendize iyi davranın.
  • Raporları ve açıklamalarınızı deney sonuçlarından mümkünse kes/yapıştır yaparak yazmayın. Raporlarınızı ve açıklamalarınızı canlı kod içeren gerçek veri üzerinde çalışan programlarla hazırlamaya özen gösterin.

2.1 Otomasyon ve tekrarlanabilirlik

Kod otomasyonu için kullanılabilecek araçlar:

  • R ya da python kullanıyorsanız o zaman bash, zsh, perl ya da python kullanabilirsiniz.
  • C ve C++ için kullanılan make, cmake ve arkadaşları
  • java, scala ya da clojure kullanacaksanız ant, gradle, sbt, leinengen, boot ya da benzeri araçlar.

Raporlama için kullanılabilecek araçlar:

  • Eğer R kullanıyorsanız r-markdown, knitr ya da üzerinde R çalışan jupyter defterlerini kullanabilirsiniz.
  • Eğer python kullanıyorsanız o zaman üzerinde python çalışan jupyter defteri kullanın.
  • Eğer emacs kullanmaya alışıksanız, o zaman raporlarınız için org-mode kullanabilirsiniz.
  • Eğer deney sonuçlarınızı bir akademik makale içinde kullanacaksanız \laTeX\ ve sweave kullanmanızı öneririm.

2.2 Defterler

Kullanılabilecek araçlar

2.3 Kod ve veri ayrımı

Bir veri analizcisinin proje dizini şöyle görünebilir:

dizin.png

2.4 Sürüm numalama (git ve arkadaşları)

Git bir sürüm kontrol sistemidir. Bir dizin içindeki dosyaları takip eder. Aşağıda git'in takip ettiği bir dosyanın olabileceği durumların bir diagramını görmektesiniz.

git-flow.png

Komutlar:

  • Sıfırdan başla: git init
  • Ekle: git add <dosya ad(lar)ı>
  • Çıkar: git rm --cached <dosya ad(lar)ı>
  • Kabul et: git commit <dosya ad(lar)ı> -m <açıklama>
  • Geri al: git checkout <dosya ad(lar)ı>

2.5 Eğitim ve değerlendirme verilerinin ayrılması

testler.png

  • Size deney yapmanız için verilen veriyi iki parçaya bölün: eğitim verisi ve doğrulama verisi.
data <- read.csv("veri/butun-veri.csv", sep=",", header=TRUE)
N <- nrow(data)

sec <- sample(1:N, 0.02*N, replace=FALSE)
altkume <- data[sec,]
M <- nrow(altkume)

secsec <- sample(1:M, 0.3*M, replace=FALSE)
egitim <- altkume[secsec,]
write.csv(egitim, file="data/egitim.csv", sep=",", header=TRUE)

dogrulama <- altkume[-secsec,]
write.csv(dogrulama, file="data/dogrulama.csv", sep=",", header=TRUE)
  • Eğitim verisinden bir model oluşturun. Bu modelin iyi çalışıp çalışmadığını doğrulama verisi üzerinde test edin.
D <- nrow(dogrulama)
model <- glm( y ~ x , data=egitim, family="gaussian")
sonuc <- predict(model, dogrulama$x)
hata <- (1/D)*sqrt(sum(sapply(sonuc-dogrulama$y, function(u) { u*u })))
  • Elinizdeki modelin iyi çalıştığından emin olunca gerçek veri (production data) üzerine taşıyın.
sonuc <- predict(model, data$x)
  • Raporlarınızı ara sonuçları çıkarmak için kullandığınız programdan elde ettiğiniz bir programlamla çıkarın.

3 Deneyler bitti, modelimizi kurduk. Sırada ne var?

3.1 Raporlama

Deneylerden bir model çıkarttınız. Bu modeli elinizdeki doğrulama verisi üzerinde test ettiniz. Çıkan sonuçlardan elinizdeki modelin istatiksel olarak iyi bir model oluşturduğuna karar verdiniz. Elinizdeki modeli gerçek veri üzerinde çalıştıracaksınız. Ancak bu sonuçların verinin sahibi ve veriden eldek edilecek sonuçları kullanacak olan kişi ve kurumlara onların anlayabileceği bir şekilde anlatılması gerekir.

kod-hiyerarsisi.png

3.2 Basit bir örnek

Varsayalım ki elimizde bir web sitesini ziyaret etmiş bir grup kullanıcı verisi olsun. Varsayalım ki sunucu bu kullanıcılara aynı sayfanın iki değişik şeklini sunmuş olsun: A ve B. Yine varsayalım ki, elimizde bu kullanıcıların belli bir reklam linkine basıp basmadıklarının bilgisi de olsun.

head(data)
  Tipi    Link
1    A Basmadi
2    A   Basti
3    A Basmadi
4    B Basmadi
5    A   Basti
6    B   Basti

Bizden istenen, sitenin şeklinin reklamlara basma davranışı üzerinde bir etkisi olup olmadığını test etmek olsun.

sonuc <- table(data)
sonuc 

    Link
Tipi Basmadi Basti
   A      24     4
   B      99    11

İlk bakışta A tipi sayfanın reklam linkleri konusunda başarılı sonuç verdiği görülse de (A'da 4/28 = 0.14 başarı oranına rağmen, B'de bu oran 11/110 = 0.10 olarak görünüyor) bunu daha dikkatli analiz ettiğimizde görüyoruz ki

karsilastirma <- binom.test(4,28,p=11/110)
karsilastirma

	Exact binomial test

data:  4 and 28
number of successes = 4, number of trials = 28, p-value = 0.5206
alternative hypothesis: true probability of success is not equal to 0.1
95 percent confidence interval:
 0.04033563 0.32665267
sample estimates:
probability of success 
             0.1428571

elimizdeki veri web sitesinin A ve B tipi biçiminin reklamlar konusunda farklı sonuçlar verdiğinden emin olamıyoruz. Daha fazla veri toplamamız gerekiyor. Ne kadar veriye ihtiyacımız var?

nekadar <- power.prop.test(p1=0.14,p2=0.10,sig.level=0.05,power=0.9,alt="one.sided")
nekadar


     Two-sample comparison of proportions power calculation 

              n = 1128.552
             p1 = 0.14
             p2 = 0.1
      sig.level = 0.05
          power = 0.9
    alternative = one.sided

NOTE: n is number in *each* group

Bu sonucu raporlarsak şu şekilde sunabiliriz (r-markdown)

Elimizdeki veri web sitesinin A tipi biçiminde reklamlara basma
oranını yüzde `r floor(100*sonuc[1,2]/sum(sonuc[1,]))` ve B tipi biçiminde reklamlara 
basma oranını da `r sonuc[2,2]/sum(sonuc[2,])` olarak göstermektedir.  
Ancak bu sonuçları istatiksel olarak karşılaştırdığımızda A tipi 
sayfada reklamlara basma oranının gerçek değerinin yüzde `r floor(100*karsilastirma$conf.int[1])` 
ile yüzde `r floor(100*karsilastirma$conf[2])` arasinda olduğunu 
görmekteyiz. İstatiksel olarak sağlıklı bir sonuç alabilmemiz için 
web sitesinin her iki şekli için en az `r floor(nekadar$n)` tane 
veri noktasına ihtiyacımız bulunmaktadır.

Bu durumda elimizdekı veri, A tipi sayfanın daha iyi sonuç verdiği 
konusunda olumlu işaretler verse de kesin bir sonuç çıkartamıyoruz.
Sayfa düzeninin şu anda değiştirilmemesini, ancak daha sağlıklı bir
analiz için eldeki deneylerden daha fazla veri toplanmasını öneriyoruz.

Yukarıdaki rapor şu şekilde görünecektir:

Elimizdeki veri web sitesinin A tipi biçiminde reklamlara basma oranını yüzde 14 ve B tipi biçiminde reklamlara basma oranını da yüzde 10 olarak göstermektedir. Ancak bu sonuçları istatiksel olarak karşılaştırdığımızda A tipi sayfada reklamlara basma oranının gerçek değerinin yüzde 4 ile yüzde 32 arasinda olduğunu görmekteyiz. İstatiksel olarak sağlıklı bir sonuç alabilmemiz için web sitesinin her iki şekli için en az 1128 tane veri noktasına ihtiyacımız bulunmaktadır.

Bu durumda elimizdeki veri A tipi sayfanın daha iyi sonuç verdiği konusunda olumlu işaretler verse de kesin bir sonuç çıkartamıyoruz. Sayfa düzeninin şu anda değiştirilmemesini ancak daha sağlıklı bir analiz için eldeki deneylerden daha fazla veri toplanmasını öneriyoruz.

Date: 29 Ocak 2016

Author: Atabey Kaygun

Created: 2016-02-05 Fri 23:42

Validate