如何使用 Tableau 在我的数据中找到最常见的(字符串)序列?

How can I find most common sequences (of strings) in my data using Tableau?

通常的免责声明:对于 Tableau(和 R,这是我首选的数据整理语言),我是一个新手。

这是我正在尝试做的事情:

我有一个包含多个变量的数据集,其中两个是“时间”和“流派”。这是数据的示例:


Index      Title              Date       Genre             Time
    1      Sherlock           01/01/20   Drama             21:00
    2      Peaky Blinders     01/01/20   Drama             20:00
    3      Eastenders         01/01/20   Drama             19:30
    4      BBC News           01/01/20   News              18:30
    5      Antiques Roadshow  01/01/20   Factual           18:00
    6      Peaky Blinders     02/01/20   Drama             21:00
    7      Casualty           02/01/20   Drama             20:00
    8      Eastenders         02/01/20   Drama             19:30
    9      BBC News           02/01/20   News              18:30
   10      Dragons Den        02/01/20   Entertainment     18:00

这只是一个非常大的数据集中的一个非常小的样本,但我想确定的是:最常见的 combination/sequence 流派是什么?例如,在上面的数据中,最常见的三个顺序是“戏剧+戏剧+戏剧”。最常见的四个序列是“新闻+戏剧+戏剧+戏剧”。

我的数据有数千个日期(如果你想知道的话,这是 BBC One 的广播时间表),我想找出最常见的流派组合/序列(至少 3 个)。

我想知道这对于 Tableau 来说是否太复杂,而我需要在 R 中做些什么?欢迎任何建议!和往常一样,我很乐意详细说明任何不清楚的地方。

如果您查看大量数据,其中 order/sequence 数据行对分析至关重要,那么无论您使用何种可视化工具,您最好了解 SQL 窗口化查询.

最简单的方法是从预处理步骤开始,使用 Python、R,可能使用 Tableau-Prep 或其他工具,将简化的数据提供给可视化层。如果你能非常清楚地定义你需要在最后显示的信息并向后工作以确定预处理步骤应该产生什么来实现这一点,那么这样做会更容易。

如果预先准备数据过于静态,不允许您根据需要进行交互式探索,那么您可以将一些预处理拉入交互层,也许使用 Tableau 的自定义 SQL 或传递函数调用您在预处理步骤中开发的一些相同 SQL。

无论如何,开窗查询或分析查询可能对此有用。

由于 Tableau 方法与主题无关,让我们考虑一下 R:

我们可以使用滚动函数来确定 3 的所有序列。zoo 包有一个 rollapply 函数:

library(zoo)
rollapply(data$Genre,3,c)
#     [,1]      [,2]      [,3]           
#[1,] "Drama"   "Drama"   "Drama"        
#[2,] "Drama"   "Drama"   "News"         
#[3,] "Drama"   "News"    "Factual"      
#[4,] "News"    "Factual" "Drama"        
#[5,] "Factual" "Drama"   "Drama"        
#[6,] "Drama"   "Drama"   "Drama"        
#[7,] "Drama"   "Drama"   "News"         
#[8,] "Drama"   "News"    "Entertainment"

这里有很多方法,但我更喜欢dplyr:

library(dplyr)
rollapply(data$Genre,3,c) %>%
   as_tibble() %>%
   group_by_all() %>%
   tally()
#  V1      V2      V3                n
#  <chr>   <chr>   <chr>         <int>
#1 Drama   Drama   Drama             2
#2 Drama   Drama   News              2
#3 Drama   News    Entertainment     1
#4 Drama   News    Factual           1
#5 Factual Drama   Drama             1
#6 News    Factual Drama             1

数据:

data <- structure(list(Index = 1:10, Title = c("Sherlock", "Peaky Blinders", 
"Eastenders", "BBC News", "Antiques Roadshow", "Peaky Blinders", 
"Casualty", "Eastenders", "BBC News", "Dragons Den"), Date = c("01/01/20", 
"01/01/20", "01/01/20", "01/01/20", "01/01/20", "02/01/20", "02/01/20", 
"02/01/20", "02/01/20", "02/01/20"), Genre = c("Drama", "Drama", 
"Drama", "News", "Factual", "Drama", "Drama", "Drama", "News", 
"Entertainment"), Time = c("21:00", "20:00", "19:30", "18:30", 
"18:00", "21:00", "20:00", "19:30", "18:30", "18:00")), class = "data.frame", row.names = c(NA, 
-10L))

要在 r 中完成,您也可以使用包 runner。要检查可变长度,请使用这样的策略。

n <- 3
cols <- paste0('Col', seq_len(n))

library(runner)
map_dfr(runner(x=data$Genre, k=n, f = function(x) ifelse(length(x) == n, list(x), list(rep(NA, n)))), 
        ~ setNames(.x, cols)) %>%
  na.omit() %>%
  group_by_all() %>%
  summarise(m = n()) %>%
  ungroup() %>%
  filter(m == max(m))

# A tibble: 2 x 4
  Col1  Col2  Col3      m
  <chr> <chr> <chr> <int>
1 Drama Drama Drama     2
2 Drama Drama News      2

对于长度 4 只需更改 n

n <- 4
cols <- paste0('Col', seq_len(n))

map_dfr(runner(x=data$Genre, k=n, f = function(x) ifelse(length(x) == n, list(x), list(rep(NA, n)))), 
        ~ setNames(.x, cols)) %>%
  na.omit() %>%
  group_by_all() %>%
  summarise(m = n()) %>%
  ungroup() %>%
  filter(m == max(m))
# A tibble: 1 x 5
  Col1  Col2  Col3  Col4      m
  <chr> <chr> <chr> <chr> <int>
1 Drama Drama Drama News      2

使用的数据

> data
   Index             Title     Date         Genre  Time
1      1          Sherlock 01/01/20         Drama 21:00
2      2    Peaky Blinders 01/01/20         Drama 20:00
3      3        Eastenders 01/01/20         Drama 19:30
4      4          BBC News 01/01/20          News 18:30
5      5 Antiques Roadshow 01/01/20       Factual 18:00
6      6    Peaky Blinders 02/01/20         Drama 21:00
7      7          Casualty 02/01/20         Drama 20:00
8      8        Eastenders 02/01/20         Drama 19:30
9      9          BBC News 02/01/20          News 18:30
10    10       Dragons Den 02/01/20 Entertainment 18:00