Bu repo; ham klinik kayıt tablosunu temizleyen, normalize eden, eksikleri KNN ile dolduran, özellik türeten ve sonuçta modellemeye hazır bir veri seti üreten uçtan uca bir Python pipeline’ı içerir. Süreç tek dosyada (pipeline.py) toplanmıştır; alan-özgü normalizasyon kuralları rules/ klasöründedir.
- Genel Bakış
- Dizin Yapısı
- Nasıl Çalıştırılır
- Veri Beklentileri
- İşleme Adımları ve Gerekçeler
- Keşif & Raporlama
- Metinsel Sürelerin Sayısala Çevrilmesi
- Düşük Kardinaliteli Kolonların Kategoriğe Çevrilmesi
- Kural Tabanlı Normalizasyon (Çok-Değerli Metinler)
- Uygulama Yerleri Üst Gruplama
- Kimlik (ID) Türetimi
- Özet ve Sayaç Özellikleri
- KNN ile Eksik Doldurma
- Yaşın Ölçeklenmesi
- One-Hot & Multi-Hot Özellikler
- Modellemeye Hazır Tablonun Şeması
- Konsol Çıktısı
- EDA Çıktıları
- Üretilen Dosyalar
- Görsel Etiket Standardı
- Çok-Etiketli Alanlarda Eksik Bayrakları
- Multi-Hot “other” Sütunları
- KNN İmputasyonu – Parametreler & Kapsam
- ID Sıralama Varsayımı
- Gereksinimler (önerilen sürümler)
- Kurallar (
rules/) — Yapı ve Örnekler- Kuralların Çalışma Mantığı
- Dosya Bazında Beklenen Şema
- Örnek Kural Dosyaları
- En İyi Uygulamalar ve İpuçları
- Gizlilik / Görselleştirme Güvenliği
- Bilinen Sınırlar
- Parametreleştirme (opsiyonel)
- Sorun Giderme
- Genişletme İpuçları
Pipeline, data/Talent_Academy_Case_DT_2025.xlsx dosyasını okuyarak aşağıdaki çıktıları üretir:
- EDA görselleri →
reports/figures/ - Ara tablo (satırlar) →
data/rows.xlsx - Tedavi düzeyi özet →
data/by_treatment.xlsx - Modellemeye hazır tablo →
data/model_ready.xlsx
Temel ilkeler:
- Eksik değer doldurma KNNImputer ile yapılır.
- Kategorikler KNN için geçici koda çevrilir, imputasyon sonrası etikete geri döner.
Yas, KNN’den sonra ölçeklenir.- Konsol raporu yalın tutulur: yalnızca gerçekten doldurulan kolonlar ve kaç hücrenin doldurulduğu yazılır; nihai NA kontrolü verilir.
project-root/
├─ data/
│ ├─ Talent_Academy_Case_DT_2025.xlsx # Girdi (ham veri)
│ ├─ rows.xlsx # Çıktı 1: Satır düzeyi veri
│ ├─ by_treatment.xlsx # Çıktı 2: Tedavi düzeyi özet
│ └─ model_ready.xlsx # Çıktı 3: Modellemeye hazır tablo
├─ reports/
│ └─ figures/ # EDA görselleri (PNG)
├─ rules/ # Normalizasyon kuralları (Python modülleri)
│ ├─ common.py
│ ├─ tanilar.py
│ ├─ alerji.py
│ ├─ kronik.py
│ ├─ uyg_yer.py
│ ├─ tedavi.py
│ ├─ noise.py
│ └─ site_groups.py
├─ requirements.txt # Bağımlılıklar bu dosyada
└─ pipeline.py # Tüm akışın tek dosyası
-
Bağımlılıklar requirements.txt içindedir. Terminalde:
pip install -r requirements.txt -
Girdi dosyasını
data/Talent_Academy_Case_DT_2025.xlsxkonumuna koyun. -
Komut satırından çalıştırın:
python pipeline.py
Not: Proje Python 3.12.6 ile geliştirilmiştir (uyumlu 3.10+ önerilir).
- Kimlik & Demografi:
HastaNo,Yas,Cinsiyet,KanGrubu,Uyruk,Bolum - Metin alanları (virgülle ayrılmış olabilir):
KronikHastalik,Alerji,Tanilar,UygulamaYerleri,TedaviAdi - Süreler:
TedaviSuresi(örn. “15 Seans”) →TedaviSuresi(Seans)UygulamaSuresi(örn. “20 Dakika”) →UygulamaSuresi(Dakika)
head(),info(), sayısal/kategorikdescribe()konsola yazılır.- Boş değer sayıları: kolon bazında NA adetleri yazdırılır.
- EDA görselleri NA özetinden sonra üretilir.
- “5 Seans” →
TedaviSuresi(Seans)=5(NA destekliInt64) - “20 Dakika” →
UygulamaSuresi(Dakika)=20
threshold=10altındakiobject/stringkolonlar category tipe çevrilir.- Öncesinde
str.strip()+ boş/“nan/none/null/na” → NaN yapılır.
KronikHastalik,Alerji,Tanilar,UygulamaYerleri,TedaviAdiüzerinde:- Büyük/küçük, noktalama, tekrarlar normalize edilir.
rules/*.pyiçindeki regex kanonikleştirme kuralları uygulanır.noise.py’daki gürültü etiketleri düşürülür.
UygulamaYerleri_cleanedtoken’ları,site_groups.py’daki desenlere göre üst gruplara (UygulamaYerleri_grouped) map edilir.
HastaTedaviID:HastaNo::tedavi_slugHastaTedaviSeansID:HastaTedaviID#NNN(seans sıra numarası)
- Çok-değerli sütunlar için
__primary(ilk token) ve__count(tekil token sayısı).
- Matris:
TedaviSuresi(Seans),UygulamaSuresi(Dakika),Yas,Cinsiyet,KanGrubu,Uyruk,Bolum - Kategorikler geçici koda çevrilir → KNNImputer → etikete dönüş.
- Parametre:
n_neighbors=5,weights="distance". KanGrubuöncesi “0 Rh+” → “0Rh+” boşluk temizliği.- KNN sonrası NA kalırsa hata; placeholder kullanılmaz.
- Konsol raporunda yalnız gerçekten doldurulan kolonlar ve doldurulan hücre sayıları yazılır; ayrıca toplam doldurulan hücre ve nihai NA kontrolü verilir.
Yas, KNN’den sonraStandardScalerile ölçeklenir.
- One-Hot:
Cinsiyet,KanGrubu,Uyruk,Bolum→drop_first=True,dummy_na=False- Konsolda baz başına kaç yeni sütun üretildiği yazılır.
- Multi-Hot:
Tanilar_cleaned→DX__(Top 30)KronikHastalik_cleaned→CHR__(Top 20)Alerji_cleaned→ALG__(Top 10)UygulamaYerleri_grouped→SITE__(Tümü)TedaviAdi_cleaned→TX__(Top 15)
- “
__n” sayım kolonları model_ready’ye eklenmez (yalnız 1/0’lar eklenir).
HastaTedaviSeansIDTedaviSuresi(Seans)UygulamaSuresi(Dakika)Yas(ölçeklenmiş)- One-hot kolonları (Cinsiyet_, KanGrubu_, Uyruk_, Bolum_)
- Multi-hot 1/0 kolonları (DX__, CHR__, ALG__, SITE__, TX__)
- Başta
head(),info(),describe()ve kolon bazında NA sayıları. - “EDA görselleri kaydedildi (reports/figures).”
- Rapor:
- “Kategoriğe çevrilen sütunlar: …”
- “Eksik değer doldurma (KNNImputer):
— Doldurulan sayısal kolonlar: …
— Doldurulan kategorik kolonlar: …
— Doldurulan hücre sayıları: {Kolon=Adet,…}
— Toplam doldurulan hücre: N” - “Dönüşümler:
— Yas ölçeklendi: Evet/Hayır
— One-hot (drop_first=True): {Cinsiyet=…, KanGrubu=…, Uyruk=…, Bolum=…}
— Multi-hot: {DX__=30, CHR__=20, ALG__=10, SITE__=tümü, TX__=15}” - “Modellemeye hazır tabloda toplam NA: 0” → “Boş değer kontrolü: PAS”
reports/figures/ klasöründe:
- Yaş: Histogram (ort./medyan çizgili) — Matplotlib
- TedaviSuresi(Seans): Tam sayıya hizalı histogram — Matplotlib
- UygulamaSuresi: Donut (Top6 + “Diğer”) — Matplotlib
- UygulamaYerleri: Yatay bar (token’lanmış, Top30) — Matplotlib
- Uyruk: Yatay bar (Top10 + “Diğer”) — Matplotlib
- Cinsiyet: Yüzde bar (NaN gösterimi yalnız grafikte) — Matplotlib
- KanGrubu: ABO × Rh gruplu bar — Matplotlib
- Korelasyon Isı Haritası (hedef ilk sırada):
TedaviSuresi(Seans),UygulamaSuresi(Dakika),Yas— Seaborn - Scatter + Trend:
Yas↔TedaviSuresi(Seans)— Seaborn
Gizlilik: HastaNo / HastaTedaviID / HastaTedaviSeansID görselleştirilmez.
data/rows.xlsx— Temizlenmiş satır düzeyi veridata/by_treatment.xlsx— Tedavi başına özet metriklerdata/model_ready.xlsx— Eksikleri KNN ile kapanmış, Yas ölçeklenmiş, one-hot + multi-hot genişletilmiş nihai set
- Grafiklerde tüm başlıklar, eksen etiketleri, lejant başlıkları ve kategori yazıları BÜYÜK HARF’e normalize edilir (Türkçe
i/ıdüzeltmeli). - Bu standart
pipeline.pyiçindekiUC()yardımcı fonksiyonuyla otomatik uygulanır.
Aşağıdaki alanlar için ek bayrak sütunları üretilir (hücre tamamen boşsa 1):
DX__missing(Tanilar_cleaned),CHR__missing,ALG__missing,SITE__missing,TX__missing- Çok-etiketli NA’larda imputasyon yapılmaz; eksiklik bu bayraklarla temsil edilir.
DX__,CHR__,ALG__,TX__için Top-N dışındaki etiketler__otherkolonu ile yakalanır.SITE__’ta other yoktur (tüm gruplar üretilir).
- Matris:
TedaviSuresi(Seans),UygulamaSuresi(Dakika),Yas,Cinsiyet,KanGrubu,Uyruk,Bolum - Parametreler:
n_neighbors=5,weights="distance" - Kategorikler KNN için koda çevrilir, oluşan değerler etikete döndürülür.
- KNN sonrası NA kalırsa hata fırlatılır (placeholder yok).
- Not: Sayısal kolonlar modelleme için numerik (float) formatta bırakılır.
SeansIndexsatır sırasına göre atanır. Elinizde tarih/saat varsa, pipeline’ı çalıştırmadan önce veri setini kronolojik sıralamanız önerilir.
-
Bağımlılıklar
requirements.txtdosyasında listelidir. Örnek sürümler:numpy==2.3.2 pandas==2.3.2 matplotlib==3.10.6 seaborn==0.13.2 scikit-learn==1.7.1 openpyxl==3.1.5
pipeline.py,rules/içindeki Python modüllerini dinamik yükler.- İlgili sütun için belirtilen kural listeleri sırasıyla uygulanır.
- Normalizasyon, metni BÜYÜK HARF ve sade karakter kümesine çeker; ardından regex kurallarınız devreye girer. Bu nedenle pattern’ları büyük harf beklentisi ile yazmak güvenlidir.
-
Kanonikleştirme listesi (regex, replacement) çiftleri:
# patterns = [(r"REGEX1", "REPL1"), (r"REGEX2", "REPL2"), ...] -
Gürültü setleri veya gruplama tabloları:
noise.py→tedavi_drop_set,tanilar_drop_set(tam eşleşen token’ları düşürmek için)site_groups.py→{"pattern": "...", "label": "..."}biçiminde liste (üst gruplama)
Tüm regex’leri Python ham string (
r"...") olarak yazın.
rules/common.py
patterns = [
(r"\bSERVIKOTORAS(I|İ)K\b", "SERVİKOTORASİK"),
(r"\bDORSALJ(I|İ)\b", "DORSALJİ"),
]
rules/tanilar.py
patterns = [
(r"\bOMUZUN DARBE SENDROMU\b", "OMUZ DARBE SENDROMU"),
# veri içi varyantlarınızı ekleyin
]
rules/alerji.py
patterns = [
(r"\bTOZ ALERJI(S|Ş)I\b", "TOZ ALERJİSİ"),
(r"\bPOLEN ALERJ(I|İ)S(I|İ)\b", "POLEN ALERJİSİ"),
]
rules/kronik.py
patterns = [
(r"\bHTN\b", "HİPERTANSİYON"),
(r"\bDM\b", "DİYABET MELLİTUS"),
(r"\bKBY\b", "KRONİK BÖBREK YETMEZLİĞİ"),
]
rules/uyg_yer.py
patterns = [
(r"\bAYAK\s*B(I|İ)LE(G|Ğ)I\b", "AYAK BİLEĞİ"),
(r"\bSKAPULA(R)?\b", "SKAPULA"),
(r"\bTRAPEZ(\s*KAS(I|İ))?\b", "TRAPEZ"),
]
rules/tedavi.py
patterns = [
(r"\bTENS\b", "TENS"),
(r"\bULTRASON(OGRAF(I|İ))?\b", "ULTRASON"),
(r"\bESWT\b", "ESWT"),
]
rules/noise.py
tedavi_drop_set = {"TEDAVİ", "UYGULAMA", "SEANS", "GENEL", "DİĞER"}
tanilar_drop_set = {"DİĞER", "KONTROL", "BİLGİ", "HATA"}
rules/site_groups.py
groups = [
{"pattern": r"\bBOYUN\b", "label": "BOYUN"},
{"pattern": r"\bBEL|LOMBER\b", "label": "BEL/LOMBER"},
{"pattern": r"\bOMUZ\b", "label": "OMUZ"},
{"pattern": r"\bS(K|C)APULA\b", "label": "SKAPULA"},
{"pattern": r"\bAYAK\s*B(I|İ)LE(G|Ğ)I\b", "label": "AYAK BİLEĞİ"},
]
- BÜYÜK HARF yazın (normalize zaten büyük harfe çeviriyor).
- Pattern’lar kelime tabanlı olsun:
\b...\b. - Önce genel (
common.py), sonra alan-özgü kurallar (örn.tanilar.py). noise.pyset’lerine gerçekten anlamsız/gürültü token’ları koyun; aşırı genişletmeyin.site_groups.pysıra duyarlıdır; en spesifik pattern’lar önce gelsin.
- Kişisel kimlik unsurları (
HastaNo,HastaTedaviID,HastaTedaviSeansID) grafiklerde kullanılmaz. - EDA çıktıları yalnızca toplulaştırılmış/anonimleştirilmiş görseller üretir.
- KNN yalnızca baz kategorik + sayısal matriste çalışır; çok-etiketli metin alanlarında imputasyon yapılmaz.
SeansIndexveri sırasına bağlıdır; zaman damgası yoksa gerçek klinik sıra ile birebir örtüşmeyebilir.- Aşırı seyrek kategoriler OHE sonrası yüksek boyut oluşturabilir (özellikle
SITE__).
- Multi-hot eşikleri:
DX=30,CHR=20,ALG=10,TX=15;SITE=tümü. - KNN:
n_neighbors=5,weights="distance". - Görsel tema: seaborn
whitegrid, etiketler tamamı BÜYÜK (UC()ile). - OHE:
drop_first=True,dummy_na=False.
- Girdi dosyası yok →
data/Talent_Academy_Case_DT_2025.xlsxyolunu kontrol edin. - Kurallar eksik/hatalı →
rules/altındaki modül adları vepatterns/*_set/groupsisimleri doğru olmalı. - Excel’e yazma hatası → Bağımlılıkları
requirements.txtile kurduğunuzdan emin olun. - KNN sonrası NA kaldı → KNN matrisi kolonlarını ve veri kapsamını kontrol edin (tamamen boş bir kategorik varsa NA kalabilir).
- Multi-hot Top-N eşikleri iş ihtiyacına göre ayarlanabilir.
rules/kütüphanesi yaşayan bir sözlük gibi genişletilebilir.model_readyşemasını sabitlemek için whitelist ile kolon sırası kilitlenebilir.- Büyük veri için KNN maliyetini azaltmak adına matrise dahil edilen kolon sayısı optimize edilebilir.