R programlama dili kullanarak ham veriye şekil verme, düzenleme ve analiz etmenin ne kadar etkin olduğu, veri sektörüyle az da olsa alakası olan herkes tarafından bilinmektedir. Bu yazıda, son birkaç yılda özellikle veri bilimi alanında yükselişi süren istatistiksel programlama dili R’ın, Microsoft’un raporlama aracı olan Power BI ile entegrasyonundan bahsedeceğim. Başlamadan önce yazının nasıl işleyeceğine dair birkaç bilgi vermek istiyorum. Yazıda yine herkesin aşina olduğu ve önceki makalelerimde de kullandığım Northwind veritabanını kullanacağım. İlk adım olarak R üzerinden SQL Server’a bağlantı kurarak Northwind veritabanından ihtiyacım olan veriyi çekecek daha sonra ise bu veriyi ihtiyacım olan şekle getireceğim. Son şeklini almış olan veriyi daha sonra R script kullanarak veri aktarma yoluyla Power BI üzerine yükleyeceğim. Son aşamada ise Power BI üzerinde bu verinin görselleştirmesini yapacağım.

Bunları yapmadan önce şunu söylemeliyim ki R programı kendi başına da görselleştirme konusunda çok etkindir. R yüklendiğinde “default” olarak gelen grafik sözdizimi yeterince iyi grafikler geliştirebiliyorken, R kullanıcıları tarafından çok tercih edilen “ggplot2” paketi ile de üst düzey grafikler geliştirilebilir. “ggplot2” paketini diğer grafik sözdizimlerinden ayıran özelliği, “Grammer of Graphics” yani gramer grafiği adı verilen ve tabaka tabaka grafik oluşturmaya yarayan kendine has sözdizimidir. Tabii ki bu yazıda bunun detaylarına değinmeyeceğim ve sadece konumuzun çizgisinde kalacağım.

Başlamadan önce bir diğer belirtmem gereken nokta ise yazıda R programının kendi arayüzünü değil, R Studio programının arayüzünü kullanacağım. Bunu yapmamın sebebi ise R Studio’nun daha gelişmiş bir arayüze sahip olması ve çalışma açısından kolaylık sağlaması. Bunun dışında kodlama dili açısından tabii ki bir fark yok. R Studio’yu açıp yeni bir script oluşturarak başlayalım.

1

R Studio içerisinde üstteki gibi File -> New File -> R Script diyerek yeni bir script açıyorum ve açtığımda aşağıdaki gibi ekranda beliriyor.

2

Script’in adı gördüğünüz gibi “default” olarak Untitled 1. Adı değiştirmek için kaydet butonuna basalım ve kaydederken aynı zamanda adını da değiştirelim. İlk yapmamız gerekenin SQL Server’a bağlanarak Northwind veritabanına erişmek olduğunu yukarıda söylemiştim. Fakat R üzerinde çalışanların bildiği bir nokta vardır ki, R, “Open-Source” yani Açık-Kaynak bir yazılım dili olduğu için herkes kendi geliştirmelerini yapabilir, kendi fonksiyonlarını yazabilir ve bunları paketler halinde R kullanıcılarına sunabilir. Bizim de bu yazıda kullanacağımız fonksiyonların bazıları R’ı yüklediğinizde içerisinde otomatik olarak bulunan paketlerdeyken, bir başka değişle herhangi bir fazladan yükleme gerektirmezken, bazıları ise otomatik var olmayan paketlerde olduğundan bu paketleri indirip kurmamız gerekiyor. Ben bu yazıda R üzerinde otomatik olarak bulunmayan 3 farklı paketten yararlanacağım. Bunlar; RODBC, dplyr ve ggplot2. Bu yüzden öncelikle bu paketleri indiriyorum.

3

Script’in adını kutucuk içine aldığım şekilde değiştirdim. Koda bakacak olursak, “install.packages” komutu gerekli paketleri indirmek için kullanılan komuttur. Dikkat ederseniz 3 farklı paket indiriyorum ve bunların hepsi tek komutla iniyor. Eğer üçü için de ayrı ayrı komutu tekrarlasaydık da yine paketler başarılı bir şekilde inerdi. Fakat zaman kazandırması açısından “c()” fonksiyonu içerisinde paket adlarını tırnaklar içinde ve aralarına virgül koyarak yazdım. String ifadeleri tırnak içerisinde yazıyoruz. “c()” fonksiyonu ise R’da içine girilen elemanlardan vektör oluşturmayı sağlar. Bu fonksiyon sayesinde 3 paket tek bir vektör halinde işleme sokuluyor ve üçü de tek komutla iniyor. R, vektör tabanlı çalıştığı için bu tarz veri birleştirmelerini genelde vektör oluşturma fonksiyonu ile yapacağız. Bir başka dikkat çektiğim nokta ise “#” işaretini kullanarak yazdığım yorum. Kodlama yapılırken yorumların aktif olarak kullanılması her zaman fayda sağlar. Komut çalıştıktan sonra konsola şu mesajlar gelecektir.

4

Paketlerin başarı ile yüklendiği bildiriliyor. Devam edelim. Paketleri yüklemek, maalesef kullanıma açmak için yeterli değil. Yüklenen paketin kullanılabilmesi için, konsola çağrılması gerekir. Bunu da aşağıdaki kod ile yapıyoruz.

5

Yukarıdaki kod bloğunda kullandığım “library” fonksiyonu, yüklenmiş herhangi bir paketi konsola çağırarak kullanıma açar. Bunu yapmanın tabii ki birden fazla alternatif yolu bulunmakta. Fakat ben konudan sapmamak için burada bunlardan bahsetmeyeceğim. “Library” fonksiyonunu üstteki gibi toplu bir biçimde kullanamadığımız için, her paketi tek tek çağırdım. Buradaki paketlerden hangilerini ne amaçla kullanacağımdan biraz bahsedeyim. “RODBC” paketi, SQL Server üzerinden Northwind veritabanına bağlanmamızı sağlayacak. “dplyr” paketi, veri manipülasyonu konusunda çok etkin bir paket olduğundan veriye şekil vermede onu kullanacağız. ggplot2 paketini yüklememin sebebi ise, Power BI üzerine yükleyip görselleştirmesini yaptığımız verinin bir de R üzerinde grafiğini çıkararak karşılaştırma yapmak. Yazı ilerledikçe bunların hepsi netleşecek. Şimdi SQL’e bağlanarak veritabanına erişelim. Öncelikle, SQL ile aramızdaki bağlantıyı sağlayacak bir köprü gerekiyor.

6

Üstteki kod bloğunda yaptıklarımı detaylıca açıklayayım. İlk satırda, üstte bahsettiğim beni SQL’e bağlayacak olan köprüyü oluşturuyorum. “con” adında bir nesne yaratıp, sağ taraftaki fonksiyonun sonucunu o nesneye atıyorum. “odbcDriverConnect” fonksiyonu, veritabanına açık bağlantı sağlar. Biz açtığımız bu açık bağlantıyı “con” nesnesine atadık. Fonksiyonun içinde ise tek argüman kullandık. “connection” argümanı, bağlantının detaylarını içerir. Göz atacak olursak; öncelikle hangi driver’ı kullanarak SQL Server’a bağlanmak istediğimizi belirtiyoruz. Sonrasında Server adını veriyoruz. Burada “.” kullanmamın amacı, bilgisayarımdaki yerel server’a bağlanıyor olmam. Sonrasında veritabanı adı geliyor ve güvenilir bağlantı sağlanıp sağlanılmayacağı bilgisi. İlk satır bu şekilde. İkinci satırdaki komutla, oluşturulan bu “con” nesnesinin R üzerindeki sınıfı, bir diğer değişle tipi nedir onu göstermek istedim. Son komut ise “con” nesnesini konsola çağırarak, detaylarını getiriyor. Çalıştırdıktan sonra konsol üzerindeki sonuca bakalım.

7

Gördüğünüz gibi ilk satırın sonucunda bir değer dönmüyor. İkinci satırın sonucunda ise R bize “con” nesnesinin türünün “RODBC” olduğunu söylüyor. Son satırda da “con” nesnesinin detaylarını görebiliyoruz. Burada fonksiyonda kullandığımız bilgilere ek olarak bazı bilgiler bulunmakta. Örneğin UID değeri, hangi kullanıcı ile bağlandığımızı belirtiyor. Karşılığının boş olması ise, SQL Server’a “Windows Authentication” kullanarak bağlanıldığını gösteriyor. Bağlantıyı sağlayacak olan nesneyi oluşturduktan sonra sırada veriyi R üzerine almak geliyor. Bunu yapmak için de tabii ki gerekli SQL sorgusunu yazacağız. Gerekli SQL sorgusunu yazıp veritabanına göndereceğiz ve istediğimiz veri böylece R üzerine gelecek. Sorguyu yazmadan önce tabii ki nasıl bir veri istediğimizi ve amacımızın ne olduğunu belirtelim. Bulmak ve görselleştirmek istediğimiz veri, kategorilere göre en çok kazandıran ürünler olacak. Biliyorsunuz ki Northwind veritabanında ürünler, bu ürünlerin kategorileri ve siparişlerdeki satışları bulunmakta. Benim buradaki amacım her kategori içerisinde tutar bazında en çok kazanç getiren ürünler nelerdir bunu görmek. Bunun için aşağıdaki kodları kullanacağım.

8

SQL sorgusunu veritabanına göndermek için kullandığımız komut “sqlQuery” komutu. Bu komutun ilk argümanı “channel” yani R ile SQL Server arasındaki bağlantıyı kuracak olan kanal. Bu kanal nedir? Tabii ki yukarıda oluşturduğumuz köprüyü sağlayacan olan “con” nesnesi. Burada R’a söylemek istediğimiz ise SQL Server’a, “con” nesnesini kullanarak ulaşması gerektiği. İkinci argüman ise “query” argümanı, yani gönderilecek olan sorguyu içeren argüman. Burada SQL sorgusunun detaylarına girmeyeceğiz çünkü bu bizi konudan saptıracaktır. Son kısımda yaptığım ise bu fonksiyonun sonrasında oluşacak ve R üzerine gelecek olan verisetini “Data” adlı bir nesneye atamak. Sonuçları görecek olursak:

9

Yukarıda görüldüğü gibi “Data” nesnesi oluştu ve istediğimiz veri bu nesneye atandı. Bu verisetinin tabiiki çok daha fazla satırı ve kolonu var fakat ben burda sadece görsel amaçlarla fonksiyonun düzgün çalıştığını göstermek için ufak bir kısmını aldım. Veri ile alakalı değinilmesi gereken bir nokta var. Öncelikle bunu göstereyim:
10

11

Verisetinde UnitPrice ve UnitPrice.1 adında iki farklı kolon var. İkinci resimde görüyorsunuz ki ProductID.1 ve OrderID.1 adında da iki kolon var. Bu isimlendirmeler aynı kolon adından iki tane bulunmasından kaynaklanıyor. R, otomatik olarak bir tanesinin adını bu şekilde değiştiriyor. UnitPrice kolonlarından ilki ürünün güncel fiyatını gösterirken, ikincisi yani UnitPrice.1 kolonu ise, o tarihte satıldığı siparişteki fiyatını gösteriyor. Bu durumda biz en çok kazanç getiren ürünleri aradığımız için, bize bu ikinci kolon gerekli. Buradan yola çıkarak kategorilere göre en çok kazandıran ürünleri bulmak için bize hangi kolonların gerekli olduğunu belirleyelim. Böyle bir işlem için öncelikle kategori ve ürün adlarına ihtiyacım var. Bunun dışında sipariş esnasında satıldığı fiyat, adet ve indirim adedi gerekiyor. Ayrıca bunlara ek olarak ben sipariş numarasını da alıyorum. Yani bir anlamda elimizdeki verisetini küçülterek, sadece işimize yarayacak olan kolonları alıp, başka bir verisetine atacağız. Bunu da aşağıdaki gibi yapıyoruz:
12

Burada yaptığımız işlem, “Data” nesnesinden köşeli parantez kullanarak bir altkümeyi çıkartmak. Köşeli parantezin içerisindeki virgülün solu satırları, sağı sütunları temsil eder. Eğer üstteki gibi boşluk bırakarak ya da herhangi bir şey yazmayarak virgül koyarsanız, bu tüm satırlar ya da tüm sütunları ifade eder. Üstteki kod üzerinden gidecek olursak, sadece “c()” yani vektör fonksiyonu içerisinde yazdığım kolon adlarını “Data” nesnesinden tüm satırları ile beraber alıyorum. Köşeli parantez içindeki virgülün sol tarafı boş olduğu için tüm satırları, sağ tarafı ise vektör içerisinde adı geçen kolonları belirtiyor. Sonuca bakacak olursak:

13

Yazdığımız kolonlar tüm satırları ile beraber gelmiş durumda. Bu da bizim istediğimizin gerçekleştiği anlamına geliyor. Şimdi veriyi bu şekilde aldığımıza göre ufak bir düzeltme yapalım. “UnitPrice.1” kolonunun adının artık daha fazla bu şekilde kalmasına gerek yok çünkü tekilleşti. Adını düzeltip olması gerektiği hale getirelim.

14

names() fonksiyonu kolon adlarını getiren komuttur. Burada names(NewData) derken bu verisetindeki tüm kolon adlarından bahsediyoruz. Bizim adını değiştireceğimiz kolon da 4.sıradaki olduğundan, yine köşeli parantez ile 4.elemanı çıkartarak ona “UnitPrice” değerini atıyorum. Bu da kolonu istediğim biçimde düzenliyor. Şimdi, elimizdeki bilgilerle kategorilere göre en çok kazandıran ürünleri bulmamız mümkün değil. Bu yüzden veri üzerinde bazı işlemler ve şekillendirmeler yapmamız gerekiyor. Öncelikle “kazandıran” derken, bize bir kazanç tutarı gerekli olduğunu görebiliyoruz. Bu yüzden, ürünlerin satıldıkları siparişler içerisinde bize getirdikleri ciroları hesaplayıp verisetine eklememiz gerekiyor. Daha sonra işlemlerimizi bu kolon üzerinden yürüteceğiz. Aşağıdaki kodlar bize istediğimiz kolonu hesaplayarak verisetimize ekleyecek:
15

“$” işareti R’da bir verisetinin herhangi bir kolonuna başvurmak için kullanılır. Yani “NewData$UnitPrice” ifadesi, NewData verisetinin UnitPrice kolonu anlamına geliyor. İşlemin sağ tarafına bakacak olursak, NewData üzerindeki UnitPrice kolonu, Quantity kolonu ve 1-Discount kolonu ifadelerini birbirleriyle çarparak ciroyu hesaplıyoruz. Yani ürünün o siparişte satıldığı “fiyat * adet * indirim” denklemini hesaplamış oluyoruz. Ciro kolonu normalde verisetimizde yok fakat olmayan bir kolonu dolar işareti ile R’a gösterdiğinizde, R otomatik olarak o kolonu oluşturur ve üstteki kodda da sağ taraftaki işlem sonucunda oluşacak olan değerleri o kolona atar. Sonuca bakacak olursak:
16

Ciro kolonu verisetimize eklenmiş durumda. Devam edelim. Bundan sonrasında veri setimiz şekil verilmeye hazır hale geldi. Artık veri üzerinden R kodları vasıtasıyla her kategorinin en çok kazandıran ürünlerini bulmamız gerekiyor. Aşağıdaki kod bloğu ile bu işlemi gerçekleştiriyorum. Bloğun detaylarını açıklayacağım.

 

17

Üstteki kod bloğunda kullandığım fonksiyonlar “dplyr” paketinin fonksiyonlarıdır. Öncelikle “%>%” operatöründen bahsedeyim. Bu operatör, solundaki nesneyi sağındaki fonksiyonun ilk argümanına atar. Yani “NewData %>% group_by(CategoryName, ProductName)” ifadesi, NewData verisetini kategori adı ve ürün adına göre gruplar. Üstteki bloğa bakacak olursak, ilk satırda şunu söylüyoruz. Zincirleme fonksiyonlar sonrasında oluşacak olan verisetini “FinalData” nesnesine atıyoruz. Öncelikle ikinci satırdaki kod ile NewData verisetini CategoryName ve ProductName kolonlarına göre grupluyoruz ki toplam ciroyu hesaplayacağımız için bu kolonlara göre gruplamamız gerekli. Böylece her grubun toplam cirosuna bakacağız. Üçüncü satırda, söylediğimiz gibi üst satırda oluşan her grup için “Ciro” kolonunu topluyoruz ve böylece toplam ciroyu buluyoruz. Bu da yeni bir kolon oluşmasını sağlıyor ve bu kolonun adını da “Toplam_Ciro” koyuyoruz.

4.satırda artık her grubun toplam cirosu hesaplanmış olduğu için, bu cirolardan en yüksek olanlarını almamız gerekiyor ve böylece her gruptaki toplam ciro değerlerine büyükten küçüğe olmak üzere rank numaraları veriyoruz. Yani bir kategoride 3 ürün varsa bu ürünlerden toplam cirosu en büyük olanın rank numarası 1 olmak üzere diğerleri 2 ve 3 olmak üzere numaralar veriliyor. Büyükten küçüğe olmayı sağlayan ise orada “desc” fonksiyonu. 5. satırda bu rank numaralarından sadece 1 olanları, yani en yüksek olanları filtreleyerek diğer satırları atıyoruz. Bizim ihtiyacımız olanlar sadece en yüksek olanlar. 6.satırda ise bir önceki satırda oluşmuş olan “Rank” kolonunu verisetinden eksilterek sadece ilk 3 kolonu, yani kategori adı, ürün adı ve toplam ciro değerini alıyoruz. “select” fonksiyonu içerisindeki “1:3” ifadesi 1’den 3’e kadar olan kolonları seçmek anlamına geliyor. Son satırda ise “arrange” ifadesi var. Bu ifade, içine girdiğimiz kolona göre verisetini sıralar. “Default” olarak küçükten büyüğe sıraladığı için, sıralamak istediğimiz kolonun başına “-” koyuyoruz ki bu da büyükten küçüğe sıralamak anlamına geliyor. Son aşamada elimizdeki veriseti artık aşağıdaki gibi:

18

Elimizde tam da istediğimiz gibi her kategorinin en çok kazandıran ürünü artık var. Eğer kodların nasıl çalıştığı hakkında kafa karışıklığı oluştuysa, kodları satır satır çalıştırarak her satır sonucunda oluşan verisetini incelemenizi tavsiye ederim. Böylece kod bloğunun nasıl çalıştığı anlaşılacaktır.

İstediğimiz bilgileri içeren veriseti artık hazır. Veriyi SQL’den çektik ve işleyerek istediğimiz hale getirdik. Şimdi yazının başında bahsettiğimiz gibi, veriyi Power BI üzerine aktaracak ve orada görselleştireceğiz. Programı açalım ve veriyi aktaralım.

19

Öncelikle üstteki gibi “Get Data” menüsünden “More” diyorum ve ek veri kaynakları bölümüne geçiyorum.

20

Karşımıza gelen sayfada “R script” i seçiyorum ve devam ediyorum. Daha sonra aşağıdaki ekran geliyor.

21

Bu noktada neler yaptığımıza dikkat çekmek istiyorum. Power BI üzerindeki bu kısım, herhangi bir R scripti kullanarak R kodları vasıtasıyla, istediğimiz verisetini elde etmeye yarıyor. Biz R üzerinde bu verisetini elde edecek kodları zaten yazdığımız ve verisetini elde ettiğimizi teyit ettiğimiz için, bu noktada kodların tamamını buraya kopyaladım. Böylece kodlar Power BI üzerinde çalışarak bize istediğimiz veriyi getirecek. Fakat, bizim R script’imizde en üstte bulunan “install.packages” komutunu buraya ekledim. İsterseniz siz ekleyerek de deneyebilirsiniz fakat hata verecektir. OK butonuna bastıktan sonra karşımıza aşağıdaki sayfa geliyor.

22

Script çalıştıktan sonra, kodlar sonucunda oluşan yani bizim üstte oluşturduğumuz tüm verisetleri karşımıza geliyor. Bizim ihtiyacımız olan tabii ki “FinalData” veriseti. Sol taraftan onu tikliyerek “Load” butonuna basıyoruz.

23

Son aşamada artık veri hazır bir şekilde “FIELDS” kısmına gelmiş durumda. Bundan sonra görselleştirmelere geçebiliriz. Bar ve pasta grafiklerle veriyi görselleştirelim.

25

İlk grafik üstteki şekilde. Bu grafiği oluşturmak için aşağıdaki ayarları Power BI üzerinde yapıyoruz.

24

26

Altına ise bir pasta grafik ekliyoruz. Bunun için de aşağıdaki şekilde ayarlamalar yapıyoruz.

28

27

Sonuçta karşımıza çıkan rapor da aşağıdaki gibi oluyor.

29

Raporun görselliği konusunda çok da başarılı olmasam da, en azından ana temayı size aktarabildiğimi düşünüyorum :)). Artık yazının son kısmına geçmeye hazırız. Aynı grafikleri R üzerinde de oluşturarak, Power BI grafikleriyle karşılaştırma yapacağız.

İlk kısımdaki bar grafiği oluşturmak için aşağıdaki kodları kullandım.

30

Kodun ilk satırında, oluşacak olan grafiğin y eksenindeki sayıların bilimsel gösterim ile grafiğe dökülmesini iptal ediyoruz. Böylece direk sayıların kendilerini göreceğiz. İkinci satırda verisetini, x ve y eksenlerinde hangi kolonların bulunması gerektiğini ve oluşacak olan barların içinin hangi kolon ile doldurulmasını istediğimizi söyledik. Üçüncü satır bar grafik kullanmak istediğimizi belirtirken dördüncü satırda eksenleri kaydırarak grafiğin yatay olarak gelmesini istediğimizi ve son satırda ise başlığı belirttik. Sonuçta oluşan grafik aşağıdaki gibi oldu.

31

İkinci kısımdaki pasta grafiğe geçecek olursak;

32

Bir önceki bar grafik koduna benzer olarak burada coord_polar() fonksiyonu ve içindeki argümanlar bar grafiğin bir pasta grafiğe dönmesini sağlıyor. Sonraki aşamalar ise tamamen grafiği süsleme aşamaları.  Renklere ve grafik üzerindeki yazılara dair ayarlamalar diyebiliriz. Grafik kodlarını detaylarına burada girmiyorum fakat ilginizi çekiyorsa internette araştırmanız yeterli olacaktır. Sonuçta oluşan grafik;

33

Gördüğünüz üzere, Power BI’da oluşturulan girafikler R üzerinde de oluşturulabiliyor. Bu konuda R programının da gayet etkin olduğunu yazının başlarında söylemiştim. Hangisinin daha iyi grafikler çıkardığına karar vermek ise size kalmış.