Yazar adı: Bilal Latif Özdemir

Ben Bilal Latif Ozdemir, DEU İstatistik bölümü mezunuyum ve su an Ege Üniversitesi Bilgi Teknolojileri programında yüksek lisans yapıyorum. Aynı zamanda su an İzmir'de veri bilimci olarak çalışıyorum. Veri bilimi, Python ve istatistiksel analizler üzerine kendimi geliştirmeyi seviyorum ve bu alanda çalışan kişilere destek olmaya çalışıyorum.

STEM

Python İle Web Scraping: Twitter Botu Oluşturma

Merhaba, Yazı serimizin önceki bölümlerinde farklı senaryolarda Web Scraping yaparken nasıl bir yaklaşım sergilememiz gerektiğine yönelik örnekler incelemiştik. Gözden kaçırdıysanız önceki yazılara göz atabilirsiniz. Python ile Web Scraping: Temeller Python İle Web Scraping: E-Ticaret Sitesinden Web Scraping Bu sefer ise Web Scraping ile beslenen bir twitter botu oluşturacağız. İzleyeceğimiz senaryoda SistersLab blog yazılarının yayınlandığı sayfayı inceleyeceğiz. Bu sayfaya yeni bir blog yazısı eklendiğinde bu yazının bilgilerinin yer aldığı bir tweetin otomatik olarak atılmasını sağlayacağız.  Bunun için web sayfada blog duyuru sayfasından listelenen blogların html taglarını inceleyecek ve gerekli kontroller sonrasında yeni bir blog yazısını tweet olarak paylaşılması için gerekli Python fonksiyonlarını oluşturacağız. Bu uygulamada bir ek gereksinim var: Twitter developer hesabı Tweepy kütüphanesi ile tweetlerin Python tarafından yollanması için gerekli Öncelikle web sayfada “öğeyi denetle” deyip sayfa içeriğindeki blog yazılarının html olarak karşılık geldiği tagları buluyoruz. Siteye baktığımızda her bir blog yazısı için bir çerçeve içerisinde bilgiler paylaşıldığını görüyoruz; blog yazısının kapak fotoğrafı , yazı başlığı ve blog yazısının giriş cümlesi. Bu bilgileri web sayfa içerisinde görebiliyorsak bu bilgiler html içerisinde de bulunuyor demektir. Onun için html kısmında bu çerçevenin öğelerini de bulmamız gerekiyor. Html içerisinde belirli bir içeriği bulmanın en kolay yolu “Ctrl + F” tuş kombinasyonu ile anahtar kelimeleri aramaktır. Mesela üstteki “Herkese merhabalar. Kotlin” kısmını sayfanın html içeriği içerisinde aradığımda direkt olarak ilgili kısmın taglarına ulaşmış oldum. Burada tagları incelediğimizde ön yüzde gördüğümüz gibi çerçevedeki kapak fotoğrafının yer aldığı “img”, blog url’inin yer aldığı “a” tagının ve blog giriş cümlelerini barındıran kısmın yer aldığını görebiliyoruz. Kodlama kısmına geçmeden önce hedeflerimizi belirlememiz gerekiyor. Bu sayfadan 3 bilgi çekmek istiyoruz. Blog kapak fotoğrafı, Blog yazısının url’i, Blog yazısının özet / giriş cümlesi. Bu kısımlara ulaşmak için taglarda derinleşmemiz ve bu tagların barındırdığı class bilgilerini de kodumuza eklememiz gerekiyor. Mesela; Giriş cümlesi bir “div” tagı içerisinde ve “entry-description” classına sahip. Yazar görseli “img” class’ının src özelliğinde url olarak tutuluyor. Ve aslında bu img class’ı aynı zamanda bir “a” tag’ının içerisinde yer alıyor. Aynı zamanda img tag’ı da “post-tumbnail” adlı class’a sahip bir div içerisinde yer alıyor. Burada farklı bir yaklaşım sergilemek, iç içe bir yapı kurmak gerekecek. Blog url’lerine baktığımızda ise yine zincirleme bir şekilde “content-inner” classlı bir div içerisinde bir a tag’ı içerisinde olduğunu görüyoruz blog url’lerinin. Adımları uygulamak için uygulamamıza başlıyoruz. Her zamanki gibi ilk önce get_soup() olarak adlandırdığımız fonksiyon ile sayfanın html içeriğini Python’a çekiyoruz. Sonrasında blog yazısının url’i, blog giriş cümlesi ve yazı başlık fotoğrafını aşağıdaki gibi çekiyoruz. Evet Bu verileri elde etmek geçen örneklerden biraz farklı olsa da bu şekilde. Peki twitter botuna bunu nasıl çevireceğiz? Öncelikle Python ile tweet atabilmek için bir twitter developer account’a sahip olmak gerekiyor. Bu şekilde tweepy kütüphanesi yardımı ile developer account token’ımızı kullanarak Python’la tweetler atabiliyoruz. Tweepy ile tweet atmanın örnek kullanımı ise bu kadar kolay: Şimdi, son part olan Twitter ve scrape ettiğimiz dataların birleştirilmesi aşamasındayız. Fakat bizim amacımız burada blog yazılarını tweet attırmak değil, “yeni yayınlanan blog yazılarını tweet attırmak”. SistersLab ekibinde içeriden aldığım bilgilere göre haftada bir kaç blog yazısı paylaşılabiliyor ve günde bir kez siteyi “yeni bir blog yazısı paylaşıldı mı?” diye kontrol etmemiz yeterli. Bunun için bir while döngüsü içerisinde blog duyuru sayfasında paylaşılmış blog yazılarını kaydedeceğiz ve 24 saat sonra tekrar paylaşılmış blog yazılarını kontrol edip eğer yeni bir yazı ağımıza düşmüş ise bu yazının bilgilerini paylaşacağız. Botumuzun pseudo kodu ise şu şekilde olacak: Aslında şimdiye kadar gerekli bütün aşamaları konuştuk. Geriye kalan bu bahsettiklerimizi doğru sıralama ve mantık ile Python dilinde kodlamakta. Burada kod parçasını mantığı ön plana çıkartır şekilde paylaşacağım fakat çalışır kodu ve yardımcı adımlara/paketlere GitHub reposundan ulaşabileceksiniz. Evet botumuzun son halini oluşturduk. Burada ortaya çıkan yapı aslında önceki adımların bir araya getirilmesi sadece. Akıllara takılabilecek birkaç kısmı da açıklamakta fayda var. Mesela 36. satırda (280 – 23) ifadesi şu sebeple; “Tweetlerde paylaşılan url’ler 23 karakter yer kaplıyor ve tweetimizde url’e yer açmak için bunu hesaba katarak giriş cümlelerini daraltmamız gerekebiliyor.”. Diğer bir konu da 24 * 60 * 60 = 1 günlük bekleme doğru bir yaklaşım mı? Bu aslında senaryonuza göre değişir, bu şekilde botu çalıştırmak mümkün fakat bir workflow aracı ile oozie vea airflow ile python scriptinizi schedule edebilir ve bu şekilde bir ifade kullanmaya gerek duymayabilirsiniz. Burada amaç basit bir şekilde konsepti aktarmaktı. Son olarak tweetlerimiz! Program çalıştığında ilk olarak blog duyuru sayfasındaki 6 blog yazısının tweeti otomatik olarak atılacak. Çünkü ilk başta önceki günde kaydedilmiş eski url listesi boş olduğu için tüm blog yazıları botumuz tarafından yeni yazılar olarak algılanacak. Fakat ilk çalışmadan 24 saat sonra artık botumuz sağlıklı bir şekilde sadece yeni eklenen blogların bilgilerini paylaşıyor olacak. Tweetin altında yazan “bilative” twitter developer account tarafında oluşturulmuş uygulama adıdır. Burada manuel telefon ile attığınız tweetlerin dışında developer accountunuzun ismini görüyor olacaksınız. 3 parçada işlediğimiz Python ile Web Scraping konulu blog serimizin sonuna geldik. Sizlere bu yazı dizisinde basit örnekler ile akıllarda bir fikir oluşmasını ve kurcalanabilir kod parçacıkları sunmayı hedefledik. Farklı senaryolar ve gereksinimler için ayrıntılı çalışmalar ve ara ara hatalar da yapmanız gerekecektir. Hata yapa yapa öğrenmek keyifli, umarım sizler için de öyledir. Yazı serimizin içeriği veya Web Scraping konusu ile ilgili aklınıza takılan, sorun yaşadığınız veya desteğe ihtiyacınız olursa da iletişime geçebilirsiniz. Sonraki yazı serisinde görüşmek üzere.

STEM

Python İle Web Scraping: E-Ticaret Sitesinden Web Scraping

Merhaba, Python ile Web Scraping yazı serimizin 2. bölümündeyiz. İlk bölümde basit örnekler ile tek web sayfası içerisindeki tablo verilerinin nasıl kayıt altına alınabileceğine değinmiştik. İlk yazıyı gözden kaçırdıysanız bir göz atabilirsiniz: Python ile Web Scraping: Temeller Bu bölümde ise her e-ticaret sitesinde gördüğümüz üzere sayfalar boyunca listelenmiş ürünler ve bu ürünlerin detay bilgilerine ulaşmaya çalışacağız ve bu bilgileri toplu bir şekilde veri seti olarak toplayacağız. Örneğimizi görsel ile işlemek daha sağlıklı olacaktır. Her e-ticaret sitesinde karşılaştığımız üzere mesela telefonlar kategorisine girdiğimizde sayfalar boyunca telefonların listelendiğini görüyoruz. Her bir ürünün (telefon, bilgisayar vb) bilgilerini detaylı görmek için tıkladığımızda ise ürün bilgileri karşımıza sıralanıyor. Burada her bir telefonun bilgilerini kayıt altına almak istediğimizi varsayarsak; üstteki şemada her sayfada 9 ürün olduğu ve telefon kategorisinin 7 sayfa devam ettiği bu durumda 7 * 9 = 63 telefonun bilgilerinden oluşan veri seti oluşturabiliriz. Bu veri setini ödevlerimizde, projelerimizde veya analizlerimizde kullanmamız mümkün olacaktır. Böyle bir uygulama detaylı bir ön çalışma gerektiriyor. 63 telefonun da ürün sayfasına gidip tek tek içeriklere ulaşmak bir çözüm gibi durabilir fakat 63 ürünün linklerine ulaşmaya zaman ayırmak efektif değil. Kaldı ki 3000 telefon listeleniyorsa web sayfa boyunca 3000 linke tek tek ulaşmak mümkün olmayacaktır. Bunun için madde madde izlememiz gereken yol şu şekilde: Öncelikle ürün listesi sayfalarının linklerine ulaşmalıyız. İlk sayfanın linkini biz vereceğiz fakat sonraki sayfaların da linklerine sayfa içerisinden ulaşabilmeliyiz. Altta yer alan 1-2-3-4… şeklinde sıradaki sayfaya geçiş butonları sonraki sayfaların url’lerini saklıyor. Sayfada listelenen her ürünün “ürün detayı sayfası” linkine ulaşmamız gerekiyor. Her sayfanın url’i listeli sayfada gizlidir. Ardından ürün detaylarının toplanması gerekmektedir. Her bir ürünü bir tablonun tek 1 satırı olarak özellikleri ile birlikte kaydetmeliyiz. Bir örnek üzerinde senaryo ve adımların gereklilikleri çok daha iyi anlaşılacaktır. Uygulama aşamasında önceden hazırlamış olduğumuz https://bilative.github.io/sisterslab/page_1.html web sayfası üzerinden çalışmamızı yürüteceğiz. Uygulamaya başlamadan önce sayfayı bir incelemelisiniz. Linkte listelenen ürünler bulunuyor ve ürünlere tıkladığımızda detay sayfalarına ulaşabiliyoruz, aynı zamanda sonraki sayfalara geçiş yapabiliyor ve o sayfalarda listelenen ürünleri de inceleyebiliyor, detay bilgilerine ulaşabiliyoruz. Çalışmada kullanılacak tüm kodlara ise GitHub linkinden ulaşabilirsiniz.     İlk sayfa linkinde tarayıcıda “sayfa kaynağını görüntüle” seçeneği ile html içeriğini görüntülediğimizde sonraki sayfaların linklerinin listelendiği kısmı bulabiliriz. Bu html taglarını ve classlarını incelediğimizde beautiful soup ile alınacak web içeriğinin “a” tagında ve “class = pagination__content” şeklinde filtrelenmesi gerektiğini fark ediyoruz. Yani burada listelenen sayfa linklerine ulaşmak için gerekli olan python kodumuz şöyle olacak. Başarılı bir şekilde sayfa linklerine ulaşabildik. Şimdi de her bir sayfadaki listelenen ürünlerin linklerine ihtiyacımız var. Ürün sayfaları linklerinin ise “class = urun-adi” özelliğine sahip a tagları içerisinde olduğunu görebiliyoruz. Aslında önceki işlemlerin tekrarı sayılabilir bu aşama, sadece bu sefer 1 “get_soup” işlemi yapmayacağız, her 5 web sayfasına da ayrı ayrı get_soup ile içeriklerine ulaşma adımını yapacağız. Bu işlemler sırasında yine ürün linklerini bir liste içerisinde biriktireceğiz. Buraya kadar 2 parça halinde: İlk olarak tüm sayfaların url’lerine ulaştık. Ve sayfalar içerisinde listelenen ürünlerin linklerini kayıt altına aldık. Sadece başlangıç sayfası url’ini dışarıdan programımıza bildirip 5 farklı sayfa ve 20 ürünün linkine ulaştık. Böyle bakınca dışarıdan müdehalemiz sadece başlangıç noktasını belirlerken oldu. 300 web sayfası olsaydı teorik olarak 300 * 4 = 1200 ürün linkine dışardan müdehalesiz ulaşmış olacaktık. Şimdi sırada elimizde linkleri bulunan bu 20 ürün özelliklerini alıp bir dataframede toplamak var. Bir ön inceleme sonrası tüm ürünlerin aynı özelliklerinin listelendiği (Ürün Adı, Rengi, Dayanıklılığı…) fakat aldıkları değerlerin değişkenlik gösterdiği fark ediliyor. Bu da aslında tablolarda tuttuğumuz yapılandırılmış veri örneği. Ürün sayfalarının html taglarını incelediğimizde değişken isimlerinin “th” etiketlerinde tutulduğunu ve alınan değerlerin ise “td” etkiketlerinde yer aldığını görebiliyoruz. (Bütün html tag incelemelerine “öğeyi denetle seçeneği” ile ulaşabiliriz.) Bu şekilde doğru kolon isimlerini barındıran boş bir dataframe oluşturmuş oluyoruz (shape = 0 x 10). Sırasıyla bütün ürün sayfalarını gezip/kazıyıp td etiketlerinde yer alan değişken değerleri ile dataframe satırlarını doldurmak kalıyor geriye. Hemen her web sayfada üzerine biraz çalışma ile benzer uygulamalar yapılabilir. Buradaki bölümde basit bir örnek ile çoklu sayfalar ve geçişlerde nasıl web kazıma yöntemini efektif kullanabileceğimize değindik. Bu örnekler için kullanılan web sayfaları herhangi bir site değil de kendi oluşturduğum tasarımlar üzerinden anlatma sebebim ise olabildiğince basit ve standard bir örnek ortaya koyabilmekti. Web scraping’de derinleştikçe dikkat etmeniz gereken bazı konulara değinmek gerekirse: Web scraping’e direkt girişmeden önce hedef web sitelerinde ön çalışmalar yapmak gerekmektedir. Her farklı web site farklı bileşenlerden oluşmakta ve farklı isimlendirmeler ile özellik atamalarını yapmaktadır. Her bir tekil sayfaya istek atmadan önce veya sonra 0.5 sn civarı bir bekleme (time.sleep(0.5)) bırakmak site kaynaklarını yormanızı önleyecektir. Aksi halde çok seri bir şekilde attığınız istekler site tarafından bir saldırı olarak algılanabilir ve siteye erişiminiz engellenebilir. Çoğu web sayfadaki datalar standarttan çok uzak ve kirlidir. Mesela bir ürün bilgisi 1000GB, biri 1T, bir diğeri ise 1TB olarak girilmiş olabiliyor bilgiler, Web sayfalarda sonraki sayfa linkleri her zaman sıralı bir şekilde verilmez, farklı yaklaşımlar sergilenmesi gerekir. Farklı senaryolar farklı zorluklarla yüzleşmenizi sağlayacaktır. Takıldığınız bir yer olduğunda veya zorlu bir görevle karşılaştığınızda iletişime geçmekten çekinmeyin. Sonraki yazımızda web scraping görevini bir twitter botu ile birleştireceğiz, görüşmek üzere.

STEM

Python İle Web Scraping: Temeller

Merhaba, Gün içinde birçok web sitede geziyoruz. Bu mecralardaki fotoğraf, tweet, yazı, fiyat gibi kayıtların aynı zamanda “veri” olduğunun pekala farkındayız. Bu verinin farkı ise bir veritabında, excelde veya csv dosyasında değil de bir web sitede ürün olarak karşımıza çıkıyor olması. Peki oluyor ya arada, bu sitelerdeki verilere ihtiyacımız olursa ne yapacağız? Kimi web siteler ücretli veya ücretsiz verileri API’lar ile kullanıma açabiliyor, kimisi tabloları indirme bağlantısı paylaşıyor; peki ya bunları sağlamıyorlarsa bu verileri nasıl alabiliriz? Yöntem basit, tek tek bütün satırları kağıt kalem ile kaydedebiliriz veya bir Excel tablosu açıp her gördüğümüz değeri tek tek Excel’e yazabiliriz ama efektif bir yöntem değil bu. Burada imdadımıza Web Scraping yetişiyor, bu yöntemle verileri tek tek kaydetme işlemini otomatize edebiliyoruz. Bu yazı serimizde Web Scraping ve kullanım alanları üzerinde duracağız. Yol haritamız şöyle: Web Scraping temelleri, E-ticaret sitelerinden otomatize scraping, Web Scraping kullanarak Twitter botu oluşturma. Web Scraping Web Scraping web sitelerinde sunulan içerikleri programlama dilleri yardımı ile alma yöntemidir. İşlem aslında tek tek siteleri tıklamamız ve gördüklerimizi kağıt kalem ile kaydetmemize eşdeğer bir süreç, sadece programlama dilleri saatler sürebilecek bu süreci saniyeler içerisinde gerçekleştirmemizi sağlıyor. Sitelerden sadece site yöneticilerinin kullanıcılara sundukları bilgileri (html, xml vb. formatta) alıyor olduğumuz için aslında yaptığımızda yanlış bir şey yok. Fakat içeriği kullanım amacınıza göre ilgili site yönetiminden izinler almanız gerekli olabilir. Eğer ki verileri çektiğiniz sitenin kazanç kaynağı ürünlerin fiyatlarını sunmak ise (ürün satmaktan farklı bu bahsettiğim), kullanıcıları bu sitelerdeki verileri görmek ve paylaşmak için ücret ödüyor ise bu sitelerden izinsiz veri çekme işlemleri hukuki yönden sıkıntılar çıkartacaktır. Bir web sayfasında mouse ile sağ tıklayıp “sayfa kaynağını görüntüle” dediğimizde karşımıza çıkan yazılar, karakterler aslında bizim gördüğümüz web sayfasının bütün detaylarının belirlendiği kısım. Web Scraping işleminde aslında o kısımda yer alan html taglarını ayrıştırarak odaklandığımız verileri aradan çekip çıkarıyoruz. Web Scraping örneklerimiz için çok çok basit düzeyde html bilgisi gerekiyor. Ben bu sürece “html okumak” diyorum, html’i yazabilmemize gerek yok Web Scraping için basit düzeyde okuyabilmemiz yeterli. Bu yazı serimizde çok basit düzeyde scraping işlemlerini göreceğiz ve bunun için Python – Beautiful Soup kütüphanesini kullanacağız. Seride kullanacak olduğumuz web sitelerini ise örneklerin nokta atışı ve daha anlaşılır olmasını amacıyla kendi oluşturduğum web sayfaları üzerinden ilerleyeceğiz. Bu yazıda kullanacak olduğumuz web sayfamız: https://bilative.github.io/sisterslab/web_scraping Uygulama Öncelikle daha önce kullanmadıysanız import öncesi beautifulsoup ve request paketlerinin pip installation işlemlerini yapmanız gerekecektir. Bu süreçte: İlk olarak bir web sitesine get request (istek) atıp bir kez sayfa içeriğini (html olarak) görüntülüyoruz. Bu işlem tarayıcıda sağ tıklayıp “sayfa kaynağını görüntüle” dediğimizde gördüğümüz tüm içeriği almamızı sağlıyor. Ve daha sonra bu html kodlarınını -elde etmek istediğimiz bulunduğu alanın bilgilerine göre- filtreleyerek gerekli bilgiyi aradan sıyırıp alıyoruz. İstek atma ve içeriği alma kısmında “request” paketinden yararlanıyor ve bu html kodlarının düzeltilmesi ve tag’ler olarak ayrıştırılması kısmında da Beautiful Soup paketinden yararlanıyoruz. Burada bahsettiğimiz gibi sayfa içerisindeki tüm html içeriği soup içerisine kaydedildi. Tablo Verilerini Kazımak Tablo verilerini kazımadan önce işimizi kolaylaştıracak bir işlem olarak web sayfasında “sayfa kaynağını görüntüle” işlemini yapıp “Ctrl + F” kombinasyonu ile tablo elemanlarını aramakta fayda var. Bu şekilde direkt kazımak istediğimiz bölümün taglerine ve class bilgilerine ulaşabiliriz. Örnek olarak bu alanda Ctrl + F sonrası “Icimizdeki Seytan” kelimesini arayalım. Direkt olarak gittiğimiz satırda “td” etiketinde “col9” class’ının belirlendiğini görebiliyoruz, ve tüm kitap isimleri “col9” class’ı ile tanımlanmış. Html td etiketi satırları gözelerini belirtir. Buradan aldığımız bilgiler doğrultusunda Beautiful Soup’a arama işlemimizin sınırlarını söyleyebiliyoruz. Bu şekilde tablonun tüm elemanlarına ulaşmak, filtrelemek ve bunları dataframe’e çevirmek bize kalmış. Örnek web sayfası üzerindeki daha detaylı örnekleri buradaki github reposundan görüntüleyebilirsiniz. E-Ticaret Verilerini Kazımak Ürün hakkında özet bilgileri barındıran ürün kutucuklarını tüm e-ticaret sitelerinde görebiliyoruz. Bu kutulara tıklayınca ürünlerin detaylı sayfasına ulaşabiliyoruz. Web sayfaları gezinirken direkt olarak göremesek de o kutucukta yazan bilgiler ile birlikte ürünün sayfasının linki ve satıcısının profil linki de o kutucuğa gömülü ve hatta oradaki küçük görselin de bilgisi de o kutucukta yer alıyor. Tıklayınca bizi yönlendiriyorsa o bilgi orada bir yerde olmalı, değil mi? Kaynak kodlarının olduğu kısma geldiğimizde mesela “Bilal Manavcilik” linkine ulaşmak istediğimizi varsayalım. Bunu aradığımızda “a” etiketi içerisinde yer aldığını, bir url barındırdığını ve “urun-satici” div’i içerisinde yer aldığını görüyoruz. O zaman bu şekilde bir filtreleme” işlemi yaparak bu bilgiyi ayrıştırmak da mümkün. Tüm ürün satıcılarının isimlerine ve profil url’lerine ulaşmak için ise şöyle bir yol izlememiz gerekiyor. Tabii ki de tekil olarak verileri almak pek bir şey sunmuyor bizlere, ürünlerin bilgileri ile dataframe oluşturma için de şöyle bir yol izleyebiliriz: Bu yazımızda çok basit düzeyde örnekler ile Python ile Web Scraping konusuna giriş yaptık. Değindiğimiz örnekler Web Scraping konusunda ilerledikçe en fazla kullanma ihtiyacı hissedeceğimiz 2 konuydu. İlk başlarda html bilgisi olmayanlara belki süreç karmaşık görünüyor olabilir fakat adaptasyon çok hızlı olacaktır ve kısa sürede html bilgisi de kazanmayı sağlayacaktır bu uğraş. Web Scraping gerçekten çok keyifli bir konu olmakla birlikte bazı püf noktalara da dikkat etmek gerekiyor. Serimizin sonraki adımlarında daha da derinleşerek bu alanda farklı kullanım örnekleri sunacağız. Bir sonraki yazıda görüşmek üzere.

STEM

Python ile Etkileşimli Dashboard Oluşturma

Merhaba, Daha önceki yazılarımızda veri tiplerine göre görselleştirme yöntemlerinden dashboard araçlarına kadar bir özel sunmuştuk. Veri görselleştirme serisinin bu son yazısında ise etkileşimli dashboard oluşturma konusuna değineceğiz. Serinin önceki yazılarına da ayrıca gözatabilirsiniz: Adım Adım Veri Görselleştirme: Tipler ve Tüyolar Adım Adım Veri Görselleştirme: Python Temelleri Adım Adım Veri Görselleştirme: Çeşitli Senaryolar ile Görselleştirme Adım Adım Veri Görselleştirme: Dashboard Oluşturmada Yardımcı Araçlar Toplu halde veri görselleştirme ile bilgi aktarımında amacımıza göre kullandığımız araç ve izleyeceğimiz yol değişebilir. Genel olarak durağan ve tek bilgi sunmayı hedefleyen görselleştirme görevlerimiz oluyor olsa da detaylı ve çok sayıda alt kırılımı olan veri setimiz veya araştırma konumuzda tüm bilgileri bir anda sunmak neredeyse imkansız olabiliyor. Diğer bir problem de farklı kişiler farklı bilgilere odaklanmak isteyebiliyor. Bu sebeple: Onlarca kategorik değişkenden hangisi veya hangilerini grafiğe dökmeliyim? Zamana bağlı onlarca numerik değişkenin hangisi veya hangilerini grafiğe dökmeliyim? x ve y seneleri arasındaki mi yoksa x+5 ve y+7 seneleri arasındaki verileri göstermeliyim? gibi soruların tek bir cevabı olamıyor. Burada görselleri oluşturma mantığımızı biraz değiştirmemiz, sabit girdi ile sabit bir grafik oluşturmaktan daha fazlasını yapmamız gerekiyor. Ve burada etkileşimli dashboardlara çıkıyor kapımız. Bir önceki yazıda bahsettiğimiz gibi dashboard oluşturmak bir çok farklı seçenek var. Yeteneklerimiz ve görev kısıtlarımıza göre farklı opsiyonlara yönelebiliriz. Powerbi ve Google Data Studio gibi opsiyonlar arayüz üzerinden seçimler yaparak veya Python gibi bir programlama dili yardımı ile de dashboard oluşturmak mümkün. Ben yine Python’dan ilerleyeceğim. Uygulama Üzerinden Dashboard Oluşturma ve Etkileşim Araçları Örnek olarak önceki yazılarda da kullandığımız “İBB Şehir Tiyatrolarında Sahnelenen Oyunlar Verisi”ni kullandım. Veri seti oyun adı, tarihi, oyun kategorisi, oyun tipi, sahne konumu ve ziyaretçi sayısı değişkenlerini içeren 27bin satır veriden oluşuyor. Toplamda 77 farklı salonu barındıran veri setinde kimi salonlarda binlerce kez oyunlar sahnelenmişken kimi salonlarda bir kaç kez oyunlar sergilenmiş. Her sahne içerisinde sergilenen oyunlar ve katılımcı grupları kendi içinde farklı desenler oluşturuyor. Bu gibi bir veri setinde oluşturulacak olan grafikler ancak farklı sorulara da aynı zamanda cevap verebilirse maksimum bilgiyi sunuyor. Bu konuda Python dash kütüphanesi ile oluşturmuş olduğum bir örnek dashboard üzerinde, dashboard etkileşim araçlarına ve etkilerine değineceğim. Kodlara github adresimden ulaşabilirsiniz. Şehir Tiyatrolarında Sahnelenen Oyunlar Verisi – (https://data.ibb.gov.tr/dataset/sehir-tiyatrolari-veri-seti/resource/79465ce9-8755-4b57-8e6c-def0c0caadc8) 15sn’lik bir incelemenin ardından genel olarak karşımızdaki 3 farklı grafiğin verdiği bilgiyi kolayca anlayabiliyoruz. Grafik başlıklarından da anlaşılacağı üzere spesifik sahnelere ait bilgiler sunulmuş, tüm veri setine ait bilgiler sunulmamış. Grafiklerimizin etkileşimli olması ve kullanıcının seçimleri ile yönetilebilmesini sağlayan aslında burada gördüğümüz dört farklı araç. Veri görselleştirmede bu araçların sırasıyla uygun kullanımlarına değinelim. 1. Dropdown Menu Dropdown menüler, içerisinde bulunan mümkün opsiyonlardan birini (çoklu da olabilir) seçmemizi sağlayan bir yardımcı araç. Etkileşimli dashboardlar oluştururken genellikle dropdown menüler ile kategorik değişkenlerin sınıflarını seçme imkanı sunuyoruz kullanıcıya. Kullanıcının seçtiği sınıfa göre veri setini daraltıyor ve görsellerin filtrelenmiş veri seti ile oluşturulmasını sağlıyoruz. Mesela bu örneğimizde “Fatih Reşat Nuri Sahnesi” seçildiğinde 27bin satır gözlemden sadece bu sahnenin bilgisini içerenleri kullanacağımızı belirtmiş olduk. Diğer görsellerin tümü sadece bu sahneye ait bilgileri kullanıyor oldu. Seçimi değiştirerek tüm bilgilerin farklı bir sahneye göre güncellenmesini sağlayabilirsiniz. Örnek diğer senaryolar ise şu şekilde olabilir: Araç plakasını seçerek, Uçuş ID’si seçerek, Meyve adını seçerek, sadece o meyve / grubun bilgilerini kullanarak görselleri oluşturmak 2. Button Buttonlar aslında her web sitede karşılaştığımız bildiğimiz bir yardımcı araçtır. Bir örneğini de burada gördüğünüz gibi random seçimler yaptırmak için ekliyor olduk. Fakat dashboardlarda buttonların kullanım genellikle hesaplama işlemlerini veya veri bilimi proje çıktılarından tahminleme motorlarını uygun değerler girildikten sonra tetiklemektir. Güzel bulduğum bir örneğine şuradan ulaşabilirsiniz. 3. Tarih Seçici Tarih seçiciler spesifik bir tarih veya 2 tarihin aralığını seçmemizi sağlayamaktadır. Zaman bilgisi ile birlikte tutulmuş büyük veri setlerimizde, kullanıcıların belirli zaman dilimlerine veya noktalara kolayca odaklanabilmelerini sağlamak için tarih seçicileri kullanıyoruz. Bazı veri setlerinizde buna ihtiyacınız olmayabilir fakat 100 sene boyunca tutulmuş kayıtları barındıran bir veri setinde 8 ocak 1995 tarihindeki bir değere odaklanmak isterseniz bu imkansız olacaktır. Tarih seçicileri kullanarak kullanıcı dostu, istenilen tarihe odaklanan, temiz bilgi sunulabilir görseller oluşturmak da mümkün olacaktır. Örneğimizde tüm grafikler seçilen tarih aralığındaki verilere göre güncellenerek kullanıcıya sunuluyor. 4. Radio Button – Opsiyon Button Kullanıcıların farklı opsiyonları bir arada görebildiği ve sadece birini seçebildiği bir yardımcı araçtır. Dashboardlarda da kullanıcıdan görmek istediği değişken veya kategori gibi bilgileri belirtmesi için kullanıyoruz, kullanıcı seçimine göre grafikleri güncelliyoruz. Buradaki örnekte direkt olarak kullanıcının görmek istediği grafiği seçmesini istedik. Seçimlere göre kullanıcının görecek olduğu grafikler şu 3’ünden biri olacak: Ek olarak bu araçları PowerBi veya GDS ile oluşturmak isterseniz programlar kendileri bu seçimleri aktif edebiliyor. Fakat eğer Python gibi bir programlama dili ile bu araçları kullanmak isterseniz arka plandaki uygun filtreleme, alt örneklemler alma ve doğru girdileri grafikler ile bağlama kısmı sizin omuzlarınızda, bu kısımlar zaman alsa da çok keyifli. Her ne kadar burada CSV dosyadan veriyi okumuş olsak da canlı akan / toplanan verileri de görselleştireceğiniz durumlarla karşılaşılabilir ve onlara uygun yaklaşımlar sergilemeniz gerekebilir (çok daha eğlenceliler). Veri görselleştirme serimiz boyunca en temelden başlayıp basit düzeyde de olsa tüyolar ve uygulama detayları paylaşıyor olduk ve bir dashboard ile bütün bir şekilde görsel çıktısını etkili bir şekilde sunmaya değindik. Çok defa uyguladıktan sonra giderek uzmanlaşılan konular olduğunu belirtmek gerek bu konuların. İlk yazı serim boyunca çok eğlendim ve genel olarak iş hayatımda da çokça kullanıyor olduğum başlıklar üzerinden bilgi aktarımları gerçekleştiriyor oldum. Anlattıklarımı profesyonel hayatta icra ediyor olsam da yazılarım amatörce olmuş olabilir. Seri boyunca gördüğünüz hatalarım, belirtmek/ paylaşmak istediğiniz herhangi bir konuda hakkında veya önerileriniz için benimle iletişime geçebilirsiniz. Bir sonraki seride görüşmek üzere.

STEM

Dashboard Oluşturmada Yardımcı Araçlar

Merhaba, serimizin dördüncü adımındayız, şimdiye kadar temel veri görselleştirme tekniklerinden ve bunların Python dilinde uygulamalarından örnekler verdik. Şimdi ise aynı konu üzerine birden fazla görseli birlikte sunarak daha fazla bilgiyi bir arada aktardığımız dashboardlara değiniyor olacağız. Serinin önceki yazılarını henüz okumadıysanız bir göz atmanızı öneririm. Adım Adım Veri Görselleştirme: Tipler Ve Tüyolar. Adım Adım Veri Görselleştirme: Python Temelleri Adım Adım Veri Görselleştirme: Ceşitli Senaryolar ile Görselleştirme Dashboardlar aynı veya benzer konular hakkında önemli bilgilerin, genellikle görseller ile bir arada sunulduğu bir raporlama çeşidi olarak özetlenebilir. Veriden anlam çıkartmak konusunda çalışan bizler dashboardları arkadaki gerekli hesaplamaları ve gösterime uygun olan değişkenleri (feature) grafikler ve tablolar ile bir araya  getirerek son kullanıcının ilgisini doğru noktalara çekecek şekilde tasarlıyoruz. Dashboard oluşturmada adım adım kod anlatımı yapmayacağız bu yazıda, fakat hangi araçlar ile etkili dashboardlar oluşturulabileceğini belirtmekte fayda var. Öncelikle daha önce de belirttiğimiz gibi veri görselleştirmede kısıt yok. Grafiklerimizi ister Python veya R, istersek de Excel veya karakalem ile oluşturabiliriz. Dashboard oluşturma aşaması tekil grafik oluşturmaktan bir nebze daha zorlayıcı bir görev olduğundan hazır şablonlardan yararlanmak veya yetkinliklerimizi ileriye taşıyacak araçlar öğrenmeye başlamak bu görevde daha etkili çıktılar ortaya koymamızı sağlayacaktır. Yetkinliklerimiz dahilinde ve ihtiyacımıza göre farklı araçları kullanmak mümkün. Mesela kodlama gerekmeden Excel ile bir veri seti hakkında farklı görseller ile bilgi sunmak mümkün. Aynı konu hakkında haftalık olarak elinize gelen tablolar için bir şablon oluşturmak ve tekrar tekrar uğraşmadan tabloları bu şablon ile görselleştirmek mümkün mesela. Dashboard oluşturmada sınır sadece verilerinizin çeşitliliği ve sunmak istediğiniz bilgi. Bir diğer Microsoft aracı olan Power BI da dashboard oluşturmakta çok güçlü bir araç. İçerisindeki çok sayıda sunulan yardımcı etkileşim araçları ve görsel çeşitliliği ile çok hızlı bir şekilde etkileyici dashboardlar oluşturmamıza olanak sağlıyor. Arayüz üzerinden her türlü küçük görsel detaylarını kolaylıkla özelleştirebiliyor ve tek tıkla tüm grafiklerimizin içeriklerini seçimlerimize göre şekillendirebiliyoruz. PowerBI’ın Python ve R dillerinde scriptler yazmaya izin vermesi, matplotlib gibi kütüphane desteği de Python tarafından gelenler için belki bir nebze daha kolaylık sunacaktır. PowerBI’ı direkt olarak SQL’deki tablolarımız ile bağlayıp SQLdeki verilere göre tablolarımızı güncel tutmak da sadece statik veri ile dashboard ortaya koymaktan fazlasını da sunuyor bizlere. Dashboard oluşturmakta kullanılabilecek araçlar arasında R – Shiny de bulunmakta. Etkileşimli dashboardlar ortaya çıkartmakta R dilinin gücünü de arkamıza almamızı sağlayan Shiny ile gerçekten çok başarılı uygulamalar ortaya çıkartılabiliyor. İstatistiksel analizlerimizin çıktılarını bir arada sunabileceğimiz, özelleştirmelerle etkileşim araçlarını kullanabildiğimiz ve SQL bağlantısı ile sürekli güncel verileri görsellerştirebildiğimiz Shiny uygulamaları diğer programlama dillerine nazaran daha kolay bir şekilde dashboard oluşturmamızı sağlıyor. Google Data Studio Hızlı ve çok kolay bir şekilde dashboard oluşturabileceğiniz bir diğer araç ise Google Data Studio. Birçok eklentisi sayesinde farklı kaynaklardan veri aktarımına olanak sağlayan ve kolay kullanıma sahip bir görselleştirme aracı. Hemen hemen herkesin sahip olduğu gmail hesapları ile giriş yapıyor olup farklı bilgisayarlardan da browser üzerinden bağlansak bile verilerimize ulaşıp çalışmaya / görsellerimizi paylaşıp özelleştirmeye devam edebileceğimiz bir opsiyon olması da ayrı bir güzel yanı. Dahası da var tabi. Mesela açık Grafana’yı duymayanımız yoktur. Etkileyici görselleri ile lider şirketlerin de kullandığını bildiğimiz, ücretli ve açık kaynak versiyonu bulunan farklı kaynaklardan veri okumaya ve sorgulara izin vermesiyle dikkatlerimizi çeken bir görselleştirme aracı. Yine Python tarafında ise StreamLit ve Plotly-Dash öne çıkan ve neredeyse hiç HTML ve CSS bilmeden web uygulaması olarak etkileşimli dashboardlar ortaya koymamızı sağlayan kütüphaneler. Önceki yazılarımda da üzerinde durduğum Python plotly kütüphanesi çatısında bulunan dash, web uygulaması olarak dashboardlar oluşturmamızı sağlıyor. Neredeyse hiç HTML ve CSS bilmeden her türlü detayı özelleştirmeye izin vererek etkileşimli dashboard yapmaya izin veriyor. Python’da işlediğimiz verileri statik veya dinamik bir şekilde görsellere dökmeye, her türlü filtrelemeye ve bunları kullanıma açmaya olanak sağlıyor plotly dash. Mesela eğitilmiş makine öğrenmesi modellerimizin tahmin değerlerini, kullanıcıdan alınan inputlar ile yönetebildiğimiz çıktıları, grafikleri sunmaya olanak tanıyor. Bir kurcalamak isterseniz mesela geçen yazımızda kullandığımız veri seti ile çok basit bir örneği  github adresinden bulabilirsiniz. Bu yazımızda genel olarak bir uygulama yapmayıp sadece kullanılabilir dashboard opsiyonları üzerinde durduk. Bir sonraki yazımızda Python’da etkileşimli bir dashboard oluşturup bu dashboardın özelleştirilmesine ve grafikleri etkilemesine değiniyor olacak ve veri görselleştirme serimizi noktalayacağız. Bir sonraki yazıda görüşmek üzere.

STEM

Adım Adım Veri Görselleştirme: Çeşitli Senaryolar ile Görselleştirme

Merhaba, serimizin önceki iki yazısında bir temel atmıştık, bu bölümde bazı sorulara cevap olan görseller sunuyor olacağız. Önceki yazılara göz atmanızı öneririm: Adım Adım Veri Görselleştirme: Tipler Ve Tüyolar. Adım Adım Veri Görselleştirme: Python Temelleri Bu yazıda oluşturulan örnek görsellerde hepimizin anlayabileceği, üzerine fikir yürütebileceği bir konu olan vücut ölçülerini barındıran “Body Fat Prediction Dataset“ini kullandım. Kaggle’dan ulaştığım bu veri setini indirip kurcalayabilir, veri hakkında daha detaylı bilgiye sahip olabilirsiniz. Not: Bu yazıda temel sorular üzerinde gidilip, bazı önemli ön kontrol ve ara aşamalar atlanmaktadır. Temel amaç görselleştirme olup en doğru bilgi için daha detaylı çalışma gerekmektedir. Öncelikle bazı metrik dönüşümler ve ek hesaplamalar yaptım. Kimi veriler bize biraz uzak IBS ve INC cinsinden metrikler ile ifade ediliyordu, bunları cm ve kg cinsine dönüştürmem gerekti. Bu gibi ara hesaplamalar ve tüm kodlara github adresimden ulaşabilirsiniz. Şüpheli bir durum olup olmadığını anlamak için değişkenleri box plot ile kontrol edebiliyoruz. Box plotı birden fazla değişken için tek tek oluşturmak veya tek tek değişken bilgilerini girerek eklemeler yapmak mümkün olsa da bir for döngüsü ile tekrardan kaçınarak tek seferde görseli oluşturmak bize kolaylık sağlayacaktır. Bu görselde direkt gözümüze BMI değerinin 160’ları bulduğu bir gözlem çarpmış olmalı. BMI değeri normalde 25 civarı olması beklenen, 40 üzerindeyken ciddi tehlikeye işaret eden bir durum. Bu değerin gözlemlendiği kişiye baktığımda bu kişinin 44 yaşında  92kg ve 75cm boyunda olduğunu gördüm. Bir karışıklık olduğu ortada, bir hatalı veri girme durumu olabilir veya bu arkadaşımız engelli olabilir, standart ölçümlerde beklenmedik çıktılar elde edilmiş olabilir.BU nedenle bu gözlemi sonraki aşamalarda dışarıda tutmayı uygun buldum. BMI skorlarının düştüğü aralıklar “zayıf”, “normal”, “obez” gibi gruplara işaret ediyor. Bu BMI gruplarının veri seti içerisindeki dağılımı görmek istediğimizi varsayalım. Gösterimimizi Pie Chart ile yapmamız gerekiyor fakat pie chart bir değerin toplamı gibi bir kümülatif gösterim mantığına dayanıyor. Veri setimizde her bir satır 1 kişiyi temsil ediyor olduğundan, her satırın temsil ettiği kişiyi belirtmek için bir dummy değişken oluşturmamız gerekiyor. Bu şekilde pie chart ile ortak dili konuşabiliriz. Veri setimizde 250 civarı gözlem var. Yaşlar 20-70 aralığında seyrederken hemen hemen her yaştan birden fazla kişi bulunuyor. Biri size şöyle bir soru sorabilir “Aynı yaştaki kişilerin max – min BMI skor farkları nedir?” Mesela 26 yaşında 4 kişi var ise ve BMI skorları sırası ile 20-28-23 ve 19 ise 26 yaşın BMI skor max-min aralığı 28-19=9 olacaktır. Böyle bir soruda yaşlara göre bir groupby işlemi gerektiği açık olsa da min-range’e ulaşmamızı sağlayan bir aggrigation func bulunmamakta, böyle bir durumda bu fonksiyonu da bizim yazmamız gerekir. Her bir bar max-min farkını belirtiyorken 0 olan yaşlarda tek gözlem olduğu veya bir gözlem olmadığı, dolayısıyla bir max – min hesabı yapılamadığı sonucuna ulaşılabilir. Verileri anlama çalışmalarımızın sonu bildiğiniz gibi bir model eğitimine / analizine çıkıyor. Temel olarak regression, classification, time series analysis ve clustering  görevlerimiz var. Bir sorudan bağımsız bu veri setine rastgele belirlediğim değişkenleri kullanarak bir clustering algoritması olan KMeans modeli ile kümelenmeleri görselleştirmeye karar verdim. KMeans ile çok sayıdaki değişkenlerce birbirine benzeyen / ayrılan gözlemlerin aynı veya farklı gruplara düşmesine göre yorumlar yapıyoruz. Burada küme sayısını belirlemek için bir çok yöntem var. Ben bunlardan Elbow Methodu’nu (Dirsek Yöntemi) kullandım. Bu yöntem ile küme sayısı ve hesaplanan WCSS skorları grafiğe döküyor ve büyük dirsek (elbow) kırılmasının olduğu noktadaki küme sayısını optimum küme sayısı kabul ediyoruz. Dirsek noktasındaki hata ne kadar düşükse gözlemler de o kadar güzel / keskin bir şekilde kümelere ayrılabilir yorumu yapabiliriz. Görsele baktığımızda bir dirsek kırılması göze çarpıyor net olarak. WCSS’nin durağanlaşmayıp giderek azalması grup ayrımlarının keskin olmayacağı konusunda şüpheye düşürebilir bizleri. İlla bir karar vermek gerekirse 2 ve 4 noktalarındaki kırılmalardan durağana daha yakın olan 4 noktasını seçerek devam ediyorum analizime. Kümeleme sonuçlarını bir görselde göstermek çok da kolay değil aslında. Çünkü eğitimde kullandığımız 10 kadar değişkeni en düzgün gösterim 10 boyutlu bir düzlemde gösterim ile olacaktır. Bu da insan algısının çok üzerinde bir boyut sayısı olduğundan scatter plot ile 2 boyut ile gösterebilmek için bir yardımcıya ihtiyacımız var. 10 boyutlu veriyi 2 boyuta indirgemede de PCA’den yardım alıyoruz. Normal şartlarda PCA’de normal dağılım gibi varsayımlara sahip, fakat temel amacımız görseller hakkında bilgi vermek olduğu için bu kontrolleri yapmıyorum şuan. PCA yüksek boyutlu veri setinin değişkenliğini biraz bilgi kaybı ile daha düşük boyutlarla temsil edecek dönüşümü sağlayan bir yöntem. 10 boyutlu verimizi böylelikle 2 boyuta indirgiyor ve KMeans sonuçlarımızı PCA ile elde edilen 2 Principle Component ile gösteriyoruz. (Bu arada 2 component ile %80+ açıklama yüzdesine ulaştık.) Beklediğimiz gibi kümeler birbirinden keskin bir şekilde ayrılmıyor, fakat 4 kümenin görselini bu şekilde oluşturmuş olduk. Bu yazımızda bir veri setini görselleştirme teknikleri ile tanımaya ve bazı sorulara cevap bulmaya çalıştık. Ek olarak bir kümeleme algoritmasında görselleştirme teknikleri nasıl efektif bir şekilde kullanılır bunlara değindik. Bir sonraki yazımızda yine Python ile dinamik bir dashboard olşturduğumuz bir web app yapacağız. Veri analizi ve veri manipülasyonu hakkında herhangi bir sorunuz ile ilgili iletişime geçmekten çekinmeyin. Serinin sonraki yazısında görüşmek üzere.

STEM

Adım Adım Veri Görselleştirme: Python Temelleri

Merhaba, veri görselleştirme serimizin ilk bölümünde genel olarak veri tiplerine göre görselleştirme tekniği seçimi ve bu teknikler sayesinde ne tür bilgiler sunabiliyor olduğumuzdan bahsetmiştik. Biraz da görselleri daha etkili hale getirebilecek ve bilgiyi daha güzel sunmaya yarayacak tüyolara değinmiştik. Şimdi serimizin ikinci bölümünde Python dilinde görselleştirme kütüphanelerinden yararlanarak bazı grafiklerin nasıl oluşturulduğuna dair basit örnekler sunuyor olacağız. Görselleri oluştururken kodlar içerisinde hangi parametreler hangi amaçla kullanılır ve görsele nasıl etki eder gibi konulara değineceğiz.

STEM

Adım Adım Veri Görselleştirme

Veri bilgi yolunda elimizdeki en küçük parçadır. Araştırma konumuza dair bilgi elde etmek için gözlemleyerek, ölçerek, sayarak nitelikleri tanımlayacak değerler elde ederiz ve bunlara veri deriz. Bu verileri anlamlandırma süreçlerinden sonra elde ettiğimiz bilgilerle aksiyonlar alır ve mevcut sorunlarımızla daha iyi başa çıkabiliriz.

Scroll to Top