TABLEAU: Jak zmierzyć podobieństwo zestawów wymiarów w różnych datach?

Nov 21 2020

jest to trochę skomplikowane - ale postaram się wyjaśnić. Mam zbiór danych zawierający dane, które codziennie zbieram z określonego interfejsu wideo na żądanie. Każdego dnia na wystawie jest około 120 tytułów (siatka 12 x 10) - dane obejmują szereg zmiennych: datę wydania, tytuł programu, pozycję programu w pionie / poziomie, gatunek, streszczenie itp.

Jedną z rzeczy, które chcę zrobić, jest przeanalizowanie podobieństwa tego, co mam w codziennej ofercie. Chodzi mi o to, że chcę porównać, ile tytułów w danym dniu pojawiło się w dniu poprzednim (najlepiej wyrażone w procentach). Jeśli więc 40 (ze 120) tytułów było takich samych jak poprzedniego dnia, podobieństwo wyniosłoby 30%.

Oto rzecz - wiem, jak to zrobić (dzięki miłej nieznajomej na tej stronie, która pomogła mi napisać skrypt przy użyciu R). Możesz zobaczyć post tutaj, który zawiera więcej szczegółów: Oblicz podobieństwo w ramce danych w określonych wierszach (R)

Jednak ta metoda tworzy wynik podobieństwa na podstawie całkowitej liczby tytułów z dnia na dzień, podczas gdy chcę również mieć możliwość zbadania podobieństwa po zastosowaniu innych filtrów. W szczególności chcę zawęzić fokus do tytułów, które pojawiają się w pierwszych czterech wierszach i kolumnach. Innymi słowy: ile z tych tytułów jest takich samych jak poprzedniego dnia na tych pozycjach? Mógłbym to zrobić, modyfikując skrypt R, ale wydaje się, że lepszym sposobem byłoby zrobienie tego w Tableau, tak żebym mógł zmienić te parametry w „czasie rzeczywistym”, że tak powiem. To znaczy, jeśli chcę skupić się na pierwszych 6 wierszach i kolumnach, nie chcę ponownie uruchamiać skryptu R i aktualizować danych bazowych!

Wydaje mi się, że brakuje mi czegoś bardzo oczywistego - może to proste obliczenie tabeli? Czy muszę jakoś powiedzieć Tableau, jak podzielić dane?

Mam nadzieję, że to wszystko ma sens, ale z przyjemnością wyjaśnię, jeśli nie. Nie mogę również podać podstawowych danych (ze względów badawczych!), Ale mogę podać próbkę, jeśli to pomoże.

Z góry dziękuję :)

Odpowiedzi

1 AnilGoyal Nov 22 2020 at 19:35

Jak zasugerował Alex, możesz mieć to, co najlepsze z obu światów. Ale zgodnie z moją najlepszą wiedzą, Tableau Desktop umożliwia interfejs z R (lub Pythonem itp.) Poprzez pola obliczeniowe, tj. script_int script_realItp. Wszystkie te mogą być używane w tabeli poprzez pola obliczeniowe . Obecnie te funkcje w tableau pozwalają na tworzenie na polach obliczeniowych, przez Table calculationsktóre w tableau działają tylko w kontekście. Nie możemy na stałe zakodować tych wartości (pól / kolumn), a tym samym. nie możemy ich używać niezależnie od kontekstu. Ponadto obliczenia tabelaryczne w tableau nie mogą być dalej agregowane ani mieszane z wyrażeniami LOD. Tak więc w twoim przypadku użycia (ponownie zgodnie z moją najlepszą wiedzą) możesz zbudować widok zależny od parametrów w tabeli, po zakodowaniu wartości na stałe za pomocą dowolnego wybranego języka programowania. Dlatego sugeruję, aby przed zaimportowaniem danych w tabeli można utworzyć nową kolumnę w zbiorze danych, uruchamiając następujące (lub alternatywne zgodnie z wybranym językiem programowania)

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")

Spowodowało to utworzenie nowej kolumny nazwanej similarityw zbiorze danych, w której 1oznacza to, że była dostępna poprzedniego dnia, 0oznacza, że ​​nie była ona sprawdzana bezpośrednio poprzedniego dnia i NAoznacza, że ​​jest to pierwszy dzień jej kontroli.

Zaimportowałem ten zestaw danych do tabeli i utworzyłem widok zależny od parametrów, zgodnie z życzeniem.

3 AlexBlakemore Nov 21 2020 at 06:40

Możesz mieć to, co najlepsze z obu światów. Użyj Tableau, aby połączyć się ze swoimi danymi, przefiltruj według potrzeb, a następnie niech Tableau wywoła skrypt R w celu obliczenia podobieństwa i zwrócenia wyników do Tableau w celu wyświetlenia.

Jeśli to pasuje do twojego przypadku użycia, musisz nauczyć się mechaniki, aby wprowadzić to w grę. Po stronie Tableau będziesz używać funkcji zaczynających się od słowa SCRIPT do wywoływania kodu R, na przykład SCRIPT_REAL () lub SCRIPT_INT () itd. To są obliczenia tabelaryczne, więc musisz się nauczyć, jak table obliczenia działają, w szczególności w odniesieniu do partycjonowania i adresowania. Jest to opisane w pomocy Tableau. Będziesz także musiał wskazać Tableau na hoście dla swojego kodu R, zarządzając usługami zewnętrznymi w menu Pomoc-> Ustawienia i wydajność.

Po stronie R musisz oczywiście napisać swoją funkcję, a następnie użyć funkcji RServe (), aby udostępnić ją Tableau. Tableau wysyła wektory argumentów do R i oczekuje wektora w odpowiedzi. Wspomniane powyżej partycjonowanie i adresowanie kontroluje rozmiar i kolejność tych wektorów.

Uruchomienie mechaniki może być nieco trudne, ale działają. Najpierw przećwicz coś prostego.

Aby uzyskać więcej informacji, zobacz zasoby witryny internetowej Tableau. Oficjalna nazwa tej funkcji to Tableau „rozszerzenia analityczne”

2 AnilGoyal Nov 21 2020 at 21:36

Podzielam się strategią rozwiązania tego problemu w R.

Step-1 Załaduj biblioteki i dane

library(tidyverse)
library(lubridate)

movies <- tibble(read.csv("movies.csv"))
movies$date <- as.Date(movies$date, format = "%d-%m-%Y")

ustaw wiersze i kolumny, do których chcesz ograniczyć wyszukiwanie podobieństwa, w dwóch zmiennych. Załóżmy, że ograniczasz wyszukiwanie tylko do 5 kolumn i 4 wierszy

filter_for_row <- 4
filter_for_col <- 5

Uzyskanie ostatecznego wyniku

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

Jeśli zmienisz filtry odpowiednio na 12, 12, to

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 

Powodzenia