🔰【コピペでOK】PythonでX (旧Twitter) の特定ツイートを分析してワードクラウドを作る方法

「新人研修」ってXでどう思われてるんだろう?「〇〇(自社製品名)」の評判は?

そんな疑問を解決するために、Pythonを使ってXのツイートを収集・分析し、頻繁に登場する単語を可視化(以下の様なワードクラウド化)するチュートリアル記事です。プログラミング初心者の方でもコピペで実践できるように、環境構築から丁寧に解説します!

この記事を読めば、特定のキーワードに関する世の中の声を、直感的に把握できるようになります。マーケティングや評判調査、自己学習など、様々な場面で役立つスキルです。

タグクラウドの例

ステップ1:分析環境の準備(ライブラリのインストール)

まずは、分析に必要なPythonライブラリをインストールしましょう。

お使いのPCのターミナル(WindowsならコマンドプロンプトやPowerShell)を開いて、以下のコマンドを1行ずつ実行してください。

pip install tweepy
pip install pandas
pip install janome
pip install wordcloud
pip install matplotlib

もし「pipって何?」という方は、Pythonのライブラリを管理する便利なツールだと思ってください。上記のコマンドで、今回の分析に必要な道具が一式揃います。


ステップ2:X APIの準備 (Bearer Tokenの取得) 🔑

次に、Xからツイートを収集するために必要な「Bearer Token」という鍵を取得します。少し手順がありますが、落ち着いて進めれば大丈夫です。

  1. X開発者ポータルにアクセス
    • X Developer Platform にアクセスし、お持ちのXアカウントでログインまたはサインアップします。
  2. 開発者ポータルのダッシュボードへ
    • ログイン後、画面の指示に従って開発者ポータルのダッシュボードへ移動します。利用規約への同意などが求められる場合があります。
  3. プロジェクトを作成
    • 左側のメニューから「Projects & Apps」を選び、「+ Create Project」ボタンを押して新しいプロジェクトを作成します。プロジェクト名やユースケースなどを聞かれますので、適宜入力してください(例:Project Name: My-Tweet-Analysis)。
  4. アプリを作成
    • プロジェクトを作成すると、続けてアプリの作成画面になります。アプリ名を入力して次に進みます(例:App Name: analysis-app-01)。
  5. Bearer Tokenをコピー
    • アプリが作成されると、「Keys and tokens」タブが表示されます。この中に「Bearer Token」という項目があります。この文字列が、プログラムからX APIにアクセスするための鍵になります。必ずコピーして、誰にも見られない安全な場所にメモしておきましょう。

これで、ツイートを収集するための鍵が手に入りました!


ステップ3:Pythonコードでツイートを分析しよう!

いよいよ分析コードの登場です。以下のコードをコピーして、analysis.pyのような名前でファイルに保存してください。

コードの中の--- 設定項目 ---の部分は、ご自身の環境に合わせて変更が必要です。

💻 全体のコード(詳細な日本語コメント付き)

# --- ライブラリのインポート ---
# 必要なライブラリをすべて読み込む

import tweepy # X(Twitter) APIを操作するためのライブラリ
import pandas as pd # データ分析を支援するライブラリ(今回は直接使わないが、データフレーム化する際などに便利)
from janome.tokenizer import Tokenizer # 日本語の文章を単語に分割する(形態素解析)ためのライブラリ
from collections import Counter # リスト内の各要素の出現回数を数えるためのライブラリ
import re # 正規表現を扱うためのライブラリ(特定の文字パターンを検索・置換するのに使う)
from wordcloud import WordCloud # 単語の出現頻度に応じて文字の大きさを変えて図示(ワードクラウド)するためのライブラリ
import matplotlib.pyplot as plt # グラフや画像を描画するためのライブラリ
import time # 時間を扱うためのライブラリ(待機処理などで使用)

# --- 設定項目 ---
# 以下の3つの項目を、ご自身の環境や目的に合わせて変更してください。

# 1. X APIの認証情報
# 先ほどステップ2で取得したご自身の「Bearer Token」を""の間に貼り付けてください。
BEARER_TOKEN = "ここに取得したBearer Tokenを貼り付け"

# 2. 検索キーワード
# 分析したいキーワードに合わせて自由に変更してください。
# 例: '"新人研修" (意味ない OR つまらない OR やめたい)' は、「新人研修」と「意味ない」または「つまらない」または「やめたい」がすべて含まれるツイートを検索します。
# '-is:retweet' はリツイートを除外するおまじないです。
query = '"新人研修" (意味ない OR つまらない OR やめたい OR ひどい OR 課題 OR 多い OR 眠い OR 地獄 OR つらい OR きつい) -is:retweet'
max_results = 100 # 取得するツイートの最大数(10〜100の間で設定できます)

# 3. 日本語フォントのパス
# ワードクラウドを日本語で表示するために、お使いのPCにインストールされている日本語フォントの場所を指定します。
# Windowsの例: "C:/Windows/Fonts/YuGothM.ttc" (游ゴシック Medium) や "C:/Windows/Fonts/msgothic.ttc" (MSゴシック)
# Macの例: "/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc" (ヒラギノ角ゴシック W3)
# もし場所がわからない場合は、PCのフォント設定画面で確認してください。
font_path = "C:/Windows/Fonts/YuGothM.ttc"

# --- ここから分析処理 ---

# X APIクライアントの初期化
# tweepyライブラリを使い、先ほど設定したBEARER_TOKENを使ってX APIに接続する準備をします。
client = tweepy.Client(BEARER_TOKEN)

# ツイートを検索・取得
try: # try-except構文: APIリクエストでエラーが起きる可能性があるので、エラー処理を準備します。
    # 処理の進捗がわかるようにメッセージを表示
    print("ツイートの検索を開始します...")
    # client.search_recent_tweetsメソッドで、過去7日間のツイートを検索します。
    response = client.search_recent_tweets(
        query=query, # 設定した検索キーワード
        max_results=max_results, # 設定した最大取得数
        tweet_fields=["text"] # 取得する情報として、ツイートの本文(text)を指定
    )
    # 処理の進捗がわかるようにメッセージを表示
    print("ツイートの取得が完了しました。")

# もしAPIの利用制限にかかった場合のエラー処理
except tweepy.errors.TooManyRequests:
    # APIの無料プランでは、15分間に実行できるリクエスト数に上限があります。上限に達した場合の処理です。
    print("APIの利用制限に達しました。15分間待機します...")
    # time.sleep()を使ってプログラムを一時停止させます。
    time.sleep(15 * 60) # 15分 * 60秒 = 900秒 待機
    print("待機が完了しました。再度ツイートの検索を試みます。")
    # 待機後、再度同じ条件でツイートを検索します。
    response = client.search_recent_tweets(
        query=query,
        max_results=max_results,
        tweet_fields=["text"]
    )
    print("ツイートの再取得が完了しました。")

# 取得したツイートのテキストを一つの大きな文章にまとめる
# response.dataにツイート情報が入っています。ツイートが存在すれば(if response.data)、各ツイート(tweet)から本文(tweet.text)を取り出してリストにします。
texts = [tweet.text for tweet in response.data] if response.data else []
# " ".join(texts)で、リスト内のすべてのツイート本文をスペースで連結し、一つの文字列にします。
all_text = " ".join(texts)

# all_textに中身がある(ツイートが1件以上取得できた)場合のみ、後続の処理を実行
if all_text:
    # 処理の進捗がわかるようにメッセージを表示
    print("テキストの前処理を行っています...")
    # re.sub()を使い、正規表現で不要な文字列を空文字に置換(削除)していきます。
    all_text = re.sub(r"https://\S+", "", all_text) # URL (https://から始まる文字列) を除去
    all_text = re.sub(r"http\S+", "", all_text) # URL (http://から始まる文字列) を除去
    all_text = re.sub(r"@\w+", "", all_text) # メンション (@ユーザー名) を除去
    all_text = re.sub(r"#", "", all_text) # ハッシュタグの記号 '#' のみ除去(タグ自体は単語として残す)
    all_text = re.sub(r"\s+", " ", all_text) # 連続する空白や改行を一つのスペースにまとめる

    # 形態素解析で単語に分解
    print("形態素解析を実行しています...")
    t = Tokenizer() # JanomeのTokenizerクラスのインスタンスを作成
    # t.tokenize(all_text)で文章を単語に分割し、品詞などの情報を持つ「トークン」のリストを生成します。
    # forループで各トークンをチェックし、品詞(part_of_speech)が'名詞', '動詞', '形容詞'のいずれかであれば、
    # その単語の基本形(base_form、例:「走った」→「走る」)をリスト'words'に追加します。
    words = [token.base_form for token in t.tokenize(all_text) if token.part_of_speech.split(',')[0] in ['名詞', '動詞', '形容詞']]

    # 分析に不要な単語(ストップワード)を除去
    # 頻繁に出現するものの、分析の文脈では意味が薄い単語をあらかじめ定義しておきます。
    stop_words = ['新人', '研修', '企業', 'する', 'いる', 'ある', 'なる', '思う', 'いう', 'こと', 'もの', 'よう', '的', 'の', 'これ', 'それ', 'あれ', '多い', 'れる', 'てる', '人', '時']
    # リスト'words'から、ストップワードリストに含まれていない単語だけを新しいリストとして再作成します。
    words = [word for word in words if word not in stop_words]

    # 単語の出現回数をカウント
    # Counter()に単語リストを渡すことで、{'単語A': 出現回数, '単語B': 出現回数, ...} という形式の辞書風オブジェクトが作られます。
    word_counts = Counter(words)
    print("\n--- 単語の出現頻度トップ30 ---")
    # .most_common(30)メソッドで、出現回数が多い順に30個のタプル((単語, 回数))のリストを取得して表示します。
    print(word_counts.most_common(30))
    print("--------------------------------\n")


    # ワードクラウドを生成
    print("ワードクラウドを生成しています...")
    # ワードクラウド生成のために、単語リストを再びスペース区切りの一つの文字列に戻します。
    wordcloud_text = ' '.join(words)
    # WordCloudクラスのインスタンスを生成し、各種設定を行います。
    wordcloud = WordCloud(
        width=800, # 画像の幅
        height=400, # 画像の高さ
        background_color='white', # 背景色
        font_path=font_path, # 日本語表示のためのフォントパス
        collocations=False # 単語の組み合わせ(共起)を考慮しない設定(Trueにすると "新人 研修" のようなセットが出やすくなる)
    ).generate(wordcloud_text) # .generate()メソッドに単語の文字列を渡してワードクラウド画像を生成します。

    # ワードクラウドを描画・表示
    plt.figure(figsize=(12, 6)) # 表示する図のサイズを指定
    plt.imshow(wordcloud, interpolation='bilinear') # wordcloud画像を表示します。interpolationは画像の補間方法です。
    plt.axis('off') # 軸のメモリは不要なので非表示にします。
    plt.show() # 設定した内容で、ウィンドウに画像を表示します。
    print("処理が完了しました!")

# ツイートが1件も見つからなかった場合の処理
else:
    print("分析対象のツイートが見つかりませんでした。キーワードや期間を変えて試してみてください。")


ステップ4:コードの実行と結果の確認

  1. 保存したanalysis.pyファイルがあるディレクトリでターミナルを開きます。
  2. 以下のコマンドを実行します。Bashpython analysis.py
  3. 実行すると、ターミナルに処理の進捗が表示されます。ツイートの検索を開始します... ツイートの取得が完了しました。 テキストの前処理を行っています... 形態素解析を実行しています... --- 単語の出現頻度トップ30 --- [('課題', 25), ('眠い', 18), ('地獄', 15), ('会社', 14), ('同期', 12), ('グループ', 11), ('ワーク', 10), ('つらい', 9), ('意味', 8), ('ない', 8), ('社会', 7), ('人', 7), ('内容', 6), ('ひどい', 6), ('時間', 6), ('学生', 5), ('気分', 5), ('ビジネスマナー', 5), ('終わる', 5), ('毎日', 4), ('意識', 4), ('高い', 4), ('明日', 4), ('行く', 4), ('考える', 4), ('本当', 3), ('コミュニケーション', 3), ('スキル', 3), ('ただ', 3)] -------------------------------- ワードクラウドを生成しています... 処理が完了しました!
  4. 最後に、ワードクラウドの画像が別ウィンドウで表示されれば成功です! 🎉この結果から、「新人研修」に関するネガティブなツイートでは、「課題」「眠い」「地獄」といった単語が多く使われていることが一目でわかりますね。皆様の会社ではいかがでしょうか?
実行結果

おわりに

今回は、Xのツイートを収集・分析してワードクラウドで可視化する基本的な流れを解説しました。

  • query (検索キーワード) を変える: 自社製品やサービス名、興味のある時事ネタなど、キーワードを変えるだけで様々な分析が可能です。
  • stop_words (除外する単語) を調整する: 分析結果を見ながら、ノイズになる単語をストップワードに追加していくと、より本質的な単語が浮かび上がってきます。

このコードをベースに、ぜひ色々な分析に挑戦してみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。