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

## はじめに

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

これまでは、

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

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

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

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/c971e32a-fcd7-df44-f0ef-69b483b2494d.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/a9a5fc9a-883c-21cb-02e0-feeadd93d60d.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/b84bffc3-d1ac-ea41-77e2-e8c4706f8fec.png)
>
>これで、列 'b' と列 'f' の値が10進数に変換され、他の列の値はそのまま保持されています。

　

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

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

>NaN 値を -99 で置き換えた後のデータフレームは以下の通りです：
>
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/095794c0-29b0-2533-f1ce-6146143b14a2.png)
>
>すべての列にわたってNaN値が-99で置き換えられました。

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

- 指示：カテゴリーデータの列はありますか？

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

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

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

>列 'd' をラベルエンコーディングした結果は以下の通りです。新しい列 'd_encoded' が追加され、元のテキスト値が数値に変換されています：
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/f9c0eb0a-fd55-0297-3ad2-03b1be82dab0.png)
>ここで、ラベルエンコーダーは各異なる文字列を一意の整数に変換しています。例えば、'ZA-20' は 1 に、'100' は 0 に、'a' は 2 に、そして 'abc' は 3 に変換されています。


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

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

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

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/250c0d7c-03d6-56de-207b-76ed65c43ea0.png)
>ペアプロットを作成しました。このプロットは、データフレームの数値列間の関係を示しており、列 'd_encoded' によって層別され、色分けされています。プロットの形状は丸型で表現されています。このプロットから、異なる変数間の関係やパターンを視覚的に分析することができます。

　
　
## 最後に

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

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

　
### 参考

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

https://qiita.com/hima2b4/items/d759e6cf147de8685b7d

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