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ımVektö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 sapmaPandas: 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 doldurZaman 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() * 100Gö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.