如何根据截止值过滤交易数据?

How to filter the transaction data based on a cutoff value?

这是我的交易数据:


data:

id          from_id        to_id      amount    date_trx
<fctr>      <fctr>         <fctr>     <dbl>     <date>
0           7468           5695       700.0     2005-01-04
1           6213           9379       11832.0   2005-01-08
2           7517           8170       1000.0    2005-01-10
3           6143           9845       4276.0    2005-01-12
4           6254           9640       200.0     2005-01-14
5           6669           5815       200.0     2005-01-20
6           6934           8583       49752.0   2005-01-24
7           9240           8314       19961.0   2005-01-26
8           6374           8865       1000.0    2005-01-30
9           6143           6530       13.4      2005-01-31
...

我要过滤数据如下:

如果在转账链中的任何一点,账户收到的钱与离开初始发送方的钱的比率高于阈值,比如 0.9,( 即 1 ≥ (second_transacted_amount / first_transacted_amount) > 0.9 ), 那么我想提取这些账户并保存以备后用。

例如,此处账户“7468”在 2005-01-04 向账户“5695”发送了 700.0 美元。在此交易之后,假设“5695”进行了超过 700.0 但不完全是 700.0 的 90% 的交易。还有一点很重要:第二笔交易应该总是先于第一笔交易。因此,date_trx 变量在这种情况下也很重要。我怎样才能对整个数据(在 R 中)执行此操作?

我们可以有一个小数据集来测试:

id          from_id        to_id      amount    date_trx
<fctr>      <fctr>         <fctr>     <dbl>     <date>
0           A              B          200.0     2005-07-08
1           B              C          185.0     2005-08-20
2           B              E          50.0      2005-10-19
3           C              B          170.0     2005-05-08
4           C              D          40.0      2005-09-19  
5           D              F          38.0      2005-07-13

考虑到 B 的交易,

0           A              B          200.0     2005-07-08
1           B              C          185.0     2005-08-20
2           B              E          50.0      2005-10-19
3           C              B          170.0     2005-05-08

由于以下交易对,B 应被标记为可疑

0           A              B          200.0     2005-07-08
1           B              C          185.0     2005-08-20

基于同样的推理,考虑来自或至 C 的交易

1           B              C          185.0     2005-08-20
3           C              B          170.0     2005-05-08
4           C              D          40.0      2005-09-19

C 不应被标记为可疑

可以针对 from_id 进行举报:

输出可能与此类似:

id          from_id        to_id      amount    date_trx       suspicious
<fctr>      <fctr>         <fctr>     <dbl>     <date>         <fctr>
0           A              B          200.0     2005-07-08      N     
1           B              C          185.0     2005-08-20      Y
2           B              E          50.0      2005-10-19      Y
3           C              B          170.0     2005-05-08      N
4           C              D          40.0      2005-09-19      N   
5           D              F          38.0      2005-07-13      N

可以使用 sqldf 包使用 SQL 语法来完成。

这是它如何与您的示例一起工作

library(sqldf)

data <- data.frame(id = factor(c(0, 1, 2, 3, 4, 5)),
                   from_id = factor(c("A", "B", "B", "C", "C", "D")),
                   to_id = factor(c("B", "C", "E", "B", "D", "F")),
                   amount = c(200, 185, 50, 170, 40, 38),
                   date_trx = c(0708, 0820, 1019, 0508, 0919, 0713)))

由于所有信息都来自一年,所以我将变量 date_trx 视为月-日数字,但也可以将其视为年-月-日。

下面的查询returns预期是什么:

sqldf("select a.*, coalesce(b.suspicious, 'N') as suspicious
       from   data a
       left join (select distinct b.from_id, 'Y' as suspicious
                  from   data a
                  inner join data b
                             on a.to_id = b.from_id and 
                                a.date_trx < b.date_trx and 
                                b.amount/a.amount > 0.9) b
                  on a.from_id = b.from_id")

R 控制台中的returns

  id from_id to_id amount date_trx suspicious
1  0       A     B    200      708          N
2  1       B     C    185      820          Y
3  2       B     E     50     1019          Y
4  3       C     B    170      508          N
5  4       C     D     40      919          N
6  5       D     F     38      713          N

看来你正在努力检测欺诈,如果是这样的话,这种方法不能实时工作,但你可以看看这篇论文中的图 1 https://arxiv.org/pdf/2002.05988.pdf 来了解一下如何实现实时可疑检测的代码。