本記事を訪問してくださりありがとうございます。
私はデータ分析支援の業務に従事して約4年目の、自称データサイエンティストかぶれです。
実務を通じてデータ活用やダッシュボード構築の経験は確実に積めてきた実感がある一方で、「自分の知識やスキルの整理がしっかりできているか」「実力が本物か」を客観的に評価・腕試ししたいと考え、恐る恐るData Saber への挑戦を決意しました。Data Saberへの挑戦の一環として、単にグラフを並べるだけでなく「ユーザーが能動的にデータを楽しめる探索型ダッシュボード」の製造に挑戦しました。
今回は「90年代ホラー映画のDVDメニュー風」というテーマのもと、IMDbの基本データセットに対してPythonでAPIを叩いてデータを拡充し、Tableauの高度なダッシュボードアクションを活用した分析体験(UX)を設計しました。
全体の技術構成と、製造の過程で得られたデータ可視化・分析における学びをまとめます。
1. 成果物と目的
成果物(Tableau Public)
Pick Your Poison - Interactive Horror Movie Explorer
※Public上だとTrailer再生がうまくいかないことがあるので、お時間ある人(見てやってもいいぞという人)はダウンロードして触ってみていただく方がよいかもです。
設計思想と分析軸
ユーザーが直感的に「次に観るべき作品」を探せるよう、ジャンルフィルター、ホバーによるポスター/あらすじ展開、クリックによる予告編再生といった多層的なインタラクションを組み込んでいます。
「ちょっとニッチなところを責めたい」といったニーズにも応えられたらと思い、映画データを単にランキング表示するのではなく、「評価点(Rating)」 と 「注目度・レビュー数(Votes)」 の2軸による散布図をもとに探索できるように設計しました。
- 高Rating × 高Votes: 万人が認めるメガヒット名作
- 高Rating × 低Votes: 知る人ぞ知る「隠れた名作・カルト的人気作」
2. Python×TMDb APIによる「分析データの拡充」
元データ(IMDbのデータ(CSV形式)をKaggleから見つけて利用させていただきました)には評価点や興行収入などの数値データは揃っていましたが、分析画面としての視認性や探索体験を高めるための「視覚要素(ポスター画像・あらすじ・動画キー)」が不足していました。
そこで、TMDb(The Movie Database)のAPIを利用し、Pythonでデータをエンリッチメント(拡充)するデータパイプラインを作成しました。
import pandas as pd
import requests
import time
# 1. 既存の映画データの読み込み
df = pd.read_csv('Horror Movies IMDb.csv')
API_KEY = "YOUR_TMDB_API_KEY"
def get_tmdb_media(title, year):
# 変数の初期化(スコープ外エラーの防止)
youtube_key = None
poster_url = None
overview = ""
try:
# 映画検索(英語あらすじ取得のため language=en-US を指定)
search_url = f"https://api.themoviedb.org/3/search/movie?api_key={API_KEY}&query={title}&year={year}&language=en-US"
res = requests.get(search_url, timeout=5).json()
if res.get('results'):
first_result = res['results'][0]
movie_id = first_result['id']
# 英語あらすじとポスター画像の取得
overview = first_result.get('overview', '')
poster_path = first_result.get('poster_path')
if poster_path:
poster_url = f"https://image.tmdb.org/t/p/w500{poster_path}"
# 予告編動画(YouTube)の取得
videos_url = f"https://api.themoviedb.org/3/movie/{movie_id}/videos?api_key={API_KEY}"
vid_res = requests.get(videos_url, timeout=5).json()
for vid in vid_res.get('results', []):
if vid.get('site') == 'YouTube' and vid.get('type') == 'Trailer':
youtube_key = vid.get('key')
break
except Exception as e:
print(f" [Skip] エラー ({title}): {e}")
return youtube_key, poster_url, overview
# 各列の追加と出力
overviews, poster_urls, youtube_keys = [], [], []
for idx, row in df.iterrows():
key, p_url, ov = get_tmdb_media(row['Movie Title'], row['Movie Year'])
youtube_keys.append(key)
poster_urls.append(p_url)
overviews.append(ov)
time.sleep(0.1)
df['youtube_key'] = youtube_keys
df['poster_url'] = poster_urls
df['overview'] = overviews
df.to_csv('Horror_Movies_IMDb_with_Youtube.csv', index=False)
技術的な獲得ポイント
可視化ツール(Tableau)だけに頼るのではなく、前処理段階で外部APIと連携してメタデータを結合・整列させておくことで、Tableau上の表現の幅が飛躍的に高まることを実感しました。
3. Tableauにおける高度なインタラクション設計
拡充したデータをもとに、Tableauで「操作していて心地よい」ダッシュボードアクションを組み上げました。
多層的なダッシュボードアクションの使い分け
- ジャンル選択(フィルターアクション)
- 左上のジャンルリストから対象を選択し、散布図を即座にフィルタリング。
- ポスター&あらすじ展開(ホバーアクション)
- 散布図のデータポイントにマウスオーバー(ホバー)するだけで、右側のWebページオブジェクトおよびテキストシートに
poster_urlとoverviewが動的に読み込まれる設定。
- 予告編動画の再生(URLアクション)
- 散布図のポイントをクリックすることで、対象映画の
youtube_keyを組み込んだURLを生成し、外部ブラウザでスムーズに動画を開く導線設計。
4. おわりに:Data Saberへの挑戦を通して得たデータ表現の広がり
今回の制作を通して、ダッシュボード構築における以下の重要な観点を学ぶことができました。
- 「データの加工」から「見せる体験」までの一貫性: データセットの欠損を補うAPI連携から、UIのレイアウト設計までをトータルで設計する重要性。
- コンテクスト(文脈)と分析機能の両立: 世界観(ホラー映画のDVDメニュー風)を演出しつつも、散布図によるデータ分析・探索という本質的な目的をブレさせないバランス感覚。
今後も単なる「綺麗なレポート」にとどまらず、見る人が能動的にデータを探索したくなるようなダッシュボード構築を目指していきます!