본문 바로가기
수학

중앙화(Centering)과 척도화(Scaling)을 통한 표준화 파이썬 코드 예시

by Saltycrocodile 2025. 3. 3.

 

 

시험성적 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에 가까워야 하며, 표준편차는 원래의 표준편차와 같거나 미세하게 차이날 수 있다.