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

如何解决如何使用 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

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

我的数据有数千个日期(这是 BBC One 的广播时间表,以防您想知道),我想找出最常见的类型组合/序列是什么(至少 3 个)。

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

解决方法

如果您查看大量数据,其中数据行的顺序对分析至关重要,那么无论您使用何种可视化工具,您都应该了解 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,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","Casualty","Dragons Den"),Date = c("01/01/20","01/01/20","02/01/20","02/01/20"),Genre = c("Drama","Drama","News","Factual","Entertainment"),Time = c("21:00","20:00","19:30","18:30","18:00","21:00","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,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?