TABLEAU: Comment puis-je mesurer la similitude des ensembles de dimensions entre les dates?

Nov 21 2020

c'est un peu compliqué - mais je ferai de mon mieux pour l'expliquer. J'ai un ensemble de données composé de données que je récupère chaque jour à partir d'une interface de vidéo à la demande particulière. Chaque jour, environ 120 titres sont affichés (une grille de 12 x 10) - les données comprennent une gamme de variables: date de gratte, titre du programme, position verticale / horizontale du programme, genre, synopsis, etc.

L'une des choses que je souhaite faire est d'analyser la similitude de l'offre au quotidien. Ce que je veux dire par là, c'est que je veux comparer combien de titres un jour donné sont apparus à la date précédente (idéalement exprimé en pourcentage). Donc, si 40 (sur 120) titres étaient les mêmes que la veille, la similitude serait de 30%.

Voici la chose - je sais comment faire cela (merci à un inconnu sur ce site même qui m'a aidé à écrire un script en utilisant R). Vous pouvez voir l'article ici qui donne plus de détails: Calculer la similitude dans une trame de données sur des lignes spécifiques (R)

Cependant, cette méthode crée un score de similitude basé sur le nombre total de titres au jour le jour, alors que je souhaite également pouvoir explorer la similitude après avoir appliqué d'autres filtres. Plus précisément, je souhaite limiter le focus aux titres qui apparaissent dans les quatre premières lignes et colonnes. En d'autres termes: combien de ces titres sont les mêmes que la veille à ces postes? Je pourrais le faire en modifiant le script R, mais il semble que le meilleur moyen serait de le faire dans Tableau afin que je puisse modifier ces paramètres en «temps réel», pour ainsi dire. C'est-à-dire que si je veux me concentrer sur les 6 premières lignes et colonnes, je ne veux pas avoir à exécuter à nouveau le script R et à mettre à jour les données sous-jacentes!

C'est comme si je manquais quelque chose de très évident ici - c'est peut-être un simple calcul de table? Ou j'ai besoin de dire à Tableau comment sous-ensemble les données?

J'espère que tout cela a du sens, mais je serai heureux de clarifier si ce n'est pas le cas. De plus, je ne peux pas vous fournir les données sous-jacentes (pour des raisons de recherche!) Mais je peux fournir un échantillon si cela peut aider.

Merci d'avance :)

Réponses

1 AnilGoyal Nov 22 2020 at 19:35

Comme Alex l'a suggéré, vous pouvez avoir le meilleur des deux mondes. Mais à ma connaissance, Tableau Desktop permet une interface avec R (ou python, etc.) via des champs calculés, c'est-à-dire, script_int script_realetc. Tous ces éléments peuvent être utilisés dans un tableau via des champs calculés . Actuellement, ces fonctions en tableau permettent la création sur un champ calculé à travers Table calculationslequel en tableau ne fonctionnent que dans le contexte. Nous ne pouvons pas coder en dur ces valeurs (champs / colonnes) et donc. nous ne sommes pas libres de les utiliser indépendamment du contexte. De plus, les calculs de table en tableau ne peuvent être ni agrégés ni mélangés avec des expressions LOD. Ainsi, dans votre cas d'utilisation, (encore une fois à ma connaissance), vous pouvez créer une vue dépendant des paramètres dans le tableau, après avoir codé en dur les valeurs via n'importe quel langage de programmation de votre choix. Je suggère donc qu'avant d'importer des données dans tableau, une nouvelle colonne puisse être créée dans votre ensemble de données en exécutant la suite (ou en alternant selon le langage de programmation de choix)

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

Cela a créé une nouvelle colonne nommée similaritydans l'ensemble de données dans laquelle 1indique qu'il était disponible le jour précédent, 0indique qu'il n'a pas été examiné le jour précédent et NAsignifie qu'il s'agit du premier jour de son examen.

J'ai importé cet ensemble de données dans tableau et créé une vue dépendante des paramètres, comme vous le souhaitez.

3 AlexBlakemore Nov 21 2020 at 06:40

Tu peux avoir le meilleur des deux mondes. Utilisez Tableau pour vous connecter à vos données, filtrez comme vous le souhaitez, puis demandez à Tableau d'appeler un script R pour calculer la similitude et renvoyer les résultats à Tableau pour affichage.

Si cela correspond à votre cas d'utilisation, vous devez apprendre les mécanismes pour mettre cela en jeu. Du côté de Tableau, vous utiliserez les fonctions qui commencent par le mot SCRIPT pour appeler votre code R, par exemple SCRIPT_REAL (), ou SCRIPT_INT () etc. Ce sont des calculs de table, vous devrez donc apprendre comment table les calculs fonctionnent, notamment en ce qui concerne le partitionnement et l'adressage. Ceci est décrit dans l'aide de Tableau. Vous devrez également pointer Tableau vers l'hôte de votre code R, en gérant les services externes dans le menu Aide-> Paramètres et performances.

Du côté R, vous devrez bien sûr écrire votre fonction, puis utiliser la fonction RServe () pour la rendre accessible à Tableau. Tableau envoie des vecteurs d'arguments à R et attend un vecteur en réponse. Le partitionnement et l'adressage mentionnés ci-dessus contrôlent la taille et l'ordre de ces vecteurs.

Cela peut être un peu difficile de faire fonctionner les mécanismes, mais ils fonctionnent. Entraînez-vous d'abord sur quelque chose de simple.

Consultez les ressources du site Web de Tableau pour plus d'informations. Le nom officiel de cette fonctionnalité est «extensions analytiques» de Tableau

2 AnilGoyal Nov 21 2020 at 21:36

Je partage une stratégie pour résoudre ce problème dans R.

Étape 1 Chargez les bibliothèques et les données

library(tidyverse)
library(lubridate)

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

définissez les lignes et les colonnes auxquelles vous souhaitez limiter votre recherche de similarité dans deux variables. Supposons que vous limitez la recherche à 5 colonnes et 4 lignes uniquement

filter_for_row <- 4
filter_for_col <- 5

Obtenir le résultat final

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

Si vous modifiez les filtres sur 12, 12 respectivement, alors

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 

Bonne chance