• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

random,randn(1000) 함수 질문드립니다

20.07.23 11:34 작성 조회수 561

1

이코드가  a 컬럼에 1000개의 랜덤숫자 들어간다고 설명주셨는대요

히스토그램 보면 대부분 -4 ~ +4 까지 분포 되있습니다

랜덤한 숫자 범위가 -4  에서 + 4까지 라는 정의는 어디 있는건가요, 

아니면 그이상 범위의 랜덤한 숫자는 발생할 확률이 거의 없다는건가요

그리고 인덱스4부터 994까지 데이터 생략되서 화면에 나오는대

생략된거 보려면 어떻게 해야되나요

답변 4

·

답변을 작성해보세요.

2

코드를 직접 실습해 보실 수 있도록 colab링크를 생성했습니다.

아래 링크에서 위 답변 내용을 확인해 보실 수 있습니다.

https://colab.research.google.com/github/corazzon/cracking-the-pandas-cheat-sheet/blob/master/19-1-numpy_rand_randn_randint.ipynb

2

안녕하세요. 좋은 질문을 주셨네요. 

numpy의 random 은 랜덤한 난수를 생성해 줍니다. 해당 난수가 어떻게 생성되는지를 알아보기 위해 난수를 생성하고 시각화를 해봅니다.

In [1]:
import numpy as np
import pandas as pd
In [2]:
# 0부터 1사이의 균일 분포를 난수로 생성합니다.
rand = np.random.rand(100)
# 100개의 난수 중에 앞에서 10개의 난수만 슬라이싱으로 가져와서 미리보기를 합니다.
rand[:10]
Out[2]:
array([0.70120149, 0.60903287, 0.92737878, 0.21115318, 0.07921266,
       0.85670143, 0.85204262, 0.78576105, 0.60065481, 0.12115728])
In [3]:
# 가우시안 분포(표준 정규분포)를 생성합니다.
randn = np.random.randn(100)
randn[:10]
Out[3]:
array([-0.34370216, -0.16520929, -0.0239209 , -0.56201821, -0.6607583 ,
       -0.72738844,  1.71244652,  1.37629177, -0.47520939,  0.35302249])
In [4]:
# 균일분포의 정수 난수를 생성합니다.
randint = np.random.randint(1, 10, 100)
randint[:10]
Out[4]:
array([7, 8, 7, 2, 7, 9, 1, 7, 8, 9])
In [5]:
# 위에서 만든 값을 데이터프레임으로 만들어서 비교를 합니다.
df = pd.DataFrame({"rand": rand, "randn": randn, "randint": randint})
In [6]:
# 3가지 난수 생성방법으로 생성된 값을 비교해 보기 위해 그래프를 그립니다.
# legend 값을 확인해 주세요.
df.plot(figsize=(15, 4))
Out[6]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe10525bd90>
In [7]:
# 같은 값을 히스토그램으로 그립니다. 
# rand, randint의 난수생성값에 대해 각 구간의 값의 빈도수를 표현합니다.
# randn은 정규분포(수학자 가우스의 이름을 따서 보통 가우시안 분포라고 부릅니다.) 형태로 난수를 생성한 것을 볼 수 있습니다.
h = df.hist(figsize=(15, 8), bins=6)
In [8]:
#  randn은 다른 분포와 다르게 정규분포 형태의 분포를 생성합니다.
df.plot.hist(alpha=0.5, bins=6)
Out[8]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe1033a4250>
In [9]:
df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 
                    'b': np.random.randn(1000),
                    'c': np.random.randn(1000) - 1}, 
                   columns=['a', 'b', 'c'])
In [10]:
# 아래에 ... 으로 생략된 값이 나오는데 생략된 값을 모두 보려면 
# 아래의 코드의 주석을 풀고 작성해 주시면 최대 1000개의 행까지 보입니다.
# pd.options.display.max_rows=1000
df4
Out[10]:
a b c
0 1.688363 0.599816 -1.146103
1 2.063129 0.386725 0.174199
2 1.063826 -0.614139 -1.796128
3 0.750383 0.017562 -2.340481
4 1.058153 -1.041329 -2.139084
... ... ... ...
995 0.229304 1.380294 -1.843782
996 1.273412 0.524378 -1.426780
997 1.278052 0.013020 -2.318381
998 0.713480 1.127352 -0.944348
999 0.306448 0.596648 0.955722

1000 rows × 3 columns

In [11]:
# 그래프에서 이 값은 -4에서 4까지의 값을 랜덤하게 생성한 것을 확인해 볼 수 있는데요.(좀 더 정확하게 bin 값의 범위입니다.)
# 정규분포의 정의는 평균이 0 분산이 1로 구해지게 됩니다.
# a, c는 1을 빼고 더했기 때문에 평균과 분산이 다르게 나왔는데요.
# b 컬럼은 평균이 0에 가깝고 분산이 1에 가까운 것을 확인해 보실 수 있습니다.
# randn은 rand(랜덤) n(normal) 정규분포값을 생성합니다.
df4.describe()
Out[11]:
a b c
count 1000.000000 1000.000000 1000.000000
mean 1.009496 0.017690 -1.022868
std 1.034886 0.968953 0.960630
min -2.395183 -2.912158 -3.893227
25% 0.321629 -0.633945 -1.687817
50% 1.046616 0.002566 -1.044147
75% 1.744358 0.668972 -0.417855
max 4.276731 2.831735 1.976510
In [12]:
# 아래의 그래프에서 정규분포값을 평균이 0, 분산이 1에 가까운 분포값을 생성해서 히스토그램을 그렸다고 보시면 됩니다.
df4.plot.hist()
Out[12]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe105774290>

정규분포의 정의는 다음의 링크를 좀 더 참고해 보세요.

평균이 0이고 표준편차가 1인 정규분포 N(0,1)을 표준 정규 분포(standard normal distribution)라고 한다.

정규 분포 - 위키백과, 우리 모두의 백과사전

1

JinSha Ko님의 프로필

JinSha Ko

질문자

2020.07.23

이제야 내용 이해했습니다. 정성스러운 답변 감사합니다

0

감사합니다 :)