TABLEAU:如何衡量跨日期维度集的相似性?
TABLEAU: How can I measure similarity of sets of dimensions across dates?
这有点复杂 - 但我会尽力解释。我有一个数据集,其中包含我每天从特定视频点播界面抓取的数据。每天都会显示大约 120 个标题(12 x 10 的网格)——数据包括一系列变量:抓取日期、节目标题、vertical/horizontal 节目位置、流派、概要等。
我想做的一件事是在 day-to-day 的基础上分析所提供内容的相似性。我的意思是我想比较给定日期有多少标题出现在前一天(理想情况下以百分比表示)。因此,如果 40 个(共 120 个)标题与前一天相同,则相似度为 30%。
事情是这样的 - 我知道如何做到这一点(感谢这个网站上的一些好心的陌生人帮助我使用 R 编写了一个脚本)。您可以在此处查看 post,其中提供了更多详细信息:
但是,此方法基于 day-to-day 基础上的标题总数创建相似度分数,而我还希望能够在应用其他过滤器后探索相似度。具体来说,我想将焦点缩小到出现在前四行和前四列中的标题。换句话说:这些职位中有多少与前一天相同?我可以通过修改 R 脚本来完成此操作,但似乎更好的方法是在 Tableau 中执行此操作,这样我就可以在“real-time”中更改这些参数,可以这么说。 IE。如果我想专注于前 6 行和前 6 列,我不想 运行 重新运行 R 脚本并更新基础数据!
感觉好像我在这里遗漏了一些非常明显的东西 - 也许这是一个简单的 table 计算?或者我需要以某种方式告诉 Tableau 如何对数据进行子集化?
希望这一切都是有道理的,但如果没有,我很乐意澄清。另外,我无法为您提供基础数据(出于研究原因!),但如果有帮助,我可以提供示例。
提前致谢:)
您可以两全其美。使用 Tableau 连接到您的数据,根据需要进行过滤,然后让 Tableau 调用 R 脚本来计算相似度,然后 return 将结果发送到 Tableau 进行显示。
如果这适合您的用例,您需要学习将其付诸实践的机制。在 Tableau 方面,您将使用以 SCRIPT 一词开头的函数来调用您的 R 代码,例如 SCRIPT_REAL() 或 SCRIPT_INT() 等。它们是 table 计算,因此您需要了解 table 计算的工作原理,尤其是在分区和寻址方面。这在 Tableau 帮助中进行了描述。您还必须通过在“帮助”->“设置和性能”菜单下管理外部服务,将 Tableau 指向 R 代码的主机。
在 R 端,您当然会编写函数,然后使用函数 RServe() 使其可供 Tableau 访问。 Tableau 将参数向量发送到 R 并期望一个向量作为响应。上面提到的分区和寻址控制了这些向量的大小和顺序。
让机制正常工作可能有点棘手,但它们确实有效。先练习简单的东西。
有关详细信息,请参阅 Tableau 的网站资源。此功能的正式名称是 Tableau“分析扩展”
我正在分享在 R 中解决此问题的策略。
Step-1加载库和数据
library(tidyverse)
library(lubridate)
movies <- tibble(read.csv("movies.csv"))
movies$date <- as.Date(movies$date, format = "%d-%m-%Y")
在两个变量中设置要限制相似性搜索的行和列。假设您将搜索限制为仅 5 列和 4 行
filter_for_row <- 4
filter_for_col <- 5
得到最终结果
movies %>% filter(rank <= filter_for_col, row <= filter_for_row) %>% #Restricting search to designated rows and columns
group_by(Title, date) %>% mutate(d_id = row_number()) %>%
filter(d_id ==1) %>% # removing duplicate titles screened on any given day
group_by(Title) %>%
mutate(similarity = ifelse(lag(date)== date - lubridate::days(1), 1, 0)) %>% #checking whether it was screened previous day
group_by(date) %>%
summarise(total_movies_displayed = sum(d_id),
similar_movies = sum(similarity, na.rm = T),
similarity_percent = similar_movies/total_movies_displayed)
# A tibble: 3 x 4
date total_movies_displayed similar_movies similarity_percent
<date> <int> <dbl> <dbl>
1 2018-08-13 17 0 0
2 2018-08-14 17 10 0.588
3 2018-08-15 17 9 0.529
如果将过滤器分别更改为 12、12,则
filter_for_row <- 12
filter_for_col <- 12
movies %>% filter(rank <= filter_for_col, row <= filter_for_row) %>%
group_by(Title, date) %>% mutate(d_id = row_number()) %>%
filter(d_id ==1) %>%
group_by(Title) %>%
mutate(similarity = ifelse(lag(date)== date - lubridate::days(1), 1, 0)) %>%
group_by(date) %>%
summarise(total_movies_displayed = sum(d_id),
similar_movies = sum(similarity, na.rm = T),
similarity_percent = similar_movies/total_movies_displayed)
# A tibble: 3 x 4
date total_movies_displayed similar_movies similarity_percent
<date> <int> <dbl> <dbl>
1 2018-08-13 68 0 0
2 2018-08-14 75 61 0.813
3 2018-08-15 72 54 0.75
祝你好运
正如 Alex 所建议的,您可以两全其美。但据我所知,Tableau Desktop 允许通过计算字段(即 script_int
script_real
等)与 R(或 python 等)进行交互。所有这些都可以在 tableau 通过 计算字段 。目前,tableau 中的这些函数允许通过 Table calculations
在计算字段上创建,这在 tableau 中仅在上下文中起作用。我们不能对这些值 (fields/columns) 进行硬编码,因此。我们不能随意使用这些独立于上下文。此外,tableau 中的 table 计算既不能进一步聚合,也不能与 LOD 表达式混合。因此,在您的用例中,(再次据我所知)您可以在通过您选择的任何编程语言对值进行硬编码之后,在 tableau 中构建一个参数相关视图。因此,我建议在将数据导入 tableau 之前,可以通过 运行 在您的数据集中创建一个新列(或根据选择的编程语言进行替换)
movies_edited <- movies %>% group_by(Title) %>%
mutate(similarity = ifelse(lag(date)== date - lubridate::days(1), 1, 0)) %>%
ungroup()
write.csv(movies_edited, "movies_edited.csv")
这在数据集中创建了一个名为 similarity
的新列,其中 1
表示前一天可用,0
表示前一天没有筛选,NA
表示今天是上映的第一天。
我已将此数据集导入 tableau 并创建了一个参数相关视图,如您所愿。
这有点复杂 - 但我会尽力解释。我有一个数据集,其中包含我每天从特定视频点播界面抓取的数据。每天都会显示大约 120 个标题(12 x 10 的网格)——数据包括一系列变量:抓取日期、节目标题、vertical/horizontal 节目位置、流派、概要等。
我想做的一件事是在 day-to-day 的基础上分析所提供内容的相似性。我的意思是我想比较给定日期有多少标题出现在前一天(理想情况下以百分比表示)。因此,如果 40 个(共 120 个)标题与前一天相同,则相似度为 30%。
事情是这样的 - 我知道如何做到这一点(感谢这个网站上的一些好心的陌生人帮助我使用 R 编写了一个脚本)。您可以在此处查看 post,其中提供了更多详细信息:
但是,此方法基于 day-to-day 基础上的标题总数创建相似度分数,而我还希望能够在应用其他过滤器后探索相似度。具体来说,我想将焦点缩小到出现在前四行和前四列中的标题。换句话说:这些职位中有多少与前一天相同?我可以通过修改 R 脚本来完成此操作,但似乎更好的方法是在 Tableau 中执行此操作,这样我就可以在“real-time”中更改这些参数,可以这么说。 IE。如果我想专注于前 6 行和前 6 列,我不想 运行 重新运行 R 脚本并更新基础数据!
感觉好像我在这里遗漏了一些非常明显的东西 - 也许这是一个简单的 table 计算?或者我需要以某种方式告诉 Tableau 如何对数据进行子集化?
希望这一切都是有道理的,但如果没有,我很乐意澄清。另外,我无法为您提供基础数据(出于研究原因!),但如果有帮助,我可以提供示例。
提前致谢:)
您可以两全其美。使用 Tableau 连接到您的数据,根据需要进行过滤,然后让 Tableau 调用 R 脚本来计算相似度,然后 return 将结果发送到 Tableau 进行显示。
如果这适合您的用例,您需要学习将其付诸实践的机制。在 Tableau 方面,您将使用以 SCRIPT 一词开头的函数来调用您的 R 代码,例如 SCRIPT_REAL() 或 SCRIPT_INT() 等。它们是 table 计算,因此您需要了解 table 计算的工作原理,尤其是在分区和寻址方面。这在 Tableau 帮助中进行了描述。您还必须通过在“帮助”->“设置和性能”菜单下管理外部服务,将 Tableau 指向 R 代码的主机。
在 R 端,您当然会编写函数,然后使用函数 RServe() 使其可供 Tableau 访问。 Tableau 将参数向量发送到 R 并期望一个向量作为响应。上面提到的分区和寻址控制了这些向量的大小和顺序。
让机制正常工作可能有点棘手,但它们确实有效。先练习简单的东西。
有关详细信息,请参阅 Tableau 的网站资源。此功能的正式名称是 Tableau“分析扩展”
我正在分享在 R 中解决此问题的策略。
Step-1加载库和数据
library(tidyverse)
library(lubridate)
movies <- tibble(read.csv("movies.csv"))
movies$date <- as.Date(movies$date, format = "%d-%m-%Y")
在两个变量中设置要限制相似性搜索的行和列。假设您将搜索限制为仅 5 列和 4 行
filter_for_row <- 4
filter_for_col <- 5
得到最终结果
movies %>% filter(rank <= filter_for_col, row <= filter_for_row) %>% #Restricting search to designated rows and columns
group_by(Title, date) %>% mutate(d_id = row_number()) %>%
filter(d_id ==1) %>% # removing duplicate titles screened on any given day
group_by(Title) %>%
mutate(similarity = ifelse(lag(date)== date - lubridate::days(1), 1, 0)) %>% #checking whether it was screened previous day
group_by(date) %>%
summarise(total_movies_displayed = sum(d_id),
similar_movies = sum(similarity, na.rm = T),
similarity_percent = similar_movies/total_movies_displayed)
# A tibble: 3 x 4
date total_movies_displayed similar_movies similarity_percent
<date> <int> <dbl> <dbl>
1 2018-08-13 17 0 0
2 2018-08-14 17 10 0.588
3 2018-08-15 17 9 0.529
如果将过滤器分别更改为 12、12,则
filter_for_row <- 12
filter_for_col <- 12
movies %>% filter(rank <= filter_for_col, row <= filter_for_row) %>%
group_by(Title, date) %>% mutate(d_id = row_number()) %>%
filter(d_id ==1) %>%
group_by(Title) %>%
mutate(similarity = ifelse(lag(date)== date - lubridate::days(1), 1, 0)) %>%
group_by(date) %>%
summarise(total_movies_displayed = sum(d_id),
similar_movies = sum(similarity, na.rm = T),
similarity_percent = similar_movies/total_movies_displayed)
# A tibble: 3 x 4
date total_movies_displayed similar_movies similarity_percent
<date> <int> <dbl> <dbl>
1 2018-08-13 68 0 0
2 2018-08-14 75 61 0.813
3 2018-08-15 72 54 0.75
祝你好运
正如 Alex 所建议的,您可以两全其美。但据我所知,Tableau Desktop 允许通过计算字段(即 script_int
script_real
等)与 R(或 python 等)进行交互。所有这些都可以在 tableau 通过 计算字段 。目前,tableau 中的这些函数允许通过 Table calculations
在计算字段上创建,这在 tableau 中仅在上下文中起作用。我们不能对这些值 (fields/columns) 进行硬编码,因此。我们不能随意使用这些独立于上下文。此外,tableau 中的 table 计算既不能进一步聚合,也不能与 LOD 表达式混合。因此,在您的用例中,(再次据我所知)您可以在通过您选择的任何编程语言对值进行硬编码之后,在 tableau 中构建一个参数相关视图。因此,我建议在将数据导入 tableau 之前,可以通过 运行 在您的数据集中创建一个新列(或根据选择的编程语言进行替换)
movies_edited <- movies %>% group_by(Title) %>%
mutate(similarity = ifelse(lag(date)== date - lubridate::days(1), 1, 0)) %>%
ungroup()
write.csv(movies_edited, "movies_edited.csv")
这在数据集中创建了一个名为 similarity
的新列,其中 1
表示前一天可用,0
表示前一天没有筛选,NA
表示今天是上映的第一天。
我已将此数据集导入 tableau 并创建了一个参数相关视图,如您所愿。