Download as pdf or txt
Download as pdf or txt
You are on page 1of 28

3.

Python ile Veri Görselleştirme

Özlü Söz
Bir resim bin kelimeye bedeldir.

Anonim

Kazanımlar
1. Veri görselleştirmenin önemini anlar, farklı görselleştirme tekniklerinin projelerde nasıl
kullanılabileceğini bilir.

2. Çizgi grafiğinin (line chart) kullanım alanlarını anlar, Python programlama dili ile ihtiyaç duyulan çizgi
grafiğini çizebilir.

3. Sütun grafiği (bar chart) kullanarak kategorik verileri nasıl görselleştirebileceğini anlar, Python
programlama dili ile ihtiyaç duyulan sütun grafiğini çizebilir.

4. Pasta grafiğinin (pie chart) oranları ve yüzdeleri nasıl temsil ettiğini anlar, Python programlama dili ile
ihtiyaç duyulan pasta grafiğini çizebilir.

5. Serpilme/saçılım diyagramının (scatter plot) iki değişken arasındaki ilişkiyi nasıl görselleştirdiğini anlar,
aykırı değerleri serpilme diyagramı ile tespit edebilir, korelasyon ve dağılım analizi yapabilme yeteneği
kazanır, Python programlama dili ile ihtiyaç duyulan serpilme diyagramını çizebilir.

6. Histogramın veri setindeki frekans dağılımını nasıl gösterdiğini anlar, niteliklerin dağılımını ve
yoğunluğunu görsel olarak analiz edebilir, Python programlama dili ile ihtiyaç duyulan histogramı çizebilir.

7. Kutu grafiği (box and whiskers plot) ile bir niteliği görsel olarak ifade edebiliri aykırı değerleri kutu
grafiği ile tespit edebilir, farklı gruplar arasındaki karşılaştırmaları kutu grafiği üzerinden yapabilir, Python
programlama dili ile ihtiyaç duyulan kutu grafiğini çizebilir.

8. Violin grafiğini kutu grafiği ile karşılaştırabilir, bir niteliğin dağılımını ve yoğunluğunu violin grafiği ile
nasıl görselleştirebileceğini bilir, Python programlama dili ile ihtiyaç duyulan violin grafiğini çizebilir.

9. Isı haritasının (heatmap) matris şeklindeki veriyi kullanarak nasıl görselleştirdiğini anlar, nitelikler
arasındaki ilişkileri ısı haritası ile görsel olarak analiz edebilir, Python programlama dili ile ihtiyaç duyulan
ısı haritasını çizebilir.

Birlikte Düşünelim
1. Makine öğrenmesi sürecinde veri görselleştirmenin hangi aşamalarda kullanılması faydalı olabilir?

2. Sürekli bir nitelik çizgi grafiği ile görselleştirilebilir mi?

3. Hangi durumlarda sütun grafiğinin tercih edilmesi mantıklı olabilir? Hangi veri tipindeki niteliği
kullanmak uygun olur?

4. Öğrencilerin sene sonu harf notu (AA, BA, BB, BC, CC, DD, FF) yüzde dağılımı Python programlama
dili kullanılarak pasta grafiği ile nasıl görselleştirilebilir?

5. Serpilme diyagramı ile iki nitelik arasındaki ilişki görselleştirebilir mi? Bir örnek ile açıklayınız.

6. Histogram, bir niteliğin dağılımını görselleştirebilir mi?

7. Kutu grafiği ile niteliğe ilişkin temel tanımlayıcı istatistiki bilgilere ulaşmak mümkün müdür?

8. Kategorik bir niteliğin kutu grafiği çizilebilir mi?

9. Sütun grafiği ve kutu grafiği arasında temel farklar nelerdir?

10. Hangi grafik türleri ile aykırı değerler tespit edilebilir?

11. Hangi grafik türleri ile niteliğin dağılımı konusunda fikir sahibi olunur?

12. Hangi durumlarda Violin grafiği tercih edilebilir?

13. Python ile ısı haritası kullanarak nitelikler arasındaki ilişkiler incelenebilir mi? Niteliklerin hangi veri
tipinde olması uygun olur?

Başlamadan Önce
Veri görselleştirme (data visualization), veriyi anlama ve raporlamada önemli bir araçtır. Dolayısıyla
makine öğrenmesi süreci için de önemli bir rol oynamaktadır. Bu bölüm, veri görselleştirmede kullanılan bazı
temel ve gelişmiş grafik türleri hakkında teorik bilgilerin yanı sıra her bir grafiğin Python programlama dili
kullanılarak çizimi ve yorumlanmasını içerir.

Çizgi grafiği (line chart), sütun grafiği (bar chart), pasta grafiği (pie chart), serpilme diyagramı (scatter
plot), histogram, violin grafiği ve ısı haritası (heatmap) bu bölümde ele alınan grafik türleri arasındadır.
Grafiklerin temel kullanımının yanı sıra farklı grafik türleri üzerinden nitelikler arasındaki ilişkilerin
görselleştirilmesi, aykırı değer tespiti, niteliğin dağılımının grafikler üzerinden keşfedilmesi gibi konulara yer
verilmiştir. Bu kapsamda Python’da veri görselleştirmede sıklıkla kullanılan Matplotlib ve Seaborn
kütüphanelerinden faydalanılmıştır. Diğer tüm hesaplamalarda da Numpy ve Pandas kütüphaneleri
kullanılmıştır.

Bu bölümden itibaren ele alınan konuların Python kodları verildiğinden okuyuculara bu bölüme başlanmadan
önce Bölüm 2.8’de anlatılan gerekli kurumların tamamlanması tavsiye edilmektedir. Bu kitapta
gerçekleştirilen analizlerde Python programlama dili (versiyon 3.11.6) ve Spyder (versiyon 5.5.0)
(Scientific PYthon Development EnviRonment) Bütünleşik Geliştirme Ortamı (Integrated Development
Environment- IDE) kullanılmıştır.

Bu bölüm ile veri görselleştirme üzerine kazanılan tecrübenin pekiştirilebilmesi için okuyuculara, kamuya
açık ya da uzmanlık alanlarına göre seçecekleri farklı veri setler üzerinde çalışmaları tavsiye edilmektedir.
3.1. Veri Görselleştirmeye Genel Bakış
Bazen “tek bir resim binlerce sözcüğe bedeldir” denilir (Shmueli vd., 2018). Bir düşünce ya da fikri
sayfalarca metinle açıklamak yerine tek bir görselle ifade etmek metinden çok daha fazla şey
anlatabilmektedir. Veri bilimi çalışmalarında analizlere başlamadan önce veriyi anlama, analizler sırasında
elde edilen sonuçları yorumlama ve analizler sonrasında karar vericiler için rapor hazırlama aşamalarında
veri görselleştirmenin (data visualization) sağladığı avantajlardan yararlanılmaktadır.

Bu bölümde Python programlama dilini kullanılarak bazı temel ve ileri düzey veri görselleştirme yöntemleri
Matplotlib (Hunter, 2007) ve Seaborn (Waskom, 2021) isimli iki önemli veri görselleştirme kütüphanesi
uygulamalarıyla açıklanacaktır. Analizler sırasında NumPy (C. R. Harris vd., 2020) ve Pandas (McKinney,
2010) kütüphanelerinden faydalanılmıştır. Bu sebeple Python’da bu sayılan kütüphaneler yüklü değilse
kodlamaya geçilmeden önce yüklenmelidir.

CMD komut istemi ekranı (console) (Şekil 18), Apple ve Linux işletim sistemlerinde Terminal ekranı veya
Spyder’da sağ alt pencerede yer alan “Terminal” aracılığı ile (Şekil 19) aşağıdaki kod bloğunda ilk dört kod
satırını kullanarak bu kütüphaneler yüklenebilir (Önemli Not: Spyder’ın 5.5.0 versiyonunda Terminal
mevcut değildir). Kütüphaneler yüklendikten sonra bu kütüphanelerin fonksiyonlarını, veri setlerini vb.
Python kodunda kullanabilmek için import sözcüğü ile çalışmaya dâhil edilmelidir. NumPy, Pandas,
Matplotlib.pyplot ve Seaborn en sık kullanılan kısa adları olan np, pd, plt ve sns ile çağrılmıştır.

Şekil 18: CMD komut istemi ekranı ile kütüphanelerin yüklenmesi.

Şekil 19: Spyder’ın Terminal ekranı aracılığı ile kütüphanelerin yüklenmesi.


matplotlib.pyplot as plt kod satırı, Matplotlib kütüphanesinin matplotlib.pyplot modülünü plt takma ismiyle
koda dahil etmek için kullanılır. Böylece plt ismi çağrıldığında matplotlib.pyplot modülündeki fonksiyonlar
kullanabilecektir. matplotlib.pyplot modülü grafikler oluşturmak, veri görselleştirmek ve çeşitli grafik
özelliklerini ayarlamak için kullanılmaktadır.

Bu bölümde ele alınan uygulamada bir sağlık sigortası şirketine ait müşteri verisi (insurance.csv)
kullanılmıştır (kaggle, 2018): https://www.kaggle.com/bmarco/health-insurance-data?select=insurance.csv.
Veri setinde toplamda 1338 adet örnek (observation/sample), 7 adet nitelik (attribute) bulunmaktadır (Tablo
16). Veri seti bir Pandas DataFrame olarak saklanmıştır.

Tablo 16: Sigorta veri seti.

Çalışma klasörünün oluşturulması ve Spyder’da hazırlık: Veri görselleştirme tekniklerinin detaylarına


geçmeden önce veri seti, veri kaynağından bilgisayara indirilmelidir. Çalışmalarda kolaylık olması için
bilgisayarda bir çalışma klasörü (working directory) oluşturulması ve ardından Spyder’da sağ üst köşede yer
alan klasör simgesi (

browse a working directory) ile çalışma klasörü konumunun belirlenmesi ve son olarak kodların yazıldığı
Python betik dosyası ile bilgisayara indirilen insurance.csv veri seti dosyasının aynı çalışma klasöründe yer
alması gerekmektedir.

Çalışma klasörüne kopyalanan insurance.csv dosyasını okumak için Pandas kütüphanesinden pd.read_csv()
fonksiyonu kullanılmıştır. Bu fonksiyona yalnızca “insurance.csv” argümanı verilmiştir. Herhangi bir dosya
yolu belirtilmemiştir. Çünkü zaten üzerinde çalışılan Python betik dosyası ile veri seti aynı klasör içinde
bulunmaktadır.
Veri seti okunduktan sonra nitelik adları Türkçeleştirilmiştir. Yani age yerine yas, sex yerine cinsiyet, …
kullanılmıştır.

Veri analizlerinde olduğu kadar veri görselleştirmede de dikkat edilmesi gereken unsurlardan biri niteliklerin
veri türüne uygun grafiklerin seçilmesidir. Bu nedenle veri setindeki niteliklerin veri tipini kontrol etmek ve
gerekiyorsa uygun veri tipi dönüşümünü yapmak önemlidir. Cinsiyet (sex), sigara içme durumu (smoker) ve
bölge (region) kategorik nitelikler olduğundan veri tipleri category veri tipine dönüştürülmüştür.
Dönüştürme işlemi öncesinde ve sonrasında veriSeti.dtypes kodu kullanılarak niteliklerin veri tipi kontrol
edilmiştir (Şekil 20).

Şekil 20: Veri tipi dönüşümü öncesi ve sonrasında niteliklerin durumu.

Veri setinde cinsiyet, sigaraDurum ve bolge niteliklerinin kategorileri Türkçeleştirilmiştir. Örneğin; aşağıda
yer alan Python kod bloğunun ilk satırında cinsiyet niteliğindeki male, female kategorileri yerine sırasıyla
erkek, kadın atanmıştır. sigaraDurum ve bolge niteliklerinin kategorileri de benzer mantıkla
değiştirilmiştir.
Veri setinin describe() fonksiyonu ile elde edilen özeti Şekil 21’de verilmiştir.

Şekil 21: Veri seti özeti.

Şekil 21’e dikkat edilirse veri seti özetinde sadece nümerik nitelikler yer almaktadır. Eğer tüm nitelikler
görüntülenmek istenirse describe() fonksiyonuna include="all" parametresi eklenmelidir. Ayrıca yan yana
gösterilecek sütun sayısı display.max_columns ile 20 olarak ayarlanmıştır. Elde edilen son ekran görüntüsü
Şekil 22’de verilmiştir.
Şekil 22: Veri seti özeti.

3.2. Çizgi Grafiği


Veri görselleştirmede tercih edilen yardımcı en temel yöntemlerden biri çizgi grafiğidir (line chart). Örneğin
ilk 10 müşterinin yaşlarının çizgi grafiği aşağıdaki kod bloğu ile elde edilmiştir (Şekil 23). Matplotlib
kütüphanesinin grafik çizmek için kullanılan en temel fonksiyonu plot() fonksiyonudur. plot()
fonksiyonunun ilk parametresi grafiğin x-ekseninde, ikinci parametre ise y-ekseninde yer alacak değerleri
almaktadır. x-ekseninde müşterilerin 1’den 10’a kadar indeks numaralarını (ID) gösterebilmek için range()
ile bir dizi tanımlanarak x değişkenine atanmıştır. y değişkenine ise veri setinin yas niteliğine ait ilk 10 değeri
atanmıştır. Grafikteki veri noktalarının kırmızı yuvarlaklar ile gösterimini sağlayan ise "o:r" değeridir.
Şekil 23: İlk 10 müşteri yaşlarının çizgi grafiği ile gösterimi- 1.

Aynı grafik her bir veri noktasında siyah üçgenler yer alacak şekilde aşağıdaki kod yardımı ile çizdirilebilir
(Şekil 24).

Şekil 24: İlk 10 müşteri yaşlarının çizgi grafiği ile gösterimi- 2.

Aşağıdaki kodda plot() fonksiyonda linestyle parametresiyle çizgi tipi, color parametresiyle çizgi rengi,
linewidth parametresiyle çizgi genişliği ayarlanmış ve elde edilen grafiğin ekran görüntüsü Şekil 25’te
verilmiştir.

Şekil 25: İlk 10 müşteri yaşlarının çizgi grafiği ile gösterimi- 3.

İlk yirmi ve ikinci yirmide yer alan müşterilerin vücut kitle indeksi değerlerinin (vki) çizgi grafiği üzerinde
karşılaştırılabilmesi için aşağıdaki kodlar kullanılabilir (Şekil 26). Aşağıdaki kod bloğunda, özellikle grafik
çizimine ilişkin (plt ile bağlantılı) kod satırlarının tümünün seçilmesi ve aynı anda çalıştırılması
gerekmektedir. Aksi halde, grafik düzgün bir biçimde görüntülenemeyecektir. plt.xticks(x1) kod satırı ile
grafikte x-eksenine gelecek sayıların x1 değişkeni ile tanımlanan tam sayılar olması sağlanmıştır.
Şekil 26: İlk ve ikinci 20’deki müşterilerin çizgi grafiği ile vücut kitle indeksi karşılaştırması- 3.

Şekil 27’de ilk 50 müşterinin yaşı çizgi grafiği ile gösterilmektedir. xlabel() fonksiyonuyla x-ekseninin adı,
ylabel() ile y-ekseninin adı verilmektedir. Grafiğin x ve y eksenlerine ızgara (grid) eklemek için plt.grid()
kullanılabilir. İstenirse sadece x-eksenine yatay ya da sadece y-eksenine de dikey çizgiler eklenebilir. Bunu
sağlayan kodlar yorum satırı olarak verilmiştir. Bu yorum satırları kaldırılarak inceleme yapılabilir.
Şekil 27: İlk 50 müşterinin yaşlarının çizgi grafiği üzerinde gösterimi.

Bazı durumlarda aynı grafik alanında birden fazla grafiğin görüntülenmesi istenebilir (Şekil 28). Örneğin; ilk
yirmi ve ikinci yirmide yer alan müşterilerin yaşlarını alt alta iki farklı çizgi grafiğinde elde edebilmek için
aşağıdaki kod bloğu kullanılabilir. Burada dikkat edilmesi gereken plt.subplot() fonksiyonudur.
plt.subplot(2, 1, 1) grafik alanının 2 satır ve 1 sütun olarak ayarlandığını ve ilk grafikle ilgili tanımlamaların
yapıldığını söylemektedir. plt.subplot(2, 1, 2) ise grafik alanının 2 satır ve 1 sütun olarak ayarlandığını ve
ikinci grafikle ilgili tanımlamaların yapıldığını söylemektedir. plt.suptitle() ile tüm grafiğin başlığı verilir.
plt.tight_layout() fonksiyonundaki pad parametresi, aynı çerçevede listelenen grafiklerin birbirleriyle olan
mesafesini ayarlamak için kullanılır. Bu parametre kullanılmadığında ilk grafiğin x-eksenine ait etiketler ile
ikinci grafiğin başlığı iç içe geçmektedir.

Şekil 28: Grafik alanının 2x1 şeklinde kullanılması.


Yukarıdaki kod bloğunda iki adet yorum satırı mevcuttur.

• plt.subplot(2, 1, 1) satırının yorumu kaldırılıp yerine plt.subplot(1, 2, 1) satırının başına yorum eklenirse

• plt.subplot(2, 1, 2) satırının yorumu kaldırılıp yerine plt.subplot(1, 2, 2) satırının başına yorum eklenirse

ve aynı kod bloğu yeniden çalıştırılırsa bu kez de grafik alanı 1x2 şeklinde kullanılmış olur ve Şekil 29 elde
edilir.

Şekil 29: Grafik alanının 1x2 şeklinde kullanılması.

Elde edilen son grafikte (Şekil 29) x-eksenindeki etiketlerin iç içe geçmiş olduğu görülebilir. Bu nedenle,
grafik alanı biçimlendirmesi önemli bir konudur. plot() fonksiyonuna ait birçok parametre bulunmaktadır.
Bunlar help(plt.plot) ile incelenebilir.

3.2. Sütun Grafiği


Sütun grafiği (bar chart) sıkça kullanılan grafik türleri arasında yer almaktadır. Sütun grafiği, dikey veya
yatay eksendeki sütunların boylarına göre veriyi yorumlamak için kullanılır. Python programlama dilinde
plt.bar() fonksiyonu yardımıyla sütun grafiği çizilebilir. Veri setinde yer alan müşterilerin sigara içme
durumuna (sigaraDurum) göre sigorta şirketine ödenen ortalama miktar (odemeMiktari) araştırılmak
istensin. Sütun grafiği çizilmeden önce veri setine groupby() fonksiyonu yardımıyla sigara içip içmeme
durumuna göre ortalama ödeme miktarı ozet serisine atanmıştır. Ardından sigara içip içmeme durumları
(evet/hayır) x ekseninde (x parametresi), ortalama ödeme miktarları da y ekseninde (height parametresi)
olacak biçimde sütun grafiği elde edilmiştir. Grafiği görsel açıdan zenginleştirmek için ihtiyaca yönelik farklı
parametreler de kullanılabilir.
Şekil 30: Müşterilerin sigara içme durumlarına göre ortalama ödeme miktarı- 1.

Şekil 30’da yer alan sütun grafiğinde her bir sütunun üzerine sigara içen ve içmeyenlerin ortalama ne kadar
ödeme yaptığını gösteren veri etiketi eklemek için aşağıdaki kullanıcı tanımlı Python fonksiyonu
kullanılabilir. Bu fonksiyon sırasıyla x ve height parametrelerine gelen veriyi almaktadır. Ortalama ödeme
miktarının grafiğin üzerinde fazla yer kaplamaması için .round(2) fonksiyonu ile virgülden sonra iki
basamak yuvarlanmıştır. Elde edilen grafik Şekil 31’de verilmiştir.

Şekil 31: Müşterilerin sigara içme durumlarına göre ortalama ödeme miktarı- 2.

Şekil 31’de verilen sütun grafiğine göre sigara içen müşterilerin sigortaya yaptığı ortalama ödeme miktarı
(32050.23) sigara içmeyenlerin yaptığı ortalama ödeme miktarına (8434.27) göre yaklaşık 4 kat fazladır.
Eğer plt.bar() yerine plt.barh() fonksiyonu kullanılırsa dikey sütun yerine yatay sütun grafiği elde
edilecektir. Bu durumda, x ve height parametrelerinin yerini sırasıyla y ve width parametrelerinin alacağı
unutulmamalıdır (Şekil 32).

Şekil 32: Sütun grafiğinin yatay biçimde elde edilmesi.

plt.bar() fonksiyonunda width parametresi, plt.barh() fonksiyonunda height parametresi sütunlar arasında
kalan boşluğu belirlemektedir. Aşağıda verilen kod satırları çalıştırıldığında Şekil 33 elde edilecektir.

Şekil 33: Sütun grafiğinde sütunlar arası boşluğun incelenmesi.

3.3. Pasta Grafiği


Tıpkı sütun grafiği gibi pasta grafiği (pie chart) de iyi bilinen ve çokça tercih edilen grafikler arasındadır.
Frekans ve yüzde değerlerinden yola çıkılarak kategorik bir nitelik pasta grafiği ile kolaylıkla ifade edilebilir.
Örnek olarak müşterilerin bölgelere göre sigortaya yaptığı toplam ödeme miktarının yüzdesi plt.pie()
fonksiyonuyla pasta grafiği biçiminde verilmiştir (Şekil 35). Grafik oluşturulmadan önce bölgelere (bolge)
ait kategorilerin her biri için toplam ödeme miktarı (odemeMiktari) groupby() fonksiyonu yardımı ile
hesaplanmış ve bu bilgiler ozet serisinde saklanmıştır (Şekil 34).
Şekil 34: ozet serisi.

Sonrasında bu ozet veriden hareketle pasta grafiğinin üzerinde yer alacak veri etiketleri (etiketler), grafik
oluşturulurken kullanılan ortalama ödeme miktarları (degerler), sns kütüphanesinde yer alan viridis renk
paletinden dört farklı renk (renkler) ve pasta dilimlerinin dışa doğru ayrılma oranları (secim) tanımlanmıştır.
Ardından plt.pie() fonksiyonu kullanılarak pasta grafiği çizilmiştir. Grafiğin üzerinde yüzdelerin gösterilmesi
için autopct kullanılmaktadır. Grafiğin üzerinde % işareti başta yer alacaktır, bunun için %% olmak üzere
iki adet yan yana yüzde işareti kullanılmıştır. Ondalıklı sayının (float) virgül dahil toplam 4 karakter,
virgülden sonra tek basamak gösterilmesi için 4.1f kullanılmıştır. Pasta grafiği başlangıcının x ekseninden
saat yönünün tersine biçimde döndürüldüğü açı startangle=360 olarak belirlenmiştir (Şekil 35).

Veri görselleştirmede renklerin önemi de yadsınamazdır. Birbiriyle zıt ya da uyumlu renklerin seçilebilmesi
için bu örnekte olduğu gibi birçok farklı renk paleti bulunmaktadır. Örneğin viridis, inferno, magma, icefire,
Spectral, Reds, summer, vb. Renk paletleri konusunda daha fazla bilgi için bknz. (HolyPython.com, 2023).

Şekil 35: Müşterilerin bölgeye göre toplam ödeme miktarı yüzdesini gösteren pasta grafiği.

Şekil 35’te yer alan pasta grafiğine göre sigortaya yapılan toplam ödeme miktarının bölgeler arasında
yüzdesel dağılımı incelendiğinde güneydoğu bölgesi %30.2 ile en büyük dilime sahiptir. Ardından %24.5 ile
kuzeydoğu, 22.7 ile kuzeybatı ve son olarak da %22.6 ile güney batı bölgeleri gelmektedir.
3.4. Serpilme Diyagramı
İki değişken arasındaki ilişkiyi belirlemek için serpilme diyagramı (scatter plot) kullanılabilir. Serpilme
diyagramında bir nitelik x ekseninde diğer nitelik y ekseninde verilebilir. Şekil 36’daki serpilme
diyagramında müşteri yaşlarına (yas) göre vücut kitle indekslerinin (vki) dağılımı görülebilir. Diyagramın
üzerindeki her bir nokta x ve y eksenlerinde yer alan niteliklere göre veri setindeki her bir gözlemi temsil
etmektedir. Diyagram plt.scatter() fonksiyonu ile kolayca çizilebilmektedir. x ve y eksenlerinde kullanılacak
nitelikler ile eksen adları belirlenerek en temel grafik görünümü elde edilebilir (Şekil 36).

Şekil 36: Müşterilerin yaşlarına göre vücut kitle indekslerinin verildiği serpilme diyagramı.

Serpilme diyagramındaki noktalar soldan sağa doğru yokuş yukarı bir grafik çiziyorsa x ve y eksenlerindeki
nitelikler arasında pozitif yönlü bir ilişki olduğu anlamına gelir. Yani x arttığında y de artma eğilimindedir
(Bknz. Şekil 37). Eğer noktalar soldan sağa doğru yokuş aşağı bir grafik çiziyorsa bu durumda da x ve y
eksenlerindeki nitelikler arasında negatif yönlü bir ilişki olduğu söylenir. Yani x arttığında y azalma
eğilimindedir. Bahsedilen iki durumdan hiçbiri yoksa x ile y arasında bir ilişki yoktur denebilir.
Şekil 37: Müşterilerin yaşlarına göre ödeme miktarlarının verildiği serpilme diyagramı.

Şekil 37’de yer alan serpilme diyagramının çizimi için gereken Python kodları aşağıda verilmiştir.

Serpilme diyagramıyla iki nitelik arasında doğrusal bir ilişkinin olup olmadığı gözlemlenebilir. Böyle bir
durumda gözlemler yokuş yukarı ya da yokuş aşağı yönde bir doğru boyunca uzanır. Şekil 37’de veri
setinden alınan 10 gözleme ait yaş ile ödeme miktarının serpilme diyagramı çizdirilmiştir. Diyagram, 10
gözlem için yaş ve ödeme miktarı nitelikleri arasında doğrusal bir ilişki olduğunu göstermektedir; ancak bu
ödeme miktarındaki bir artışın yaşta artışa neden olduğu anlamına gelmemektedir. Buradan hareketle
serpilme diyagramları iki nitelik arasındaki olası bağlantı (association) veya ilişkiyi (relationship) gösterir;
ancak bu bağlantı iki nitelik arasında bir neden-sonuç ilişkisinin olduğu anlamına gelmez (Rumsey, 2021a).
Bu durum şu örnekle açıklanabilir: Her gün C vitamini alan kişilerin daha az COVID-19’a yakalandığı
gözlemlenmiş olsun. O halde C vitamininin COVID-19’u önlediği söylenebilir mi? Bu sorunun cevabı “her
zaman değil” olmalıdır. Çünkü COVID-19’dan korunmak için maske takma, diğer kişilerle mesafeli olma,
sık sık el yıkama gibi pek çok önlem faktörü mevcuttur. COVID-19’dan korunmak ve bağışıklığını
güçlendirmek isteyen insanlar her gün C vitamini alıyor olabilirler; ancak yukarıda bahsedilen faktörlere de
aynı zamanda dikkat etmiş olabilirler. Gerçekten C vitamininin COVID-19 hastalığı üzerindeki etkisi
araştırılmak isteniyorsa diğer faktörlerin sabitlendiği ya da dışarıda tutulduğu iyi bir deney tasarımına ihtiyaç
duyulacaktır.

Veri setinde bulunan kategorik nitelikler serpilme diyagramında farklı renklerde gösterilebilir, yani grafiğe
üçüncü bir boyut eklenebilir. Yaşa göre müşterilerin sigortaya ödeme miktarlarını sigara içip içmeme
durumları tüm veri setindeki gözlemler dikkate alınarak Şekil 38’de verilmiştir. Bu gösterim için
sns.scatterplot() fonksiyonu çağırılmıştır.
Şekil 38: Müşterilerin yaşlarına göre ödeme miktarlarının verildiği serpilme diyagramı- 2 (renklendirme
sigara içme durumuna göre yapılmıştır).

Şekil 38’e göre genel olarak sigara içmeyen müşterilerin sigortaya ödedikleri miktarın içenlere göre daha alt
bir aralıkta (0-20000) seyrettiği görülmektedir. Ayrıca, sigara içen ve içmeyen müşterilerde yaş arttıkça
yapılan ödeme miktarı da artmıştır.

Serpilme diyagramı üç-boyutlu da çizilebilir. Örneğin sigortaya yapılan ödemenin yaşa göre incelendiği
serpilme diyagramına vücut kitle indeksi niteliği üçüncü boyut olarak eklenirse Şekil 39 elde edilir. Öncelikle
çizilecek grafiğin boyutları belirlenmiştir. Ardından grafikte 3-boyutlu bir çizimin yapılacağı projection
="3d" ile ifade edilmiştir. Sonrasında ax.scatter() fonksiyonuna x, y ve z eksenlerinde yer alacak nitelikler
sırasıyla yaş (yas), ödeme miktarı (odemeMiktari) ve vücut kitle indeksi (vki) olarak verilmiştir. Her bir
eksenin etiketi atanmış; yalnızca z-ekseninin etiketinin dikey biçimde yazdırılabilmesi için rotation=90
kullanılmıştır. Ayrıca z ekseni etiketinin grafiğin üzerinde olması için dolgu seçeneği (labelpad) -0.7 olarak
belirlenmiştir.
Şekil 39: 3-boyutlu serpilme diyagramı.

Pandas kütüphanesinde yer alan pd.plotting.scatter_matrix() fonksiyonu, belirlenen niteliklere ait serpilme
diyagramının matrisini verir. Bu matris yardımıyla tüm nümerik nitelikler arasında çizilebilecek olası tüm
serpilme diyagramlarının görüntülenmesinin yanı sıra matrisin köşegeninde niteliklere ait histogramlara da
yer verir (Şekil 40).
Şekil 40: Serpilme diyagramı matrisi.

3.5. Histogram
Genellikle sütun grafiğine benzeyen veri görselleştirme yöntemlerinden biri de histogramlardır; ancak
aralarındaki en önemli farklardan biri yatay eksende sütun grafiğinde kategorik bir nitelik yer alırken
histogramda sürekli değerli bir nitelik kullanılır (Yau, 2014). Ayrıca sütun grafiğinde yalnızca sütunun
yüksekliği yorumlanırken histogramda sütuna ait hem yükseklik hem de genişlik değerlendirmeye alınır.

Histogram, her sınıfa özgü oluşturulan dikdörtgenlerden oluşturulur (Ünver vd., 2021). Dikdörtgenlere ya da
her aralığa düşen gözlemlerin sayısı sayılır ve bir frekans dağılım grafiği elde edilir (NCSS Statistical
Software, 2023): Dikey eksen frekansı, yatay eksen ise veri değerlerinin olası aralığını temsil eder.
Histogramlar, tek bir sürekli niteliğin normal dağılıma (Gauss dağılımına) uyup uymadığı (normalliği), sağa
ya da sola çarpık olma ya da ortaya toplanmış olma durumu hakkında bilgi verir.

Örneğin müşterilerin vücut kitle indeksleri incelenmek istensin. Aşağıda sns.histplot() fonksiyonu ile dikey
ve yatay iki histogram çizilmiştir. Veri setinde histogramı çizilecek olan niteliğin adı, ilk dikey histogramda
x, ikinci yatay histogramda ise y parametresine verilmiştir (Şekil 41).
Şekil 41: Dikey ve yatay histogramlar.

Histogramın en önemli parametrelerinden biri eşit genişlikli dikdörtgenlerin ya da bölmelerin sayısını


belirleyecek olan bins parametresidir. Varsayılan olarak bunu sns.histplot() fonksiyonu otomatik olarak
belirlemektedir; ancak bins belirli sayısal değerler de alabilir.

Şekil 42: Farklı bölme sayıları kullanarak çizilen vücut kitle indeksi histogramları.

Şekil 42’deki sarı histogram ele alınsın. Grafikte 8 adet bölme ortaya çizdirilmiştir. İlk bölmede vücut kitle
indeksi yaklaşık 16 ile 21 arasında olan 50 müşteri yer alırken, ikinci bölme vücut kitle indeksi 21 ile 26
arasında olan 200 kişinin olduğuna işaret etmektedir. Grafiğin en sağ tarafında yer alan bölmedeki müşteriler
uç nokta olarak düşünülebilir. Çünkü vücut kitle indeksi 48 ve üzerinde oldukça az sayıda müşteri mevcuttur.

Niteliğin veri dağılımı simetrik olduğunda histogram da simetrik biçimde elde edilir. Sağ ve sol kuyruklar
birbiriyle dengeli, ortalama ve ortanca değer ise (yaklaşık olarak) birbirine eşittir. Veri setinden iki ayrı alt
küme elde edilmiş ve bu alt kümelerde de müşterilere ait vücut kitle indeksleri kullanılarak Şekil 43’te yer
alan iki farklı histogram çizilmiştir. Histogramların adlarından da görülebileceği gibi elde edildikleri alt
kümelerin ilkinde niteliğin dağılımı sağa çarpık (pozitif çarpıklık), ikincisinde ise sola çarpıktır (negatif
çarpıklık). Dağılım sağa çarpık olduğunda;

• ortalama ortanca değerden büyüktür,

• sağ kuyruk sol kuyruktan daha uzundur,

• ortanca değer birinci kartil (quartile) değerine daha yakındır.

Dağılımın sola çarpık olması durumunda yukarıda sayılan durumların aksi meydana gelmektedir.

Şekil 43: Histogram örnekleri.

3.6. Kutu Grafiği


Kutu-bıyık grafiği (box and whisker plot) ya da kısaca kutu grafiği birden fazla grubun dağılımını birbiriyle
karşılaştırmak için sıklıkla kullanılan grafik türlerinden biridir. Örnek olarak öncelikle aşağıdaki kod bloğu
ile vücut kitle indeksi özeti incelenirse en küçük değerin 15.96, en büyük değerin 53.13, ortalamanın 30.66,
ortanca değerin (median) 30.40, 1. kartil değerin 26.30 ve 3. kartil değerin 34.69 olduğu görülebilir (Şekil
44).

Şekil 44: Veri setinde odemeMiktari değişkeninin özet bilgisi.

Aşağıdaki kodlar yardımı ile vücut kitle indeksi (vki) niteliğinin kutu grafiği çizilebilir. plt.boxplot()
fonksiyonu yardımıyla elde edilen kutu grafiği Şekil 45’te verilmiştir. vert parametresi grafiğin dikey
çizileceğini gösterir. Kutu grafiği üzerinde ortalamanın ve ortalama çizgisinin de gösterileceği sırasıyla
showmeans ve meanline parametreleri ile belirlenmiştir. medianprops ve meanprops parametreleri
sırasıyla ortanca değer ve ortalama çizgilerine ait özellikleri göstermektedir. Kutu grafiğine çentik eklemek
için notch parametresi kullanılmaktadır. Niteliğin ortanca değerine ilişkin güven aralığını gösteren kutu
grafiğindeki bu çentik, varsayılan olarak %95'lik bir güven aralığını temsil etmektedir.

Şekil 45: Veri setinde vücut kitle indeksi niteliğinin kutu grafiği.

Grafikte bıyık çizgisinin üstünde yer alan ve nokta olarak temsil edilen gözlem değerleri vücut kitle indeksi
niteliğinin (vki) aykırı değerleridir (outliers). Niteliğe ait en büyük ve en küçük değerler sırasıyla 53.13 ve
15.96 olarak görülebilir.

Kutu grafiğinde kutunun bir kısmının diğerinden daha uzun olması o tarafın daha fazla veri içerdiği anlamına
gelmez. Çünkü bu gösterim örnek boyutunun kendisine değil, örnek boyutunun yüzdelerine dayanır
(Rumsey, 2021b). Biri diğerinden daha uzunsa bu bölümdeki veri değerleri daha geniş bir aralığı gösterir,
diğer bir ifadeyle veri daha dağınıktır (Rumsey, 2021b). 1. çeyreklik kısım (Q1) verinin %25’ini, 3. çeyreklik
kısım (Q3) ise verinin %75’ini kapsar. 2. çeyrek değeri aynı zamanda veri setinin ortanca (median) değeridir
(30.40). Ortalama değer (mean), ortanca değerin hemen üzerinde 30.66 yer almıştır. IQR biçiminde gösterilen
ise çeyrekler arası aralıktır (interquartile range) ve verinin orta %50’lik kısmını kapsar. Bu aralık ne kadar
büyük olursa veri seti de o kadar değişkendir (Rumsey, 2021b).

Histogramda olduğu gibi kutu grafiğinden de veri dağılımının (normal dağılıma göre) durumu, simetrisi, sağa
ya da sola çarpık (pozitif ya da negatif çarpık) olduğu belirlenebilmektedir (Şekil 46). Simetrinin şeklinin
tespiti için yalnızca kutu grafiğine bağlı kalınmaması ve analizlerde kutu grafiği ile birlikte histogramın da
kullanılması tavsiye edilmektedir (Rumsey, 2021b).
Şekil 46: Veri dağılımının incelendiği kutu grafiği örnekleri.

Şekil 47’de yer alan tüm yazılar, oklar ve değerler kutu grafiğinin R dili (cran.r-project.org, 2023) ile
çiziminden sonra draw.io (2021) ile eklenmiştir.

Şekil 47: Kutu grafiği.

Şekil 45 ve Şekil 47’den görüleceği gibi vücut kitle indeksine ilişkin aykırı değerler 34.69’dan büyük olan
gözlem değerleri olarak belirlenmiştir. Hatta nitelikteki en büyük değer de bir aykırı değerdir (53.13); ancak
nokta biçiminde verilen diğer aykırı değerlerin ne olduğu bu halde açıkça görülememektedir.

Kutu grafiğine ilişkin aşağıda verilen örnekte ise müşterilerin sigara içip içmeme durumlarına göre sigortaya
ödedikleri miktarlar karşılaştırılmıştır (Şekil 48). Bu örnek sns.boxplot() fonksiyonu ile çizilmiştir. Yatay bir
kutu grafiği elde edilmek istendiği için sürekli nitelik olan ödeme miktarı (odemeMiktari) x parametresi,
farklı grupları/kategorileri temsilen sigara içme durumu niteliği ise (sigaraDurum) y parametresi olarak
verilmiştir
Şekil 48: Grupların karşılaştırıldığı kutu grafiği.

Şekil 48’de verilen kutu grafiği incelendiğinde, sigara içenlerin ödeme miktarının içmeyenlere göre daha
geniş ve yüksek değerlerdeki bir aralıkta seyrettiği görülebilir. Sigara içen grupta ödeme miktarı sola
çarpıklık göstermektedir. Diğer bir deyişle sigara içenlerin içinde çok ödeme yapanlar az ödeme yapanlara
göre birbirine daha yakındır. Sigara içmeyenlerde ödenen en yüksek miktar 22000 civarındadır; bunun
üzerindekiler aykırı değer olarak görülmüştür.

Ayrıca bir gruba ait kutu grafiğinin ortanca değer çizgisi diğer grubun kutu grafiğinin kutusu dışında kalırsa,
iki grup arasında fark olması muhtemeldir diye düşünülmektedir. Şekil 48’de de sigara içenlerin ortanca
değer çizgisi sigara içmeyen grubun kutusunun dışındadır. Yani sigortaya yapılan ödemeler dikkate
alındığında sigara içenler ve içmeyenler arasında fark olması muhtemeldir denilir.

3.7. Violin Grafiği


Kutu grafiğinin Kernel yoğunluk fonksiyonuyla (Kernel density function) birleştirilmesiyle oluşturulan
Violin grafiği Python’da sns.violinplot() fonksiyonu yardımıyla çizdirilmektedir (Şekil 49). Violin grafiğinin
iki ana unsuru bulunmaktadır. Bunlardan ilki, veri setinin dağılımını temsil eden Violin görseli, ikincisi ise
kutu grafiğidir. Bu nedenle Şekil 49’da elde edilen grafik Şekil 48 ile benzerlik göstermektedir. Ek olarak
kategorilere göre sigortaya yapılan ödemenin (frekans) dağılımı da grafik üzerinde gösterilmiştir.

Violin grafiği, kutu grafiğinden elde edilebilecek sonuçlara ek olarak sayısal bir niteliğin genel dağılımını,
simetrisini ve yoğunluğunu daha ayrıntılı bir şekilde anlamak için kullanılabilir.
Şekil 49: Violin grafiği.

3.8. Isı Haritası


Isı haritası nitelikler arasındaki ilişkiyi belirlemek maksadıyla kullanılır. Veri setinde yer alan dört adet
sayısal nitelik arasındaki ilişkilerin (korelasyon) cor() fonksiyonu ile hesaplanması ve sonrasında ısı haritası
(heat map) ile görselleştirilmesi verinin anlaşılabilmesi açısından faydalı olacaktır (Şekil 51). Öncelikle
corr() fonksiyonu ile Pearson korelasyon katsayılarının tutulduğu korelasyon adlı DataFrame elde
edilmiştir. Pearson korelasyon katsayısı yalnızca nümerik nitelikler arasında hesaplandığından, verilen kod
satırında veri setinde yalnızca nümerik nitelikler seçilmiştir. Pearson korelasyon katsayısı -1 ile +1 arasında
değerler almaktadır. Eğer katsayı 1’e yakınsa iki nitelik arasında pozitif yönde güçlü bir ilişki, -1’e yakınsa
negatif yönde güçlü bir ilişki var denir. Katsayı sıfıra yaklaştıkça nitelikler arasındaki ilişki azalır, zayıflar.

Şekil 50’de verilen korelasyon matrisi simetriktir. Tek bir niteliğin kendi kendine ilişkisinden söz
edilemeyeceğinden köşegende yer alan 1 değerleri yorumlanmaz. Şekil 50 incelendiğinde müşterilerin yaşı
ve sigortaya yaptığı ödeme miktarı arasındaki Pearson korelasyon katsayısının 0.299 olduğu görülecektir. Bu
iki nitelik arasında çok güçlü bir ilişkiden söz edilemez; ancak ilişki yönü pozitiftir (biri artarken diğerinin de
artması, biri azalırken diğerinin de azalması gibi).
Şekil 50: Korelasyon matrisi.

Isı grafiği Seaborn kütüphanesinde sns.heatmap() fonksiyonu yardımıyla çizilebilir. Fonksiyona sırasıyla
korelasyon matrisi ile annot parametresi sayesinde ısı haritası üzerinde gösterilecek olan sayısal değerler
eklenir. Isı haritasındaki her bir bölmenin kare olarak gösterilebilmesi için square=True olarak seçilmiştir.
Bu parametreye False değeri verilip aynı kodlar tekrar çalıştırılırsa fark daha kolay görülebilecektir.

Şekil 51 incelenecek olursa pozitif yönde belirlenen en yüksek ilişki yaş ve sigortaya ödenen miktar
arasındadır. Genel anlamda nitelikler arası ilişkiler pozitif yöndedir; ancak kuvvetli değildir. İlişkilerin
negatif yönde olması durumunda Pearson korelasyon katsayısı da negatif değer alacak ve bu durum grafikte
kırmızı ve tonları şeklinde gösterilecektir.
Şekil 51: Nitelikler arasındaki ilişkilerin ısı haritasıyla gösterilmesi.

Bölüm Özeti
Bu bölüm, Python ile veri görselleştirme (data visualization) üzerine hem teorik hem de uygulamalı bilgileri
içermektedir. Bu kapsamda Python dilinde veri görselleştirmede kullanılan Matplotlib ve Seaborn
kütüphanelerinden faydalanılmıştır. Bu bölümde öğrenilenler hem verinin anlaşılması hem de makine
öğrenmesi projesinin sonuçlarının sunulması adımlarında kullanılabilecektir.

Çizgi, sütun ve pasta grafikleri neredeyse ilkokul yıllarından beri çok iyi bilinen temel grafik türleridir ve bu
grafiklerin Python'da nasıl çizdirileceği anlatılmıştır. Grafiklerin çiziminde veri setinde bulunan niteliklerin
sahip olması gereken doğru veri türüne dikkat çekilmiştir.

Bu bölümde ayrıca daha gelişmiş sayılabilecek serpilme diyagramı (scatter plot), histogram, kutu grafiği
(box and whisker plot), Violin grafiği ve ısı haritası (heatmap) grafiklerine de yer verilmiştir. Python ile
temel ve gelişmiş grafikleri oluşturmanın pratik örnekleri ve kullanım alanlarına yer verilmiştir. Bunun yanı
sıra grafiklerin elde edildikten sonra yorumlanmasına ilişkin açıklamalar okuyucuya sunulmuştur. Bu
bölümde kazanılan tecrübenin pekiştirilmesi için okuyuculara farklı veri setleri üzerinde denemeler
yapmaları önerilmektedir.

Kaynakça
draw.io. (2021). Draw.io. https://app.diagrams.net/

Harris, C. R., Millman, K. J., Walt, S. J. van der, Gommers, R., Virtanen, P., Cournapeau, D., Wieser, E.,
Taylor, J., Berg, S., Smith, N. J., Kern, R., Picus, M., Hoyer, S., Kerkwijk, M. H. van, Brett, M., Haldane, A.,
Río, J. F. del, Wiebe, M., Peterson, P., … Oliphant, T. E. (2020). Array programming with NumPy. Nature,
585(7825), 357-362. https://doi.org/10.1038/s41586-020-2649-2

HolyPython.com. (2023). Colors with Python. HolyPython.Com. https://holypython.com/python-


visualization-tutorial/colors-with-python/

Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. Computing in Science & Engineering, 9(3), 90-
95. https://doi.org/10.1109/MCSE.2007.55

kaggle. (2018). Health Insurance Data. https://www.kaggle.com/bmarco/health-insurance-data?


select=insurance.csv

McKinney, W. (2010). Data Structures for Statistical Computing in Python. İçinde S. van der Walt & J.
Millman (Ed.), Proceedings of the 9th Python in Science Conference (ss. 56-61).
https://doi.org/10.25080/Majora-92bf1922-00a

NCSS Statistical Software. (2023). Chapter 143 Histograms. https://www.ncss.com/wp-


content/themes/ncss/pdf/Procedures/NCSS/Histograms.pdf

Rumsey, D. J. (2021a). How to Interpret a Scatterplot. Dummies.


https://www.dummies.com/education/math/statistics/how-to-interpret-a-scatterplot/

Rumsey, D. J. (2021b). What a Boxplot Can Tell You about a Statistical Data Set. Dummies.
https://www.dummies.com/education/math/statistics/what-a-boxplot-can-tell-you-about-a-statistical-data-set/
Shmueli, G., Bruce, P. C., Yahav, I., Patel, N. R., & Lictendahl, K. C. (2018). Data Mining for Business
Analytics (1. bs). Wiley.

Ünver, Ö., Gamgam, H., & Altunkaynak, B. (2021). Temel İstatistik Yöntemler Olasılık—Hipotez Testleri—
Regresyon Analizi (10. bs). Seçkin Yayıncılık.

Waskom, M. L. (2021). seaborn: Statistical data visualization. Journal of Open Source Software, 6(60), 3021.
https://doi.org/10.21105/joss.03021

Yau, N. (2014, Şubat 27). How to Read and Use Histograms in R. FlowingData.
https://flowingdata.com/2014/02/27/how-to-read-histograms-and-use-them-in-r/

VanderPlas, J. (2016). Python Data Science Handbook: Essential Tools for Working With Data (1st ed.).
O’Reilly Media.

You might also like