スケールが異なるグラフを生成AIを使って修正できるのか試してみました

こんにちは！もうすぐで2年目になるむらです（時間が経つのが早い...）。

ニュースなどを見ていると、2つの指標を比較したグラフが示されることはよくあると思います。しかし、縦軸の間隔が異なっていて誤解を招きかねないグラフが使われることも時々あります。
そんなとき自分は、簡単に縦軸の間隔を揃えたグラフを作れたらなあとよく思います。
最近ふとこれを思い出して、これを生成AIにやらせてみたらどうなるのだろうかと疑問に思いました。

そこで、Geminiを使ってスケールの異なるグラフをスケールの揃ったグラフに修正してもらうことができるのか実験してみます。

# 環境
プライベートでGemini Advancedを契約しているので、3月25日にリリースされたばかりの2.5 Pro（[Gemini 2.5: Our most intelligent AI model](https://blog.google/technology/google-deepmind/gemini-model-thinking-updates-march-2025/#gemini-2-5-thinking)）を使ってみました。
このモデルは思考モデル（thinking model）で、思考プロセスもレスポンスしてくれます。Gemini 2.0 Flash Thinkingよりも精度を向上させ、特にコーディングは大きく向上したそうです。
2.0で使えるマルチモーダル入力もこのモデルでは使用できるので、グラフ画像を読み込ませることができます。

# 実験
まず、読み込ませる画像を探します。今回はちょうど見つけた、こちらのグラフを使用してみようと思います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">日銀、金利操作を再修正へ　長期金利1%超え柔軟に<br>（グラフに不備があったため、修正し再投稿しました）<a href="https://t.co/kqgxKgLnSA">https://t.co/kqgxKgLnSA</a> <a href="https://t.co/tEizmdxEYt">pic.twitter.com/tEizmdxEYt</a></p>&mdash; 日本経済新聞 電子版（日経電子版） (@nikkei) <a href="https://twitter.com/nikkei/status/1719255974521782368?ref_src=twsrc%5Etfw">October 31, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ちなみにこのツイートにはコミュニティノートがつけられていて、やはり不適切なグラフとして指摘されています。

## Geminiはグラフを読み取れるのか

使用する画像が決まったので、早速Geminiに食わせてみます。
思考プロセスがリアルタイムに見られるのが面白いですね。最初に"I need to get the relevant content to answer the user's question."と言っており、Geminiは自身が何をすべきなのかを考えながら処理を進めているみたいです。

しばらくすると、以下のまとめ文章を返してくれました。
> この期間において、日米ともに長期金利は上昇傾向にありましたが、水準としては米国の方が大幅に高いことがわかります。日本の長期金利は、日銀が金融緩和策の修正で上限としていた1%に近づく動きを見せていたことが読み取れます。

Geminiは縦軸のスケールが違うにも関わらず、米国のほうが金利水準が高いことを指摘してくれています。優秀ですね。
では、ここで恣意的かもしれませんがこのグラフになにか問題点がないか聞いてみました。
すると、以下のように答えてくれました。
> 二重軸（左右で異なるY軸）： このグラフは左軸（日本：0.2%～1.0%）と右軸（米国：3.0%～5.0%）で異なるスケールを使用しています。
> - メリット: 絶対値が大きく異なるデータを一つのグラフで比較しやすくします。
> - デメリット: 線の「傾き」だけを見て変化の「大きさ」や「速さ」を直感的に比較すると、誤解を生む可能性があります。例えば、同じ傾きでも、スケールが違うため実際の変化率（％ポイントの変動幅）は異なります。グラフを読む際には、必ずそれぞれの軸の目盛りを確認する必要があります。

Geminiも誤解を生む可能性があると指摘しています。

## スケールを合わせてもらう

Geminiは画像からグラフを概ねしっかりと読み取ることができることがわかりました。さて、ここからが本題です。スケールを揃えたグラフを返してくれるのか試してみます。

まずは、単に「軸のスケールを揃えたグラフを作ってくれませんか？」と言ってみました。
すると、Geminiは"The user wants me to create a new graph with the Y-axis scales unified (揃えた), based on the data implicitly represented in the previously provided graph image."と思考しており、こちらの要求を正確に理解できています。
しかし、"State clearly that extracting exact numerical data from the image to recreate a precise graph is not possible for me."とも言っており、正確な数値データなしではグラフを作ることができないという思考をしています。
最終的に、文面でどのようなグラフになるか説明してくれました。
> 【軸のスケールを揃えたグラフのイメージ】
> Y軸: 0%から少なくとも5.0%（米国の最高値）までを含む単一のスケールになります。
> - 米国の金利（青線）: グラフの上部（3.5%〜5.0%の範囲）で推移するように描かれます。元のグラフと見た目の絶対的な位置は大きく変わりません。
> - 日本の金利（濃い青線）: グラフの非常に低い位置（0.2%〜1.0%弱の範囲）で推移するように描かれます。元のグラフでは0.2%から1.0%の範囲が拡大されていましたが、統一スケールではこの範囲が非常に狭く圧縮されて見えます。

## 概略図の生成をお願いする

残念ながら画像生成まではしてくれませんでした。しかし、ここで諦めるわけにはいきません。正確な値でなくてもいいので、とりあえず目に見えるものが欲しいのです。そこで、今度は「概略図でいいのでグラフを作って欲しいです」と伝えてみました。すると、Geminiもそれを理解してくれてどうにかグラフを作ろうとしてくれました。
> Re-evaluate feasibility: Can I generate any kind of visual output resembling a graph?
> 
> I cannot directly execute plotting library code (like Matplotlib or Seaborn) and display the image output within the chat interface in this environment. My capabilities are primarily text-based, though I can generate the code that would produce a plot.
> Creating ASCII art or similar text-based representations is possible but often crude and might not be very clear, especially for overlapping lines or specific trends.
> Generating code that the user could then run is a viable option.

Geminiは自分がグラフを出力できるのか考え、最終的にPythonコードを生成して、それをユーザが実行してグラフを確かめてくれという方針になったようです。
そこから、最初のグラフをもう一度分析し、大まかな値を読み取り、Matplotlibでグラフを生成するコードを作り始めました。
生成してくれたコードをGoogle Colaboratoryで動かしてみると、以下のグラフが出力されました（面倒だったので文字化けは直していません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145207/a9671588-5f04-4850-a87f-5220711127f7.png)
そこそこいい感じのグラフになりました！ただ、簡略化しすぎているのでx軸の間隔を3ヶ月から1ヶ月にしてもらいました。
1ヶ月ごとのy値を推定してグラフの形にするように修正を加えてくれました。その結果、下のグラフができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145207/f575d3d0-73be-4755-a4b1-4a0649cb52de.png)
y軸のスケールを統一しつつ、最初に入力として与えたグラフの傾向をよく捉えたグラフになりました！これで誤解を生む可能性を減らしたグラフにすることができました。

# まとめ
![プレゼンテーション1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145207/ee1f9d64-26a5-4560-9082-3c428598989d.jpeg)

今回行った「Geminiに誤解を招きそうなグラフをいい感じに修正してもらう実験」は思った以上にうまくいきました。

まず、Gemini (2.5 Pro) はグラフ画像をちゃんと読めることに驚きでした。さらに、思考プロセスが見えるのは面白く、また分かりやすかったです。その思考の中で、「できない」ことへの代替案も考えているのが興味深かったです。「自分（Gemini）はグラフを作れるのか？作れないならそれをユーザに言わないといけない！」という人間の自分でもするような思考の仕方をしていてびっくりしました。 

結論として、「なんかこのグラフ、分かりにくいな…」と思ったときには生成AI（今回はGemini）に相談してみるのはかなり有効なアプローチだと言えそうです。
もちろん、AIが画像から推定したデータはあくまで「それっぽい」ものなのに過ぎないので、そのまま鵜呑みにするのは危険ですし、正確性が求められる場面では元データを確認する必要があります。
また、このようにそれらしいグラフ（≒模範解答的なもの）を生成できる一方で、グラフには「見せ方」もあると思います。それは、強調したい部分があるというプラスの面もありますし、誤解を誘導するためというマイナスの面もあります。
今回Geminiに生成してもらったグラフが絶対的に正しいというわけでもないという点には注意が必要だと思います。

とはいえ、

- グラフの問題点を客観的に指摘してもらう
- 代替となる見せ方（今回は単一軸グラフ）のイメージを掴む
- そのためのコードをサクッと生成してもらう

といった点で、AIは非常に便利です。
これをウェブアプリなどでツール化できるともっと面白くなりそうだなと感じました。