بناء مسارات تحويل السلوك في لغة R ، بناءً على البيانات التي تم الحصول عليها من واجهة برمجة تطبيقات سجلات Yandex.Metrica

يعد تحليل مسار المبيعات مهمة نموذجية للتسويق عبر الإنترنت ، وخاصة التجارة الإلكترونية. مع مساعدتها يمكنك:


  • معرفة أي من الخطوات لشراء كنت تفقد العملاء المحتملين.
  • لمحاكاة حجم تدفق الإيرادات الإضافية ، في حالة التوسع في كل خطوة على طريق الشراء.
  • تقييم جودة حركة المرور التي تم شراؤها على منصات الإعلان المختلفة.
  • تقييم جودة معالجة الطلبات الواردة لكل مدير.

في هذه المقالة ، سأتحدث عن كيفية طلب البيانات من واجهة برمجة التطبيقات لسجلات Yandex Metrics Logs بلغة R ، وإنشاء وتصور قمع بناءً عليها.


واحدة من المزايا الرئيسية للغة R هي وجود عدد كبير من الحزم التي تعمل على توسيع وظائفها الأساسية. في هذه المقالة ، سوف نلقي نظرة على ggplot2 و ggplot2 و ggplot2 .


باستخدام rym نقوم بتحميل البيانات من API Logs ، ونستخدم funneljoin لبناء قمع سلوكي ، واستخدام ggplot2 لتصور النتيجة.


صورة


محتوى



طلب البيانات من سجلات API ياندكس المقاييس


من لا يعرف ما هي واجهة برمجة تطبيقات Logs هنا هو اقتباس من مساعدة Yandex الرسمية.


تسمح لك Logs API بتلقي بيانات غير مجمعة تم جمعها بواسطة Yandex.Metrica. واجهة برمجة التطبيقات هذه مخصصة لمستخدمي الخدمة الذين يرغبون في معالجة البيانات الإحصائية بشكل مستقل واستخدامها لحل المشكلات التحليلية الفريدة.

للعمل مع Yandex.Metrica Logs API في R ، سوف نستخدم حزمة rym .



حزمة rym - R وهي واجهة للتفاعل مع Yandex Metrica API. يتيح لك العمل مع API Management و API Reporting و Gore API المتوافق مع Google Analytics v3 و Logs API .


تثبيت حزمة ريم


للعمل مع أي حزمة في R ، يجب أولاً تثبيتها وتنزيلها. قم بتثبيت حزمة بمجرد استخدام الأمر install.packages() . من الضروري توصيل الحزمة في كل جلسة عمل جديدة في R باستخدام دالة library() .


لتثبيت حزمة rym وتوصيلها rym استخدم الكود التالي:


 install.packages("rym") library(rym) 

العمل مع Logs API Yandex Metrics باستخدام حزمة rym


لبناء مسارات تحويل سلوكية ، نحتاج إلى تنزيل جدول بجميع الزيارات التي تمت على موقعك ، وإعداد البيانات لمزيد من التحليل.


إذن في واجهة برمجة تطبيقات Yandex Metrics


العمل مع API يبدأ بترخيص. في حزمة rym تتم عملية الترخيص تلقائيًا جزئيًا وتبدأ عند استدعاء أي من وظائفها.


في المرة الأولى التي تدخل فيها إلى واجهة برمجة التطبيقات ، ستتم إعادة توجيهك إلى المتصفح لتأكيد الإذن للوصول إلى مقاييس Yandex الخاصة بك لحزمة rym . بعد التأكيد ، سيتم إعادة توجيهك إلى الصفحة حيث سيتم إنشاء رمز تأكيد التفويض لك. يجب نسخها ولصقها في وحدة التحكم R كاستجابة لطلب "Enter authorize code:" .


بعد ذلك ، يمكنك حفظ بيانات الاعتماد في ملف محلي عن طريق الإجابة على y أو yes على الطلب "Do you want save API credential in local file ..." . في هذه الحالة ، في المكالمات التالية إلى واجهة برمجة التطبيقات ، لن تحتاج إلى إعادة المصادقة من خلال المتصفح ، وسيتم تحميل بيانات الاعتماد من الملف المحلي.


طلب بيانات من Yandex Metrica API


أول ما نطلبه من واجهة برمجة تطبيقات Yandex Metrics هو قائمة بالعدادات المتاحة والأهداف التي تم تكوينها. يتم ذلك باستخدام rym_get_counters() و rym_get_goals() .


 #   library(rym) #    counters <- rym_get_counters(login = " ") #    goals <- rym_get_goals("0000000", #    login = " ") 

باستخدام مثال التعليمة البرمجية أعلاه ، استبدل " " باسم مستخدم Yandex ، والذي تتوفر بموجبه مقاييس Yandex التي تحتاجها. و "0000000" إلى عدد العداد الذي تحتاجه. يمكنك مشاهدة أرقام العدادات المتاحة لك في جدول العدادات المحملة.


جدول العدادات المتوفرة - العدادات بالشكل التالي:


 # 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 

يعرض حقل المعرف أرقام جميع عدادات قياس Yandex المتاحة.


جدول الأهداف كما يلي:


 # 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 

أي في العداد الذي أعمل به ، يتم تكوين الإجراءات التالية:


  • اذهب إلى السلة
  • الذهاب إلى الدفع
  • شكرا لك صفحة للطلب
  • انقر على زر الهاتف

في المستقبل ، لتحويل البيانات ، سوف نستخدم الحزم المضمنة في مكتبة tidyr : tidyr ، dplyr . لذلك ، قبل استخدام مثال التعليمة البرمجية التالي ، قم بتثبيت هذه الحزم وتوصيلها ، أو مكتبة tidyverse بأكملها.


 # install.packages("tidyverse") # library(tidyverse) install.packages(c("dplyr", "tidyr")) library(dplyr) library(tidyr) 

تتيح لك وظيفة rym_get_logs() طلب البيانات من مقاييس واجهة برمجة تطبيقات سجلات سجلات Yandex.


 #      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)) 

الوسائط rym_get_logs() :


  • رقم العداد الذي تطلب منه السجلات ؛
  • date.from - تاريخ البدء ؛
  • تاريخ.
  • الحقول - قائمة الحقول التي تريد تحميلها ؛
  • تسجيل الدخول - تسجيل الدخول Yandex الذي بموجبه العداد المحدد في العداد هو متاح.

وبالتالي ، طلبنا زيارة بيانات من API Logs التي تحتوي على الأعمدة التالية:


  • ym: s: visitID - معرف الزيارة
  • ym: s: clientID - معرف المستخدم على الموقع
  • ym: s: date - تاريخ الزيارة
  • ym: s: goalID - تحديد الأهداف التي تم تحقيقها خلال هذه الزيارة
  • ym: s: lastTrafficSource - مصدر حركة المرور
  • ym: s: isNewUser - أول زيارة للزائر

للحصول على قائمة كاملة بالمجالات المتاحة ، انظر تعليمات API الخاصة بالسجلات.

البيانات التي تم تلقيها كافية لنا لإنشاء مسار ، في اتصال مع الانتهاء من العمل مع API Logs ، ونحن ننتقل إلى الخطوة التالية - مرحلة ما بعد معالجة البيانات التي تم تنزيلها.


قمع بناء funneljoin الحزمة


يتم الحصول على جزء كبير من المعلومات الواردة في هذا القسم من حزمة funneljoin README ، المتاحة بالرجوع إليها .

هدف funneljoin هو تبسيط تحليل قمع سلوك المستخدم. على سبيل المثال ، تتمثل مهمتك في العثور على الأشخاص الذين زاروا موقعك ثم قاموا بالتسجيل ، ومعرفة مقدار الوقت الذي مر بين الزيارة الأولى والتسجيل. أو تحتاج إلى العثور على المستخدمين الذين شاهدوا بطاقة المنتج وإضافتها إلى السلة في غضون يومين. funneljoin حزمة after_join() على حل هذه المشكلات.


وسيطات after_join() :


  • س - مجموعة من البيانات التي تحتوي على معلومات حول الانتهاء من الحدث الأول (في المثال الأول ، زيارة الموقع ، في الثانية عرض بطاقة المنتج)
  • y - مجموعة بيانات تحتوي على معلومات حول إتمام الحدث الثاني (في المثال الأول للتسجيل ، في الثاني إضافة المنتج إلى السلة).
  • by_time - عمود يحتوي على معلومات حول تاريخ وقوع الأحداث في الجدولين x و y .
  • by_user - عمود مع معرّفات المستخدم في الجدولين x و y .
  • الوضع - الطريقة المستخدمة للاتصال: "داخلي" ، "ممتلئ" ، "مضاد" ، "شبه" ، "يمين" ، "يسار". بدلاً من ذلك ، يمكنك أيضًا استخدام after_mode_join (على سبيل المثال ، after_inner_join بدلاً من after_join (..., mode = "inner") ).
  • النوع - نوع التسلسل المستخدم لتعريف أزواج الأحداث ، مثل "الأول - الأول" ، "الأخير - الأول" ، "أي أول حرف". تم توضيح المزيد من التفاصيل في قسم "أنواع التحويل".
  • max_gap / min_gap (اختياري) - التصفية بحسب الحد الأقصى والحد الأدنى من الوقت بين الحدثين الأول والثاني.
  • gap_col (اختياري) - ما إذا كنت تريد إرجاع عمود .gap رقمي مع فارق التوقيت بين الأحداث. الافتراضي هو FALSE.

تثبيت funneljoin


في وقت كتابة هذا التقرير ، funneljoin يتم نشر حزمة funneljoin على CRAN ، لذلك يمكنك تثبيتها من GitHub. لتثبيت الحزم من GitHub ، ستحتاج إلى حزمة إضافية - devtools .


 install.packages("devtools") devtools::install_github("robinsones/funneljoin") 

معالجة نتائج البيانات المستلمة من API Logs


لدراسة أكثر تفصيلاً عن وظيفة إنشاء القمع ، نحتاج إلى نقل البيانات التي تم الحصول عليها من API Logs إلى النموذج المطلوب. الطريقة الأكثر ملاءمة لمعالجة البيانات ، كما كتبت أعلاه ، يتم توفيرها بواسطة dplyr و dplyr .


للبدء ، قم بما يلي:


  1. في هذه الحالة ، يحتوي صف واحد من جدول السجلات على معلومات حول زيارة واحدة ، والعمود ym.s.goalsID عبارة عن صفيف من النموذج - [0,1,0,...] ، والذي يحتوي على معرفات الأهداف التي تم تحقيقها أثناء هذه الزيارة. من أجل إحضار الصفيف إلى نموذج مناسب لمزيد من العمل ، من الضروري إزالة أحرف إضافية منه ، في أقواس مربعة لدينا.
  2. من الضروري إعادة تهيئة الجدول بحيث يحتوي سطر واحد على معلومات حول هدف واحد تم تحقيقه أثناء الزيارة. أي إذا تم تحقيق ثلاثة أهداف خلال زيارة واحدة ، فسيتم تقسيم هذه الزيارة إلى ثلاثة صفوف ، وسيحتوي كل صف في عمود ym.s.goalsID على معرف هدف واحد فقط.
  3. أرفق جدولًا يحتوي على قائمة بالأهداف بجدول السجل لفهم الأهداف التي تحققت تمامًا أثناء كل زيارة.
  4. إعادة تسمية عمود الاسم بأسماء الأهداف إلى الأحداث .

يتم تنفيذ جميع الإجراءات المذكورة أعلاه باستخدام الكود التالي:


كود المعالجة التالية للبيانات المستلمة من API Logs
 #      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 

شرح صغير للكود. يُطلق على عامل التشغيل %>% خط أنابيب ، ويجعل الكود أكثر قابلية للقراءة وصغراً. في الواقع ، يأخذ نتيجة تنفيذ وظيفة واحدة ويمررها كوسيطة أولى إلى الوظيفة التالية. وبالتالي ، يتم الحصول على نوع من الناقل ، والذي يسمح لك بعدم انسداد ذاكرة الوصول العشوائي مع المتغيرات الزائدة التي تخزن نتائج وسيطة.


تعمل الدالة str_replace_all على إزالة الأقواس المربعة في عمود ym.s.goalsID . str_split بتقسيم معرفات الهدف من عمود ym.s.goalsID إلى قيم منفصلة ، unnest إلى صفوف منفصلة ، مكررة قيم جميع الأعمدة الأخرى.


باستخدام mutate نحن يلقي معرفات الهدف لنوع صحيح.


left_join جدول الأهداف بالنتيجة ، والذي يخزن معلومات حول الأهداف التي تم تكوينها. باستخدام عمود ym.s.goalsID من الجدول الحالي وعمود المعرف من جدول الأهداف كمفتاح.


أخيرًا ، تقوم وظيفة إعادة التسمية rename تسمية عمود الاسم إلى الأحداث .


أصبح الآن لجدول logs_goals المظهر الضروري لمزيد من العمل.


بعد ذلك ، قم بإنشاء ثلاثة جداول جديدة:


  • first_visits - تواريخ الجلسات الأولى لجميع المستخدمين الجدد
  • عربة - تواريخ إضافة المنتجات إلى السلة
  • أوامر - أوامر

رمز إنشاء الجدول
 #      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) 

كل جدول جديد هو نتيجة تصفية جدول logs_goals الرئيسي الذي تم الحصول عليه في الخطوة الأخيرة. يتم تنفيذ filter بواسطة وظيفة filter .


لإنشاء مسارات تحويل ، يكفي أن نترك معلومات حول معرف المستخدم وتاريخ الحدث ، اللذين يتم تخزينهما في عمودي ym.s.clientID و ym.s.date ، في الجداول الجديدة. تم اختيار الأعمدة المطلوبة باستخدام وظيفة select .


أنواع القمع


تقبل وسيطة type أي مجموعة من lastbefore first last ، last ، last first last ، firstafter . فيما يلي مثال على أكثر المجموعات فائدة التي يمكنك استخدامها:


  • first-first : احصل على أقرب أحداث x و y لكل مستخدم. على سبيل المثال ، نريد الحصول على تاريخ الزيارة الأولى وتاريخ الشراء الأول ، وفي هذه الحالة استخدم نوع التحويل 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 

حصلنا على جدول يحتوي على سطر واحد يحتوي على بيانات عن تاريخ أول زيارة للمستخدم للموقع وتاريخ أول طلب له.


  • first-firstafter : احصل على أقرب x ، ثم حدث y الأول بعد x الأول. على سبيل المثال ، قام المستخدم بزيارة موقعك مرارًا وتكرارًا ، وأثناء قيامه بإضافة منتجات إلى السلة ، إذا كنت بحاجة إلى الحصول على تاريخ إضافة المنتج الأول إلى السلة ، وتاريخ الطلب الأقرب إليه ، استخدم نوع مسار التحويل 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 متبوعاً بـ y قبل x التالي. على سبيل المثال ، قام أحد المستخدمين بزيارة موقعك بشكل متكرر ، وانتهت بعض الجلسات بالشراء. إذا كنت بحاجة إلى الحصول على تاريخ آخر جلسة قبل الشراء ، وتاريخ الشراء الذي تلا ذلك ، استخدم نوع القمع 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 

في هذه الحالة ، تلقينا جدولًا يحتوي فيه سطر واحد على تاريخ إضافة آخر منتج إلى السلة قبل اكتمال كل طلب ، وتاريخ الطلب نفسه.


  • any-firstafter : احصل على كل x والأول y بعد ذلك. على سبيل المثال ، قام المستخدم بزيارة موقعك مرارًا وتكرارًا ، وأثناء كل زيارة قام بإضافة منتجات متنوعة إلى السلة وأصدر طلبات دورية مع جميع المنتجات المضافة. إذا كنت بحاجة إلى الحصول على تواريخ جميع الإضافات للسلع إلى السلة ، وتواريخ الطلب ، فاستخدم نوع التحويل في 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: احصل على كل x وكل y بجانب كل x . على سبيل المثال ، تريد تلقي قائمة بجميع الزيارات إلى الموقع مع جميع الطلبات اللاحقة التي قدمها كل مستخدم.

 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 

خطوات القمع


توضح الأمثلة أعلاه العمل مع after_inner_join() ، فمن الملائم استخدامها في الحالات التي تكون فيها كل الأحداث مفصولة بجداول منفصلة ، في حالتنا وفقًا لجداول الزيارات والعربة الأولى .


لكن API Logs يمنحك معلومات حول جميع الأحداث في جدول واحد ، funnel_start() و funnel_step() طريقة أكثر ملاءمة لإنشاء سلسلة من الإجراءات. funnel_start يساعد في تعيين الخطوة الأولى من المسار ويأخذ خمس وسائط:


  • الجدول - الجدول.
  • moment_type - الحدث الأول في القمع ؛
  • لحظة - اسم العمود الذي يحتوي على اسم الحدث ؛
  • tstamp - اسم العمود مع تاريخ وقوع الحدث ؛
  • المستخدم - اسم العمود مع معرّفات المستخدم.

 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 جدولًا يحتوي على عمود ym.s.clientI وعمود ym.s.date_ ym.s.date_ (اسم العمود الخاص بك مع التاريخ ، _ واسم الحدث).


يمكن إضافة الخطوات التالية باستخدام الدالة funnel_step() . في funnel_start حددنا بالفعل معرفات جميع الأعمدة المطلوبة ، والآن نحتاج إلى تحديد الحدث الذي سيكون الخطوة التالية في مسار التحويل باستخدام وسيطة moment_type ، ونوع الاتصال هو type (على سبيل المثال ، "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 

باستخدام funnel_step يمكنك إنشاء مسارات تحويل مع أي عدد من الخطوات. لإنشاء مسار كامل لكل مستخدم ، على سبيل المثال ، يمكنك استخدام التعليمات البرمجية التالية:


رمز لبناء قمع كامل لكل مستخدم
 #         #     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") 

والآن الكرز على الكعكة هو summarize_funnel() . وظيفة تسمح لك بعرض النسبة المئوية للمستخدمين الذين انتقلوا من الخطوة السابقة إلى الخطوة التالية ، والنسبة المئوية للمستخدمين الذين انتقلوا من الخطوة الأولى ، إلى كل خطوة لاحقة.


 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') 

:



.


  1. my_funnel .
  2. ggplot — , , , X moment_type .
  3. geom_bar — — , aes .
  4. scale_fill_manual — , , .
  5. geom_text — , % .
  6. coord_flip — , .
  7. theme — : , .. .
  8. 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) 

:


?


  1. first_visits ym.s.lastTrafficSource firstSource .
  2. left_join ym.s.clientID . firstSource .
  3. lapply ad, organic direct. bind_rows .
  4. facet_grid(. ~ firstSource) , firstSource .

PS


. PS , R. R4marketing , R .


:


  • ;
  • ;
  • ;
  • R.

استنتاج


, , R :


  1. .;
  2. R RStudio;
  3. rym , funneljoin ggplot2 ;
  4. rym rym_get_logs() .;
  5. funneljoin .
  6. ggplot2 .

, Logs API , : CRM, 1 . , : , -.

Source: https://habr.com/ru/post/ar462279/


All Articles