Kelas Python dibuat untuk mengatasi masalah mengenai atribusi pemasaran digital.
Saat menjelajah online, seorang pengguna memiliki beberapa titik kontak sebelum mengonversi, yang dapat menyebabkan perjalanan lebih lama dan lebih kompleks.
Bagaimana cara konversi kredit yang tepat dan beralasan investasi di media?
Untuk mengatasi ini, kami menerapkan model atribusi .
Model heuristik :
Interaksi terakhir :
Atribusi default di Gogle Analytics dan platform media lainnya seperti Google Ads dan Facebook Business Manager;
Hanya titik sentuh terakhir yang dikreditkan untuk konversi.
Klik Terakhir Non-Direk :
Semua lalu lintas langsung diabaikan dan 100% dari hasilnya masuk ke saluran terakhir yang melaluinya klien sampai ke situs web sebelum mengonversi.
Interaksi Pertama :
Hasilnya sepenuhnya dikaitkan dengan titik sentuh pertama.
Linear :
Setiap titik sentuh juga dikreditkan.
Pembusukan Waktu :
Semakin baru titik kontak, semakin banyak kredit yang didapatnya.
Berbasis Posisi :
Dalam model ini, 40% hasilnya disebabkan oleh titik sentuh terakhir, 40% lainnya untuk yang pertama dan 20% sisanya didistribusikan secara merata di antara saluran tengah.
Model algotitmik
Nilai Shapley
Digunakan dalam teori permainan, nilai ini adalah estimasi kontribusi masing -masing pemain dalam permainan kooperatif.
Konversi dikreditkan ke saluran dengan proses permutasi perjalanan. Dalam setiap permutasi saluran diberikan untuk memperkirakan seberapa esensial itu secara keseluruhan.
Sebagai contoh , mari kita lihat perjalanan hipoterik berikut:
Pencarian Organik> Facebook> Langsung> $ 19 (sebagai pendapatan)
Untuk mendapatkan nilai Shapley setiap saluran, pertama -tama kita perlu mempertimbangkan semua nilai konversi untuk permutasi komponen dari perjalanan yang diberikan ini.
Pencarian Organik> $ 7
Facebook> $ 6
Langsung> $ 4
Pencarian Organik> Facebook> $ 15
Pencarian Organik> Langsung> $ 7
Facebook> Langsung> $ 9
Pencarian Organik> Facebook> Langsung> $ 19
Jumlah komponen joneys meningkat secara eksponensial, saluran yang lebih berbeda yang Anda miliki: laju adalah 2^n (2 ke kekuatan n) untuk saluran n .
Dengan kata lain, dengan 3 titik kontak yang berbeda ada 8 permutasi. Dengan lebih dari 15, misalnya, proses ini tidak layak .
Secara default, urutan titik kontak tidak dipertimbangkan saat menghitung nilai Shapley, hanya kehadiran atau kekurangannya. Untuk melakukannya, jumlah permutasi meningkat .
Dengan mengingat hal itu, perhatikan bahwa cukup sulit untuk menggunakan model ini ketika mempertimbangkan urutan interaksi. Untuk saluran N, tidak hanya ada permutasi 2 dari saluran I yang diberikan, tetapi juga setiap permutasi yang mengandung I dalam posisi yang berbeda .
Beberapa masalah dan keterbatasan nilai Shapley
Rantai Markov Rantai Markov adalah proses stokastik tertentu di mana distribusi probabilitas dari negara bagian selanjutnya hanya tergantung pada keadaan saat ini, mengabaikan keadaan prakeeding dan urutannya.
Dalam atraksi multichannel, kita dapat menggunakan rantai Markov untuk menghitung probabilitas interaksi antara pasangan saluran media dengan matriks transisi .
Sehubungan dengan kontribusi masing -masing saluran dalam konversi, efek penghapusan datang: untuk setiap jorney saluran yang diberikan dihapus dan probabilitas konversi dihitung.
Nilai yang dikaitkan dengan saluran, kemudian, diperoleh dengan rasio perbedaan antara probabilitas konversi secara umum dan probabilitas setelah saluran tersebut dihapus atas probabilitas umum lagi.
Dengan kata lain, semakin besar efek penghapusan saluran, semakin besar kontribusinya.
** Saat bekerja dengan proses Markovian tidak ada batasan karena jumlah atau urutan saluran. Urutan mereka, itu sendiri, adalah bagian mendasar dari algoritma.
>> pip install marketing_attribution_models
from marketing_attribution_models import MAM
Saat membuat objek MAM, dua templat bingkai data dapat digunakan sebagai input tergantung pada apa nilai parameter grup_channels .
Untuk demostrasi ini kita akan menggunakan bingkai data di mana perjalanan belum dikelompokkan , dengan setiap baris sebagai sesi yang berbeda dan tanpa ID perjalanan yang unik.
Catatan: Kelas MAM memiliki parameter bawaan untuk pembuatan ID Journey, create_journey_id_based_on_conversion , bahwa jika benar , ID dibuat berdasarkan ID pengguna, input dalam parameter grup_channels_id_list , dan kolom yang menunjukkan apakah ada konversi atau tidak, yang siapa Nama didefinisikan oleh parameter Journey_with_conv_colname .
Dalam skenario ini, semua sesi dari setiap pengguna yang berbeda akan dipesan dan untuk setiap konversi ID perjalanan baru dibuat. Namun, kami sangat mendorong bahwa penciptaan ID perjalanan ini disesuaikan berdasarkan pengetahuan khusus untuk bisnis yang ada di tangan dan kesimpulan eksplorasi. Misalnya jika dalam bisnis tertentu dicatat bahwa durasi perjalanan rata -rata adalah sekitar satu minggu, kritik baru dapat didefinisikan sehingga begitu pengguna tidak memiliki interaksi selama tujuh hari perjalanan istirahat di bawah asumsi ada kerugian menarik.
Adapun parameter sekarang, inilah cara mereka dikonfigurasi untuk group_ channels kami = skenario sejati:
attributions = MAM ( df ,
group_channels = True ,
channels_colname = 'channels' ,
journey_with_conv_colname = 'has_transaction' ,
group_channels_by_id_list = [ 'user_id' ],
group_timestamp_colname = 'visitStartTime' ,
create_journey_id_based_on_conversion = True )
Untuk mengeksplorasi dan memahami kemampuan MAM, "generator dataframe acak" diimplementasikan melalui penggunaan parameter acak_df ketika diatur ke true .
attributions = MAM ( random_df = True )
Setelah objek, MAM dibuat, kami dapat memeriksa database kami sekarang dengan penambahan Journey_id kami dan dengan sesi yang dikelompokkan dalam perjalanan menggunakan attriute ".dataFrame" .
attributions . DataFrame
Journey_id | channels_agg | TIME_TILL_CONV_AGG | dikonversi_agg | konversi_value | |
---|---|---|---|---|---|
0 | ID: 0_J: 0 | 0,0 | BENAR | 1 | |
1 | ID: 0_J: 1 | Pencarian Google | 0,0 | BENAR | 1 |
2 | ID: 0_J: 10 | Pencarian Google> Organik> Pemasaran Email | 72.0> 24.0> 0.0 | BENAR | 1 |
3 | ID: 0_J: 11 | Organik | 0,0 | BENAR | 1 |
4 | ID: 0_J: 12 | Pemasaran Email> Facebook | 432.0> 0,0 | BENAR | 1 |
... | ... | ... | ... | ... | ... |
20341 | ID: 9_J: 5 | Langsung> Facebook | 120.0> 0.0 | BENAR | 1 |
20342 | ID: 9_J: 6 | Pencarian Google> Pencarian Google> Pencarian Google | 48.0> 24.0> 0.0 | BENAR | 1 |
20343 | ID: 9_J: 7 | Organik> Organik> Pencarian Google> Pencarian Google | 480.0> 480.0> 288.0> 0.0 | BENAR | 1 |
20344 | ID: 9_J: 8 | Langsung> Organik | 168.0> 0.0 | BENAR | 1 |
20345 | ID: 9_J: 9 | Pencarian Google> Organik> Pencarian Google> Emai ... | 528.0> 528.0> 408.0> 240.0> 0.0 | BENAR | 1 |
Atribut ini diperbarui untuk setiap model atribusi yang dihasilkan. Hanya dalam kasus model heuristik, kolom baru ditambahkan berisi nilai atribusi yang diberikan oleh model tersebut.
Catatan: Atribut .dataFrame tidak mengganggu perhitungan model apa pun. Jika diubah oleh penggunaan, hasil berikut tidak terpengaruh.
attributions . attribution_last_click ()
attributions . DataFrame
Journey_id | channels_agg | TIME_TILL_CONV_AGG | dikonversi_agg | konversi_value | |
---|---|---|---|---|---|
0 | ID: 0_J: 0 | 0,0 | BENAR | 1 | |
1 | ID: 0_J: 1 | Pencarian Google | 0,0 | BENAR | 1 |
2 | ID: 0_J: 10 | Pencarian Google> Organik> Pemasaran Email | 72.0> 24.0> 0.0 | BENAR | 1 |
3 | ID: 0_J: 11 | Organik | 0,0 | BENAR | 1 |
4 | ID: 0_J: 12 | Pemasaran Email> Facebook | 432.0> 0,0 | BENAR | 1 |
... | ... | ... | ... | ... | ... |
20341 | ID: 9_J: 5 | Langsung> Facebook | 120.0> 0.0 | BENAR | 1 |
20342 | ID: 9_J: 6 | Pencarian Google> Pencarian Google> Pencarian Google | 48.0> 24.0> 0.0 | BENAR | 1 |
20343 | ID: 9_J: 7 | Organik> Organik> Pencarian Google> Pencarian Google | 480.0> 480.0> 288.0> 0.0 | BENAR | 1 |
20344 | ID: 9_J: 8 | Langsung> Organik | 168.0> 0.0 | BENAR | 1 |
20345 | ID: 9_J: 9 | Pencarian Google> Organik> Pencarian Google> Emai ... | 528.0> 528.0> 408.0> 240.0> 0.0 | BENAR | 1 |
Biasanya volume data yang dikerjakan sangat luas, sehingga tidak praktis atau bahkan tidak mungkin menganalisis hasil yang dikaitkan dengan setiap perjalanan dengan transaksi. Dengan atribut grup_by_channels_models , namun, semua hasil dapat dilihat dikelompokkan berdasarkan saluran.
Catatan : Hasil yang dikelompokkan tidak saling menimpa jika model yang sama digunakan dalam dua contoh yang berbeda. Keduanya (atau bahkan lebih) dari mereka ditampilkan dalam " group_by_channels_models ".
attributions . group_by_channels_models
saluran | atribusi_last_click_heuristic |
---|---|
Langsung | 2133 |
Pemasaran Email | 1033 |
3168 | |
Tampilan Google | 1073 |
Pencarian Google | 4255 |
1028 | |
Organik | 6322 |
YouTube | 1093 |
Seperti atribut .dataFrame , grup_by_channels_models juga diperbarui untuk setiap model yang digunakan tanpa batasan tidak menampilkan hasil algoritmik.
attributions . attribution_shapley ()
attributions . group_by_channels_models
saluran | atribusi_last_click_heuristic | attribution_shapley_size4_conv_rate_algorithmic | |
---|---|---|---|
0 | Langsung | 109 | 74.926849 |
1 | Pemasaran Email | 54 | 70.558428 |
2 | 160 | 160.628945 | |
3 | Tampilan Google | 65 | 110.649352 |
4 | Pencarian Google | 193 | 202.179519 |
5 | 64 | 72.982433 | |
6 | Organik | 315 | 265.768549 |
7 | YouTube | 58 | 60.305925 |
Semua model heuristik berperilaku sama saat menggunakan atribut .dataFrame dan .group_by_channels_models , seperti yang dijelaskan sebelumnya, dan output dari semua metode model heuristik mengembalikan tuple yang berisi dua seri panda .
attribution_first_click = attributions . attribution_first_click ()
Seri pertama tuple adalah hasil dalam granularity perjalanan , mirip dengan yang diamati dalam atribut .dataFrame
attribution_first_click [ 0 ]
0 [1, 0, 0, 0, 0]
1 [1]
2 [1, 0, 0, 0, 0, 0, 0, 0, 0]
3 [1, 0]
4 [1]
...
20512 [1, 0]
20513 [1, 0, 0]
20514 [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
20515 [1, 0, 0]
20516 [1, 0, 0, 0]
Length: 20517, dtype: object
Yang kedua berisi hasil dengan granularitas saluran , seperti yang terlihat dalam atribut .group_by_channels_models .
attribution_first_click [ 1 ]
saluran | atribusi_first_click_heuristic | |
---|---|---|
0 | Langsung | 2078 |
1 | Pemasaran Email | 1095 |
2 | 3177 | |
3 | Tampilan Google | 1066 |
4 | Pencarian Google | 4259 |
5 | 1007 | |
6 | Organik | 6361 |
7 | YouTube | 1062 |
Dari semua model yang ada di MAM objek, hanya klik terakhir, klik pertama dan linier tidak memiliki parameter yang dapat disesuaikan tetapi group_by_channels_models , yang memiliki nilai boolean yang ketika diatur ke false model tidak mengembalikan atribusi yang dikelilingi oleh saluran.
Dibuat untuk mereplikasi atraksi default Google Analytics ( klik terakhir non langsung ) di mana lalu lintas langsung ditimpa jika interaksi sebelumnya memiliki sumber lalu lintas tertentu selain mengarahkan dirinya sendiri dalam rentang waktu tertentu (6 bulan secara default).
Jika tidak ditentukan, parameter but_not_this_channel diatur ke 'langsung' , tetapi dapat diatur ke saluran minat lain ke bisnis.
attributions . attribution_last_click_non ( but_not_this_channel = 'Direct' )[ 1 ]
saluran | atribusi_last_click_non_direct_heuristic | |
---|---|---|
0 | Langsung | 11 |
1 | Pemasaran Email | 60 |
2 | 172 | |
3 | Tampilan Google | 69 |
4 | Pencarian Google | 224 |
5 | 67 | |
6 | Organik | 350 |
7 | YouTube | 65 |
Model ini memiliki parameter list_positions_first_middle_last di mana bobot masing -masing untuk posisi saluran dalam setiap perjalanan dapat saya ditentukan sesuai dengan keputusan terkait bisnis . Distribusi default parameter adalah 40% untuk saluran pengenalan , 40% untuk saluran konversi / terakhir dan 20% untuk yang intermidiate .
attributions . attribution_position_based ( list_positions_first_middle_last = [ 0.3 , 0.3 , 0.4 ])[ 1 ]
saluran | atribusi_position_based_0.3_0.3_0.4_heuristic | |
---|---|---|
0 | Langsung | 95.685085 |
1 | Pemasaran Email | 57.617191 |
2 | 145.817501 | |
3 | Tampilan Google | 56.340693 |
4 | Pencarian Google | 193.282305 |
5 | 54.678557 | |
6 | Organik | 288.148896 |
7 | YouTube | 55.629772 |
Ada dua pengaturan yang dapat disesuaikan: laju peluruhan , melalui parameter Decay_over_Time *, dan waktu (dalam jam) antara setiap dekimen melalui parameter frekuensi .
Perlu dicatat, bahwa jika ada lebih dari satu titik sentuh antara interval frekuensi nilai konversi akan didistribusikan secara merata di antara saluran -saluran ini.
Sebagai contoh:
attributions . attribution_time_decay (
decay_over_time = 0.6 ,
frequency = 7 )[ 1 ]
saluran | atribusi_time_decay0.6_freq7_heuristic | |
---|---|---|
0 | Langsung | 108.679538 |
1 | Pemasaran Email | 54.425914 |
2 | 159.592216 | |
3 | Tampilan Google | 64.350107 |
4 | Pencarian Google | 192.838884 |
5 | 64.611414 | |
6 | Organik | 314.920082 |
7 | YouTube | 58.581845 |
Uppon dipanggil, model ini mengembalikan tuple dengan empat komponen. Dua yang pertama (diindeks 0 dan 1) sama seperti dengan model heuristik, dengan representasi .DataFrame dan .group_by_channels_models masing -masing. Adapun komponen ketiga dan keempat (diindeks 2 dan 3) hasilnya adalah matriks transisi dan tabel efek penghapusan .
Untuk memulai, dimungkinkan untuk menunjukkan apakah transisi keadaan yang sama dipertimbangkan atau tidak ( misalnya langsung ke langsung).
attribution_markov = attributions . attribution_markov ( transition_to_same_state = False )
saluran | atribusi_markov_algorithmic | |
---|---|---|
0 | Langsung | 2305.324362 |
1 | Pemasaran Email | 1237.400774 |
2 | 3273.918832 | |
3 | YouTube | 1231.183938 |
4 | Pencarian Google | 4035.260685 |
5 | 1205.949095 | |
6 | Organik | 5358.270644 |
7 | Tampilan Google | 1213.691671 |
Konfigurasi ini tidak mempengaruhi hasil yang dikaitkan secara keseluruhan untuk setiap saluran, tetapi nilai yang diamati dalam matriks transisi . Karena kami mengatur transisi_to_same_state menjadi false , diagonal, menunjukkan status transisi untuk diri mereka sendiri, dibatalkan.
ax , fig = plt . subplots ( figsize = ( 15 , 10 ))
sns . heatmap ( attribution_markov [ 2 ]. round ( 3 ), cmap = "YlGnBu" , annot = True , linewidths = .5 )
Efek penghapusan , output attribution_markov keempat, diperoleh dengan rasio perbedaan antara probabilitas konversi secara umum dan probabilitas setelah saluran tersebut dihapus atas probabilitas umum lagi.
ax , fig = plt . subplots ( figsize = ( 2 , 5 ))
sns . heatmap ( attribution_markov [ 3 ]. round ( 3 ), cmap = "YlGnBu" , annot = True , linewidths = .5 )
Akhirnya, model algoriten kedua MAM yang konsepnya berasal dari teori permainan . Tujuannya di sini adalah untuk mendistribusikan kontribusi masing -masing pemain (dalam kasus kami, saluran) dalam permainan kerja sama yang dihitung menggunakan kombinasi perjalanan dengan dan tanpa saluran yang diberikan.
Ukuran parameter mendefinisikan batas berapa lama rantai saluran dalam setiap perjalanan. Secara default, nilainya diatur ke 4 , yang berarti hanya empat saluran terakhir yang sebelum konversi dipertimbangkan.
Metode perhitungan kontribusi marjinal dari setiap saluran dapat bervariasi dengan parameter pesanan . Secara default diatur ke false , yang berarti kontribusi dihitung mengabaikan urutan setiap saluran dalam perjalanan.
attributions . attribution_shapley ( size = 4 , order = True , values_col = 'conv_rate' )[ 0 ]
kombinasi | konversi | Total_Sequences | konversi_value | conv_rate | atribusi_shapley_size4_conv_rate_order_algorithmic | |
---|---|---|---|---|---|---|
0 | Langsung | 909 | 926 | 909 | 0.981641 | [909.0] |
1 | Langsung> Pemasaran Email | 27 | 28 | 27 | 0.964286 | [13.948270234099155, 13.051729765900845] |
2 | Langsung> Pemasaran Email> Facebook | 5 | 5 | 5 | 1.000000 | [1.6636366232390172, 1.5835883671498818, 1.752 ... |
3 | Langsung> Pemasaran Email> Facebook> Google D ... | 1 | 1 | 1 | 1.000000 | [0,2563402919193473, 0,2345560799963515, 0,259 ... |
4 | Langsung> Pemasaran Email> Facebook> Google ... | 1 | 1 | 1 | 1.000000 | [0,2522517802130265, 0,2401286956930936, 0,255 ... |
... | ... | ... | ... | ... | ... | ... |
1278 | YouTube> Organik> Google Search> Google dis ... | 1 | 2 | 1 | 0,500000 | [0,2514214624662836, 0,24872101523605275, 0,24 ... |
1279 | YouTube> Organik> Pencarian Google> Instagram | 1 | 1 | 1 | 1.000000 | [0,2544401477637237, 0,2541071889956603, 0,253 ... |
1280 | YouTube> Organik> Instagram | 4 | 4 | 4 | 1.000000 | [1.2757196742326997, 1.4712839059493295, 1.252 ... |
1281 | YouTube> Organik> Instagram> Facebook | 1 | 1 | 1 | 1.000000 | [0,2357631944623868, 0,2610913781266248, 0,247 ... |
1282 | YouTube> Organik> Instagram> Pencarian Google | 3 | 3 | 3 | 1.000000 | [0,7223482210689489, 0,7769049003203142, 0,726 ... |
Akhirnya, parameter yang menunjukkan metrik apa yang digunakan untuk menghitung nilai shapley adalah values_col , yang secara default diatur ke laju konversi . Dengan melakukan itu, perjalanan tanpa konversi dilakukan.
Namun, dimungkinkan untuk mempertimbangkan hanya konversi literal saat menggunakan model seperti yang terlihat di bawah ini.
attributions . attribution_shapley ( size = 3 , order = False , values_col = 'conversions' )[ 0 ]
kombinasi | konversi | Total_Sequences | konversi_value | conv_rate | atribusi_shapley_size3_conversions_algorithmic | |
---|---|---|---|---|---|---|
0 | Langsung | 11 | 18 | 18 | 0.611111 | [11.0] |
1 | Langsung> Pemasaran Email | 4 | 5 | 5 | 0.800000 | [2.0, 2.0] |
2 | Langsung> Pemasaran Email> Pencarian Google | 1 | 2 | 2 | 0,500000 | [-3.166666666666665, -7.66666666666666, 11.8 ... |
3 | Langsung> Pemasaran Email> Organik | 4 | 6 | 6 | 0.666667 | [-7.8333333333333333, -10.833333333333332, 22.6 ... |
4 | Langsung> Facebook | 3 | 4 | 4 | 0.750000 | [-8.5, 11.5] |
... | ... | ... | ... | ... | ... | ... |
75 | Instagram> Organik> YouTube | 46 | 123 | 123 | 0.373984 | [5.8333333333333332, 34.33333333333333, 5.83333 ... |
76 | Instagram> YouTube | 2 | 4 | 4 | 0,500000 | [2.0, 0.0] |
77 | Organik | 64 | 92 | 92 | 0.695652 | [64.0] |
78 | Organik> YouTube | 8 | 11 | 11 | 0.727273 | [30.5, -22.5] |
79 | YouTube | 11 | 15 | 15 | 0.733333 | [11.0] |
Setelah mendapatkan setiap atribusi dari berbagai model yang disimpan di objek .group_by_channels_models kami, dimungkinkan untuk memplot dan membandingkan hasil untuk wawasan
attributions . plot ()
Jika Anda hanya tertarik pada model algoritmik, ini dapat saya ditentukan dalam parameter model_type .
attributions . plot ( model_type = 'algorithmic' )