「ChatGPTを活用したデータクリーニングと前処理の自動化」

Automating Data Cleaning and Preprocessing with ChatGPT

 

ChatGPTは、多くのアプリケーションに使用できるスイスアーミーナイフとなり、データサイエンスのワークフローにChatGPTを統合する余地が豊富にあります。

実世界のデータセットで機械学習モデルをトレーニングしたことがある場合、データのクリーニングと前処理のステップは、頑強な機械学習モデルの構築に重要です。このガイドでは、例としてデータセットでこれらのタスクを実行するためにChatGPTを使用する方法を見ていきます。

UCI機械学習リポジトリからの銀行マーケティングデータセットを使用し、ChatGPTに以下の操作を行うよう指示します:

  • データセットの取得と読み込み
  • 欠損値のチェック
  • カテゴリ変数のエンコード

OpenAIアカウントにサインインして新しいChatGPTセッションを開始することで、一緒に進めることができます。お好みで、Google Colabでもコーディングを行うことができます。

 

データセットの取得と読み込み

 

データセットにはいくつかの異なるバージョンがありますが、bank-full.csvを使用します。

 

プロンプト:今日は実世界のデータセットでデータのクリーニングと前処理を行います。以下の操作を行うコードを記述してください:1. UCI機械学習リポジトリから銀行マーケティングデータセットを取得します。requestsやurllibなどのライブラリを使用してください。2. zipファイルをダウンロードし、内容を解凍し、bank-full.csvファイルをpandasのデータフレームに読み込んでください(dataと呼びます)。

 

データセットを取得して読み込むコードは以下の通りです:

import pandas as pd
import urllib
import zipfile

# データセットのURL
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip"

# データセットの取得と解凍
urllib.request.urlretrieve(url, "bank.zip")

with zipfile.ZipFile("bank.zip", "r") as zip_ref:
    zip_ref.extractall()

# データセットをpandasのデータフレームに読み込む
data = pd.read_csv("bank-full.csv", delimiter=";",skipinitialspace=True)

 

データセットの基本情報を取得する

 

データセットをより理解しましょう。

# データセットの最初の数行を表示
print(data.head())

 

これは出力です: 

 

プロンプト:pandasを使用して、データフレームの次元、列の記述統計、および各列のデータ型を取得してください。

 

このステップでは、pandasのメソッドが非常にシンプルなため、ChatGPTに促す必要はありません。

# データセットの次元(行、列)を取得
print(data.shape)

 

出力 >>> (45211, 17)

 

45000以上のレコードと16の特徴があります(17は出力ラベルも含まれます)。

# 数値列の統計的要約を取得
print(data.describe())

 

 

また、各列のデータ型を把握することも役立ちます。カテゴリ変数をエンコードする際に詳しく見ていきます。

# 各列のデータ型をチェック
print(data.dtypes)

 

出力 >>>

age           int64
job          object
marital      object
education    object
default      object
balance       int64
housing      object
loan         object
contact      object
day           int64
month        object
duration      int64
campaign      int64
pdays         int64
previous      int64
poutcome     object
y            object
dtype: object

 

これまでに、銀行のマーケティングデータセットについて理解を得ました。出力ラベルは、顧客が定期預金に申し込むかどうかを示しています。データセットには、年齢、月、教育、婚姻状況、前回のキャンペーンの結果など、いくつかの特徴が含まれています。

 

欠損値のチェック

 

要求: 各列の欠損値の数を知りたいです。pandasを使用してそのためのコードを教えてください。

 

# 各列の欠損値をチェックする
missing_values = data.isnull().sum()
print(missing_values)

 

以下は出力です:

Output >>>

age          0
job          0
marital      0
education    0
default      0
balance      0
housing      0
loan         0
contact      0
day          0
month        0
duration     0
campaign     0
pdays        0
previous     0
poutcome     0
y            0
dtype: int64

 

このバージョンの銀行のマーケティングデータセットは、45000件以上のレコードがあり、欠損値はありません。ただし、実際のデータセットでは、ほとんどの実世界のデータセットには欠損値があります。適切な補完技術を使用して欠損値を処理する必要があります。

オプションの演習として、欠損値の処理方法を練習するために、ここでChatGPTに一部の列の一部の値を削除するように指示を追加することもできます。

 

カテゴリ変数のエンコーディング

 

次のステップは、データセット内のカテゴリ変数をエンコードすることです。まず、すべてのカテゴリ列のリストを取得しましょう。

 

要求: このデータセットのすべてのカテゴリ列のリストを取得するためのコードを教えてください。

 

# カテゴリ変数の数をカウントする
categorical_columns = data.select_dtypes(include=['object']).columns
print(categorical_columns)
num_categorical_variables = len(categorical_columns)

# カウントを表示する
print("カテゴリ変数の数:", num_categorical_variables)

 

カテゴリ列のリストには、出力ラベルyも含まれています。しかし、まず他のカテゴリ変数に焦点を当てましょう。

Output >>>
Index(['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact',
       'month', 'poutcome', 'y'],
      dtype='object')
カテゴリ変数の数: 10

 

カテゴリ変数の値を詳しく見る

 

次に、各カテゴリ変数が取る異なる値を見てみましょう。

 

要求: 各カテゴリ変数が取る異なる値を理解したいです。それを行うためのpandasのコードを教えてください。

 

# 各カテゴリ列の異なる値とその数を取得する
categorical_columns = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome']
for column in categorical_columns:
    value_counts = data[column].value_counts()
    print(f"Column: {column}")
    print(value_counts,"\n")

 

出力は解析しづらいです:

Output >>>

Column: job
blue-collar      9732
management       9458
technician       7597
admin.           5171
services         4154
retired          2264
self-employed    1579
entrepreneur     1487
unemployed       1303
housemaid        1240
student           938
unknown           288
Name: job, dtype: int64 

...
...
...
Column: poutcome
unknown    36959
failure     4901
other       1840
success     1511
Name: poutcome, dtype: int64 

 

カテゴリ変数の値の可視化

 

ChatGPTに視覚化を促して、カテゴリ変数がどのような値を取るかをより理解しやすくします。

 

プロンプト: 各カテゴリ変数が取る値を示すプロットを作成してください。出力ラベルyを除外し、他のすべてのカテゴリ変数を含めてください。

 

それでは始めましょう!

import matplotlib.pyplot as plt

# 各カテゴリカラムの異なる値とそのカウントを取得
categorical_columns = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome']

# サブプロットグリッドの設定
fig, axes = plt.subplots(3, 3, figsize=(10,8))

# 各カテゴリカラムごとに繰り返し、値のカウントをプロット
for i, column in enumerate(categorical_columns):
    row = i // 3
    col = i % 3
    value_counts = data[column].value_counts()
    ax = axes[row, col]
    value_counts.plot(kind='bar', ax=ax)
    ax.set_xlabel(column)
    ax.set_ylabel('Count')
    ax.set_title(f'{column.title()}の値のカウント')

# サブプロット間のスペーシング調整
plt.tight_layout()

# プロットを表示
plt.show()

 

 

ワンホットエンコーディング

 

一部のカテゴリカラムについて、ワンホットエンコーディングを使用できます。

 

プロンプト: 一連のカラムに対してワンホットエンコーディングを行うためのpandasコードを提供してください。

 

次のカラムに対してget_dummiesを使用してワンホットエンコーディングを行います:

# ワンホットエンコーディング対象のカテゴリカラムを選択(educationとpoutcomeを除く)
categorical_columns = ['job', 'marital', 'default', 'housing', 'loan', 'contact']

# ワンホットエンコーディングを実行
encoded_data = pd.get_dummies(data, columns=categorical_columns)

 

プロンプト: 新たに追加されたカラムの最初の数行を出力したいです。同じことを行うコードを書いてください。

 

# 新たに追加されたカラムを選択
new_columns = encoded_data.columns.difference(data.columns)

# 新たに追加されたカラムの先頭を表示
print(encoded_data[new_columns].head())

 

 

カスタムマッピングの定義

 

「education」や「poutcome」(前回の結果)などの変数のカラムに対して、ワンホットエンコーディングではなく、値の比較が可能なカスタムマッピングを使用する方が良いでしょう。

また、ワンホットエンコーディングを使用すると、k個の異なる値を取るカテゴリカラムの場合、情報を追加せずに過剰になります。

したがって、これらの場合にはカスタムマッピングを定義し、値を変換することが理想です。具体的なカラムのマッピングを定義するために、ChatGPTに一般的なコードスニペットを取得し、それを修正します。

 

プロンプト: いくつかのカテゴリ変数のエンコーディングにカスタムマッピングを行いたいです。カテゴリカラムのユニークな値から異なる出力値のセットへのカスタムマッピングを定義する一般的なコードスニペットを先に教えてください。その後、このマッピングを使用してカラム内の値を変換します。

 

# カスタムマッピング辞書の定義
custom_mapping = {
    'category1': 'value1',
    'category2': 'value2',
    'category3': 'value3',
    # 必要に応じて他のカテゴリと対応する値を追加
}

# カテゴリカラムを指定
categorical_column = 'column_name'  # 'column_name'を実際のカラム名に置き換える

# カスタムマッピング辞書を使用してマッピングを実行
data[categorical_column] = data[categorical_column].map(custom_mapping)

 

「month」列について、以下のように月の文字列を変換しましょう:

# 月のマッピング辞書を定義する
month_mapping = {
    'jan': 1,
    'feb': 2,
    'mar': 3,
    'apr': 4,
    'may': 5,
    'jun': 6,
    'jul': 7,
    'aug': 8,
    'sep': 9,
    'oct': 10,
    'nov': 11,
    'dec': 12
}

# 月の列の値をマッピングする
encoded_data['month'] = encoded_data['month'].map(month_mapping)

 

次に、「poutcome」と「education」の列を以下のように数値にマッピングしましょう:

# 「poutcome」と「education」のためのカスタムマッピングを定義する
poutcome_mapping = {
    'unknown': 0,
    'failure': 1,
    'other': 2,
    'success': 3
}

education_mapping = {
    'unknown': 0,
    'primary': 1,
    'secondary': 2,
    'tertiary': 3
}

# pandasのmapを使用して順序エンコーディングを実行する
encoded_data['poutcome'] = encoded_data['poutcome'].map(poutcome_mapping)
encoded_data['education'] = encoded_data['education'].map(education_mapping)


# 追加された列を選択する
new_columns = ['month','poutcome', 'education']

# 追加された列の先頭を表示する
print(encoded_data[new_columns].head(10))

 

出力ラベルのエンコーディング

 

また、出力のcallと出力値yesとnoをそれぞれ1と0にマップしましょう

encoded_data['y'] = encoded_data['y'].replace({'no': 0, 'yes': 1})
print(encoded_data['y'])

 

出力 >>>

0        0
1        0
2        0
3        0
4        0
        ..
45206    1
45207    1
45208    1
45209    0
45210    0
Name: y, Length: 45211, dtype: int64

 

「housing」、「default」、「loan」の列に対してもワンホットエンコーディングを使用しました。これらの列も「yes」と「no」の値を取るため、「yes」と「no」をそれぞれ1と0にマッピングすることもできます。

 

クラスラベルの分布の可視化

 

必要に応じてモデル構築時にクラスの不均衡を考慮するため、クラスラベルの分布をチェックすることも役立ちます。

 

質問:クラスラベルの分布を理解したいのですが、それに適したプロットを生成するためのコードを教えてください。

 

Seabornでcountplotを生成するためのコードは以下の通りです:

import seaborn as sns
import matplotlib.pyplot as plt

# 出力ラベルの分布をプロットする
sns.countplot(data=data, x='y')
plt.xlabel('出力ラベル')
plt.ylabel('カウント')
plt.title('出力ラベルの分布')
plt.show()

 

 

クラスの不均衡が見られます。したがって、モデルを構築する場合は、適切なリサンプリング方法を使用してクラスの不均衡に対処する必要があります。

 

汎用データクリーニングおよび前処理パイプライン

 

データのクリーニングと前処理には開発者の努力が必要ですが、簡単なデータセットに対して合理的に機能する一般的な手順のシーケンスを取得しましょう。

 

質問:これまでの内容に基づいて、一般的なデータクリーニングおよび前処理のパイプラインを教えてください。データセットの基本情報を取得し、欠損値をチェックして処理し、カテゴリカル列を特定し、カテゴリカル列をエンコードします。pandasのみを使用してください。

 

ここに示すのは:

import pandas as pd

# データセットをDataFrameに読み込む
data = pd.read_csv('data.csv')

# ステップ1:基本情報
print(data.info())

# ステップ2:欠損値
missing_values = data.isnull().sum()
print(missing_values)

# ステップ3:欠損値の処理
# 欠損値を持つ列を特定する
columns_with_missing_values = missing_values[missing_values > 0].index

# fillna()関数や他の適切な方法を使って欠損値を埋める
data[columns_with_missing_values] = data[columns_with_missing_values].fillna(data[columns_with_missing_values].mean())

# ステップ4:カテゴリカル列の取得
categorical_columns = data.select_dtypes(include=['object']).columns

# ステップ5:カテゴリカル列のエンコード
# pandasのget_dummies()関数を使用して、順序エンコーディングまたはワンホットエンコーディングを実行する
encoded_data = pd.get_dummies(data, columns=categorical_columns)

# エンコードされたデータを表示する
print(encoded_data.head())

 

まとめ

 

ご覧のように、データサイエンスの専門知識をChatGPTと組み合わせることで、データのクリーニングと前処理をより簡単かつ迅速に行うことができます。この前処理済みのデータセットを使用して、銀行のマーケティングデータセットに基づいたシンプルな予測モデルの構築など、さらなる作業に進むことができます。

興味があれば、ChatGPTを活用してデータ探索を行う方法についても探求してみてください。

 

データセットのクレジット

 

銀行のマーケティングデータセットは、クリエイティブ・コモンズ・ライセンス(CC BY 4.0)の下でライセンスされています。

Moro,S., Rita,P., and Cortez,P.. (2012). Bank Marketing. UCI Machine Learning Repository. https://doi.org/10.24432/C5K306.

    Bala Priya Cは、インド出身の開発者兼技術ライターです。彼女は数学、プログラミング、データサイエンス、コンテンツ作成の交差点での作業が好きです。彼女の関心と専門知識の範囲には、DevOps、データサイエンス、自然言語処理が含まれます。彼女は読書、執筆、コーディング、コーヒーを楽しんでいます!現在、彼女はチュートリアル、ハウツーガイド、意見記事などを執筆することで、開発者コミュニティと彼女の知識を共有するための学習に取り組んでいます。

 

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more