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

機械学習データ前処理:複数のデータセットを組み合わせる「結合(merge/join)」の種類と使い分け【Pandas入門】

Tags: データ前処理, 機械学習, Pandas, データ結合, merge

はじめに:なぜ複数のデータを組み合わせる必要があるのか

機械学習のプロジェクトでは、分析対象となるデータが単一のファイルや表にすべて含まれているとは限りません。顧客情報、購買履歴、製品データ、プロモーションデータなど、異なる種類の情報が別々のデータセットとして存在することが一般的です。これらの異なるデータセットを組み合わせて分析することで、より深く、多角的な洞察を得ることが可能になります。

例えば、「特定の属性を持つ顧客がどのような製品を購入しやすいか」を分析するには、顧客の属性データと購買履歴データを組み合わせる必要があります。「プロモーションが製品の売上にどのように影響したか」を分析するには、製品売上データとプロモーション実施データを組み合わせることが求められます。

このように、複数のデータセットを共通の情報(キー)に基づいて結合する作業は、機械学習のためのデータ前処理において非常に重要なステップです。本記事では、Pythonのデータ分析ライブラリであるPandasを使用して、異なるデータセットを結合する基本的な方法と、いくつかの結合の種類について解説します。

Pandasにおけるデータ結合の基本:merge関数

Pandasでは、主にmerge関数を使って複数のデータフレーム(Pandasで扱う表形式のデータ構造)を結合します。merge関数は、リレーショナルデータベースにおけるJOIN操作に似ています。共通する列(キー)に基づいて、2つのデータフレームを行方向に連結します。

基本的なmerge関数の使い方は以下の通りです。

import pandas as pd

# 結合する2つのデータフレームを作成(例)
df1 = pd.DataFrame({
    'key': ['A', 'B', 'C', 'D'],
    'value1': [1, 2, 3, 4]
})

df2 = pd.DataFrame({
    'key': ['B', 'D', 'E', 'F'],
    'value2': [5, 6, 7, 8]
})

print("データフレーム1:")
print(df1)
print("\nデータフレーム2:")
print(df2)

# 結合の実行(デフォルトは内部結合)
merged_df = pd.merge(df1, df2, on='key')

print("\n結合後のデータフレーム(デフォルト:内部結合):")
print(merged_df)

上記の例では、df1df2という2つのデータフレームを作成し、共通する列である'key'を基準に結合しています。on='key'という引数で、どの列をキーとして結合するかを指定します。

デフォルトの結合方法は「内部結合(inner join)」と呼ばれ、両方のデータフレームに存在するキーに対応する行のみが結果として残ります。上記の例では、キー'B''D'が両方のデータフレームに存在するため、これらのキーに対応する行だけが結合後のデータフレームに含まれています。

結合の種類とその使い分け(how引数)

merge関数にはhowという引数があり、これにより様々な種類の結合を指定できます。主な結合の種類とその概念、そしてどのような場合に使うのが適切かを解説します。

概念図としては、キーの集合AとBを考えたときに、how引数はこれらの集合のどの部分を結果として含めるかを指定するものと考えると分かりやすいでしょう。

1. 内部結合 (how='inner')

# 再度データフレームを定義
df1 = pd.DataFrame({
    'key': ['A', 'B', 'C', 'D'],
    'value1': [1, 2, 3, 4]
})

df2 = pd.DataFrame({
    'key': ['B', 'D', 'E', 'F'],
    'value2': [5, 6, 7, 8]
})

# 内部結合
inner_merged_df = pd.merge(df1, df2, on='key', how='inner')

print("内部結合の結果:")
print(inner_merged_df)

結果として、キー'B''D'に対応する行のみが含まれます。

2. 左外部結合 (how='left')

# 左外部結合
left_merged_df = pd.merge(df1, df2, on='key', how='left')

print("左外部結合の結果:")
print(left_merged_df)

結果として、df1のキー'A', 'B', 'C', 'D'がすべて含まれます。'A''C'df2に存在しないため、value2列はNaNとなります。

3. 右外部結合 (how='right')

# 右外部結合
right_merged_df = pd.merge(df1, df2, on='key', how='right')

print("右外部結合の結果:")
print(right_merged_df)

結果として、df2のキー'B', 'D', 'E', 'F'がすべて含まれます。'E''F'df1に存在しないため、value1列はNaNとなります。

4. 外部結合 (how='outer')

# 外部結合
outer_merged_df = pd.merge(df1, df2, on='key', how='outer')

print("外部結合の結果:")
print(outer_merged_df)

結果として、df1df2のすべてのキー('A', 'B', 'C', 'D', 'E', 'F')が結果に含まれます。対応する値が存在しない箇所はNaNとなります。

複数のキーで結合する場合

複数の列を組み合わせて結合のキーとしたい場合もあります。例えば、「顧客ID」と「注文日」のペアでデータセットを結合するなどです。この場合は、on引数に列名のリストを指定します。

df_sales = pd.DataFrame({
    'CustomerID': [101, 102, 101, 103, 102],
    'OrderDate': ['2023-01-15', '2023-01-16', '2023-01-20', '2023-01-18', '2023-01-25'],
    'Amount': [1000, 2500, 1500, 3000, 2000]
})

df_promotion = pd.DataFrame({
    'CustomerID': [101, 102, 104, 101],
    'OrderDate': ['2023-01-15', '2023-01-16', '2023-01-22', '2023-02-01'],
    'DiscountApplied': [True, True, False, False]
})

print("売上データ:")
print(df_sales)
print("\nプロモーションデータ:")
print(df_promotion)

# CustomerIDとOrderDateのペアをキーとして内部結合
merged_sales_promo = pd.merge(df_sales, df_promotion, on=['CustomerID', 'OrderDate'], how='inner')

print("\nCustomerIDとOrderDateをキーとした内部結合結果:")
print(merged_sales_promo)

この例では、CustomerIDOrderDateの両方が一致する行のみが結合されています。

結合における注意点

まとめ

本記事では、機械学習のためのデータ前処理における重要なステップである、複数のデータフレームの結合について解説しました。Pandasのmerge関数を用いれば、共通するキーに基づいて異なるデータセットを効率的に組み合わせることができます。

分析の目的に応じて適切な結合方法を選択することが重要です。また、キーのデータ型や重複の有無、結合後の欠損値などにも注意を払いながら作業を進めることが、正確なデータ前処理を行う上で不可欠です。

データ結合は、単なるデータの連結ではなく、異なる情報源から得られたデータを統合し、分析の幅を広げるための強力な手法です。ここで学んだ知識を活かして、ご自身のデータ分析や機械学習のプロジェクトにお役立てください。