Pandas で階層化サンプリングを実行する

Preet Sanghavi 2023年6月21日
  1. 統計における層化サンプリング
  2. Pandas で階層化サンプリングを実行する
Pandas で階層化サンプリングを実行する

次のチュートリアルでは、データ フレームのパンダで階層化サンプリングを実行する方法を説明します。

統計における層化サンプリング

層化サンプリングは、母集団を代表するサンプルを取得するための戦略です。 母集団を層と呼ばれる均質なグループに分け、各層からデータをランダムにサンプリングすることで、サンプル選択の偏りが減少します。

各層の平均値が異なる場合、統計では層別抽出が使用されます。 層化サンプリングは、主にデータセットが膨大で不均一な場合に、モデルを評価するためのテスト データセットを構築するために、機械学習でよく使用されます。

Pandas で階層化サンプリングを実行する

階層化サンプリングを実行する最初のステップは、Pandas ライブラリをインポートすることです。

import pandas as pd

層化サンプリングに関連する手順を学びましょう。

  1. 人口を階層に分けます。 この段階では、集団は比較可能な形質に基づいて層に分類され、各個人は正確に 1つの層に属している必要があります。
  2. サンプル サイズを決定します。 この段階で、サンプルが大きいか小さいかを決定する必要があります。
  3. 各階層をランダムにサンプリングします。 各層のサンプル サイズがその母集団のサイズに関係なく等しい不均衡サンプリング、またはすべての層のサンプル サイズがその母集団のサイズに比例する比例サンプリングを使用して、各層から無作為にサンプルを選択します。

ここでサンプルを検討し、不均衡および比例層化サンプリングを実行します。 10 名の生徒のうち、成績に基づいて 6 名の生徒を抽出します。

まず、作業するサンプル データ フレームを作成しましょう。 ここでは、name、id、grade、category の 4つの列を使用します。

以下のコードを使用して、このデータ フレームを作成します。

students = {
    "Name": [
        "sanay",
        "shivesh",
        "rutwik",
        "preet",
        "yash",
        "mann",
        "pritesh",
        "hritesh",
        "raj",
        "tarun",
    ],
    "ID": ["001", "002", "003", "004", "005", "006", "007", "008", "009", "010"],
    "Grade": ["A", "A", "C", "B", "B", "B", "C", "A", "A", "A"],
    "Category": [2, 3, 1, 3, 2, 3, 3, 1, 2, 1],
}
df = pd.DataFrame(students)
print(df)

出力:

      Name   ID Grade  Category
0    sanay  001     A         2
1  shivesh  002     A         3
2   rutwik  003     C         1
3    preet  004     B         3
4     yash  005     B         2
5     mann  006     B         3
6  pritesh  007     C         3
7  hritesh  008     A         1
8      raj  009     A         2
9    tarun  010     A         1

子供の 50% が A 学年、30% が B 学年、20% が C 学年であることに注意してください。ここで不均衡なサンプリングを実行し、6 人の生徒のサンプルを作成します。

不均衡なサンプリングの場合、生徒を成績に応じてグループ (A、B、C) に分けてから、関数 sample を使用して各成績グループから 2 人の生徒をランダムにサンプリングします。 以下のコードを使用してこれを行います。

df.groupby("Grade", group_keys=False).apply(lambda x: x.sample(2))

出力:

      Name   ID Grade  Category
0    sanay  001     A         2
7  hritesh  008     A         1
5     mann  006     B         3
4     yash  005     B         2
2   rutwik  003     C         1
6  pritesh  007     C         3

比例サンプリングの場合、生徒を成績に応じてグループ (A、B、C) に分け、Pandas groupby() を使用して母集団の割合に基づいて各グループからランダム サンプルを取得します。 全体のサンプル サイズは母集団の 60% (0.6) です。

以下のコードを使用してこれを実行します。

df.groupby("Grade", group_keys=False).apply(lambda x: x.sample(frac=0.6))

出力:

      Name   ID Grade  Category
7  hritesh  008     A         1
9    tarun  010     A         1
0    sanay  001     A         2
3    preet  004     B         3
5     mann  006     B         3
6  pritesh  007     C         3

したがって、上記のアプローチを使用して、Pandas のデータ フレームで比例および不均衡サンプリングを正常に実行できます。

著者: Preet Sanghavi
Preet Sanghavi avatar Preet Sanghavi avatar

Preet writes his thoughts about programming in a simplified manner to help others learn better. With thorough research, his articles offer descriptive and easy to understand solutions.

LinkedIn GitHub

関連記事 - Pandas Statistics