분위수 변환(Quantile Transformation)이란? AI 특징값을 순위로 다시 배치하는 방법
TL;DR
분위수 변환(Quantile Transformation)은 학습 데이터에서 값의 순위와 누적 비율을 구한 뒤, 그 위치를 균등분포 또는 정규분포의 값에 대응시키는 비모수 전처리입니다. 특징마다 따로 적용하며 이상치의 간격을 크게 줄일 수 있습니다. 대신 거리와 선형 상관관계를 왜곡할 수 있고, 학습 범위를 벗어난 새 값은 출력 경계에 붙으므로 데이터 분리와 포화 점검이 필요합니다.
핵심 3줄 요약
- 핵심 1
원래 단위보다 순위를 봅니다. 학습 표본에서 몇 번째 위치인지 계산해 새 척도로 옮깁니다. - 핵심 2
출력 분포를 고릅니다. 균등분포는 보통 0과 1 사이, 정규분포는 가우시안 모양으로 대응시킵니다. - 핵심 3
학습 범위를 지켜야 합니다. 분위수 기준은 학습 데이터에서만 구하고 검증·추론에 그대로 재사용합니다.
이 글에서 다룰 내용
- 분위수 변환과 QuantileTransformer의 한 문장 정의
- 다섯 숫자의 순위로 보는 쉬운 예시
- 경험적 누적분포와 목표 분포를 연결하는 원리
- 균등분포와 정규분포 출력의 차이
- 파워 변환·표준화·로버스트 스케일링과의 차이
- 이상치가 있는 AI 특징에 적용하는 실전 방법
- 분위수 수·범위 밖 값·데이터 누수 점검법
분위수 변환을 한 문장으로 정의하면 무엇인가요?
분위수 변환은 각 수치 특징의 경험적 누적분포를 학습하고, 원래 값을 같은 누적 확률을 가진 목표 분포의 값으로 바꾸는 순위 기반 비선형 변환입니다. scikit-learn의 QuantileTransformer는 목표 분포로 균등분포와 정규분포를 제공합니다.
경험적 누적분포는 학습 표본 가운데 현재 값보다 작거나 같은 값이 어느 정도인지 나타냅니다. SciPy 문서는 관측값이 정확히 측정된 표본에서 경험적 누적분포가 관측 지점마다 표본 수의 역수만큼 계단식으로 증가한다고 설명합니다. 분위수 변환은 이 누적 위치를 새 척도의 좌표로 사용합니다.
이 방식은 평균·표준편차 같은 몇 개의 모수로 곡선을 정하지 않습니다. 학습 표본에서 여러 분위수 기준점을 저장하고 그 사이를 대응시키므로 비모수 변환이라고 부릅니다. 원래 값의 순서는 대체로 유지하지만 값 사이 거리는 크게 달라질 수 있습니다.
한 줄 정리: 분위수 변환은 숫자의 절대 크기보다 학습 데이터 안에서의 누적 위치를 새 값으로 바꿉니다.
쉬운 예시로 이해해 볼까요?
AI 모델에 넣을 구매 금액이 10, 20, 30, 40, 50이라고 가정해 보겠습니다. 다섯 값을 작은 순서로 놓으면 각각 최하위, 25%, 50%, 75%, 최상위에 해당하는 위치를 잡을 수 있습니다.
균등분포 출력으로 대응시키면 개념적으로 0, 0.25, 0.5, 0.75, 1처럼 바뀝니다. 10과 20의 원래 차이도 10이고 40과 50의 차이도 10이지만, 새 값에서는 모두 같은 분위수 간격을 갖습니다. 실제 구현은 설정한 분위수 기준점과 보간 규칙을 사용합니다.
이제 새 구매 금액 60이 들어오면 학습 때 본 최댓값 50을 넘습니다. scikit-learn QuantileTransformer는 학습 범위보다 큰 새 값을 출력 분포의 위쪽 경계로, 더 작은 값은 아래쪽 경계로 보냅니다. 60과 100이 같은 끝값에 붙을 수 있어 극단값 사이 차이가 사라집니다.
쉬운 예시: 원래 금액표를 그대로 쓰는 대신, 전체 줄에서 몇 번째에 서 있는지를 0부터 1까지의 자리표로 바꾸는 것과 비슷합니다.
왜 AI에서 분위수 변환이 중요한가요?
치우친 특징을 같은 목표 분포로 맞춥니다
조회 수, 거래 금액, 응답 시간처럼 일부 값만 매우 큰 특징은 한쪽 꼬리가 길어집니다. 분위수 변환은 특징별 경험적 누적분포를 이용해 서로 다른 모양을 균등분포나 정규분포로 대응시킵니다. 같은 목표 분포를 쓰면 척도가 다른 특징을 직접 비교하기 쉬워질 수 있습니다.
주변 이상치의 간격을 강하게 줄입니다
scikit-learn은 분위수 변환을 주변 이상치의 영향을 줄이는 견고한 전처리로 설명합니다. 극단값과 일반값 사이의 큰 수치 간격이 순위 간격으로 압축되기 때문입니다. 다만 이상치가 삭제되는 것은 아니며 끝 경계에 몰리면 정상값과 구분하기 어려워질 수 있습니다.
비선형 모델 입력 후보를 넓힙니다
거리나 기울기에 민감한 모델에서는 한 특징의 큰 수치 범위가 계산을 지배할 수 있습니다. 분위수 변환은 그런 특징을 비교 가능한 척도로 바꾸는 후보입니다. 트리 기반 모델처럼 임의의 스케일 변화에 비교적 견고한 모델에서는 이득이 작을 수 있으므로 검증 결과로 결정해야 합니다.
핵심 인사이트: 분위수 변환은 이상치를 지우는 기술이 아닙니다. 극단적인 원래 간격을 학습 표본의 순위 간격으로 바꾸는 기술입니다.
분위수 변환은 어떻게 작동하나요?
1. 데이터를 먼저 학습·검증·테스트로 나눕니다
분위수 기준을 구하기 전에 데이터 역할을 나눕니다. 전체 데이터에서 순위를 계산하면 검증과 테스트 분포가 전처리에 섞여 평가가 낙관적으로 보일 수 있습니다. 교차 검증에서도 각 폴드의 학습 부분에만 변환기를 fit해야 합니다.
2. 특징별 분위수 기준점을 계산합니다
각 열에서 정한 수의 분위수를 계산해 원래 값의 기준점을 만듭니다. scikit-learn의 n_quantiles는 경험적 누적분포를 근사할 기준점 수입니다. 설정값이 학습 표본 수보다 크면 실제 분위수 수는 표본 수로 줄어듭니다.
3. 원래 값을 누적 확률로 바꿉니다
새 값이 저장된 기준점 사이 어디에 놓이는지 찾아 0부터 1 사이의 누적 위치로 대응시킵니다. 같은 값이 반복되면 동일값 처리와 보간 방식이 결과에 영향을 줄 수 있습니다. 단순한 순번 나누기와 완전히 같다고 생각하지 않는 편이 안전합니다.
4. 목표 분포의 분위수 함수로 옮깁니다
균등분포를 선택하면 누적 위치 자체가 출력값이 됩니다. 정규분포를 선택하면 같은 누적 위치를 표준 정규분포의 분위수에 대응시킵니다. 가운데 값은 0 부근으로, 양쪽 꼬리는 음수와 양수 방향으로 배치됩니다.
5. 학습한 기준을 저장해 재사용합니다
저장할 대상에는 특징별 quantiles_, references_, 특징 이름과 순서, 출력 분포, 분위수 수와 표본 추출 설정이 포함됩니다. 운영 입력에서는 새로 fit하지 않고 transform만 실행합니다. 모델과 변환기 버전을 함께 배포해야 학습과 추론의 계산이 같아집니다.
한 줄 정리: 데이터 분리 → 특징별 분위수 계산 → 누적 위치 변환 → 목표 분포 대응 → 기준 저장·재사용 순서입니다.
균등분포와 정규분포 출력은 무엇이 다른가요?
균등분포는 순위를 0과 1 사이에 펼칩니다
output_distribution을 uniform으로 두면 학습 데이터의 각 분위수가 0부터 1 사이에 고르게 놓이도록 변환합니다. 원래 단위와 범위는 사라지고 상대적 위치가 새 척도가 됩니다. 최솟값과 최댓값 부근에는 경계 포화가 생길 수 있습니다.
정규분포는 같은 순위를 가우시안 값으로 옮깁니다
normal을 선택하면 누적 위치를 정규분포의 역누적분포 함수에 넣어 가운데는 촘촘하고 꼬리는 길게 배치합니다. 분포 모양이 정규분포처럼 보이게 만들 수 있지만 원래 데이터가 정규적이라는 사실을 증명하는 것은 아닙니다.
목표 분포는 모델과 검증 결과로 고릅니다
균등 출력과 정규 출력 가운데 항상 우월한 선택은 없습니다. 같은 학습 분할, 모델, 평가 지표에서 원본과 두 출력을 비교해야 합니다. 분포 그림만 보고 선택하면 업무 지표가 나빠지는 변환을 놓칠 수 있습니다.
실전 팁: 목표 분포 이름보다 변환 뒤 포화 비율, 검증 성능, 거리와 상관관계의 변화를 함께 기록하세요.
헷갈리는 전처리와 무엇이 다른가요?
파워 변환과의 차이
파워 변환은 Box-Cox나 Yeo-Johnson 계열에서 특징별 람다를 추정하는 매개변수 방식입니다. 분위수 변환은 표본의 경험적 누적분포와 여러 기준점을 쓰는 비모수 방식입니다. scikit-learn 예시는 분위수 변환이 작은 데이터에서 과적합하기 쉬워 파워 변환을 권할 수 있다고 설명합니다.
표준화와의 차이
표준화는 평균을 빼고 표준편차로 나누는 선형 변환입니다. 중심과 척도를 바꾸지만 순위 간격과 분포의 기본 모양은 유지합니다. 분위수 변환은 비선형이라 분포 모양과 값 사이 거리를 적극적으로 바꿉니다.
로버스트 스케일링과의 차이
로버스트 스케일링은 중앙값을 빼고 IQR 같은 분위수 범위로 나눕니다. 소수의 극단값이 중심과 척도 통계를 흔드는 정도를 줄이지만 이상치 자체와 원래 간격은 남습니다. 분위수 변환은 극단값까지 정한 출력 범위에 대응시켜 끝값 포화를 만들 수 있습니다.
최소-최대 스케일링과의 차이
최소-최대 스케일링은 학습 최솟값과 최댓값으로 선형 범위를 맞춥니다. 원래 간격의 비율은 유지되므로 큰 이상치가 있으면 일반값이 좁은 구간에 몰립니다. 분위수 변환은 순위 기준이라 일반값을 더 넓게 펼칠 수 있지만 거리 정보는 달라집니다.
클리핑과의 차이
클리핑은 정한 상한과 하한 밖의 값을 경계값으로 잘라냅니다. 분위수 변환은 모든 값을 누적 위치로 바꾸는 과정에서 학습 범위 밖의 새 값이 경계에 붙습니다. 결과가 비슷해 보이는 구간이 있어도 목적과 전체 계산은 다릅니다.
비교 정리: 표준화는 평균·표준편차, 로버스트 스케일링은 중앙값·IQR, 최소-최대는 양 끝값, 파워 변환은 람다 곡선, 분위수 변환은 경험적 순위를 기준으로 삼습니다.
실전에서는 어디에 쓰이나요?
거래 금액과 구매 횟수 특징
대부분은 작고 일부만 매우 큰 금액이나 횟수 특징에 후보가 됩니다. 분위수 변환 전후로 이상 거래나 대형 고객처럼 극단값 자체가 중요한 신호가 약해지지 않았는지 확인해야 합니다. 끝값이 같은 출력으로 포화되면 별도 극단값 표시 특징이 필요할 수 있습니다.
응답 시간과 센서 지표
응답 시간, 처리량, 고장 간격처럼 긴 꼬리를 가진 운영 지표를 모델 입력으로 쓸 때 비교할 수 있습니다. 시간 순서가 있는 데이터는 미래 구간을 포함하지 말고 과거 학습 구간에서만 분위수를 계산합니다. 계절 변화로 범위 밖 값이 늘어나는지도 모니터링합니다.
거리 기반 모델과 선형 모델의 전처리
k-최근접 이웃, 커널 모델, 선형 모델처럼 척도와 거리에 민감한 알고리즘에서 후보가 됩니다. 다만 선형 상관관계와 거리 자체가 왜곡될 수 있으므로 원본·표준화·파워 변환과 같은 분할에서 비교합니다. 모델 성능뿐 아니라 설명 가능성도 함께 봅니다.
서로 다른 단위의 특징 비교
금액, 횟수, 시간처럼 단위가 다른 여러 특징을 공통 목표 분포에 놓을 수 있습니다. 이것이 각 특징의 업무 중요도를 같게 만든다는 뜻은 아닙니다. 변환 뒤에도 특징 선택, 규제, 모델 구조가 최종 영향력을 결정합니다.
실전 팁: 원본 특징을 버리기 전에 변환기와 모델을 하나의 Pipeline으로 묶고 교차 검증으로 전처리 후보를 비교하세요.
적용 전후를 어떻게 점검하나요?
1. 표본 수와 고유값 수를 확인합니다
특징마다 학습 표본 수, 고유값 수, 반복값 비율과 결측 비율을 봅니다. 고유값이 거의 없는 열은 많은 분위수 기준점을 두어도 정보가 늘지 않습니다. 작은 데이터에서는 경험적 분포를 지나치게 세밀하게 외울 위험도 커집니다.
2. 분위수 수와 표본 추출 설정을 기록합니다
n_quantiles가 너무 적으면 계단이 거칠어지고 너무 많다고 언제나 좋아지는 것은 아닙니다. 대규모 데이터에서는 subsample로 일부 표본만 써 분위수를 추정할 수 있습니다. 재현 가능한 비교가 필요하면 random_state와 표본 추출 여부를 함께 저장합니다.
3. 학습 데이터에만 fit했는지 확인합니다
검증·테스트 데이터의 순위가 분위수 기준 계산에 들어가지 않았는지 검사합니다. Pipeline과 교차 검증을 사용하면 각 학습 폴드 안에서만 fit하도록 묶을 수 있습니다. 누수는 코드 오류 없이 평가 수치만 좋아 보이게 만듭니다.
4. 포화와 분포 변화를 측정합니다
변환 결과에서 아래쪽·위쪽 경계에 붙은 값의 비율을 데이터 구간별로 확인합니다. 운영 데이터에서 이 비율이 갑자기 늘면 학습 범위를 벗어난 입력이 많아졌다는 신호일 수 있습니다. 원본 분위수와 변환 후 히스토그램도 함께 남깁니다.
5. 거리·상관관계·역변환을 시험합니다
분위수 변환 전후의 특징 간 상관관계와 사례 간 거리가 얼마나 달라졌는지 봅니다. 작은 고정 배열을 transform한 뒤 inverse_transform해 예상한 범위로 돌아오는지도 시험합니다. 특징 이름과 열 순서가 바뀌면 다른 열의 분위수 기준이 적용될 수 있습니다.
한 줄 정리: 표본·고유값 → 분위수 설정 → fit 범위 → 경계 포화 → 거리·상관·역변환 순서로 점검합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 작은 데이터에서 분포를 과하게 맞추지 않습니다. scikit-learn 예시는 수백 개보다 적은 작은 데이터에서 분위수 변환이 과적합하기 쉽다고 경고합니다. 분위수 수를 줄이고 파워 변환과 검증 결과를 비교하세요.
둘째, 범위 밖 값의 포화를 숨기지 않습니다. 학습 최솟값보다 작거나 최댓값보다 큰 새 값은 출력 경계에 붙습니다. 운영 구간별 포화 비율을 기록하고, 중요한 극단값 정보가 사라지면 별도 처리 방식을 검토합니다.
셋째, 거리와 선형 상관관계가 보존된다고 생각하지 않습니다. 순서는 유지돼도 간격은 달라집니다. 거리 기반 군집, 유사도 계산, 선형 계수 해석이 달라질 수 있으므로 전후 결과를 따로 확인합니다.
넷째, 희소 행렬의 0 처리 설정을 확인합니다. scikit-learn의 ignore_implicit_zeros는 희소 행렬의 암묵적 0을 분위수 계산에서 제외할지 정합니다. 같은 데이터를 조밀 행렬과 희소 행렬로 넣었을 때 설정이 다르면 결과도 달라질 수 있습니다.
다섯째, 결측값과 특징 순서를 관리합니다. scikit-learn QuantileTransformer는 NaN을 fit에서 제외하고 transform 결과에는 유지합니다. 결측 대체 순서, 열 이름, 자료형과 변환기 버전을 모델과 함께 고정합니다.
주의: 분위수 변환은 데이터 오류를 고치지 않습니다. 단위 혼합, 잘못된 0, 중복 기록, 미래 정보 누수와 집단 혼합은 변환 전에 원인을 찾아야 합니다.
자주 묻는 질문
Q1. 분위수 변환과 QuantileTransformer는 같은 말인가요?
분위수 변환은 순위와 누적분포를 이용하는 일반적인 전처리 개념입니다. QuantileTransformer는 scikit-learn의 구현 이름입니다. 다른 라이브러리는 분위수 계산, 보간, 동일값 처리와 범위 밖 값 처리 규칙이 다를 수 있습니다.
Q2. 균등분포와 정규분포 중 무엇을 고르면 되나요?
모델과 데이터에 따라 다릅니다. 두 출력과 원본 전처리를 같은 학습 분할과 평가 지표에서 비교하세요. 히스토그램이 보기 좋은 선택보다 검증 성능, 포화 비율, 해석 가능성이 맞는 선택이 우선입니다.
Q3. 분위수 변환을 하면 이상치가 사라지나요?
아닙니다. 원래 관측치는 남고 출력값의 간격만 크게 줄어듭니다. 학습 범위를 벗어난 값은 경계에 모여 서로 구분하기 어려워질 수 있습니다. 측정 오류와 드문 정상 사례를 먼저 나눠 봐야 합니다.
Q4. 새 데이터가 들어올 때마다 분위수를 다시 계산하나요?
아닙니다. 운영 입력에는 학습 데이터에서 저장한 분위수 기준과 목표 분포를 적용합니다. 분포가 크게 달라졌다면 즉석에서 변환기만 다시 fit하지 말고 새 전처리와 모델을 함께 학습·평가한 뒤 버전으로 배포합니다.
Q5. 분위수 변환은 정규화를 대신하나요?
목적에 따라 일부 역할은 겹치지만 같은 연산은 아닙니다. L1·L2 정규화는 각 샘플 벡터의 노름을 맞추고, 표준화는 특징의 평균과 표준편차를 맞춥니다. 분위수 변환은 각 특징의 경험적 분포를 목표 분포에 대응시킵니다.
출처
마무리
분위수 변환은 학습 표본의 경험적 누적분포를 이용해 수치 특징을 균등분포나 정규분포에 대응시키는 비모수 전처리입니다. 이상치의 큰 간격을 줄이고 서로 다른 특징을 공통 척도에 놓을 수 있지만, 거리와 선형 상관관계를 바꾸며 범위 밖 값에는 경계 포화를 만듭니다.
실전에서는 데이터를 먼저 나누고 학습 부분에만 fit한 뒤 분위수 기준, 목표 분포, 표본 추출 설정과 특징 순서를 모델과 함께 저장하세요. 원본·표준화·파워 변환과 같은 조건에서 비교하고 포화 비율, 검증 성능, 상관관계와 역변환까지 확인해야 실제 AI 파이프라인에 맞는지 판단할 수 있습니다.
