시험성적 10명을 랜덤으로 추출한 다음 이 성적들의 평균과 표준편차를 구해보자 아래의 코드는 10명의 랜덤 시험 점수를 생성하고, 그 점수에 대한 평균과 표준편차를 계산한 후, 중심화라는 과정을 통해 점수에서 평균을 빼고, 다시 그 중심화된 점수들의 평균과 표준편차를 계산하는 과정이다.
import numpy as np
# 10명의 랜덤 시험 점수 생성
np.random.seed(42) # 재현성을 위해 설정
scores = np.random.randint(0, 101, 10)
# 평균과 표준편차 계산
mean_score = np.mean(scores)
std_score = np.std(scores, ddof=0) # 모집단 표준편차 사용
# 중심화 (각 점수에서 평균을 뺌)
centered_scores = scores - mean_score
# 중심화된 점수들의 평균과 표준편차 계산
centered_mean = np.mean(centered_scores)
centered_std = np.std(centered_scores, ddof=0)
# 결과 출력
print("원래 점수:", scores)
print("원래 점수 평균:", mean_score)
print("원래 점수 표준편차:", std_score)
print("중심화된 점수:", centered_scores)
print("중심화된 점수 평균:", centered_mean)
print("중심화된 점수 표준편차:", centered_std)
결과는 아래와 같이 출력된다.
파이썬 IDLE상에서 RUN MODULE을 해보면
이렇게 똑같이 나온다. 그런데 여기서 살짝 의문은 중심화된 점수의 평균이 0으로 나오지 않은 것인데 잘보면
중심화된 점수 평균: 1.4210854715202005e-15 으로 나와있다.
중심화된 점수 평균: 1.4210854715202005e-15는 과학적 표기법(Scientific notation)으로 나타낸 값인데. 여기서 1.4210854715202005e-15는 다음과 같이 읽을 수 있다.
1.4210854715202005e-15는 1.4210854715202005 × 10^(-15)을 의미한다. 따라 0.0000000000000014210854715202005와 같은 매우 작은 수를 의미한다. 사실상 0이나 다름없다 그런데 컴퓨터는 왜 0이 아니고 이런 값을 출력해준 것일까? 이는 부동소수점 오류이다. 부동소수점 오류는 컴퓨터가 실수 값을 근사적으로 저장하는 방식 때문에 발생하는 작은 차이로, 특히 수학적 계산에서 자주 나타난다. 중심화처럼 평균을 빼는 연산에서 그 영향이 나타나긴 하지만 이를 반올림이나 다른 방법으로 처리할 수 있다.
다시 위 코드를 한 줄 씩 분석해보자
import numpy as np
# 10명의 랜덤 시험 점수 생성
np.random.seed(42) # 재현성을 위해 설정
scores = np.random.randint(0, 101, 10)
# 평균과 표준편차 계산
mean_score = np.mean(scores)
std_score = np.std(scores, ddof=0) # 모집단 표준편차 사용
# 중심화 (각 점수에서 평균을 뺌)
centered_scores = scores - mean_score
# 중심화된 점수들의 평균과 표준편차 계산
centered_mean = np.mean(centered_scores)
centered_std = np.std(centered_scores, ddof=0)
# 결과 출력
print("원래 점수:", scores)
print("원래 점수 평균:", mean_score)
print("원래 점수 표준편차:", std_score)
print("중심화된 점수:", centered_scores)
print("중심화된 점수 평균:", centered_mean)
print("중심화된 점수 표준편차:", centered_std)
1.
np.random.seed(42) # 재현성을 위해 설정
np.random.seed(42):
- seed는 난수 생성기의 시작점을 설정해주는 값이다. 이를 통해 난수를 생성할 때마다 같은 값을 생성할 수 있게 해준다. 이 코드를 실행할 때마다 동일한 랜덤 점수가 생성되도록 하는 역할을 하게 된다. 42는 임의의 값이다.
- 시드 값 자체는 중요하지 않다. 42는 그냥 난수 생성기의 초기값이기 때문에, 이 숫자에 의한 차이를 만들어내는 것은 아니기 때문에 임의로 선택할 수 있다. 42가 아니라 30이든 0이든 상관없다.
- 그러나 시드 값이 같으면 동일한 난수가 생성된다. 그래서 실험을 재현할 때 np.random.seed(42)처럼 시드를 고정하는 것이 유용하다.
2.
scores = np.random.randint(0, 101, 10):
- np.random.randint(low, high, size)는 지정한 범위 내에서 size 크기의 정수 난수를 생성하는 함수이다.
- low=0과 high=101은 0 이상 101 미만의 범위에서 난수를 생성하라는 뜻이다.
- size=10은 10개의 난수를 생성하도록 지정한 것이다.
- 이 함수는 10명의 학생의 점수를 0~100 사이의 난수로 생성한다.
3.
mean_score = np.mean(scores)
std_score = np.std(scores, ddof=0)
- np.mean(scores):
- np.mean()은 배열이나 리스트의 평균을 계산한다.
- 이 코드는 scores 배열에 들어있는 10명의 점수의 평균을 계산한다.
- np.std(scores, ddof=0):
- np.std()는 배열이나 리스트의 표준편차를 계산한다.
- ddof=0은 모집단 표준편차를 계산하도록 설정한 것이다. 모집단 표준편차는 분모에 데이터의 개수 n을 사용한다. (ddof=1은 표본 표준편차로, 분모에 n-1을 사용한다)
4.
centered_scores = scores - mean_score
- 이 코드에서 중심화를 한다.
- 중심화란, 각 점수에서 평균을 빼는 것이다. 중심화된 점수는 평균이 0이 되는 성질을 가진다.
- scores - mean_score는 scores 배열의 각 요소에서 평균인 mean_score를 빼는 연산이다. 결과적으로 centered_scores 배열에 저장된다.
5.
centered_mean = np.mean(centered_scores)
centered_std = np.std(centered_scores, ddof=0)
- centered_mean = np.mean(centered_scores):
- 중심화된 점수들의 평균을 계산한다. 이 값은 이론적으로 0이 되어야 한다. 그러나 부동소수점 오차 때문에 아주 작은 숫자(예: -1e-15)가 나올 수 있다.
- centered_std = np.std(centered_scores, ddof=0):
- 중심화된 점수들의 표준편차를 계산한다. 중심화된 데이터는 평균이 0이므로, 이 값은 원래 표준편차와 동일할 수 있다. (단, 부동소수점 오차로 인해 약간의 차이가 있을 수 있다.)
6.
print("원래 점수:", scores)
print("원래 점수 평균:", mean_score)
print("원래 점수 표준편차:", std_score)
print("중심화된 점수:", centered_scores)
print("중심화된 점수 평균:", centered_mean)
print("중심화된 점수 표준편차:", centered_std)
- 이 부분은 결과를 출력하는 코드
- scores: 10명의 원래 점수.
- mean_score: 10명의 원래 점수의 평균.
- std_score: 10명의 원래 점수의 표준편차.
- centered_scores: 중심화된 점수.
- centered_mean: 중심화된 점수의 평균.
- centered_std: 중심화된 점수의 표준편차.
결과요약
- 10명의 점수를 랜덤으로 생성하고, 그 점수의 평균과 표준편차를 계산한다.
- 그 후, 각 점수에서 평균을 빼는 중심화 작업을 수행한다.
- 중심화된 점수들의 평균은 0에 가까워야 하며, 표준편차는 원래의 표준편차와 같거나 미세하게 차이날 수 있다.
'수학' 카테고리의 다른 글
중앙화(Centering)과 척도화(Scaling)을 통한 표준화 파이썬 코드 예시(2) (0) | 2025.03.03 |
---|---|
중심화와 척도화를 통한 표준화 (0) | 2025.03.03 |
동전던지기를 100번 수행해서 앞면이 60번 나올 확률과 그 이해(1) (0) | 2025.03.03 |
동전던지기와 이항분포(Binomial Distribution) 그리고 중앙극한정리 (0) | 2025.02.27 |