TABLEAU : 날짜에 따른 차원 집합의 유사성을 어떻게 측정 할 수 있습니까?
이것은 약간 복잡한 문제입니다.하지만 최선을 다해 설명하겠습니다. 특정 VOD 인터페이스에서 매일 스크랩하는 데이터로 구성된 데이터 세트가 있습니다. 매일 약 120 개의 타이틀이 전시됩니다 (12 x 10 그리드)-데이터에는 스크랩 날짜, 프로그램 제목, 프로그램의 수직 / 수평 위치, 장르, 시놉시스 등 다양한 변수가 포함됩니다.
제가하고 싶은 것 중 하나는 매일 제공되는 제품의 유사성을 분석하는 것입니다. 이것이 의미하는 바는 주어진 날짜에 얼마나 많은 타이틀이 이전 날짜에 나타 났는지 비교하고 싶다는 것입니다 (이상적으로는 백분율로 표시됨). 따라서 120 개 중 40 개 타이틀이 전날과 동일하다면 유사성은 30 %가됩니다.
여기에 문제가 있습니다-나는 이것을하는 방법을 알고 있습니다 (R을 사용하여 스크립트를 작성하는 것을 도운 바로이 사이트의 친절하게 낯선 사람에게 감사합니다). 여기에서 더 자세한 정보를 제공하는 게시물을 볼 수 있습니다. 특정 행 (R)에서 데이터 프레임 내 유사성을 계산합니다 .
그러나이 방법은 매일 총 타이틀 수를 기준으로 유사성 점수를 생성하는 반면 다른 필터를 적용한 후 유사성을 탐색 할 수 있기를 원합니다. 특히 처음 4 개의 행과 열에 나타나는 제목으로 초점을 좁히고 싶습니다. 즉, 해당 직책에서 전날과 동일한 타이틀이 몇 개입니까? R 스크립트를 수정하여이 작업을 수행 할 수 있지만 더 좋은 방법은 Tableau 내에서이 작업을 수행하여 "실시간"으로 이러한 매개 변수를 변경할 수있는 것 같습니다. 즉, 상위 6 개 행과 열에 초점을 맞추고 싶다면 R 스크립트를 다시 실행하고 기본 데이터를 업데이트 할 필요가 없습니다!
여기에서 아주 분명한 것을 놓치고있는 것처럼 느껴집니다. 아마도 간단한 테이블 계산일까요? 아니면 어떻게 든 Tableau에 데이터 하위 집합을 지정해야합니까?
이 모든 것이 말이 되길 바라지 만, 그렇지 않다면 기꺼이 설명하겠습니다. 또한 연구 목적으로 기초 데이터를 제공 할 수는 없지만 도움이되는 경우 샘플을 제공 할 수 있습니다.
미리 감사드립니다 :)
답변
Alex가 제안했듯이 두 세계를 모두 활용할 수 있습니다. 하지만 제가 아는 한 Tableau Desktop은 계산 된 필드 script_int
script_real
등을 통해 R (또는 python 등)과의 인터페이스를 허용합니다 .이 모든 것이 계산 된 필드를 통해 tableau에서 사용될 수 있습니다 . 현재 tableau의 이러한 함수를 사용하면 Table calculations
tableau에서 컨텍스트에서만 작동하는 계산 된 필드를 만들 수 있습니다. 이러한 값 (필드 / 열)을 하드 코딩 할 수 없으므로 우리는 상황에 따라 독립적으로 사용할 자유가 없습니다. 또한 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로 가져 와서 원하는대로 매개 변수 종속보기를 만들었습니다.

두 세계의 장점을 모두 누릴 수 있습니다. Tableau를 사용하여 데이터에 연결하고 원하는대로 필터링 한 다음 Tableau가 R 스크립트를 호출하여 유사성을 계산하고 결과를 Tableau에 반환하여 표시하도록합니다.
이것이 당신의 사용 사례에 맞다면, 이것을 실행하기위한 메커니즘을 배워야합니다. Tableau 측에서는 SCRIPT라는 단어로 시작하는 함수를 사용하여 R 코드를 호출합니다 (예 : SCRIPT_REAL () 또는 SCRIPT_INT () 등). 이는 테이블 계산이므로 테이블 계산은 특히 분할 및 주소 지정과 관련하여 작동합니다. 이는 Tableau 도움말에 설명되어 있습니다. 또한 도움말-> 설정 및 성능 메뉴에서 외부 서비스를 관리하여 R 코드에 대한 호스트에서 Tableau를 가리켜 야합니다.
R 측에서는 물론 함수를 작성한 다음 RServe () 함수를 사용하여 Tableau에서 액세스 할 수 있도록합니다. Tableau는 인수 벡터를 R로 보내고 응답으로 벡터를 기대합니다. 위에서 언급 한 분할 및 주소 지정은 이러한 벡터의 크기와 순서를 제어합니다.
역학을 작동시키는 것은 약간 까다로울 수 있지만 작동합니다. 먼저 간단한 것을 연습하십시오.
자세한 내용은 Tableau 웹 사이트 리소스를 참조하십시오. 이 기능의 공식 이름은 Tableau "분석 확장"입니다.
R에서이 문제를 해결하기위한 전략을 공유하고 있습니다.
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
행운을 빕니다