Code Interpreterに頼り切ってIPランドスケープっぽい図を書いてみる

# はじめに
IPランドスケープの紹介記事などを読みますと、視覚化の例として、ドットが分布した謎のランドスケープ図が使われることがあります。

私もこういう図を書いてみたいと、以前から考えておりましたので、今回、Code Interpreterに頼り切ってIPランドスケープっぽい図を作成したいと思います。

なお、Code Interpreterを使う関係上、プログラムの説明はせず、もっぱら、ChatGPTとのやり取りをメインに記事にしたいと思います。

# 特許データ
現状のCode Interpreterは、日本語をうまく扱えないようです（使えるようになるのは時間の問題とも思います）。そこで、今回は、特定のA社の特許出願について、1000件英文特許データ（要約を含む）を収集しました。これを使用して、図を書きたいと思います。

したがって、出力される図も英語だらけになりますが、ご了承ください。
# ChatGPTとのやり取り
以下にChatGPTとのやり取りを記載しますが、不要な部分や冗長なは削除する等の編集をしております。
## 入力
```
ISO-8859-1でエンコーディングしてください。
data.csv
```
A社の特許出願の1000件英文特許データを含むdata.csvをアップロードします。不要なやり取り回数を減らすため、あらかじめエンコーディングの指示もしておきます。
## 出力
```
あなたのファイルを正常に読み込むことができました。以下に最初の5行を表示します。
(表は省略)
次にどのように進めていきましょうか？
```
## 入力
```
abstractの内容の類似度に応じて1000件の特許文献をクラスタリングしてください。
```
かなり雑な指示ですし、この手法でよいのかもわかりませんが、とりあえず、この方針で指示を出します。

## 出力
```
abstractの内容に基づいて文書をクラスタリングします。以下にその手順を示します:

前処理: 抽象のテキストを前処理します。これには、小文字化、ストップワードの削除、トークン化、ステミングまたはレンマ化などのステップが含まれます。

特徴抽出: 前処理したテキストから特徴を抽出します。通常はTF-IDFやWord2Vecなどの手法を使用します。

クラスタリング: 特徴空間で文書をクラスタリングします。クラスタリングには、K-means、階層的クラスタリング、DBSCANなどのアルゴリズムがあります。

結果の評価: クラスタリングの結果を評価します。シルエットスコアやクラスタ内の文書を手動で確認するなどの方法があります。

まず、あなたのデータフレームに 'Abstract' の列が存在するかを確認してから進めましょう。また、データの一部（最初の1000行）を使って、これらのステップを実行します。よろしいですか？
```
## 入力
```
上記ステップでよいのですが、妥当なクラスタ数を算出するステップも入れることは可能でしょうか。
```
クラスタ数を決めてから図示した方が、無駄なやり取りも減らすことができますので、そのようなステップも入れてもらいます。
## 出力
```
はい、クラスタ数を決定するための手段として、エルボー法やシルエット分析が一般的に用いられます。これらの方法を使ってクラスタ数を推定します。

エルボー法: この方法は、クラスタ数を増やしていくと、それによる改善が急激に落ちる「曲がり角」を見つけることで、最適なクラスタ数を推定します。ただし、エルボー（曲がり角）が明確でない場合もあり、その場合はシルエット分析を使います。

シルエット分析: この方法は、クラスタ内のサンプルがどれだけ密集しているかを計測します。シルエットスコアは、-1から1までの範囲で、1に近いほど良いクラスタリングを示します。

それでは、まずはこのデータの最初の1000行について前処理を行い、特徴抽出を行い、最適なクラスタ数を推定しましょう。その後、選択されたクラスタ数でクラスタリングを行い、結果を評価します。よろしいですか？
```
## 入力
```
お願いします。
```
エルボー法やシルエット分析もよくわかりませんが、お任せにします。
## 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3110569/e85fcb6b-447b-edc8-11ff-760303c5801a.png)
```
エルボー法とシルエットスコアに基づくクラスタ数の評価結果をプロットしました。

左側のグラフはエルボー法によるもので、y軸の「歪み」（各点からクラスタ中心までの距離の平方和）がクラスタ数（x軸）に対してどのように変化するかを示しています。理想的には、「エルボー」（曲がり角）がクラスタ数の適切な値を示します。ただし、このグラフでは明確なエルボーが見えないため、最適なクラスタ数を特定するのは難しいようです。

右側のグラフはシルエットスコアによるもので、y軸のシルエットスコア（-1から1の範囲で、1に近いほど良いクラスタリングを示す）がクラスタ数（x軸）に対してどのように変化するかを示しています。このグラフを見ると、クラスタ数が2のときに最も高いシルエットスコアを得ていることがわかります。

したがって、これらの結果に基づき、クラスタ数を2としてクラスタリングを進めてみましょう。よろしいですか？
```
## 入力
```
2だと少なすぎるため4で進めることは可能でしょうか
```
クラスタ数が2ですと、寂しい図になると思いましたので、４で進めることを提案しました。
## 出力
```
もちろんです。シルエットスコアのプロットを見ると、クラスタ数4でも比較的高いスコアが得られていることがわかります。したがって、4つのクラスタを用いて分析を進めることは可能です。

それでは、クラスタ数を4としてk-meansクラスタリングを実行しましょう。その後、各クラスタについて最も代表的な文書を表示します。
クラスタリングを実行し、各クラスタから最も代表的な3つの特許を選びました。以下にその結果を表示します。

**クラスタ 0:**

1. 「: To provide an insulating coating composition...」
2. 「: To provide a resin composition having therma...」
3. 「: To provide an electrolyte for a nonaqueous p...」

**クラスタ 1:**

1. 「To provide a polyamide resin composition havin...」
2. 「: To provide blended polyethylene-polystyrene ...」
3. 「: To provide an aqueous resin dispersion for h...」

**クラスタ 2:**

1. 「: To provide a circuit and a method for noise ...」
2. 「To provide carbon nanomaterial/organic polymer...」
3. 「: To provide a molded product which produces r...」

**クラスタ 3:**

1. 「: To provide a bipolar battery having high ion...」
2. 「: To provide a nonaqueous lithium type power s...」
3. 「: To provide a nonaqueous lithium type power s...」

なお、これらのテキストはabstractの一部であり、完全な文脈を理解するためには全文を確認する必要があります。

これらの情報をもとに、各クラスタがどのような特許を含んでいるのか、さらに分析を進めることが可能です。どのように進めていきましょうか？
```
## 入力
```
クラスタの全容を把握したいので、pcaやt-sneを使用した散布図を作成することは可能でしょうか。
```
いよいよ、IPランドスケープっぽい図を出力してもらいます。
## 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3110569/974715dc-9e15-c526-7ac3-3270107f3549.png)
```
PCAとt-SNEを使用して2次元に次元削減した後の散布図を作成しました。この図は、特許の抽象を基にしたクラスタリングの結果を視覚化しています。色とマーカースタイルは各クラスタに対応しています。

この図から、各クラスタがどのようにデータ空間に分布しているかを視覚的に理解することができます。ただし、t-SNEは高次元データの視覚的な解釈を助けるためのツールであり、各点間の距離が元の高次元空間の距離を正確に反映しているわけではないことに注意してください。

以上の結果を基に、何か他に分析したいことはありますか？
```
## 入力
```
各クラスタ0-3にラベルを付けることは可能でしょうか。
```
クラスタ0-3ですと何のことかわかりませんので、クラスタの名前を付けてもらうことにします。
## 出力
```
クラスタにラベルを付けることは可能ですが、このラベル付けは大抵、手動で行われます。これは、クラスタリングが教師なし学習の一種であり、生成されたクラスタが何を意味するのかをアルゴリズム自体が解釈することはできないためです。

クラスタにラベルを付ける一般的なアプローチの1つは、各クラスタに含まれる文書を見て、それらが共通して持つテーマやトピックを理解することです。そして、それに基づいて各クラスタに名前を付けます。

私たちが先ほど選択した各クラスタからの代表的な特許を見ると、クラスタ0は「絶縁被覆組成物」や「電解質」に関連しているようです。クラスタ1は「ポリアミド樹脂組成物」や「ポリエチレン-ポリスチレン」に関連しているようです。クラスタ2は「回路」や「カーボンナノマテリアル」に関連しているようです。クラスタ3は「二極性電池」や「非水系リチウム電源装置」に関連しているようです。

これらの情報に基づいて、以下のようなクラスタラベルを提案します：

- クラスタ0: 「絶縁・電解質関連」
- クラスタ1: 「樹脂・ポリマー関連」
- クラスタ2: 「回路・ナノマテリアル関連」
- クラスタ3: 「電池・電源装置関連」

これらのラベルはあくまで提案であり、完全な文脈を理解するためには全文を確認する必要があります。これらのラベルはあなたのニーズに合わせて自由に変更・調整することができます。このラベル付けについて、何かご意見やご要望はありますか？
```
## 入力
```
その内容でよいです。できれば、クラスタ図に各クラスタの範囲とそのラベルを書き込みたいです。
```
質問回数を減らすために、要望は先んじて書いておきます。
## 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3110569/057bc7c8-fda9-4bc6-fa43-c034824e0afb.png)
```
t-SNE散布図に各クラスタのラベルを追加しました。それぞれのクラスタの中心にラベルが表示されています：

- クラスタ0: 「絶縁・電解質関連」
- クラスタ1: 「樹脂・ポリマー関連」
- クラスタ2: 「回路・ナノマテリアル関連」
- クラスタ3: 「電池・電源装置関連」

これらのラベルは各クラスタの特性を表しています。この散布図は、特許の抽象に基づくクラスタリングの結果を視覚的に理解するのに役立ちます。

他に何か分析したいことはありますか？
```
## 入力
```
クラスタの範囲を楕円で書くことは可能でしょうか
```
## 出力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3110569/6630ccf9-cd1e-686b-eb6a-de8258c5b8d4.png)
```
各クラスタの範囲を表す楕円を追加しました。これらの楕円は、各クラスタの95%信頼区間を表しています。つまり、各クラスタのデータ点の約95%が楕円の内部に含まれています。

この図は、クラスタ間の関係と各クラスタの分布をさらに明確に示しています。ただし、t-SNEは非線形次元削減手法であるため、クラスタの範囲や形状を完全に信頼することはできません。それでも、クラスタ内のデータ点の相対的な位置関係を理解するための視覚的なガイドとして役立ちます。

他に何か分析したいことはありますか？
```
# 分析
図も書けたので分析してもらいました。以下は、ChatGPTの出力です。

この図は、特許の抽象を基にしたクラスタリングの結果を視覚化しています。各クラスタは特定のトピックを表し、これらのトピックは各クラスタ内の特許が共有する主題を基にしています。

ここから得られる洞察は以下の通りです：

1. **クラスタの分布**: t-SNEの結果から、各クラスタがデータ空間の異なる領域を占めていることがわかります。これは、各クラスタが異なるトピックを表していることを示しています。クラスタ間に明確な境界が見られる場合、それらのクラスタが異なるトピックを表している可能性が高いです。

2. **クラスタのサイズ**: クラスタ0（絶縁・電解質関連）とクラスタ3（電池・電源装置関連）は比較的大きく、多くの特許がこれらのトピックに関連していることを示しています。一方、クラスタ1（樹脂・ポリマー関連）とクラスタ2（回路・ナノマテリアル関連）は小さく、これらのトピックに関連する特許は少ない可能性があります。

3. **クラスタの形状と位置関係**: クラスタの形状（楕円の長さと方向）は、そのクラスタ内の特許がどの程度ばらついているかを示します。例えば、クラスタ0は比較的細長い形状をしており、このクラスタ内の特許は特定の方向にばらついていることを示しています。これは、このクラスタが一連の関連するトピックをカバーしている可能性を示唆しています。

また、クラスタ間の距離は、それらのトピックがどの程度異なるかを示します。例えば、クラスタ0とクラスタ3は近くに位置していますが、これはこれらのクラスタが共通のトピック（おそらく電子デバイスや電池技術）を共有している可能性があることを示しています。

これらの洞察はあくまで視覚的な解釈に基づくものであり、より詳細な分析を行うためには各クラスタ内の特許を詳しく調査する必要があります。
# 感想
Code interpreterに頼り切ってIPランドスケープっぽい図を書きましたが、以下の点で難しさを感じました。

1.日本語に対応していない
japanize-matplotlibを使用できないので、日本語のグラフを書くことができませんでした。

2.使えないライブラリが結構ある
日本語テキストマイニングのためのライブラリが使用できませんので、日本語の処理ができませんでした。

3.GPT4の回数制限の縛り
Code Interpreterは確かにプログラムを書いてくれますが、GPT4の3時間25回の回数制限の縛りがありますので、25回のやり取りで完成させねばなりません（もちろん超えてもよいのですが、データが失われ面倒です）。そういう意味ではあまり凝ったプログラムの作成はできないのではないでしょうか。

いずれ日本語にも対応すると思いますので、今は、この英文データをつかって、Code Interpreterの使用法をいろいろと試したいと思います。