機械学習データ前処理:不要な列を削除し、必要な列を選択する方法【Pandas入門】
機械学習モデルを構築する際、データ前処理はモデルの性能に大きく影響を与える重要なステップです。データセットの中には、分析の目的とは直接関係のない情報や、逆にモデルの学習を妨げる可能性のある情報が含まれていることがあります。
そのような場合、データセットから不要な「列」(カラムとも呼ばれます)を取り除いたり、あるいは分析に必要な特定の列だけを選び出す作業が必要になります。これはデータ前処理の最初期段階で頻繁に行われる基本的な操作です。
この記事では、なぜ列の選択や削除が必要なのかを解説し、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. loc
やiloc
を使った選択
loc
やiloc
を使うことでも列を選択できます。これらは行と列を同時に指定するのに便利なプロパティですが、列のみを指定することも可能です。
loc
: 列名を指定する場合に使います。iloc
: 列のインデックス番号(0から始まる位置)を指定する場合に使います。
# 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
:
は「すべての行を選択する」という意味です。loc
やiloc
を使うと、行と列を組み合わせてデータを抽出する際に非常に強力です。例えば、「特定の条件を満たす行」と「特定の列」を同時に選びたい場合に便利です(この操作は、別の記事「特定の条件を満たす行・列を抽出する方法」で詳しく解説しています)。
初心者のうちは、単に列を選択するだけならdf[['列名1', '列名2']]
のようにリストを使う方法が直感的で分かりやすいでしょう。
まとめ
この記事では、機械学習データ前処理における基本的なステップである「列の選択・削除」について解説しました。不要な列を取り除くことでノイズを減らし、計算効率を高め、モデルの性能向上に繋がることをご理解いただけたと思います。
Pandasを使った具体的な方法として、不要な列を削除するdrop
メソッドと、必要な列を選択する方法(角括弧[]
、loc
、iloc
)をご紹介しました。これらの操作は、データ前処理の様々な場面で繰り返し使うことになる、非常に重要なテクニックです。
データ分析や機械学習のプロジェクトでは、まずデータセットを読み込み、その次に不要な列を削除したり、必要な列を選び出すといった、今回学んだ基本的な操作から始めてみることが多いです。ぜひ、実際に手を動かしてこれらの方法を試してみてください。
次のステップとして、選択・削除したデータに対して、欠損値の処理やカテゴリ変数のエンコーディングなど、さらに詳しい前処理を進めていくことになります。データ前処理は、地道な作業の積み重ねですが、モデル構築の成功にとって欠かせないステップです。
この記事が、皆様のデータ前処理学習の第一歩となることを願っています。