在大型数据集中查找值的共现
Find co-occurrence of values in large data set
我有一个包含月份、客户 ID 和商店 ID 的大型数据集。每个客户、每个位置、每个月都有一条记录总结了他们在该位置的 activity。
Month Customer ID Store
Jan 1 A
Jan 4 A
Jan 2 A
Jan 3 A
Feb 7 B
Feb 2 B
Feb 1 B
Feb 12 B
Mar 1 C
Mar 11 C
Mar 3 C
Mar 12 C
我有兴趣创建一个矩阵来显示每个位置与另一个位置共享的客户数量。像这样:
A B C
A 4 2 2
B 2 4 2
C 2 2 4
例如,由于客户在下个月访问了商店 A,然后访问了商店 B,因此他们将被添加到理货中。我感兴趣的是共享客户的数量,而不是访问次数。
我在此线程中尝试了稀疏矩阵方法 (Creating co-occurrence matrix),但由于某种我无法理解的原因,返回的数字不匹配。
如有任何想法,我们将不胜感激!
更新:
我发布的原始解决方案适用于您的数据。但是你的数据有
属性 没有顾客曾在两个不同的地方访问过同一家商店,这是不寻常的
个月。假设会发生这种情况,则需要进行修改。
我们需要的是一个由顾客组成的商店矩阵,如果顾客曾经
参观了商店,否则为零。使用的原始解决方案
M = as.matrix(table(Dat$ID_Store, Dat$Customer))
这给出了每个顾客访问商店的不同月份。和
不同的数据,这些数字可能不止一个。我们可以使用
来解决这个问题
M = as.matrix(table(Dat$ID_Store, Dat$Customer) > 0)
如果你看这个矩阵,它会说 TRUE 和 FALSE,但是因为 TRUE=1 和 FALSE=0
那会工作得很好。所以完整更正的解决方案是:
M = as.matrix(table(Dat$ID_Store, Dat$Customer) > 0)
M %*% t(M)
A B C
A 4 2 2
B 2 4 2
C 2 2 4
我们也可以试试这个:
library(reshape2)
df <- dcast(df,CustomerID~Store, length, value.var='Store')
# CustomerID A B C
#1 1 1 1 1
#2 2 1 1 0 # Customer 2 went to stores A,B but not to C
#3 3 1 0 1
#4 4 1 0 0
#5 7 0 1 0
#6 11 0 0 1
#7 12 0 1 1
crossprod(as.matrix(df[-1]))
# A B C
#A 4 2 2
#B 2 4 2
#C 2 2 4
与图书馆 arules
:
library(arules)
write(' Jan 1 A
Jan 4 A
Jan 2 A
Jan 3 A
Feb 7 B
Feb 2 B
Feb 1 B
Feb 12 B
Mar 1 C
Mar 11 C
Mar 3 C
Mar 12 C', 'basket_single')
tr <- read.transactions("basket_single", format = "single", cols = c(2,3))
inspect(tr)
# items transactionID
#[1] {A,B,C} 1
#[2] {C} 11
#[3] {B,C} 12
#[4] {A,B} 2
#[5] {A,C} 3
#[6] {A} 4
#[7] {B} 7
image(tr)
crossTable(tr, sort=TRUE)
# A B C
#A 4 2 2
#B 2 4 2
#C 2 2 4
我有一个包含月份、客户 ID 和商店 ID 的大型数据集。每个客户、每个位置、每个月都有一条记录总结了他们在该位置的 activity。
Month Customer ID Store
Jan 1 A
Jan 4 A
Jan 2 A
Jan 3 A
Feb 7 B
Feb 2 B
Feb 1 B
Feb 12 B
Mar 1 C
Mar 11 C
Mar 3 C
Mar 12 C
我有兴趣创建一个矩阵来显示每个位置与另一个位置共享的客户数量。像这样:
A B C
A 4 2 2
B 2 4 2
C 2 2 4
例如,由于客户在下个月访问了商店 A,然后访问了商店 B,因此他们将被添加到理货中。我感兴趣的是共享客户的数量,而不是访问次数。
我在此线程中尝试了稀疏矩阵方法 (Creating co-occurrence matrix),但由于某种我无法理解的原因,返回的数字不匹配。
如有任何想法,我们将不胜感激!
更新: 我发布的原始解决方案适用于您的数据。但是你的数据有 属性 没有顾客曾在两个不同的地方访问过同一家商店,这是不寻常的 个月。假设会发生这种情况,则需要进行修改。
我们需要的是一个由顾客组成的商店矩阵,如果顾客曾经
参观了商店,否则为零。使用的原始解决方案
M = as.matrix(table(Dat$ID_Store, Dat$Customer))
这给出了每个顾客访问商店的不同月份。和
不同的数据,这些数字可能不止一个。我们可以使用
来解决这个问题
M = as.matrix(table(Dat$ID_Store, Dat$Customer) > 0)
如果你看这个矩阵,它会说 TRUE 和 FALSE,但是因为 TRUE=1 和 FALSE=0
那会工作得很好。所以完整更正的解决方案是:
M = as.matrix(table(Dat$ID_Store, Dat$Customer) > 0)
M %*% t(M)
A B C
A 4 2 2
B 2 4 2
C 2 2 4
我们也可以试试这个:
library(reshape2)
df <- dcast(df,CustomerID~Store, length, value.var='Store')
# CustomerID A B C
#1 1 1 1 1
#2 2 1 1 0 # Customer 2 went to stores A,B but not to C
#3 3 1 0 1
#4 4 1 0 0
#5 7 0 1 0
#6 11 0 0 1
#7 12 0 1 1
crossprod(as.matrix(df[-1]))
# A B C
#A 4 2 2
#B 2 4 2
#C 2 2 4
与图书馆 arules
:
library(arules)
write(' Jan 1 A
Jan 4 A
Jan 2 A
Jan 3 A
Feb 7 B
Feb 2 B
Feb 1 B
Feb 12 B
Mar 1 C
Mar 11 C
Mar 3 C
Mar 12 C', 'basket_single')
tr <- read.transactions("basket_single", format = "single", cols = c(2,3))
inspect(tr)
# items transactionID
#[1] {A,B,C} 1
#[2] {C} 11
#[3] {B,C} 12
#[4] {A,B} 2
#[5] {A,C} 3
#[6] {A} 4
#[7] {B} 7
image(tr)
crossTable(tr, sort=TRUE)
# A B C
#A 4 2 2
#B 2 4 2
#C 2 2 4