Analisis corong penjualan adalah tugas khas untuk pemasaran internet, dan khususnya e-commerce. Dengan bantuannya Anda dapat:
- Cari tahu langkah-langkah mana dari pembelian yang Anda kehilangan pelanggan potensial.
- Untuk mensimulasikan volume pemasukan tambahan, dalam kasus ekspansi setiap langkah di jalur pembelian.
- Nilailah kualitas lalu lintas yang dibeli di berbagai platform periklanan.
- Menilai kualitas pemrosesan aplikasi yang masuk untuk masing-masing manajer.
Pada artikel ini, saya akan berbicara tentang bagaimana cara meminta data dari API Log Yandex Metrika dalam bahasa R, membuat dan memvisualisasikan corong berdasarkan pada mereka.
Salah satu keuntungan utama dari bahasa R adalah adanya sejumlah besar paket yang memperluas fungsionalitas dasarnya. Pada artikel ini kita akan melihat paket rym
, funneljoin
dan ggplot2
.
Menggunakan rym
kami memuat data dari Logs API, menggunakan funneljoin
untuk membangun corong perilaku, dan menggunakan ggplot2
memvisualisasikan hasilnya.

Isi
Meminta data dari Logs API Yandex Metrics
Siapa yang tidak tahu apa Logs API di sini adalah kutipan dari bantuan resmi Yandex.
Log API memungkinkan Anda menerima data non-agregat yang dikumpulkan oleh Yandex.Metrica. API ini ditujukan untuk pengguna layanan yang ingin memproses data statistik secara independen dan menggunakannya untuk memecahkan masalah analitis yang unik.
Untuk bekerja dengan Yandex.Metrica Logs API di R, kami akan menggunakan paket rym
.
Tautan yang bermanfaat ke paket rym paket rym
- R yang merupakan antarmuka untuk berinteraksi dengan Yandex Metrica API. Memungkinkan Anda bekerja dengan API Manajemen , API Pelaporan , API Google Analytics v3 dan Log Log yang kompatibel dengan Gore
Instalasi paket Rym
Untuk bekerja dengan paket apa pun di R, harus diinstal dan diunduh terlebih dahulu. Instal paket sekali menggunakan perintah install.packages()
. Penting untuk menghubungkan paket di setiap sesi kerja baru di R menggunakan fungsi library()
.
Untuk menginstal dan menghubungkan paket rym
gunakan kode berikut:
install.packages("rym") library(rym)
Bekerja dengan Logs API Yandex Metrics menggunakan paket rym
Untuk membangun corong perilaku, kami perlu mengunduh tabel tentang semua kunjungan yang dilakukan di situs Anda, dan menyiapkan data untuk analisis lebih lanjut.
Otorisasi di Yrics Metrics API
Bekerja dengan API dimulai dengan otorisasi. Dalam paket rym
proses otorisasi sebagian terotomatisasi dan dimulai ketika salah satu fungsinya dipanggil.
Pertama kali Anda mengakses API, Anda akan dialihkan ke browser untuk mengonfirmasi izin untuk mengakses metrik Yandex Anda untuk paket rym
. Setelah konfirmasi, Anda akan diarahkan ke halaman tempat kode konfirmasi otorisasi akan dibuat untuk Anda. Itu harus disalin dan ditempelkan ke konsol R sebagai respons terhadap permintaan "Enter authorize code:"
.
Selanjutnya, Anda dapat menyimpan kredensial ke file lokal dengan menjawab y
atau yes
untuk permintaan "Do you want save API credential in local file ..."
. Dalam hal ini, pada panggilan berikutnya ke API, Anda tidak perlu melakukan otentikasi ulang melalui browser, dan kredensial akan diambil dari file lokal.
Minta data dari Yandex Metrica API
Hal pertama yang kami minta dari Yandex Metrics API adalah daftar penghitung yang tersedia, dan tujuan yang dikonfigurasi. Ini dilakukan dengan menggunakan fungsi rym_get_counters()
dan rym_get_goals()
.
# library(rym) # counters <- rym_get_counters(login = " ") # goals <- rym_get_goals("0000000", # login = " ")
Dengan menggunakan contoh kode di atas, ganti " "
dengan nama pengguna Yandex Anda, di mana metrik Yandex yang Anda butuhkan tersedia. Dan "0000000"
ke nomor "0000000"
Anda butuhkan. Anda dapat melihat jumlah penghitung yang tersedia untuk Anda di tabel penghitung yang dimuat.
Tabel penghitung yang tersedia - penghitung memiliki bentuk berikut:
# A tibble: 2 x 9 id status owner_login name code_status site permission type gdpr_agreement_accepted <int> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <int> 1 11111111 Active site.ru1 Aerosus CS_NOT_FOUND site.ru edit simple 0 2 00000000 Active site.ru Aerosus RU CS_OK site.ru edit simple 1
Bidang id menunjukkan jumlah semua penghitung metrik Yandex yang tersedia.
Tabel sasaran adalah sebagai berikut:
# A tibble: 4 x 5 id name type is_retargeting conditions <int> <fct> <fct> <int> <fct> 1 47873638 url 0 type:contain, url:site.ru/checkout/cart/ 2 47873764 url 0 type:contain, url:site.ru/onestepcheckout/ 3 47874133 url 0 type:contain, url:/checkout/onepage/success 4 50646283 action 0 type:exact, url:click_phone
Yaitu di konter tempat saya bekerja, tindakan berikut ini dikonfigurasi:
- Pergi ke keranjang
- Buka pembayaran
- Halaman terima kasih telah memesan
- Klik pada tombol telepon
Di masa depan, untuk konversi data, kami akan menggunakan paket yang termasuk dalam pustaka tidyr
: tidyr
, dplyr
. Oleh karena itu, sebelum menggunakan contoh kode berikut, instal dan hubungkan paket-paket ini, atau seluruh pustaka tidyverse
.
# install.packages("tidyverse") # library(tidyverse) install.packages(c("dplyr", "tidyr")) library(dplyr) library(tidyr)
Fungsi rym_get_logs()
memungkinkan Anda untuk meminta data dari metrik Yandex metrics Logs API.
# logs <- rym_get_logs(counter = "0000000", date.from = "2019-04-01", date.to = "2019-06-30", fields = "ym:s:visitID, ym:s:clientID, ym:s:date, ym:s:goalsID, ym:s:lastTrafficSource, ym:s:isNewUser", login = " ") %>% mutate(ym.s.date = as.Date(ym.s.date), ym.s.clientID = as.character(ym.s.clientID))
Argumen utama untuk fungsi rym_get_logs()
:
- counter-counter number dari mana Anda meminta log;
- date.from - tanggal mulai;
- date.to - tanggal akhir;
- bidang - daftar bidang yang ingin Anda muat;
- login - login Yandex di mana penghitung yang ditentukan dalam penghitung tersedia.
Karena itu, kami meminta data kunjungan dari API Log yang berisi kolom berikut:
- ym: s: visitID - Visit ID
- ym: s: clientID - ID Pengguna di situs
- ym: s: date - Tanggal kunjungan
- ym: s: tujuanID - Identifikasi tujuan yang dicapai selama kunjungan ini
- ym: s: lastTrafficSource - Sumber Lalu Lintas
- ym: s: isNewUser - Kunjungan pengunjung pertama
Untuk daftar lengkap bidang yang tersedia, lihat Bantuan Log API.
Data yang diterima cukup bagi kami untuk membangun corong, sehubungan dengan pekerjaan yang diselesaikan dengan Logs API, dan kami beralih ke langkah berikutnya - pasca pemrosesan data yang diunduh.
Paket corong bangunan corong
Sebagian besar informasi yang disediakan di bagian ini diperoleh dari paket README funneljoin, tersedia dengan referensi .
Tujuan funneljoin
adalah menyederhanakan analisis corong perilaku pengguna. Misalnya, tugas Anda adalah menemukan orang yang mengunjungi situs Anda lalu mendaftar, dan mencari tahu berapa banyak waktu yang telah berlalu antara kunjungan pertama dan pendaftaran. Atau Anda perlu menemukan pengguna yang melihat kartu produk dan menambahkannya ke keranjang dalam waktu dua hari. Paket funneljoin
dan fungsi after_join()
membantu menyelesaikan masalah tersebut.
Argumen after_join()
:
- x - satu set data yang berisi informasi tentang penyelesaian acara pertama (dalam contoh pertama, mengunjungi situs, pada tampilan kedua kartu produk).
- y - kumpulan data dengan informasi tentang selesainya acara kedua, (dalam contoh pertama pendaftaran, yang kedua, menambahkan produk ke keranjang).
- by_time - kolom yang berisi informasi tentang tanggal peristiwa terjadi dalam tabel x dan y .
- by_user - kolom dengan pengidentifikasi pengguna dalam tabel x dan y .
- mode - metode yang digunakan untuk menghubungkan: "batin", "penuh", "anti", "semi", "kanan", "kiri". Sebagai gantinya, Anda juga dapat menggunakan
after_mode_join
(misalnya, after_inner_join
alih-alih after_join (..., mode = "inner")
). - type - tipe urutan yang digunakan untuk mendefinisikan pasangan peristiwa, seperti "first-first", "last-first", "any-firstafter". Detail lebih lanjut dijelaskan di bagian "Jenis saluran".
- max_gap / min_gap (opsional) - filter berdasarkan durasi waktu maksimum dan minimum antara peristiwa pertama dan kedua.
- gap_col (opsional) - Apakah akan mengembalikan kolom .gap numerik dengan perbedaan waktu antara peristiwa. Standarnya adalah SALAH.
Memasang corong
Pada saat penulisan ini, paket funneljoin
tidak dipublikasikan di CRAN, sehingga Anda dapat menginstalnya dari GitHub. Untuk menginstal paket dari GitHub, Anda memerlukan paket tambahan - devtools
.
install.packages("devtools") devtools::install_github("robinsones/funneljoin")
Data postprocessing diterima dari Logs API
Untuk studi yang lebih rinci tentang fungsional konstruksi corong, kita perlu membawa data yang diperoleh dari API Log ke formulir yang diinginkan. Cara paling mudah untuk memanipulasi data, seperti yang saya tulis di atas, disediakan oleh dplyr
dan dplyr
.
Untuk memulai, lakukan hal berikut:
- Dalam kasus ini, satu baris tabel log berisi informasi tentang satu kunjungan, dan kolom ym.s.goalsID adalah larik formulir -
[0,1,0,...]
, yang berisi pengidentifikasi tujuan yang dicapai selama kunjungan ini. Untuk membawa larik ke bentuk yang cocok untuk pekerjaan lebih lanjut, perlu untuk menghapus karakter tambahan dari itu, dalam kurung kotak kami. - Penting untuk memformat ulang tabel sehingga satu baris berisi informasi tentang satu tujuan yang dicapai selama kunjungan. Yaitu jika tiga tujuan dicapai selama satu kunjungan, maka kunjungan ini akan dibagi menjadi tiga baris, dan setiap baris, di kolom ym.s.goalsID, akan berisi pengidentifikasi hanya satu tujuan.
- Lampirkan tabel dengan daftar tujuan ke tabel log untuk memahami dengan tepat tujuan apa yang dicapai selama setiap kunjungan.
- Ganti nama kolom nama dengan nama sasaran menjadi acara .
Semua tindakan di atas diimplementasikan menggunakan kode berikut:
Kode postprocessing untuk data yang diterima dari Logs API # logs_goals <- logs %>% mutate(ym.s.goalsID = str_replace_all(ym.s.goalsID, # "\\[|\\]", "") %>% str_split(",")) %>% # unnest(cols = c(ym.s.goalsID)) %>% mutate(ym.s.goalsID = as.integer(ym.s.goalsID)) %>% # id left_join(goals, by = c("ym.s.goalsID" = "id")) %>% # rename(events = name) # events
Penjelasan kecil dari kode. Operator %>%
disebut pipeline, dan membuat kode lebih mudah dibaca dan kompak. Bahkan, dibutuhkan hasil dari mengeksekusi satu fungsi dan meneruskannya sebagai argumen pertama ke fungsi berikutnya. Dengan demikian, semacam konveyor diperoleh, yang memungkinkan Anda untuk tidak menyumbat RAM dengan variabel berlebihan yang menyimpan hasil antara.
Fungsi str_replace_all
menghapus tanda kurung siku di kolom ym.s.goalsID . str_split
membagi pengidentifikasi target dari kolom ym.s.goalsID menjadi nilai terpisah, dan unnest
menjadi baris terpisah, menduplikasi nilai dari semua kolom lainnya.
Dengan menggunakan mutate
kami memberikan pengidentifikasi target ke tipe integer.
left_join
tabel tujuan ke hasilnya, yang menyimpan informasi tentang tujuan yang dikonfigurasi. Menggunakan kolom ym.s.goalsID dari tabel saat ini dan kolom id dari tabel tujuan sebagai kuncinya.
Akhirnya, fungsi rename
nama mengubah nama kolom menjadi acara .
Sekarang tabel logs_goals memiliki tampilan yang diperlukan untuk pekerjaan lebih lanjut.
Selanjutnya, buat tiga tabel baru:
- first_visits - tanggal dari sesi pertama untuk semua pengguna baru
- keranjang - tanggal menambahkan produk ke keranjang
- pesanan - pesanan
Kode pembuatan tabel # first_visits <- logs_goals %>% filter(ym.s.isNewUser == 1 ) %>% # select(ym.s.clientID, # clientID ym.s.date) # date # cart <- logs_goals %>% filter(events == " ") %>% select(ym.s.clientID, ym.s.date) # orders <- logs_goals %>% filter(events == " ") %>% select(ym.s.clientID, ym.s.date)
Setiap tabel baru adalah hasil dari penyaringan tabel logs_goals utama yang diperoleh pada langkah terakhir. Penyaringan dilakukan oleh fungsi filter
.
Untuk membuat corong, cukup bagi kami untuk meninggalkan informasi tentang ID pengguna dan tanggal acara, yang disimpan di kolom ym.s.clientID dan ym.s.date , di tabel baru. Kolom yang diinginkan dipilih menggunakan fungsi select
.
Jenis corong
Argumen tipe menerima kombinasi apa pun dari nilai first
, last
, any
dan terakhir lastbefore
dengan lastbefore
first
, last
, any
dan firstafter
. Berikut ini adalah contoh kombinasi paling berguna yang dapat Anda gunakan:
first-first
: dapatkan acara x dan y paling awal untuk setiap pengguna. Misalnya, kami ingin mendapatkan tanggal kunjungan pertama , dan tanggal pembelian pertama , dalam hal ini gunakan jenis corong first-first
.
# first-first first_visits %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "first-first")
# A tibble: 42 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1552251706539589249 2019-04-18 2019-05-15 2 1554193975665391000 2019-04-02 2019-04-15 3 1554317571426012455 2019-04-03 2019-04-04 4 15544716161033564779 2019-04-05 2019-04-08 5 1554648729526295287 2019-04-07 2019-04-11 6 1554722099539384487 2019-04-08 2019-04-17 7 1554723388680198551 2019-04-08 2019-04-08 8 15547828551024398507 2019-04-09 2019-05-13 9 1554866701619747784 2019-04-10 2019-04-10 10 1554914125524519624 2019-04-10 2019-04-10 # ... with 32 more rows
Kami mendapat tabel di mana 1 baris berisi data pada tanggal kunjungan pertama pengguna ke situs, dan tanggal pesanan pertamanya.
first-firstafter
: dapatkan x paling awal, maka y pertama terjadi setelah x pertama. Misalnya, seorang pengguna telah berulang kali mengunjungi situs Anda, dan selama kunjungannya ia menambahkan produk ke keranjang, jika Anda perlu mendapatkan tanggal untuk menambahkan produk pertama ke keranjang, dan tanggal pesanan terdekat dengan itu, gunakan jenis corong first-firstafter
.
cart %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "first-firstafter")
# A tibble: 49 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1551433754595068897 2019-04-02 2019-04-05 2 1552251706539589249 2019-05-15 2019-05-15 3 1552997205196001429 2019-05-23 2019-05-23 4 1553261825377658768 2019-04-11 2019-04-11 5 1553541720631103579 2019-04-04 2019-04-05 6 1553761108775329787 2019-04-16 2019-04-16 7 1553828761648236553 2019-04-03 2019-04-03 8 1554193975665391000 2019-04-13 2019-04-15 9 1554317571426012455 2019-04-04 2019-04-04 10 15544716161033564779 2019-04-08 2019-04-08 # ... with 39 more rows
lastbefore-firstafter
: x pertama diikuti oleh y sebelum x berikutnya. Misalnya, seorang pengguna telah berulang kali mengunjungi situs Anda, beberapa sesi diakhiri dengan pembelian. Jika Anda perlu mendapatkan tanggal sesi terakhir sebelum membeli, dan tanggal pembelian yang mengikuti, gunakan jenis corong terakhir lastbefore-firstafter
.
first_visits %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "lastbefore-firstafter")
# A tibble: 50 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1551433754595068897 2019-04-05 2019-04-05 2 1552251706539589249 2019-05-15 2019-05-15 3 1552251706539589249 2019-05-16 2019-05-16 4 1552997205196001429 2019-05-23 2019-05-23 5 1553261825377658768 2019-04-11 2019-04-11 6 1553541720631103579 2019-04-05 2019-04-05 7 1553761108775329787 2019-04-16 2019-04-16 8 1553828761648236553 2019-04-03 2019-04-03 9 1554193975665391000 2019-04-15 2019-04-15 10 1554317571426012455 2019-04-04 2019-04-04 # ... with 40 more rows
Dalam hal ini, kami menerima tabel di mana satu baris berisi tanggal produk terakhir ditambahkan ke keranjang sebelum setiap pesanan selesai, dan tanggal pesanan itu sendiri.
any-firstafter
: dapatkan semua x dan y pertama setelahnya. Misalnya, seorang pengguna telah berulang kali mengunjungi situs Anda, selama setiap kunjungan ia menambahkan berbagai produk ke keranjang dan secara berkala melakukan pemesanan dengan semua produk yang ditambahkan. Jika Anda perlu mendapatkan tanggal semua penambahan barang ke keranjang, dan tanggal pemesanan, gunakan jenis corong any-firstafter
.
cart %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "any-firstafter")
# A tibble: 239 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1551433754595068897 2019-04-02 2019-04-05 2 1551433754595068897 2019-04-02 2019-04-05 3 1551433754595068897 2019-04-03 2019-04-05 4 1551433754595068897 2019-04-03 2019-04-05 5 1551433754595068897 2019-04-03 2019-04-05 6 1551433754595068897 2019-04-05 2019-04-05 7 1551433754595068897 2019-04-05 2019-04-05 8 1551433754595068897 2019-04-05 2019-04-05 9 1551433754595068897 2019-04-05 2019-04-05 10 1551433754595068897 2019-04-05 2019-04-05 # ... with 229 more rows
- any-any: get all x dan all y di sebelah masing-masing x . Misalnya, Anda ingin menerima daftar semua kunjungan ke situs dengan semua pesanan berikutnya yang dibuat oleh setiap pengguna.
first_visits %>% after_inner_join(orders, by_user = "ym.s.clientID", by_time = "ym.s.date", type = "any-any")
# A tibble: 122 x 3 ym.s.clientID ym.s.date.x ym.s.date.y <chr> <date> <date> 1 1552251706539589249 2019-04-18 2019-05-15 2 1552251706539589249 2019-04-18 2019-05-15 3 1552251706539589249 2019-04-18 2019-05-15 4 1552251706539589249 2019-04-18 2019-05-16 5 1554193975665391000 2019-04-02 2019-04-15 6 1554193975665391000 2019-04-02 2019-04-25 7 1554317571426012455 2019-04-03 2019-04-04 8 15544716161033564779 2019-04-05 2019-04-08 9 1554648729526295287 2019-04-07 2019-04-11 10 1554722099539384487 2019-04-08 2019-04-17 # ... with 112 more rows
Langkah corong
Contoh di atas menunjukkan bekerja dengan fungsi after_inner_join()
, lebih mudah untuk menggunakannya dalam kasus di mana Anda memiliki semua peristiwa yang dipisahkan oleh tabel terpisah, dalam kasus kami sesuai dengan first_visits , keranjang dan tabel pesanan .
Tetapi Log API memberi Anda informasi tentang semua peristiwa dalam satu tabel, dan fungsi funnel_start()
dan funnel_step()
akan menjadi cara yang lebih nyaman untuk membuat urutan tindakan. funnel_start
membantu mengatur langkah pertama corong dan mengambil lima argumen:
- tbl - Tabel acara;
- moment_type - Acara pertama di corong;
- moment - Nama kolom yang berisi nama acara;
- tstamp - Nama kolom dengan tanggal acara tersebut terjadi;
- user - Nama kolom dengan pengidentifikasi pengguna.
logs_goals %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID")
# A tibble: 52 x 2 ym.s.clientID `ym.s.date_ ` <chr> <date> 1 1556018960123772801 2019-04-24 2 1561216372134023321 2019-06-22 3 1556955573636389438 2019-05-04 4 1559220890220134879 2019-05-30 5 1553261825377658768 2019-04-11 6 1561823182372545402 2019-06-29 7 1556047887455246275 2019-04-23 8 1554722099539384487 2019-04-17 9 1555420652241964245 2019-04-17 10 1553541720631103579 2019-04-05 # ... with 42 more rows
funnel_start
mengembalikan tabel dengan kolom ym.s.clientI dan ym.s.date_ ym.s.date_
(nama kolom Anda dengan tanggal, _ dan nama acara).
Langkah-langkah berikut dapat ditambahkan menggunakan fungsi funnel_step()
. Di funnel_start
kami telah menentukan pengidentifikasi semua kolom yang diperlukan, sekarang kami harus menentukan acara mana yang akan menjadi langkah berikutnya dalam corong menggunakan argumen moment_type , dan jenis koneksi adalah tipe (misalnya, "first-first"
, "first-any"
).
logs_goals %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID") %>% funnel_step(moment_type = " ", type = "first-last")
# A tibble: 319 x 3 ym.s.clientID `ym.s.date_ ` `ym.s.date_ ` <chr> <date> <date> 1 1550828847886891355 2019-04-01 NA 2 1551901759770098825 2019-04-01 NA 3 1553595703262002507 2019-04-01 NA 4 1553856088331234886 2019-04-01 NA 5 1554044683888242311 2019-04-01 NA 6 1554095525459102609 2019-04-01 NA 7 1554100987632346537 2019-04-01 NA 8 1551433754595068897 2019-04-02 2019-04-05 9 1553627918798485452 2019-04-02 NA 10 155418104743178061 2019-04-02 NA # ... with 309 more rows
Dengan funnel_step
Anda dapat membuat corong dengan sejumlah langkah apa pun. Untuk membangun corong lengkap untuk setiap pengguna, dalam contoh saya, Anda dapat menggunakan kode berikut:
Kode untuk membangun corong lengkap untuk setiap pengguna # # events - " " logs_goals <- logs_goals %>% filter(ym.s.isNewUser == 1 ) %>% mutate(events = " ") %>% bind_rows(logs_goals) # logs_goals %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID") %>% funnel_step(moment_type = " ", type = "first-last") %>% funnel_step(moment_type = " ", type = "first-last") %>% funnel_step(moment_type = " ", type = "first-last")
Dan sekarang ceri pada kue tersebut adalah summarize_funnel()
. Fungsi yang memungkinkan Anda untuk menampilkan persentase pengguna yang beralih dari langkah sebelumnya ke yang berikutnya, dan persentase pengguna yang telah melewati dari langkah pertama, ke masing-masing berikutnya.
my_funnel <- logs_goals %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID") %>% funnel_steps(moment_type = c(" ", " ", " "), type = "first-last") %>% summarize_funnel()
# A tibble: 4 x 4 moment_type nb_step pct_cumulative pct_step <fct> <dbl> <dbl> <dbl> 1 18637 1 NA 2 1589 0.0853 0.0853 3 689 0.0494 0.579 4 34 0.0370 0.749
nb_step
— , , pct_cumulative
— , pct_step
— .
my_funnel , ggplot2
.
ggplot2
— R, . , , .
ggplot2
, 2005 . , photoshop, , .
# install.packages("ggplot2") library(ggplot2) my_funnel %>% mutate(padding = (sum(my_funnel$nb_step) - nb_step) / 2) %>% gather(key = "variable", value = "val", -moment_type) %>% filter(variable %in% c("nb_step", "padding")) %>% arrange(desc(variable)) %>% mutate(moment_type = factor(moment_type, levels = c(" ", " ", " ", " "))) %>% ggplot( aes(x = moment_type) ) + geom_bar(aes(y = val, fill = variable), stat='identity', position='stack') + scale_fill_manual(values = c('coral', NA) ) + geom_text(data = my_funnel, aes(y = sum(my_funnel$nb_step) / 2, label = paste(round(round(pct_cumulative * 100,2)), '%')), colour='tomato4', fontface = "bold") + coord_flip() + theme(legend.position = 'none') + labs(x='moment', y='volume')
:

.
- my_funnel .
ggplot
— , , , X moment_type .geom_bar
— — , aes
.scale_fill_manual
— , , .geom_text
— , % .coord_flip
— , .theme
— : , .. .labs
— .
, , , , .
lapply
, R. , , bind_rows
.
# first_visits <- rename(first_visits, firstSource = ym.s.lastTrafficSource) # logs_goals <- select(first_visits, ym.s.clientID, firstSource) %>% left_join(logs_goals, ., by = "ym.s.clientID") # my_multi_funnel <- lapply(c("ad", "organic", "direct"), function(source) { logs_goals %>% filter(firstSource == source) %>% select(events, ym.s.clientID, ym.s.date) %>% funnel_start(moment_type = " ", moment = "events", tstamp = "ym.s.date", user = "ym.s.clientID") %>% funnel_steps(moment_type = c(" ", " ", " "), type = "first-last") %>% summarize_funnel() %>% mutate(firstSource = source) }) %>% bind_rows() #
# A tibble: 12 x 5 moment_type nb_step pct_cumulative pct_step firstSource <fct> <int> <dbl> <dbl> <chr> 1 14392 1 NA ad 2 154 0.0107 0.0107 ad 3 63 0.00438 0.409 ad 4 14 0.000973 0.222 ad 5 3372 1 NA organic 6 68 0.0202 0.0202 organic 7 37 0.0110 0.544 organic 8 13 0.00386 0.351 organic 9 607 1 NA direct 10 49 0.0807 0.0807 direct 11 21 0.0346 0.429 direct 12 8 0.0132 0.381 direct
my_multi_funnel , .
# my_multi_funnel %>% mutate(padding = ( 1 - pct_cumulative) / 2 ) %>% gather(key = "variable", value = "val", -moment_type, -firstSource) %>% filter(variable %in% c("pct_cumulative", "padding")) %>% arrange(desc(variable)) %>% mutate(moment_type = factor(moment_type, levels = c(" ", " ", " ", " ")), variable = factor(variable, levels = c("pct_cumulative", "padding"))) %>% ggplot( aes(x = moment_type) ) + geom_bar(aes(y = val, fill = variable), stat='identity', position='stack') + scale_fill_manual(values = c('coral', NA) ) + geom_text(data = my_multi_funnel_df, aes(y = 1 / 2, label =paste(round(round(pct_cumulative * 100, 2)), '%')), colour='tomato4', fontface = "bold") + coord_flip() + theme(legend.position = 'none') + labs(x='moment', y='volume') + facet_grid(. ~ firstSource)
:

?
first_visits
ym.s.lastTrafficSource
firstSource
.left_join
ym.s.clientID . firstSource
.lapply
ad, organic direct. bind_rows
.facet_grid(. ~ firstSource)
, firstSource
.
PS
. PS , R. R4marketing , R .
:
Kesimpulan
, , R :
- .;
- R RStudio;
rym
, funneljoin
ggplot2
;rym
rym_get_logs()
.;funneljoin
.ggplot2
.
, Logs API , : CRM, 1 . , : , -.