서론
난수? 임의의 수?
우리가 일반적으로 난수를 발생시킬 때, 정말 무작위로
컴퓨터 내에서 아무거나 뽑아내는 것이라고 생각하는 경향이 있습니다.
무작위란 무엇일까요?
랜덤이란 굉장히 인간적인 개념일지도 모릅니다.
수학이나 통계에서 의도가 들어가지 않은 것이나, 말그대로
규칙성을 아예 갖지 않는 것은 우리가 포착하기 어렵습니다.
컴퓨터 프로그램에서 발생하는 무작위의 수는 사실
엄격한 의미의 무작위가 아닙니다.
우리가 난수를 뽑을 때면 컴퓨터는 일련의 작업을 거칩니다.
어떠한 특정한 시작 숫자를 정해주면 컴퓨터가 정해진 알고리즘에
의해 마치 난수처럼 보이는 수열을 생성할 수 있는데요.
이를 시드(seed)라고 합니다.
이번 시간에는 numpy에서 난수와 샘플링에 대해서 알아봅니다.
난수 발생과 카운트
np.random.seed(0) # 시드값 고정
한번 생성된 난수는 다음번 난수 생성을 위한
시드값이 됩니다.
사람이 수동으로 설정할 수도 있는데, 그 다음에 만들어진
난수는 모두 예측 가능한 값입니다.
몇가지 실습을 위해 고정된 결과를 얻기 위해서는
위에서처럼 시드를 설정합니다.
rand
직접 봐보겠습니다.
np.random.rand(5)
array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
5개의 난수를 생성했습니다.
np.random.rand(10)
array([0.89246809, 0.14642283, 0.3525345 , 0.88384726, 0.26750903,
0.19130678, 0.19347182, 0.77225629, 0.89140794, 0.81394469])
만약 여러분이 따라해보신다면
전혀 다른 숫자가 나올 것입니다.
똑같은 숫자가 나오지 않는다고 해서,
잘못된 것은 아닙니다.
오히려 엄청 운이 좋으신거요!
다음은 randn 입니다.
randn
기댓값(평균)이 0이고 표준편차가 1인 표준 정규 분포를 따르는 난수를 생성합니다.
5행 2열 제작합니다.
np.random.randn(5,2)
array([[ 0.81116027, 0.28779461],
[-0.53846816, 1.9084621 ],
[-0.475776 , 1.44073112],
[-1.14907568, 0.80571455],
[ 1.75610703, 0.97297991]])
마찬가지로 전혀 다른 숫자가 도출될 수 있습니다.
randint
random+int 입니다.
임의 범위의 숫자들을 설정해서 리턴합니다.
구조
np.random.randint(low, high=None, size=None)
직접 시도해봅니다.
np.random.randint(10)
9
randint는 low~high값까지의 범위에 임의 정수를 반환합니다.
high를 입력하지 않으면 0~low,
size를 입력하면 그대로 배열 갯수가
반환됩니다. (입력 안하면 1개)
np.random.randint(10, size = 10)
array([3, 1, 8, 0, 4, 9, 6, 5, 7, 8])
10개의 값이죠?
10에서 20사이의 수에서 depth는 2, row는 2, column은 5인
3차원배열을 만들어봅시다.
np.random.randint(10, 20, size = (2, 2, 5)
array([[[18, 14, 10, 18, 13],
[15, 19, 17, 14, 15]],
[[16, 19, 13, 11, 17],
[15, 18, 14, 17, 15]]])
이번에는 데이터의 순서를 변경하는 함수입니다.
shuffle
이번에도 무작위로 변경하는데,
변경하는 것은 데이터의 순서입니다.
shuffle( ) 을 사용하며, 원본에도 영향이 갑니다.
배열 생성하기
x = np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
랜덤으로 섞습니다.
np.random.shuffle(x)
x
array([2, 0, 1, 7, 3, 6, 9, 4, 5, 8])
x 자체도 변화하게 됩니다.
데이터 샘플링
표본 선택 혹은 샘플링은 이미 있는 데이터 집합에서 일부를
무작위로 선택하는 것입니다.
choice 의 구조
함수로는 choice ( a, size, replace, p)를 사용하는데
a는 배열이라면 원래의 데이터, 정수이면 arange(a)의 명령으로
배열을 생성합니다.
size는 추출할 사이즈로, 정수입니다.
replace는 복원 여부로, True일 경우 한 번 선택한 데이터를
다시 선택할 수 있습니다. False는 다시 선택할 수 없습니다.
p는 각 데이터가 선택할 수 있는 확률입니다.
np.random.choice(5,5,replace=False )
array([1, 2, 0, 4, 3])
비복원 추출입니다. 비복원하는 실제 사례로는 자리뽑기,
경품 뽑기 등이 있습니다.
np.random.choice(5,5,replace=True)
array([3, 0, 4, 2, 0])
복원 추출입니다. 복원하는 실 사례로는 동전 던지기나
주사위 던지기 같은 도박 관련된 확률 등이 있습니다.
# arrange(5) = [0,1,2,3,4] --> 10.
np.random.choice(5,10, p=[0.1, 0, 0.3, 0.6, 0])
array([2, 3, 3, 3, 3, 3, 3, 3, 3, 3])
0,1,2,3,4 의 각각의 확률을 임의로 선택함 확률입니다.
실제로 이렇게 하면 사기가 벌어질 수 있겠죠?
확률 조작은 나쁜 일입니다.
마지막으로, unique와 bincount를 포함한 정수 데이터 카운팅
함수가 있습니다.
unique
이 함수는 데이터에서 중복된 값을 제거하고 중복되지 않은 유일한(unique)
값의 리스트를 출력합니다.
set가 갖고 있는 기본적인 기능과 같죠?
return_counts 인수를 True로 설정하면, 각 값을 가진 데이터 갯수도 출력합니다.
np.unique([11,11,2,2,34,34])
array([ 2, 11, 34])
return_counts를 설정해보겠습니다.
a = np.array(['a','b','b','c','a'])
np.unique(a,return_counts=True)
(array(['a', 'b', 'c'], dtype='<U1'), array([2, 2, 1]))
a의 갯수가 2, b의 갯수가 2, c의 갯수가 1인 점을 셌네요.
index, count = np.unique(a, return_counts=True)
index
array(['a', 'b', 'c'], dtype='<U1')
이렇게 중복 제거된 값만 따로 뺄수도 있습니다.
count
array([2, 2, 1])
중복 제거된 값의 빈도 수 입니다.
bincount
위에서 unique 함수는 데이터에 존재하는 값에 대해서만 갯수를 세므로
데이터값이 나올 수 있음에도 불구하고 데이터가 하나도 없는 경우에는
정보를 보여주지 않습니다!
따라서 주사위를 던졌을 때 나오는 수처럼 특정 범위안의 수인 경우에는
새로운 함수를 쓸 수 있습니다.
랜덤한 값 생성합니다.
r = np.random.randint(6, size=10) # 0~5
r
array([4, 4, 5, 2, 5, 2, 0, 0, 0, 1])
위에서 [0이 1개][1이 0개][2가 3개][3이 1개][4가 1개][5가 4개]입니다.
다만, 다시 시도한다면 달라지겠죠?
np.bincount(r, minlength=6)
array([1, 0, 3, 1, 1, 4])
minlength는 길이입니다.
또한, bincount 함수는 0 부터 minlength - 1 까지의 숫자에 대해 각각 카운트합니다.
이렇게 하여, numpy에서 필수적으로 필요한 갖가지 함수들과
배열의 수정방법에 대해서 알아보았습니다.
다음 게시글부터는 pandas에서 사용되는 형식(시리즈, 데이터프레임)과
실제 사례들에 대해서 소개하겠습니다.
고생 많으셨습니다!
'Programming Language > Python_library' 카테고리의 다른 글
파이썬_활용단계 ep.2 pandas를 써서 표 안의 원하는 것만 골라뽑기 (0) | 2022.12.18 |
---|---|
파이썬_활용단계 ep.1 Let's go pandas 월드 (2) | 2022.12.14 |
파이썬_응용단계 ep.7 정렬과 통계 (0) | 2022.12.11 |
파이썬_응용단계 ep.6 배열의 연산 (0) | 2022.12.11 |
파이썬_응용단계 ep.5 배열의 연결과 분할 (2) | 2022.12.09 |