본문 바로가기
python

python - 랜덤 범주형(Categorical) 데이터 생성하기 ( numpy )

by 맑은안개 2022. 12. 7.

np.random.choice 함수를 사용하여 Categorical data를 랜덤으로 생성합니다.

np.random.choice

random_data = np.random.choice(
    a=['a', 'b', 'c', 'd'],
    size=687,
    p=[0.1, 0.2, 0.3, 0.4] # 합이 1이 아닌 경우 오류
)

unique, counts = np.unique(random_data, return_counts=True)
counts = (counts / len(random_data) * 100).round(2)

for _class, _count in zip(unique, counts):
    print(_class, _count)

output

a 9.9
b 19.51
c 31.88
d 38.72

Titanic Cabin data 예시

위의 비율을 갖는 Cabin 변수에 대해 결측치도 동일한 비율로 구성해보겠습니다.
랜덤 데이터 생성을 위해 numpy에서 제공하는 np.random.choice를 사용합니다.

(이 때, 비율의 합이 1이 되지 않아 오류가 나는 경우, 마지막 클래스를 1을 맞추기 위한 차를 더해줍니다.)

정상 데이터 비율

ratio

C    28.921569
B    23.039216
D    16.176471
E    15.686275
A     7.352941
F     6.372549
G     1.960784
T     0.490196
Name: Cabin, dtype: float64

비율 데이터를 갖고 있는 Series를 전달하여 해당 비율만큼 랜덤 범주형 데이터를 생성합니다.

def generate_cat_random(ratio, size):
    if type(ratio) != pd.core.series.Series:
        return None

    return np.random.choice(
        a=ratio.index,
        size=size,
        p=ratio / 100
    )
data = generate_cat_random(ratio, size=684)

v, c = np.unique(data, return_counts=True)
random_s = pd.Series((c / sum(c) * 100).round(2), index=v)
random_s.sort_values(ascending=False)

C    28.22
B    24.42
D    17.25
E    13.60
A     7.46
F     6.73
G     2.05
T     0.29
dtype: float64
  • 정상 데이터 비율과 비슷한 비율로 랜덤 데이터가 생성됐습니다.
반응형