인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

JinSha Ko's profile image
JinSha Ko

asked

Mastering Data Analysis and Visualization with Just Two Documents

19) Understanding Python Data Visualization Histograms and Frequency Distribution Tables, Understanding the Difference Between Bar Graphs and Histograms

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

Written on

·

782

1

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

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

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

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

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

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

pandaspython

Answer 4

2

todaycode님의 프로필 이미지
todaycode
Instructor

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

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

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

2

todaycode님의 프로필 이미지
todaycode
Instructor

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

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
Questioner

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

0

todaycode님의 프로필 이미지
todaycode
Instructor

감사합니다 :)

JinSha Ko's profile image
JinSha Ko

asked

Ask a question