Google Bigquery ML ve Website İşlem Tahmini

Merhaba VBO okuyucuları!

Bir önceki yazıda Google Analytics datasının ne gibi özelliklere sahip olduğundan bahsetmiştik ve bazı sorgular ile verilerimizi inceleyip analiz etmiştik. Bu yazıda ise, Google Bigquery ML üzerinden bir zaman serisi çalışması ile website işlem tahminlemesi (forecasting) yaparak ilerleyeceğiz.

İlk olarak zaman serilerinden bahsedelim.

Bir zaman serisi, zaman içinde birbirini izleyen noktalarda veya ardışık dönemlerde yapılan gözlemler dizisidir. Ölçümler her saat, gün, hafta, ay, yıl veya başka herhangi bir düzenli aralıkta olabilir. Zaman serisi grafiği ise, zamanın tahmin etmemiz gereken değişkenle ilişkisinin grafiksel bir temsilidir. Bu grafikler yatay bir desene, trendi gösteren bir desene ya da sezonsallığı gösteren bir desene sahip olabilir. [1]

Bununla birlikte zaman serilerindeki desenleri anlamamıza yarayan bazı tahmin metodlarından bahsedebiliriz: Naïve modeller, Basit Ortalama Yöntemi, Hareketli Ortalamalar Yöntemi,  Üssel Düzgünleştirme (Exponential Smoothing) metodlar, ARIMA metodu kullanılan klasik metodlardır. Aynı zamanda, doğrusal regresyon, MLP(Multi-Layer Perceptron), RNN (Recurrent Neural Network), LSTM(Long Short-Term Memory) gibi makine öğrenmesi metodları da kullanılmaktadır. Bu yazıda ARIMA metodunu kullanacağımız için biraz daha açarsak, açılımı AutoRegressive Integrated Moving Average olarak belirtilir ve bir değişkene bağlı olarak geçmiş değerler üzerinden gelecekteki zaman değerlerini tahminlememizi sağlar. AR (AutoRegressive) ve MA (Moving Average) modellerinden oluşur. AR kısmı bağımlı değişkenin önceki değerlerinin kullanılarak regresyon yapılması sürecini kapsar. AR(p) olarak ifade edildiğinde p değeri kaç kere geri gidileceğini bize belirtir. MA kısmı ise, önceki tahminlerdeki hataların tahminlemeyi belirleyecek değişkenler olması sürecidir. MA(q) olarak belirtildiğinde q değeri bize kaç adet geçmiş tahmin hatasınıın kullanılacağını belirtir. AR(p,d,q) olarak gösterildiğinde, d değeri ise veriyi trend ya da mevsimsellik gösteren bir serinin önceki trendlerden farklarının alınarak durağanlaştırılmasını ifade eder. [2]

Biz bu yazıda Google Bigquery ML modülü üzerinde ARIMA modelini kullanacağız. Bigquery ML modülü, bize neredeyse SQL komutları ile model yazabilmemize olanak sağlıyor. İçerisinde kümeleme, tahminleme, öneri algoritmaları gibi bir çok algoritma bulunduran Google Bigquery ML, modeli oluşturup tahminleme sonuçlarını da aldıktan sonra modeli ölçümlemeyi de sağlıyor. Ayrıca Datastudio özelliği ile de verileri kolayca görselleştirebiliyoruz. [3]

Yazıda kullanacağımız veriseti ise Google Analytics verisi olacak. Web ve uygulamalar üzerinde çalışıyorsanız, tahminleme işlerine sıkça ihtiyaç duyulduğunu görebilirsiniz. Gelecek dönemde ne kadar kullanıcının siteye & uygulamaya geleceği, ne kadar ziyaret yaratacakları, ne kadar işlem yapacakları, ne kadar harcama yapılabileceği gibi bilgiler uygulanacak stratejileri belirlemede önemli rol oynar. Daha önce yapılmış bazı çalışmalarda zaman bazında kullanıcı sayısının tahmin edilmesi, ziyaret sayısının tahmin edilmesi gibi örneklerle karşılaştım, bunları da incelemenizi öneririm[3][4]. Biz de bu yazıda biraz farklılaşarak, mevcut veriler üzerinden günlük bazda ne kadar işlem yapıldığı ve gelecek dönemlerde tahmini olarak ne kadar işlem yapılabileceğini tahminleyeceğiz. Bu bilgiler bize sitenin kaldırabileceği yükün ne kadar olması gerektiği, ödeme sistemlerinin buna hazır olup olmayacağı, verilen bütçe hedeflerinin tutup tutmayacağı konusunda fikir verebilir.

Öncelikle bigquery-public-data içerisinde Create Dataset kısmında bir dataset oluşturarak başlıyoruz. Google Analytics verisinde zamana bağlı ziyaret sayılarını tahminleyeceğimiz için öncelikle tarih bazında ziyaret sayısını toplayarak grupluyoruz. Çıkan sonuçlara bir göz atabiliriz.

SELECT
 PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
 SUM(totals.transactions) AS total_transactions
FROM
 `bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date
Order by 1 asc

Verimizi incelediğimizde, 2016 yılının Ağustos ayından beri verilerin gelmekte olduğunu görüyoruz. 1 Ağustos’ta 34 işlem gerçekleşmiş ve 3 Ağustos’ta herhangi bir işlem gerçekleşmemiş. Gerçek bir veri seti ile çalışıyor olsaydık bunun sebeplerini araştırmak gerekebilirdi, veriler akmamış olabilir ya da o gün site çalışmıyor olabilir.

Şimdi tahmin modelini kurgulayabiliriz. Modeli CREATE OR REPLACE MODEL ile tanımlıyoruz, sonrasında gerekli konfigürasyonları gerçekleştiriyoruz. OPTIONS kısmında model tipinin ARIMA olduğunu, zaman kolonunun ‘parsed_date’ ile, tahmin edilecek verinin ‘total_transactions’ olduğunu belirtiyoruz. Auto-ARIMA’yı seçerek ARIMA modelinin hiperparametrelerinin otomatik olarak düzenlenmesini ve en düşük AIC’ye sahip en iyi sonuç veren modeli seçmesini istiyoruz. Auto-Frequency ile de train seti otomatik olarak zaman serisinin frekansını belirliyor.

 

#standardSQL
CREATE OR REPLACE MODEL bqml_tutorial.ga_arima_model
OPTIONS
 (model_type = 'ARIMA',
  time_series_timestamp_col = 'parsed_date',
  time_series_data_col = 'total_transactions',
  auto_arima = TRUE,
  data_frequency = 'AUTO_FREQUENCY'
) AS
SELECT
 PARSE_TIMESTAMP("%Y%m%d", date) AS parsed_date,
 SUM(totals.transactions) AS total_transactions
FROM
 `bigquery-public-data.google_analytics_sample.ga_sessions_*`
GROUP BY date

Modeli oluşturduk, şimdi modelin tutarlılığını değerlendirmek istiyoruz. Az önce esas model oluşturulurken bir çok modelin hipermetreleri otomatik olarak düzenlenirken hangi metriklerle değerlendirildiği bilgisi için ML.EVALUATE’I kullanıyoruz.

 

SELECT
 *
FROM
 ML.EVALUATE(MODEL bqml_tutorial.ga_arima_model)

Çıkan sonuçları inceleyelim.

ARIMA modellerinin (p,d,q) değerleriyle ifade edildiğini biliyoruz. Eğer d değeri 1’se, 42 model, 1 değilse 21 model eğitilir, burada sonuçlarda çıkan 42 modelin her biri aday ARIMA modelidir. AIC değeri küçüken büyüğe sıralanıp ilk model tahminlemede kullanılacak esas model olarak belirlenir.

Modeli belirledikten sonra model katsayılarını gözlemliyoruz.

#standardSQL
SELECT
  *
FROM
  ML.ARIMA_COEFFICIENTS(MODEL bqml_tutorial.ga_arima_model)

ar_coefficients AR kısmının, ma_coefficients MA kısmının katsayılarını belirtiyor, intercept_or_drift kısmı sabit değeri belirtiyor.

Tahmin kısmına geldiğimizde iki değeri belirlememiz gerekiyor, kaç gelecek dönemin tahmin edileceği ve güven aralığının değeri. Burada 30 gelecek zaman değeri ve %80 güven aralığı olarak belirliyoruz.

#standardSQL
SELECT
  *
FROM
  ML.FORECAST(MODEL bqml_tutorial.ga_arima_model,
              STRUCT(30 AS horizon, 0.8 AS confidence_level))

Burada zaman sıralamasına göre tahmin sonuçlarını görebiliyoruz. Standart hata ve ona bağlı tahmin alt-üst değerleri, ve bu değerlerin ortası olan forecast_value kısmı bize tahmin sonucunu vermektedir.

Aslında bu değerleri alarak zamana bağlı tahminleme çalışmasını yapmış oluyoruz. Ancak, iyi bir görselleştirme ile  bu sonuçları daha iyi gözlemleyebiliriz. Önceki mevcut bulunan değerlerimize tahminlemesi yapılan diğer günleri ekleyip bir grafik çizdirelim.

#standardSQL
SELECT
 history_timestamp AS timestamp,
 history_value,
 NULL AS forecast_value,
 NULL AS prediction_interval_lower_bound,
 NULL AS prediction_interval_upper_bound
FROM
 (
   SELECT
     PARSE_TIMESTAMP("%Y%m%d", date) AS history_timestamp,
     SUM(totals.transactions) AS history_value
   FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`
   GROUP BY date
   ORDER BY date ASC
 )
UNION ALL
SELECT
 forecast_timestamp AS timestamp,
 NULL AS history_value,
 forecast_value,
 prediction_interval_lower_bound,
 prediction_interval_upper_bound
FROM
 ML.FORECAST(MODEL bqml_tutorial.ga_arima_model,
             STRUCT(30 AS horizon, 0.8 AS confidence_level))

Burada geçmiş veriler üzerinde tahmin değerlerinin boş geldiğini görüyoruz, tahmin kısımlarında bu değerler dolu olarak gelmekte.

‘Explore Data’ kısmında Data Studio’yu seçiyoruz, ‘Time Series’ grafiğini de seçtikten sonra Metric kısmına history_value, forecast_value, prediction_interval_lower_bound, and prediction_interval_upper_bound değerlerini eklediğimizde grafiğimizi oluşturmuş oluyoruz.

Burada 2 Ağustos -31 Ağustos arası tahmin değerlerini gözlemleyebiliyoruz. Önceki değerleri de gözlemleyebildiğimiz için çıkan veriler anlam kazanıyor. Örneğin en son 1 Ağustos’ta 45 işlem yapılmış, 2 Ağustos için işlem günlük tahmin değeri 54,43, alt limit 44,11, üst limit 64,76 olarak belirlenmiş. Diğer değerler için de incelemek mümkün.

Bu uygulamada bir websitesi & uygulama için transaction denilen işlem sayısını BigqueryML üzerinden tahminledik, ve görselleştirdik. Umarım faydalı bir yazı olmuştur, yorumlarınız için şimdiden teşekkürler!

Kaynakça:

[1] https://medium.com/analytics-vidhya/what-is-a-time-series-fab8ebc4451b

[2] https://harun-demir.com/2019/04/27/r-uzerinde-zaman-serisi-analizi-bolum-3-arima-modelleme/

[3] https://cloud.google.com/bigquery-ml/docs/arima-single-time-series-forecasting-tutorial

[4] https://analyticslog.com/blog/big-query-machine-learning-time-series-forecasting-with-google-analytics-app-plus-web-data

Sena Merter Dereli – Linkedin

 

Yazar Hakkında
Toplam 9 yazı
Sena Merter Dereli
Sena Merter Dereli
Pazarlama & Müşteri Analitiği Araştırmacısı / n11.com'da Pazarlama Analitiği Yöneticisi
Yorumlar (Yorum yapılmamış)

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara