VERİ GÖRSELLEŞTİRME DÜNYASINA ADIM: VERİYİ KONUŞTURMA SANATI
Büyük veri (Big Data) çağında yaşıyoruz. Her saniye milyarlarca cihazdan, kullanıcı hareketinden ve sistem logundan akan ham veri nehirleri etrafımızı sarmış durumda. Ancak bu devasa veri yığınları, kendi başlarına sadece dijital gürültüden ibarettir. Satırlar ve sütunlar dolusu sayıların, karmaşık tabloların arasında kaybolmak çok kolaydır.
İşte tam bu noktada devreye, veriyi dijital birer sanat eserine ve stratejik birer silah dönüştüren Veri Görselleştirme (Data Visualization) giriyor.
Veri Görselleştirme Nedir?
En basit tanımıyla veri görselleştirme; sayısal, kategorik veya zamansal ham verilerin; grafikler, haritalar, animasyonlar ve şemalar gibi görsel ögeler kullanılarak ifade edilmesidir.
Ancak veri görselleştirme, sadece “güzel resimler çizmek” ya da raporları süslemek değildir. O, insan beyninin milyonlarca yıllık evrimsel sürecinde kazandığı görsel desenleri anında algılama yeteneğini kullanan evrensel bir dildir. Binlerce satırlık bir Excel tablosuna bakarak dakikalarca analiz etmeye çalıştığınız bir trendi, doğru tasarlanmış tek bir çizgi grafiğinde (line plot) milisaniyeler içinde görebilirsiniz.
Veri Görselleştirmenin Önemi Nedir?
Karmaşıklığı Sadeleştirir: İnsan beyni, ham sayılara kıyasla görsel bilgiyi katbekat daha hızlı işler. Görselleştirme, karmaşık veri yapılarını saniyeler içinde anlaşılır kılar.
Gizli Kalıpları (Patterns) ve Anomalileri Ortaya Çıkarır: Tablolarda gözden kaçan sıra dışı yükselişleri (pikler), düşüşleri, mevsimsel döngüleri veya aykırı değerleri (outliers) bir bakışta görmenizi sağlar.
Karar Alma Süreçlerini Hızlandırır: Yöneticiler, yatırımcılar veya teknik olmayan paydaşlar için uzun dökümanlar yerine tek bir interaktif grafik, doğru kararı saniyeler içinde aldırabilecek güce sahiptir.
Hikaye Anlatımı Sağlar: Veri görselleştirme, verileri kuru birer istatistik olmaktan çıkarıp bir hikayeye dönüştürür. Hikayesi olan veri ise akılda kalıcıdır ve aksiyona ilham verir.
Bu Blog Serisinde Veri Görselleştirme İçin Neleri Kullanacağız?
Yapay zeka ve veri bilimi yolculuğumuzun bu en heyecanlı durağında, kendimizi tek bir araçla sınırlamayacağız. Dünyanın en popüler, en güçlü ve modern veri analistlerinin/veri bilimcilerinin eli ayağı haline gelmiş kütüphaneleri sırasıyla ele alacağız:
Seaborn (Cyborg): Matplotlib tabanlı, istatistiksel analizleriniz için mükemmel estetiğe sahip, renk paletleriyle göz kamaştıran durağan grafikler çizeceğiz. Veri dağılımlarını, yoğunlukları ve sınıfları anlamak için ilk durağımız Seaborn olacak.
Plotly: Statik grafiklerin ötesine geçerek; kullanıcının dokunabildiği, yakınlaştırıp (zoom) uzaklaştırabildiği, fareyi üzerinde gezdirdiğinde (hover) detayları okuyabildiği, haritalar ve animasyonlarla yaşayan dinamik grafikler üreteceğiz.
Nadir Kullanılan Yardımcı Araçlar (Rare Tools): Fark yaratmak, vizyonumuzu ve görsel dağarcığımızı genişletmek için çok az kişinin bildiği ama hayat kurtaran araçlara değineceğiz. Eksik verileri anında haritalandıran Missingno‘dan, ilişkileri ağaçlandıran NetworkX‘e, verinin hiyerarşisini gösteren Cluster Map‘ten Radar (Spider) grafiklerine kadar geniş bir cephaneliğe sahip olacağız.
Hazırsanız, ham veriyi konuşturacağımız ve ona can vereceğimiz bu görsel serüvene başlıyoruz. Bir sonraki yazımızda, bu süreçleri üzerinde koşturacağımız geliştirme ortamlarımızı (Anaconda & Spyder) kuracak ve veri dünyasının kalbinin attığı Kaggle ekosistemine giriş yapacağız.
Emniyet kemerlerinizi bağlayın; verileri konuşturma sanatı başlıyor!
SEABORN İLE İSTATİSTİKSEL VERİ GÖRSELLEŞTİRME
Veri görselleştirme serimizin bu bölümünde, Python dünyasının en estetik ve güçlü istatistiksel grafik kütüphanelerinden biri olan Seaborn (kursumuzdaki adıyla Cyborg) kütüphanesini tüm detaylarıyla ele alıyoruz. Seaborn, doğrudan Matplotlib kütüphanesinin üzerine inşa edilmiş yüksek seviyeli (high-level) bir kütüphanedir. Matplotlib ile onlarca satır kod yazarak elde edebileceğiniz estetik görselleri ve karmaşık istatistiksel çizimleri, Seaborn ile sadece birkaç satırda kolayca oluşturabilirsiniz.
Bu rehberde, gerçek bir veri seti üzerinde Exploratory Data Analysis (EDA – Araştırmacı Veri Analizi) süreçlerini işletecek, kirli bir veriyi nasıl temizleyeceğimizi görececek ve ardından 11 farklı grafik türünün teknik analizini satır satır kodlayarak inceleyeceğiz.
1. SEABORN GİRİŞ VE ÇALIŞMA MANTIĞI
Seaborn’un arkasındaki temel felsefe, Pandas DataFrame yapılarıyla doğrudan ve sorunsuz bir şekilde entegre çalışmaktır. Matplotlib’de verileri listeler veya diziler halinde manuel olarak eşleştirmeniz gerekirken, Seaborn’da data parametresine ilgili DataFrame’i vermeniz yeterlidir. Kütüphane, sütun isimlerini doğrudan algılayarak eksenleri otomatik olarak etiketler ve görselleştirme sürecini inanılmaz derecede hızlandırır.
Ayrıca Seaborn, varsayılan olarak Matplotlib’in klasik ve bazen demode görünen arayüzünü modern renk paletleri, pürüzsüz çizgi stilleri ve estetik grid (ızgara) yapılarıyla günceller.
2. VERİ HAZIRLIĞI (EXPLORATORY DATA ANALYSIS – EDA)
Görselleştirme yapmadan önce elimizdeki ham veriyi tanımak ve analiz edilebilir hale getirmek zorundayız. Bu bölümde ABD Ölümcül Polis Müdahaleleri (Fatal Police Shootings) projesinde kullanılan gerçek veriler üzerinden bir temizlik ve hazırlık süreci gerçekleştireceğiz.
Veri Setinin Okunması ve İncelenmesi
İlk olarak gerekli kütüphaneleri çağırıyor ve Pandas ile verilerimizi yüklüyoruz:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Veri setlerinin yüklenmesi
poverty_level = pd.read_csv("PercentagePeopleBelowPovertyLevel.csv", encoding="windows-1252")
percent_over_25 = pd.read_csv("PercentOver25CompletedHighSchool.csv", encoding="windows-1252")
kill_data = pd.read_csv("PoliceKillingsUS.csv", encoding="windows-1252")
share_race = pd.read_csv("ShareRaceByCity.csv", encoding="windows-1252")
Verimizin genel yapısını incelemek için info() metodunu kullanıyoruz:
# Veri setinin yapısal özetini ve sütun tiplerini inceleme
print(poverty_level.info())
Bu çıktı bize özelliklerin çoğunun object (yani string/metin) tipinde olduğunu gösterecektir. Örneğin, sayısal olması gereken fakirlik oranları (poverty_rate) veya lise mezuniyet oranları veri setinde metin olarak saklanmaktadır.
Kirli Verilerin Temizlenmesi (Data Cleaning)
Veri setinde eksik veya hatalı girişlerin sembolü olarak tire (-) karakterleri kullanılmıştır. Bu karakterleri tespit edip temizlemeden sayısal dönüşüm yapamayız:
# Hatalı/boş değerleri sıfır (0) ile değiştirme
poverty_level["poverty_rate"].replace("-", 0, inplace=True)
percent_over_25["percent_completed_hs"].replace("-", 0, inplace=True)
# Metin (object) tipindeki verileri sayısal (float) tipine dönüştürme
poverty_level["poverty_rate"] = poverty_level["poverty_rate"].astype(float)
percent_over_25["percent_completed_hs"] = percent_over_25["percent_completed_hs"].astype(float)
3.2. Yatay Bar Plot (Horizontal Bar Plot)
Kullanım Amacı: Çok sayıda kategoriye sahip verileri, dikey eksende dikey yazım karmaşası olmadan daha rahat okumak ve üst üste bindirerek harmanlamak için tercih edilir.
Teknik Uygulama:
alpha(saydamlık) parametresini kullanarak farklı ırkların eyalet bazındaki oranlarını yatay barlar halinde üst üste bindiriyoruz.
# Veri hazırlığı ve float dönüşümleri
share_race.replace(["-", "X"], 0, inplace=True)
share_race.loc[:, ["share_white", "share_black", "share_native_american", "share_asian", "share_hispanic"]] = \
share_race.loc[:, ["share_white", "share_black", "share_native_american", "share_asian", "share_hispanic"]].astype(float)
# Eyalet bazında ortalama hesaplama
area_list = list(share_race["Geographic Area"].unique())
share_white, share_black, share_native_american, share_asian, share_hispanic = [], [], [], [], []
for i in area_list:
x = share_race[share_race["Geographic Area"] == i]
share_white.append(sum(x["share_white"]) / len(x))
share_black.append(sum(x["share_black"]) / len(x))
share_native_american.append(sum(x["share_native_american"]) / len(x))
share_asian.append(sum(x["share_asian"]) / len(x))
share_hispanic.append(sum(x["share_hispanic"]) / len(x))
# Yatay Çizim (Eksenlerin Yer Değiştirmesi)
plt.figure(figsize=(9, 15))
sns.barplot(x=share_white, y=area_list, color="green", alpha=0.5, label="White")
sns.barplot(x=share_black, y=area_list, color="blue", alpha=0.6, label="African American")
sns.barplot(x=share_native_american, y=area_list, color="cyan", alpha=0.7, label="Native American")
sns.barplot(x=share_asian, y=area_list, color="yellow", alpha=0.6, label="Asian")
sns.barplot(x=share_hispanic, y=area_list, color="red", alpha=0.5, label="Hispanic")
plt.legend(loc="lower right", frameon=True)
plt.xlabel("Irk Oranları (Percentage of Races)")
plt.ylabel("Eyaletler (States)")
plt.title("Eyaletlere Göre Irk Dağılım Oranları")
plt.show()
3.3. Point Plot (Nokta Grafiği)
Kullanım Amacı: İki sayısal değişkenin eyaletler bazındaki eğilimlerini ve birbirleriyle olan korelasyonunu eş zamanlı takip etmek için kullanılır.
Teknik Uygulama (Basit Normalizasyon): Fakirlik oranı ile lise mezuniyet oranı arasındaki uçurum boyut farkını gidermek için her iki veriyi de kendi maksimum değerine bölerek 0 ile 1 arasına sıkıştırıyoruz.
# Normalizasyon işlemi (Min-Max Scaling mantığı)
sorted_data["area_poverty_ratio"] = sorted_data["area_poverty_ratio"] / max(sorted_data["area_poverty_ratio"])
# Benzer şekilde lise mezuniyet verisi de normalize edilerek sisteme eklenir
# Çizim
plt.figure(figsize=(20, 10))
sns.pointplot(x="area_list", y="area_poverty_ratio", data=sorted_data, color="lime", alpha=0.8)
sns.pointplot(x="area_list", y="area_highschool_ratio", data=sorted_data, color="red", alpha=0.8)
plt.text(40, 0.6, "Lise Mezuniyet Oranı", color="red", fontsize=17, style="italic")
plt.text(40, 0.55, "Fakirlik Oranı", color="lime", fontsize=17, style="italic")
plt.xlabel("Eyaletler", fontsize=15, color="blue")
plt.ylabel("Değerler (0-1 Normalize)", fontsize=15, color="blue")
plt.title("Fakirlik Oranı vs Lise Mezuniyet Oranı Karşılaştırması", fontsize=20)
plt.grid()
plt.show()
3.4. Joint Plot (Birleşik Grafik)
Kullanım Amacı: İki değişkenli dağılımı (bivariate distribution) hem saçılım (scatter) grafiği hem de kenar panellerindeki tek değişkenli (univariate) histogram dağılımlarıyla inceler.
Teknik Uygulama:
kindparametresini değiştirerek (örn:kdeveyahexveyascatter) görselleştirme tarzını değiştirebiliriz. Pearson $r$ değeri ile ilişkinin yönünü ölçer.
# Scatter (Saçılım) ve Histogram birlikteliği
g = sns.jointplot(x="area_poverty_ratio", y="area_highschool_ratio", data=sorted_data, kind="scatter", ratio=3, color="red")
plt.show()
3.5. LM Plot (Doğrusal Regresyon Grafiği)
Kullanım Amacı: Değişkenler arasındaki doğrusal ilişkiyi modellemek ve trendi göstermek amacıyla verinin üzerine en uygun regresyon doğrusunu (Linear Regression Line) çizer.
# Regresyon doğrusu çizimi
sns.lmplot(x="area_poverty_ratio", y="area_highschool_ratio", data=sorted_data)
plt.xlabel("Fakirlik Oranı")
plt.ylabel("Lise Mezuniyet Oranı")
plt.title("Fakirlik ve Lise Mezuniyeti Arasındaki Doğrusal İlişki")
plt.show()
3.6. KDE Plot (Çekirdek Yoğunluk Grafiği)
Kullanım Amacı: Sürekli bir değişkenin olasılık yoğunluk fonksiyonunu tahmin ederek veri dağılımının pürüzsüz bir eğriyle gösterilmesini sağlar. Renk koyulaştıkça o bölgedeki veri sıklığı artar.
plt.figure(figsize=(10, 8))
sns.kdeplot(x=sorted_data["area_poverty_ratio"], y=sorted_data["area_highschool_ratio"], shade=True, cmap="Purples")
plt.title("Korelasyon Yoğunluk Haritası (KDE)")
plt.show()
3.7. Violin Plot (Keman Grafiği)
Kullanım Amacı: Kutu grafiği (Box Plot) ile Çekirdek Yoğunluk Grafiğinin (KDE) birleşimidir. Verinin çeyreklik değerlerini gösterirken aynı zamanda olasılık yoğunluk yapısını dikey eksende simetrik olarak sunar.
plt.figure(figsize=(10, 8))
# Inner='points' ile keman içindeki gerçek veri noktalarını da görebiliriz
sns.violinplot(data=sorted_data.iloc[:, 1:3], palette="Set2", inner="points")
plt.title("Fakirlik ve Mezuniyet Dağılımları (Violin Plot)")
plt.show()
3.8. Heatmap (Sıcaklık Haritası)
Kullanım Amacı: Özellikler arasındaki doğrusal ilişki katsayılarını (korelasyon) 2 boyutlu bir matris üzerinde renk tonlarıyla ifade eder.
Teknik Detay:
annot=Trueile korelasyon katsayılarını hücre içine yazdırırken,linewidthsile hücre sınırlarına çizgi ekleyebiliriz.
plt.figure(figsize=(6, 6))
correlation_matrix = sorted_data.corr()
sns.heatmap(correlation_matrix, annot=True, linewidths=0.5, fmt=".1f", cmap="coolwarm")
plt.title("Korelasyon Sıcaklık Haritası")
plt.show()
3.9. Swarm Plot (Oğul Grafiği)
Kullanım Amacı: Kategorik değişkenlerin alt kırılımlarındaki sayısal dağılımı, noktaların birbiri üzerine çakışmasını (overlap) engelleyerek net bir şekilde gösterir. Sınıflandırma analizlerinde harika bir sezgisel araçtır.
Kritik Bellek Uyarısı: Veri setiniz çok büyükse (örn: 10.000+ satır), noktaların yerleşimi için yapılan iterasyonel matematiksel hesaplamalar işlemcinizi ve belleğinizi %100 seviyesine getirebilir ve çizim başarısız olabilir.
# Cinsiyete göre yaş dağılımı ve ölüm şekli (class) kırılımı
plt.figure(figsize=(10, 8))
sns.swarmplot(x="gender", y="age", hue="manner_of_death", data=kill_data, palette="Set1")
plt.title("Cinsiyete Göre Yaş Dağılımı ve Ölüm Şekli Sınıflandırması")
plt.show()
)
3.10. Pair Plot (Eşli Grafik)
Kullanım Amacı: Veri setindeki tüm sayısal sütunların birbiriyle olan ikili ilişkilerini (scatter) ve kendi dağılımlarını (histogram/KDE) tek bir matris şeklinde ekrana basar.
# Veri setindeki sayısal özelliklerin genel haritası
sns.pairplot(sorted_data)
plt.show()
3.11. Count Plot (Frekans Grafiği)
Kullanım Amacı: Kategorik verilerin hangi sınıftan kaçar adet gözlemlendiğini (frekansını) hızlıca sütunlar halinde listeler.
# Tehdit türleri veya kullanılan silahların frekans analizi
plt.figure(figsize=(10, 6))
sns.countplot(x="gender", data=kill_data, palette="twilight")
plt.title("Ölümcül Müdahaleye Maruz Kalan Kişilerin Cinsiyet Dağılımı")
plt.show()
BÖLÜM ÖZETİ VE DEĞERLENDİRME
Bu bölümde, Seaborn kütüphanesini kullanarak ham bir veri setini baştan sona nasıl işleyeceğimizi, temizleyeceğimizi ve analiz edeceğimizi öğrendik. Gördüğümüz grafik türleri, makine öğrenmesi modelleri kurmadan önce verinin karakteristiğini (dağılımını, korelasyonunu, aykırı değerlerini) anlamamız için kritik önem taşımaktadır.
Bir sonraki bölümde, bu statik grafik dünyasından sıyrılarak, kullanıcının doğrudan etkileşime geçebileceği interaktif ve dinamik grafik yapısı sunan Plotly dünyasına adım atacağız!
PLOTLY İLE İNTERAKTİF VE DİNAMİK VERİ GÖRSELLEŞTİRME
1. PLOTLY İLE GÖRSELLEŞTİRME
Plotly grafiklerini tasarlarken sürekli tekrarlayan ve adeta bir şablon niteliğinde olan “boşluk doldurma” mantığıyla çalışırız. Bir Plotly grafiğinin ayağa kaldırılması temelde 4 ana bileşenden oluşur:
Trace (İz / Çizim Nesnesi): Çizilecek grafiğin veri koordinatlarını, grafik türünü (çizgi, saçılım vb.), renklerini ve fareyle üzerine gelindiğinde görünecek olan hover detaylarını barındıran temel çizim katmanıdır. Genellikle
go.Scatterveyago.Bargibi metotlarla tanımlanır.Data: Oluşturulan tüm trace’lerin (Örn:
trace1,trace2) tek bir liste içinde bir araya getirilmesidir.Layout: Grafiğin çizildiği alanın dış çerçevesidir. Grafik başlığı, eksen başlıkları, grid ayarları, butonlar, slider’lar ve grafik boyutu gibi tasarımsal ögeleri barındırır.
Figure: Bir araya getirilmiş olan
datavelayoutdökümanlarının nihai olarak birleştirilip çizime hazır hale getirildiği ana çerçevedir.fig = go.Figure(data=data, layout=layout)şeklinde tanımlanır vefig.show()ya daplot(fig)metoduyla ekrana basılır.
2. VERİ HAZIRLIĞI VE ÖN İNCELEME (EDA)
Bu bölümün ilk yarısında Dünya Üniversite Sıralamaları (World University Ranking) veri setini kullanacağız. Veri setimizi Pandas ile içeriye aktardıktan sonra hızlıca veri tiplerini analiz etmeli ve temizlik adımlarını tamamlamalıyız.
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from plotly.offline import plot # Çevrimdışı (offline) çizimler için
# Veriyi yükleme
times_data = pd.read_csv("timesData.csv")
# Verinin yapısını inceleme
print(times_data.info())
Veri Temizliği (Data Cleaning)
Veri setinde sayısal analiz yapmamız gereken num_students (öğrenci sayısı) gibi sütunlar, binlik ayracı olarak virgül (,) karakterleri içerdiğinden dolayı sisteme object (metin) olarak kaydolmuştur. Ayrıca bazı satırlarda eksik veriler mevcuttur. Bu hataları gidermek için şu dönüşümleri uyguluyoruz:
# 2016 yılına ait ilk 50 üniversiteyi filtreleme
df2016 = times_data[times_data["year"] == 2016].iloc[:50, :]
# Öğrenci sayısındaki virgülleri noktaya çevirip float tipine dönüştürme
df2016["num_students"] = df2016["num_students"].astype(str).str.replace(",", ".")
df2016["num_students"] = df2016["num_students"].astype(float)
3. GRAFİK TÜRLERİ VE DETAYLI TEKNİK ANALİZLERİ
3.1. Line & Scatter Plots (Çizgi ve Saçılım Grafikleri)
Kullanım Amacı: Sürekli verilerin değişim trendlerini izlemek veya iki değişken arasındaki saçılımı interaktif olarak takip etmek için kullanılır.
Teknik Detay:
modeparametresi ile grafiğin sadece noktalardan (markers), sadece çizgilerden (lines) ya da her ikisinden birden (lines+markers) oluşması ayarlanabilir.textparametresi ile hover durumunda gösterilecek ek etiketler tanımlanır.
# 2011 yılı ilk 100 üniversiteyi filtreleme
df2011 = times_data[times_data["year"] == 2011].iloc[:100, :]
# Trace 1: Alıntı (Citation) Skoru
trace1 = go.Scatter(
x=df2011["world_rank"],
y=df2011["citations"],
mode="lines",
name="Citations",
marker=dict(color='rgba(16, 112, 2, 0.8)'),
text=df2011["university_name"]
)
# Trace 2: Öğretim (Teaching) Skoru
trace2 = go.Scatter(
x=df2011["world_rank"],
y=df2011["teaching"],
mode="lines+markers",
name="Teaching",
marker=dict(color='rgba(80, 26, 80, 0.8)'),
text=df2011["university_name"]
)
data = [trace1, trace2]
layout = go.Layout(
title="2011 Yılı İlk 100 Üniversitenin Alıntı ve Öğretim Skorları",
xaxis=dict(title="Dünya Sıralaması", zeroline=False, linewidth=1)
)
fig = go.Figure(data=data, layout=layout)
fig.show()
3.2. Bar Charts (Sütun Grafikleri)
Kullanım Amacı: Kategorik sınıfların sayısal değerlerini yan yana veya üst üste karşılaştırmak için kullanılır.
Teknik Detay:
barmode='group'parametresi barları yan yana gruplarken,barmode='relative'(veyastack) parametresi barları üst üste bindirerek tek bir sütunda toplam hacmi görmemizi sağlar.
# 2014 yılı ilk 3 üniversite
df2014 = times_data[times_data["year"] == 2014].iloc[:3, :]
trace1 = go.Bar(
x=df2014["university_name"],
y=df2014["citations"],
name="Citations",
marker=dict(color='rgba(255, 174, 255, 0.5)', line=dict(color='rgb(0,0,0)', width=1.5)),
text=df2014["country"]
)
trace2 = go.Bar(
x=df2014["university_name"],
y=df2014["teaching"],
name="Teaching",
marker=dict(color='rgba(255, 255, 128, 0.5)', line=dict(color='rgb(0,0,0)', width=1.5)),
text=df2014["country"]
)
data = [trace1, trace2]
# Yan yana gruplama için barmode='group'
layout = go.Layout(title="İlk 3 Üniversitenin Skorları", barmode="group")
fig = go.Figure(data=data, layout=layout)
fig.show()
3.3. Pie & Donut Charts (Daire ve Donut Grafikleri)
Kullanım Amacı: Verilerin bütüne olan oransal katkılarını dairesel olarak sunar.
Teknik Detay:
holeparametresi tanımlandığında (Örn:hole=0.3), dairenin ortası boşaltılarak şık bir donut grafiği (Donut Chart) elde edilir.
# 2016 yılı ilk 7 üniversitenin öğrenci oranı
df2016_pie = times_data[times_data["year"] == 2016].iloc[:7, :]
fig = {
"data": [
{
"values": df2016_pie["num_students"],
"labels": df2016_pie["university_name"],
"domain": {"x": [0, .5]},
"name": "Öğrenci Sayısı Oranları",
"hoverinfo": "label+percent+name",
"hole": .3, # Donut Boşluğu
"type": "pie"
}
],
"layout": {
"title": "2016 İlk 7 Üniversitenin Öğrenci Oranları"
}
}
fig = go.Figure(fig)
fig.show()
3.4. Bubble Plots (Kabarcık Grafikleri)
Kullanım Amacı: Çok boyutlu verileri tek bir saçılım grafiğinde temsil etmek için idealdir.
Boyutların Tanımı: 2 boyutlu standart X ve Y eksenlerine ek olarak; kabarcıkların büyüklüğü (
size– 3. boyut) ve renk tonu (color– 4. boyut) farklı özelliklere bağlanarak tek ekranda 4 boyutlu analiz imkanı sunulur.
# 2016 yılı ilk 20 üniversite
df2016_bubble = times_data[times_data["year"] == 2016].iloc[:20, :]
data = [
{
'y': df2016_bubble['teaching'],
'x': df2016_bubble['world_rank'],
'mode': 'markers',
'marker': {
'color': df2016_bubble['international'], # Renk skalası international skora göre (4. Boyut)
'size': df2016_bubble['num_students'], # Kabarcık büyüklüğü öğrenci sayısına göre (3. Boyut)
'showscale': True
},
"text": df2016_bubble["university_name"]
}
]
fig = go.Figure(data=data)
fig.show()
3.5. Histogram (Sıklık Grafiği)
Kullanım Amacı: Sayısal bir özelliğin veri setindeki dağılım sıklığını (frekansını) analiz etmek için kullanılır.
Teknik Detay: Birden fazla gruba ait dağılımları karşılaştırırken
layoutiçindebarmode='overlay'verilerek barların iç içe saydam geçişi sağlanır.
trace1 = go.Histogram(
x=times_data[times_data["year"] == 2011]["student_staff_ratio"],
opacity=0.75,
name="2011 student-staff ratio",
marker=dict(color='rgba(171, 50, 96, 0.6)')
)
trace2 = go.Histogram(
x=times_data[times_data["year"] == 2012]["student_staff_ratio"],
opacity=0.75,
name="2012 student-staff ratio",
marker=dict(color='rgba(12, 50, 196, 0.6)')
)
data = [trace1, trace2]
layout = go.Layout(barmode='overlay', title='2011 ve 2012 Student-Staff Oranı Dağılımı')
fig = go.Figure(data=data, layout=layout)
fig.show()
3.6. Word Cloud (Kelime Bulutu)
Kullanım Amacı: (Plotly kütüphanesine ait olmasa da görselleştirmeyi zenginleştirmek için araya entegre edilen bu kütüphane) Metin verilerinde en çok tekrar eden kelimeleri büyüklük oranlarına göre bir bulut halinde çizer.
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 2011 yılındaki ülke isimlerini birleştirme
x2011 = times_data[times_data["year"] == 2011]["country"]
plt.subplots(figsize=(8, 8))
wordcloud = WordCloud(
background_color='white',
width=512,
height=384
).generate(" ".join(x2011))
plt.imshow(wordcloud)
plt.axis('off') # Kenar koordinatlarını gizle
plt.show()
3.7. Box Plot (Kutu Grafiği)
Kullanım Amacı: Verinin çeyrekliklerini ($Q1, Q3$), medyan değerini ($Q2$), minimum/maksimum sınırlarını ve sınırların dışına taşan aykırı değerleri (outliers) gösterir.
Teknik Detay: Plotly interaktifliği sayesinde, kutu üzerindeki çizgilere gelindiğinde medyan ve çeyreklik değerlerin tam sayısal karşılıkları doğrudan hover penceresinde okunur.
# 2015 yılı verilerini filtreleme
df2015 = times_data[times_data["year"] == 2015]
trace1 = go.Box(y=df2015["total_score"], name="Total Score", marker=dict(color='rgb(12, 12, 140)'))
trace2 = go.Box(y=df2015["research"], name="Research Score", marker=dict(color='rgb(12, 128, 128)'))
data = [trace1, trace2]
fig = go.Figure(data=data)
fig.show()
3.8. Scatter Plot Matrix (Saçılım Matrisi)
Kullanım Amacı: Çok sayıda değişkenin ikili kombinasyonlarını aynı anda saçılım grafiği matrisi olarak görselleştirip korelasyon araştırmalarında zaman kazanmamızı sağlar.
import plotly.figure_factory as ff
dataframe = times_data[times_data["year"] == 2015]
data2015 = dataframe.loc[:, ["research", "international", "total_score"]]
data2015["index"] = np.arange(1, len(data2015) + 1)
fig = ff.create_scatterplotmatrix(data2015, diag='box', index='index', colormap='Portland',
height=700, width=700)
fig.show()
3.9. Inset Plot (İç İçe Grafik)
Kullanım Amacı: Birbiriyle doğrudan ilişkili olan büyük ve küçük iki grafiği (Örn: Bir genel trend çizgisi ve onun alt kırılımı) tek bir çerçeve içinde iç içe sunmak amacıyla tasarlanır.
trace1 = go.Scatter(
x=df2011["world_rank"],
y=df2011["teaching"],
name="teaching",
marker=dict(color='rgba(16, 112, 2, 0.8)')
)
trace2 = go.Scatter(
x=df2011["world_rank"],
y=df2011["income"],
xaxis='x2', # Küçük grafik için ikincil eksen ataması
yaxis='y2',
name="income",
marker=dict(color='rgba(160, 112, 2, 0.8)')
)
data = [trace1, trace2]
layout = go.Layout(
xaxis2=dict(domain=[0.6, 0.95], anchor='y2'), # Küçük grafiğin konumu
yaxis2=dict(domain=[0.6, 0.95], anchor='x2'),
title="Öğretim ve Gelir Skorları (Inset Plot)"
)
fig = go.Figure(data=data, layout=layout)
fig.show()
3.10. 3D Scatter Plots (Üç Boyutlu Saçılım Grafikleri)
Kullanım Amacı: X, Y ve Z eksenlerine sahip, üç boyutlu uzayda verilerin kümelenmesini incelemek için kullanılır. Grafik tarayıcı üzerinden 360 derece döndürülebilir ve yakınlaştırılabilir
trace1 = go.Scatter3d(
x=df2011["world_rank"],
y=df2011["research"],
z=df2011["citations"],
mode='markers',
marker=dict(size=10, color=df2011["world_rank"], colorscale='Viridis', showscale=True)
)
data = [trace1]
layout = go.Layout(margin=dict(l=0, r=0, b=0, t=0)) # Kenar boşluklarını sıfırlama
fig = go.Figure(data=data, layout=layout)
fig.show()
3.11. Multiple Subplots (Çoklu Alt Grafikler)
Kullanım Amacı: Farklı özelliklere ait grafikleri aynı anda ve birbirlerinden bağımsız eksenlerde yan yana/alt alta paneller halinde çizmek için kullanılır.
from plotly import subplots
trace1 = go.Scatter(x=df2011["world_rank"], y=df2011["research"], name="research")
trace2 = go.Scatter(x=df2011["world_rank"], y=df2011["citations"], name="citations")
trace3 = go.Scatter(x=df2011["world_rank"], y=df2011["income"], name="income")
trace4 = go.Scatter(x=df2011["world_rank"], y=df2011["total_score"], name="total_score")
fig = subplots.make_subplots(rows=2, cols=2, subplot_titles=("Research", "Citations", "Income", "Total Score"))
fig.append_trace(trace1, 1, 1)
fig.append_trace(trace2, 1, 2)
fig.append_trace(trace3, 2, 1)
fig.append_trace(trace4, 2, 2)
fig.show()
3.12. Map Plots (Coğrafi Grafikler – Scatter Geo)
Kullanım Amacı: Enlem (
latitude) ve boylam (longitude) koordinat bilgilerini kullanarak dünya haritası üzerinde veri işaretlemeleri yapmak için kullanılır.Teknik Proje: İkinci Dünya Savaşı bombalama uçuş verilerini kullanarak, uçakların kalkış yaptığı hava üsleri ile bombaladıkları hedefler (Target) arasına coğrafi rotalar (
flight paths) çiziyoruz.
# Savaş uçaklarının kalkış üslerinin koordinatları
trace_kalkis = go.Scattergeo(
lon=df_bomb["take_off_longitude"],
lat=df_bomb["take_off_latitude"],
mode='markers',
marker=dict(size=5, color='blue'),
text=df_bomb["take_off_base"]
)
# Bombalanan hedeflerin koordinatları
trace_hedef = go.Scattergeo(
lon=df_bomb["target_longitude"],
lat=df_bomb["target_latitude"],
mode='markers',
marker=dict(size=5, color='red'),
text=df_bomb["target_city"]
)
# Kalkış ve varış noktaları arasına çizgiler (Flight Paths) çekilmesi
flight_paths = []
for i in range(len(df_bomb)):
flight_paths.append(
dict(
type='scattergeo',
lon=[df_bomb.iloc[i]["take_off_longitude"], df_bomb.iloc[i]["target_longitude"]],
lat=[df_bomb.iloc[i]["take_off_latitude"], df_bomb.iloc[i]["target_latitude"]],
mode='lines',
line=dict(width=1, color='black'),
opacity=0.4
)
)
# Veriyi birleştirip çizme
data = [trace_kalkis, trace_hedef] + flight_paths
layout = go.Layout(title="WW2 Hava Saldırıları ve Kalkış-Hedef Rotaları")
fig = go.Figure(data=data, layout=layout)
fig.show()
3.13. Animation Plots (Animasyonlu Grafikler)
Kullanım Amacı: Zaman serisi verilerinin değişimini yıllara göre bir akış halinde izlemek için play/pause butonları ve alt kısımda bir zaman slider’ı yerleştirilmesini sağlar.
Teknik Proje: 1965-2016 yılları arasında gerçekleşen önemli depremlerin (Significant Earthquakes) dünya üzerindeki lokasyonlarının zamana göre otomatik akışla oynatılmasını sağlıyoruz.
# Yıllara göre filtreli animasyon kurgusu için bir şablon
years = list(earthquake_data["year"].unique())
# Animasyon çerçeveleri (Frames) oluşturulur
frames = [
go.Frame(
data=[
go.Scattergeo(
lon=earthquake_data[earthquake_data["year"] == year]["longitude"],
lat=earthquake_data[earthquake_data["year"] == year]["latitude"],
mode='markers',
marker=dict(size=8, color='red')
)
],
name=str(year)
) for year in years
]
# İlk açılış yılı verisi (1965) data kısmına verilir
data_initial = [
go.Scattergeo(
lon=earthquake_data[earthquake_data["year"] == 1965]["longitude"],
lat=earthquake_data[earthquake_data["year"] == 1965]["latitude"],
mode='markers'
)
]
# Butonlar ve Slider tanımlamalarıyla animasyon oynatılır
layout = go.Layout(
updatemenus=[
dict(
type="buttons",
buttons=[dict(label="Play", method="animate", args=[None])]
)
],
title="1965 - 2016 Önemli Depremlerin Coğrafi Animasyonu"
)
fig = go.Figure(data=data_initial, layout=layout, frames=frames)
fig.show()
BÖLÜM ÖZETİ VE DEĞERLENDİRME
Bu bölümde, interaktif veri görselleştirmenin öncüsü olan Plotly kütüphanesini ve temel tasarım mimarisini öğrendik. Basit çizgi grafiklerinden başlayarak, bubble grafiklerle verilerimizi 4-5 boyuta çıkarmayı; 3D Scatter, alt grafikler, uçuş yolları haritalandırmaları ve zamana bağlı deprem animasyonlarını kurgulamayı başardık.
Bir sonraki bölümde, veri biliminde çok sık karşımıza çıkmayan ancak kullandığımızda görsel vizyonumuzu ve analiz derinliğimizi zirveye çıkaracak olan Nadir Kullanılan Görselleştirme Araçları (Rare Tools) kütüphanelerine ve uygulamalarına göz atacağız!
NADİR KULLANILAN GÖRSELLEŞTİRME ARAÇLARI (RARE TOOLS)
1. GİRİŞ VE UFUK GENİŞLETME FELSEFESİ
İnternetteki veri analizlerini incelediğimizde, çoğu çalışmada birbirini tekrar eden sıradan görselleştirme tekniklerinin kullanıldığını görürüz. Ancak her veri seti aynı dille konuşmaz; kimi zaman eksik değerlerin kendi içindeki dağılım desenini yakalamak, kimi zaman da 4 ya da 5 farklı özelliğin sınıf bazında nasıl kümelendiğini tek bir bakışta hissettirmek gerekir.
Python açık kaynaklı bir deryadır ve içerisinde vizyonumuzu genişletecek yüzlerce niş kütüphane barındırır. Bu bölümde kullanacağımız araçlar, analizlerinize derinlik katarak profesyonel veri dökümanları hazırlamanıza olanak sağlayacaktır.
2. GRAFİK TÜRLERİ VE DETAYLI TEKNİK ANALİZLERİ
2.1. Missingno Kütüphanesi (Matrix & Bar Plot)
Kullanım Amacı: Veri setindeki eksik (null/NaN) değerleri tespit etmek, bu eksikliklerin veri setinin hangi indekslerinde yoğunlaştığını veya birbirleriyle ilişkili olup olmadığını görselleştirmek için kullanılır.
Teknik Farkı:
info()metodu eksik verilerin sadece sayısını verirken,missingnokütüphanesi eksikliklerin doğrudan dağılım desenini gösterir.
Matrix Grafiği:
Veride gerçek bir sayısal/kategorik değer varsa ilgili indeks satırı siyah (dolu), değer eksikse (NaN) beyaz olarak gösterilir.
import pandas as pd
import numpy as np
import missingno as msno
import matplotlib.pyplot as plt
# Eksik verilere sahip örnek bir sözlük yapısı oluşturma
dictionary = {
"kolon1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
"kolon2": [1, 2, 3, np.nan, 5, 6, 7, np.nan, 9, 10, 11, 12, 13, np.nan, 15, 16, 17, np.nan, 19, np.nan],
"kolon3": [1, 2, 3, 4, 5, np.nan, 7, 8, np.nan, 10, 11, np.nan, 13, 14, 15, 16, 17, 18, 19, 20]
}
data_missingno = pd.DataFrame(dictionary)
# Matrix çizimi
msno.matrix(data_missingno)
plt.show()
Grafik Analizi: Grafiğin sağ tarafındaki gösterge dikey çizgi boyunca satır doluluğunu temsil eder. Örneğin, tüm kolonların dolu olduğu satırlarda gösterge tepeye (3’e) vururken, eksiklerin olduğu satırlarda 1 veya 2 seviyesine düşer.
Bar Grafiği:
Her sütunun doluluk oranını yüzde (%) ve net sayı bazında sütun grafiği şeklinde sunar.
# Bar çizimi
msno.bar(data_missingno)
plt.show()
Grafik Analizi: Sol eksen doluluk yüzdesini (0.0 – 1.0 arası), sağ eksen ise net satır sayısını temsil eder.
kolon1‘in üzerinde 20/20 yazarkenkolon2üzerinde 15/20 yazar; bu da 5 değerin kayıp (yani %75 doluluk) olduğunu gösterir.
2.2. Parallel Plots (Pandas Parallel Coordinates)
Kullanım Amacı: Yüksek boyutlu (çok değişkenli) veri setlerinde, sınıfların (class) farklı özellikler bazında nasıl ayrıştığını ve çizgi desenleri oluşturduğunu gözlemlemek için kullanılır.
Teknik Uygulama: Ünlü Iris Çiçeği veri setini kullanarak 3 farklı çiçeğin (
setosa,versicolor,virginica) 4 farklı yaprak özelliği üzerindeki desenlerini paralel dikey eksenlerde çizgilere döküyoruz
from pandas.plotting import parallel_coordinates
import matplotlib.pyplot as plt
# Iris veri setini yükleme ve ID kolonunu çıkarma
iris_df = pd.read_csv("Iris.csv")
iris_df.drop("Id", axis=1, inplace=True)
# Çizim
plt.figure(figsize=(15, 10))
parallel_coordinates(iris_df, "Species", colormap="Set1")
plt.title("Iris Sınıflarının Özellik Bazında Paralel Koordinat Analizi")
plt.xlabel("Özellikler (Features)")
plt.ylabel("Santimetre (cm)")
plt.show()
Grafik Analizi: Çizgilerin oluşturduğu desenlere bakarak
setosasınıfının (kırmızı çizgiler) özelliklePetalLengthCmvePetalWidthCmeksenlerinde diğer iki sınıftan tamamen koparak ayrıştığını gözlemleyebiliriz. Bu durum, bu iki özelliğin sınıflandırma modellerinde (classification) mükemmel birer ayırt edici girdi olacağını sezgisel olarak kanıtlar.
2.3. Network Charts (NetworkX ile Korelasyon Ağı)
Kullanım Amacı: Klasik ve bazen karmaşık olan Heatmap (Sıcaklık Haritası) yerine, özelliklerin birbirleriyle olan doğrusal ilişkilerini düğümler (nodes) ve bağlar (edges) üzerinden bir sosyal ağ gibi modellemek için kullanılır.
Teknik Uygulama: Iris veri setindeki sayısal özelliklerin korelasyon matrisini hesaplayıp, belirlediğimiz bir korelasyon sınırının (
threshold) üzerindeki ilişkileri bağlar halinde çizdiriyoruz.
import networkx as nx
import matplotlib.pyplot as plt
# Korelasyon matrisini hesaplama ve düzleştirme
corr = iris_df.corr()
links = corr.stack().reset_index()
links.columns = ['var1', 'var2', 'value']
# Kendiyle olan ilişkileri (cor(A,A)=1) temizleme ve 0.5'ten büyük ilişkileri filtreleme
links_filtered = links.loc[(links['value'] > 0.5) & (links['var1'] != links['var2'])]
# Grafik nesnesini oluşturma
G = nx.from_pandas_edgelist(links_filtered, 'var1', 'var2')
# Çizim ayarları ve görselleştirme
plt.figure(figsize=(8, 8))
nx.draw_circular(
G,
with_labels=True,
node_color="orange",
node_size=3000,
edge_color="red",
linewidths=2,
font_size=12
)
plt.title("Özellik Korelasyon Ağı (Threshold > 0.5)")
plt.show()
Grafik Analizi: Eğer
thresholddeğerini0.9gibi çok yüksek bir değere çekersek, sadece en güçlü ilişkiye sahip özelliklerin bağlandığını görebiliriz. Bu yöntem, çok değişkenli verilerde hangi özelliklerin birbirini doğrudan taklit ettiğini (multi-collinearity) anlamak için eşsiz bir görsel alternatiftir.
2.4. Venn Diagram (Matplotlib-Venn)
Kullanım Amacı: Kümeler arasındaki eleman sayılarını, farkları ve kesişim oranlarını dairesel alan genişliğiyle orantılı olarak göstermek için kullanılır.
from matplotlib_venn import venn2
import matplotlib.pyplot as plt
# Örnek iki kümenin eleman sayılarını ve kesişimini tanımlama
# venn2 parametresi: (A_fark_B, B_fark_A, kesişim)
plt.figure(figsize=(6, 6))
venn2(subsets=(135, 135, 15), set_labels=('Petal Width', 'Sepal Width'))
plt.title("Özelliklerin Dağılım Kesişimi (Örnek Venn Diyagramı)")
plt.show()
Grafik Analizi: Diyagram üzerinde kesişim bölgesi olan
15değeri, her iki özelliğin ortak taşıdığı veri alanını temsil eder. Kümelerle çalışan olasılık veya popülasyon analizlerinde sıklıkla kullanılır.
2.5. Donut Plot (Matplotlib)
Kullanım Amacı: Klasik pasta grafiğinin (pie chart) ortasını boşaltarak daha modern ve estetik bir gösterim elde etmek amacıyla tasarlanır.
import matplotlib.pyplot as plt
# Sınıfların veri boyutlarını alma (Iris sınıfları eşit dağılımlıdır: 50, 50, 50)
sizes = iris_df["Species"].value_counts().values
labels = iris_df["Species"].value_counts().index
colors = ["red", "green", "blue"]
# Ortadaki beyaz boşluğu temsil eden daireyi oluşturma
circle = plt.Circle((0, 0), 0.5, color='white')
# Pasta grafiğini çizme
plt.figure(figsize=(8, 8))
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
p = plt.gcf()
p.gca().add_artist(circle) # Beyaz daireyi pasta grafiğinin merkezine ekleme
plt.title("Iris Sınıflarının Dağılım Oranı (Donut Plot)")
plt.show()
2.6. Spider (Radar) Chart (Matplotlib)
Kullanım Amacı: Sınıfların veya profillerin birden fazla sayısal özellik üzerindeki ortalama değerlerini dairesel eksenli bir ağ üzerinde karşılaştırarak genel karakteristiği ortaya koymak için kullanılır.
import numpy as np
import matplotlib.pyplot as plt
# Kategorileri ve setosa sınıfının ortalama değerlerini hazırlama
categories = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
N = len(categories)
# Değerlerin dairesel kapanması için ilk değeri sona kopyalıyoruz
values = iris_df[iris_df["Species"] == "Iris-setosa"].mean(numeric_only=True).values.tolist()
values += values[:1]
# Açıları hesaplama
angles = [n / float(N) * 2 * np.pi for n in range(N)]
angles += angles[:1]
# Çizim kurgusu (Polar eksende dairesel ağ tasarımı)
plt.figure(figsize=(8, 8))
ax = plt.subplot(111, polar=True)
plt.xticks(angles[:-1], categories, color='grey', size=12)
ax.plot(angles, values, linewidth=1, linestyle='solid')
ax.fill(angles, values, 'b', alpha=0.1)
plt.title("Iris-Setosa Sınıf Profil Analizi (Radar Chart)", size=15)
plt.show()
2.7. Cluster Map (Seaborn)
Kullanım Amacı: Veri setindeki satırları veya sütunları hiyerarşik kümeleme (hierarchical clustering) algoritmalarıyla gruplayıp, aralarındaki benzerlik hiyerarşisini dendrogram çizgileriyle bir heatmap üzerinde sunmak için kullanılır.
import seaborn as sns
import matplotlib.pyplot as plt
# Iris sayısal verilerini alma
numerical_df = iris_df.drop("Species", axis=1)
# Cluster Map çizimi
sns.clustermap(numerical_df.corr(), annot=True, cmap="mako", figsize=(8, 8))
plt.title("Özellik Benzerlik Kümelemesi (Cluster Map)")
plt.show()
Grafik Analizi: Sol ve üst kenarlardaki ağaçsı çizgiler (dendrogramlar) özelliklerin benzerlik derecelerini gösterir. Örneğin,
PetalLengthCmilePetalWidthCmözellikleri en kısa dal ile birleşir; bu da onların hiyerarşik olarak birbirine en yakın korelasyon yapısına sahip özellikler olduğunu kanıtlar.
2.8. Inset & 3D Plots (Plotly ile Alternatif Uygulama)
Iris veri seti üzerinden Plotly’nin dinamik, interaktif dünyasını nadir kullanılan tasarım alternatifleriyle harmanlıyoruz.
Inset Plot (Plotly):
Iris yaprak uzunluğu scatter grafiğinin yanına, bu özelliğin sıklık dağılımını gösteren bir histogramı inset (iç içe) olarak yerleştiriyoruz
import plotly.graph_objs as go
trace1 = go.Scatter(
x=np.arange(len(numerical_df)),
y=numerical_df["PetalLengthCm"],
name="Petal Length (Scatter)",
marker=dict(color="green")
)
trace2 = go.Histogram(
x=numerical_df["PetalLengthCm"],
xaxis='x2',
yaxis='y2',
name="Petal Length (Histogram)",
marker=dict(color="rgba(128, 0, 128, 0.7)")
)
data = [trace1, trace2]
layout = go.Layout(
xaxis2=dict(domain=[0.6, 0.95], anchor='y2'),
yaxis2=dict(domain=[0.6, 0.95], anchor='x2'),
title="Petal Length Scatter ve Sıklık Dağılımı (Inset Plot)"
)
fig = go.Figure(data=data, layout=layout)
fig.show()
3D Scatter Plot (Plotly):
Çiçek türlerini 3 farklı yaprak boyutu ekseninde döndürülebilir 3 boyutlu uzayda inceliyoruz.
# Sınıfları ayırma
setosa = iris_df[iris_df["Species"] == "Iris-setosa"]
virginica = iris_df[iris_df["Species"] == "Iris-virginica"]
trace_setosa = go.Scatter3d(
x=setosa["SepalLengthCm"],
y=setosa["SepalWidthCm"],
z=setosa["PetalLengthCm"],
mode='markers',
name='Setosa',
marker=dict(size=5, color='red')
)
trace_virginica = go.Scatter3d(
x=virginica["SepalLengthCm"],
y=virginica["SepalWidthCm"],
z=virginica["PetalLengthCm"],
mode='markers',
name='Virginica',
marker=dict(size=5, color='green')
)
data = [trace_setosa, trace_virginica]
layout = go.Layout(margin=dict(l=0, r=0, b=0, t=0), title="3 Boyutlu Iris Sınıf Dağılımı")
fig = go.Figure(data=data, layout=layout)
fig.show()
BÖLÜM ÖZETİ VE DEĞERLENDİRME
Bu bölümde, veri görselleştirme süreçlerinize fark yaratacak, verideki eksiklikleri anında tespit eden, karmaşık ilişkileri ve sınıf profillerini tek bir dairesel ağda özetleyen nadir ve niş kütüphaneleri derinlemesine inceledik. Bu ileri düzey araçlar sayesinde ham veri analizlerinizi çok daha zengin bir görsel anlatımla sunabilirsiniz.
Veri Görselleştirmenin Rolü
Bu kapsamlı eğitim ve blog serisi boyunca adım adım işlediğimiz tüm kütüphaneler, parametreler ve kod satırları bize çok net bir gerçeği göstermiştir: Veri görselleştirme, sadece raporları süsleyen ya da sunumlara renk katan estetik birer çıktıdan ibaret değildir.
Görselleştirme; ham, dağınık ve sessiz duran veri nehirlerinin arkasındaki mantığı çözen, büyük veri yığınları içerisindeki stratejik karar mekanizmalarını besleyen en güçlü araçtır. Gözümüzle göremediğimiz, ham tablolar arasında kaybolan anomalileri, eksik veri desenlerini, çok boyutlu sınıf ayırt ediciliğini ve korelasyon bağlarını saniyeler içinde fark etmemizi sağlar. Kısacası doğru bir görselleştirme süreci işletilmeden, verinin karakteristiğini (dağılımını, ilişkilerini, aykırı değerlerini) anlamak ve o veriden katma değerli kararlar üretebilmek imkansızdır.
Gelecek Adımlar ve Yol Haritası
Veri görselleştirmenin hem statik hem de interaktif tüm temel taşlarını yerine oturttuğumuza göre, artık bu teorik ve pratik cephaneliği bir üst seviyeye taşıma zamanı geldi. Yol haritamızın bundan sonraki adımları şu şekilde şekillenecektir:
Uçtan Uca Proje Uygulamaları: Öğrendiğimiz Seaborn, Plotly ve nadir kullanılan tüm yardımcı kütüphane tekniklerini gerçek hayat senaryolarına uygulayarak ham verileri temizleme, yapılandırma ve anlamlı raporlara dönüştürme süreçlerini tamamen pekiştireceğiz.
Machine Learning (Makine Öğrenmesi) Dünyasına Geçiş: Görselleştirme temelleri üzerine inşa ettiğimiz bu sağlam veri analitiği adımını başarıyla tamamladıktan sonra, yapay zeka yolculuğumuzun en heyecanlı evresi olan Machine Learning dünyasının kapılarını aralayacağız. Görselleştirerek karakteristiğini çözdüğümüz bu verileri akıllı algoritmalara teslim edecek ve sistemlerin kendi kendine öğrenme süreçlerini inşa etmeye başlayacağız.
Ham verileri konuşturduğumuz, sayılara ruh üflediğimiz bu görsel serüvende bizimle birlikte kodlayan, sorgulayan ve analitik vizyonunu genişleten tüm okuyucularımıza teşekkür ederiz.

