R:消费者篮子的序列分析

R: sequence analysis of consumer baskets

我有 700 名消费者、400 种不同产品的 3 年真实交易数据历史记录。我正在尝试使用 TraMineR 包和来自 http://analyzecore.com/2014/12/04/sequence-carts-in-depth-analysis-with-r/

的说明进行序列分析

不幸的是我遇到了几个问题:

  1. 一些购买的结束日期("to" 参数)与下一个购买的开始日期相同 - 我通过使用每两个订单来解决它 - 它有效,但我想要所有订单
  2. 在尝试制作 seqformat 时出现错误:Error in levels<-(*tmp*, value = if (nl == nL) as.character(labels) else paste0(labels, : factor level [1058] is duplicated - 我试图:
    • select 只有不同的订单 - 没有用
    • select 只有一些消费者 - 没有用
    • 我也试过缩短产品名称 - 没用
    • 和select只是历史的一部分 - 没有用

另外值得注意的是,数据是由批发商提供的,而不是零售商提供的,因此消费者经常只定期重复购买特定产品(例如,过去 3 年的每个工作日一位消费者都在购买产品 "a12" 但什么也没买否则)

也许我应该使用不同的包?

编辑:很抱歉没有提供数据和代码。感谢吉尔伯特指出这一点。 我的 2 个消费者的样本数据,8 天:

dftmp <- data.frame(Client = c('k622', 'k622', 'k71', 'k71', 'k71', 'k71'), 
                    Date = c(6, 8, 1, 2, 6, 8), 
                    Basket = c('a126;a293;a300;a362;a363;a364;a401;a402', 'a204;a301;a303;a364;a402', 'a113;a117;a133;a148;a18;a185;a22;a230;a238;a300;a360;a367;a386;a389;a403;a405', 'a22;a388', 'a194', 'a113;a146;a204;a230;a258;a303;a362;a386;a388;a389;a393;a395;a401;a402;a403;a405'),
                    to = c(7, 8, 1, 5, 7, 8))

我使用的代码:

df.form <- seqformat(dftmp, id='Client', begin='Date', end='to', status='Basket',
                     from='SPELL', to='STS', process=FALSE)

df.seq <- seqdef(df.form, left='DEL', right='unknown', xtstep=10, void='unknown')

但我得到错误:

Error in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  : 
  factor level [9] is duplicated

根据您的 answer from Error in levels for seqdef in R 我通过将 void='unknown' 更改为 with.missing = T 来解决问题,但结果不可读,因为我有 19318 个不同的状态

我现在认为我不应该使用这个公式,因为我正在寻找类似 "association rules in time" 的东西(如果客户购买了产品 a1,他可能会在购买产品 a2 后一周购买)

很高兴看到您自己修复了错误。我只想说 seqdef 没有 with.missing 参数,只需让 void 为默认值即可解决问题。

让我对您尝试进行的分析发表评论。

从您的示例数据来看,您似乎试图创建状态序列,其中状态将是消费者篮子。但是,从您的描述来看,您似乎对产品序列感兴趣。我首先解释你应该如何进行产品序列,然后评论从交易创建状态的相关性。

  1. 既然你有交易(事件),你的数据应该是时间戳事件(TSE)而不是法术。 TraMineR 可以处理 TSE 数据,但希望它们作为每个事件的一个不同行(id、时间、事件),即,如果您想要产品序列,则为每个购买的产品。例如,在客户 k622 的日期 6,你应该有 8 行,日期 8 应该有 5 行。一旦您拥有这种 TSE 格式的数据,您就可以使用 seqecreate 创建一个事件序列对象,然后对事件序列使用不同的函数(seqpcplotseqefsub、...) .

  2. 您不能直接从 TSE 数据创建状态序列,因为与同时发生的事件不同,同时发生的状态是不允许的。如果您想使用状态序列的函数,您可以尝试使用 TraMineRextras 中的 TSE_to_STS 函数将您的事件序列转换为状态序列。这里有两个问题需要解决。首先,您必须确定一组同时发生的事务定义的状态。第二,你定义的状态持续多长时间?此外,对于使用 TraMineR 的状态序列分析,您正在考虑的产品数量过多,尤其是对于需要 400 种对比色的视觉探索。

总之,您的任务非常复杂,我同意您的看法,TraMineR 可能不是最适合您的任务的软件包。至少你应该尝试将你的产品大幅聚合到一个合理的数量。