Seaborn ile Veri Görselleştirmesi

Klasik formatta sunulan verileri anlamak her zaman insana zor gelir. Bu yüzden veri görselleştirmesi kullanarak daha veriden elde ettiğimiz sonuçları daha anlaşılır hale getiriyoruz. Python ile veri görselleştirmesi yaparken genel olarak kullanılan kütüphane Matplotlib kütüphanesidir. Ama genelde Matplotlib ile görselleştirme yapan herkes “neden adam akıllı bir grafik yapmak için 5-10 satır kod yazmak zorunda kalıyorum?” sorusunu kendisine sormuştur.

Eğer daha az kod ile daha havalı grafikler yapmak istiyorsanız, Seaborn kütüphanesini baya bir seveceksiniz. Bu yazımda seaborn ile başlangıçta bilmeniz gereken herşeyi bulabilirsiniz.

Seaborn’a Giriş

Seaborn, Matplotlib kütüphanesine yüksek seviye arayüz sağlayan bir kütüphanedir. Seaborn ile;

  • Estetik olarak hoş olan varsayılan temaları kullanma
  • Özel olarak renk paleti belirleme
  • Göz alıcı istatistiksel grafikler yapma
  • Dağılımları kolayca ve esnek bir şekilde sergileme
  • Matris ve DataFrame içindeki bilgileri görselleştirme

yapılabilir. Yukarıdaki son üç madde, Seaborn’un Keşifçi Analiz için biçilmiş kaftan olduğunu gösteriyor. Veriniz hakkında hızlı ve etkili bir biçimde bilgi sahibi olabiliyorsunuz.

Ancak, Seaborn bir tamamlayıcıdır. Matplotlib’in yerini almış değildir. Hala Matplotlib gerektiren birkaç ayarlama var. Bu ayarlamaların nasıl yapıldığını yazının ilerleyen kısımlarında görüceğiz.

Başlamadan önce: Bu eğitimde olabildiğince basit anlatmaya çalıştık. Eğer Seaborn daha detaylı bilgi sahibi olmak istiyorsanız Seaborn dokümantasyonunu inceleyebilirsiniz.

1.Adım: Seaborn’u Yükleme

Artık başlayabiliriz! Öncelikle aşağıdaki program ve kütüphanelerin bilgisayarınızda yüklü olduğundan emin olun:

  • Python 2.7+ yada Python 3
  • Pandas
  • Matplotlib
  • Seaborn
  • Jupyter Notebook (isteğe bağlı)

Ben şiddetle Anaconda kullanmanızı tavsiye ediyorum. Anaconda içinde yukarda saydığım ve daha saymadığım yüzlerce kütüphaneyi tek bir çatı altında kullanabilirsiniz.

Anaconda’yı yükledikten sonra Jupyter uygulamasını başlatarak yeni bir notebook açıp kodlarınızı yazmaya başlayabilirsiniz.

2.Adım: Kütüphaneleri ve Veriyi Ekleme

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns

Verideki ilişkileri yönetmek için Pandas, grafikleri daha fazla özelleştirmek için Matplotlib ve havalı grafikler yapmak için Seaborn kütüğhanesini ekledik.

Artık veriyi ekleyebiliriz.

Pokemon Verisi

Veriyi yukarıdaki linkten indirebilirsiniz. Verimiz, ilk jenerasyon Pokémonları içeriyor.

df = pd.read_csv("pokemon.csv", index_col=0)

Yukarıdaki kodda kullandığımız index_col=0 argümanı, verinin ilk sütununu index sütunu olarak belirlememize yarıyor.

Verimiz şu şekilde gözükmektedir:

Görüldüğü gibi, Pokémonlarımızın mücadele istatistiklerini görebiliyoruz.

3.Adım: Seaborn Grafik Fonksiyonları

Seaborn ile tek satır kod yazarak istediğimiz grafiği yapabiliriz. Örnek vermek gerekirse; lmplot() fonksiyonu ile kolayca saçılım grafiği yapabiliriz.
Seaborn ile grafik yapmanın 2 yolu vardır.

# Önerilen Yöntem
sns.lmplot(x='Attack', y='Defense', data=df)
 
# Alternatif Yöntem
sns.lmplot(x=df.Attack, y=df.Defense)

Seaborn içinde özel olarak atanmış bir saçılım grafiği yoktur, bu yüzden üstteki grafik üstünde bir köşegen görüyoruz. Aslında lmplot() fonksiyonunu regresyon çizgisini oturtmak ve grafiğini çıkartmak için kullanıyoruz.

Ancak yinede bu fonksiyonda biraz değişiklik yaparak saçılım grafiği yapmak için kullanabiliriz.

sns.lmplot(x = 'Attack', y = 'Defense', fit_reg = False, hue = 'Stage', data = df)

Buradaki eklediğimiz argümanlar ise:

  • fit_reg: Bu argümanın değerini False yaptığımız zaman grafik üstündeki regresyon doğrusunu kaldırıyor.
  • hue: Bu argümanın değerini 'Stage' yaptığımız zaman Pokémon’ların gelişim evrelerine göre renklendirme yapıyor. Bu özellik sayesinde grafiğimize üçüncü bir boyut katmış oluyoruz

Şu ana kadar grafiğimiz gayet güzel oldu. Ancak daha da iyi hale getirebiliriz. Mesela; bütün Pokémon’ların Attack ve Defense değerleri pozitif olmasına rağmen grafiğin eksen değerleri sıfırı altında. Şimdi de bunları düzeltelim.

4.Adım: Matplotlib ile Grafiği Özelleştirme

Şu ana kadarki yaptıklarımızda Seaborn ile işin çoğunu hallettik. Ancak ufak eklemeler ve düzenlemeler yapmak için Matplotlib’e ihtiyacımız var.

Örneğimize dönecek olursak; eksen değerlerimizi belirlemek için aşağıdaki sırayı izlemeliyiz:

  • Öncelikle grafiğimiz oluşturduk.
  • Ardından da Matplotlib kütüphanesinin içinde yer alanxlim() ve ylim() kodları ile eksen sınırlarımızı belirliyoruz.

Ve kodumuz aşağıdaki halini alıyor.

# Seaborn ile grafiği oluşturma
sns.lmplot(x='Attack', y='Defense', data=df,
           fit_reg=False, 
           hue='Stage')
 
# Matplotlib ile eksen sınırlarını belirleme
plt.ylim(0, None)
plt.xlim(0, None)

5.Adım: Pandas Kütüphanesinin Rolü

Yazımızın konusu Seaborn olsa bile Pandas kütüphanesi baya önemli bir rol oynuyor.

Örneğin bütün Pokémon’ların mücadele istatistiklerini kutu grafiği kullanarak görselleştirelim.

sns.boxplot(data = df)

Gayet güzel! Ancak kaldırmamız gereken birkaç sütun var.Bunlar:

  • Total
  • Stage ve Legendary. Çünkü bu iki değişken mücadele istatistiği değil.

Görüldüğü gibi sadece Seaborn ile bu işlemler kolay olmuyor. Bu yüzden veriye ön biçimlendirme yapmak zorundayız.

stats_df = df.drop(['Total', 'Stage', 'Legendary'], axis = 1)
sns.boxplot(data = stats_df, notch = True, linewidth = 2.5, width = 0.50)

Gördüğünüz gibi grafiğimize yeni özellikler ekledik.

  • notch:Bu argüman yardımıyla medyanın %95 güven aralığında sınırlarını göstermiş oluyoruz.
  • linewidth:Bu argüman yardımıyla her bir kutunun arasındaki mesafeyi belirliyoruz.
  • width:Bu argüman ile her bir kutunun genişliğini belirliyoruz

6.Adım: Seaborn Temaları

Seaborn’un diğer bir avantajı ise havalı temalar ile beraber geliyor olmasıdır. Seaborn’un varsayılan teması darkgrid temasıdır.

Şimdi ise violin grafiği yaparken farklı bir tema kullanalım.

  • Violin (keman) grafiği, kutu grafiğinin alternatifidir.
  • Sadece özet istatistikleri göstermek yerine dağılımları gösterir.

Örnek olarak Pokémon’ların saldırı değerlerinin temel tiplerine göre dağılımlarını gösterelim.

sns.set_style('whitegrid')
sns.violinplot(x = 'Type 1', y = 'Attack', data = df)

Görüldüğü gibi ejderhaların hayaletlere göre saldırı değerleri daha yüksek, ancak hayaletlerin varyansı daha büyüktür.

Pokémon fanları şimdi diyebilir “Hacı böyle saçma renk mi olur”. Neden çimen pokémonlarının rengi pembe yada su pokémonlarının rengi turuncu. Sonraki bölümde bu sorunu düzeltmeliyiz!

Renk Paletleri

Neyse ki, Seaborn kendi renk paletlerimizi oluşturmamıza izin veriyor. Python listesi yardımıyla renklerin onaltılık değerlerini oluşturabiliriz.

pkmn_type_colors = ['#78C850',  # Grass
                    '#F08030',  # Fire
                    '#6890F0',  # Water
                    '#A8B820',  # Bug
                    '#A8A878',  # Normal
                    '#A040A0',  # Poison
                    '#F8D030',  # Electric
                    '#E0C068',  # Ground
                    '#EE99AC',  # Fairy
                    '#C03028',  # Fighting
                    '#F85888',  # Psychic
                    '#B8A038',  # Rock
                    '#705898',  # Ghost
                    '#98D8D8',  # Ice
                    '#7038F8',  # Dragon
                   ]

Çok güzel. Şimdi ise palette= argümanına yeni renk paletimizi ekliyoruz.

sns.violinplot(x='Type 1', y='Attack', data=df, 
               palette=pkmn_type_colors)

Çok daha iyi oldu! Violin grafiği dağılımları görselleştirme konusunda gayet başarılı. Ama zaten 151 tane Pokémon olduğu için her birini nokta olarak gösterebiliriz.

Ve tam burda swarm (sürü) grafiği devreye giriyor. Bu grafik bize her bir noktayı gösteriyor, ayrıca benzer noktaları birlikte gösteriyor.

sns.swarmplot(x = 'Type 1', y = 'Attack', data = df, palette=pkmn_type_colors)

Şu ana kadar grafiğimiz gayet güzel oldu.Ancak violin grafiği ile swarm grafiğini birleştirebilir miyiz?

8.Adım: Grafikleri Üstüste Bindirme

Cevap: Evet!

Matplotlib’de olduğu gibi Seaborn’da da grafikleri üstüste bindirebiliriz. Yapmamız gerekenler:

  • İlk önce Matplotlib ile grafiğimizin büyüklüğünü büyütüyoruz.
  • Daha sonra violin grafiğimizi yapıyoruz. Ancak inner= argümanın değerini None olarak belirleyip violin grafiğinin içindeki sütunu kaldırıyoruz.
  • Daha sonra swarm grafiğini yapıyoruz. Bu sefer noktaları daha belli olması için siyah yapıyoruz.
  • Son olarak, Matplotlib ile grafiğin başlığını belirliyoruz.
sns.violinplot(x = 'Type 1', 
               y = 'Attack', 
               data = df, 
               inner = None, 
               palette=pkmn_type_colors)

sns.swarmplot(x = 'Type 1', 
              y = 'Attack', 
              data = df, 
              color = 'k', 
              alpha = 0.7)

plt.title('Attack by Type')

Anlatmaya gerek yok, susuyorum! Yukarıdaki grafikte bütün Pokémonların Attack değelerinin tip bazında dağılımlarını görebiliyoruz. Peki ya aynı şekilde Pokémonlara ait diğer istatistikleride görselleştirebilir miyiz?

9.Adım: Hepsini Bir Araya Koyma

Pekala, herbir özellik için tek tek grafik yaparak görselleştirebiliriz. Ama biz bütün bu özellikleri tek bir grafikte toplayıp görselleştirebiliriz. Tabi öncelikle Pandas ile veriyi hazırlamamız lazım…

Gördüğünüz gibi bütün özellikler sütunlara ayrılmış durumda. Bunun yerine hepsini tek bir sütuna “eriteceğiz”.

Bunu yapmak için, Pandas içindeki melt() fonksiyonunu kullanacağız. melt() fonksiyonu:

  • Öncelikle, DataFrame’i eritiyoruz.
  • Sonra, tutmak istediğimiz sütunları belirtiyoruz.
  • Son olarak, erittiğimiz değişkene bir isim belirliyoruz.
melted_df = pd.melt(stats_df, 
                    id_vars=["Name", "Type 1", "Type 2"], # Variables to keep
                    var_name="Stat") # Name of melted variable
melted_df.head()

Görüldüğü gibi "Name", "Type 1", "Type 2" değişkenleri dışında kalan değişkenlerin hepsini tek bir sütuna erittik. Eğer son veriyi dikkatli incelersek Bulbasaur gözleminden 6 tane olduğunu görebiliriz.

Eğer DataFrame’lerin boyutlarını ekrana yazdırırsak:

print( stats_df.shape )
print( melted_df.shape )
# (151, 9)
# (906, 5)

melted_df tablosunun stats_df tablosunun 6 katı olduğunu görebiliriz.
Artık melted_df tablosu ile swarm grafiğini yapabiliriz.

  • Ama bu sefer, x ve y argümanlarını x='Stat' ve y='value' olarak belirleyeceğiz, bu sayede swarm grafiğimiz özellikler bazında ayrılmış olacaktır.
  • Daha sonra, hue argümanını hue='Type 1' olarak belirleyeceğiz, böylece grafik üzerindeki noktaları Pokémonların temel tiplerine göre renklendirmiş olacağız.
sns.swarmplot(x='Stat', y='value', data=melted_df, 
              hue='Type 1')

Son olarak birkaç ayarlama yaparak grafiği daha okunabilir hale getirelim:

  • Grafiği büyütelim.
  • Renklere göre noktaları birbirinden ayırmak için split=True argümanını kullanalım.
  • Kendi oluşturduğumuz Pokémon renk paletini kullanalım.
  • Y eksen limitini “0” olarak ayarlayalım.
  • Sağ tarafa lejant ekleyelim.
plt.figure(figsize=(10,6))
 
sns.swarmplot(x='Stat', 
              y='value', 
              data=melted_df, 
              hue='Type 1', 
              split=True, # 2. Separate points by hue
              palette=pkmn_type_colors) # 3. Use Pokemon palette
 
plt.ylim(0, 260)
 
plt.legend(bbox_to_anchor=(1, 1), loc=2)

10.Adım: Pokédex

Bu bölümde ise size Seaborn ile neler yapılabileceğini göstermesi açısından birkaç tane grafik tipi göstereceğiz.

10.1 Isı Haritası

Isı haritaları, matris tarzında verileri görselleştirmek için kullanılır.

corr = stats_df.corr()

sns.heatmap(corr)

10.2 Histogram

Histogram, nümerik değişkenlerin dağılımlarını görselleştirmede kullanılır.

sns.distplot(df.Attack)

10.3 Sütun Grafiği

Sütun grafiği, kategorik değişkenleri görselleştirmede kullanılır.

sns.countplot(x='Type 1', data=df, palette=pkmn_type_colors)
 
# X eksenindeki etiketleri döndür
plt.xticks(rotation=-45)

10.4 Faktör Grafiği

Faktör grafiği, faktör sınıflarının grafiklerini kolayca ayırmaya yarar.

g = sns.factorplot(x = 'Type 1',
                   y = 'Attack',
                   data = df,
                   hue = 'Stage',
                   col = 'Stage',
                   kind = 'swarm')
g.set_xticklabels(rotation = -45)

10.5 Yoğunluk Grafiği

Yoğunluk grafiği, iki değişken arasındaki dağılımı gösterir.

sns.kdeplot(df.Attack, df.Defense)

10.6 Ortak Dağılım Grafiği

Ortak dağılım grafiği, saçılım grafiği ile histogramı birleştirerek bize iki değişkenli dağılımlar hakkında detaylı bilgi verir.

sns.jointplot(x = 'Attack', y = 'Defense', data = df)

Ve böylece Seaborn ile Veri Görselleştirmesi yazımızın sonuna gelmiş bulunuyoruz. Seaborn ile yapılan daha farklı grafiklere göz atmak istiyorsanız Seaborn galeri sayfasını incelemenizi öneririm.

Kaynakça: https://elitedatascience.com/python-seaborn-tutorial

Yazar Hakkında
Toplam 10 yazı
Alperen Balık
Alperen Balık
Yıldız Teknik Üniversitesi İstatistik Bölümü Mezunu. Veri Bilimcisi. İlgilendiği alanlar; Makine Öğrenmesi, Dashboard Tasarlama, Yazılım Geliştirme
Yorumlar (5 yorum)
Seyyide Kaya
Seyyide Kaya Yanıtla
- 03:16

Enfes bir yazı olmuş elinize sağlık

Erkan ŞİRİN
Erkan ŞİRİN Yanıtla
- 09:22

Çok güzel bir yazı, eline sağlık. Üç boyutlu grafiler ile ilgili de yazabilir misin?

Kaan Arık
Kaan Arık Yanıtla
- 12:07

factorplot komutunun ismi güncelleme ile ismi catplot olarak değiştirildi. Post’a bakarak factorplot’ta hata alanlar için faydalı olabilir.

Atilla
Atilla Yanıtla
- 16:35

Cok Tesekkurler

huseyin
huseyin Yanıtla
- 12:24

sb.lmplot(x=’Attack’, y=’Defense’, data=df)

komut grafik çizmiyor neden olabilir
import vs doğru

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara