[데이터 분석] numpy random.rand에 관하여 | dasfef

2023.05.01

개인 기록용입니다 :) 더욱 자세하고 구체적인 정보는 원문 정보를 참고해주세요


데이터분석 관련 수업을
길벗 출판사의
『모두의 데이터분석 with 파이썬』
으로 진행하고 있다

데이터분석을 시작하는 단계의 사람이라면
여러모로 배우기 쉬운 책이라 생각하고 있다

실습으로 코드를 따라하고
각종 기능들에 대한 설명과
이것만 배워도 추가적으로 내가 배우면서 한다면
충분히 데이터분석 할 수 있겠다 싶은
자신감을 키워준다

그러던 중 numpy random.rand 를 활용하는 예제에서
오류가 발생하여 기록하기로 한다


[ 본래 예제 ]

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randint(10, 100, 200)
y = np.random.randint(10, 100, 200)
size = np.random.rand(100)

plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.3)
plt.colorbar()
plt.show()
위와 같이 코드를 작성하면
이것과 같이 scatter 가 작성되어야 하는데
random.rand 부분에서 오류가 발생한다
ValueError: s must be a scalar, or float array-like with the same size as x and y
이와 같은 오류가 발생하는데
s 즉, size 는 위에서 생성한
x, y 와 값의 개수가 같아야 하거나
단일 값을 주어야 한다

위의 값들은 어떻게 나올까?

import numpy as np

x = np.random.randint(10, 100, 200)
y = np.random.randint(10, 100, 200)
size = np.random.rand(100)

print(x)
print(y)
print(size)
x, y, size 의 값은 위와 같이 나온다

x = 10 ~ 99 까지의 수 중 랜덤으로 200개 생성
y = 10 ~ 99 까지의 수 중 랜덤으로 200개 생성
size = 0 ~ 1 까지의 수 중 랜덤으로 100개 생성

여기서 numpy.random.rand() 함수는
인자가 주어지지 않으면 스칼라 값을 반환하고
인자가 1개면 1차원 배열, 2개면 2차원, 3개면 3차원 배열을 반환한다

위에 주어진 인자는 100이라는 1개이기 때문에
1차원 배열이지만 개수가 100개이기 때문에
x, y 의 값의 개수(200)와 개수가 맞지 않다

numpy.random.rand(200)으로 수정해보자

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randint(10, 100, 200)
y = np.random.randint(10, 100, 200)
# size = np.random.rand(100)
size = np.random.rand(200)

# print(size)
plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.3)
plt.colorbar()
plt.show()
잘 출력된다
그치만 크기가 너무 작다
나오는 값들이 0 ~ 1 사이의 난수이기 때문에
값이 너무 작기 때문이다

* 100을 붙여주어 값을 키워주자

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randint(10, 100, 200)
y = np.random.randint(10, 100, 200)
# size = np.random.rand(100)
size = np.random.rand(200) * 100

# print(size)
plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.3)
plt.colorbar()
plt.show()
성공!

난수로 배정된 크기에 따라
점들의 크기가 다름을 확인할 수 있다

다른 예제가 또 존재한다

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randint(-100, 100, 1000)
y = np.random.randint(-100, 100, 1000)
size = np.random.rand(100) * 100
mask1 = abs(x) > 50
mask2 = abs(y) > 50
x = x[mask1 + mask2]
y = y[mask1 + mask2]


plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.3)
plt.colorbar()
plt.show()
마스크를 배우던 중 나온 예시인데
여기도 동일하게 numpy.random.rand(100) 이 존재한다

개수 맞춰주면 되겠지~
numpy.random.rand(1000) 으로 가자!

실패했다 😨

생각해보니 예제에서 보듯
x, y의 값을 재조정했다

x = x[mask1 + mask2]
y = y[mask1 + mask2]

mask를 통해 true 값이
둘 중 하나라도 충족하는 값들에 한해
사이즈를 조정해 주었는데
이것이 무조건 1000개는 되지 않을 터

이는 아래와 같이 해결할 수 있다

import matplotlib.pyplot as plt
import numpy as np

x = np.random.randint(-100, 100, 1000)
y = np.random.randint(-100, 100, 1000)
mask1 = abs(x) > 50
mask2 = abs(y) > 50
x = x[mask1 + mask2]
y = y[mask1 + mask2]
size = np.random.rand(len(x + y)) * 100   // 수정된 부분

plt.scatter(x, y, s=size, c=x, cmap='jet', alpha=0.3)
plt.colorbar()
plt.show()
x와 y를 합한 것의 길이를 파악해
사이즈 개수로 넣어주면
잘 실행된다 👍