Sürpriz Durak: Modelin Vitrini

Merhaba Dostlar!

Yolculuğumuzun ana duraklarını tamamladık ama size bir sürprizimiz var! Bölüm 3’te inşa ettiğimiz o harika “motor” (pipeline.R), arka planda tıkır tıkır çalışıyor. Peki ya bu motorun gücünü, teknik olmayan bir pazarlama yöneticisinin veya bir satış temsilcisinin parmaklarının ucuna getirmek isteseydik?

İşte bu bölümde, modelimizi bir komut satırı aracından çıkarıp, herkesin bir web tarayıcısı üzerinden etkileşime girebileceği, yaşayan bir interaktif uygulamaya dönüştüreceğiz. Bu sihrin adı: R Shiny!

Shiny Nedir? Bir Arabanın Anatomisi

Shiny’yi anlamanın en kolay yolu, onu bir arabaya benzetmektir:

Haydi, bu iki parçayı birleştirerek kendi veri bilimi arabamızı inşa edelim!

1. Adım: Hazırlık - Atölyeyi Kurmak

Öncelikle, Shiny’yi kullanmak için gerekli paketi yüklememiz gerekiyor. Bu komutu R konsolunda bir kez çalıştırmanız yeterli:

install.packages("shiny")

Dostlar lütfen dikkat:

Şimdi, projenizin ana dizininde app.R adında tek bir yeni R script dosyası oluşturun. Tüm Shiny kodumuz bu dosyanın içinde yaşayacak.

2. Adım: “Vitrini” Tasarlamak - Kullanıcı Arayüzü (UI)

app.R dosyamızın ilk bölümü, uygulamamızın nasıl görüneceğini tanımlayan ui kısmıdır. Bu, bizim dijital vitrinimiz olacak.

Amacımız basit ve işlevsel bir tasarım yapmak:

Haydi bu vitrini, Shiny’nin fonksiyonlarını kullanarak inşa edelim. Aşağıdaki kod, app.R dosyanızın ilk parçasını oluşturacak:

library(shiny)

# Kullanıcı Arayüzünü Tanımla (UI)
ui <- fluidPage(
  # Uygulama Başlığı
  titlePanel("Müşteri Kaybı Tahmin Motoru"),
  
  # Arayüzü yan menü ve ana panel olarak ikiye ayır
  sidebarLayout(
    # Yan Menü (Kontrollerin olduğu yer)
    sidebarPanel(
      h4("1. Yeni Veri Dosyalarını Yükleyin"),
      # Yeni şikayet ve müşteri dosyalarını yüklemek için bir düğme
      fileInput("yeni_veriler", "Şikayet ve Müşteri CSV Dosyalarını Seçin:",
                multiple = TRUE, # Birden fazla dosya yüklemeye izin ver
                accept = c(".csv")),
      
      h4("2. Tahminleri Başlatın"),
      # Tahmin işlemini tetikleyecek aksiyon düğmesi
      actionButton("tahmin_et_butonu", "Tahminleri Oluştur!", icon = icon("rocket")),
      
      br(),br(),
      p("Not: Lütfen 'yeni_sikayetler.csv' ve 'yeni_musteri_bilgileri.csv' dosyalarını yükleyin.")
    ),
    
    # Ana Panel (Sonuçların gösterileceği yer)
    mainPanel(
      h3("Tahmin Sonuçları"),
      # Sonuç tablosunun gösterileceği alan
      dataTableOutput("sonuc_tablosu")
    )
  )
)

Gördüğünüz gibi, UI kısmında HTML/CSS bilmemize gerek kalmadı. Shiny, titlePanel, fileInput, actionButton gibi basit R fonksiyonlarıyla tüm görsel arayüzü bizim için, sihirli bir şekilde oluşturuyor.

3. Adım: “Motoru” Bağlamak - Sunucu (Server) Mantığı

Şimdi geldik en heyecanlı kısma. Bölüm 3’te yazdığımız o harika fonksiyonları ve kaydettiğimiz modeli, bu arayüze nasıl bağlayacağız? app.R dosyasının ikinci bölümü olan server kısmı tam olarak bu işi yapar.

Dostlara Bir Not:

En iyi pratik, model ve fonksiyonlar gibi ağır dosyaları, uygulama her çalıştığında değil, sadece bir kez, uygulama başlarken yüklemektir. Bu, uygulamanızın çok daha hızlı çalışmasını sağlar. Aşağıdaki kodda bunu nasıl yaptığımıza dikkat edin.

# app.R dosyasının devamı...

# --- BÖLÜM 3'TEKİ HAZİNELERİMİZİ YÜKLÜYORUZ (Sadece bir kez, en başta) ---
source("fonksiyonlar.R")
model <- readRDS("churn_model.rds")
kutuphaneleri_yukle()
# --------------------------------------------------------------------------

server <- function(input, output) {
  
  observeEvent(input$tahmin_et_butonu, {
    
    req(input$yeni_veriler)
    # Kullanıcının 2 dosya yüklediğinden emin olalım
    req(nrow(input$yeni_veriler) == 2)
    
    # Yüklenen dosya bilgilerini al
    yuklenen_dosyalar <- input$yeni_veriler
    
    # Hangi dosyanın hangisi olduğunu isimlerinden bulmaya çalışalım
    sikayet_dosya_index <- which(grepl("sikayet", yuklenen_dosyalar$name))
    musteri_dosya_index <- which(grepl("musteri", yuklenen_dosyalar$name))
    
    # Dosyaları doğru yollardan OKU
    sikayet_df <- read.csv(yuklenen_dosyalar$datapath[sikayet_dosya_index])
    musteri_df <- read.csv(yuklenen_dosyalar$datapath[musteri_dosya_index])
    
    # --- İŞTE SİHİR BURADA: YENİ FONKSİYONUMUZU DOĞRU ARGÜMANLARLA ÇAĞIRIYORUZ! ---
    
    # 1. Veriyi Hazırla (Artık data frame'leri gönderiyoruz)
    hazir_veri <- veri_hazirla(sikayetler_df = sikayet_df,
                               musteri_bilgileri_df = musteri_df)
    
    # 2. Tahminleri Yap
    tahmin_sonuclari <- tahmin_yap(model = model, hazir_veri = hazir_veri)
 
    # -------------------------------------------------------------------------
    
    # Sonuçları ara yüzdeki tabloya gönder
    output$sonuc_tablosu <- renderDataTable({
      tahmin_sonuclari
    })
  })
}

İşte bu, Bölüm 3’te yaptığımız o harika mühendislik çalışmasının meyvesi! Tüm karmaşık mantık, zaten fonksiyonlar.R dosyamızın içinde olduğu için, server kısmındaki kodumuz inanılmaz derecede temiz ve kısa oldu.

4. Adım: Kontağı Çevirmek - Uygulamayı Başlatmak

Artık hem “vitrinimiz” (UI) hem de “motorumuz” (Server) hazır. app.R dosyasının en sonuna, bu iki parçayı birleştiren ve uygulamayı başlatan sihirli komutu ekliyoruz.

# app.R dosyasının sonu
# UI ve Server'ı birleştirip Shiny uygulamasını çalıştır
shinyApp(ui = ui, server = server)

Dostlara Bir Not: Bir Veri Bilimcinin En İyi Dostu - Hata Ayıklama!

Dostlar, hata almamak adına daha önce oluşturduğumuz fonkiyonlar.R dosyasını güncellememiz gerekir.

Şimdi, fonksiyonlar.R dosyamızdaki veri_hazirla() fonksiyonumuzu daha esnek ve daha akıllı hale getireceğiz. Artık dosya yollarıyla değil, kendisine verilecek iki ayrı veri tablosuyla çalışacak şekilde onu güncelleyeceğiz.

Bu düzeltme, kodumuzu sadece Shiny için değil, gelecekteki farklı kullanım senaryoları için de çok daha sağlam hale getiriyor. İşte fonksiyonlar.R dosyasının yeni ve geliştirilmiş hali:

> # fonksiyonlar.R dosyasını bu şekilde güncelleyin:
> 
> # ... (kutuphaneleri_yukle fonksiyonu aynı kalacak) ...
> 
> # GÜNCELLENMİŞ veri_hazirla fonksiyonu:
> veri_hazirla <- function(sikayetler_df, musteri_bilgileri_df) {
>   
>   # Argüman olarak gelen iki data frame'i birleştir
>   birlesik_veri <- left_join(sikayetler_df, musteri_bilgileri_df, by = "musteri_id")
>   
>   # Geri kalanı aynı...
>   musteri_ozet <- birlesik_veri %>%
>     group_by(musteri_id, uyelik_suresi_ay, aylik_harcama) %>%
>     summarise(toplam_sikayet_sayisi = n(), .groups = 'drop')
>     
>   return(musteri_ozet)
> }
> 
> # ... (tahmin_yap fonksiyonu aynı kalacak) ...

Bu küçük ama önemli güncelleme sayesinde, şimdi app.R dosyamızdaki server kısmını, bu yeni ve akıllı fonksiyona uygun şekilde yazmaya hazırız. Unutmayın, en iyi dersler bazen en beklenmedik hatalardan çıkar!

5. Adım: Uygulamayı Çalıştırmak

app.R dosyanızın tamamı artık hazır. RStudio’da bu dosyayı açtığınızda, sağ üst köşede “Run App” adında bir düğme göreceksiniz. Bu düğmeye bastığınızda, modeliniz canlanacak ve web tarayıcınızda interaktif uygulamanız açılacaktır!

Artık bir pazarlama yöneticisi, hiçbir R kodu bilmeden, kendi bilgisayarından yeni müşteri listelerini yükleyip, “Tahmin Et!” düğmesine basarak anında risk altındaki müşterileri görebilir.

Haydi Deneyelim.

Karşımıza uygulama geldi

yeni_sikayetler.csv ve yeni_musteri_bilgileri.csv’yi aynı anda seçip yükleyelim.

tahmim et butonunu tıklayalım.

Ve sonuçlar karşımızda

İşte bu, veri biliminin yarattığı değeri herkes için erişilebilir kılmaktır!

Bonus Duraktan Notlar ve Final Perdesi

Bu bonus bölümde, Bölüm 3’te inşa ettiğimiz komut satırı motorunu alıp, onu yaşayan, interaktif ve iş değeri yaratan bir web uygulaması prototipine dönüştürdük. Bir veri bilimcinin alet çantasındaki en güçlü ve en etkileyici yeteneklerden birinin, yani Shiny’nin gücüne tanıklık ettik.

Dostlara Bir Not: Bu Bir Simülasyon, Gerçek Bir “Deployment” Değil!

Dostlar, burada çok önemli bir ayrımın altını çizmek isterim. Yaptığımız bu harika Shiny uygulaması, bir modelin canlı bir ortama nasıl alınabileceğinin küçük ölçekli bir provasıdır. Kendi bilgisayarımızda harika çalışıyor ve konsepti mükemmel bir şekilde kanıtlıyor.

Ancak, bu uygulamayı yüzlerce kişinin aynı anda kullanacağı, gerçek bir sunucuya koyma süreci, MLOps (Makine Öğrenmesi Operasyonları) ve Yazılım Mühendisliği alanlarına giren, kendi içinde çok derin ve komplike bir konudur. Gerçek bir “deployment” (canlıya alma) sürecinde, şu gibi onlarca ek soruyla karşılaşırız:

Elbette bir veri bilimcinin MLOps uzmanı olması beklenmez. Ancak bu süreçlerin varlığından haberdar olması, bir modelin sadece bir analizden ibaret olmadığını anlaması, projenin başından itibaren mühendislik ekipleriyle daha sağlıklı bir iletişim kurmasını sağlar.

Kısacası, biz bu bölümde arabamızın harika bir prototipini inşa ettik. Onu otoyola çıkarmak ve binlerce kilometre yol yapmasını sağlamak ise, bambaşka bir mühendislik disiplininin uzmanlık alanıdır.

Sırada son bir bonus durağımız daha var: “Modelim Yaşıyor mu? - Üretimde Model İzleme”. O bölümde, bu harika modelimizin zamanla eskiyip eskimediğini nasıl kontrol edeceğimizi ve onu nasıl güncel tutacağımızı öğreneceğiz.

Veriyle kalın. Lütfen takipte kalın…