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
Siteyi yeni keşfettim çok kaliteli bilgiler var, tek kelimeyle harika …