TABLEAU:日付全体のディメンションセットの類似性を測定するにはどうすればよいですか?

Nov 21 2020

これは少し複雑ですが、説明するために最善を尽くします。特定のビデオオンデマンドインターフェイスから毎日取得したデータで構成されるデータセットがあります。毎日約120のタイトルが表示されています(12 x 10のグリッド)-データには、スクレイピングの日付、プログラムのタイトル、プログラムの垂直/水平位置、ジャンル、概要など、さまざまな変数が含まれています。

私がやりたいことの1つは、日々提供されているものの類似性を分析することです。これが意味するのは、特定の日に前日に表示されたタイトルの数を比較したいということです(理想的にはパーセンテージで表されます)。したがって、40(120のうち)のタイトルが前日と同じである場合、類似性は30%になります。

これが問題です-私はこれを行う方法を知っています(Rを使用してスクリプトを書くのを手伝ってくれたこのサイトの親切な見知らぬ人に感謝します)。詳細については、こちらの投稿をご覧ください。特定の行にわたるデータフレーム内の類似性を計算する(R)

ただし、この方法では、日々のタイトルの総数に基づいて類似性スコアが作成されますが、他のフィルターを適用した後で類似性を調査できるようにもしたいと考えています。具体的には、最初の4行と列に表示されるタイトルに焦点を絞りたいと思います。言い換えれば、これらのタイトルのうち、それらのポジションで前日と同じものはいくつありますか?Rスクリプトを変更することでこれを行うこともできますが、いわば「リアルタイム」でこれらのパラメーターを変更できるように、Tableau内でこれを行う方がよいようです。つまり、上位6行と列に焦点を合わせたい場合は、Rスクリプトをもう一度実行して、基になるデータを更新する必要はありません。

ここで非常に明白な何かが欠けているように感じます-おそらくそれは単純なテーブル計算ですか?または、どういうわけかTableauにデータのサブセット化方法を指示する必要がありますか?

これがすべて理にかなっていることを願っていますが、そうでない場合は明確にさせていただきます。また、基礎となるデータを提供することはできませんが(調査上の理由で!)、役立つ場合はサンプルを提供できます。

前もって感謝します :)

回答

1 AnilGoyal Nov 22 2020 at 19:35

アレックスが示唆したように、あなたは両方の世界の長所を持つことができます。しかし、私の知る限り、Tableau Desktopでは、計算フィールドscript_int script_realなどを介してR(またはPythonなど)とのインターフェイスが可能です。これらはすべて、計算フィールドを介してTableauで使用できます。現在、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にインポートし、必要に応じてパラメーターに依存するビューを作成しました。

3 AlexBlakemore Nov 21 2020 at 06:40

あなたは両方の長所を持つことができます。Tableauを使用してデータに接続し、必要に応じてフィルタリングしてから、TableauにRスクリプトを呼び出して類似性を計算し、結果をTableauに返して表示します。

これがユースケースに適合する場合は、これを実行するためのメカニズムを学ぶ必要があります。Tableau側では、SCRIPTという単語で始まる関数を使用してRコードを呼び出します。たとえば、SCRIPT_REAL()やSCRIPT_INT()などです。これらはテーブル計算であるため、テーブルの方法を学習する必要があります。計算は、特にパーティショニングとアドレス指定に関して機能します。これについては、Tableauヘルプで説明されています。また、[ヘルプ]-> [設定とパフォーマンス]メニューで外部サービスを管理することにより、RコードのホストでTableauを指定する必要があります。

R側では、もちろん関数を記述してから、関数RServe()を使用してTableauにアクセスできるようにします。Tableauは引数のベクトルをRに送信し、応答としてベクトルを期待します。上記のパーティショニングとアドレス指定は、これらのベクトルのサイズと順序を制御します。

メカニックを機能させるのは少し難しいかもしれませんが、機能します。最初に簡単なことで練習してください。

詳細については、TableauのWebサイトのリソースを参照してください。この機能の正式名称は、Tableauの「分析拡張機能」です。

2 AnilGoyal Nov 21 2020 at 21:36

私はこれをRで解決するための戦略を共有しています。

ステップ-1ライブラリとデータをロードします

library(tidyverse)
library(lubridate)

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

類似性検索を制限する行と列を2つの変数に設定します。検索を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 

がんばろう