16 Aralık 2016 Cuma

Simpson Paradoksu ile Tanışın (Hangi Sonuç Doğru?)

Geçtiğimiz gün ekipten 4 arkadaş ile 2 kişilik 2 takım oluşturduk ve meşhur futbol maçı oyunlarından birini oynadık. Takımların birinde Kise-Özdemir (KÖ), diğerinde ise Altıntaş-Akbal (AA) yer aldı. Toplamda 5 maç yaptık. Mücadelenin sonunda AA takımı iyi oynadıklarını ve kazandıklarını iddia ediyordu. Benim bulunduğum KÖ takımı ise tam tersini düşünüyordu. Acaba hangi takım daha başarılı?

Her bir maç için gol sayılarını aşağıda belirttim. Kolaylık olsun diye maçtaki yüksek skorları yeşil renge boyadım. Sonuçlar şöyleydi :


Sizce AA takımı mı yoksa benim bulunduğum KÖ takımı mı daha başarılı?

Maçları tekil olarak incelersek 2 maç KÖ, 3 maç AA kazanmış. 3>2 (3 büyük 2'den) olduğuna göre AA takımı en fazla maç kazanan takım olmuş diyebiliriz. Peki ya AA takımı KÖ takımından daha başarılıdır diyebilir miyiz? Acele etmeyin! Verilere tekrar bakalım.

Tüm maçlardaki golleri de ek bir kolonda belirtelim. Toplam gol sayısıyla birlikte baktığımızda sonuçlar şöyle görünür:


Hepsini bir arada incelediğimizde KÖ takımı 11 gol atmışken, AA takımı 10 gol atabilmiş. 11>10 (11 büyük 10'dan) olduğuna göre KÖ takımı AA takımından daha başarılı bir oyunculuk sergilemiştir diyebiliriz.

Şaşırdınız mı? AA takımı buna şaşıracak. Bu mücadeleden katıksız bir üstünlük elde ettiklerini düşünüyorlardı. Ancak kazandığını sandıkları başarı, istatistiksel olarak yeterince güvenli değil. Bakış açısını değiştirip tüm sayıları ele aldığımızda KÖ takımının daha başarılı olduğunu görüyoruz. Üzgünüm AA takımı :)

Hangi Sonuç Doğru?


Yukarıda incelediğimiz durum bir tür paradokstur. Paradokslar içinden çıkılamaz bir zihinsel döngü oluşturur.

Paradokslara bir örnek verelim;

Küçük yaşta tahta geçen Fatih Sultan Mehmet sefere giderken babası Sultan Murat'ın ordunun başında durmasını ister fakat Sultan Murat bunu kabul etmez. Fatih babasını ikna etmek şu cümleyi kurar; "Eğer sen padişahsan geç ordunun başına. Yok eğer ben padişahsam emrediyorum ordunun başına geçeceksin!". Nihayetinde Sultan Murat ordunun başına geçmek zorunda kalır.

Matematik yalan söylemez ama İstatistik yalan söyleyebilir. Matematik paradoksların varlığını gözler önüne serer. Ancak çıktıları nasıl değerlendireceğiniz size kalmıştır. Sonuçların en işe gelir şekilde yorumlandığı alan da İstatistik olsa gerek.

Yukarıdaki maç mücadelesi örneğinde karşılaştığımız paradoksun istatistikte özel bir adı bile var. Buna Simpson Paradoksu veya Yule-Simpson Etkisi adı verilir. Bu tür istatistiksel sonuçlara baktığımızda detaydaki bir eğilimin bütünde olmadığını görürüz. Detaydaki çıktı ile bütündeki çıktı çelişebilir. Hangisinin doğru olduğuna karar vermek pek mümkün olmayabilir.

Simpson Paradoksu Nedir?


Bu fenomeni ilk olarak Edward H. Simpson 1951 yılında ortaya atmış, daha sonra Colin R. Blyth 1972 yılında adını Simpson'ın paradoksu olarak ilan etmiştir.

Simpson paradoksu istatistiğin çarpıtılabileceğini, farklı bakış açıları ile farklı sonuçların elde edilebileceğini gözler önüne serer. Bu durumun sebebi çoğu zaman gizli bir değişken olur. Bu değişken yüzünden farklı parçalarda görülen eğilim parçalar birleştiğinde görülmeyebilir. Hatta eğilim tersine dönebilir.

İyi Bilinen Bazı Örnekler


1. Cinsiyet Ayrımcılığı


1973 yılında Berkeley üniversitesi, adaylar arasında seçim yaparken kadınlardan çok erkekleri tercih ettiği iddiası ile dava edildi. Eleme sonuçlarına baktığımızda gerçekten ortada bir cinsiyet ayrımcılığının olabileceğini görüyoruz:


Fakat sonuçları detaylı bir şekilde incelersek başvuran kadınların erkeklere oranla daha fazla kabul edildiği ortaya çıkıyor. İşte en büyük altı bölümün eleme sonuçları:


İncelemenin sonunda davaya bakan bilir kişilerin şaşkın bir şekilde verdiği karar şu olmuş: "Veriler düzgün bir şekilde toplanırsa ... kadınlar lehine küçük ama istatistiksel olarak önemli bir önyargı var."

2. Böbrek Taşı Tedavisi


Böbrek taşı tedavisi ile ilgili gerçek hayat örneğinin de istatistiksel sonuçları bizi şaşırtıyor. Bu sefer iki farklı firmaya ait ilaçların küçük ve büyük böbrek taşı tedavisindeki sonuçlarını ele alıyoruz. Sonuçlar şöyle:


Başarı oranlarına baktığımızda A tedavisi hem küçük hem de büyük taş için başarılı sonuçlar üretmiş görünüyor. Ancak tüm hastaları birlikte düşünürsek B tedavisi daha başarılı. 

Bu durumda eğer böbrek taşı büyüklüğü tespit edilemezse B tedavisi tercih edilmeli. Aksi halde A tedavisi başarılı görünüyor. Daha etkili sonuçlar elde edebilmek için çeşitli kontrolleri yapıp detaylı tanı koyulması gerekir. Hatta daha detaylı tanılar için yeni sonuçların elde edilmesi gerekir.

Alınacak Ders Nedir?


Bu sonuçların paradoks oluşturmasının sebebi gizli bir değişkenin (lurking - confounding variable) olmasıdır. Sonucu etkileyen değişkenin ne olduğunu tespit etmek gerekir. Değişkenler arasındaki ilişki (Association) ve nedensellik (Causation) aynı şey değildir. Mesela yangından çok hasar gören yerlerde daha fazla itfaiye eri bulunur tespitinde gizli değişken yangının büyüklüğüdür. Yoksa itfaiye erleri hasarı arttırıyor çıkarımını yapmak doğru olmaz. (en azından öyle umut ederiz!)

Simpson paradoksu bakış açısı değiştiğinde, istatistiğin insanları nasıl aldatabileceğini anlatıyor. Karar verme sürecinde, sonucun mutlak doğru olduğunu hemen kabul etmeyip, bütünde geçerli olan bir eğilimin parçalarda da geçerli olup olmadığını kontrol etmek gerektiğini aşılıyor. İyi tarafından bakarsak, detaylı teşhis koyamadığımız durumlarda da karar vermemizi kolaylaştırabiliyor.

İlk örneğimiz olan maç mücadelesinin sonucunda umarız dostluk kazanır :)







2 Aralık 2016 Cuma

SQL Server 2016 New Features Etkinliği - Teşekkürler

29 Kasım 2016'da düzenlemiş olduğumuz SQL Server 2016 New Features etkinliğine 250'den fazla kayıt aldık. Kötü hava koşullarına ve trafiğe rağmen salonumuzu dolduracak kadar bir çoğunluğa ulaştık. O gün bizi dinlemeye gelen tüm katılımcılara özellikle teşekkür etmek istiyorum.

Ekibim SQL Server 2016 yeniliklerinden en etkili 6 başlığı seçti ve tüm gün bu konularda oturumlar düzenlemiş oldu. Yoğun olduğumuz bir dönemde hızla organize olup etkinliğe güzel içerikler hazırladıkları için taktire şayanlar. Ekibimi tebrik ediyorum.

Ayrıca giriş kısmında Microsoft'un yeni vizyonu hakkında bizleri haberdar eden Microsoft'dan Behice Funda'ya (Audience Marketin Lead) müteşekkiriz.

Bu organizasyonda emeği geçen ve birlikte bir ekip olarak çalıştığımız Bilge Adam'dan ilgili diğer arkadaşlarıma da Didem ve Gülcan nezdinde teşekkür ediyorum.

Abdullah Kise

Etkinlik programı şöyleydi :


9:3010:00Tanışma ve Açılış Konuşması
10:0010:45Real-Time Operational Analytics
11:0011:45End-to-End Mobile BI
12:0012:45Always Encrypted
Öğle Arası
14:0014:45Stretch Database
15:0015:45PolyBase (Big Data in Database)
16:0016:45In-database Advanced Analytics (R in Database)

Giriş Kısmı :

30 Kasım 2016 Çarşamba

R Dili ile Lorenz Eğrisi Çizmek ve Gini Katsayısını Hesaplamak

Gini katsayısı, Lorenz eğrisini kullanır ve bir dağılımın eşitsizliğini ifade eder. Gini katsayısı 0 ile 1 arasında bir sayıdır. Bu sayı 0'a yaklaştıkça eşit bir dağılım görürüz.

Genelde gelir dağılımının eşitsizlik derecesini ifade etmek için kullanılır. Bu konuda yazmış olduğum ayrıntılı yazıya bir göz atmanızı tavsiye ederim. Çünkü bu yazı onun devamı niteliğinde olacak.

Yazıma şuradan erişebilirsiniz:

Bir Dağılımın Eşitsizlik Ölçüsü - Gelir Dağılımı (Gini Coefficient, Lorenz Curve)
http://www.abdullahkise.com/2016/11/bir-daglmn-esitsizlik-olcusu-gelir.html

Bu yazımızda Gini katsayısının R ile nasıl hesaplandığına odaklanacağız.

Eğer R için gerekli ortamınız kurulu değilse ve R hakkında güzel bir giriş yapmak isterseniz şu yazıma bir göz atmanızı tavsiye ederim:

Adım Adım Veri Bilimi - 1 (R Dünyasına Giriş)
http://www.abdullahkise.com/2016/10/adm-adm-veri-bilimi-1-r-dunyasna-giris.html

Hangi R ortamını kurduğunuz çok önemli değil. Biz Microsoft R Open (MRO) kurulumu üzerinde çalışacağız.

Gini katsayısını hesaplamak için çeşitli yöntemler kullanmak mümkün. Özetle formül şöyleydi:


Ancak integral hesabı yapmak veya hataya açık yöntemleri denemek yerine R paketleriyle kolayca doğrudan sonuç alabilirsiniz. Bu konuda 2 paket öneriyorum. Hakkındaki ayrıntılı bilgilere şu linklerden erişebilirsiniz:


Biz Ineq paketi üzerinden ilerleyelim. Şu adımları atıyoruz:

# Gerekli R paketini indirip kuralım - "ineq"
install.packages("ineq")

# kütüphaneyi ortamımızda kullanmak üzere yükleyelim.
library(ineq)

# Gelir örneğini bir vector şeklinde verelim. Önceki yazımızda bu veri kümesini kullanmıştık.
# vector 1 satırlık matris olarak kabul edilebilir. Aynı veri tipinden elemanlar içerir.
# vector c(1,2,3) şeklinde tanımlanır.
gelirler = c ( 1300, 1500, 2000, 5000, 7000, 8000, 10000, 20000, 60000, 80000 )
# gelirler değişkenine vector atadık

# Gelirlerin grafiğini çizelim.
plot(gelirler)


# Gelirlerin Lorenz Eğrisini çizelim.
# Çizgi rengi için col, Koordinat başlıkları için xlab,ylab parametrelerini kullandık
plot(Lc(gelirler), col = "red", xlab = "Kümülatif Nufus %", ylab = "Kümülatif Gelir %")


# Gini katsayısını hesaplayalım.
ineq(gelirler, type = "Gini")
# Output:   [1] 0.6282341

Bir de projenin tamamını görmek için ekran görüntüsüne bakalım:


Sonuç olarak Gini katsayısı 0.6 çıktı. Bir hayli eşit olmayan dağılıma sahibiz. 

Sizler de farklı veri kümelerinin dağılımlarındaki eşitsizliği bu şekilde inceleyebilirsiniz. Hatta bir adım daha ileri gidip veri kümelerini dosyadan okuyabilir paketlerin dokümantasyonlarına bakarak gelişmiş çalışmalar yapabilirsiniz.

14 Kasım 2016 Pazartesi

Bir Dağılımın Eşitsizlik Ölçüsü - Gelir Dağılımı (Gini Coefficient, Lorenz Curve)

Sayılar bir şeyin niceliği hakkında kesin sonuçlar sunar. Sayılar arasındaki fark, yani değişim olmuş veya olacaklar hakkında bazı fikirler verir. Sayıların oranları nicelikler üzerinde daha rahat düşünme imkanı sağlar. Değişim oranları ise niceliğin trendini (eğilimini) görmemizi ve ortaya çıkacak değişimin gücünü idrak etmemizi kolaylaştırır.

Örneğin; Bir bölgenin toplam geliri o bölgenin ne kadar zengin olduğunu gösterir. Anlamlıdır. Bu zenginliğin bölge halkı tarafından nasıl paylaşıldığını bilmek ise farklı bir heyecan uyandırır. Gelir dağılımındaki eşitsizlik durumu bölge hakkında çok çarpıcı bilgiler sunar. Mesela restoranımızın yeni şubesini nerede açmalıyız? sorusunun cevabını bulmak için bu bilgiden faydalanabiliriz. Servet, bölge halkına eşit şekilde mi dağılmış, yoksa bir kaç kişinin elinde mi tutuluyor? Bunu bilmek kesinlikle yeni şubemizin yerini belirlemede etkili olacaktır. İşte bu tarz çarpıcı bilgileri ortaya çıkarabilmek için bir takım sayıların oranlarından faydalanırız.

Bu yazımızda bir dağılımdaki eşitsizliğin derecesini ölçmemizi sağlayan oranlara odaklanıyoruz. İstatistikçiler bu oranları kullanarak bir yığın sayı hakkında çarpıcı çıkarımlar yapabilmektedir.

Bir Dağılımdaki Eşitsizliğin Görünümü


1905 yılında Max Otto Lorenz gelir dağılımının görüntüsünü, iki ekseninde yüzde değerler bulunan bir grafik (dik koordinat sistemi) üzerindeki eğri ile ifade etmiştir. Bu eğriye Lorenz Eğrisi (Lorenz Curve) denir. 

Yukarıdaki ekonomi örneği üzerinden gidersek; Dik koordinat sisteminde x eksenine en fakirden en zengine sıralanmış nüfusun kümülatif yüzdelik dilimleri yerleştirilir. İlk %20, ilk %40, ilk %60...%100 gibi. y eksenine ise gelirin kümülatif yüzdelik dilimleri yerleştirilir. Gelirin %20'si, %40'ı....%100'ü gibi. 

Sonra nüfusun yüzde kaçı gelirin yüzde kaçına sahip olduğu grafik üzerinde işaretlendiğinde ortaya bir eğri çıkar. Ortaya çıkan bu Lorenz Eğrisi gelir dağılımı hakkında bazı çıkarımlar yapma imkanı verir.

Aşağıdaki kalın gri çizgi ile ayrılmış iki örneği inceleyelim;

Gini Katsayısı - Lorenz Eğrisi - Abdullah Kise
Resmi büyütmek için tıklayın (resmi)

Örnekleri incelediğimizde; (0,0) ve (100,100) noktalarının birleşimi olan 45 derecelik turuncu doğrunun mükemmel eşitliği ifade ettiğini görebiliriz. Çünkü doğru boyunca nüfusun %20'si gelirin %20'sine, %40'ı gelirin %40'ına vs. sahip olduğunu söyleyebiliriz. Bu durumda grafiğin (0,0),(100,0), (100,100) noktalarının birleşimi ile oraya çıkan çizginin ise mükemmel eşitsizliği ifade ettiğini söyleyebiliriz. Bu çizgiyi aşağıdaki grafikte kırmızı renk ile ön plana çıkardık.

Bu durumda matematiksel olarak şunu söylemek mümkün. Lorenz Eğrisi mükemmel eşitlik çizgisine yaklaştıkça gelir dağılımı daha eşit hale gelir. Lorenz Eğrisi mükemmel eşitsizlik çizgisine yaklaştıkça da dağılım giderek eşit olmaktan uzaklaşır.

Peki, bizim gelir dağılımımızın ne kadar eşit olduğunu nasıl ifade edebiliriz?

Dağılımdaki Eşitsizliğin Ölçüsü


1912 yılında İtalyan istatistikçi Corrado Gini bir dağılımın eşitsizliğini ölçebilmek için Gini Katsayısını (Gini Coefficient) geliştirdiğini duyurmuştur. Gini katsayısı Lorenz Eğrisinden faydalanır. Bir takım hesaplar sonucunda 0 ile 1 arasında bir sayı çıkar ve bu sayı eşitsizliğin büyüklüğünü ifade eder.

Aslında mantık çok basit; Lorenz Eğrisinin üst kısmında kalan alan mükemmel eşitliğe ne kadar uzak olduğumuzu ifade eder. Bu alan küçüldükçe daha eşit bir dağılım elde ederiz. Tam da bu fikirle yola çıktığımızda bu alanın mükemmel eşitlik altındaki alana oranı bize Gini Katsayısını verir. 

Gini Katsayısı - Lorenz Eğrisi - Abdullah Kise


G ile gri alanı, S ile sarı alanı ifade edelim. Basitçe şu alan hesabı ile Gini Katsayısını elde edebiliriz;


Lorenz Eğirisi bir eğri olabileceği için alan hesabında integral kullanmak gerekebilir. Eğriyi L(x) diye isimlendirdiğimiz bir fonksiyon ile ifade edersek. Gini katsayısı şu şekilde hesaplanır.



Hataya açık başka pratik yöntemler de mevcut. Onlara burada değinmeyeceğim. Daha sonraki yazılarımızda bir takım senaryolar için hesaplamalar yapacağız. Şimdilik hesap kısmı için bu kadarı ile yetinelim.

Gini Katsayısı ve Lorenz Eğrisi Ne Anlatır Ne Anlatmaz?


Gini katsayısı 0 ile 1 arasında değişen bir sayıdır. Bu katsayı ne kadar zengin olunduğunu ifade etmez. Mevcut zenginliğin nasıl paylaşıldığını ifade eder. Eşitsizlik derecesini ifade eden bu sayı 0'a yaklaştıkça daha eşit bir dağılım görürüz.

İlk resimde de görüldüğü üzere Lorenz Eğrisi mükemmel eşitlik çizgisine sağdaki düşük toplam gelir örneğinde daha yakın. Doğal olarak Gini Katsayısı sağdaki durumda 0'a daha yakın. Tersi de olabilirdi. Sonuç olarak Gini katsayısı toplam gelir hakkında bilgi vermez. Oranlar üzerinden hesaplama yapıldığı için toplam gelir bu katsayıyı etkilemez. Tabi ki sosyolojik olarak toplam gelirin artması dar gelirlilerin kazancını da etkileyebilir. Ancak matematiksel olarak bunu göz ardı ederiz.

Gerçek hayatta da örneğimize benzer sonuçlarla karşılaşmak mümkün. Dünya Gini Katsayılarına baktığımızda 2008 yılında yapılan bir ölçümde Afganistan'ın katsayısı 0,27 görünürken, en yakın 2007 yılında yapılan bir ölçümde Amerika Birleşik Devletlerinin katsayısı 0,45 olduğu tespit edilmiş. Sanırım servet az iken paylaşmak daha kolay oluyor gerçeğinin bir yansıması bu.

Dünya gelir dağılımın ne kadar eşit olduğunu bilmek istersiniz diye düşünüyorum.

Dünya Gelir Dağılımındaki Eşitsizlik Değerleri (Gini Katsayıları)


İşte 2000'li yılların sonlarına doğru ülkelerin vergilendirmeden önceki Gini katsayıları:

Gini Katsayısı - Lorenz Eğrisi - Abdullah Kise

Yukarıdaki raporu Power BI ile yaptım. Ham veriye ve bir takım raporlara şu linkten erişebilirsiniz:

Gini Katsayısı ve Lorenz Eğrisi sadece ekonomide değil, sosyoloji, ekoloji ve mühendislik gibi daha bir çok alanda karşımıza çıkmaktadır. Siz de bu mantıktaki herhangi bir dağılımın eşitsizlik durumunu açığa çıkarmak için Gini Katsayısını ve Lorenz Eğrisini kullanabilirsiniz. Mesela kaynak-iş yükü optimizasyonunu yapabilmek için iş yükünün kaynaklara nasıl dağıtıldığını görmek isteyebilirsiniz.

İstatistik eğlencelidir!

Sonraki yazılarımızda R dilini kullanarak bir dağılımın Lorenz Eğrisinin ve Gini Katsayısının nasıl elde edilebileceğini inceleyeceğiz.

8 Kasım 2016 Salı

SQL Server 2016 Yenilikleri Etkinliği - 29 Kasım 2016

Veri Yönetimi ekibinin konusunda uzman eğitmen ve danışman kadrosu sizlerle buluşuyor. SQL Server 2016 yenilikleri arasından en etkili başlıkları sizler için seçtik. Microsoft SQL Server yetenekleri hakkında güncel gelişmelerden haberdar olmak ve bağlantılarınızı güçlendirmek için sizleri ücretsiz etkinliğimize bekliyoruz.

İçinde bulunduğumuz dönemin gözde konuları olan Big Data, Advanced Analytics, Machine Learning ve Mobile Reporting artık aşina olduğumuz bir ürün olan SQL Server üzerinde de etkisini göstermektedir. Bu konularda oluşan taleplerin karşılanabilmesi için kullanıcı dostu olmayan bir çok uygulama bulabilirsiniz. Ancak bu ürünlere adapte olmak fazlaca bütçe, çok zaman ve yoğun efor ister.

Fakat telaşlanmayın! Microsoft'un kullanıcı dostu yaklaşımı ile geliştirdiği SQL Server 2016 daha az çaba ile daha çok talebe cevap vermeyi mümkün kılıyor. Biz de bu etkinlikte SQL Server 2016 ile birlikte gündemimize düşen ses getirici yeniliklere odaklanacağız. Alışkanlıklarınızı çok fazla değiştirmeden yeni taleplere nasıl cevap verebileceğinizi konuşma fırsatı oluşturacağız.

Etkinlik Detayları:
  • Tarih: 29.11.2016 Saat : 9:30 - 16:45
  • Yer : Maslak Teknokent -1 Konferans Salonu
  • Adres : İ.T.Ü Ayazağa Kampüsü, Koru Yolu ARI Teknokent ARI 3 Maslak / İstanbul
  • Ücretsiz Etkinlik

9:3010:00Tanışma ve Açılış Konuşması
10:0010:45Real-Time Operational Analytics
11:0011:45End-to-End Mobile BI
12:0012:45Always Encrypted
Öğle Arası
14:0014:45Stretch Database
15:0015:45PolyBase (Big Data in Database)
16:0016:45In-database Advanced Analytics (R in Database)


Abdullah Kise

Kayıt olmak için:

14 Ekim 2016 Cuma

SQL Server 2016 Yenilikleri - 4 (Always Encrypted)

SQL Server 2016 ile birlikte irili ufaklı bir çok yenilik duyuruldu.  Bu yeniliklerden bazıları gerçekten diğerlerinden çok daha farklı bir etkiye sahip. Önceki yazılara şu linklerden ulaşabilirsiniz:

SQL Server 2016 BI Yenilikleri - Hızlı Bakış
http://www.abdullahkise.com/2016/09/sql-server-2016-bi-yenilikleri-hzl-baks.html

SQL Server 2016 Yenilikleri - 1 (In-Memory DW - Updatable ColumnStore Indexes)
http://abdullahkise.blogspot.com.tr/2016/03/sql-server-2016-yenilikleri-1-in-memory.html

SQL Server 2016 Yenilikleri - 2 (In-Memory OLTP Geliştirmeleri)

SQL Server 2016 Yenilikleri - 3 (Operational Analytics)

SQL Server 2016 yenilikleri serimizin bu bölümünde en etkileyici yeniliklerden biri olan Always Encrypted özelliğini ele alacağız.

Nedir Bu Always Encrypted?


Bu özellik yeni bir veritabanı şifreleme yöntemidir. Veritabanı şifreleme yöntemleri ile hassas verileri şifreleyip koruyabilirsiniz. Şifrelenmiş veriler ilk bakışta anlamsız ifadelerle temsil edilir ve üzerinde çalışılması engellenmiş olur. Kredi kartı bilgilerini, kişisel kimlik bilgilerini veya sizin için önemli olan ve kolayca kullanılmasını istemediğiniz diğer verileri hassas veri olarak düşünebilirsiniz.

SQL Server'ın önceki versiyonlarında şu veritabanı şifreleme yöntemleri mevcuttu:

  1. Belli alanları korumak istediğinizde kullanacağınız Kolon Seviyesinde Şifreleme (Column-Level Encryption) yöntemi: http://www.abdullahkise.com/2013/09/kolon-satr-bazl-sifreleme-column-level.html
  2. Yedekler dahil tüm veritabanını korumak istediğinizde kullanacağınız Dosya Seviyesinde Şifreleme (File-Level Encryption - Transparent Data Encryption) yöntemi: http://www.abdullahkise.com/2014/02/dosya-database-bazl-sifreleme.html
  3. Sadece yedeklerin farklı bir serverda çalışmasını engellemek istediğinizde kullanacağınız Yedek Şifreleme (Backup Encryption) yöntemi: http://www.abdullahkise.com/2014/08/sql-server-2014-yenilikleri-5-backup.html
Veri şifreleme ve şifre çözme iş yükü, kullanım yoğunluğuna ve şifreleme tekniğine bağlı olarak kritik seviyelere ulaşabilir. Önceki versiyonlarda kullanılan yöntemlerde tüm iş yükü SQL Server üzerindedir. Kritik seviyede seyir eden serverlar bu iş yükünü kaldıramayabilir. Çoğu zaman hem yönetiminin kritik ve zor olması, hem de sisteme ek yük getirmesi nedeni ile şifreleme yöntemleri yerine sıradan yetkilendirme prosedürleri kullanılmaktadır. Ancak sıradan yetkilendirme prosedürleri veri güvenliğini sağlamak için tek başına yeterli değildir. Özellikle veri yer değiştirdiğinde kontrol elden gider.

SQL Server 2016 ile birlikte duyurulan Always Encrypted yöntemi şifreleme ve şifre çözme iş yükünü SQL Server'a değil, istemcilere yükler. Veritabanındaki şifrelenmesini istediğiniz alanlar daima şifreli olarak durur. En yetkili kullanıcılar bile eğer istemezseniz bu verilerin açık halini göremez. Bu yöntem sayesinde verinin sahibi ve veriyi yöneten kolayca ayrılır. 

Always Encrypted - SQL Server 2016 Yenilikleri

Nasıl Çalışır?


Veriler, istemciye şifreli gider. Geliştirilmiş Ado.NET kütüphanesi istemci tarafındaki anahtarı kullanarak şifreyi çözer ve veriyi istemci uygulamasının açık şekilde görmesini sağlar. Uygulama tarafından açık şekilde gönderilen veri aynı şekilde istemci tarafında şifrelenir ve veritabanına şifreli olarak gider. 

İstemci ve veritabanı arasındaki bu süreç otomatik olarak çalışır. .NET 4.6 ile gelen geliştirilmiş Ado.NET kütüphanesi bağlantı cümlesine eklenen bir ifade ve depolanan anahtar yardımıyla işlemleri otomatik olarak yerine getirir. 

Column Master Key olarak ifade edeceğimiz anahtar istemci uygulamların ulaşabileceği bir yerde örneğin; Windows Certificate Store, Azure Key Vault veya bir "hardware security module" (anahtarı yönetmek için kullanılan özel cihazlar) içinde depolanabilir. Ancak bu anahtar SQL Server üzerinde depolanmaz. SQL Server üzerinde sadece Column Master Key tarafından korunan (şifrenmiş) Column Encryption Key tutulur. Column Encryption Key de belirttiğimiz kolonları korur (şifreler).

Diğer şifreleme yöntemlerinde olduğu gibi bu yöntemde de katmanlı bir koruma söz konusu. Yani seçtiğiniz kolonları Column Encryption Key şifreliyor. Column Encryption Key SQL Server'da depolanıyor. Bu önemli anahtarı da istemci tarafında depolanan Column Master Key şifreliyor. Column Master Key'e sahip olan istemciler verileri otomatik olarak temiz haliyle görür. Geri kalan herkes sadece şifrelenmiş metni görür. Bu şekilde şifreleme ve şifre çözme iş yükü istemci tarafına konumlanır. Veritabanında belirtiğimiz kolonlar için sadece şifreli veri yer alır.

Genel olarak istemci tarafında şu değişiklikler yapılır:
  • Connection Stringse "Column Encryption Setting=ENABLED" ifadesi eklenir.
  • Parametreler SqlParameter nesnesi ile gönderilir.
  • Anahtarın (Column Master Key) depolandığı yere göre kodlamada bir miktar farklılık olmaktadır. Eğer anahtar istemci makinedeki Windows Certificate Store'da depolanıyorsa bağlantı cümlesi ve parametre gönderme prensibine uymak yeterli. Ancak diğer depolama yöntemlerinde ruhsat (authorize) alabilmek için bir miktar kod yazmak gerekiyor.

Nasıl yapılır?


Tüm adımları kolayca atmanızı sağlayan Always Encrypted sihirbazını kullanabilirsiniz. T-SQL veya PowerShell komutları da kullanılabilmektedir. İsterseniz her bir nesneyi ayrı ayrı kendi sihirbazları ile oluşturabilirsiniz. Nesnelerin kendi sihirbazları bir miktar esneklik sağlamaktadır.

Biz örneğimizde Always Encrypted sihirbazından yardım alacağız. Hadi başlayalım!

Öncelikle üzerinde çalışmak için bir veritabanı ve tablo oluşturalım. Sonra bu tabloya iki satır veri ekleyip görüntüleyelim :

CREATE DATABASE AlwaysEncryptedDB
GO
USE AlwaysEncryptedDB

CREATE TABLE MusteriBilgileri
(
       Id int identity(1,1) PRIMARY KEY,
       Ad nvarchar(50),
       KartNo char(19)
)

INSERT INTO MusteriBilgileri VALUES ('Abdullah Kise','123 123 123 123'),
                                    ('Veli Uçan','897 897 897 897')


SELECT * FROM MusteriBilgileri

SQL Server 2016 Yenilikleri - Tablo

Yukarıda işaretlediğim KartNo alanı bizim için hassas veri olsun. Bu alanı şifreleyeceğiz.
Şifreleme sihirbazını başlatmak için 'Object Explorer'daki tablomuzu sağ tıklayıp açılan menüden 'Encrypt Columns'ı seçiyoruz.

SQL Server 2016 Yenilikleri - Encrypt Columns

Sihirbazın ilk sayfasında kısa bir bilgilendirme var. İkinci sayfasına geçerek şifrelemek istediğimiz kolonları seçelim. Bu örnekte KartNo kolonunu şifreleyeceğiz:

SQL Server 2016 Yenilikleri - Always Encrypted Wizard - Column Encryption Key

KartNo kolonu için şifreleme tipini (Encryption Type) Deterministic olarak belirtiyoruz. Bu kolonun şifrelenmesi için bir 'Column Encryption Key (CEK)'e ihtiyacımız olacak. Daha önce oluşturduğumuz bir CEK varsa listeden seçebiliriz. Yeni bir tane oluşturmak için yanında (New) ifadasi olan seçeneği seçiyoruz.

Şifreleme tipi hakkında kısa bir bilgi verelim. İki tür şifreleme tipi mevcut:

  1. Deterministic yöntemde temiz veriye göre hep aynı şifrelenmiş değer elde edilir. Bu sayede şifrelenmiş verileri sıralamak, gruplamak, birleştirmek ve indekslemek mümkün olur. Ancak bu yöntem şifreleme paternini keşfetmeyi ve veri hakkında tahminde bulunmayı kolaylaştırır. Özellikle şifrelenen alan çok az benzersiz değer içeriyorsa tahmin etmesi çok kolay olur. Mesela True/False veya cinsiyet, evlilik durumu gibi alanlar kolayca tahmin edilebilir.
  2. Randomized yöntemde paterni bulmak daha zor olur. Sürekli aynı veri için aynı şifreli değer elde edilmez. Daha güvenlidir. Ancak bu durumda sıralamak, gruplamak, birleştirmek ve indekslemek mümkün olmayacaktır.
Bu adımda seçimlerimizi yapıp bir sonraki adıma geçiyoruz. CEK, SQL Server tarafında duran bir anahtardır. Bu anahtarı korumak (şifrelemek) için Column Master Key (CMK) oluşturmamız gerekir. CMK istemci uygulamaların erişebileceği şekilde depolanır.

SQL Server 2016 Yenilikleri - Always Encrypted Wizard - Column Master Key

Daha önce oluşturduğumuz bir CMK'yı seçebiliriz veya yukarıdaki gibi yeni bir tane oluşturabiliriz. 

Yeni bir tane oluştururken CMK'nın nerede depolanacağını belirtiyoruz. Burada iki seçenek var fakat CMK'nın kendi sihirbazını kullanarak daha fazla seçeneğe erişmek mümkün. Bir CMK, Windows Certificate Store, Azure Key Vault veya bir "hardware security module" (anahtarı yönetmek için kullanılan özel cihazlar) içinde depolanabilir.

Sonraki adımda bir uyarı alıyoruz. Var olan tablodaki kolonları sonradan şifrelemek istediğimiz için sihirbaz bazı adımları bizim yerimize atacak. Bu adımlar; kolonu şifrelenmiş bir tablo oluşturmak, verileri bu tabloya şifreleyerek taşımak, eski tabloyu silmek ve yeni tablonun adını eskisi olarak atamak şeklindedir. Uyarıda bu işlemler esnasında tablo kullanılırsa veri kaybı olabilir diyor. Yani bu işlemi rastgele bir zamanda yapmamak gerekir. Tablonun kullanılmadığından emin olmak gerekir.

SQL Server 2016 Yenilikleri - Always Encrypted

İlerleyen adımlarda yaptığımız ayarların özetini ve çalıştırdığımızda işlemin sonucunu görebiliriz.

Şifreleme işlemi başarıyla tamamlandığında veritabanı içerisinde bir takım nesneler oluşur. Nesnelerin Create scriptlerine göz atarak ne gibi kodlar kullanıldığını inceleyebilirsiniz. İsterseniz bu nesnelerin kendi sihirbazlarını veya ilgili kodları kullanarak adım adım Always Encrypted özelliğini aktif edebilirsiniz.

SQL Server 2016 Yenilikleri - Always Ecrypted - Şifreleme

Always Encrypted özelliğini aktif ettik ve tablomuzdaki KartNo alanını şifreledik. Tablonun önceki ve sonraki haline bir bakalım:

SQL Server 2016 Yenilikleri - Always Encrypted - Şifreleme Sonucu

Artık sysadmin bile bu alanı ruhsat (authorize) almadan göremez. Bu ruhsat Column Master Key (CMK) ile alınabilir. İstemciler CMK yardımıyla verileri otomatik olarak şifresiz görür ve üzerinde çalışabilir.

Örneğimizde CMK'yı Windows Certificate Store üzerinde oluşturmuştuk. Bu bizim kendi makinemizde oluştu. CMK'yı görmek isterseniz Run/certmgr.msc veya Run/certlm.msc ile açılan pencereden Personal klasörü altındaki Certificate klasörüne bakabilirsiniz.

SQL Server 2016 Yenilikleri - Always Encrypted - Windows Certificate Store
CMK kendi makinemizde oluştuğu için kendi makinemizdeki bir istemci verilerin açık haline otomatik olarak erişebilir. Test etmek için istemci uygulaması olarak SSMS'i kullanabiliriz. 

Tek yapmamız gereken SSMS ile bağlanırken Options/Additional Connection Parameters tabından bağlantı cümesine ek bir ifade belirtmek. Bu ifade "Column Encryption Setting=ENABLED" ifadesidir. Bu şekilde bağlandığımızda artık şifreleme ve şifre çözme işlemi otomatik olarak gerçekleştir. Veritbanında verileri şifreli olmasına rağmen SSMS üzerinde bu bağlantı için verinin şifresiz halini görürüz.

SQL Server 2016 Yenilikleri - Always Encrypted - Column Encryption Settings

Veritabanına bu bağlantı üzerinden erişip veriyi bu kolon dahil dönüştürmek istediğimde şifrelediğim kolonla ilgili hata alıyorum.Sanıyorum SSMS'in bağlantı sağlayıcıları ile ilgili geçici bir durum. 

İstemci tarafından temiz veri girişinin otomatik olarak şifrelendiğini test etmek için uygulama yazmak yerine Import-Export sihirbazını kullanıyorum. Siz de Object Explorer / Veritabanınız (örneğimizde AlwaysEncryptedDB) / Task / Import Data ile bu sihirbazı çalıştırabilirsiniz.

Sihirbazın ilk adımında veri kaynağını seçiyoruz. İkinci adımında ise şifreleme yaptığımız veritabanını (örneğimizde AlwaysEncryptedDB) seçiyoruz. Ancak bağlantı sağlayıcısının .NET Provider olmasına dikkat edelim ve Column Encryption Setting parametresini Enabled olarak değiştirelim.

Import Export

Sonraki adımlarda kaynak ve hedefteki kolon eşleştirmesini yaptıktan sonra aktarımı başlatalım. Testimizde veri aktarımı şifreli kolon dahil başarıyla gerçekleşti. Kayıtları şifreli ve otomatik şifre (Column Encryption Settings=Enabled) çözen bağlantı üzerinde listelediğimizde testin başarılı olduğunu görebiliriz.


Konu ile ilgili ayrıntılı dökümanlara şu adresten erişebilirsiniz:

Sonuç olarak bu konu ile ilgili şunları söyleyebiliriz; 

SQL Server 2016 ile birlikte gelen Always Encrypted özelliği yeni bir veritabanı şifreleme bakış açısı sunuyor. Önceki yöntemlerde şifreleme ve şifre çözme iş yükü SQL Server üzerindeyken bu yöntemde iş yükü tamamen istemci üzerinde. Veritabanında veri şifreli halde bulunuyor. CMK'dan ruhsat alan istemci şifreli veriyi alıp otomatik olarak şifresini çözüyor ve üzerinde çalışabiliyor. Veriyi yöneten ve veriyi okuyan güvenle ayrışabiliyor. Yani bu yöntem diğerlerinden farklı olarak daha az şifreleme iş yükü, daha güvenli veri yönetimi imkanı sunuyor.

3 Ekim 2016 Pazartesi

Adım Adım Veri Bilimi - 1 (R Dünyasına Giriş)

Microsoft son zamanlarda Advanced Analytics ve Big Data başlıklarına odaklanmış durumda. Bu başlıklardaki ihtiyaçlara cevap verecek yeni ürünler-özellikler Microsoft tarafından geliştirilmekte ve hem lokalde hem de bulutta hızla duyurulmakta.

Bu başlıkların odak noktası veri analizi. Veri analizi denilince de akla ilk gelen şeylerden biri de R oluyor haliyle. Peki nedir bu R? Ne işe yarar? Microsoft bu konuda neler yapıyor?

Bazı temel soruların cevaplarını R dünyasına giriş niteliği taşıyan bu yazımızda ele alalım istedim.


R Nedir?


R (ar) denildiğinde akla birkaç şey birlikte gelir. Bunlar R dili, R dilinin çalıştığı platform (distribution veya engine diye düşünebilirsiniz.), R paketleri ve geliştirme ortamı (IDE).

R programlama dili (ilk çıkışı 1993 - Yeni Zelanda Auckland Üniversitesi'nde araştırma projesi olarak) 20 yılı aşkın süredir kullanılan ve geliştirilen açık kaynak kodlu bir script dilidir. İstatistiksel hesaplamalar, tahmine dayalı analizler (Predictive Analytics), veri görselleştirme ve raporlama alanları söz konusu olduğunda en çok tercih edilen dildir. Karmaşık istatistiksel hesaplamalar yapıp sonuçları çok geniş yelpazedeki görsellerle sunabilme yeteneği olduğu için özellikle üniversitelerce desteklenmiştir. İstatistiksel Analiz ve Veri Bilimi çalışmaları için yoğun olarak tercih edilen bu dil bir tür standart haline gelmiştir.

R Kime Ait?


R Kuruluşu kar amacı gütmeyen bir organizasyondur. Bu organizasyon çeşitli ülkelerdeki üniversiteler ve kurumlar tarafından desteklenmektedir. Dünya çapındaki bağışçılar sayesinde "Development Core Team - Geliştirme Çekirdek Ekibi" R dilini ve ortamını ayakta tutmakta dahası gittikçe güçlendirmektedir. Arkasında canlı ve geniş bir topluluk desteği mevcuttur.
R, Free Software Foundation'ın GNU General Public License (GNU Genel Kamu Lisansı) altında açık kaynak kod olarak dağıtılmaktadır. Ücretsizdir.

Ayrıntılı bilgilere şu linkten ulaşabilirsiniz:
https://www.r-project.org/

Farklı R Dağıtımları Mevcut Mu?


R'ın imkanlarını içeren farklı ticari ve kurumsal dağıtımlar da mevcut. Mesela Microsoft'un satın alıp geliştirdiği REvoluation R (yeni adı Microsoft R Open), paralel işlem yeteneğine sahip ParallelR, R+ ve RStat bunlardan bir kaçı.

R dilini farklı R dağıtımları (platform - ortam) üzerinde kullanabilirsiniz. Dağıtımlar temel kütüphaneler bakımından bir biri ile %100 uyumludur. Ancak aralarında performans, R kodlarının paylaşım kolaylığı, ek kütüphaneler ve hata ayıklama başlıklarında farklılıklar olabilmektedir. Bu dağıtımlar Windows, Mac ve Linux üzerinde çalışabilmektedir (kısıtlar ve farklılıklar olabilir).

Gücünü Nereden Alır?


R'ın yetenekleri çalışma ortamına yüklenen paketlerle genişletilebilir. Bu paketler çeşitli analiz teknikleri, gelişmiş grafik özellikleri, farklı türden dosya okuma/yazma gibi bir çok yeteneği hizmetinize sunar. Şuanda (Ekim 2016) CRAN (Comprehensive R Archive Network - Geniş Kapsamlı R Yazılım Ağı) havuzunda erişilebilir durumda  9273 yetenekli R paketi yer almaktadır. Bu paketleri ortamınıza yükleyebilir içlerindeki istatistiksel ve görsel kütüphaneleri kullanarak derin veri analizi çalışmaları yürütebilirsiniz. Yeni paketler geliştirmek ve bu havuzu genişletmek de mümkün. Hatta gerektiğinde C, C++, Fortran programlama dilleriyle yazılmış kodları da kullanarak çalışma zamanında yoğun hesaplama gereken görevler icra edilebilmektedir.

Alfabetik sıraya göre CRAN paketlerine şu linkten ulaşabilirsiniz :
https://cran.r-project.org/web/packages/available_packages_by_name.html

Başlıklara göre bakmak isterseniz şu linki kullanabilirsiniz:
https://cran.r-project.org/web/views/

R Kodları Nereye Yazılır?


R ortamını kurduktan sonra komut satırı üzerinde veya çeşitli grafik arayüzlü  geliştirme ortamlarında (IDE) üzerinde çalışmaya başlayabilirsiniz. R kodlarını kurulum yapmadan çalıştıran websiteleri de mevcut. Grafik arayüzlü geliştirme ortamlarından bazıları şunlar; R Tools for Visual StudioRStudioJava Gui for RRattle GUIStatistical Lab vs.

Ekosistemdeki Yeri Nedir?


R konusu istatistiksel veri analizi, veri madenciliği, makine öğrenmesi, veri yönetimi, veri bilimi, büyük veri, veri görselleştirme gibi analiz ve raporlama odaklı daha bir çok konu ile ilişkilidir. Dolayısıyla bazı teknolooji şirketleri ürünlerinde R'a destek vermektedir veya tamamen R temelli hizmetler sunmaktadır. R her geçen gün daha da popüler olmaktadır. Odağı veri analizi olmasına rağmen araştırmaya göre popülerlik sıralamasında 6. sırada görünüyor.



Microsoft da son zamanlarda bu alanda ciddi adımlar atmakta. Hatta geçtiğimiz sene (2015) REvolution R dağıtımını kendi bünyesine kattı. Performans, geliştirme ortamı, kod paylaşımı ve hata ayıklama gibi çeşitli başlıklarda iyileştirmeler yaparak Microsoft R Open adıyla açık kaynak R dağıtımını yayınladı. şu linkten bilgi alabilirsiniz:
https://mran.revolutionanalytics.com/

Microsoft'un R dünyasına yakınlaşmasının nimetlerini yeni ürünlerinde görmek mümkün. SQL Server 2016 özelliklerinden R in Database adıyla duyurulan yenilik sayesinde R kodlarını veritabanı içerisinden çağırıp kullanmak mümkün. Paralel çalışma imkanı olan R Server'ın lokal kurulumu, Azure ML içerisinde R kodlarıyla işlem yapılabilmesi, Azure HDInsight üzerinde R Server oluşturma imkanı olması, Azure üzerinde Hadoop dağıtımlarında kullanılabilmesi, Power BI ve SSRS üzerinde R görsellerinin sunulabilmesi gibi çeşitli senaryolar da mevcut.

Nereden başlayabilirim?


R dilini öğrenmek oldukça kolay. Ancak uzman olmak biraz zor. Çünkü bir çok kütüphanenin kullanımı yoğun istatistik ve matematik bilgisi gerektiriyor. Kodlarla çalışmanın doğal yan etkileri de var tabi. Yazmak oldukça yavaş, okumak ve değişiklik yapmak da çok kolay sayılmaz. Ancak koca koca analizleri komut satırları ile ifade edip dağıtmak oldukça pratik.

Bu konuda bir çok eğitim sitesi bulmak mümkün. R dilini çeşitli yönlerinden ele almaktalar. Temelleri konusunda hemen hemen aynı şeyleri her yerde görebilirsiniz. Bizler de serinin devamında daha kısa özetlerle temellere değineceğiz.

R ile ilgili ne gibi başlıklar var diye merak edenler şu siteye bir göz atabilirler:
http://www.r-tutor.com/

Haydi kurulumla başlayalım!

R ile çalışmaya başlamak için 2 yol sunayım:

1. Yol : CRAN (Comprehensive R Archive Network)

  • Kurulum
    • Şu linkten tüm muhtemel indirme linklerine erişebilirsiniz : https://cran.r-project.org/mirrors.html
    • Ben Turkiye altında görünen Pamukkale Üniversitesi'ne ait olan şu linki tıkladım: https://cran.pau.edu.tr/
    • Açılan linkte işletim sisteminize ait linki tıklayalım (ben Windows seçtim). 
    • Yeni açılan sayfada şu base linkini tıklayarak R platformunu indirip kurabilirsiniz: https://cran.pau.edu.tr/bin/windows/base/
    • Eğer varsayılan ayarlarda kurulum yaptıysanız R logolu kısayol masaüstünüze gelecektir. Kısayolu tıklayıp R kodlarını yazmaya başlayabilirsiniz. 
    • print("Merhaba Dünya") yazıp sonra Enter tuşuna basarak komutu çalıştırın
  • Not: Grafik arayüzü gelişmiş başka bir ürünle çalışmak isterseniz RStudio veya R Tools for Visual Studio ile çalışmanızı öneririm. RStudio'yu şu linkten indirebilirsiniz : https://www.rstudio.com/
2. Yol : MRAN (Microsoft R Application Network)


Serinin devamında ikinci seçenek üzerinden ilerleyerek ekran görüntüleri paylaşacağım. Ancak siz kendinizi rahat hissettiğiniz bir ortamda çalışabilirsiniz. Odaklanacağımız giriş seviyesi komutlar tüm dağıtımlarda çalışacaktır.

R'ı özetlersek; Başarılı veri analizleri yapabilmek için gereklidir. Hızlıca öğrenilebilir fakat ustalaşması zaman alır. Standart haline gelmiş, yetenekli ve güçlü bir ortam sunar. Destekçisi ve takipçisi çoktur.