LoginSignup
2
4

データ前処理は、ChatGPTにお願いすると楽ちん!

Posted at

はじめに

ChatGPTを介してPythonを使うと、これまでとは感覚が変わります。

これまでは、

  • あるデータを〇〇のように変換したい

というときは、処理の仕方をいろいろ探して、それなりに学習して、やってみて… ということを繰り返す必要がありましたが、ChatGPTを使うと

  • 「このデータを〇〇のように変換して」というだけ…

これは、隣にいる同僚に(Pythonのことは、まったく意識せず)適当に伝えてやってもらう感覚です。

以下、簡単な内容ではありますが、仮想データを準備し、データの前処理をChatGPTにやってもらいました。

 

仮想データについて

以下が準備した仮想データです。かなり乱れていますが、現実はこのようなデータが多いと思います。

image.png

  • 列a には、NUM! があります。これはEXCELでよく見るエラー表示です。
  • 列b, f は、16進数です。このままでは可視化や分析はできません。
  • 列c には、異常な値(文字:😢, ---)があります。
  • 列d は、カテゴリー? 数値?、型式?… 数値も10進数?16進数?よくわかりませんね。
  • 列e にある np.nan は欠損値です。データのほとんどが欠損値になっています。

何らかの前処理を行わないと、このままでデータ可視化するのはしんどいですね。

 

ChatGPT によるデータの前処理

まず、ChatGPTに上記の仮想データを与えました。

「列a~f に指定したデータをデータフレームに格納して表示して」というPythonのコードを与えています。これは前処理を行うデータを与えているだけです。Pythonをご存じない方は「ふーん」でよいと思います。


以下を実行して下さい。

df = pd.DataFrame({'a': [5, 2, 3, 100, NUM!, 200],'b': ['abc', '0C3A', '9F07D2','ffff','ffff','7b2'],'c': [19.3, 😢, 99.5, 200.2, ---, 1200.3],'d': ['ZA-20', '100', 'a','abc','ZA-20','ZA-20'],'e': [1, np.nan, np.nan, np.nan, np.nan, np.nan],'f': ['6ff3312c', 'ca8787a0', '6eba2e10', '61e6dad7', '7b422413', '55bdb52e']

})print(df)


データフレームが作成され、無効または不明な値は np.nan で置き換えられました。以下がその内容です:

image.png

このデータフレームは6行と6列から構成されています。列 'a' と 'c' は数値型、列 'b'、'd'、および 'f' は文字列型、列 'e' は数値型で欠損値が含まれています。

 
な、なんと、ChatGPTは 指示しなくても無効または不明な値(=NUM!, 😢, ---)を欠損値と判断し、親切にNaN に置き換えてくれました。なんて気が利くんだ。

次に、(わかってはいますが)ChatGPTに以下を指示しました。
 

  • 指示:16進数のデータ列を教えてください。

16進数のデータを含む列を特定するためには、各列のデータが16進数の形式(0-9の数字とA-Fの文字)に従っているかどうかを確認する必要があります。このデータフレームでは、列 'b' と列 'f' が16進数のデータを含んでいる可能性が高いです。これを確認するために、これらの列の値が16進数の形式に適合しているかどうかをチェックしましょう。データフレーム内の列 'b' と列 'f' はどちらも16進数のデータを含んでいます。これらの列の各値が16進数の形式(0-9の数字とA-Fの文字)に適合していることが確認されました。

 
ちゃんと認識してくれました。列e のデータの中に 16進数らしき値がありますが、この列は違うなと解釈したのでしょう。

 
続けて、ChatGPTに以下を指示しました。

  • 指示:列 'b' と列 'f' を10進数に変換して、データフレームを書き出してください。

列 'b' と列 'f' を10進数に変換した後のデータフレームは以下の通りです:

image.png

これで、列 'b' と列 'f' の値が10進数に変換され、他の列の値はそのまま保持されています。

 

データらしくなってきましたね。
 
次は、欠損値(NaN)の処理です。欠損値の数が少ない場合は、欠損値を含む行データを削除したり、欠損値が多い列データを削除することもありますが、今回は ある値に置換することにします。

 

  • 指示:NaN を-99に置換してください。

NaN 値を -99 で置き換えた後のデータフレームは以下の通りです:

image.png

すべての列にわたってNaN値が-99で置き換えられました。

 
 
次に、(わかってはいますが)カテゴリーデータの列があるかを尋ねてみます。

  • 指示:カテゴリーデータの列はありますか?

カテゴリーデータは、限られた数の繰り返し可能なカテゴリやグループに分類されるデータです。このデータフレームを見ると、数値データ(列 'a'、'b'、'c'、'e'、'f')とテキストデータ(列 'd')が含まれています。この中で、列 'd' はカテゴリーデータと考えられます。なぜなら、この列は限られた数の繰り返し可能な文字列値('ZA-20'、'100'、'a'、'abc')を含んでいるからです。他の列は数値データであり、明らかなカテゴリー分けはされていないようです。

 
ChatGPTからの回答に疑問の余地なしってことで、次に以下を指示しました。

  • 指示:列 'd' をラベルエンコーディングしてください。

列 'd' をラベルエンコーディングした結果は以下の通りです。新しい列 'd_encoded' が追加され、元のテキスト値が数値に変換されています:
image.png
ここで、ラベルエンコーダーは各異なる文字列を一意の整数に変換しています。例えば、'ZA-20' は 1 に、'100' は 0 に、'a' は 2 に、そして 'abc' は 3 に変換されています。

うん。データらしくなりましたね。

 
最後に、ChatGPTに以下を指示しました。

  • 指示:エンコーディング後のデータでペアプロットを描いてください。ペアプロットはd_encodedで層別し、プロットが見やすいように色を分け、プロット形状は「丸型」にしてください。

image.png
ペアプロットを作成しました。このプロットは、データフレームの数値列間の関係を示しており、列 'd_encoded' によって層別され、色分けされています。プロットの形状は丸型で表現されています。このプロットから、異なる変数間の関係やパターンを視覚的に分析することができます。

 
 

最後に

データを見ながら ChatGPTに前処理を指示… これを繰り返すだけ。めっちゃ楽です。

こちらは「いうだけ」ですから。

 

参考

上記の内容を Pythonだけ で実行する場合、そこそこ手間がかかります。以下は、Pythonによる前処理実行の手間を抑えるためにテンプレートを作成したという記事です。これを振り返っても、テンプレートを利用するより、ChatGPTにお願したほうが早いし、楽です。

 
 
※この記事で紹介した前処理は一例です。例えば、列c の「---」というデータは、ChatGPTは気を利かして「NaN」にしてくれましたが、何らかの意図をもって書き込んだ記号なら、「”---”は欠損値ではなく異常を示す記号なので、-999に置換して」と伝えて対応する等、任意です。このようにどのような前処理を行うか?は目的によります。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4