自然言語でデータを加工・整形ができる「AI プロンプト」機能を使うと、データの整形、計算、集計、結合、文字列の加工など、データラングリングに関してやりたいことをプロンプトに入力するだけで、データを自由自在に素早く加工できるようになります。
このノートでは、このAI プロンプトの機能を使いこなして、より望む結果を得やすくするために、効果的なプロンプトの書き方やお役立ちいただける情報を解説していきます。
基本的なプロンプトの構文は次のとおりです。
<列名>に<処理内容>をしたい
例えば、 1行が1購買商品のECサイトの売上データを使用していたとします。
売上が1000以上かどうか判定した列を作りたいため、プロンプトに「売上が1000以上かどうか判定したい」と入力します。
プロンプトを実行することで、売上を1000以上かどうか判定するためのRコマンドの結果が返ってきました。そのため、「ステップとして実行」のボタンをクリックします。
これによって「売上1000以上」といった列が作成されています。
上記の例のように、プロンプト機能を使う際には、以下を意識してプロンプトを書くことで、より実現したい処理に沿った結果を返してくれるようになります。
1行が1購買商品ごとにある売上データを使用します。
プロンプトで以下のように顧客数と売上合計の集計をするように指示をしたとします。
顧客数と売上合計を集計したい
この場合、どういった単位で実行するのかの指定がないために、全体での結果が返ってくることがあります。
このデータにはアジアやアフリカなどの値を持った「マーケット」の列があるために、マーケットごとに顧客数や売上合計を求めたいです。
集計や計算などでグループ単位で分けたい時には、「グループごと」をプロンプトの冒頭につけます。この「ごと」や「毎」はどちらを使用していただいても構いません。
マーケットごとに顧客数と売上合計を集計したい
マーケット毎に顧客数と売上合計を集計したい
プロンプトを「マーケットごとに顧客数と売上合計を集計したい」といった指示に変更します。
これによって集計をする時にグループ化処理であるgroup_byといった関数を使用して、マーケットごとに顧客数や売上を集計してくれていることがわかります。
ステップとして実行をすることで、マーケットごとに顧客数や売上を集計できていることが確認できます。
このグループは複数指定いただくことも可能です。例えば、「月ごと」と「マーケット」ごとに集計をしたい場合であれば、プロンプトには以下のように指定します。
月ごと、マーケットごとに顧客数と売上合計を集計したい
これによってグループ化では日付列である注文日の情報も使って、月ごと、マーケットごとに集計されるように変わっています。
ステップとして実行をすることで、月ごと、マーケットごとに顧客数や売上を集計できていることが確認できます。
ここでも1行1購買商品のECサイトの購買データを使って説明をしていきます。
例えば、顧客ごとに注文回数を集計するために、以下のプロンプトを指示したとします。
顧客ごとに注文回数を集計したい
顧客ごとに注文回数を計算しようとしていますが、行の数を求める関数を使用していることがわかります。
ただ、このデータの1行は1注文ではなく、1購買商品のデータです。従って、購買された商品ごとに行が分かれ、注文した商品の種類の分だけ行を持っています。
例えば、以下のような1行が1購買商品のデータがあったとします。
行の数を数えるとそれぞれの顧客から4件の注文があったように見えますが、果たして顧客Aは実際には何件の注文があるのでしょうか。
注文日を見ると実際には顧客Aは3件の注文、顧客Bは2件の注文であることがわかります。顧客ごとに注文の回数を数えるためには、注文日の一意(ユニーク)な数を顧客ごとに数えなければいけません。
そこで、データの1行の単位をプロンプトの冒頭に追加します。今回の場合は「1行1購買商品のデータ」を追加をすることになります。
1行1購買商品のデータで顧客ごとに注文回数を集計したい
これによって、行の数ではなく注文日の一意な値の数を使って注文回数を計算するように変わっています。
ステップとして実行をすることで、顧客ごとに注文回数を正しく計算できていることが確認できます。
例えば、GDPと人口といった2つのデータがあったとします。
この「GDP」と「人口」の2つのデータフレームを結合をしていきたいとします。その場合、結合する際には結合のキーというものが必要になります。
以下は結合キーが1つのシンプルな例となります。
結合したいデータによっては、結合のキーは2つや3つなど、複数になることもあります。
これまでのUIベースでの結合では、それぞれのデータで何がキー列になるのかを、お互いのデータを見ながら確認をしていく必要がありましたが、AI プロンプトの機能では、データを元に推測をして結合のキーを勝手に設定をしてくれます。
結合などの他のデータフレームを参照させるためには、「$」を入力します。これによってそのプロジェクトにあるデータフレームを指定することができるようになります。
結合をする場合には、プロンプトとして以下のように指定をします。
$Population のデータと結合したい
プロンプトを実行することで、Population(人口)のデータと結合するためのRコマンドが返ってきます。この際に列名が異なっていたとしても、同じ列だと推測されるものを自動的に識別して結合のキーに設定をしてくれています。
ステップとして実行をすることで、GDPのデータに対して人口のデータを結合することができました。
1行が1企業かつ投資家ごとに分かれているユニコーン企業のデータを使用します。
例えば、投資家の列から「Capital」といった文字を取り除きたいとします。そのため、以下のプロンプトを指示します。
投資家の列からCapitalの文字を取り除いて
これによって投資家の列から”Capital”といった文字を取り除くためのRコマンドが返ってきているため、ステップとして実行してみましょう。
そうすることで、“Capital”の文字は取り除かれているのですが、いくつか問題があります。
というのも、“Capital”といった先頭が大文字の場合は除かれていますが、“capital”のように全てが小文字の場合は取り除かれていません。
さらに、“Capital”の文字を取り除けたはいいものの、“Capital”の前にあったスペースがそのまま残ってしまっています。
そこで、列名である”投資家”や指定している文字である”Capital”に対してダブルクォート(“)で囲ってみます。
“投資家”の列から”Capital”の文字を取り除いて
これは、AI Promptの機能の特徴として、RAG(Retrieval Augmented Generation)といってプロンプトを元にExploratoryで持っているコンテンツに対して検索をかけて、返ってきた結果を元に適切な処理内容を見つけるといった仕組みをとっています。
その際に、“投資家”や”Capital”といった特定の単語が含まれていると、その単語に検索結果が左右されることがあるために、それを抑制するためにダブルクォートで囲うといったことをしています。
これによって、Exploratoryが持っているコンテンツから正しく情報を参照し、Rコマンドが返す結果にも違いがあることが確認できます。
元のプロンプトで返ってくる結果:
mutate(`投資家` = str_remove(`投資家`, ”Capital”))
ダブルクォートをつけたプロンプトで返ってくる結果:
mutate(`投資家` = str_remove(`投資家`,regex("Capital", ignore_case = TRUE), remove_extra_space = TRUE))
このダブルクォートをつけた時に返ってくる結果での大きなポイントはignore_caseとremove_extra_spaceといった引数になります。
ignore_case = TRUEは「大文字・小文字」を無視して処理することができる引数になります。そのため、もともと取り除かれていなかった小文字の”capital”も取り除かれていることが確認できます。
次にremove_extra_space = TRUEは、処理の後に不要な空白があった場合は削除するための引数です。これによってCapitalを消した際に元々あった空白が取り除かれていることが確認できます。
このようにテキストデータの加工でうまく結果が返ってこない場合は、列名や指定した文字に対してダブルクォートをつけてみてください!
Excelなどのデータを扱っていると、汚い列名のデータとよく遭遇することがあります。
汚い列名のデータをきれいにする場合には、それぞれのシーンに合わせて以下のプロンプトを使うことで簡単に列名をきれいにすることができます。
例えば、以下はワクチンの接種回数のデータですが、列名が驚くほど汚いです。列名が複数行、複数列に跨っているため、これを1つずつ修正しようとするのはやりたくない作業のひとつです。
そこで、以下のプロンプトを実行します。
複数行にまたがる情報をもとに列名にして
複数行、複数列にまたがる列名を、データを元に判断をして一括で変更をしていることがわかります。
ステップとして実行することで、複数行、複数列にまたがる列名を綺麗にすることができました。
このAI プロンプトの機能は、これまでのExploratoryのUIでサポートされていたデータ加工を遥かに超える、よりエキサイティングな使い方ができます。そこで、いくつかの活用例をご紹介していきます。
例えば、アンケートデータなどでよくあるのが、列名に「Q1」や「Q2」といった質問番号が使われるといったことがあります。
こういったデータだと分析をしようとしてもその質問番号自体が何を表すのかわからないために、それぞれの質問番号に対応する質問名を紐づけるといった作業が必要になります。そのため、以下のようにQ1であれば性別、Q2であれば年齢のように置き換えていきたいです。
そこで、プロンプトに以下のように指定をして実行をします。
列名を以下で置き換えて
質問番号 質問名
Q1 性別
Q2 年齢
Q3 職種
Q4 サービスの使いやすさ
Q5 サービスの機能の豊富さ
Q6 サービスの品質
Q7 デザイン
・・・
Q17 推奨度の理由
これによって、質問番号になっていた列名を一気に質問名で置き換えるためのRコマンドを結果として返してくれます。
実行することで、列名を一気に置換することができました!このように、今までなら面倒だった列名の置換作業も、このAI プロンプトの機能を使うことで、簡単に、そして素早く解決することができます。
先程は列名の質問番号を質問名で置き換えるといった例を紹介しましたが、値の方も一括で置換をすることが可能です。アンケートデータの例になりますが、性別や年齢、職種なども数値としてローデータを持っているということがあります。
そこで、それぞれの質問名と回答番号に紐づく回答ラベルに一括で置換をしたいとします。この例では性別の1といった値は女性といったラベル、年齢の1は20代といったラベルに変更をしたいです。
そこで、プロンプトに以下のように指定をして実行をします。
値を以下で置き換えて
質問名 No ラベル
性別 1 女性
性別 2 男性
年齢 1 20代
年齢 2 30代
年齢 3 40代
・・・
これによって、回答番号に紐づくラベルで一気に置き換えるためのRコマンドを結果として返してくれます。
実行することで、値を一気に置換することができました!値の置換作業も、元の値と新しい値を指定するだけで、一気に変更をしていくことが可能です!
AI プロンプトの機能では、プロンプトを実行していい結果を返すために、データをサンプルしてLLMに提供しています。ただ、学習データとして使用しているわけではなく、より良い提案をさせるために、サンプルデータの指定があります。
デフォルトは50行ですが、もしサンプルデータを渡したくない場合は0行にすることが可能です。
では、このサンプルデータがどのように影響をするのかについてみていきましょう。
1行が1ユニコーン企業のデータで「国」といった列があります。この国の列は2文字の国コードを値として持っています。今回はこの国の列から地域名の列を作成していきたいです。
サンプルデータを「0行」にして、国から地域名に変換するために以下のプロンプトを指示します。
国から地域名に変換して
これで実行をした時に、「2文字の国コード」ではなく、「国名」から「地域名」に変換するためのRコマンドが結果として返っています。
地域名の列は作成できましたが、国コードから地域名に変換するという正しい処理ができていないために、欠損値が非常に多い結果になっています。
では、サンプルデータの行数をデフォルトの「50行」として同じプロンプトを指示したとします。
そうすることで「国コード」から「地域名」に変換するためのRのコマンドが返ってきています。
ステップとして実行することで、今度は地域名の列に欠損値がなく、正しく国コードから国名に変換されていることがわかります。
このように、データの値を元に処理の判断をする場合は、サンプルデータを渡すことで提案内容がより正しいものが返ってくる確率が上がります。また曖昧なプロンプトだったとしても推測をして結果を返してくれるといった利点があります。
もし、サンプルデータを渡せないといった時にも使えないわけではありません。データの値を見なくてもいい処理は、サンプルデータを渡さなくても同程度の結果を期待できます。
もしサンプルデータを渡さない時にうまくいかない場合は、実施したい処理内容を明確に記載する必要があります。
先ほどの例では「国から地域名に変換して」といったプロンプトを使っていましたが、これをより具体的にして以下のプロンプトに変更をします。
国の2文字の国コードから地域名に変換して
これによって国コードから地域名に変換するための正しいRコマンドを提案してくれるようになります。
そのため、サンプルデータを提供ができない場合は、データの特徴をプロンプトに付け足してあげることで、よりいい精度での結果を返せるようになります。