2024.10.28

Claude analysis toolのデータ分析性能をGPT-4oとGeminiと比較してみた

TL;DR

  • Anthropicは、Claude.aiに「analysis tool」という機能をリリースしました。これによりJavaScriptのコードを生成・実行しデータの分析など可能です。既存のArtifactsでのダッシュボード作成と組み合わせることで、より詳細なデータ分析が可能になります。
  • しかし、Pythonを利用するGPT-4oやGemini Advancedと比較すると、JavaScriptを利用するClaudeでは分析処理がやや冗長でコードの生成にも時間がかかります。さらに、Claudeは、Excelファイルを直接読み込めないなど、データ利用の制約があります。(Excelファイルがあるなら素直にExcelで分析すれば良いのでは?)
  • データ分析への活用ケースは限定的ではありますが、数値の比較など、LLMが不得意な部分をJavaScriptのコードで補うことで、より正確な対話が可能となります。

はじめに

こんにちは、グループ研究開発本部・AI研究室のT.I.です。Anthropicは、2024/10/25にClaude.aiの新機能「analysis tool」をリリースしました(Introducing the analysis tool in Claude.ai)。これは、Claude.ai 上で JavaScript のコードを生成して実行する機能です。従来のArtifactsでもJavaScriptのコードを生成・実行は可能でしたが、analysis toolはClaudeとの対話に自然に組み込まれているため、より正確な数値解析が可能になりました。なお、Anthropicの主力LLMであるClaude 3.5 Sonnetも10/23に性能の改良された新バージョン Claude 3.5 Sonnet (new) もリリースされております( Introducing computer use, a new Claude 3.5 Sonnet, and Claude 3.5 Haiku)。

Anthropic Blogより

「analysis tool」が、どのような機能か簡単にデモをしてみようと思います。現在、このツールは、先行プレビュー版ですので、使用するためには、左下のアカウントのアイコンをクリックして、「Feature Preview」を選択して、「Analysis tool」を有効にする必要があります。

analysis toolを実行できるように設定する。

では、早速、Claudeに「3.11と3.9のどちらが大きいか」と質問してみました。

謎の理屈で、3.11の方が大きいと回答してくれました。Pythonのバージョンならば3.9よりも3.11の方が新しいのですが、小数の比較としてはこれは出鱈目です。現在のLLMは数値をそのまま扱うことを苦手としております。この問題についての弊社Blog(「9.11 > 9.9」から始めるLLMの計算間違い探索)に詳しく書かれています。さて、今回の新機能であるanalysis toolを使って、比較してもらいます。

誤りを犯したなどと随分と深く反省してますが、今度は無事に3.9のほうが大きいと回答してくれました。この「View analysis」をクリックすると、Claudeが生成したコードと実行結果が以下のように確認できます。

このようにJavaScriptのコードを生成して実行、その結果を元に回答をしてくれました。これが今回リリースされた新機能のanalysis toolです。

Claude Analysis Toolを使ってデータ分析をやってみた

この新機能を用いて、実際にデータ分析を行ってみます。データのアップロードは、csvファイルを添付すれば良いです。以前のBlog(Gemini Advancedでデータ分析をやってみた)でGemini Advancedでの分析実験で使用した試験結果のデータセットを使ってみました。これは、GPT-4oでランダムに生成した2つのクラスの計10名の生徒の国語・数学・理科・社会・英語の5教科の試験結果(各教科100点満点)の2回分のデータです。

前回のGemini Advancedの実験用にGPT-4oで生成させた試験結果のデータセット
Analysis toolの実行結果のイメージ

「この生徒の試験結果に関するデータを分析してください」と大雑把な指示を与えるだけで、このような結果が得られます。「データを分析させていただきます。まずは基本的な統計情報を確認し、その後可視化を行います。」の下にある「View analysis」箇所が先ほどの例で見たように分析のためのコードとなります。右側にはArtifacts機能によるダッシュボードが生成され、インタラクティブに情報が表示されます。先ほどの例と同様に「View analysis」をクリックすると、以下のような分析コードが表示されました。

Claudeが生成した分析用のJavaScriptコードを一部抜粋しました。

import Papa from 'papaparse';
async function analyzeTestData() {
    const fileContent = await window.fs.readFile('test_sample.csv', { encoding: 'utf8' });

    const parsedData = Papa.parse(fileContent, {
        header: true,
        skipEmptyLines: true,
        dynamicTyping: true
    });

    const data = parsedData.data;

    // 全体の平均点を計算
    const averageScore = data.reduce((sum, row) => sum + row.点数, 0) / data.length;

    // 科目ごとの平均点
    const subjectAverages = {};
    data.forEach(row => {
        if (!subjectAverages[row.科目]) {
            subjectAverages[row.科目] = { sum: 0, count: 0 };
        }
        subjectAverages[row.科目].sum += row.点数;
        subjectAverages[row.科目].count += 1;
    });

    for (const subject in subjectAverages) {
        subjectAverages[subject] = Math.round(subjectAverages[subject].sum / subjectAverages[subject].count);
    }


    // (中略)

    console.log('基本統計情報:');
    console.log(`全体の平均点: ${Math.round(averageScore)}点`);
    console.log('\n科目別平均点:', subjectAverages);
    console.log('\nクラス別平均点:', classAverages);
    console.log('\n試験回別平均点:', testAverages);


    // (中略)
}

冒頭のデモでは、簡単な数値の比較のみでしたが、今回はpapaparseを利用して、csvファイルを読み込み、集計しています。ただ、平均点などの計算でループで処理しているところを見ると、Pythonのpandasを使った処理に慣れていると違和感がありますね。集計した数値は以下のようにconsole.logで出力しています。このJavaScriptに続いて、「View analysis」では以下の出力も表示されていました。

何やら出力結果にエラーが出ていますが、console.logの出力をClaudeが読み込む際の裏の処理の関係でしょうか?このJavaScriptの出力をもとに、Claudeは以下の要約を説明してくれていたようです。要約はコードの出力と、ほぼ対応した内容になっておりますが、最低得点の生徒に関して、理科も0点だったと、JavaScriptの出力にはない情報が含まれている点が気になります。これは、csvの方も同時にClaudeが読み込んで利用しているのかと思われます。

なお、Artifactsの機能として、分析ダッシュボードも生成されます。こちらは、各科目の平均点の棒グラフとクラス・試験回ごとの平均点の棒グラフです。マウスを合わせると詳細な数値などが表示されます。早速、問題発生ですが、下段のグラフでは、クラスのラベルが表示されておらず、マウスを合わせても情報は特にありません。どちらがA組でどちらがB組かは分かりません。

さて、文句を言ってもしかたないですが、このダッシュボードは、以下のようなコードで生成されていました。

Reactを使っており、グラフの作成では、Rechartsを使っているようです。Analysis toolでの分析コードでは平均などをループで計算していましたが、今回はlodashを使ってより効率的に処理しています。コードを抜粋すると、以下のようになっています。

import React, { useState, useEffect } from 'react';
import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer } from 'recharts';
import Papa from 'papaparse';
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import _ from 'lodash';

const TestAnalysisDashboard = () => {
  const [subjectData, setSubjectData] = useState([]);
  const [classData, setClassData] = useState([]);

//  (略)

      // 科目別平均点の計算
      const subjectGroups = _.groupBy(parsedData.data, '科目');
      const subjectAverages = Object.keys(subjectGroups).map(subject => ({
        科目: subject,
        平均点: Math.round(_.meanBy(subjectGroups[subject], '点数'))
      }));

//  (略)
};

そして、ダッシュボードを生成後に以下のような提言とポイントが出力されました。内容としては、最初の分析結果の要約と大差はないようです。ただ、「一部の生徒で大きく点数を下げているケースが」に関しては、根拠となる分析結果が明確には示されていない点が気になりました。最後に、Claudeからデータを更に分析するための質問の提案「分析結果の重要ポイントは?」などの質問が表示されます。これをクリックすると更にClaudeに質問を投げることができます。

以上が、Claude Analysis Toolの概要です。このように、Claudeは、データ分析を行うためのコードを生成し、実行することができます。更にダッシュボードを作成し可視化も可能です。

Claudeの分析性能をGPT-4oとGeminiと比較してみた

さて、Claudeの分析性能とGPT-4oとGeminiと比較してみます。GPT-4oとGeminiの比較の詳細は、前回のBlog(Gemini Advancedでデータ分析をやってみた)で紹介していますので、興味のあるかたはこちらを参照していただければと思います。

分析コードの品質: Python vs JavaScript

GPT-4oとGeminiは、Python のコードを生成して実行していますが、ClaudeはJavaScriptのコードを生成して実行しています。Pythonの場合、pandasというデータ分析に特化したライブラリで効率的に分析できますが、Claudeの生成するJavaScriptでは、lodashを使ってくれることもありましたが、ループ処理で集計したりと手間と時間(=必要なコードの量)がかかります。実際の実行の動画は以下のようになっています。先ほど紹介した例とは別の生成でしたので結果が異なっています。人が同じコードを書くよりは高速ではありますが、必要なコードが多いため、GPT-4oやGeminiと比べると効率が悪いです。

例えば、科目ごとの平均点の集計のために生成したコードは以下のようになります。

// (注) Analysis toolで解析に利用したコード
// 科目ごとの平均点
const subjectAverages = {};
data.forEach(row => {
    if (!subjectAverages[row.科目]) {
        subjectAverages[row.科目] = { sum: 0, count: 0 };
    }
    subjectAverages[row.科目].sum += row.点数;
    subjectAverages[row.科目].count += 1;
});

for (const subject in subjectAverages) {
    subjectAverages[subject] = Math.round(subjectAverages[subject].sum / subjectAverages[subject].count);
}

// (注) Artifacts のダッシュボードの生成の際に使用したコード
// 科目別平均点の計算
const subjectGroups = _.groupBy(parsedData.data, '科目');
const subjectAverages = Object.keys(subjectGroups).map(subject => ({
  科目: subject,
  平均点: Math.round(_.meanBy(subjectGroups[subject], '点数'))
}));

lodashを使った2つ目のコードの方がよりシンプルでミスが少ないものとなっていますが、Pythonのpandasを使うともっと簡潔に処理可能です。

df.groupby('科目').agg(平均点=('点数', 'mean')).round(0)

JavaScriptでもpandasのように統計集計できるライブラリがないかと調べると、Danfo.jsというものがあるそうです。それを使うようにClaudeに指示しましたが、どうもClaude側で制限があるようで頑なにpagaparseとlodashでしか処理をしてくれませんでした。

Danfo.jsを使うように指示しても、Claudeはいうことを聞いてくれませんでした。

可視化コードの品質

可視化に際しても同様で、GPT-4oは、matplotlibと、独自の動的な可視化処理(詳細不明)を使っているため効率的に可視化できています。一方、Gemini Advancedでは、altair という matplotlib と比較すると冗長なコードを生成される印象があります。ClaudeのJavaScriptによる可視化は、Rechartsといったライブラリを使っており、その処理はPythonと比較すると冗長になっています。Claudeはダッシュボード化してくれる点が他と比べると差異ではありますが、GPT-4oもGemini Advancedも両方ともインタラクティブなグラフを生成できるので、使い勝手としてはあまり大きな差はないと思います。また、Claudeに指示すると、Chart.jsでの可視化も可能でした。

Chart.jsを使うように頼み込んだところ、Claudeはいうことを聞いてくれました。

では、ClaudeにPython codeを生成させて分析・可視化はできないか?と考えてみました。

csvファイルを解析するPython codeをClaudeに生成させてみました。

生成したコードを自分の環境で別途実行しないといけない点が面倒ですが、Claudeはcsvファイルの内容を読んで適切なカラム名などを認識してくれました。また、コードの解説を込みで何を実行するのか、また、必要なライブラリのインストールの指示もしてくれました。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib  # 日本語表示用

def load_and_prepare_data(file_path):
    """データの読み込みと前処理を行う"""
    df = pd.read_csv(file_path)
    return df

def calculate_basic_stats(df):
    """基本統計量の計算"""
    stats = df.groupby('科目')['点数'].describe()
    return stats

# 中略

def plot_class_comparison(df):
    """クラス間比較のプロット"""
    plt.figure(figsize=(15, 6))
    sns.boxplot(x='科目', y='点数', hue='クラス', data=df)
    plt.title('クラス別・科目別点数分布')
    plt.xticks(rotation=45)
    return plt

def main():
    # データの読み込み
    df = load_and_prepare_data('test_sample.csv')

    # 基本統計量の算出
    basic_stats = calculate_basic_stats(df)
    print("\n=== 基本統計量 ===")
    print(basic_stats)

# 中略

    plot_class_comparison(df)
    plt.savefig('class_comparison.png')
    plt.close()

if __name__ == "__main__":
    main()

# 実行結果の例
#  === 基本統計量 ===
#      count   mean        std  min    25%   50%    75%    max
#  科目
#  国語   20.0  53.95  33.689722  7.0  21.75  57.0  87.50  100.0
#  数学   20.0  49.70  27.489902  1.0  35.50  50.0  61.00   97.0
#  理科   20.0  50.65  29.693655  0.0  21.75  52.5  67.50   98.0
#  社会   20.0  40.30  28.652363  4.0  15.75  35.5  58.25  100.0
#  英語   20.0  40.75  30.592182  0.0  14.75  33.0  62.00   91.0

生成されたPython codeによる分析結果の例。Geminiの時も指摘しましたが、どうして皆さん横軸のラベルを回転させるのでしょうか?

ただし、この手法ではAnalysis toolのようにClaudeが結果を認識できないので、分析レポートを生成することはできません。また、以前にGPT-4oやGemini Advancedでの分析で指摘したように、Pythonの解析コードの書き方が冗長でやや古い書き方になっている点も懸念があります。

分析レポートの品質

Claudeで分析をさせてみてGPT-4oとGemini Advancedと大きく違うと思ったのは分析レポートの品質です。特に指示がなくともClaudeは詳細にデータを解説して、要約して改善案を提案しました。前回のBlogでのGemini AdvancedとGPT-4oの場合では、以下のように分析結果の数値を読み上げたり、このグラフで比較できます。みたいな淡白な反応と比較すると大きな違いです。

Gemini Advanced による分析結果の解説例。Claudeと比較すると随分とあっさりしています。
GPT-4oによる分析結果の解説例。Claudeと比較すると随分とあっさりしています。
Claudeによる分析結果の解説例。特に指示もなしに改善案を提案してくれます。

といっても、これはGPT-4oへのプロンプトが曖昧だったことが原因で、「この生徒の試験結果を分析して、今後の改善ポイントを提案してください。」という指示を与えると、科目ごとの平均点と生徒ごとの平均点を集計した後に、以下のような提案をしてくれました。

GPT-4oに分析と改善ポイントを提案するように指示すると、今度はちゃんと提案をしてくれました。

ただし、Claudeの分析レポートにはいくつか品質に関する懸念点があります。まず、GPT-4oやGemini Advancedでの実験と同様に、5教科の総合点を求めることが指示なしではできません。このような暗黙の前提の理解には限界があるようです。また、指摘されるポイントも必ずしも正確ではありませんでした。例えば、最高得点・最低得点を取得した生徒を注目すべき個別結果として、それぞれ1名の名前を挙げましたが、100点を取った生徒は2名、0点を取った生徒も2名存在するにも関わらず、それぞれ1名づつしか名前が挙げられませんでした。analysis toolでの最高得点・最低得点の集計ロジックに不正確さがあったことが原因と考えられます。また、英語で0点の生徒が出てる点を指摘して、補習が必要と提案していましたが、理科の0点が2名もいる点には触れていませんでした。ざっくりとした提案・報告としては十分かもしれませんが、その提案の根拠が正確であるかどうかは疑問が残ります。

Claudeは最高得点・最低得点の生徒を指摘していますが、正確な情報ではありません。Excelファイルならこのようなフィルタリングも簡単に抽出できます。

入力ファイル形式

また、データ分析に利用する上で大きな問題と感じたのが、入力ファイルの形式です。ClaudeはExcelファイルを読み込むことができません。以下のようなエラーメッセージが表示されました。

Files of the following format are not supported: xlsx.

Excelファイルを読み込もうとしたらエラーが出ました。

Claudeでアップロードできる形式は、公式サイトにまとめられていました。What kinds of documents can I upload to Claude.ai? (https://support.anthropic.com/en/articles/8241126-what-kinds-of-documents-can-i-upload-to-claude-ai)この解説によると、pdf, docx, csv, txt, html, odt, rtf, epub, json まで対応しているようです。Excelファイルからcsvファイルに変換するのは簡単ですが、その手間は少々面倒です。また、ファイルサイズは1ファイルあたり30MBまでで、最大5ファイルまでとなっています。比較的小規模なデータ分析なら問題ないですが、大規模で複雑なデータ分析には限界があるようです。

では、競合のGPT-4oやGemini Advancedはどうかというと、余裕でExcelファイルを読み込むことができます。

GPT-4oでExcelファイルを読み込むことができました。
Gemini AdvancedでもExcelファイルを読み込むことができました。

うーん、Claudeでは、Excelのデータを分析できないのですか、困りました。あれ、Excelがあるなら、最初からExcelで分析すれば良いのではないでしょうか?

どう生成AIに分析させるかと考える前に、素直にExcelでデータ分析をすることも検討してみましょう。

つい失念していましたが、Excelを活用するとデータの集計・可視化が可能です。生成AIのように実行するたびに結果が変わることもなく、利用者の意図した通りの分析ができます。更にグラフのカスタマイズも自由自在。生成AIを活用することは目的ではなく、手段であるということを忘れないようにしましょう。データ分析と可視化を正確に確実に行うのなら、Excelなどの専門のツールを利用するのが一番です。

比較結果のまとめ

率直な感想としては、分析や可視化の品質および実行速度を考慮すると、評価はGPT-4o、Gemini Advanced、Claude analysis tool (+Artifacts) の順となると思います。ただし、生成されるコードと可視化の品質には大きな差はなく、業務で使える分析レポートとしては、まだまだ不十分な部分が多いと感じます。Claudeのような生成AIに任せれば一瞬で分析が終わる、というのはまだ時期尚早のように感じます。

とはいえ、Claudeの新機能が劣っているわけではなく、Blogの冒頭で述べた数値の比較などの簡単な整合性の確認といった用途には十分に活用できると思います。

まとめ: 「“Strawberry”には何個“r”が含まれていますか?」

今回は、Anthropicが新しくリリースしたClaude analysis toolを試してみました。JavaScriptのコードを生成・実行がClaude.ai上で可能となり、LLMの苦手とする数値の分析に役に立ちそうです。また、既存のArtifactsを使ったダッシュボードと組み合わせることで、データの分析レポートが簡単に作成可能です。競合となるGPT-4oとGemini Advancedと比較した場合、Pythonで分析するこれらのツールに対して、ClaudeはJavaScriptでの処理が求められるため効率が悪いと感じました。データ分析専用のライブラリが利用可能なPythonと比較すると、JavaScriptのコードは長くなるためコードの生成時間も長くなります。一方で、Claudeの方が分析レポートなどが流暢であるという点では優れていると感じましたが、やはりデータサイエンティストの視点から見ると、チェックなしに完全に任せられるかというと懸念の残るものでした。本格的なデータ分析に関してanalysis toolの有効性は限定的ではありますが、使い方次第で、LLMが不得意とする数値の比較や簡単な計算には活用できると考えられます。以下の例は、“Strawberry”の単語に含まれる“r”の文字数をClaudeに答えてもらったものです。このような問題をLLMだけでは間違えることが多いですが、JavaScriptを生成・実行することで正確な回答を得ることができました。

ClaudeにStrawberryの単語に含まれる“r”の文字数を答えてもらいました。

グループ研究開発本部 AI研究開発室では、データサイエンティスト/機械学習エンジニアを募集しています。ビッグデータの解析業務などAI研究開発室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ募集職種一覧からご応募をお願いします。皆さんのご応募をお待ちしています。

参考資料

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事