Стратифицированная выборка в пандах (с примерами)
Исследователи часто берут образцы из популяции и используют данные выборки, чтобы сделать выводы о популяции в целом.
Обычно используемый метод выборки — это стратифицированная случайная выборка , при которой совокупность делится на группы и определенное количество членов из каждой группы случайным образом отбирается для включения в выборку.
В этом руководстве объясняются два метода выполнения стратифицированной случайной выборки в Python.
Пример 1: Стратифицированная выборка с использованием подсчета
Предположим, у нас есть следующий DataFrame pandas, который содержит данные о 8 баскетболистах из 2 разных команд:
import pandas as pd #createDataFrame df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'position': ['G', 'G', 'F', 'G', 'F', 'F', 'C', 'C'], 'assists': [5, 7, 7, 8, 5, 7, 6, 9], 'rebounds': [11, 8, 10, 6, 6, 9, 6, 10]}) #view DataFrame df team position assists rebounds 0 A G 5 11 1 A G 7 8 2 A F 7 10 3 A G 8 6 4 B F 5 6 5 B F 7 9 6 B C 6 6 7 B C 9 10
Следующий код показывает, как выполнить стратифицированную случайную выборку, случайным образом выбрав по 2 игрока из каждой команды для включения в выборку:
df. groupby ('team', group_keys= False ). apply ( lambda x: x.sample (2)) team position assists rebounds 0 A G 5 11 3 A G 8 6 6 B C 6 6 5 B F 7 9
Обратите внимание, что в стратифицированную выборку включены по два игрока от каждой команды.
Пример 2: Расслоенная выборка с использованием пропорций
Давайте снова предположим, что у нас есть следующий DataFrame pandas, который содержит данные о 8 баскетболистах из 2 разных команд:
import pandas as pd #createDataFrame df = pd.DataFrame({'team': ['A', 'A', 'B', 'B', 'B', 'B', 'B', 'B'], 'position': ['G', 'G', 'F', 'G', 'F', 'F', 'C', 'C'], 'assists': [5, 7, 7, 8, 5, 7, 6, 9], 'rebounds': [11, 8, 10, 6, 6, 9, 6, 10]}) #view DataFrame df team position assists rebounds 0 A G 5 11 1 A G 7 8 2 A F 7 10 3 A G 8 6 4 B F 5 6 5 B F 7 9 6 B C 6 6 7 B C 9 10
Обратите внимание, что 6 из 8 игроков (75%) в DataFrame входят в команду A, а 2 из 8 игроков (25%) — в команду B.
Следующий код показывает, как выполнить стратифицированную случайную выборку, чтобы доля игроков в выборке из каждой команды соответствовала доле игроков из каждой команды в более крупном DataFrame:
import numpy as np #define total sample size desired N = 4 #perform stratified random sampling df. groupby ('team', group_keys= False ). apply ( lambda x: x. sample (int(np. rint (N* len (x)/ len (df))))). sample (frac=1). reset_index (drop= True ) team position assists rebounds 0 B F 7 9 1 B G 8 6 2 B C 6 6 3 A G 7 8
Обратите внимание, что доля игроков команды А в стратифицированной выборке (25%) соответствует доле игроков команды А в более крупном DataFrame.
Аналогично, доля игроков команды B в стратифицированной выборке (75%) соответствует доле игроков команды B в более крупном DataFrame.
Дополнительные ресурсы
В следующих руководствах объясняется, как выбирать другие типы образцов с помощью pandas:
Как выполнить кластерную выборку в Pandas
Как проводить систематический отбор проб среди панд