python/Pandas | Numpy

[Numpy] percentile() - 백분위수 구하기

Balang 2025. 5. 2. 09:06
728x90

데이터 분석을 하다 보면 단순 평균으로는 전체 분포를 이해하기 어렵다.

예를 들어 한 반의 평균 점수가 75점이라 해도,

상위 10%가 100점이고 하위 90%가 60점대라면 분포는 완전히 왜곡돼 있다.

 

이럴 때 필요한 것이 백분위수(percentile) 이다.

  • 상위 10% 이상 성적을 보고 싶다? → 90 percentile
  • 하위 25% 컷을 알고 싶다? → 25 percentile
  • 중앙값은? → 50 percentile (== median)

Numpy는 np.percentile( ) 로 이를 아주 쉽게 계산할 수 있다.

 

예제 데이터

scores = [55, 60, 65, 70, 75, 80, 85, 90, 95, 100]

 

 


기본 문법

import numpy as np

np.percentile(data, q)

 

 

예제

1. 전체 데이터의 50%가 이하인 값 (중앙값)

np.percentile(scores, 50)
# 결과: 77.5

50번째 백분위수 = 중간값 = 데이터의 정렬된 위치 기준 정확히 가운데 값

 

2. 25%, 75% 백분위수 계산 (IQR 분석용)

q1 = np.percentile(scores, 25)  # Q1
q3 = np.percentile(scores, 75)  # Q3
iqr = q3 - q1

#  q1 = 66.25
#  q3 = 88.75
#  iqr = 22.5

→ 이상치 탐지 기준: [Q1 - 1.5×IQR, Q3 + 1.5×IQR]

 

3. 상위 10% 이상 점수 컷 확인

np.percentile(scores, 90)
# 결과: 95.5

이 점수보다 높은 사람이 상위 10% 이내

 

4. 여러 백분위 동시에 구하기

np.percentile(scores, [25, 50, 75])
# 결과: [66.25, 77.5, 88.75]

 

 

5. 2차원 배열에서 축 기준 percentile

data = np.array([[10, 20, 30], [40, 50, 60]])

np.percentile(data, 50, axis=0)  # 열별 중앙값
# [25. 35. 45.]

np.percentile(data, 50, axis=1)  # 행별 중앙값
# [20. 50.]

축 단위로 비교 분석할 때 매우 유용

 

5. 이상치 탐지

def detect_outliers(data):
    q1 = np.percentile(data, 25)
    q3 = np.percentile(data, 75)
    iqr = q3 - q1
    lower = q1 - 1.5 * iqr
    upper = q3 + 1.5 * iqr
    return [x for x in data if x < lower or x > upper]

detect_outliers(scores)
# 결과: []

이상치가 없으면 빈 리스트 반환

 

(응용) 차량 속도를 예로 평균과 백분율, 백분위 구하기

단, 제한속도는 100이라고 가정

import numpy as np

car_speed = [65, 51, 43, 48, 50, 41, 70, 110, 150, 39, 80, 82, 32, 82, 78, 76, 125, 136, 127, 61, 131]

speed_mean = np.mean(car_speed)

car_count = 0
percent = 0

for i in car_speed:
	if i <= 100:
		car_count += 1

percent = (car_count / len(car_speed)) * 100

percentile = np.percentile(car_speed, 71)

print('통과한 평균속도 : {:.2f}Km'.format(speed_mean))
print("시속 100km 이하 자동차 수 :", car_count)
print("시속 100km 이하 백분율 : {:.2f}%".format(percent))
print("시속 100km 이하 백분위수 : {:.2f}".format(percentile))

# 통과한 평균속도 : 79.86Km
# 시속 100km 이하 자동차 수 : 15
# 시속 100km 이하 백분율 : 71.43%
# 시속 100km 이하 백분위수 : 87.60

 

주의점 설명
정렬이 자동으로 적용됨 np.percentile()은 내부적으로 sort 처리함
NaN 값이 있으면 결과가 NaN → np.nanpercentile() 사용 필요
percentile 값은 float 반환 필요한 경우 int()로 변환 또는 반올림 필요

 

 

np.percentile()은 단순 통계 그 이상이다.
데이터 분포의 핵심 요약, 상하위 컷 계산, 이상치 탐지의 기반이 되는 함수로,
실무 분석에서 평균보다 더 신뢰할 수 있는 지표다.

25-50-75% 백분위는 분석의 기준,
90-95-99% 백분위는 상위권 컷,
5-10% 백분위는 하위 위험군 탐지에 활용할 수 있다.

728x90
반응형