3

这有点复杂——但我会尽力解释。我有一个数据集,其中包含我每天从特定视频点播界面中抓取的数据。每天大约有 120 个标题显示(12 x 10 的网格) - 数据包括一系列变量:抓取日期、节目标题、节目的垂直/水平位置、流派、概要等。

我想做的一件事是分析每天提供的产品的相似性。我的意思是我想比较某一天有多少标题出现在前一天(理想情况下以百分比表示)。因此,如果 40 个(120 个)标题与前一天相同,则相似度为 30%。

事情是这样的——我知道该怎么做(感谢这个网站上的一些好心的陌生人帮助我使用 R 编写了一个脚本)。您可以在此处查看帖子,其中提供了更多详细信息:Calculatesimilarity within a dataframe across specific rows (R)

但是,这种方法会根据每天的标题总数创建相似度分数,而我还希望能够在应用其他过滤器后探索相似度。具体来说,我想将焦点缩小到出现在前四行和前四列中的标题。换句话说:这些职位中有多少与前一天相同?我可以通过修改 R 脚本来做到这一点,但似乎更好的方法是在 Tableau 中做到这一点,这样我就可以“实时”更改这些参数,可以这么说。即,如果我想专注于前 6 行和列,我不想重新运行 R 脚本并更新基础数据!

感觉好像我在这里遗漏了一些非常明显的东西——也许这是一个简单的表格计算?或者我需要以某种方式告诉 Tableau 如何对数据进行子集化?

希望这一切都有意义,但如果不是,我很乐意澄清。此外,我无法为您提供基础数据(出于研究原因!),但如果有帮助,我可以提供一个样本。

提前致谢 :)

4

3 回答 3

3

你可以两全其美。使用 Tableau 连接到您的数据,根据需要进行过滤,然后让 Tableau 调用 R 脚本来计算相似度,并将结果返回给 Tableau 进行显示。

如果这适合您的用例,您需要学习将其发挥作用的机制。在 Tableau 方面,您将使用以单词 SCRIPT 开头的函数来调用您的 R 代码,例如 SCRIPT_REAL() 或 SCRIPT_INT() 等。这些是表格计算,因此您需要了解如何使用表格计算工作,特别是在分区和寻址方面。Tableau 帮助中对此进行了描述。您还必须通过在“帮助”->“设置和性能”菜单下管理外部服务,将 Tableau 指向 R 代码的主机。

在 R 端,您当然会编写函数,然后使用函数 RServe() 使其可供 Tableau 访问。Tableau 将参数向量发送到 R 并期望向量作为响应。上面提到的分区和寻址控制了这些向量的大小和顺序。

让机制工作可能有点棘手,但它们确实有效。先练习一些简单的东西。

有关详细信息,请参阅 Tableau 的网站资源。此功能的正式名称是 Tableau“分析扩展”</p>

于 2020-11-20T23:40:04.637 回答
2

我正在分享一个在 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 

祝你好运

于 2020-11-21T14:36:41.997 回答
1

正如亚历克斯所建议的那样,您可以两全其美。但据我所知,Tableau Desktop 允许通过计算字段等与 R(或 python 等)接口script_int script_real。所有这些都可以通过计算字段在 tableau 中使用。目前,tableau 中的这些功能允许通过以下方式在计算字段上创建Table calculations在画面中仅在上下文中起作用。我们不能硬编码这些值(字段/列),因此。我们不能随意使用这些独立于上下文的内容。此外,tableau 中的表格计算既不能进一步聚合,也不能与 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 中导入了这个数据集,并根据您的需要创建了一个参数相关视图。

在此处输入图像描述

于 2020-11-22T12:35:02.577 回答