YouTubeチャンネル分析ツールの作り方 — Data APIで統計・投稿パターン・キーワードを可視化する

アプリの作り方

YouTubeチャンネル分析ツールの作り方 — Data APIで統計・投稿パターン・キーワードを可視化する

伸びているチャンネルは「いつ・何を・どんな言葉で」出しているのか。感覚で眺めるのではなく、数字とパターンで掴みたい。YouTube の公式APIを使えば、その分析は自分の手で組める。

目次
  1. このガイドで作るもの
  2. 例えば、こんな調査が15分で終わる
  3. 設計の起点:APIの「数字」を「示唆」に変える
  4. 作り方の要点
    1. 0. APIキーを用意する(無料)
    2. 1. Data API v3 で検索 → 統計をまとめて取る
    3. 2. 投稿パターンを「時間軸」で畳む
    4. 3. 日本語タイトルは janome で分かち書きする
    5. 3.5 なぜ Streamlit なのか
    6. 4. ワードクラウドとレポート出力
    7. 5. 集計を「判断」に変える読み方
  5. つまずきと対策
  6. 使用ライブラリと順守メモ
  7. まとめ

このガイドで作るもの

キーワードで YouTube チャンネルを検索し、統計・人気動画・投稿パターン・頻出ワードまでを分析する Streamlit アプリ。再生回数や登録者数だけでなく、月別・曜日・時間帯の投稿傾向や、タイトル・説明文から抽出したキーワードをワードクラウドで可視化し、CSV/PDF レポートにまとめる。

本体は1ファイル(youtube_analyzer.py)に、API取得・extract_keywords()(形態素解析)・generate_wordcloud()generate_pdf_report() が並ぶ素直な構成だ。

例えば、こんな調査が15分で終わる

このアプリで何が出来るか、使う場面を1つ通しで見せる。「料理系チャンネルを始めたい。先行チャンネルの出し方を知りたい」という場面だ。

  1. キーワード欄に「時短レシピ」と入れて検索する。上位チャンネルの登録者・総再生・動画本数が一覧になる。
  2. 気になるチャンネルを選ぶと、月別の投稿数と平均再生のグラフが出る。「投稿を月8本に増やした月から平均再生も伸びている」といった変化が読み取れる。
  3. 曜日×時間帯のヒートマップで、投稿が集中する帯を見る。人気動画の一覧で、再生を稼いだタイトルを並べて眺める。
  4. 頻出ワードのワードクラウドで、タイトルに使われる言葉の傾向(「10分」「作り置き」「初心者」…)を掴む。
  5. 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ユニット、videoschannels は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関連の開発実例ほかのアプリの作り方

large-v3-turbo は large-v3 の代わりになるか。日本語で測って、速度の測り方を2回間違えた記録large-v3-turbo は large-v3 の代わりになるか。日本語で測って、速度の測り方を2回間違えた記録前のページ

都市開発シミュを作る⑥|静的ビルドをWordPressへ公開+連載総括【Aurum City制作・完結】次のページ都市開発シミュを作る⑥|静的ビルドをWordPressへ公開+連載総括【Aurum City制作・完結】

ピックアップ記事

  1. New Eden Intelligence Hub の作り方 — EVE Onl…

  2. 競艇予想AIの作り方 — LightGBMで「当たる順位」を学習させる実装ガイド…

  3. 高精度OCRデスクトップアプリの作り方 — PaddleOCR-VLとPyIns…

  4. Claude Mission Control の作り方 — Tauri+Pyth…

関連記事

  1. 競艇予想AIの作り方 — LightGBMで「当たる順位」を学習させる実装ガイド

    アプリの作り方

    競艇予想AIの作り方 — LightGBMで「当たる順位」を学習させる実装ガイド

    過去21万レースを学習し3連単上位10点を出す競艇予想AIの作り方。な…

  2. 高精度OCRデスクトップアプリの作り方 — PaddleOCR-VLとPyInstaller凍結の実践

    アプリの作り方

    高精度OCRデスクトップアプリの作り方 — PaddleOCR-VLとPyInstaller凍結の実…

    PaddleOCR-VLで撮影→解析→翻訳まで完結するOCRアプリの作…

  3. large-v3-turbo は large-v3 の代わりになるか。日本語で測って、速度の測り方を2回間違えた記録
  4. ブラウザで動く都市開発シミュを作る①|React+TypeScript+Canvasの土台と3レイヤ設計【Aurum City制作】
  5. 背景除去アプリを作る⑤|5スライダー後処理+消去/復元ブラシ+20段Undoで「自動9割・手で1割」を仕上げる【背景除去Studio制作】

    アプリの作り方

    背景除去アプリを作る⑤|5スライダー後処理+消去/復元ブラシ+20段Undoで「自動9割・手で1割」…

    完全自動を狙うより、自動+微修正の方が実用品質に早く届く。しきい値・ソ…

  6. 都市開発シミュを作る④|4度つまずいて座標系ごと作り直した話 — 真のアイソメグリッド移行【Aurum City制作】

注目

AIで、ここまで作れる

AIで作った2D RPGを、ブラウザでそのまま遊べます。その「作り方=最後まで完成させる進め方」も実例つきで公開中。

▶ ゲームを遊ぶやり方を読む

PR

お名前.com 独自ドメイン取得(PR)

独自ドメイン:お名前.com(本サイトで使用・PR)

  1. アプリの作り方

    Claude Codeのトークン消費を減らす実践ガイド — 公式ドキュメントで裏…
  2. Claude Fable 5 のプラン変更を一次ソースで確認した — 50%枠は他モデルと共通

    AI・テック動向

    Claude Fable 5 のプラン変更を一次ソースで確認した — 50%枠は…
  3. YouTubeチャンネル分析ツールの作り方 — Data APIで統計・投稿パターン・キーワードを可視化する

    アプリの作り方

    YouTubeチャンネル分析ツールの作り方 — Data APIで統計・投稿パタ…
  4. Anthropic「Claude Science」に学ぶ — 個人開発者が作れるドメイン特化AIワークベンチの型

    AI・テック動向

    Anthropic「Claude Science」に学ぶ — 個人開発者が作れる…
  5. アプリの作り方

    MiniMax H3をVRAM 8GBで動かす — ComfyUI導入手順と、8…
PAGE TOP

TAG CLOUD

ドラッグで回転・クリックでそのタグの記事一覧へ