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’yi anlamanın en kolay yolu, onu bir arabaya benzetmektir:
Kullanıcı Arayüzü (UI - User Interface): Bu, arabanın “içidir”. Direksiyon, gaz pedalı, gösterge paneli… Kullanıcının gördüğü ve etkileşime girdiği her şey buradadır.
Sunucu (Server): Bu, arabanın “motorudur”. Siz gaza bastığınızda (UI’da bir düğmeye tıkladığınızda), motorun (Server) arka planda çalışıp tekerlekleri döndürmesi gibi, bizim R kodlarımız da burada çalışır ve sonuçları gösterge paneline (UI) gönderir.
Haydi, bu iki parçayı birleştirerek kendi veri bilimi arabamızı inşa edelim!
Ö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.
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:
Kullanıcının yeni şikayet ve müşteri dosyalarını yükleyebileceği bir alan.
Tahmin işlemini başlatacak bir düğme.
Sonuçların gösterileceği temiz bir tablo.
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.
Ş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.
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)
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!
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!
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…