ウェブサイト検索

Python と Pandas を使用してデータ クリーニングをマスターする 7 つのステップ


pandas でデータ クリーニングを学びたいですか?このチュートリアルでは、知っておくべきことをすべて説明します。

Pandas は、データ分析と操作に最も広く使用されている Python ライブラリです。しかし、ソースから読み取ったデータは、分析して洞察を得たり、ビジネス上の質問に答えたり、機械学習モデルを構築したりする前に、多くの場合、一連のデータ クリーニング ステップを必要とします。

このガイドでは、pandas を使用したデータ クリーニングのプロセスを 7 つの実践的なステップに分けて説明します。サンプル データセットを起動し、データ クリーニングの手順を実行します。

始めましょう!

サンプル データフレームのスピンアップ

Colab ノートブックへのリンク

実際のデータ クリーニング手順を開始する前に、従業員レコードを含む pandas データフレームを作成しましょう。合成データの生成には Faker を使用します。したがって、最初にインストールします。

!pip install Faker

必要に応じて、同じ例に従ってください。選択したデータセットを使用することもできます。 1000 レコードを生成するコードは次のとおりです。

import pandas as pd
from faker import Faker
import random

# Initialize Faker to generate synthetic data
fake = Faker()

# Set seed for reproducibility
Faker.seed(42)

# Generate synthetic data
data = []
for _ in range(1000):
    data.append({
        'Name': fake.name(),
        'Age': random.randint(18, 70),
        'Email': fake.email(),
        'Phone': fake.phone_number(),
        'Address': fake.address(),
        'Salary': random.randint(20000, 150000),
        'Join_Date': fake.date_this_decade(),
        'Employment_Status': random.choice(['Full-Time', 'Part-Time', 'Contract']),
        'Department': random.choice(['IT', 'Engineering','Finance', 'HR', 'Marketing'])
    })

このデータフレームを少し調整して、欠損値、重複レコード、外れ値などを導入してみましょう。

# Let's tweak the records a bit!
# Introduce missing values
for i in random.sample(range(len(data)), 50):
    data[i]['Email'] = None

# Introduce duplicate records
data.extend(random.sample(data, 100))

# Introduce outliers
for i in random.sample(range(len(data)), 20):
    data[i]['Salary'] = random.randint(200000, 500000)

次に、これらのレコードを含むデータフレームを作成しましょう。

# Create dataframe
df = pd.DataFrame(data)

ランダムモジュールではなく、Faker のシードを設定していることに注意してください。したがって、生成するレコードにはある程度のランダム性が含まれます。

ステップ 1: データを理解する

ステップ 0 は常に、解決しようとしているビジネス上の質問/ 問題を理解することです。それがわかったら、pandas データフレームに読み込んだデータの操作を開始できます。

ただし、データセットに対して意味のある操作を行う前に、まずデータセットの概要を把握することが重要です。これには、さまざまなフィールドやレコードの総数に関する基本情報の取得、データフレームの先頭の検査などが含まれます。

ここでは、データフレームに対して info() メソッドを実行します。

df.info()
Output >>>

RangeIndex: 1100 entries, 0 to 1099
Data columns (total 9 columns):
 #   Column             Non-Null Count  Dtype 
---  ------             --------------  ----- 
 0   Name               1100 non-null   object
 1   Age                1100 non-null   int64 
 2   Email              1047 non-null   object
 3   Phone              1100 non-null   object
 4   Address            1100 non-null   object
 5   Salary             1100 non-null   int64 
 6   Join_Date          1100 non-null   object
 7   Employment_Status  1100 non-null   object
 8   Department         1100 non-null   object
dtypes: int64(2), object(7)
memory usage: 77.5+ KB

そして、データフレームの先頭を調べます。

df.head()

ステップ 2: 重複の処理

重複レコードは、分析結果を歪める一般的な問題です。したがって、重複するレコードをすべて特定して削除し、一意のデータ レコードのみを扱うようにする必要があります。

データフレーム内のすべての重複を見つけて、すべての重複を所定の位置にドロップする方法は次のとおりです。

# Check for duplicate rows
duplicates = df.duplicated().sum()
print("Number of duplicate rows:", duplicates)

# Removing duplicate rows
df.drop_duplicates(inplace=True)
Output >>>
Number of duplicate rows: 100

ステップ 3: 欠落データの処理

データの欠落は、多くのデータ サイエンス プロジェクトにおいて一般的なデータ品質の問題です。前のステップの info() メソッドの結果をざっと見てみると、すべてのフィールドで null 以外のオブジェクトの数が同じではなく、欠損値があることがわかります。メール欄に。それでも正確な数は得られます。

各列の欠損値の数を取得するには、次のコマンドを実行します。

# Check for missing values
missing_values = df.isna().sum()
print("Missing Values:")
print(missing_values)
Output >>>
Missing Values:
Name                  0
Age                   0
Email                50
Phone                 0
Address               0
Salary                0
Join_Date             0
Employment_Status     0
Department            0
dtype: int64

1 つ以上の数値列に欠損値がある場合は、適切な補完手法を適用できます。ただし、「電子メール」フィールドが欠落しているため、次のように欠落している電子メールをプレースホルダー電子メールに設定しましょう。


# Handling missing values by filling with a placeholder
df['Email'].fillna('unknown@example.com', inplace=True)

ステップ 4: データの変換

データセットを操作しているときに、予期したデータ型を持たないフィールドが 1 つ以上存在する可能性があります。サンプル データフレームでは、「Join_Date」フィールドを有効な日時オブジェクトにキャストする必要があります。

# Convert 'Join_Date' to datetime
df['Join_Date'] = pd.to_datetime(df['Join_Date'])
print("Join_Date after conversion:")
print(df['Join_Date'].head())
Output >>>
Join_Date after conversion:
0   2023-07-12
1   2020-12-31
2   2024-05-09
3   2021-01-19
4   2023-10-04
Name: Join_Date, dtype: datetime64[ns]

入社日がわかっているので、実際には次のように `years_Employed` 列を含めたほうが便利です。

# Creating a new feature 'Years_Employed' based on 'Join_Date'
df['Years_Employed'] = pd.Timestamp.now().year - df['Join_Date'].dt.year
print("New feature 'Years_Employed':")
print(df[['Join_Date', 'Years_Employed']].head())
Output >>>
New feature 'Years_Employed':
   Join_Date  Years_Employed
0 2023-07-12               1
1 2020-12-31               4
2 2024-05-09               0
3 2021-01-19               3
4 2023-10-04               1

ステップ 5: テキスト データのクリーニング

一貫性のない書式設定や同様の問題が発生する文字列フィールドが発生することはよくあります。テキストのクリーニングは、大文字と小文字の変換を適用するだけの簡単な場合もあれば、文字列を必要な形式にするための複雑な正規表現を作成するのと同じくらい難しい場合もあります。

このデータフレームの例では、「Address」列に読みやすさを妨げる多くの「\n」文字が含まれていることがわかります。そこで、次のようにスペースに置き換えてみましょう。

# Clean address strings
df['Address'] = df['Address'].str.replace('\n', ' ', regex=False)
print("Address after text cleaning:")
print(df['Address'].head())
Output >>>
Address after text cleaning:
0    79402 Peterson Drives Apt. 511 Davisstad, PA 35172
1     55341 Amanda Gardens Apt. 764 Lake Mark, WI 07832
2                 710 Eric Estate Carlsonfurt, MS 78605
3                 809 Burns Creek Natashaport, IA 08093
4    8713 Caleb Brooks Apt. 930 Lake Crystalbury, CA...
Name: Address, dtype: object

ステップ 6: 外れ値の処理

上にスクロールして戻ると、「給与」列の値の一部が非常に高く設定されていることがわかります。このような外れ値も特定し、分析を歪めないように適切に処理する必要があります。

多くの場合、 データ ポイントが外れ値であるもの を考慮する必要があります (データ入力が間違っているか、またはデータ ポイントが実際には有効な値で外れ値ではないかどうか)。その後、それらを処理することを選択できます。外れ値のあるレコードを削除するか、外れ値のある行のサブセットを取得して個別に分析します。

Z スコアを使用して、平均から 3 標準偏差以上離れている給与値を見つけてみましょう。

# Detecting outliers using z-score
z_scores = (df['Salary'] - df['Salary'].mean()) / df['Salary'].std()
outliers = df[abs(z_scores) > 3]
print("Outliers based on Salary:")
print(outliers[['Name', 'Salary']].head())
Output >>>
Outliers based on Salary:
                Name  Salary
16    Michael Powell  414854
131    Holly Jimenez  258727
240  Daniel Williams  371500
328    Walter Bishop  332554
352     Ashley Munoz  278539

ステップ 7: データの結合

ほとんどのプロジェクトでは、所有しているデータが分析に使用したいデータではない可能性があります。使用する最も関連性の高いフィールドを見つけて、他のデータフレームからのデータを結合して、分析に使用できるより有用なデータを取得する必要があります。

簡単な演習として、別の関連するデータフレームを作成し、それを共通の列上の既存のデータフレームとマージして、マージが意味のあるものにします。 pandas でのマージは SQL での結合と非常によく似ているため、練習として試してみることをお勧めします。

まとめ

このチュートリアルはこれですべてです。レコードを含むサンプル データフレームを作成し、さまざまなデータ クリーニング手順を実行しました。データの理解、重複、欠損値の処理、データの変換、テキスト データのクリーニング、外れ値の処理、データの結合といった手順の概要を次に示します。

パンダを使用したデータ ラングリングについて詳しく知りたい場合は、「パンダと Python でデータ ラングリングをマスターする 7 つのステップ」を参照してください。

関連記事