Да так и делаю сейчас, но нужны "адекватные" данные и в итоге это многоитерационный процесс получается.
И больше всего времени на допиливание логики генерации
Раз такая продуктивная дискуссия - накину актуальное мне, вдруг кто посоветует.
Insights automation для sales/marketing funnel (для SaaS).
Типа анализировать что сломалось в воронке, в каком разрезе траффик упал или где конверсия сломалась, и давать уже список проблемных мест маркетологам.
Делал кто-нибудь тоже что что-то подобное? Есть что-то из подходов, библиотек на примете?
Ну такое.. объемы большие, не все выгрузишь, нет системы (подхода к анализу).
Я мудрю что-то в сторону построить metric tree, взять список возможных dimensions. Потом раскрывать в нем каждый узел по разрезам максимально объясняющим отклонение. Типа RCA отклонения. У этого подхода есть некоторые минусы на самом деле (может случиться, что важное отклонение будет во вложенном узле, но не в том срезе, который открыл алгоритм).
Потому и велосипед, что здравый смысл и многие так должны бы делать ( но почему-то совсем не все так делают), но при этом есть вычислительные нюансы, которые надо заложить в реализацию. Не бином ньютона, но и настолько все тривиально, чтобы написать за 10 минут.
Но что-то не нахожу стандартных библиотек, где это было бы автоматизировано.
Когда-то давно, еще в до-AI-ную эру, 😊 мы генерили тестовые данные для Oracle, используя нативную генерацию на основе продакшен данных , через SQL и PL/SQL, что-то типа:
INSERT INTO users (user_id, full_name, email, phone, created_at, status, balance)
SELECT
level AS user_id,
-- Случайное Имя + Фамилия из заготовленных списков
(CASE TRUNC(DBMS_RANDOM.VALUE(1, 5))
WHEN 1 THEN 'Иван' WHEN 2 THEN 'Анна' WHEN 3 THEN 'Алексей' ELSE 'Мария' END) ' '
(CASE TRUNC(DBMS_RANDOM.VALUE(1, 5))
WHEN 1 THEN 'Иванов' WHEN 2 THEN 'Петров' WHEN 3 THEN 'Сидоров' ELSE 'Смирнова' END) AS full_name,
-- Уникальный email на основе GUID или ID
'user_' level '_' LOWER(DBMS_RANDOM.STRING('u', 4)) '@domain.com' AS email,
-- Телефон по шаблону +7 (9XX) XXX-XX-XX
'+7 (9' LPAD(TRUNC(DBMS_RANDOM.VALUE(10, 99)), 2, '0') ') ' ||
LPAD(TRUNC(DBMS_RANDOM.VALUE(100, 999)), 3, '0') '-'
LPAD(TRUNC(DBMS_RANDOM.VALUE(10, 99)), 2, '0') '-'
LPAD(TRUNC(DBMS_RANDOM.VALUE(10, 99)), 2, '0') AS phone,
-- Дата за последние 365 дней
SYSDATE - DBMS_RANDOM.VALUE(0, 365) AS created_at,
-- Статус с распределением вероятностей (80% ACTIVE, 15% INACTIVE, 5% BLOCKED)
CASE
WHEN DBMS_RANDOM.VALUE(0, 1) < 0.80 THEN 'ACTIVE'
WHEN DBMS_RANDOM.VALUE(0, 1) < 0.95 THEN 'INACTIVE'
ELSE 'BLOCKED'
END AS status,
-- Баланс с округлением до 2 знаков
ROUND(DBMS_RANDOM.VALUE(0, 50000), 2) AS balance
FROM dual
CONNECT BY level <= 10000; -- Генерирует 10,000 строк
Естественно, это не рекоммендация. Так, понастальгировал 😊
Чтобы данные адекватно выглядели на разных масштабах я использовал методы фрактальной геометрии. Но это была научная статья и работало все для ценовых рядов. Трейдеры говорили, что графики неотличимы от реальных.