Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ サンプリング手法 | セクション
データ分析のための統計学

bookサンプリング手法

メニューを表示するにはスワイプしてください

サンプリング手法は、データ分析において不可欠な要素であり、大規模または複雑なデータセット全体を分析することなく、有意義な結論を導き出すことを可能にします。代表的なサブセットを慎重に選択することで、傾向の推定、仮説の検証、予測を効率的に行い、時間や計算リソースを節約できます。適切なサンプリングはバイアスを減らし、精度を向上させ、分析結果が母集団全体の真の特性を反映することを保証します。適切なサンプリング戦略の理解と適用は、Pythonを用いたデータ分析に携わるすべてのアナリストにとって基礎的なスキルです。

単純無作為抽出法

単純無作為抽出法は、データ分析における基本的な手法であり、母集団からすべての要素が等しい確率で選ばれるサブセットを抽出する方法です。この手法により、サンプルが偏りなく母集団全体を代表するものとなり、統計的に有効な推論を行うために重要です。

定義

単純無作為抽出法とは、母集団の各メンバーがサンプルに選ばれる確率が等しいプロセスです。選択は完全にランダムで行われ、乱数生成器やシャッフル手法がよく用いられます。

目的

  • 各データポイントが等しい選択確率を持つことを保証;
  • サンプリングプロセスにおけるバイアスの低減;
  • 統計的推論や仮説検定の信頼できる基盤の提供;
  • 扱いやすく代表的なサンプルを用いることで、大規模データセットの分析を簡素化。

例:Pythonによる単純無作為抽出法

小売店の売上記録を含むデータセットがあり、平均売上を推定するために100件の取引をランダムに抽出して分析したいとします。pandasライブラリを使って単純無作為抽出を実行できます。

1234567891011121314
import pandas as pd # Simulate a DataFrame with 1,000 sales records sales_data = pd.DataFrame({ 'transaction_id': range(1, 1001), 'amount': pd.np.random.uniform(10, 500, 1000) # Random sales amounts }) # Draw a simple random sample of 100 transactions sample = sales_data.sample(n=100, random_state=42) # Display the first five rows of the sample print(f'Dataset shape: {data.shape}') print(f'Sample shape: {sample.shape}')
copy

この例では:

  • sample メソッドは sales_data DataFrame からランダムに100行を選択;
  • random_state パラメータは乱数生成器のシードを設定し、再現性を確保;
  • 得られたサンプルは平均売上の推定やさらなる分析に利用可能。

単純無作為抽出法は、多くのデータ分析ワークフローにおける信頼性の高い初期ステップであり、管理しやすく偏りのないデータサブセットに基づいて母集団についての結論を導くのに役立つ方法。

層別抽出法

層別抽出法は、共通の特徴に基づいて母集団を明確なサブグループ()に分割するデータ分析手法。各層から母集団全体におけるその層の割合に応じて無作為にサンプリングを行うことで、すべてのサブグループがサンプル内で十分に代表されることを保証し、より正確で信頼性の高い分析結果につながる。

層別抽出法を使用する場面

以下の場合に層別抽出法を使用:

  • 母集団に重要な違いを持つ明確なサブグループが存在する場合;
  • 各サブグループがサンプル内で割合に応じて代表されることを確実にしたい場合;
  • 層別化に用いる特徴が分析に関連し、結果に影響を与える可能性がある場合;
  • 単純無作為抽出法では小規模だが重要なサブグループが見落とされたり、過小評価される可能性がある場合。

一般的なシナリオ:

  • 地域、年齢層、所得層ごとに顧客を調査する場合;
  • 研究調査で少数派グループの代表性を確保する場合;
  • 複数の製品ラインにわたる製品フィードバックを分析する場合。

Python例:scikit-learnによる層別抽出法

学生の性別とテストスコアを含むデータセットがあり、性別の比率を維持しながらデータの40%をサンプリングしたい場合。

1234567891011121314151617181920
import pandas as pd from sklearn.model_selection import train_test_split # Create a sample DataFrame data = { 'student_id': range(1, 11), 'gender': ['male', 'female', 'female', 'male', 'female', 'male', 'female', 'male', 'female', 'male'], 'score': [85, 90, 78, 88, 92, 75, 80, 89, 95, 84] } df = pd.DataFrame(data) # Perform stratified sampling based on 'gender' stratified_sample, _ = train_test_split( df, test_size=0.6, # Keep 40% stratify=df['gender'], random_state=42 ) print(stratified_sample)
copy

主なポイント:

  • stratify パラメータは、サンプリングされたDataFrameが元の性別比率を維持することを保証;
  • サブグループの代表性が分析の妥当性に重要な場合は、層別抽出法の使用が推奨。

クラスターサンプリング

クラスターサンプリングは、母集団全体からデータを収集することが困難または高コストな場合に用いられる確率的サンプリング手法。クラスターサンプリングでは、母集団をクラスターと呼ばれる複数のグループに分割し、いくつかのクラスターを無作為に選択し、そのクラスター内の全メンバーからデータを収集。

定義

クラスターサンプリングの手順:

  • 母集団を明確に区別され重複しないクラスターに分割;
  • これらのクラスターから一部を無作為に選択;
  • 選択されたクラスター内の全個体をサンプルに含める。

この方法は、母集団が地理的に分散している場合や、全メンバーのリストが入手困難な場合に特に有用。

利点

  • 母集団が広範囲に分散している場合の移動や管理コストを削減;
  • 個人単位ではなくグループ単位でデータ収集を簡素化;
  • 母集団全体のリストが得にくい場合にも有効;
  • 単純無作為抽出法よりも実用的かつ効率的な場合がある。

Pythonによるクラスターサンプリング例

例えば、複数の学校から成る学区の生徒を調査したい場合、各学校がクラスターとなる。いくつかの学校を無作為に選び、その学校の全生徒を調査対象とする。

以下は pandasnumpy を用いたPythonの例:

1234567891011121314151617181920212223
import pandas as pd import numpy as np # Create a mock dataset: 5 schools, each with 10 students np.random.seed(42) schools = ['School_A', 'School_B', 'School_C', 'School_D', 'School_E'] data = { 'student_id': range(1, 51), 'school': np.repeat(schools, 10), 'score': np.random.randint(60, 100, 50) } df = pd.DataFrame(data) # Step 1: List all unique clusters (schools) unique_schools = df['school'].unique() # Step 2: Randomly select 2 clusters (schools) selected_schools = np.random.choice(unique_schools, size=2, replace=False) print(f"Selected clusters: {selected_schools}") # Step 3: Select all students from the chosen clusters cluster_sample = df[df['school'].isin(selected_schools)] print(cluster_sample)
copy

このコード:

  • 学校とスコアを持つ学生のサンプルデータセットを作成;
  • クラスターとして2つの学校をランダムに選択;
  • 選択された学校の全学生をサンプルに含める。

クラスターサンプリングは、直接的なサンプリングが困難な場合に実用的な手法であり、大規模または分散した母集団から代表的なデータを効率的に収集するのに役立つ。

系統的サンプリング

系統的サンプリングは、順序付けられた母集団から一定の間隔で項目を選択する確率サンプリング手法。ランダム選択によるバイアスを避けつつ、シンプルで再現性のあるサンプリングを行いたい場合に特に有用。

定義

系統的サンプリングは、リストやシーケンスから固定間隔 k ごとに要素を選択する方法であり、k は希望するサンプルサイズに基づいて計算される。最初の k 要素内からランダムに開始点を選び、以降は k ごとに項目を選択する。

手順

  1. 母集団をリストまたはシーケンスに並べる;
  2. 希望するサンプルサイズを決定;
  3. 母集団サイズをサンプルサイズで割ってサンプリング間隔 k を計算;
  4. 0 から k-1 の間でランダムに開始点を選択;
  5. 開始点から k ごとにサンプルサイズに達するまで項目を選択。

この方法により、サンプルが母集団全体に均等に分布しやすくなり、完全なランダムサンプリングでは見逃される傾向やパターンも捉えやすくなる。

Python例:系統的サンプリング

Pythonの標準機能とnumpyライブラリのみを使った系統的サンプリングの実装例。

123456789101112131415161718
import numpy as np # Example population: 100 integers population = np.arange(1, 101) sample_size = 10 population_size = len(population) # Calculate sampling interval k = population_size // sample_size # Randomly select a starting point start = np.random.randint(0, k) # Select every k-th item systematic_sample = population[start::k][:sample_size] print("Systematic sample:", systematic_sample)
copy

このコードは、100の母集団から10個の数値のサンプルを生成します。最初の区間内でランダムに選ばれたインデックスから開始し、10番目ごとに項目を選択します。その結果、サンプルは母集団全体に均等に分布します。

多段抽出法

多段抽出法は、サンプルを一度にすべて抽出するのではなく、複数の段階でサンプルを選択する複雑な抽出手法です。この手法は、広範囲に分散した大規模な母集団や、母集団全体のリストが利用できない場合に有用です。

概念

  • 多段抽出法は、クラスター抽出法単純無作為抽出法など、複数の抽出手法を段階的に組み合わせます;
  • 各段階で、前段階で選ばれたグループ(クラスター)や個体からさらに選択します;
  • この方法は、大規模調査においてコストや労力を削減します。

応用例

例えば、国全体の世帯を調査したい場合:

  1. 地域を無作為に抽出(第1段階);
  2. 選ばれた各地域から都市を無作為に選択(第2段階);
  3. 各都市からさらに地区を無作為に選択(第3段階);
  4. 最後に、各地区から世帯を無作為に選択(第4段階)。

この方法により、調査資源を効率的に管理しつつ、ターゲット母集団を代表するサンプルを得ることができます。

Python例:多段抽出法のシミュレーション

3つの地域があり、それぞれに5つの都市、各都市に100世帯のデータがあるとします。以下のサンプルを抽出します:

  • 2つの地域;
  • 各選択地域から2つの都市;
  • 各選択都市から5つの世帯。
123456789101112131415161718192021222324252627282930313233
import numpy as np import pandas as pd # Create synthetic population data data = [] for region in range(1, 4): for city in range(1, 6): for household in range(1, 101): data.append({ "region": f"Region_{region}", "city": f"City_{city}", "household_id": f"H{region}{city}{household}" }) population = pd.DataFrame(data) # First stage: sample 2 regions sampled_regions = np.random.choice(population['region'].unique(), 2, replace=False) # Second stage: sample 2 cities from each selected region sampled_cities = [] for region in sampled_regions: cities = population[population['region'] == region]['city'].unique() sampled_cities.extend([(region, city) for city in np.random.choice(cities, 2, replace=False)]) # Third stage: sample 5 households from each selected city sampled_households = [] for region, city in sampled_cities: households = population[(population['region'] == region) & (population['city'] == city)] sampled_households.append(households.sample(5, random_state=42)) # Concatenate all sampled households df_sample = pd.concat(sampled_households) print(df_sample[['region', 'city', 'household_id']])
copy

このコードは、numpypandas を使用して多段抽出法を実装する方法を示しています。最初に地域を選択し、次にその地域内の都市、最後にその都市内の世帯を選択することで、管理しやすく代表的なサンプルを得ることができます。

question mark

母集団をサブグループに分割し、各サブグループからその規模に比例してサンプリングする方法はどれですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  22

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  22
some-alt