サブクラスタリングによる詳細なSEO分析と可視化

# 1. はじめに
この記事では、前回の記事「[Google BigQueryを用いたGSCデータの可視化とLooker Studioでの表示](https://qiita.com/tan0ry0shiny/items/7a2b0508c5c41f1578f3)」で行ったクラスタリングに続き、さらに詳細なサブクラスターの分析を行います。今回は、各クラスタ内のクエリをさらに細分化し、サブクラスターごとのロングテールキーフレーズを生成し、それをSEO対策に活用する方法について解説します。

本記事では結果や概要を記載しますが、具体的な手順については今後別の記事で詳しく説明する予定ですので、気長にお待ちいただくか、他の記事を参考にしてください。

また、この記事は一意見ですので、間違いや修正、ご意見等ありましたらご教示いただけると幸いです。

# 2. サブクラスターの作成
各クラスタ内のクエリを再度クラスタリングしてサブクラスターを作成しました。これにより、各クラスタ内のテーマやトピックをさらに細分化して理解することができます。

**例：障害者支援サービスの評判と口コミのサブクラスター**
クエリの例：
* サブクラスター0.0: アスペルガー, 評判, アットジーピー
* サブクラスター1.0: 評判, プログラマー, 退職コンシェルジュ
* サブクラスター2.0: doda, dodaチャレンジ, 評判
# 3. ロングテールキーワードの生成
各サブクラスターごとの代表キーワードを基に、以下のようなロングテールキーワードを生成しました。

**クラスタ「障害者支援サービスの評判と口コミ」のサブクラスターごとのロングテールキーワード**
* サブクラスター0.0: インフラエンジニアとしての恋愛の難しさ
* サブクラスター1.0: プログラマーのキャリアと評判
* サブクラスター2.0: dodaチャレンジの体験談

# 4. 可視化
サブクラスターごとのクエリの分布を可視化するために、t-SNEを使用して次元削減を行い、3次元の散布図を作成しました。また、各サブクラスターごとのインプレッション数とクリック数の時系列データも別々に可視化しました。

```python
# クラスタごとにデータを分けてリストにまとめる
cluster_list = []
num_clusters = query_data_10k_subcluster['cluster'].nunique()

for cluster in range(num_clusters):
    cluster_data = query_data_10k_subcluster[query_data_10k_subcluster['cluster'] == cluster]
    cluster_list.append(cluster_data)

# クラスターごとのデータを確認
for i, cluster_data in enumerate(cluster_list):
    print(f"Cluster {i} Data:")
    display(cluster_data.head())
```
```python
import plotly.express as px
import pandas as pd
from sklearn.manifold import TSNE
import numpy as np

for cluster in cluster_list:
    # 'embeddings'列をNumPy配列に変換
    embeddings = np.array(cluster['embeddings'].tolist())

    # t-SNEによる次元削減（3次元）
    tsne = TSNE(n_components=3, random_state=0)
    embeddings_tsne_3d = tsne.fit_transform(embeddings)

    cluster['tsne_data'] = list(embeddings_tsne_3d)
```

## 4-1. t-SNE 3D 可視化
```python
import numpy as np
import plotly.express as px

# クラスタごとのt-SNEプロットを作成
for i, cluster in enumerate(cluster_list):
    # クラスタラベルとラベル名のマッピングを作成
    subcluster_mapping = {row['subcluster']: row['long_tail_keyword'] for index, row in cluster.iterrows()}
    subcluster_names = [subcluster_mapping[label] for label in cluster['subcluster']]

    # t-SNEの3次元可視化
    fig = px.scatter_3d(
        x=cluster['tsne_data'].apply(lambda x: x[0]),
        y=cluster['tsne_data'].apply(lambda x: x[1]),
        z=cluster['tsne_data'].apply(lambda x: x[2]),
        color=subcluster_names,
        title=f"t-SNE 3D visualization of clustered queries: {cluster['optimal_seo_keywords'].values[0]}",
        labels={'x': 't-SNE component 1', 'y': 't-SNE component 2', 'z': 't-SNE component 3'},
        hover_data={'query': cluster['query']}  # クエリをホバーデータとして追加
    )

    # 凡例の位置を調整
    fig.update_layout(
        legend=dict(
            x=0.8,
            y=0.9,
            traceorder='normal',
            font=dict(size=12),
            itemsizing='constant'  # アイテムのサイズを一定に保つ
        )
    )
    fig.update_traces(marker=dict(size=1))  # マーカーサイズを適切に設定
    fig.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/ba1d006b-6c23-7458-8a01-5a3838ddb591.png)

# 5. SEO対策への活用
生成されたロングテールキーワードを用いて、以下のようなSEO対策を考えられると思います。

**コンテンツの最適化:**
各サブクラスターのキーワードを基に、詳細で関連性の高いコンテンツを作成。
**内部リンクの強化:**
ピラーコンテンツとクラスターコンテンツをリンクし、サイト全体のユーザーエンゲージメントを向上。

# 関連
* [tan0ry0(2024.6),Google Search Consoleデータの可視化とクラスタリング分析](https://qiita.com/tan0ry0shiny/items/7a2b0508c5c41f1578f3)