【问题标题】:How to filter the transaction data based on a cutoff value?如何根据截止值过滤交易数据?
【发布时间】:2020-11-19 05:25:17
【问题描述】:

这是我的交易数据:


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 年 1 月 4 日向帐户“5695”发送了 700.0 美元。在此事务之后,假设“5695”进行了超过 700.0 的 90% 的事务,但不完全是 700.0。这里还有一点很重要:第二个事务应该总是在第一个之前。因此, 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

【问题讨论】:

  • id 2 应该是可疑的?
  • 可疑列实际上是基于 from_id ,而不是基于 id 列。 @费尔南多
  • 好的,那我换个答案

标签: r networking igraph social-networking network-analysis


【解决方案1】:

可以使用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 视为月-日数字,但也可以将其视为年-月-日。

以下查询返回预期内容:

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 控制台中返回

  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

您似乎正在努力检测欺诈,如果是这种情况,这种方法无法实时工作,但您可以查看本文https://arxiv.org/pdf/2002.05988.pdf 中的图 1 以了解如何实现代码用于进行实时可疑检测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多