Solution:
We start by accessing the cleaned Letterboxd dataset using a CSV Reader node. With the Expression node we create a “decade” column: We divide the ‘’year_released’’ column values by 10, apply a floor function to that value, multiply it with 10, and add ”s” at the end.
Note: Instead of Rule Engine, use the mighty Expression node to create the decade column here for efficiency.
As many movies fall into multiple genres, we use a Cell Splitter node to split them into unique values, followed by an Ungroup node so that each movie-genre pair occupies its own row. A Column Renamer node is used to quickly clean up and rename the “genres_SplitResultList” column to "genre".
From here, the preprocessed data splits into four branches.
First branch: Top 5 Most Popular vs. Top 5 Best Rated Genres. We use a GroupBy node to aggregate the data by “genre” and calculate the average for “rating” and “popularity”. Use two parallel Top k Row Filter nodes, one keeps the top 5 best rated genres, while the other keeps the top 5 most popular genres. Both filtered tables connect to a Reference Row Filter node, which identifies the overlapping genres that rank in the top 5 for both criteria.
Second branch: Comparing Runtimes Across Genres. An Expression node categorizes each movie into runtime groups based on duration: "Short Film" (< 60 minutes), "Standard" (< 150 minutes), and "Epic". A Pivot node then calculates the average runtime of movies by genre and runtime category. We use a Row Filter node to narrow our focus to specific genres (“Documentary”, “History,” and “Crime”), assign different colors to each genre using a Color Manager node and lastly visualize output with a Bar Chart node for easier comparison.
Third branch: Average Rating of Genres Over Time. To analyze rating trends, a Pivot node calculates the average movie rating grouped by decade and genre. We apply a Column Filter node and choose “Action”, “Crime”, “Romance”, and “Music” columns. Lastly, we connect the aggregated data to a Line Plot node to visualize how audience ratings have changed over decades.
Fourth branch: Hidden Gems. To uncover overlooked masterpieces, i.e., movies that are highly rated yet not extremely popular, the original dataset is connected to a Row Filter node that filters out low-quality or obscure entries. We filter the data as follows:
“vote_count” between 100 and 2000: To ensure that the movies have a wide enough audience and at the same time are no Hollywood legacies,
“vote_average” higher than 7.5: To ensure we are generally looking at highly rated movies, and
popularity less than 40: To ensure that massive blockbusters will not dominate the chart. Note: Here, popularity refers to a real-time hype meter measuring how many people are actively talking about, searching for, and logging the movie right now.
After filtering the data, we use an Expression node to apply a custom formula to calculate the Hidden Gem Score (HGS). Note that there’s no official formula for discovering hidden gems. We have used a formula inspired by TF-IDF from document analysis that penalizes high popularity and rewards high ratings: $["vote_average"]/(log10($["popularity"]+10))
Lastly, we use a Top k Row Filter node to pick the top 25 and visualize the resulting table with Table View node.