본문 바로가기
Python/Pandas

랜덤 샘플의 추출 및 선택(sample)-pandas(23)

by 콩돌 2019. 11. 9.
반응형

파이썬 버전 3.7 기준

pandas 버전 0.25.1 기준



 무작위 샘플 추출을 위한 sample 메서드


본 포스팅에서는 객체내의 임의의 샘플을 선정하여 추출하는 방법에 대해 다룬다.



 랜덤 샘플의 추출


pandas에서는 객체내에서 랜덤한 샘플을 추출할 수 있도록 하는 메서드가 존재한다.

sample() 메서드를 사용하면 랜덤한 샘플을 추출할 수 있는데 이 메서드는 Series와 DataFrame 둘 다 적용이 가능하다.

  ○ 이 메서드는 행을 기본값으로 샘플링을 한다.

이 메서드에 대한 사용방식은 다음과 같다.


sample 메서드의 사용형식)

Series.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)


n는 추출할 샘플의 수이다. (frac과 중복사용 불가)

frac은 전체 개수의 비율 만큼 샘플을 반환하려 할 경우 사용된다. (n과 중복사용 불가)

replace는 샘플링을 수행할 때 같은 샘플을 중복되게 추출할지 여부를 결정한다.

  ○ 기본값은 False이며, 중복샘플을 허용하지 않는다.

weights는 샘플 추출시 샘플마다 뽑힐 확률을 조정한다.

random_state는 랜덤 샘플 추출시 시드를 입력받으며, 같은 시드에서는 항상 같은 결과를 도출한다.

axis는 샘플을 추출할 방향(행 혹은 열)을 입력받는다.

  ○ 기본값으로 0과 동등한 값이 입력되어 있으며 랜덤하게 행을 선택한다.

  ○ 1이 입력될 경우 랜덤하게 열을 선택한다.



 사용 예제

다음 예제는 위에서 설명하였던 sample 메서드의 가장 단순한 사용 예제를 보여준다.


sample() 메서드 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[4]: ex_df=pd.DataFrame(np.arange(0,12).reshape(4,3))

In[5]: ex_df

Out[5]: 

   0   1   2

0  0   1   2

1  3   4   5

2  6   7   8

3  9  10  11


# 랜덤 샘플 추출 예제

In[6]: ex_df.sample()

Out[6]: 

   0  1  2

1  3  4  5


In[7]: ex_df.sample(n=3)

Out[7]: 

   0   1   2

3  9  10  11

1  3   4   5

2  6   7   8


기본값으로써  sample() 메서드는 각각의 행에서 한번씩만 샘플링하며 중복된 샘플링을 하지 않는다.

하지만 raplace 입력변수에 True로 입력할 경우 같은 행을 중복해서 샘플링이 가능하다.


replace 입력변수의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[4]: ex_df=pd.DataFrame(np.arange(0,12).reshape(4,3))


# replace 입력변수의 사용

In[8]: ex_df.sample(n=3, replace=True)   # 첫번째 사용

Out[8]: 

   0   1   2

3  9  10  11

2  6   7   8

0  0   1   2


In[9]: ex_df.sample(n=3, replace=True)  # 두번재 사용, 위의 값과 다른 데이터가 추출된다.

Out[9]: 

   0  1  2

2  6  7  8

1  3  4  5

2  6  7  8



기본적으로 각각의 열은 동일한 확률로 샘플링된다. 

그러나 만약 사용자가 각각의 열을 다른 확률로 샘플링 하길 원한다면 weights 입력변수를 이용하면된다.

가중치(weights)는 리스트, Numpy의 array, Series 등으로 입력이 가능하다.

주의사항으로 샘플링되는 객체(Series, DataFrame의 열과 행)의 길이가 동일하여야 한다. 

입력되지 않은 값은 가중치를 0으로 처리하며 무한대(inf)는 입력되지 않는다. 

입력된 가중치들의 합이 1이 되지 않을 경우 자동으로 정규화하여 합이 1이 되도록 설정된다.


weights 입력변수의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[4]: ex_df=pd.DataFrame(np.arange(0,12).reshape(4,3))


# weights 입력변수의 사용

In[10]: ex_df.sample(n=3, replace=True, weights=[0.7,0.2,0.1,0])

Out[10]: 

   0  1  2

0  0  1  2

0  0  1  2

0  0  1  2


DataFrame에 sample() 메서드가 적용될 때, DataFrame에 존재하는 하나의 열을 샘플링 가중치로 이용할 수 있다.

이 방법은 단순하게 weights 변수에 해당 열의 레이블을 입력하면 된다.


weights 입력변수의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[4]: ex_df=pd.DataFrame(np.arange(0,12).reshape(4,3))


# 하나의 열을 이용한 weights 입력변수의 사용

In[11]: ex_df2=ex_df

In[12]: ex_df2['weights'] = [0,0.2,0.1,0.7]

In[13]: ex_df2.sample(n=3, replace=True, weights='weights')

Out[13]: 

   0   1   2  weights

3  9  10  11      0.7

3  9  10  11      0.7

1  3   4   5      0.2


sample 메서드를 사용하면 열을 샘플링할 수도 있다.

axis 입력변수를 이용하여 이를 조절할 수 있다.

 

axis 입력변수의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[4]: ex_df=pd.DataFrame(np.arange(0,12).reshape(4,3))


# axis를 통한 샘플 추출 방향의 변경

In[14]: ex_df.sample(n=2, axis=1)

Out[14]: 

    2  0

0   2  0

1   5  3

2   8  6

3  11  9


random_state 입력변수를 사용하여 샘플의 난수 생성기에 대한 시드를 설정할 수도 있다. 

이 입력변수를 사용하여 시드를 생성한다면 재현성을 보장할 수 있다는 장점이 존재한다.

random_state 입력변수는 정수 (시드) 또는 NumPy RandomState 객체를 허용한다.


random_state 입력변수의 사용 예)

# pandas와 numpy의 import

In[2]: import pandas as pd

In[3]: import numpy as np


# 예제용 배열 선언

In[15]: ex_df=pd.DataFrame(np.arange(0,12).reshape(4,3))


# random_state 입력변수에 시드 입력을 통한 랜덤함수의 재현성 보장

In[16]: ex_df.sample(n=2, random_state=1)

Out[16]: 

   0   1   2  

3  9  10  11

2  6   7   8  


In[17]: ex_df.sample(n=2, random_state=1)

Out[17]: 

   0   1   2  

3  9  10  11 

2  6   7   8  


In[18]: ex_df.sample(n=2, random_state=1)

Out[18]: 

   0   1   2  

3  9  10  11

2  6   7   8 




 메서드 옵션 세부사항


 DataFrame.sample(self, n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

 

객체 축에 따라 랜덤으로 샘플을 추출하여 반환한다.

 

재현성을 확보해야 한다면 random_state를 사용할 수 있다.

 

n: int

선택적으로 입력 가능하다.

축으로부터 추출되는 샘플의 개수를 입력받는다.

frac와 같이 입력되서는 안된다.

기본값은 1이다.


frac: float

선택적으로 입력 가능하다.

축에 있는 요소 수의 비율을 입력받는다.

n과 같이 입력되서는 안된다.

기본값은 None이다.


replace: bool

선택적으로 입력 가능하다.

True일 경우 이미 추출된 샘플이라도 중복하여 샘플을 추출할 수 있게 한다. 

기본값은 False이다.


weights: str, ndarray-like,

선택적으로 입력 가능하다.

기본값은 None이며 이 경우 동일한 확률의 가중치가 입력된다.

만약 Series가 입력될 경우, weights는 인덱스를 기반으로 타겟 오브젝트를 정렬시킨다.

  ○ weights에 입력되는 Series에서 인덱스 값이 샘플링 되는 Series나 DataFrame에 인덱스와 매칭이 되지 않을 경우 해당 값은 무시된다.

  ○ 샘플링 되는 객체에 인덱스 값이 weights에 입력되는 Series에 매칭되는 인덱스가 없다면 0으로 가중치가 입력된다.

DataFrame을 불러올 경우에는 axis=0일 때, 열의 이름을 입력할 수 있다.

weights에 입력되는 객체가 Series가 아닐 경우 샘플링되는 객체와 길이가 동일하여야한다. 

weights의 값이 1이 아닐 경우 정규화를 시도하여 합이 1이 되도록 자동으로 설정한다.

weights에서 누락된 값들은 0으로 입력된다.

무한값(Infinite)값은 사용할 수 없다.

 

random_state: int or numpy.random.RandomState

선택적으로 입력 가능하다. 

랜덤 숫자 생성에 대한 시드 혹은 numpy의 RandomSate 객체이다.


axis: int or string

선택적으로 입력가능하다.

샘플링을 하기 위한 축을 설정하기 위한 입력변수이다.

기본값은 0이다.



 

 

 

 

 참고자료

  https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html

  https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sample.html

 

 

 

 



반응형

댓글