2,300万行データから見る技術トレンドの真実:BigQuery/SQLによるRとPythonの質問数分析

データ分析

1. はじめに:分析の動機とツールの選定(論理的思考力)

1.1. なぜRとPythonのトレンドを追うのか

  • データ分析市場の二大巨頭であるRとPythonの勢いを定量的に把握し、将来的な技術投資の意思決定(例:どちらの言語を学ぶか、採用するか)に役立てる。AIによって再現性のない出力を得る場合とは異なり、再現性や一貫性のある出力を得るためのクエリやコードの作成にAIを活用する。

1.2. データセット選定の理由と規模の特定

  • データセット名: bigquery-public-data.stackoverflow.posts_questions (Stack Overflowの質問ログ)
  • 規模の確定: 総行数 23,020,127行
  • ツールの選定理由(最重要):このデータセットは2,300万行以上という規模であり、一般的な表計算ソフト(Excel)の処理能力(約100万行)を遥かに超えます。そのため、効率的に処理し、スケーラビリティを確保できるGoogle BigQueryの採用が、データアナリストとしての最善の判断であると決定しました。

2. 技術的な挑戦と高度SQLによる解決(技術的な実行力のアピール)

2.1. 課題1:データソースのアクセス権とロケーション問題の解決

  • 発生した課題: GitHubやGoogle Trendsといった他の公開データセットでは、リージョン(場所)設定アクセス権の問題により分析が停滞した。データセットのある場所に合わせたリージョンを設定しないとエラーが出る。ビックデータのアクセス権の変更でアクセスできないなどの問題も発生した。
  • 解決策: エラー解決に時間を費やす非効率を避け、アクセスが安定しており、分析目的を達成できるStack Overflowデータセットへ迅速に切り替えた。さらに、クエリ設定でデータセットの場所と一致する「US (マルチリージョン)」を指定することで問題を突破した。

2.2. 課題2:正確なデータ抽出(表計算ソフトでは不可能な処理)

  • 問題点: Stack Overflowのタグデータは、tagsカラム内にpython|pandas|numpyのように縦棒(|)で区切られた一つの文字列として保存されている。
    • 単純な LIKE '%r%' では、androidserviceといった単語に含まれる’r’を誤検知してしまう。
  • 高度SQLによる解決(Tableauの計算フィールドでは困難な処理):データ精度の確保のため、正規表現(REGEXP_CONTAINS を用いて、タグの区切り文字(|)や文字列の開始/終了(^$)を考慮した厳密なパターンマッチングを実装しました。これにより、RやPythonのタグが単独で付いている質問のみを正確に抽出できました。

3. BigQueryで実行した最終クエリと結果

3.1. 最終クエリの提示

成功したStack OverflowのSQLコード全体を掲載します。

# Stack Overflow データセットを使用した R/Python の人気度比較(最終修正版)
# 目的: 技術的な質問のトレンドから、利用者の増加傾向を測定

SELECT
    # 1. データの集計キーとして年を抽出
    EXTRACT(YEAR FROM creation_date) AS trend_year,
    
    # 2. 正規表現を使用して、正確に「R」という単語(タグ)が含まれるか判定
    # 解説: r'(^|\|)r(\||$)' は「先頭または|の後ろにrがあり、末尾または|の前で終わる」という意味
    # これにより、'android' や 'service' の中の 'r' を誤ってカウントするのを防ぎます
    SUM(CASE WHEN REGEXP_CONTAINS(tags, r'(^|\|)r(\||$)') THEN 1 ELSE 0 END) AS r_question_count,
    
    # 3. 正規表現を使用して、正確に「Python」が含まれるか判定
    SUM(CASE WHEN REGEXP_CONTAINS(tags, r'(^|\|)python(\||$)') THEN 1 ELSE 0 END) AS python_question_count
    
FROM
    `bigquery-public-data.stackoverflow.posts_questions`
WHERE
    # 4. データ量を絞り込み(直近10年分程度で十分なトレンドが見れます)
    EXTRACT(YEAR FROM creation_date) >= 2014
    # 5. 処理コスト最適化:R または Python を含む行だけを対象にする
    AND REGEXP_CONTAINS(tags, r'(^|\|)(r|python)(\||$)')
    
GROUP BY
    trend_year
ORDER BY
    trend_year DESC;

このデータをBIツール(Tableau)に渡し、「質問数の絶対量」だけでなく「前年比成長率」や「シェア率」といった意思決定に役立つ指標を可視化することで、分析を完成させます。