Pandas ile keşifsel veri analizi
Gerçek dünya verisi bir hazine sandığı gibidir — içinde altın kadar çöp de vardır. Keşifsel Veri Analizi (EDA), bu sandığı açıp neyin değerli neyin atılması gerektiğini anlamanızı sağlar. İyi bir EDA, başarılı bir modelin temel taşıdır.
🔍Dedektif Gibi Düşünün
EDA, bir cinayet masası dedektifinin olay yerini incelemesine benzer. Her veri noktası bir ipucu, her dağılım bir örüntü, her aykırı değer potansiyel bir şüpheli. Acele etmeden, sistematik olarak tüm kanıtları toplarsınız.
Eksik veriler üç türde gelir:…
Eksik veri analizi ve görselleştirme
| 1 | import pandas as pd |
| 2 | import seaborn as sns |
| 3 | import matplotlib.pyplot as plt |
| 4 | |
| 5 | # Eksik veri sayımı |
| 6 | print(df.isnull().sum()) |
| 7 | print(f"Toplam eksik oran: {df.isnull().mean().mean():.2%}") |
| 8 | |
| 9 | # Eksik veri haritası |
| 10 | sns.heatmap(df.isnull(), cbar=True, yticklabels=False) |
| 11 | plt.title("Eksik Veri Haritası") |
| 12 | plt.show() |
| 13 | |
| 14 | # Basit imputation stratejileri |
| 15 | df['yaş'].fillna(df['yaş'].median(), inplace=True) # Sayısal |
| 16 | df['şehir'].fillna(df['şehir'].mode()[0], inplace=True) # Kategorik |
⚠️Eksik veriyi silmeden önce düşünün! %5'ten fazla eksik varsa silmek yerine imputation tercih edin. Ancak hedef değişkende eksik varsa o satırları silmek genellikle en güvenli yoldur.
Verinin şeklini anlamak kritiktir:…
IQR = Q3 - Q1 | Aykırı: x < Q1-1.5·IQR veya x > Q3+1.5·IQRInterquartile Range (IQR) yöntemi aykırı değer tespitinin en yaygın yoludur. Q1 (25. persentil) ve Q3 (75. persentil) arasındaki mesafenin 1.5 katı dışındaki değerler aykırı kabul edilir.
Aykırı değer tespiti: IQR ve Z-score
| 1 | import numpy as np |
| 2 | from scipy import stats |
| 3 | |
| 4 | # IQR yöntemi |
| 5 | Q1 = df['fiyat'].quantile(0.25) |
| 6 | Q3 = df['fiyat'].quantile(0.75) |
| 7 | IQR = Q3 - Q1 |
| 8 | alt_sinir = Q1 - 1.5 * IQR |
| 9 | ust_sinir = Q3 + 1.5 * IQR |
| 10 | outliers_iqr = df[(df['fiyat'] < alt_sinir) | (df['fiyat'] > ust_sinir)] |
| 11 | |
| 12 | # Z-score yöntemi (|z| > 3 aykırı) |
| 13 | z_scores = np.abs(stats.zscore(df['fiyat'])) |
| 14 | outliers_z = df[z_scores > 3] |
| 15 | |
| 16 | print(f"IQR ile {len(outliers_iqr)}, Z-score ile {len(outliers_z)} aykırı değer") |
Aykırı Değeri Sil
Aykırı Değeri Tut
Değişkenler arası ilişkiyi ölçer:…
Korelasyon matrisi ve ısı haritası
| 1 | import seaborn as sns |
| 2 | |
| 3 | # Pearson korelasyonu |
| 4 | corr_matrix = df.select_dtypes(include=[np.number]).corr() |
| 5 | |
| 6 | # Isı haritası |
| 7 | plt.figure(figsize=(10, 8)) |
| 8 | sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0, |
| 9 | fmt='.2f', square=True, linewidths=0.5) |
| 10 | plt.title("Korelasyon Matrisi") |
| 11 | plt.tight_layout() |
| 12 | plt.show() |
| 13 | |
| 14 | # Yüksek korelasyonlu çiftleri bul |
| 15 | high_corr = corr_matrix.abs().unstack().sort_values(ascending=False) |
| 16 | high_corr = high_corr[high_corr < 1] # Kendisiyle korelasyonu çıkar |
| 17 | print(high_corr[high_corr > 0.8]) |
Kategorik değişkenler farklı araçlar gerektirir:…
Kategorik veri analizi
| 1 | from scipy.stats import chi2_contingency |
| 2 | |
| 3 | # Countplot |
| 4 | sns.countplot(data=df, x='eğitim_seviyesi', hue='işe_alındı') |
| 5 | plt.title("Eğitim Seviyesine Göre İşe Alınma") |
| 6 | plt.show() |
| 7 | |
| 8 | # Crosstab ve Chi-square |
| 9 | cross = pd.crosstab(df['eğitim_seviyesi'], df['işe_alındı']) |
| 10 | chi2, p_value, dof, expected = chi2_contingency(cross) |
| 11 | print(f"Chi-square: {chi2:.2f}, p-value: {p_value:.4f}") |
| 12 | if p_value < 0.05: |
| 13 | print("İki değişken arasında anlamlı ilişki var!") |
💡EDA'da df.describe() ve df.info() ile başlayın. Sonra hedef değişkenin dağılımını inceleyin — dengesiz sınıflar varsa stratejinizi ona göre belirleyin.
✦ Quiz
Bir değişkende %30 eksik veri var. En uygun yaklaşım hangisidir?
✦ Quiz
Pearson korelasyonu r = 0.95 çıktı. Bu ne anlama gelir?
✦ Quiz
Hangi durumda Spearman korelasyonu Pearson'a tercih edilmelidir?
Bağlantılı Konular