伸びているチャンネルは「いつ・何を・どんな言葉で」出しているのか。感覚で眺めるのではなく、数字とパターンで掴みたい。YouTube の公式APIを使えば、その分析は自分の手で組める。
目次
このガイドで作るもの
キーワードで YouTube チャンネルを検索し、統計・人気動画・投稿パターン・頻出ワードまでを分析する Streamlit アプリ。再生回数や登録者数だけでなく、月別・曜日・時間帯の投稿傾向や、タイトル・説明文から抽出したキーワードをワードクラウドで可視化し、CSV/PDF レポートにまとめる。
本体は1ファイル(youtube_analyzer.py)に、API取得・extract_keywords()(形態素解析)・generate_wordcloud()・generate_pdf_report() が並ぶ素直な構成だ。
例えば、こんな調査が15分で終わる
このアプリで何が出来るか、使う場面を1つ通しで見せる。「料理系チャンネルを始めたい。先行チャンネルの出し方を知りたい」という場面だ。
- キーワード欄に「時短レシピ」と入れて検索する。上位チャンネルの登録者・総再生・動画本数が一覧になる。
- 気になるチャンネルを選ぶと、月別の投稿数と平均再生のグラフが出る。「投稿を月8本に増やした月から平均再生も伸びている」といった変化が読み取れる。
- 曜日×時間帯のヒートマップで、投稿が集中する帯を見る。人気動画の一覧で、再生を稼いだタイトルを並べて眺める。
- 頻出ワードのワードクラウドで、タイトルに使われる言葉の傾向(「10分」「作り置き」「初心者」…)を掴む。
- CSVで書き出して、比較したいチャンネルぶん繰り返す。
手作業なら動画を1本ずつ開いてメモする調査が、キーワード1つで数分に縮む。浮いた時間は、「自分は何を出すか」を考える方に回せる。参入前の下調べに限らず、自分のチャンネルを持ってからも「隣の芝の定点観測」として同じ手順が使い回せる。
設計の起点:APIの「数字」を「示唆」に変える
YouTube Data API v3 は生のメトリクスを返す。だが再生回数の羅列を見ても示唆は出ない。価値が生まれるのは集計して傾向にする工程だ。投稿日時を曜日・時間帯に畳み、タイトルを形態素解析して頻出語にする。「数字を、人が読める傾向に変換する」ことを設計の中心に置いた。
作り方の要点
0. APIキーを用意する(無料)
最初の準備はAPIキーの取得だ。Google Cloud Console でプロジェクトを作り、「YouTube Data API v3」を有効化して、認証情報からAPIキーを発行する。ここまで課金は発生せず、クレジットカードの登録も要らない。既定の無料クォータ(後述の1日10,000ユニット)の範囲で使う分にはタダだ。発行したキーは環境変数に置き、コードにもGitにも直接書かない。この「鍵と鍵穴を分けて持つ」習慣は、どのAPIを使うときも同じ形で効く。取得の詳しい画面遷移は変わることがあるので、迷ったら「YouTube Data API v3 キー 取得」で公式ドキュメントを見るのが確実だ。
1. Data API v3 で検索 → 統計をまとめて取る
google-api-python-client で API クライアントを作る。APIキーは環境変数等から渡し、コードに直書きしない。search は動画IDしか返さないので、IDを集めてから videos で統計を一括取得する(呼び出し回数=クォータを抑える定石)。
# youtube_analyzer.py
from googleapiclient.discovery import build
youtube = build('youtube', 'v3', developerKey=api_key)
# キーワードで検索 → 動画IDを集める
search = youtube.search().list(
part='snippet', q=query, type='video', maxResults=50,
).execute()
video_ids = [it['id']['videoId'] for it in search.get('items', [])]
# videos でまとめて統計を取る(search を繰り返さない=クォータ節約)
videos = youtube.videos().list(
part='snippet,statistics', id=','.join(video_ids),
).execute()
チャンネルの登録者・総再生は youtube.channels().list(part='statistics', ...) で取る。
ここでクォータ(1日の利用枠)の感覚も持っておきたい。YouTube Data API v3 の枠は既定で1日10,000ユニット。消費は呼び出しの種類で大きく違い、search は1回100ユニット、videos や channels は1回1ユニットだ。検索を1日100回叩くと、それだけで枠が尽きる計算になる。「search でIDだけ集めて、詳細は videos でまとめて1回」という上の定石は、コードの美学の話ではない。この“価格表”から来ている。
2. 投稿パターンを「時間軸」で畳む
各動画の投稿日時を pandas で月・曜日・時間帯に分解し、集計する。曜日×時間帯はヒートマップにすると「平日夜に出している」といった癖が一目で分かる。
# 投稿日時を月・曜日・時間帯に分解して集計する
df['publishedAt'] = pd.to_datetime(df['publishedAt'])
df['month'] = df['publishedAt'].dt.to_period('M')
df['weekday'] = df['publishedAt'].dt.day_name()
df['hour'] = df['publishedAt'].dt.hour
monthly = df.groupby('month').agg(
video_count=('id', 'count'),
avg_views=('viewCount', 'mean'),
total_views=('viewCount', 'sum'),
).reset_index()
# 曜日 × 時間帯のクロス集計(plotly px.imshow でヒートマップにする)
weekday_hour = pd.crosstab(df['weekday'], df['hour'])
3. 日本語タイトルは janome で分かち書きする
日本語はそのまま単語分割できない。janome で形態素解析し、名詞・形容詞だけを原形で拾い、助詞や定型句(「チャンネル登録」等)をストップワードで落とす。数字・1文字語も除外して精度を上げる。
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
freq = {}
for token in tokenizer.tokenize(text):
base = token.base_form
pos = token.part_of_speech.split(',')[0] # 品詞の大分類
if (pos in ('名詞', '形容詞')
and len(base) > 1
and base.lower() not in stop_words
and not base.isdigit()):
freq[base] = freq.get(base, 0) + 1
top = sorted(freq.items(), key=lambda x: x[1], reverse=True)[:top_n]
3.5 なぜ Streamlit なのか
画面は Streamlit で作っている。分析ツールにこれを選ぶ理由は、画面のコードがほぼ要らないからだ。st.text_input() で検索欄、st.plotly_chart() でグラフ、st.download_button() でCSV出力。HTML も CSS も書かずに、Python の分析コードへ数行足すだけで操作画面が付く。自分用の分析道具は「分析ロジック9割・画面1割」の配分で作れるのが理想で、Streamlit はその配分を実現してくれる。ブラウザで動くが、実体はローカルの Python プロセスなので、APIキーやデータが外部に出ることもない。
4. ワードクラウドとレポート出力
頻出語は wordcloud で可視化する。日本語は フォントを明示しないと豆腐(□)になるので font_path を必ず指定する。描画は matplotlib 経由のPNG出力だ。
from wordcloud import WordCloud
wc = WordCloud(
width=800, height=400, background_color='white',
max_words=100, colormap='viridis',
font_path='C:/Windows/Fonts/meiryo.ttc', # 日本語フォントは必須
).generate(cleaned_text)
# CSV は to_csv を Streamlit の download_button に渡すだけ
st.download_button('CSVをダウンロード', report_df.to_csv(index=False), 'report.csv')
# PDF は reportlab で表とワードクラウド画像を組んで出力する
出力を2形式にしてあるのは、行き先が違うからだ。CSVは自分の再分析用で、Excel やスプレッドシートに読ませて並べ替えたり、複数チャンネルの結果を1枚に結合したりする素材になる。PDFは人に見せる用で、「このジャンルはこういう傾向でした」を企画の相談相手にそのまま渡せる。分析は、共有できる形になって初めてチームの判断材料になる。自分ひとりの運用でも、月1でPDFを残しておくと「あの頃このジャンルはこうだった」という定点記録が貯まっていく。
5. 集計を「判断」に変える読み方
グラフを作って満足すると、分析は途中で止まる。ヒートマップで「土日の18〜21時に投稿が集中し、平均再生も高い」と出たなら、その帯は視聴者が動いている時間で、後発が同じ帯にぶつけるか、あえて空いている平日夜を試すかの判断材料になる。頻出語で「初心者」「◯◯分で」が上位に来るなら、そのジャンルではタイトルの型が機能している証拠だ。分析アプリの出口は、「次の1本をいつ・何を・どんなタイトルで出すか」という仮説。そこまで落とし込めて初めて、この道具は元が取れる。
読み違えやすい点も1つ。頻出ワードは「そのジャンルでよく使われる言葉」であって、「使えば伸びる言葉」ではない。全員が使う言葉は差別化にならないし、頻出語と再生数の間に因果があるとも限らない。ワードクラウドは「土俵の共通言語を知る」道具として使い、勝ち筋は人気動画の個別分析(どのタイトルが平均を大きく超えたか)から探す。集計は傾向を、外れ値はチャンスを教えてくれる。役割が違う。
つまずきと対策
- 日本語が文字化け(豆腐):wordcloud / matplotlib に日本語フォント(meiryo 等)を
font_pathで明示する。 - クォータ枯渇:
searchは高コスト。IDを集めてvideosで一括取得し、partは必要分だけにする。 - 頻出語にノイズ:「登録」「チャンネル」「http」等はストップワードで落とし、名詞・形容詞だけを残すと示唆が立つ。
使用ライブラリと順守メモ
- API利用規約:YouTube API Services の利用規約・デベロッパーポリシーの範囲内で利用する。APIキーは各自取得し、クォータと、取得データの保存・表示に関する規約を順守する。
- 著作権・データの扱い:取得する統計・タイトル・説明文は各チャンネル(権利者)や YouTube に帰属する。分析は自己利用・調査の範囲に留め、他者チャンネルのデータやレポートを無断で再配布・商用転用しない。
- 商標:YouTube / Google は各社の商標。記述的な言及に留め、提携・公認を示唆しない。
- 主要ライブラリは OSS:janome=BSD、wordcloud=MIT、streamlit/google-api-python-client=Apache-2.0、pandas/matplotlib/plotly=BSD・MIT 系。
まとめ
勘所は3つ。① 検索でID→videos で統計を一括取得(クォータ節約)、② 投稿日時を月・曜日・時間帯に畳んでヒートマップ化、③ 日本語は janome で名詞・形容詞だけ拾う。「APIの数字を、投稿パターンや頻出語という示唆に変換する」発想は、YouTube に限らずデータ分析全般に効く。生データを眺める道具は世の中に多いが、判断につながる形まで加工する部分こそ、自作する価値のある領域だ。
👉 関連: 開発実例:YouTubeチャンネル分析 ・ YouTube関連の開発実例 ・ ほかのアプリの作り方