機械学習データ前処理入門

機械学習データ前処理:不要な列を削除し、必要な列を選択する方法【Pandas入門】

Tags: Pandas, データ前処理, 機械学習, データ分析, Python

機械学習モデルを構築する際、データ前処理はモデルの性能に大きく影響を与える重要なステップです。データセットの中には、分析の目的とは直接関係のない情報や、逆にモデルの学習を妨げる可能性のある情報が含まれていることがあります。

そのような場合、データセットから不要な「列」(カラムとも呼ばれます)を取り除いたり、あるいは分析に必要な特定の列だけを選び出す作業が必要になります。これはデータ前処理の最初期段階で頻繁に行われる基本的な操作です。

この記事では、なぜ列の選択や削除が必要なのかを解説し、Pythonのデータ分析ライブラリであるPandasを使った具体的な方法をご紹介します。

なぜデータセットの列を選択・削除する必要があるのか?

機械学習モデルは、入力されたデータからパターンを学習します。しかし、すべての列がモデルの学習に役立つわけではありません。不要な列が含まれていると、以下のような問題が発生する可能性があります。

これらの問題を避けるために、データ分析の目的や構築したいモデルの種類に応じて、データセットに含まれる列の中から、分析や学習に必要不可欠な列だけを選択し、それ以外の不要な列を削除するという前処理が必要になるのです。

Pandasを使った列の選択・削除

Pythonでデータ前処理を行う際によく使われるのが、データ分析ライブラリのPandasです。Pandasを使うと、表形式のデータを効率的に扱うことができます。データセットは通常、PandasのDataFrameという形式で扱われます。

ここでは、架空の顧客データ(顧客ID、年齢、性別、購入金額、居住地域、最終ログイン日時、サービス利用期間、備考)を例に、Pandasでの列の選択・削除方法を解説します。

まず、サンプルとなるDataFrameを作成します。

import pandas as pd

# サンプルデータの作成
data = {
    '顧客ID': [1, 2, 3, 4, 5],
    '年齢': [25, 32, 45, 29, 38],
    '性別': ['男性', '女性', '男性', '女性', '男性'],
    '購入金額': [5000, 12000, 8000, 3000, 9500],
    '居住地域': ['東京', '大阪', '福岡', '東京', '愛知'],
    '最終ログイン日時': ['2023-10-26 10:00', '2023-10-25 15:30', '2023-10-26 09:15', '2023-10-26 11:00', '2023-10-25 18:00'],
    'サービス利用期間': [12, 36, 6, 24, 48], # 単位:ヶ月
    '備考': ['優良顧客', 'リピーター', '新規顧客', 'ライトユーザー', '長期利用者']
}

df = pd.DataFrame(data)

print("元のDataFrame:")
print(df)
元のDataFrame:
   顧客ID  年齢  性別  購入金額 居住地域         最終ログイン日時  サービス利用期間      備考
0     1  25  男性  5000   東京  2023-10-26 10:00        12  優良顧客
1     2  32  女性 12000   大阪  2023-10-25 15:30        36  リピーター
2     3  45  男性  8000   福岡  2023-10-26 09:15         6  新規顧客
3     4  29  女性  3000   東京  2023-10-26 11:00        24  ライトユーザー
4     5  38  男性  9500   愛知  2023-10-25 18:00        48  長期利用者

このdfを元に、列の選択・削除方法を見ていきます。

不要な列を削除する方法 (dropメソッド)

データセットから特定の列を削除するには、dropメソッドを使用します。dropメソッドを使う際は、削除したい列名を指定し、axis=1(列を指定する意味)を設定します。

例えば、このデータで顧客IDは分析に直接使わない、備考は自由記述で扱いにくいと判断し、これらの列を削除したい場合を考えます。

1. 1つの列を削除する

'顧客ID'列を削除します。

# '顧客ID' 列を削除
df_dropped_single = df.drop('顧客ID', axis=1)

print("\n'顧客ID' 列を削除したDataFrame:")
print(df_dropped_single)
'顧客ID' 列を削除したDataFrame:
   年齢  性別  購入金額 居住地域         最終ログイン日時  サービス利用期間      備考
0  25  男性  5000   東京  2023-10-26 10:00        12  優良顧客
1  32  女性 12000   大阪  2023-10-25 15:30        36  リピーター
2  45  男性  8000   福岡  2023-10-26 09:15         6  新規顧客
3  29  女性  3000   東京  2023-10-26 11:00        24  ライトユーザー
4  38  男性  9500   愛知  2023-10-25 18:00        48  長期利用者

df.drop('顧客ID', axis=1)を実行すると、新しいDataFrameが返されます。元のdfは変更されません。もし元のdf自体を変更したい場合は、返されたDataFrameを同じ変数に代入し直すか、inplace=Trueオプションを使用します。

# inplace=True を使って元のDataFrameを直接変更
df_inplace_example = df.copy() # 元のdfを変更しないようにコピーを作成
df_inplace_example.drop('顧客ID', axis=1, inplace=True)

print("\ninplace=True で '顧客ID' 列を削除したDataFrame:")
print(df_inplace_example)

inplace=Trueは便利ですが、元のデータが失われるため注意が必要です。通常は、新しい変数に代入する方が安全で推奨されます。

2. 複数の列を削除する

複数の列を削除する場合は、削除したい列名のリストをdropメソッドに渡します。例えば、'顧客ID''備考'の2つの列を削除します。

# '顧客ID' と '備考' の複数列を削除
columns_to_drop = ['顧客ID', '備考']
df_dropped_multiple = df.drop(columns=columns_to_drop, axis=1) # columns= 引数も使用可能

print("\n複数列 ('顧客ID', '備考') を削除したDataFrame:")
print(df_dropped_multiple)
複数列 ('顧客ID', '備考') を削除したDataFrame:
   年齢  性別  購入金額 居住地域         最終ログイン日時  サービス利用期間
0  25  男性  5000   東京  2023-10-26 10:00        12
1  32  女性 12000   大阪  2023-10-25 15:30        36
2  45  男性  8000   福岡  2023-10-26 09:15         6
3  29  女性  3000   東京  2023-10-26 11:00        24
4  38  男性  9500   愛知  2023-10-25 18:00        48

columns引数を使うと、削除する列名のリストを指定できます。これはaxis=1を指定するのと同じ効果があり、よりコードの意図が分かりやすくなります。

このように、dropメソッドを使うことで、不要な列を簡単かつ柔軟に削除することができます。

必要な列を選択する方法

データセット全体の列の中から、分析やモデル学習に必要な列だけを選び出して新しいDataFrameを作成することもよくあります。これも複数の方法で行うことができます。

1. 単一の列を選択する

単一の列を選択すると、Seriesという1次元のデータ構造として取得されます。列名を角括弧[]で指定します。

# '購入金額' 列を選択 (Seriesとして取得)
purchase_amount_series = df['購入金額']

print("\n'購入金額' 列を選択 (Series):")
print(purchase_amount_series)
print(type(purchase_amount_series))
'購入金額' 列を選択 (Series):
0     5000
1    12000
2     8000
3     3000
4     9500
Name: 購入金額, dtype: int64
<class 'pandas.core.series.Series'>

2. 複数の列を選択する

複数の列を選択して、元のデータと同じ2次元のDataFrameとして取得するには、選択したい列名のリストを角括弧[]の中に指定します。

例えば、モデル学習に必要な列として、'年齢''性別''購入金額''サービス利用期間'を選択する場合を考えます。

# 必要な複数列を選択 (DataFrameとして取得)
selected_columns = ['年齢', '性別', '購入金額', 'サービス利用期間']
df_selected = df[selected_columns]

print("\n必要な複数列を選択したDataFrame:")
print(df_selected)
必要な複数列を選択したDataFrame:
   年齢  性別  購入金額  サービス利用期間
0  25  男性  5000        12
1  32  女性 12000        36
2  45  男性  8000         6
3  29  女性  3000        24
4  38  男性  9500        48

このように、リストを使って列名を指定することで、簡単に必要な列だけを抽出したDataFrameを作成できます。

3. locilocを使った選択

locilocを使うことでも列を選択できます。これらは行と列を同時に指定するのに便利なプロパティですが、列のみを指定することも可能です。

# locを使って列を選択 (列名を指定)
df_loc_select = df.loc[:, ['年齢', '購入金額']]

print("\nlocを使って選択したDataFrame:")
print(df_loc_select)

# ilocを使って列を選択 (列のインデックス番号を指定)
# '年齢'はインデックス1、'購入金額'はインデックス3
df_iloc_select = df.iloc[:, [1, 3]]

print("\nilocを使って選択したDataFrame:")
print(df_iloc_select)
locを使って選択したDataFrame:
   年齢  購入金額
0  25  5000
1  32 12000
2  45  8000
3  29  3000
4  38  9500

ilocを使って選択したDataFrame:
   年齢  購入金額
0  25  5000
1  32 12000
2  45  8000
3  29  3000
4  38  9500

:は「すべての行を選択する」という意味です。locilocを使うと、行と列を組み合わせてデータを抽出する際に非常に強力です。例えば、「特定の条件を満たす行」と「特定の列」を同時に選びたい場合に便利です(この操作は、別の記事「特定の条件を満たす行・列を抽出する方法」で詳しく解説しています)。

初心者のうちは、単に列を選択するだけならdf[['列名1', '列名2']]のようにリストを使う方法が直感的で分かりやすいでしょう。

まとめ

この記事では、機械学習データ前処理における基本的なステップである「列の選択・削除」について解説しました。不要な列を取り除くことでノイズを減らし、計算効率を高め、モデルの性能向上に繋がることをご理解いただけたと思います。

Pandasを使った具体的な方法として、不要な列を削除するdropメソッドと、必要な列を選択する方法(角括弧[]lociloc)をご紹介しました。これらの操作は、データ前処理の様々な場面で繰り返し使うことになる、非常に重要なテクニックです。

データ分析や機械学習のプロジェクトでは、まずデータセットを読み込み、その次に不要な列を削除したり、必要な列を選び出すといった、今回学んだ基本的な操作から始めてみることが多いです。ぜひ、実際に手を動かしてこれらの方法を試してみてください。

次のステップとして、選択・削除したデータに対して、欠損値の処理やカテゴリ変数のエンコーディングなど、さらに詳しい前処理を進めていくことになります。データ前処理は、地道な作業の積み重ねですが、モデル構築の成功にとって欠かせないステップです。

この記事が、皆様のデータ前処理学習の第一歩となることを願っています。