Мы создаем программное обеспечение, которое проверяет комиссии, взимаемые банками с продавцами, которые принимают кредитные и дебетовые карты. Наши клиенты хотят, чтобы мы сообщили им о том, что процессор карты перегружает их. Плата за каждую транзакцию по кредитной карте рассчитывается следующим образом:
fee = fixed + variable*transaction_price
«Схема оплаты» - это пара (fixed, variable)
, используемая группой кредитных карт, например, «MasterCard Business дебетовые золотые карты, выпущенные Первым Национальным банком Голливуда». Мы считаем, что в любое время используется менее 10 различных схем оплаты, но мы не получаем полный или текущий список схем оплаты от наших партнеров. (да, я знаю, что некоторые «схемы оплаты» сложнее, чем приведенное выше уравнение, из-за ограничений и других ошибок, но известно, что в наших транзакциях используется только a + bx
схем).
Вот проблема, которую мы пытаемся решить: мы хотим использовать данные о сборах для каждой транзакции для определения используемых схем оплаты. Затем мы можем сравнить этот список с схемами оплаты, которые каждый клиент должен использовать в зависимости от своего банка.
Данные, которые мы получаем о каждой транзакции, являются кортежем данных: (card_id, transaction_price, fee)
.
transaction_price
и fee
в целых центах. Банк переворачивает дробные центы за каждый переход до тех пор, пока кумулятивный доход не станет больше одного цента, а затем к суммам этой транзакции будет добавлен «округлый цент» Мы не можем предсказать, к какой транзакции будет прикреплен «цент округления».
card_id
идентифицирует группу карт с одинаковой схемой оплаты. В обычный день из 10 000 транзакций может быть несколько сотен уникальных card_id
. Несколько card_id
разделят схему оплаты.
Данные, которые мы получаем, выглядят так, и мы хотим выяснить последние два столбца.
card_id transaction_price fee fixed variable
=======================================================================
12345 200 22 ? ?
67890 300 21 ? ?
56789 150 8 ? ?
34567 150 8 ? ?
34567 150 "rounding cent"-> 9 ? ?
34567 150 8 ? ?
Конечным результатом, который мы хотим, является такой короткий список с 10 или менее записями, показывающими схемы оплаты, которые лучше всего соответствуют нашим данным. Как это:
fee_scheme_id fixed variable
======================================
1 22 0
2 21 0
3 ? ?
4 ? ?
...
Средняя плата составляет около 8 центов. Это означает, что центы округления оказывают огромное влияние, а приведенный выше вывод требует много данных.
Средняя транзакция составляет 125 центов. Цены сделок всегда находятся в пределах 5 центов.
Мы хотим получить краткий список схем оплаты, которые «соответствуют» 98% + 3000 транзакций, которые каждый клиент получает каждый день. Если данных недостаточно для достижения достоверности 98%, мы можем использовать данные за несколько дней.
Из-за того, что центы округления применяются несколько произвольно к каждой транзакции, это не простая проблема алгебры. Вместо этого это своего рода упражнение по статистической кластеризации, которое я не знаю, как решить.
Есть предложения, как подойти к этой проблеме? Реализация может быть на C # или T-SQL, в зависимости от того, какой алгоритм имеет смысл.