Databricksのアシスタント機能を使ってノーコードでQiitaの投稿分析をしてみる

初めてのアドカレです。

# 導入

今年の夏ごろから本格的にQiitaの記事投稿を始め、気づけば60本程度記事を投稿していました。それなりに見てもらえているようで、読者の皆様には感謝しております。

それなりに投稿数が増えてきた中、以下の記事を読んで「Qiitaの記事分析も自然言語だけでやれないかなー」と思い、実際にやってみました。

https://qiita.com/taka_yayoi/items/b431d042a170e90c8712

# 準備

QiitaからAPIアクセス用のトークンを発行しておきます。
（設定メニューのアプリケーションタブより）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/f5dfbaa9-5970-6f71-ed22-38bbe0bb191c.png)

発行したアクセストークンを、Databricksのシークレットとして登録します。

シークレットについては以下を確認ください。

https://qiita.com/taka_yayoi/items/338ef0c5394fe4eb87c0

今回はスコープを```qiita```、キーを```api_token```という名前で登録します。

# Step1. Qiitaから記事一覧の取得

適当にノートブックを作成し、アシスタントに以下を指示します。

> Qiitaから投稿記事の一覧を取得してください。
取得に必要なAPIキーはdbutilsのシークレットから取得してください。スコープはqiita、キーはapi_tokenです。
ページ当たり100件のデータを取得してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/ec1c2a06-d699-6323-5938-2453658fa500.png)

QiitaのAPIから記事一覧を取得するコードを生成してくれます。
というか、QiitaのAPIコールも普通に生成できるんだ。。。

こちらのコードをノートブックのセルに反映して実行。

```python
import requests
import json
import os

# Get API key from secrets
api_key = dbutils.secrets.get(scope="qiita", key="api_token")

# Set endpoint and parameters
url = "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=100"   # ページあたりの取得件数を100件にしてください。
headers = {"Authorization": f"Bearer {api_key}"}

# Send request
response = requests.get(url, headers=headers)

# Get response as JSON and parse
items = json.loads(response.text)
```

エラーなく処理が完了できました。

ただ、取得結果を表示してないので、追加の指示を入れます。

> 得られた記事の一覧をpysparkのデータフレームに変換して表示してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/7aa79cce-6718-c297-7799-e3e6283aa5bb.png)

pysparkのデータフレームに変換して表示する処理が追加されました。

```python
import pandas as pd

# Get API key from secrets
api_key = dbutils.secrets.get(scope="qiita", key="api_token")

# Set endpoint and parameters
url = "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=100"
headers = {"Authorization": f"Bearer {api_key}"}

# Send request
response = requests.get(url, headers=headers)

# Get response as JSON and parse
items = json.loads(response.text)

# Convert to pandas DataFrame
items_df = pd.json_normalize(items)

# Convert to PySpark DataFrame
spark_df = spark.createDataFrame(items_df)

# Show PySpark DataFrame
display(spark_df)
```

実行すると、結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/852538d4-86fa-5aa1-3f1b-57a70f878f55.png)

うん、すごい楽。驚きました。

それではデータも取れたので、集計・可視化していってみましょう。
※　ここからは全て画像で結果を表示。

# Step2. ページビュー Top10表示

読まれている記事のTop10を表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/532d6c45-ea33-4dcb-5e22-475611c952c1.png)

コードを実行すると以下の結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/8c9deb3b-e987-f60c-272d-654d68271f26.png)

ページビュー数は恥ずかしいので隠させてもらいました。
ただ、正しくTop10の記事タイトルが表示されています。

なお、現時点で一番読まれているのは以下の記事です。
※　Langchain周りの内容が古くなってきているので、注意が必要。。。

https://qiita.com/isanakamishiro2/items/c55123343e95fd2769a6

FUDAの金融データ活用チャレンジのコンペに参加した際の記事も多くの方に読んでもらえていました。感謝です。


# Step3. いいね数のTop10表示

同様にいいねの数Top10も表示してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/91a2499a-7b1d-1498-d01d-31c3a71dfb0d.png)

日本語のいいねという言葉だけで適切な項目を選んでくれました。すごー。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/eb71daf5-10f0-266d-4ffc-b9652a5fa159.png)

こちらだと2番目に以下の記事が来ていました。
勉強メモでお恥ずかしい限りですが、ありがたいです。

https://qiita.com/isanakamishiro2/items/4eb175bb2bc80d7225cb

# Step4. 曜日ごとの投稿件数合計

何曜日に投稿している頻度が高いのかを知るために、曜日ごとの投稿件数を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/c18f9ca3-3511-26e6-1c0d-600e1dd7ff67.png)

実行すると月曜日始まりでソートした上でちゃんと表示できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/95ea9324-8937-30f4-d5d5-aefb604af72e.png)

Databricksならアシスタントを使わずともノーコードでグラフ化もできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/d5713d54-0f53-9b0f-661a-77a455171fae.png)

土日がやはり一番多く投稿していますね。
金曜もそれなりに投稿しているのは少し驚き。~~だいたい飲んでいるのに。~~

# Step5. タグごとのページビュー件数

タグごとのページビュー数を集計してみます。
タグは辞書型データのリスト形式で保管されているため、少しややこしいデータ構造となっているのですが、正しく集計できるのでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/47d43bf3-c530-8796-45be-fe9cf1518196.png)

実は指示に結構苦労したのですが、ちゃんと集計できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/1d00e533-3524-536d-ac32-dda12279da4c.png)

グラフも出してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/5131285f-c126-f237-2729-f0650e950271.png)

私の投稿のほとんどがDatabricksやLLMタグが付いているため、ページビュー数はこれらがダントツで多いです。
個人的な期待感としては、MLflowが日本でもっと普及して欲しいと思っているので、MLflowタグが付いた記事がもっと読まれると嬉しい。

# まとめ

Databricksのアシスタント機能や可視化機能を使うだけで基本的な分析ができてしまいました。
（QiitaのAPIコールを普通にできたのが一番の驚きでした）

実際のところ、結構プロンプトの試行錯誤をしています。もしかしたら、それなりにコードが書ける人でないと適切な指示出しは難しいかもしれません。
しかし、それなりに正しいコードをバンバン生成できるので、生成されたコードを見ながら人が学習し、よりよい指示を出したり、コード自体も書けるようにステップを踏んでいける気がします。

やはりLLMの登場によって、開発の仕方は変わっていくなと改めて実感しました。
来年のアドベントカレンダーの時期には、どのように変わっているのか、未来が楽しみで仕方ありません。