DATA ANALİZİ

Google Analytics’de Ölçümlenen Google Ads Kampanyaları Verilerinin Maliyete Göre Kar ve Ciro Değerleri ile R’da Regresyonla Maksimize Edilmesi Analizi

UTKU DEMİRHAN

25 Eki, 2019

  • Anasayfa
  • Blog
  • Ölçümleme
  • Data Analizi
  • Google Analytics’de Ölçümlenen Google Ads Kampanyaları Verilerinin Maliyete Göre Kar ve Ciro Değerleri ile R’da Regresyonla Maksimize Edilmesi Analizi

Google Analytics verileri farklı pazarlama kanallarının performanslarının birbirlerine karşılaştırmalı olarak ölçümlenebilmesi açısından yaygın şekilde kullanılmakta. Google Ads, Yandex Direct, Criteo, Facebook / Instagram gibi kanalların kendi platformaları içerisinde verdikleri değerlerden ziyade Google Analytics’teki performanslarının birbirleriyle karşılaştırılması pazarlama bütçelerinin dağılımlarına karar verirken yaygın şekilde tercih ediliyor.

Bahsi geçen pazarlama kanallarının kendi arayüzlerinde verdikleri değerler üzerinden karşılaştırmanın daha az tercih ediliyor olmasının ise 2 nedeni bulunuyor.

  • Farklı ilişkilendirme modelleri (attribution models)

    İlişkilendirme modelleri bir kullanıcının satın alma sürecine kadar etkileşimde bulunduğu farklı kanallara göre gerçekleştirdiği işlemin hangi kanalda bir işlem olarak sayılacağı ile ilgili modeldir diyebiliriz. Kanallardan birisi kullanıcıların reklama tıklaması ile satın alma süreçlerini ilişkilendirirken, bir diğeri ise bu ilişkiyi reklamların görüntülenmesi üzerinden kurabilmektedir. Bu gibi durumlarda bu kanalların performansını karşılaştırırken de elma ile armutu karşılaştırma gibi bir durumun varlığından bahsetmek mümkün. Google Analytics’te ise tüm bu kanallarda ilişkilendirme modelleri aynı kurallara sahiptir. Bu nedenle farklı pazarlama kanallarının Google Analytics üzerinden karşılaştırılma tercihi yaygın veya kanal sayısı arttıkça daha çok tercih edilir hale geliyor diyebiliriz.

  •  Kullanıcıların satın alma sürecinde birden fazla kanalla etkileşiyor oluşu

    Eğer birden fazla dijital pazarlama kanalı kullanıyorsanız ve kullanıcılar bu kanallardan birkaçı ile etkileşimde ise bu gibi durumlarda her iki kanaldaki ilişkilendirme modelinin dönüşüm penceresi içerisinde (genelde 30 gün) gerçekleşen işlemler her iki kanalın da satın alma işlemlerine dahil olabiliyor.Örneğin; Bir siteye ilk defa Google Ads’in arama ağı reklamlarından gelen bir kullanıcı daha sonra Criteo’nun dinamik pazarlama reklamlarına tıklayarak o ürünü satın alıyorsa bu gibi durumlarda tek bir satın alma her iki kanala da bir satın alma olarak yansıyor. Google Analytics’te ölçülen verilerde ise böyle bir durum söz konusu olmadığı için standart ilişkilendirme modelinde son (direk olmayan) etkileşimin gerçekleştiği kanala gidiyor dönüşüm.Yukarıda bahsettiğim durum Google Ads’in farklı kampanya türleri için de geçerli diyebiliriz. Data-driven modelinin sadece search ve shopping kampanyaları için geçerli olması, Google ads’de yapılan dinamik yeniden pazarlama veya diğer tür GDN ve Youtube kampanyalarının bu model içerisine dahil edilmiyor oluşu. Google Ads kampanyalarının da performanslarını Analytics’ten ölçümleme ve kampanyalardaki optimizasyonların Analytics verisine göre yapılması ihtiyacını doğurabiliyor.Ek olarak Google Ads verilerinin Google Analytics’ten takibinin daha dinamik bir hesap yönetimi sağladığını da söyleyebilirim. Ads’e dönüşüm verileri ve search term’ler Analytics’e kıyasla daha geç güncellenebiliyor. Daha dinamik bir hesap yönetimi için Analytics’in daha hızlı veri sağlaması özelliğini kullanmayı tercih ediyorum diyebilirim.

Veri Toplama Aşaması

Google Analytics verilerini R’a Mark Edmondson tarafından hazırlanmış googleAnalyticsR paketi aracılığıyla kolaylıkla indirebiliyoruz.
R Studio’yu bilgisayarınıza kurduktan sonra install.packages(“googleAnalyticsR”) komutu ile paketi indirebiliyorsunuz.

library(googleAnalyticsR) ise bu komutla ise kütüphaneyi çağırıyor ve paketi kullanmaya başlayabiliyorsunuz.

Son olarak hangi Google Analytics hesabına erişim sağlayacağınızı söylemek için bir otorizasyon yapmanız gerekiyor.

ga_auth() kodunu çalıştırdığınızda tarayıcınızda Google Analytics’e erişeceğiniz mail adresiyle giriş yapmanız gerekmekte. Daha sonra paket Analytics verilerine erişim alıyor ve verileri indirebilir hale geliyorsunuz.

google_analytics_4(viewId = "92759348",
                                 date_range = c("2019-09-23","2019-09-23"),
                                 metrics = c("adCost","transactions","transactionRevenue"),
                                 dimensions = c("date"),
                                 anti_sample = TRUE
                                )

Yukarıdaki kod paketin Google Analytics verisini API üzerinden alabilmesi için gerekli temel kod kullanımına örnek olarak gösterilebilir.

Burada viewId Analytics’te hesabınızın View ID’si. Ardından date_range parametresi içerisinde hangi günler için veri istediğinizi belirtiyorsunuz. Metriklerin ve Dimension’ların API üzerinden kullanımı için Google Analytics API’ın dimension & metric explorer sayfasını kullanabilirsiniz.

Son olaran anti_sample ise True olarak seçildi. Google Analytics’te verinizin hacmine göre belirli sampling’ler uygulanabiliyor. Yani verinin tümüne arayüzde erişemeyebiliyorsunuz belirli bir oranlık veri üzerinden verinin tümüne yönelik oranlama yapılıyor diyebiliriz. Anti_sample true seçeneğiyle ise bu sampling’den kurtulmak ve tüm veriyi indirmek mümkün.

Bu kodu çalıştırdığımızda karşımıza gelen veri ise aşağıdaki gibi:

* Yukarıdaki veriler rastgele bir sayıyla çarpılarak verilmiştir.

Yukarıdaki R kodunu kullanırken ek olarak filtreleme kullanmak da mümkün.

df <- dim_filter("sourceMedium","EXACT","google / cpc",not = FALSE)
df2 <- dim_filter("campaign","REGEXP","dynam|brand",not = TRUE)
fc <- filter_clause_ga4(list(df,df2), operator = "AND" )
cpc_nonapp <- google_analytics_4(viewId = "92759348",
                                 date_range = c("2019-09-23","2019-09-23"),
                                 metrics = c("adCost","transactions","transactionRevenue"),
                                 dimensions = c("date"),
                                 dim_filters = fc,
                                 anti_sample = TRUE
                                )

Yukarıdaki kodda dim_filter komutlarını kullanarak öncelikle verimizi source ve medium google / cpc olmak üzere, ikinci olaraksa kampanya isimlerimizde ise dynamic remarketing ve brand kampanyası olmayacak şekilde filtreleyebiliyoruz. Filtrelemenin yanı sıra, segmentleri de burada kullanabiliyoruz. Aynı Google Analytics’te custom raporlar oluştururken sahip olduğumuz seçeneklerin tümüne burada da sahibiz diyebiliriz.

Ben ideal bütçe hesabı yapmak istediğimiz kampanyalar için filtreleme işlemini gerçekleştirdikten ve veriyi elde ettikten sonra regresyon ile bütçe hesaplama kısmına artık geçebilirim.

Google Ads Kampanyalarının Bütçe-Kar Analizi

Google Ads’de çok sayıda kampanyanız olduğunda bu kampanyalardan hangisinin en iyi performans gösterdiğini ve bütçeyi düzenlerken hangi kampanyaya daha çok bütçe ayırmamız gerektiğini belirlemek için regresyon analizinden faydalanabiliriz.

Burada bütçeye karşılık hedef metriklerin grafiklerini çizmemiz ve bir korelasyon olup olmadığını incelememiz faydalı olacaktır.
Haftalık olarak verileri alabilmek için gerekli olan metriği Dimension & Metric Explorer’dan buluyorum. isoYearIsoWeek metriği bunun için uygun.

Metrikler arasında ise Google Analytics’e gönderilen bir custom metric olan kar değeri metriğini kullanıyorum. Bu değer bir ürünün satışından elde edilen karları içerisinde bulunduran değeri tutuyor.

Verimin anlamlı olabileceği bir zaman aralığı seçiyor(yaklaşık 5 aylık veri aldım) ve kampanyalar içerisinde ise brand haricindeki search kampanyalarını dahil ettim.

Ardından da kampanya verileri için korelasyon grafiklerini çizdirebilir hale geliyoruz.

İlk olarak bütçemizi arttırdığımız durumda dönüşüm sayılarımızda net bir artış elde ettiğimizi görüyoruz.

analytics_verisi %>%
filter(campaign == "ornek_kampanya1") %>%
ggplot(aes(adCost, Profit)) + geom_point() + geom_smooth(method = "lm") + facet_wrap(~campaign)

Bu grafiği çizdirebilmek için R’ın dplyr ve ggplot paketlerini kullanabilirsiniz. Burada kullanılan %>% pipe işaretinin kullanımına ilişkin: https://www.datacamp.com/community/tutorials/pipe-r-tutorial

Ayrıca dplyr ve ggplot paketlerine de göz atabilirsiniz.

R’ın base fonksiyonlarından lm fonksiyonunun summary özelliğini kullanarak bu iki metrik arasındaki korelasyonun istatistiksel açıdan significant olup olmadığını da kontrol edebiliriz. Burada multiple r-squared, p-value ve significany codes bölümleri bize bu korelasyonun ne seviyede güvenilir olduğunu söylüyorlar.

qwe <- lm(transactions ~ adCost, analytics_verisi)

-- Çıktısı:

Call:
lm(formula = transactions ~ adCost, data = analytics_verisi)

Residuals:
Min 1Q Median 3Q Max
-9936.6 -37.8 -35.7 -35.0 13962.7

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 35.506729 29.735489 1.194 0.233
adCost 0.019490 0.000138 141.265 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 934.1 on 1006 degrees of freedom
Multiple R-squared: 0.952, Adjusted R-squared: 0.952
F-statistic: 1.996e+04 on 1 and 1006 DF, p-value: < 2.2e-16

Benzer şekilde Profit metriği için de grafiği çizdirdiğimizde:

analytics_verisi %>%
filter(campaign == "ornek_kampanya1") %>%
ggplot(aes(adCost, Profit)) + geom_point() + geom_smooth(method = "lm") + facet_wrap(~campaign)

Her ne kadar bütçeyi arttırdığımızda dönüşüm sayıları artıyor olsa da, bütçeyi arttırdığımızda bu örnek kampanya için karlılığımızın düştüğünü görüyoruz.

0 çizgisi sayesinde bu kampanyada zarar etmeden durabileceğimiz reklam maliyetinin ne seviyelerde olması gerektiğini de görebiliyoruz.

Şimdi bu kampanyada karlılığı 0 yapan reklam maliyetinin ne olması gerektiğini bu regresyon doğrusunun formülünden hesaplayalım.

Daha önce bu kampanyada kullandığımız lm fonksiyonu ilk çalıştığında bize doğrunun eğimi ve kesim noktasının değerlerini veriyor.

lm(transactions ~ adCost, analytics_verisi)

Call:
lm(formula = Profit ~ adCost, data = ornekkamp)

Coefficients:
(Intercept) adCost
4.239e+03 -4.991e-03

Burada elimizde formül doğru denklemi formülü;

y = ax + b

Burada y değeri Profit, a değeri adCost’un katsayısı ve b değeri ise intercept değeridir. Y değerini yani profit’i 0 yapacak değeri aradığımızdan y yerine 0 yazıyoruz. Verileri yerine koyduğumuzda

0 = -4.991e-03 * x + 4.239e+03

x = (0 - 4.239e+03) / -4.991e-03

Sonuç olarak X değerini: 849328.8 olarak buluyoruz. Yani bu kampanyada haftalık 849328.8 TL harcadığımızda bu Google Ads kampanyasından elde edeceğimiz kar yaklaşık olarak 0 TL oluyor.

Regresyonun Tüm Kampanyalara Uygulanması

Burada öncelikle tüm kampanyalar arasında ortalama bütçe üzerinde bütçe kullanan kampanyaları tespit edip onlar üzerinden kar değerini 0 yapacağımız kampanyaları bulalım. Bunun nedeni düşük bütçe kullanan kampanyalarda yukarıda bulduğumuz istatistiksel hassasiyette ulaşamayacak olmamız ve onların korelasyonlarının yetersiz veri nedeniyle diğer kampanyalar negatif korelasyon verirken, onların pozitif korelasyon verebilme ihtimalleridir.

Aşağıdaki grafikte her bir küçük kutu bir kampanya için maliyete karşılık kar değerlerini göstermekte. En üstten 5. grafikte maliyet arttıkça kar değeri artıyormuş gibi bir eğilim görünüyor olsa da, aslında verinin bu davranışı göstermek için yetersiz olduğunu görebiliyoruz. Aynı şekilde bazı kampanyalarda ise haftalık verinin yeterli sayıda olmadığını da görebiliriz. Aşağıdaki grafiği oluşturmak için kullandığımız kod:

ggplot(yetersiz_kampanyalar, aes(adCost, Profit)) + geom_point() + geom_smooth(method = "lm") + facet_wrap(~campaign)

Bu kampanyaları veri setimizden çıkardıktan sonra kalan diğer kampanyalarımızda haftalık kar değerlerini 0 yapan reklam maliyetlerini hesaplamak içinse;

coeffs <- analytics_verisi_yeterli_veri %>%

group_by(campaign) %>%

do(fittedCoeffs = lm(Profit ~ adCost, data =.)) %>%
mutate(firstcoeff = unlist(fittedCoeffs)[[1]][1], secondcoeff = unlist(fittedCoeffs)[[2]][1]) %>%

filter(!is.na(secondcoeff) & !is.na(firstcoeff)) %>%
mutate(adCost = -firstcoeff / secondcoeff) %>%
filter(adCost > 0, secondcoeff < 0)

coeffs$adCost <- round(coeffs$adCost, 5)

Burada ilk adımda group_by ile kampanyalara göre gruplama yapıyor ardından tüm kampanyalar için lineer model oluşturma fonksiyonu olan lm’yi kullanıyoruz ve lm’nin çıktı parametrelerinden intercept ve eğim için iki yeni değişken oluşturarak bunları mutate fonksiyonu ile tablo’da yeni sütunlara yazıyoruz.

Ardından eğimi 0 olan veya eğim değeri gelmeyen verileri veri setimiziden çıkarıyor, maliyetleri 0 profit’e göre hesaplamak için adCost = - firstcoeff / secondcoeff kodunu kullanıyoruz. Son satırda ise daha okunabilir hale getirmek için maliyetleri virgülden sonra 5 satır olacak şekilde gösteriyoruz.

Sonuç olarak çıktımızı aşağıdaki şekilde elde ediyoruz:

Sonraki Adım ve Sonuç

Dijital pazarlama kanalları bir yandan ölçümlemeyi kolaylaştırırarak önemli bir avantaj sağlarken diğer bir yandan da pazarlama kanallarının giderek artması ve bu kanalların birbirleriyle ilişkili çalışması ölçümlemeyi giderek daha kompleks hale getirmekte. Bu durumda kanalların ve kampanyaların performanslarını birbirlerine kıyaslamalı olarak ölçümleyebilmek için daha kompleks analizlere de ihtiyaç doğuyor. Regresyon ile tek bir bağımsız değişken üzerinden ideal bütçelerin hesaplanmasının yanında tıklama başı maliyet, ayın haftası, rakiplerin yatırımları gibi birden fazla değişkenin dahil olduğu veriler üzerinden de analizlere ihtiyaç duyulabiliyor. Burada tek bir değişken ideal bütçelerin hesaplanmasında belirli bir seyiyeye kadar yeterli görünse de çok değişkenli regresyonlar kullanılarak daha hassas sonuçlara ulaşmak da sonraki adım olarak tercih edilebilir.