PYTHON // VERİ BİLİMİD::03 ORTA
25m READCOMPLETION: 87%ID::PY-301B

PYTHON PANDAS VE NUMPY: VERİ ANALİZİ VE GÖRSELLEŞTIRME

DataFrame, groupby, pivot table, zaman serisi analizi ve Matplotlib/Seaborn görselleştirme

Python veri analizi ekosisteminin iki temel taşı Pandas ve NumPy'dır. NumPy sayısal hesaplamalar için optimize edilmiş array yapısı sunar; Pandas üzerine inşa edilen DataFrame ise tablo verisi üzerinde SQL benzeri işlemleri Python'la yapmanı sağlar. Bu derste gerçek bir veri seti üzerinde analiz yapacaksın.

NumPy: Sayısal Hesaplama Temeli

// PYTHON //
import numpy as np
 
# ndarray — NumPy'ın temel veri yapısı
a = np.array([1, 2, 3, 4, 5], dtype=np.float64)
m = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
 
# Boyut ve şekil
print(m.shape)   # (3, 3)
print(m.ndim)    # 2
print(m.dtype)   # int64
 
# Hızlı array oluşturma
zeros  = np.zeros((3, 4))           # 3x4 sıfır
ones   = np.ones((2, 2), dtype=int)
eye    = np.eye(3)                   # 3x3 birim matris
arange = np.arange(0, 10, 0.5)      # 0'dan 10'a 0.5 adım
linsp  = np.linspace(0, 1, 100)     # 0-1 arası 100 eşit nokta
rand   = np.random.randn(1000)      # normal dağılım

Vektörel İşlemler

// PYTHON //
# Python list vs NumPy — 1M elemanlı toplamı kıyasla
import time
 
lst = list(range(1_000_000))
arr = np.arange(1_000_000)
 
t1 = time.perf_counter()
total = sum(x**2 for x in lst)
t2 = time.perf_counter()
print(f"List: {t2-t1:.3f}s")   # ~0.180s
 
t1 = time.perf_counter()
total = np.sum(arr**2)
t2 = time.perf_counter()
print(f"NumPy: {t2-t1:.3f}s")  # ~0.002s — 90x hızlı
// PYTHON //
# Broadcasting — farklı boyutlu array'leri işle
a = np.array([[1, 2, 3], [4, 5, 6]])  # (2, 3)
b = np.array([10, 20, 30])             # (3,) → broadcast → (2, 3)
print(a + b)
# [[11, 22, 33],
#  [14, 25, 36]]
 
# Aggregation — eksen bazlı
m = np.random.randint(0, 100, (4, 5))
print(m.sum())         # tüm elemanlar
print(m.sum(axis=0))   # her sütunun toplamı
print(m.mean(axis=1))  # her satırın ortalaması
print(m.std())         # standart sapma

Pandas: Veri Analizi

// PYTHON //
import pandas as pd
 
# Veri yükleme
df = pd.read_csv('satis_verileri.csv', 
                 parse_dates=['tarih'],
                 dtype={'musteri_id': 'Int64'})
 
# İlk bakış
print(df.head(5))
print(df.shape)         # (satır, sütun)
print(df.dtypes)
print(df.describe())    # istatistiksel özet
print(df.info())        # bellek kullanımı + null sayısı

Temel Seçim ve Filtreleme

// PYTHON //
# Sütun seçimi
df['urun_adi']                           # Series
df[['urun_adi', 'fiyat', 'adet']]       # DataFrame
 
# Koşullu filtreleme
pahali = df[df['fiyat'] > 1000]
istanbul = df[df['sehir'] == 'İstanbul']
 
# Birden fazla koşul (&, | — Python and/or OLMAZ)
istanbul_pahali = df[(df['sehir'] == 'İstanbul') & (df['fiyat'] > 500)]
 
# isin — liste içinde olanlar
buyuk_sehirler = df[df['sehir'].isin(['İstanbul', 'Ankara', 'İzmir'])]
 
# str erişimi — metin işlemleri
elektronik = df[df['kategori'].str.contains('Elektronik', case=False)]
buyuk_harf = df['urun_adi'].str.upper()
temiz = df['email'].str.strip().str.lower()

Gruplama ve Aggregation

// PYTHON //
# groupby — SQL GROUP BY karşılığı
# Her şehirdeki toplam satış
sehir_satis = df.groupby('sehir')['tutar'].sum()
 
# Çoklu aggregation
ozet = df.groupby(['sehir', 'kategori']).agg(
    toplam_satis = ('tutar', 'sum'),
    ortalama_fiyat = ('fiyat', 'mean'),
    islem_sayisi = ('id', 'count'),
    en_pahali = ('fiyat', 'max'),
).reset_index()
 
# pivot_table — çapraz tablo
pivot = pd.pivot_table(
    df,
    values='tutar',
    index='sehir',
    columns='kategori',
    aggfunc='sum',
    fill_value=0,
)
print(pivot)

Eksik Veri Yönetimi

// PYTHON //
# Eksik veri analizi
print(df.isnull().sum())                    # sütun bazında null sayısı
print(df.isnull().sum() / len(df) * 100)   # null oranı (%)
 
# Temizleme stratejileri
df_temiz = df.dropna(subset=['tutar', 'musteri_id'])    # kritik sütunlarda null varsa at
df['fiyat'] = df['fiyat'].fillna(df['fiyat'].median())  # medyan ile doldur
df['kategori'] = df['kategori'].fillna('Bilinmiyor')     # sabit değer
df['fiyat'] = df['fiyat'].ffill()                        # önceki değerle doldur

Zaman Serisi Analizi

// PYTHON //
# tarih sütununu index yap
df = df.set_index('tarih').sort_index()
 
# Yeniden örnekleme
aylik = df['tutar'].resample('ME').sum()     # aylık toplam
haftalik = df['tutar'].resample('W').mean()  # haftalık ortalama
 
# Kayan ortalama
df['7_gunluk_ort'] = df['tutar'].rolling(window=7).mean()
df['30_gunluk_ort'] = df['tutar'].rolling(window=30).mean()
 
# Büyüme oranı
df['mom_degisim'] = df['tutar'].resample('ME').sum().pct_change() * 100

Görselleştirme

// PYTHON //
import matplotlib.pyplot as plt
import seaborn as sns
 
# Seaborn ile hızlı görselleştirme
plt.figure(figsize=(12, 6))
sns.lineplot(data=df, x='tarih', y='tutar', hue='kategori')
plt.title('Kategori Bazında Aylık Satış Trendi')
plt.xlabel('Tarih')
plt.ylabel('Satış Tutarı (TL)')
plt.tight_layout()
plt.savefig('satis_trendi.png', dpi=150)
plt.show()
 
# Korelasyon matrisi
plt.figure(figsize=(8, 6))
sayisal = df.select_dtypes(include=np.number)
sns.heatmap(sayisal.corr(), annot=True, fmt='.2f', cmap='coolwarm', center=0)
plt.title('Değişkenler Arası Korelasyon')
plt.tight_layout()
plt.show()

Gerçek Analiz: E-Ticaret Raporu

// PYTHON //
def satis_raporu(dosya: str) -> dict:
    df = pd.read_csv(dosya, parse_dates=['tarih'])
 
    # 1. Temel metrikler
    metriks = {
        'toplam_gelir': df['tutar'].sum(),
        'ortalama_siparis': df['tutar'].mean(),
        'islem_sayisi': len(df),
        'benzersiz_musteri': df['musteri_id'].nunique(),
    }
 
    # 2. En çok satan ürünler
    top_urunler = (df.groupby('urun_adi')['adet']
                     .sum()
                     .sort_values(ascending=False)
                     .head(10))
 
    # 3. Aylık trend
    aylik_trend = (df.set_index('tarih')
                     .resample('ME')['tutar']
                     .agg(['sum', 'count', 'mean'])
                     .rename(columns={'sum': 'gelir', 'count': 'siparis', 'mean': 'ort_siparis'}))
 
    # 4. Müşteri segmentasyonu (RFM bazlı basit)
    bugun = df['tarih'].max()
    rfm = df.groupby('musteri_id').agg(
        recency=('tarih', lambda x: (bugun - x.max()).days),
        frequency=('id', 'count'),
        monetary=('tutar', 'sum'),
    )
 
    return {'metriks': metriks, 'top_urunler': top_urunler,
            'aylik_trend': aylik_trend, 'rfm': rfm}
 
sonuc = satis_raporu('satis_2025.csv')
print(f"Toplam Gelir: {sonuc['metriks']['toplam_gelir']:,.0f} TL")

Özet

Pandas'ta veri analizi akışı şu sırayı izler: yükle → keşfet (describe, info) → temizle (null, tip dönüşüm) → dönüştür (groupby, pivot) → görselleştir. NumPy arka planda her sayısal işlemi hızlandırır. resample zaman serileri için, groupby().agg() çok boyutlu özetleme için temel araçtır.