Cohort (Kohort) ile Müşteri Hareket Analizi ve Python Uygulaması

Yiğit Şener
6 min readApr 3, 2021

Cohort (Kohort) analizi müşteri yolculuğunda yaşam boyu değerinin farklı yönlerden ele alabileceğiniz esnek bir bakış açısı sunmaktadır. Bu analiz yöntemini ilk kez Google Analytics üzerinde gördüm ve o anda aşık oldum. Sonra hiç aklımdan çıkaramadım. Bu yazı çerçevesinde öncelikle Cohort analizin tam olarak ne olduğundan bahsedip ardından Python üzerinden nasıl yapılacağını anlatacağım.

Cohort (Kohort) analizi aslında tıp alanında hastaların akciğer sağlığını ölçümlemek için kullanılır. Doktor hastadan Kohort-kohort-kohort diyerek öksürmesini ister. Eğer bu öksürükte ‘h’ harfi çıkmaz ise bunu bir semptom olarak değerlendirir desem yalan olur. Böyle bir şey yok ama neden olmasın :) ?

Cohort (Kohort) Analizi Nedir?

Pazarlama dünyasında müşteri yolculuğu ile kesişen bir takım analizlerin kesişebildiği Cohort analiz, tek bir çıktı ile birden çok yorumu bir arada getirir. Aynı zamanda bu çıktıdan faydalanılarak müşteri yaşam boyu değerinin tahminlenmesi için de kullanılabilir.

Temel olarak müşterilerin ya da kullanıcıların hareketlerinin periyodlar içerisinde gözlemlenmesine imkan tanır.

Hemen örnek bir tabloya bakarak anlamaya çalışalım.

Cohort periyod alanında müşterilerin aylık olarak ilk geliş adetleri baz alınmıştır. Sağa doğru akan tarihlerde ise soldaki grubun devam eden aylardaki performansı yansıtılmıştır. Tabloya baktığımızda 2021–01 tarihinde gelen 120 müşterinin/kullanıcının devam eden ayda 105 ve 80 olduğu görülmektedir. Peki bu sayılar ne olabilir? Sipariş adet, login, sayfa ziyareti, düzenli ödeme, kredi kartı kullanım, sokağa çıkması, spor salonuna gidiş adet vb. sizin incelemek istediğiniz değişkene bağlı diyebiliriz. Burada biz ay kullandık ancak bu istenilen zaman formatına dönüştürülebilir. Saniyeden tutunda çeyrekliklere kadar skalayı değiştirebilirsiniz.

Aynı adetleri yüzdelik olarak gösterdiğimizde ise daha okunabilir bir formata dönüştürmüş olacağız.

İşin içine oranlar girdiğinde ise elma ile elmayı karşılaştırabiliriz. Şimdi seçtiğimiz periyodlar için müşteri gruplarını ay bazında kıyaslamak daha kolay bir hale geldi. Bir bakalım. Devam eden aktiflik oranında 2. ayında müşterilerden en aktif grubu %80 ile Ocak ayı (2021-01) görülüyor.

Orada hiçbir şey olmasa bile kesinlikle bir şey olmuş.

Neyi doğru yapmış olabiliriz ki o dönemdeki müşterilerimiz bu kadar sadık (loyal), tutunan (retention) müşteriler haline gelmişler. Kampanya mı? Dolar etkisi mi? Arayüz farkı mı? Reklam mı? nedir abi?

Bu analizi adet, tutar, oran nasıl isterseniz o biçimde ele alıp geliştirebilirsiniz. Biraz hayal gücü biraz çikolata.

Talk is cheap, show me the code

Python İle Cohort Analizi

Veriniz hazır ise Excel ile de bu tabloyu oluşturabilirsiniz. Python ile devam edecekler için aşağıdaki kütüphaneleri bir ortamımıza tanıtalım kaynaşsınlar.

# gerekli kütüphaneler
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from datetime import datetime

Örnek bir veri setimizi aşağıdaki gibi indirip Pandas DataFrame’ine oturtalım.

# veriye github üzerinden erişim
url = "https://github.com/ethen8181/machine-learning/blob/master/python/cohort/relay-foods.csv"
df = pd.read_csv(url + "?raw=true", error_bad_lines=False)

Yukarıdaki kodu çalıştırdığınızda veriniz gelecektir. Sorun yaşarsanız URL değişkeninin içerisindeki link üzerinden veriyi manuel indirip DataFrame’e aktarabilirsiniz.

Ne geldi bakalım.

"""Veri hazırlığı"""
# genel olarak veriye bakış
df.head()

Tabloya baktığımızda işimize yaramayan bir çok kolon var bunları çıkaralım da kafamız rahat işimize devam edelim.

# sadece analiz için gerekli kolonların seçimi
df = df[["OrderDate","UserId","TotalCharges"]]

Üç alan seçtim sipariş tarihi, kullanıcı/müşteri ID ve yaptığı harcamanın tutarı şimdilik bize yeterli.

Kayıp/eksik veri var mı bakalım. Ardından veri tiplerini inceleyelim. Bazılarının tipi kaymış gibi geldi bana…

# kayıp veri kontrolü
print(df.isnull().sum().sum())
# 0

# veri tipi kontrolü
print(df.dtypes)
# OrderDate object
# UserId int64
# TotalCharges object

Sipariş tarihi (OrderDate) ve Tutar (TotalCharge) object yani string yani text yani metin formatın gelmiş. OrderDate alanını tarih, TotalCharge alanını ise sayıya dönüştürmemiz gerekiyor.

# veri tipini dönüştürme
df["OrderDate"] = pd.to_datetime(df["OrderDate"])
df['TotalCharges'] = (df['TotalCharges']
.apply(lambda x: x.replace('$', '')).
astype('float'))

print(df.dtypes)
# OrderDate datetime64[ns]
# UserId int64
# TotalCharges float64

Artık verimiz Cohort analizi yapmak için sağlıklı ve temiz bir şekilde karşımızda duruyor. Hadi başlayalım.

Öncelikle aylar üzerinden bir analiz yapacağımız için günleri bertaraf etmemiz gerekiyor. Bunun için günlerin hepsini ayın biri olarak değiştirelim.

# tarih için sadece yıl ve ay bilgilerinin getirilmesi
get_year_month = lambda x: datetime(x.year, x.month, 1)

# lambda fonksiyonun veriye uygulanması
df['OrderMonth'] = df['OrderDate'].apply(get_year_month)

Sipariş ayı (OrderMonth) olarak yeni bir değişken yaratarak veri setimize ekledik. Sıradaki adım da bir kullanıcının ilk sipariş tarihini bulmaya geldi.

# kullanıcıların ilk sipariş tarihini getirelim
user_first_date = df.groupby('UserId')['OrderMonth']
df['CohortMonth'] = user_first_date.transform('min')

CohortMonth adlı alana kullanıcının ilk sipariş ayını yerleştirdik ve veri setine ekledik. En son veri setimizin aldığı hale bakalım mı?

df.head()

Tabloda görüldüğü üzere 47 numaralı müşterimizin sipariş yaptığı aylar ve ilk sipariş tarihi son iki kolona eklenmiş vaziyettedir.

Bitti mi hayır devam….

Elimizde ilk sipariş tarihi ve diğer sipariş tarihleri ay ve yıl olarak yer aldığına göre aradaki farkı bulabiliriz.

# ilk sipariş ve sonraki sipariş arası farklar
# yıl farkı
years_diff = df['OrderMonth'].dt.year - df['CohortMonth'].dt.year

# ay farkı
months_diff = df['OrderMonth'].dt.month - df['CohortMonth'].dt.month

# aradaki farkın yeni kolona eklenmesi
df['CohortIndex'] = years_diff * 12 + months_diff + 1

Aradaki ay farkını hesaplayıp CohortInde) x adlı bir alana yansıttık. Şimdi ilk geliş tarihlerine göre (CohortMonth) tekil müşteri sayılarını çıkaralım.

# her bir cohort için aylık aktif müşteri sayısı
grouping_count = df.groupby(['CohortMonth', 'CohortIndex'])
cohort_data = grouping_count['UserId'].apply(pd.Series.nunique)
cohort_data = cohort_data.reset_index()

Böylece ilgili ay içerisinde gelen tekil müşteri sayısını elde ettik. Ayrıca ay farkını da gelen veri setinde tutmaya devam ediyoruz. Yeniden şekillendirdiğimiz veriye bir göz atalım. İçim rahat etmedi size göstermeden.

cohort_data.head()

ilk kolonumuz müşterinin ilk geldiği tarih ikinci kolon ise geldiği tarihten sonra sipariş verdiği tarihler arasındaki ay farkı ve son kolon ise adet. Örneğin: 1.1.2009 tarihinde ilk kez müşteri olanlar ilk ay 22 adet ikinci ay ise 8 adet sipariş vermiş görünüyor.

Şimdi son bir sihirli dokunuş ile bu tabloyu bildiğimiz Pivot Table haline dönüştürerek dikeyde ilk geliş tarihi ve yatayda ise sonraki siparişlerin ay farkını alalım. Değer olarak ise UserID alanını saydıracağız (count).

# bildiğimiz Excel pivot
cohort_user_counts = cohort_data.pivot(index='CohortMonth',
columns='CohortIndex',
values='UserId')
cohort_user_counts

Görüldüğü üzere Cohort analizi için hazırladığımız tablo ortaya çıkmış oldu. Adetsel olarak incelemek zor olduğundan bunu güzel bir görsel ile şekilli şukelalı bir hale dönüştürüp yüzdeliklere göre değişen renklerde gösterimini saylaşalım.

# her bir müşteri için aktiflik yüzdesinin oluşturulması
cohort_sizes = cohort_user_counts.iloc[:,0]
retention = cohort_user_counts.divide(cohort_sizes, axis=0)

# cohort formatının ay ve yıl olarak gösterimi
retention.index = retention.index.strftime('%m-%Y')

# cohort
sns.set(style = 'white')
plt.figure(figsize = (12, 8))
plt.title('Cohort: Müşteri Tutundurma Analizi')
sns.heatmap(
retention
,cmap = plt.cm.Blues
,annot = True
,fmt = '.0%'
)
plt.xlabel("Devam Eden Aylar")
plt.ylabel("İlk Geliş Tarihi")
plt.show()

Tablomuzda da görüldüğü üzere yüzdelik ifadeler ile aktiflik oranlarını yazdırmış olduk. Aslında bu durum bizim müşterimizi ne kadar tutundurduğumuzu da göstermektedir.

Sonuç

Cohort analiz gerçekten okunması ve yapılması son derece keyifli bir veri inceleme yöntemidir. Hemen hemen her sektörde farklı değişkenler ile uygulanıp beklenmedik gözlemler ortaya çıkarılabilir.

--

--