Петр работает аналитиком в федеральной компании, которая производит продукты и напитки.

Задача Петра — анализировать продажи и докладывать руководству, сколько денег заработала компания. Петру со школы нравятся цифры и графики, но иногда работа выводит его из себя.

Например, составлять отчеты о торговых точках — работа для сильных духом. В базе торговых точек полно дублей, из-за дублей невозможно посчитать реальные продажи, размер клиентской базы, эффективность торговых представителей.

В базе плодятся дубли, потому что не существует общепринятых надежных способов идентифицировать торговую точку.

Человек поймет, что «Тысяча мелочей» и «Магазин у дома „Тысяча мелочей“ НЕТ ДОГОВОРА» в базе данных — это одна и та же торговая точка. Хотя названия сильно отличаются.

При этом «Аптека № 5» и «Аптека № 6» — разные торговые точки, хоть названия очень похожи.

А вот научить этому условный Excel сложно.

Поскольку однозначного идентификатора нет, отличить одну точку от другой бывает сложно. Так в базе и появляются дубли, которые портят статистику. А от статистики зависит планирование дистрибьюции, продаж и вообще вся аналитика производителя.

Вычищать дубли из базы руками — адский труд. Нужно понимать, что компания Петра продает товары через 250 тысяч магазинов. Можно нанимать операторов, но они все равно ошибаются. Как находить дубли автоматически, непонятно.

В минуты слабости Петр машет на все рукой и принимает, что дублей в базе нет (хоть и знает, что есть).

И Петр не единственный бедолага — о дублях торговых точек знает любой производитель и дистрибьютор товаров повседневного спроса. Поэтому мы задумались, как облегчать жизнь многочисленных аналитиков.

В базах торговых точек часто бардак

Производители товаров широкого потребления не работают с покупателями напрямую. Цепочка сбыта выглядит так: производитель → дистрибьютор → торговая точка → покупатель.

И дистрибьюторы, и производители анализируют продажи в разрезе торговых точек:

  • оценивают размер клиентской базы;
  • прогнозируют спрос и продажи;
  • проверяют эффективность работы торговых представителей.

Для точных отчетов нужно навести порядок в базе торговых точек. А там, как мы уже знаем, полно дублей. Вот как они появляются:

  • торговая точка меняет название, и в базе заводят новую запись. Старая, естественно, остается;
  • несколько дистрибьюторов работают с одной торговой точкой по разным товарам, и для производителя она существует в разных экземплярах;
  • производитель меняет дистрибьютора, и торговые точки задваиваются. Потому что новый дистрибьютор хранит их в базе иначе, чем старый;
  • люди, которые ведут базу торговых точек, ошибаются и по-разному записывают названия.

Оператор под диктовку с телефона записывает в базу магазин «Боярин». Откуда ему знать, что следовало бы «БояринЪ».

Не «схлопнув» дубли, не посчитать статистику

Если не вычистить из базы торговых точек дубли, вместо аналитики и прогнозирования выйдет ерунда.

План продаж нереален. Невозможно составить прогноз, если неизвестно, сколько точек будут продавать товары.

Дистрибьюторы выгрузили торговые точки, производитель объединил их в базу, получилось 700 штук. Под это количество производитель верстает план продаж.

Отчетный период заканчивается, приходит аналитика и выясняется неприятное: продажи не соответствуют предположениям. Все гораздо хуже, чем ожидали.

Производитель разбирается и обнаруживает: из 700 точек, которые выгрузили дистрибьюторы, 200 — дубли. Реальных магазинов всего 500, а этого мало.

Знай производитель о дублях заранее, он:

  • составит адекватный план продаж;
  • сократит число торговых представителей, если для реальной клиентской базы их слишком много;
  • расширит клиентскую базу, найдя новые торговые точки.

Эффективность торговых точек неизвестна. Дистрибьюторы не знают, сколько товара кому отгружать. В одних торговых точках полки пустые, другие постоянно возвращают просрочку.

С трейд-маркетинговыми акциями тоже неразбериха. Например, по условиям акции точка закупает столько-то товара и получает бонус. Некий магазин выполняет условия, получает профит и все как будто довольны. Но в базе о магазине вместо одной записи три. В итоге производитель выдает бонус в тройном размере.

Торговые представители неэффективны. Дело торгпредов — гонять между торговыми точками по точным маршрутам. Но когда в базе куча дублей, маршруты превращаются в вермишель.

Руководитель думает, что на маршруте торгпреда 50 торговых точек, этого достаточно. На самом деле уникальных точек не 50, а 30 и торгпред работает вполноги. По-хорошему ему нужно бы отсыпать точек на маршрут, и щедро.

Хитрые торгпреды не рассказывают о проблемах, потому что с дублями легче выполнять дневную норму посещений.

Как «схлопывать» дубли, неясно — у торговых точек нет надежного идентификатора

Как очистить базу от дублей, сходу непонятно. Непонятно даже, на какие параметры смотреть, чтобы сопоставить торговые точки.

Пока мы думали, как помочь Петру справиться с дублями, перебрали несколько вариантов идентификации.

ИНН. Едва ли не самый бесполезный параметр для нашей задачи.

У одного юрлица может быть десяток магазинов с разными названиями. Объединим их по совпадению ИНН — получим десяток ложных дублей.

Бывает и наоборот — магазин в течение даже одного года успевает сменить юрлицо или ИП. Не меняя при этом торгового названия.

По названию торговой точки также невозможно уверенно восстановить реквизиты юрлица — обычно и название, и адрес отличаются от указанных в ЕГРЮЛ.

Название. Полезно только как вспомогательный параметр, потому что названия в документах и базах данных все пишут по-разному.

Один и тот же магазин «БояринЪ» запишут как «Боярин», «Бояринъ», «Баярин», «Баяринъ», «Супермаркет Боярин», «Мини-маркет Баяринъ» и еще десятком способов.

Адрес. Ситуация та же, что с названием, только хуже. Хотя есть стандарты Почты России, адреса все равно пишут как удобно, а не как положено.

Возьмем одну-единственную деталь адреса — слово «бульвар». Люди пишут и «бул.», и «б.», и «б-р», и «бульвар». А ты сиди и думай, об одном адресе идет речь или о разных.

Или вот один и тот же адрес:

  • 620026, Свердловская область, Екатеринбург, улица Луначарского, 210в;
  • Екб, Луначарского 210в;
  • 620026, Ебург, Луначарского — 210-в.

И мы даже не говорим о действительно сложных случаях с адресами (писали о них на «Хабре»).

Координаты. Сначала показалось, что это более или менее рабочий идентификатор. Но потом мы столкнулись с проблемами:

  • если координат нет в базе, их все равно придется определять по адресу. Далеко не всегда это можно сделать уверенно, а по ненадежным характеристикам и сравнивать нет смысла;
  • в пределах длинных домов координаты иногда отличаются так сильно, что адрес становится более надежным критерием.

Получается, что в среднем идентифицировать торговые точки по координатам не более надёжно, чем по адресам.

«Дадата» наводит порядок в базе данных

Перепробовав разное и поразмыслив, мы научили «Дадату» находить дубли торговых точек по паре «название + адрес».

Вооружившись «Дадатой», вот как Петр чистит базу данных перед отчетами и прочей аналитикой.

Выгружает в excel-файл новые магазины, которые появились в учетной системе производителя. В таблице три столбца: «ID», «Название» и «Адрес».

«Дадата» принимает данные в excel-файлах
Если в базе торговых точек есть телефон — тоже пригодится

Загружает excel-файл в «Дадату», она отмечает одинаковые торговые точки. В таблицу с результатом проверки сервис вставляет два листа.

На первом одинаковые торговые точки сгруппированы и подсвечены.

На первом листе «Дадата» только группирует торговые точки
«Дадата» не только находит дубли торговых точек, бонусом она приводит адреса к человеческому виду

В таблице остается исходный ID, а помимо него «Дадата» назначает каждой точке итоговый идентификатор. У дублированных точек он одинаковый, это и есть признак дублирования.

ID в исх. файле Итоговый ID
104 2869
106 2864
109 2869

Исходный и итоговый идентификаторы пригодятся на следующих шагах.

На втором листе «Дадата» сразу объединяет одинаковые точки.

Адреса «Дадата» стандартизует, это бонус к дедупликации
На этом листе сервис убирает исходные ID торговых точек. Дубли он здесь уже объединил, вспомогательных признаков дублирования не нужно

Можно сразу брать второй лист и не знать забот, но Петр не таков.

Петр страхуется и проверяет торговые точки, которые «Дадата» посчитала одинаковыми. (Потому что мало ли что там наобъединяли автоматически.)

Для проверки наш герой берет второй лист, где сервис сгруппировал точки, но не объединил. И смотрит, действительно ли там дубли или «Дадата» поспешила.

Загружает готовый excel-файл в учетную систему производителя. На этом шаге каждая конкретная система распорядится файлом по-своему в зависимости от настроек. Учетная система нашего производителя смотрит только на два поля: «ID в исх. файле» и «Итоговый ID».

Система рассуждает так: если итоговый ID у точек одинаковый, значит, нужно по исходным ID найти эти точки во внутренней базе и объединить.

В итоге учетная система «схлопывает» дубли, Петр доволен: отчеты будут чисты и прозрачны как хрусталь. Главное, каждые три месяца чистить базу (можно хоть каждый день, просто у нашего производителя принято раз в три месяца).

Подготовленного названия и адреса достаточно для нахождения дублей

Вы спросите: «Как же так? Сами пишете, что по названиям и адресам бесполезно идентифицировать, и сами же идентифицируете». Справедливо, сейчас объясню.

Дело в том, что «Дадата» смекалистая. Она очищает название от шелухи и оставляет только смысловую основу. И вот по ней можно искать дубли достаточно точно.

Когда «Дадата» очистит названия «Социальная Аптека 6 (104, г.Батайск)» и «Батайск, Социальная Аптека 6, д. 104» от них останется только смысловая часть: «Социальная Аптека 6».

(Подробно о том, как именно «Дадата» находит и сравнивает смысловые основы, мы писали на «Хабре».)

Адреса «Дадата» сравнивает тоже не с бухты-барахты. Сначала она приводит адреса к единому каноническому виду, и только потом смотрит, насколько те похожи.

«Ниж Нов» и «Н. Новгород» сервис переименует в «г. Нижний Новгород».

«ул. Эсперанто» в Казани «Дадата» обновит до «ул. Нурсултана Назарбаева», потому что улицу давно переименовали.

«б Рокоссовского» и «Бул. Рокосовского» расправят плечи и превратятся в «б-р Маршала Рокоссовского».

Похожесть адреса и похожесть названия сами по себе — не самые надежные критерии. Но в совокупности они дают достаточно уверенную оценку одинаковости торговых точек.

В чём «Дадата» не поможет

Есть ситуации, когда «Дадата» бессильна и вообще едва ли можно что-то сделать автоматически.

Учесть торговые точки с альтернативными названиями. Иногда один магазин фигурирует в документах под разными именами.

Название магазина «О’кей», кто-то запишет как «Okey», а кто-то вообще «OK» для краткости.

«Дадата» ищет дубли только по названиям, которое указали в загруженном excel-файле.

Объединить дубли сразу внутри учетной системы производителя. «Дадата» находит дубли в файле, который загружает пользователь. Потом кому-то придётся перенести результат в систему, из которой выгрузили торговые точки.

Хорошая новость — «Дадата» даёт достаточно данных, чтобы объединение не стало проблемой. Сервис назначает точкам-дублям одинаковый итоговый ID. Остается допилить учетную систему, чтобы она брала из excel-файла точки с одинаковыми ID и объединяла в своей базе. Это просто.

Избавиться от дублей в наименованиях товаров. С товарами проблема примерно такая же, как с торговыми точками — все пишут названия по-разному и не используют коды производителя. От этого образуются дубли, которые точно так же мешают аналитике.

«Дадата» здесь не поможет — она не ищет дубли в номенклатурных справочниках.

В остальном мы придумали простой и надежный способ убрать дубли торговых точек. И недорогой — «Дадата» чистит дубли по копейке за штуку.

Дадата сначала показывает, сколько дублей нашла. За это платить не нужно
Можно загрузить базу, посмотреть, что нашла «Дадата», и только потом платить

Чтобы посмотреть, сколько дублей в вашей базе торговых точек, зарегистрируйтесь на dadata.ru. Загрузите excel-файл с базой, и сервис проверит ее бесплатно.