Pythonでデータを正規化・標準化!リスト、NumPy、Pandasでの実装を徹底解説


 

データ分析や機械学習において、**正規化(Normalization)標準化(Standardization)**は、モデルの性能向上や安定性確保のために不可欠な前処理ステップです。これらの手法は、データのスケールを揃え、異なる特徴量間の比較を容易にする役割があります。この記事では、Pythonの基本的なデータ構造であるリスト、数値計算ライブラリのNumPy、そしてデータ分析ライブラリのPandasを使って、データの正規化と標準化を実装する方法について、具体的なサンプルコードを交えながら詳しく解説します。


 

正規化(Normalization)とは?

 

正規化は、データを特定の範囲(通常は0から1、または-1から1)にスケーリングするプロセスです。これにより、データの分布形状は保たれたまま、値の範囲が統一されます。

 

最も一般的な正規化(Min-Max Normalization)

 

  • 目的: データをからの範囲に収める。

  • 計算式:

    • : 元のデータポイント

    • : データの最小値

    • : データの最大値

 

1. Pythonリストでの正規化

 

Pythonのリストでは、ループ処理やリスト内包表記を使って手動で正規化を実装します。

 

サンプルコード

 

Python
 
data_list = [10, 20, 30, 40, 50]

# 最小値と最大値を取得
min_val = min(data_list)
max_val = max(data_list)

# 正規化の実行
normalized_list = [(x - min_val) / (max_val - min_val) for x in data_list]
print("元のリスト:", data_list)
print("正規化後のリスト:", normalized_list)

 

出力例

 

元のリスト: [10, 20, 30, 40, 50]
正規化後のリスト: [0.0, 0.25, 0.5, 0.75, 1.0]

 

2. NumPy配列での正規化

 

NumPy配列はベクトル化された演算をサポートしているため、リストよりも簡潔かつ高速に正規化を実装できます。

 

サンプルコード

 

Python
 
import numpy as np

data_np = np.array([10, 20, 30, 40, 50])

# 最小値と最大値を取得
min_val_np = data_np.min()
max_val_np = data_np.max()

# 正規化の実行
normalized_np = (data_np - min_val_np) / (max_val_np - min_val_np)
print("元のNumPy配列:", data_np)
print("正規化後のNumPy配列:", normalized_np)

 

出力例

 

元のNumPy配列: [10 20 30 40 50]
正規化後のNumPy配列: [0.   0.25 0.5  0.75 1.  ]

 

3. Pandas DataFrameでの正規化

 

Pandas DataFrameでは、NumPyと同様のベクトル化された演算に加えて、列(Series)単位での操作が容易です。

 

サンプルコード

 

Python
 
import pandas as pd

data_df = pd.DataFrame({'Feature1': [10, 20, 30, 40, 50],
                        'Feature2': [100, 200, 300, 400, 500]})
print("元のDataFrame:\n", data_df)

# 各列ごとに正規化
for column in data_df.columns:
    min_val_df = data_df[column].min()
    max_val_df = data_df[column].max()
    data_df[column + '_normalized'] = (data_df[column] - min_val_df) / (max_val_df - min_val_df)

print("\n正規化後のDataFrame:\n", data_df)

 

出力例

 

元のDataFrame:
    Feature1  Feature2
0        10       100
1        20       200
2        30       300
3        40       400
4        50       500

正規化後のDataFrame:
    Feature1  Feature2  Feature1_normalized  Feature2_normalized
0        10       100                 0.00                 0.00
1        20       200                 0.25                 0.25
2        30       300                 0.50                 0.50
3        40       400                 0.75                 0.75
4        50       500                 1.00                 1.00

 

標準化(Standardization)とは?

 

標準化は、データを平均が0、標準偏差が1になるようにスケーリングするプロセスです。これにより、データはZスコアに変換されます。標準化は、データの分布が正規分布に近いと仮定される場合に特に有効です。

  • 目的: データの平均を0、標準偏差を1にする。

  • 計算式:

    • : 元のデータポイント

    • : データの平均(mean)

    • : データの標準偏差(standard deviation)

 

1. Pythonリストでの標準化

 

リストでは、平均と標準偏差を計算し、ループで適用します。

 

サンプルコード

 

Python
 
import math

data_list = [10, 20, 30, 40, 50]

# 平均と標準偏差の計算
mean_val = sum(data_list) / len(data_list)
std_val = math.sqrt(sum([(x - mean_val)**2 for x in data_list]) / len(data_list)) # 標本標準偏差 (np.stdのデフォルト)

# 標準化の実行
standardized_list = [(x - mean_val) / std_val for x in data_list]
print("元のリスト:", data_list)
print("標準化後のリスト:", standardized_list)

 

出力例

 

元のリスト: [10, 20, 30, 40, 50]
標準化後のリスト: [-1.4142135623730951, -0.7071067811865476, 0.0, 0.7071067811865476, 1.4142135623730951]

 

2. NumPy配列での標準化

 

NumPyでは、np.mean()np.std()を使って効率的に標準化を実行できます。

 

サンプルコード

 

Python
 
import numpy as np

data_np = np.array([10, 20, 30, 40, 50])

# 平均と標準偏差の計算
mean_val_np = data_np.mean()
std_val_np = data_np.std() # デフォルトは標本標準偏差

# 標準化の実行
standardized_np = (data_np - mean_val_np) / std_val_np
print("元のNumPy配列:", data_np)
print("標準化後のNumPy配列:", standardized_np)

 

出力例

 

元のNumPy配列: [10 20 30 40 50]
標準化後のNumPy配列: [-1.41421356 -0.70710678  0.          0.70710678  1.41421356]

 

3. Pandas DataFrameでの標準化

 

Pandas DataFrameでも、NumPyと同様に列ごとに標準化を実行できます。

 

サンプルコード

 

Python
 
import pandas as pd

data_df = pd.DataFrame({'Feature1': [10, 20, 30, 40, 50],
                        'Feature2': [100, 200, 300, 400, 500]})
print("元のDataFrame:\n", data_df)

# 各列ごとに標準化
for column in data_df.columns:
    mean_val_df = data_df[column].mean()
    std_val_df = data_df[column].std() # デフォルトは標本標準偏差
    data_df[column + '_standardized'] = (data_df[column] - mean_val_df) / std_val_df

print("\n標準化後のDataFrame:\n", data_df)

 

出力例

 

元のDataFrame:
    Feature1  Feature2
0        10       100
1        20       200
2        30       300
4        50       500

標準化後のDataFrame:
    Feature1  Feature2  Feature1_standardized  Feature2_standardized
0        10       100              -1.414214              -1.414214
1        20       200              -0.707107              -0.707107
2        30       300               0.000000               0.000000
3        40       400               0.707107               0.707107
4        50       500               1.414214               1.414214

 

正規化と標準化、どちらを選ぶべきか?

 

どちらの手法を使うかは、データと目的によります。

  • 正規化(Min-Max Normalization):

    • データの範囲を厳密に制限したい場合(例: 画像ピクセル値を0-255から0-1へ)。

    • 外れ値の影響を受けやすい。

    • データの分布が正規分布である必要はない。

  • 標準化(Z-score Standardization):

    • データの分布に関する仮定がない場合に、より頑健な選択肢となることが多い。

    • 特に、データの分布が正規分布に近い場合や、機械学習アルゴリズムが正規分布のデータを前提としている場合に有効(例: 線形回帰、ロジスティック回帰、SVMなど)。

    • 外れ値の影響でスケールが大きく変わる可能性がある。

実際には、Scikit-learnなどのライブラリに提供されているMinMaxScalerStandardScalerを使うのが一般的です。しかし、これらのライブラリの内部動作を理解するためにも、基本的な実装方法を知っておくことは重要です。


 

まとめ

 

Pythonでのデータ前処理において、正規化標準化は非常に重要なテクニックです。

  • 正規化(Min-Max Normalization): データを特定の範囲(通常0-1)にスケーリングし、データ間の相対的な関係を維持します。

  • 標準化(Z-score Standardization): データを平均0、標準偏差1に変換し、異なる特徴量のスケールを統一します。

リスト、NumPy配列、Pandas DataFrameのいずれの形式でも、これらの処理を手動で実装する方法を学ぶことで、データの特性に応じた適切な前処理を選択し、より良い分析結果やモデル性能を得ることができます。データの準備はデータサイエンスの成功の鍵です。これらのテクニックをぜひ活用してください!🔑