На конференциях только и разговоров, что об омниканальном маркетинге. Правда, до реальных данных редко когда доходит: слишком сложно идентифицировать одного и того же покупателя в разных каналах. Поэтому мы разработали свой алгоритм R46 Identifier (читайте статью) — он помогает получить самые точные данные о поведении покупателей в омниканальном ритейле.
Прежде, чем внедрять омниченнел-подход в маркетинг, нужно понять ценность мультиченнела в целом — измерить, сколько у вас клиентов, использующих несколько каналов (кросс-девайсные пользователи), и насколько эти клиенты влияют на метрики.
Для примера разберем поведение покупателей реального ритейлера, у которого есть сайт, мобильные приложения, розничная сеть и инфокиоски в точках продаж.
На первый взгляд
Возьмем поведенческую историю за последние 7 дней — доля пользователей, посещавших ритейлера с более, чем одного устройства:
Здесь и далее вы можете пропускать куски кода, если они вам неинтересны.
data = EventCl.where(shop_id: shop.id).where('date >= ?', date).pluck(:client_id, :stream).uniq; nil
users = {}
data.each do |row|
users[row[0]] = [] unless users.key?(row[0])
users[row[0]] << row[1]
end; nil
total = users.keys.count
more_than_1_devices = users.select { |k, v| v.count > 1 }.count
share = more_than_1_devices.to_f / total.to_f * 100
puts "Visitors: #{ helper.number_with_delimiter total }"
puts "More than 1 devices: #{ helper.number_with_delimiter more_than_1_devices }"
puts "Share: #{ helper.number_to_percentage share, precision: 2 }"
Результат:
Visitors: 619,131
More than 1 devices: 8,813
Share: 1.42%
На первый взгляд ответ очевиден: слишком малая доля кросс-девайсных пользователей, чтобы обращать на них внимание. Но что будет, если мы посмотрим только покупателей?
data = EventCl.where(shop_id: shop.id).where('date >= ?', date).where(client_id: EventCl.select(:client_id).where(shop_id: shop.id).where('date >= ?', date).where(event: 'purchase')).pluck(:client_id, :stream).uniq; nil
users = {}
data.each do |row|
users[row[0]] = [] unless users.key?(row[0])
users[row[0]] << row[1]
end; nil
total = users.keys.count
more_than_1_devices = users.select { |k, v| v.count > 1 }.count
share = more_than_1_devices.to_f / total.to_f * 100
puts "Purchasers: #{ helper.number_with_delimiter total }"
puts "More than 1 devices: #{ helper.number_with_delimiter more_than_1_devices }"
puts "Share: #{ helper.number_to_percentage share, precision: 2 }"
Результат:
Purchasers: 19,262
More than 1 devices: 2,223
Share: 11.54%
Как видим, кросс-девайс среди покупателей в 8 раз более востребован, чем среди обычных посетителей. Уже что-то интересное.
А если взять данные за год?
date = 1.year.go.to_date
data = EventCl.where(shop_id: shop.id).where('date >= ?', date).where(client_id: EventCl.select(:client_id).where(shop_id: shop.id).where('date >= ?', date).where(event: 'purchase')).pluck(:client_id, :stream).uniq; nil
users = {}
data.each do |row|
users[row[0]] = [] unless users.key?(row[0])
users[row[0]] << row[1]
end; nil
total = users.keys.count
more_than_1_devices = users.select { |k, v| v.count > 1 }.count
share = more_than_1_devices.to_f / total.to_f * 100
puts "Purchasers: #{ helper.number_with_delimiter total }"
puts "More than 1 devices: #{ helper.number_with_delimiter more_than_1_devices }"
puts "Share: #{ helper.number_to_percentage share, precision: 2 }"
Получаем еще более значимые результаты:
Purchasers: 289,401
More than 1 devices: 55,672
Share: 19.24%
Любопытства ради посмотрим, сколько покупателей пользуется тремя и более устройствами:
more_than_2_devices = users.select { |k, v| v.count > 2 }.count
share = more_than_2_devices.to_f / total.to_f * 100
puts "Purchasers: #{ helper.number_with_delimiter total }"
puts "More than 2 devices: #{ helper.number_with_delimiter more_than_2_devices }"
puts "Share: #{ helper.number_to_percentage share, precision: 2 }"
Результат:
Purchasers: 289,401
More than 2 devices: 431
Share: 0.15%
Да, этим кейсом можно пренебречь.
RFM
Теперь посмотрим, какую роль играют кросс-девайсные покупатели в RFM-сегментах:
cross_devicers = users.select { |k, v| v.count > 1 }.keys; nil
rfm_segments = shop.segments.where(segment_type: Segment::TYPE_RFM); nil
by_segments = Hash[rfm_segments.pluck(:id).map { |s| [s, []] }]; nil
cross_devicers.each do |client_id|
segment_ids = SegmentJoin.where(join_id: client_id, segment_id: by_segments.keys).pluck(:segment_id)
segment_ids.each do |id|
by_segments[id] << client_id
end
end; nil
by_segments.sort_by { |k, v| v.count }.reverse.each do |row|
count_in_segment = row[1].count
share = count_in_segment.to_f / more_than_1_devices.to_f * 100
puts "Segment '#{Segment.find(row[0]).name}': #{helper.number_to_percentage share, precision: 2}%"
end; nil
Результат:
Segment 'POTENTIAL_LOYALIST': 27.20%
Segment 'LOYAL_CUSTOMERS': 12.10%
Segment 'PROMISING': 9.77%
Segment 'ABOUT_TO_SLEEP': 9.58%
Segment 'RECENT_CUSTOMERS': 9.34%
Segment 'CHAMPIONS': 8.14%
Segment 'LOST': 1.73%
Segment 'ATTENTION_NEEDED': 1.00%
Segment 'HIBERNATING': 0.31%
Segment 'AT_RISK': 0.21%
Segment 'CANT_LOSE_THEM': 0.06%
Видно, что довольно много кросс-девайсных юзеров присутствуют в самых ценных сегментах RFM.
Средний чек
Зависит ли средний чек от количества устройств, с которых лояльный клиент делает покупки? Из расчета исключаем отмененные и возвращенные заказы. Берем заказы за последние 6 месяцев.
single_devicers = users.select { |k, v| v.count == 1 }.keys; nil
cross_devicers = users.select { |k, v| v.count > 1 }.keys; nil
single_devicers_orders = []
cross_devicers_orders = []
single_devicers.each_slice(500) do |ids|
single_devicers_orders += Order.where(shop_id: shop.id).where('date >= ?', date).where(client_id: ids).where('status != 2').pluck(:value)
end; nil
cross_devicers.each_slice(500) do |ids|
cross_devicers_orders += Order.where(shop_id: shop.id).where('date >= ?', date).where(client_id: ids).where('status != 2').pluck(:value)
end; nil
puts "Single device AOV: #{single_devicers_orders.sum.to_i / single_devicers_orders.count}"
puts "Cross device AOV: #{cross_devicers_orders.sum.to_i / cross_devicers_orders.count}"
Результат:
Single device AOV: 1612
Cross device AOV: 1603
Как видно, не зависит. В данном конкретном магазине. Возможно, в других магазинах по-другому. Это мы посмотрим в одном из будущих исследований.
LTV
Сейчас принято много говорить об LTV. Оценим эту метрику для пользователей с одним и несколькими устройствами. Берем заказы за последние 6 месяцев:
ltv_single = []
ltv_cross = []
single_devicers.each do |id|
ltv_single << Order.where(shop_id: shop.id).where('only_date >= ?', 6.month.ago.to_date).where(client_id: id).where('status != 2').pluck(:value).sum.to_i
end; nil
cross_devicers.each do |id|
ltv_cross << Order.where(shop_id: shop.id).where('only_date >= ?', 6.month.ago.to_date).where(client_id: id).where('status != 2').pluck(:value).sum.to_i
end; nil
puts "LTV one device: #{ltv_single.sum / ltv_single.count}"
puts "LTV cross device: #{ltv_cross.sum / ltv_cross.count}"
Результаты:
LTV one device: 6023
LTV cross device: 9455
Ожидаемо. Но попробуем взять заказы за 12 месяцев:
LTV one device: 7461
LTV cross device: 11799
Интересно. Получается, что lifetime кросс-девайсных клиентов больше, чем тех, кто покупает с одного устройства.
Выводы
Используя живые данные, полученные с помощью алгоритма R46 Identifier, мы подтвердили, что омниканальность действительно важна для бизнеса. При этом числа показывают, что кросс-девайсные покупатели являются наиболее активной частью аудитории и их LTV почти в два раза выше клиентов с одним устройством.
Конечно, не стоит путать причину и следствие. Лояльные клиенты, будучи лояльными, начинают делать покупки с нескольких устройств. А не наличие нескольких каналов продаж делает из них лояльных клиентов (хотя это тоже влияет, но уже в области user experience).
Интересно?
Пишите нам, если хотите больше таких исследований. Присылайте идеи исследований и мы заглянем в наши базы.
Если вы профессионал в постановке гипотез и проведении исследований и хотите анализировать наши данные, приходите к нам работать. Вместе мы будем создавать подобные материалы из данных, которых больше ни у кого нет. Пишите на mk@rees46.com