<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Berke Turan on Medium]]></title>
        <description><![CDATA[Stories by Berke Turan on Medium]]></description>
        <link>https://medium.com/@berke_datanalyzer3?source=rss-6da14250f5bd------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*dmbNkD5D-u45r44go_cf0g.png</url>
            <title>Stories by Berke Turan on Medium</title>
            <link>https://medium.com/@berke_datanalyzer3?source=rss-6da14250f5bd------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 19:12:21 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@berke_datanalyzer3/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Power BI’da Yapay Zekanın Bile Aylarca Atladığı O Küçük Detay: Kümülatif Toplam Neden Zikzak Çizer?]]></title>
            <link>https://medium.com/@berke_datanalyzer3/power-bida-yapay-zekan%C4%B1n-bile-aylarca-atlad%C4%B1%C4%9F%C4%B1-o-k%C3%BC%C3%A7%C3%BCk-detay-k%C3%BCm%C3%BClatif-toplam-neden-zikzak-%C3%A7izer-f88cc872673b?source=rss-6da14250f5bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/f88cc872673b</guid>
            <category><![CDATA[dax]]></category>
            <category><![CDATA[power-bi]]></category>
            <category><![CDATA[data-analytics]]></category>
            <category><![CDATA[yapay-zeka]]></category>
            <category><![CDATA[verianalizi]]></category>
            <dc:creator><![CDATA[Berke Turan]]></dc:creator>
            <pubDate>Sat, 14 Nov 2026 17:37:22 GMT</pubDate>
            <atom:updated>2026-11-14T17:37:22.154Z</atom:updated>
            <content:encoded><![CDATA[<h4><em>DAX formülünüz kâğıt üzerinde kusursuz görünmesine rağmen grafikte birikimli artış yerine anlamsız iniş çıkışlar görüyorsanız, çözüm sadece 7 karakterlik </em><em>.[Date] gizeminde saklı olabilir.</em></h4><p>Yapay zekayı kullanarak Power BI ile çalışan herkesin mutlaka en az bir kez duvara tosladığı anlar vardır: Her şeyin kitabına uygun göründüğü bir kümülatif toplam DAX formülü yazarsınız ama grafikte kümülatif (birikimli) bir artış görmek yerine, aylara göre inip çıkan anlamsız bir zikzakla karşılaşırsınız.</p><p>Geçtiğimiz aylarda tam olarak bu problemi yaşadım. İşin en sinir bozucu yanı, sorunu çözmek için yapay zekaya danıştığımda da aylarca aynı kısır döngüye girmemdi. <em>“Bak, bu bir kümülatif toplam olmalı, dikkat et”</em> diyerek defalarca sormama rağmen yapay zeka bana her seferinde teorik olarak kusursuz görünen ama raporumda bir türlü çalışmayan o klasik ezber formülleri verip durdu.</p><p>Ta ki yeni bir denemede yapay zekanın sütun adının sonuna eklediği o küçücük .[Date] detayını fark edene kadar. Meğer aylardır beni ve yapay zekayı ters köşe yapan bu kördüğümün çözümü sadece <strong>7 karakterde</strong> gizliymiş.</p><p>Gelin, bu “görünmez tuzak” neymiş ve nasıl çözülüyormuş adım adım inceleyelim.</p><h3>Sorun Neydi? (Kâğıt Üzerinde Kusursuz, Grafikte Zikzak)</h3><p>Elimde şirket kayıtlarının tutulduğu standart bir tablo vardı ve amacım kayıt tarihine göre kümülatif toplam şirket sayısını hesaplamaktı. İlk etapta yazdığım ve yapay zekanın da <em>“Daha iyisi ve doğrusu bu”</em> diyerek bana aylarca önerdiği klasik formül şuydu:</p><pre>// Teoride doğru görünen ama grafikte zikzak çizen klasik yaklaşım:<br>Kumulatif Sirket Sayisi = <br>VAR _MaxTarih = MAX(&#39;SirketKayitlari&#39;[KayitTarihi])<br>RETURN<br>CALCULATE(<br>    COUNT(&#39;SirketKayitlari&#39;[Id]),<br>    &#39;SirketKayitlari&#39;[KayitTarihi] &lt;= _MaxTarih,<br>    NOT ISBLANK(&#39;SirketKayitlari&#39;[SirketAdi]),<br>    REMOVEFILTERS(&#39;SirketKayitlari&#39;[KayitTarihi])<br>)</pre><p>Yazım (syntax) olarak tek bir hatası bile yoktu. Ancak formülü çizgi grafiğe attığımda kümülatif bir yükseliş yerine, her ayın sadece kendi içindeki sayıyı gösteren zikzaklı bir grafikle karşılaşıyordum.</p><p>Sorunu çözen ise formülün mantığını değiştirmek değil, tarih sütununa sadece .[Date] ekleyerek şu yapıya geçmek oldu:</p><pre>// Sorunu çözen ve grafiği pürüzsüzleştiren nihai formül:<br>Kumulatif Sirket Sayisi = <br>VAR _MevcutDonemSayisi = <br>    CALCULATE(<br>        COUNT(&#39;SirketKayitlari&#39;[Id]),<br>        NOT ISBLANK(&#39;SirketKayitlari&#39;[SirketAdi])<br>    )<br>VAR _MaxTarih = MAX(&#39;SirketKayitlari&#39;[KayitTarihi].[Date])<br>RETURN<br>IF(<br>    NOT ISBLANK(_MevcutDonemSayisi),<br>    CALCULATE(<br>        COUNT(&#39;SirketKayitlari&#39;[Id]),<br>        NOT ISBLANK(&#39;SirketKayitlari&#39;[SirketAdi]),<br>        FILTER(<br>            ALLSELECTED(&#39;SirketKayitlari&#39;[KayitTarihi].[Date]),<br>            &#39;SirketKayitlari&#39;[KayitTarihi].[Date] &lt;= _MaxTarih<br>        )<br>    )<br>)</pre><p>Peki ama ne değişti de aylardır çalışmayan formül bir anda kusursuz bir kümülatif eğriye dönüştü? Cevap <strong>3 kritik detayda</strong> gizli.</p><h3>1. İki Katmanlı Filtre Tuzağı: KayitTarihi vs KayitTarihi.[Date]</h3><p>Eğer projenizde <strong>Auto Date/Time (Otomatik Tarih/Saat)</strong> ayarını kapatmadıysanız ve ayrı bir Takvim (Date) tablosu oluşturmadıysanız, Power BI modelinizdeki her bir tarih sütunu için arka planda sizin görmediğiniz gizli bir takvim tablosu (LocalDateTable_...) üretir.</p><p>Siz KayitTarihi sütununu grafiğin X eksenine sürüklediğinizde, Power BI aslında sizin tablonuzdaki o sütunu değil, arka planda ürettiği bu gizli tablonun <strong>Yıl &gt; Çeyrek &gt; Ay &gt; Gün</strong> hiyerarşisini kullanır.</p><ul><li><strong>Neden zikzak çıkıyordu?</strong> Formülde REMOVEFILTERS(&#39;SirketKayitlari&#39;[KayitTarihi]) veya ALL(&#39;SirketKayitlari&#39;[KayitTarihi]) yazdığınızda, yalnızca ana tablodaki sütunun filtresini kaldırıyorsunuz. Oysa grafik eksenindeki Ay veya Yıl filtresi, arka plandaki o gizli takvim tablosundan gelmeye devam ediyor. Filtre kırılmadığı için Power BI her ay sadece kendi içindeki sayıyı hesaplıyor.</li><li><strong>Nasıl çözüldü?</strong> Sütunun sonuna .[Date] ekleyerek Power BI&#39;a şu net komutu vermiş olduk: <em>&quot;Ana tablodaki sütuna değil, arka planda oluşturduğun o gizli takvim tablosunun filtresine müdahale et.&quot;</em></li></ul><h3>2. Neden ALL Yerine ALLSELECTED Kullanmalıyız?</h3><p>Çözümdeki bir diğer hayati dokunuş ise ALL yerine ALLSELECTED fonksiyonunu tercih etmek:</p><ul><li>Eğer ALL(&#39;SirketKayitlari&#39;[KayitTarihi].[Date]) kullanırsanız, sayfadaki <strong>Tarih Slicer (dilimleyici)</strong> seçimini de ezersiniz. Örneğin kullanıcı ekrandan sadece 2024 yılını seçse bile, grafik en baştan (örneğin 2020&#39;den) itibaren kümülatif toplamı hesaplamaya devam eder.</li><li>ALLSELECTED(...) ise Power BI&#39;a şunu söyler: <em>&quot;Kullanıcının slicer&#39;dan seçtiği tarih aralığını ve diğer filtreleri (örneğin sadece İstanbul&#39;u) koru; yalnızca seçili aralıktaki tarih kırılımını kendi içinde kümülatif olarak biriktir.&quot;</em></li></ul><p><em>(Küçük bir bonus ipucu: Formülün başındaki </em><em>IF(NOT ISBLANK(_MevcutDonemSayisi), ...) kontrolü ise henüz yaşanmamış gelecek aylarda çizginin dümdüz sağa doğru uzamasını engelleyip grafiği veri olan son ayda keser.)</em></p><h3>3. Büyük Ders: Otomatik Takvim mi, Özel Takvim Tablosu mu?</h3><p>Bu süreç bana Power BI’ın arka plandaki zaman zekâsının nasıl çalıştığını bilmenin ne kadar kritik olduğunu gösterdi. İki yaklaşımın davranış farkını bilmek, yazacağınız DAX formüllerinin kaderini doğrudan belirliyor:</p><ul><li><strong>Otomatik Tarih/Saat (Auto Date/Time) Kullanıyorsanız:</strong> Power BI her tarih sütunu için arka planda kendi gizli hiyerarşisini kurar. Bu yapıda standart tarih sütununu doğrudan çağırmak yeterli olmaz; gizli takvim tablosuna ulaşmak için formüllerinizde mutlaka .[Date] uzantısını belirtmeniz gerekir.</li><li><strong>Kendi Özel Takvim Tablonuzu (Calendar Table) Oluşturuyorsanız:</strong> Modelinize özel bir takvim tablosu ekleyip ayarlardan Auto Date/Time özelliğini kapattığınızda, arka planda gizli tablolar üretilmez. İlişkiyi doğrudan kendi tablonuz üzerinden kurduğunuz için .[Date] yazmanıza gerek kalmadan, yapay zekanın da ilk anda önerdiği o standart ve temiz kümülatif formüller sorunsuz çalışır.</li></ul><h3>Sonuç</h3><p>Yapay zeka harika bir yardımcı; ancak modelin arka planında Power BI’ın hangi gizli ayarlarının açık olduğunu göremiyor. Veri setinin mimarisini, veri modelini, neleri barındırdığını ve sınırlarını da bilmiyor — ve siz bunları yapay zekaya söylemediğiniz takdirde asla bilmeyecek.</p><p>Bazen aylarca uğraştıran veri analitiği problemlerinin çözümü yalnızca doğru kodu yazmaktan değil; veriyi tanımaktan, veri modelinin mimarisine hâkim olmaktan ve kullandığımız aracın arka plan ayarlarını bilmekten geçiyor.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f88cc872673b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Masum Bir .fillna(0) Kodunun Şirketi Zarara Uğratma Hikâyesi: Sessiz Hataların Anatomisi]]></title>
            <link>https://medium.com/@berke_datanalyzer3/masum-bir-fillna-0-kodunun-%C5%9Firketi-zarara-u%C4%9Fratma-hik%C3%A2yesi-sessiz-hatalar%C4%B1n-anatomisi-480d56d2e47d?source=rss-6da14250f5bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/480d56d2e47d</guid>
            <category><![CDATA[sql]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[missing-value-analysis]]></category>
            <category><![CDATA[data-analysis]]></category>
            <category><![CDATA[data-science]]></category>
            <dc:creator><![CDATA[Berke Turan]]></dc:creator>
            <pubDate>Thu, 12 Nov 2026 08:22:45 GMT</pubDate>
            <atom:updated>2026-11-12T08:22:45.980Z</atom:updated>
            <content:encoded><![CDATA[<p>Kodunuzun Traceback fırlatıp patlaması aslında başınıza gelebilecek en iyi şeydir. Çünkü en azından bir şeylerin ters gittiğini bilirsiniz.</p><p>Gerçek kâbus; işi baştan yanlış yaptığının farkında olmayıp buna rağmen terminalin yemyeşil olduğu ve modelin başarıyla canlıya alındığı an başlar.</p><p>Diyelim ki bir e-ticaret şirketinde kullanıcıların gelecek ayki harcama tutarlarını tahmin eden bir regresyon modeli kuruyoruz. Elimizde 100.000 satırlık bir veri seti var ve modelin başarı metrikleri (RMSE, R²) gayet makul görünüyor.</p><p>Veri ön işleme aşamasında iade_edilen_urun_tutari kolonunda yaklaşık %34 oranında eksik veri (NaN) olduğunu fark ediyoruz ve şu masum satırı yazıyoruz:</p><pre># İade tutarı boş olanlar belli ki ürün iade etmemiş, o zaman 0 yazalım!<br>df[&#39;iade_edilen_urun_tutari&#39;] = df[&#39;iade_edilen_urun_tutari&#39;].fillna(0)</pre><p>Dışarıdan bakıldığında “mantıklı bir iş kuralı” gibi duran bu satır, gerçekte modeli nasıl felç etti?</p><h3>SQL’in Sessiz Mirası: Tablolar Nasıl Birleşti?</h3><p>Gerçek projelerde veri kimsenin önüne tertemiz bir CSV olarak gelmez. İster bir BI geliştiricisi olun ister veri bilimci, o veriyi üretim veritabanından veya veri ambarından (DWH) SQL sorgularıyla bizzat çekersiniz. Asıl kopukluk da tam burada yaşanır: SQL tarafında veriyi birleştirirken kurduğumuz mimari mantığı, Python tarafında modellemeye geçtiğimiz an unuturuz.</p><p>Muhtemelen bu tablo veritabanından şöyle bir sorguyla çekilmişti:</p><pre>SELECT <br>    u.kullanici_id,<br>    u.toplam_siparis_sayisi,<br>    i.iade_edilen_urun_tutari<br>FROM kullanicilar u<br>LEFT JOIN iadeler i ON u.kullanici_id = i.kullanici_id;</pre><p>LEFT JOIN atıldığında sağ taraftaki iadeler tablosunda eşleşmeyen her kayıt için SQL NULL basar, Python ise bunu NaN olarak karşılar.</p><h3>Gizli Tuzak: İki Farklı Dünyayı Aynı Çuvala Koymak</h3><p>Veriyi doğrudan 0 ile doldurduğumuzda aslında birbirinin tamamen zıttı iki müşteri profilini modelin gözünde ikiz kardeş haline getiririz:</p><ul><li><strong>Müşteri A (Sadık / Risksiz):</strong> 15 adet sipariş vermiş, ürünleri beğenmiş ve bugüne kadar 1 lira bile iade yapmamış. Gelecek ay harcama yapma potansiyeli oldukça yüksek.</li><li><strong>Müşteri B (İnaktif / Yeni Kayıt):</strong> Siteye aylar önce kaydolmuş ama tek bir sipariş bile vermemiş (toplam_siparis_sayisi = 0). Doğal olarak iade edecek bir ürünü de olmamış.</li></ul><p>.fillna(0) yazdığımız an, Müşteri A ile Müşteri B&#39;nin iade tutarı eşitlenir (0 TL). Model; sipariş geçmişi olmayan pasif bir kullanıcı ile sadık bir müşteriyi ayırt edemez ve tahminleri sistematik olarak sapar.</p><p>İş tarafında bunun faturası ağırdır: Model, hiç alışveriş yapmamış pasif kitleye yanlışlıkla yüksek harcama potansiyeli biçerek pazarlama ve kampanya bütçesinin yanlış hedef kitleye akmasına yol açar.</p><h3>Eksiklik Bir Hata Değil, Bir Davranıştır</h3><p>Bazı veri setlerinde eksiklik bir sistem hatası değil, doğrudan bir kullanıcı davranışının sonucudur. Örneğimizde iade verisinin eksik olması, veri setindeki başka bir gözlemlenebilir değişkene — yani kullanıcının sipariş geçmişine — doğrudan bağıntılıdır.</p><p>İstatistik dünyasında bir değişkendeki eksikliğin veri setindeki başka bir sütuna bağlı olması durumu <strong>MAR</strong> (<em>Missing at Random</em> — Rastgele Eksiklik) olarak adlandırılır. Yani bir hücrenin boş kalması tesadüf değildir; kullanıcının henüz o aksiyonu almadığını gösteren güçlü bir ipucudur. Siz o boşluğu varsayımsal bir sıfırla doldurduğunuz an, sistemi uyaran bu değerli ipucunu silip gerçek verilerin arasına karıştırmış olursunuz.</p><h3>Peki Doğrusu Ne Olmalıydı?</h3><ol><li><strong>Koşullu Doldurma (Conditional Imputation)</strong> Tüm kolona körü körüne 0 basmak yerine iş kuralını filtreleyerek uygulayın. Siparişi olanlara 0 atarken, siparişi olmayanları NaN olarak bırakın ki model bu iki grubu birbirinden ayırabilsin:</li></ol><pre># Sadece siparişi olup iadesi olmayanlara 0 ver, siparişi olmayanlar NaN kalsın<br>has_orders = df[&#39;toplam_siparis_sayisi&#39;] &gt; 0<br>df.loc[has_orders &amp; df[&#39;iade_edilen_urun_tutari&#39;].isna(), &#39;iade_edilen_urun_tutari&#39;] = 0</pre><p><strong>2. Kayıp Bilgisini Özelliğe Çevirmek (Indicator Flags)</strong> Eksikliği modelin doğrudan okuyabileceği yeni bir değişkene dönüştürün. Örneğin hic_siparis_verdi_mi (0/1) veya iade_verisi_eksik_mi gibi ikili (flag) kolonlar türeterek modele sinyali açıkça verin.</p><p><strong>3. Ağaç Tabanlı Modellerin Gücünü Kullanmak</strong> XGBoost, LightGBM veya CatBoost gibi modern algoritmalar NaN değerlerini varsayılan olarak yerel şekilde yönetebilir. Boşlukları zorla ezmek yerine ağacın o eksikliği kendi karar kuralı (split) olarak öğrenmesine izin verin.</p><h3>Sonuç</h3><p>Veri setinde kayıp gözlemlerle karşılaştığımızda bunun otomatik bir doldurma işlemi değil, verilmesi gereken stratejik bir karar olduğunu unutmamalıyız. Bir sonraki adıma geçmeden önce kendimize şu kritik soruyu sormalıyız:</p><blockquote>“Bu bilgi gerçekten bilinmediği veya sistemde kaybolduğu için mi eksik, yoksa iş kuralı gereği zaten boş mu olması gerekiyor?”</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=480d56d2e47d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Power BI’da Etiketleme Yaparken Dikkat Edilmesi Gereken O Kritik Detay]]></title>
            <link>https://medium.com/@berke_datanalyzer3/power-bida-etiketleme-yaparken-dikkat-edilmesi-gereken-o-kritik-detay-af8c0fab4bca?source=rss-6da14250f5bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/af8c0fab4bca</guid>
            <category><![CDATA[power-bi]]></category>
            <category><![CDATA[data-modeling]]></category>
            <category><![CDATA[business-intelligence]]></category>
            <category><![CDATA[data-analysis]]></category>
            <category><![CDATA[dax]]></category>
            <dc:creator><![CDATA[Berke Turan]]></dc:creator>
            <pubDate>Tue, 10 Nov 2026 15:49:28 GMT</pubDate>
            <atom:updated>2026-11-10T15:49:28.795Z</atom:updated>
            <content:encoded><![CDATA[<p>Power BI raporları geliştirirken hepimiz bir noktada şu senaryoyla karşılaşırız:</p><blockquote>“Müşterilerin toplam harcamasına bak, 10 bin TL’nin üzerindekilere VIP, altındakilere Standart yaz.”</blockquote><p>Geliştirici koltuğuna oturan pek çok kişinin ilk hamlesi bellidir: Koşulu yapıştır ve geç. Rapor çalışıyor mu? Çalışıyor, olay bitmiştir.</p><p>Peki, karar verirken kendimize şu soruyu soruyor muyuz? Elimizde bulunan veri seti için kategorize etmek amacıyla kurgulanacak mantığın nasıl yazılması gerektiğini gerçekten biliyor muyuz?</p><p>Mesele DAX fonksiyonunu veya formülü yazabilme becerisi değil; esas mesele, kategorilendirme yaparken verinin doğasını bilmektir.</p><p>Eğer yapacağınız kategorilendirme; raporda seçilen yıla, seçilen tarih aralığına veya uygulanan diğer filtrelere bağlı olarak değişiyorsa ya da zamanla verinin kendisi güncellendiği için farklı sonuçlar veriyorsa başka bir yol izlemelisiniz. Aksi bir durum söz konusu ise, yani mantık tamamen sabitse, hareket tarzınız bambaşka olmalıdır.</p><p>Kısacası, klavyeye basmadan önce vereceğiniz ilk ve en kritik karar şudur: <strong>Yazacağımız bu mantık statik mi olmalı, yoksa dinamik mi?</strong></p><p>İşte Power BI modellemesinde işler tam burada çatallaşır. Mimari başarının sırrı şu iki net kuralda yatar:</p><blockquote><strong><em>“Statikse Power Query, dinamikse DAX Ölçüsü!”</em></strong></blockquote><h3>1. Statik Durumlar: “Veri güncellenince bu etiket değişiyor, o zaman dinamik değil mi?” Tuzağı</h3><p>Geliştirici olarak hemen şöyle düşünebilirsin:</p><p><em>“Müşterinin geçen ayki toplam harcaması 5 bin TL’ydi ve Standart’tı. Bu ay yeni siparişler girdi, yaşam boyu harcaması (LTV) 10 bin TL’yi geçti ve etiket VIP oldu. Veri yenilendikçe bu etiket değişiyor, demek ki bu dinamik!”</em></p><p>İşte en büyük zihinsel tuzak burasıdır.</p><p>Veri kaynağının her gece güncellenmesi (Scheduled Refresh) veya “Ödendi / Ödenmedi” gibi durumların zamanla değişmesi, o kuralı <strong>dinamik</strong> yapmaz. Kural buz gibi sabittir: <em>Müşterinin tüm zamanlardaki harcaması &gt; 10.000 TL ise VIP yaz.</em></p><p>Veri yenilendikçe Power Query bu sabit kuralı yeni satırlara bir kez basar ve geçer. Bu işlem, verinin o anki fotoğrafıdır. Madem etiket sabit bir kurala dayanıyor, bunu raporda kullanıcı her tıkla etkileşime girdiğinde anlık hesaplatıp CPU’yu ve hafızayı yormanın alemi yok. İşlem Power Query (M Kodu) katmanında çözülüp modele öyle yüklenmelidir. Bu yaklaşım, Power BI’ın sıkıştırma motorundan (VertiPaq) maksimum performans almanızı sağlar ve rapor açılış hızını uçurur.</p><h3>2. Dinamik Durumlar: “Kuralın Kendisi Kullanıcının Elindeyse”</h3><p>Peki olay ne zaman DAX Ölçüsü (Measure) olmak zorundadır?</p><p>Diyelim ki rapora bir <strong>tarih dilimleyicisi (Slicer)</strong> koydunuz. Kullanıcı rapordan <em>“Sadece 2026 yılı”</em> veya <em>“Son 3 Ay”</em> seçimini yaptı. Amacınız da müşterinin <strong>seçilen bu spesifik tarih aralığındaki</strong> harcamasına göre VIP olup olmadığını bulmak.</p><p>Ya da patron rapora geldi ve slicer’dan:</p><p><em>“Bakalım müşteriler son 3 ayda mı pasifleşmiş, yoksa son 6 aya vites büyütürsek tablo nasıl değişiyor?”</em> diye sordu.</p><p>Kullanıcı ekrandaki filtreleri değiştirdiği veya o çubuğu 3 aydan 6 aya çektiği an, riskli müşteri tanımı da VIP müşteri listesi de anlık olarak değişmek zorundadır. Bunu gidip veri yüklenirken Power Query’de tablonun içine sabit bir sütun olarak yazamazsınız; çünkü Power Query kullanıcının ekranda neyi seçeceğini (Filter Context) önceden bilemez.</p><h3>Karar Rehberi: Klavyeye Basmadan Önce Kendine Sor</h3><ul><li><strong>Müşterinin tüm zamanlardaki (LTV) 10k üzeri harcaması:</strong> Kullanıcı ekran filtresinden bağımsız sabit bir veri kuralıdır. → <strong>Statik (Power Query)</strong></li><li><strong>“Ödendi / Ödenmedi” bilgisi:</strong> Veri yenilendikçe durumu değişse de mantık kuralı sabittir. → <strong>Statik (Power Query)</strong></li><li><strong>Takvimdeki “Son 3 Ay” etiketi:</strong> Çıpan sabittir (TODAY()), kullanıcı slicer’ına göre şekil değiştirmez. → <strong>Statik (Power Query / Tarih Tablosu)</strong></li><li><strong>Seçilen tarih aralığına göre 10k üzeri harcayan müşteri:</strong> Kullanıcı slicer’dan tarihi değiştirdikçe etiket anlık değişmelidir. → <strong>Dinamik (DAX Ölçüsü)</strong></li><li><strong>Kullanıcının değiştirdiği eşiklere göre (örn. 3 ay vs 6 ay pasiflik) değişen risk analizi:</strong> Kullanıcı ekranda parametreyle oynadıkça anlık yeniden hesaplanır. → <strong>Dinamik (DAX Ölçüsü)</strong></li><li><strong>Tarih Dilimleyicisi (Slicer) ile esnek zaman analizleri:</strong> Kullanıcının serbest seçimlerine dayalı kıyaslamalar (SAMEPERIODLASTYEAR vb.). → <strong>Dinamik (DAX Ölçüsü)</strong></li></ul><p><strong>Sonuç olarak;</strong> harika bir Power BI mimarisi, sadece karmaşık DAX formülleri yazmakla değil; <strong>doğru hesabı doğru katmanda yapma disipliniyle</strong> inşa edilir.</p><p>Bir dahaki sefere modele yeni bir mantık eklemeden önce durun, klavyeden elinizi çekin ve kendinize şu kritik soruyu sorun:</p><p><em>“Ben şu an verinin anlık bir </em><strong><em>fotoğrafını mı</em></strong><em> çekiyorum (Statik / Power Query), yoksa kullanıcının her hareketine göre akan bir </em><strong><em>video mu</em></strong><em> kaydediyorum (Dinamik / DAX Ölçüsü)?”</em></p><p>Bu soruya vereceğiniz yanıt, sadece raporunuzun performansını değil, mimarinizin kaderini belirleyecek.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=af8c0fab4bca" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Kodunuz Hata Vermiyor Olabilir Ama Veriniz Çürüyor: Sıfırların Gizli Anlamı]]></title>
            <link>https://medium.com/@berke_datanalyzer3/kodunuz-hata-vermiyor-olabilir-ama-veriniz-%C3%A7%C3%BCr%C3%BCyor-s%C4%B1f%C4%B1rlar%C4%B1n-gizli-anlam%C4%B1-2273cb7d0327?source=rss-6da14250f5bd------2</link>
            <guid isPermaLink="false">https://medium.com/p/2273cb7d0327</guid>
            <category><![CDATA[python]]></category>
            <category><![CDATA[data-analysis]]></category>
            <category><![CDATA[data-science]]></category>
            <dc:creator><![CDATA[Berke Turan]]></dc:creator>
            <pubDate>Sun, 08 Nov 2026 10:43:09 GMT</pubDate>
            <atom:updated>2026-11-08T10:43:09.360Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Bu benim hayatımdaki ilk blog yazım. Dürüst olmak gerekirse bir blog yazısı tam olarak nasıl yazılır, nereden başlanır pek bilmiyorum. Ama veri dünyasına adım attığımdan beri içimde biriken ve sektörün içinde yer alan profesyonellerin bile bazen gözden kaçırabilme ihtimali olduğunu fark ettiğim konulardan birine değinmek istiyorum.</em></p><p>Veri temizleme ve keşifsel veri analizi yaparken hepimizin beklediği o klasik mutlu an vardır: df.isnull().sum() çalıştırırsınız ve karşınıza tertemiz bir tablo çıkar: <strong>0 eksik veri!</strong> İçiniz rahatlar, her şeyin yolunda olduğunu düşünürsünüz.</p><p>Oysa veri dünyasında asıl tehlike, sistemin çığlık attığı hatalar değil; sessizce işleyen hatalardır. Ve o sinsi sıfırlarla ilk kez yüzleştiğinizde anlarsınız ki: <strong>Her </strong><strong>0 bir sayı değildir.</strong></p><p>Örnek vermek gerekirse bazı veri setlerinde yaş değişkeni mevcuttur ve Python programlama ile df.describe() kodu yazıldığında değişkenlerin sahip oldukları değer aralıklarını incelerken yaş değişkeninin minimum değerinin 0 olduğunu görürüz. Bazen veride yaş değişkeninin içerisinde 0 yer almasının normal olduğunu varsayarız; peki ya varsayımlarımız bizi tehlikeye götürüyorsa? Gerçekten elimizdeki veriden yola çıkarak yaş değişkeninin içerisinde 0 olabilme ihtimali söz konusu mudur? Hangi kitleden yola çıkarak örneklem topladığımızın bilincinde miyiz?</p><p>Gelin, veride yer alabilecek o 4 farklı <strong>“Sıfır”</strong> türüne bakalım.</p><h3>1. Yalancı Sıfır</h3><p>En tehlikeli tür tam olarak budur. Kullanıcı bir web formunda yaşını, aylık gelirini veya harcama tutarını boş bıraktığında; arka taraftaki yazılım hata fırlatmasın diye ilgili kişiler bu alanı veritabanına 0 olarak kaydeder.</p><p>Siz Python’da df.isnull().sum() çalıştırırsınız. Çıktı tertemizdir: <strong>0 eksik veri!</strong></p><p>Ancak bir müşteri grubunun ortalama gelirini hesaplamaya kalktığınızda, geliri bilinmeyen binlerce kişi 0 TL kazanıyormuş gibi hesaba katılır. Sonuç? Ortalama yerle bir olur, makine öğrenmesi modeliniz yanlış ağırlıklar öğrenir ve şirket tamamen yanlış bir stratejiye saplanır.</p><h3>2. Gerçek Sıfır</h3><p>Bu, hepimizin sevdiği ve aradığı masum sıfırdır.</p><ul><li>Müşterinin hesabındaki bakiye gerçekten 0 TL&#39;dir.</li><li>Bugün mağazadan 0 adet ürün satılmıştır.</li></ul><p>Gerçek bir ölçümdür, nicel bir değer taşır ve istatistiksel hesaplamalara (ortalama, standart sapma vb.) gönül rahatlığıyla dahil edilebilir.</p><h3>3. Yapısal Sıfır</h3><p>Bu sıfır, bir olayın gerçekleşmediğini değil; <strong>gerçekleşmesinin mantıken imkansız olduğunu</strong> söyler.</p><p>Örneğin, bir sağlık verisetinde erkek bir hastaya <em>“Geçirilen Hamilelik Sayısı”</em> sorulduğunda cevabın 0 olması gibi. Bu kişi &quot;0 hamilelik geçirdi&quot; demek doğru değildir; bu soru bu hasta için <em>kavramsal olarak geçersizdir</em>. Bu sıfırları, normal sayısal sıfırlarla aynı çuvala atmak modeli tamamen mantık dışı kararlara sürükler.</p><h3>4. Mantıksal / Kategori Sıfırı</h3><p>Bir durumun varlığını veya yokluğunu gösteren sıfırdır.</p><ul><li>Sözleşmeyi kabul etti mi? 1 (Evet) / 0 (Hayır).</li><li>Premium üye mi? 1 / 0.</li></ul><p>Bu sıfır bir “sayı” değildir, bir <strong>etikettir</strong>. Ancak analiz yaparken bu sütunu yanlışlıkla sayısal bir değişken sanıp esasında kategorik bir değişken olduğunu fark etmezseniz, veriye tamamen yanlış bir açıdan bakmış olursunuz.</p><h3>Şimdi Kontrol Sırası Sizde</h3><p>Bu yazıyı okumayı bitirdikten sonra yapacağınız ilk iş ne olmalı biliyor musunuz? Şu an üzerinde çalıştığınız projeyi veya çalıştığınız firmanın sahip olduğu veri setlerini açın, veri setinizdeki sıfırları value_counts() ile önünüze dizin ve kendinize şu soruyu sorun:</p><blockquote><strong><em>“Bu sıfır gerçekten matematiksel olarak gerçekten olması gereken bir sıfır mıdır, yoksa anlık bir karar ile gözden kaçma ihtimali olabilecek bir varsayım yanılsaması mı?”</em></strong></blockquote><p>Çünkü veriyi sadece keşfetmek ve temizlemek yetmez; verinin kalitesinin ve doğru veri ile çalışıldığının teyit edilmesi gerekir; ayrıca verinin arkasındaki hikayeyi ve niyeti anlamak gerekir.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2273cb7d0327" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>