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
반응형