에너지 거리(Energy Distance)란? AI에서 표본 사이의 평균 거리로 분포 차이를 재는 방법
TL;DR
에너지 거리는 서로 다른 두 분포에서 뽑은 값 사이의 평균 거리와 각 분포 안의 평균 거리를 비교해 분포 차이를 재는 방법입니다. 이 글은 SciPy가 반환하는 제곱근 형태를 기준으로 설명합니다. 수치 자료의 분포를 비교할 때 검토하며, 제곱값·표본 수가 곱해진 검정통계량·p값을 나누어 읽어야 합니다. 이름의 에너지는 전력 사용량이나 오디오의 세기를 뜻하지 않습니다.[1][3][4]
핵심 3줄 요약
- 핵심 1
분포 사이와 내부를 함께 봅니다. 서로 다른 그룹의 쌍 평균에서 각 그룹 내부의 퍼짐을 보정합니다. - 핵심 2
제곱근 여부가 숫자를 바꿉니다. SciPy의 거리와 문헌의 제곱값, 표본 수로 가중한 통계량을 구분합니다. - 핵심 3
작은 거리도 해석이 필요합니다. 비교 공간·단위·표본 수를 남기고 실제 업무 오류와 통계 검정은 따로 확인합니다.
이 글에서 다룰 내용
- 에너지 거리의 한 문장 정의
- 두 표본의 쌍 평균으로 보는 쉬운 계산
- 분포 사이·분포 내부·누적분포의 작동 원리
- SciPy 입력과 R energy 통계량의 반환 차이
- 바서슈타인·유클리드·에너지 검정과의 구분
- 분포 점검의 실전 체크리스트
- 단위·표본 수·다차원·결측값의 주의점
에너지 거리를 한 문장으로 정의하면 무엇인가요?
에너지 거리는 두 분포 사이의 기대 거리를 각 분포 내부의 기대 거리와 비교한 뒤, 이 글의 정의에서는 제곱근을 취해 얻는 분포 거리입니다.
영문명은 Energy Distance입니다. 같은 이름으로 제곱근을 생략한 양을 부르는 문헌도 있습니다. SciPy의
energy_distance
문서는 제곱근 형태를 거리로 정의하므로 결과 열에 어떤 정의를 썼는지 적습니다.[1]
일차원에서 A와 B를 각각의 분포에서 독립적으로 뽑은 값이라고 하겠습니다. A′와 B′도 같은 각 분포에서 따로 뽑습니다. 두 분포 사이 절대 차이의 평균을 두 배 하고, A끼리와 B끼리의 절대 차이 평균을 각각 뺀 값이 거리의 제곱입니다. 내부 퍼짐까지 보아야 단순한 두 그룹 사이 평균 거리와 구분됩니다.[1]
한 줄 정리: 두 그룹 사이가 멀다는 사실에 더해 각 그룹 자체가 얼마나 퍼져 있는지도 함께 계산합니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 AI 작업에서 나온 설명용 수치 두 묶음을 비교한다고 가정해 보겠습니다. A는
[0, 2]
이고 B는
[1, 3]
입니다. 각 값에 같은 비중을 둡니다. 실제 운영 기록이나 모델 성능 측정 자료는 아닙니다.
A에서 하나, B에서 하나 고르는 모든 조합의 절대 차이는
[1, 3, 1, 1]
입니다. 합 6을 조합 수 4로 나누면 두 그룹 사이 평균은 1.5입니다. 배열의 같은 위치 두 쌍만 비교하는 계산과 다릅니다.
A 내부의 모든 순서 있는 조합은
(0,0), (0,2), (2,0), (2,2)
입니다. 절대 차이는
[0, 2, 2, 0]
이므로 평균은 1입니다. B 내부도 같은 방식으로 1입니다. 자기 자신과 짝지은 차이 0도 포함해 분모를 4로 둡니다.
거리의 제곱은
2×1.5 - 1 - 1 = 1
이고 제곱근인 거리는 1입니다. 한 점씩만 있는
[0]
과
[2]
에서는 내부 차이가 모두 0이라 제곱값은 4, 거리는 2가 됩니다. 첫 예시만 보면 제곱근 차이가 가려지므로 두 예시를 함께 확인합니다.
위 수치는 Python 표준 라이브러리로 모든 쌍의 가중평균과 누적분포 계산을 따로 구현해 검산했습니다. SciPy나 R 함수를 실행한 결과는 아닙니다. 입력 교환·공통 이동·배율 변경·동일 분포와 가중치 정규화도 설명용 배열로 확인했습니다.
쉬운 예시: 표본의 순서는 바뀌어도 분포는 같습니다. 원소별 오차를 더하는 대신 가능한 모든 쌍과 각 그룹의 내부 퍼짐을 봅니다.
왜 AI에서 에너지 거리가 중요한가요?
평균이 같은 분포의 차이를 살핍니다
A가
[-1, 1]
이고 B가
[0, 0]
이면 평균은 모두 0입니다. 두 그룹 사이 평균 차이는 1, 내부 평균은 각각 1과 0이어서 에너지 거리는 1입니다. 중심이 같아도 퍼짐이 다르다는 작은 계산 예시입니다. 평균값 한 개만 비교할 때 놓치는 차이를 검토합니다.
수치 입력의 분포 점검에 활용합니다
AI 입력 길이·센서 측정값·처리 시간처럼 간격에 의미가 있는 값을 기간별로 비교하는 설계를 생각해 볼 수 있습니다. 이는 정의를 적용한 활용 예시입니다. 특정 감시 제품의 기본 지표라거나 모델 정확도 개선을 입증한 결과도 아닙니다.
핵심 인사이트: 거리의 계산 규칙과 데이터 변화의 원인은 별개입니다. 점수가 커지면 원래 분포와 수집 조건, 실제 업무 오류로 돌아가 확인합니다.
에너지 거리는 어떤 순서로 계산하나요?
1. 분포 사이의 평균 거리를 구합니다
두 표본에서 하나씩 고른 모든 쌍의 절대 차이를 평균합니다. 균등한 n개와 m개 표본이라면 쌍은 n×m개입니다. 가중치가 있으면 각 분포에서 정규화한 두 확률의 곱이 쌍의 비중입니다. 한쪽에 관측이 많다고 그 분포 전체의 확률이 더 커지는 계산은 아닙니다.[1]
2. 각 분포 내부의 평균을 뺍니다
각 그룹에서도 독립적으로 두 번 뽑는 기대값을 계산합니다. 이 글의 경험분포 계산은 자기 쌍을 포함한 모든 순서 있는 쌍을 쓰므로 내부 분모가 n² 또는 m²입니다. 서로 다른 관측끼리만 남기고 분모를 바꾸는 다른 추정식을 섞지 않습니다. 제곱근을 취하기 전 정의부터 맞춥니다.[1][3]
3. 제곱근과 누적분포 정의를 확인합니다
서로 다른 그룹의 평균을 두 배 한 뒤 두 내부 평균을 빼고 제곱근을 취합니다. 일차원에서는 두 누적분포의 세로 차이를 제곱해 가로축 전체에서 적분하고, 두 배 한 뒤 제곱근을 취하는 계산과 같습니다. 구간 폭을 생략한 세로 차이의 단순 합이 아닙니다.[1]
앞의 A와 B는 0~1과 2~3 구간에서 누적확률 차이가 0.5이고, 1~2에서는 0입니다. 제곱 적분은
0.25×1 + 0×1 + 0.25×1 = 0.5
입니다. 두 배 뒤 제곱근을 취하면 같은 거리 1이 됩니다. 확인한 SciPy 1.17.0 구현도 정렬한 값의 구간 폭과 누적확률을 이용합니다.[5]
실전 팁: 작은 자료에서는 모든 쌍의 평균과 누적분포 계산을 맞춰 보세요. 두 경로가 일치하면 분모·가중치·마지막 제곱근의 오류를 찾기 쉽습니다.
주요 입력과 반환값은 어떻게 읽나요?
values는 관측 위치이고 weights는 비중입니다
SciPy의
u_values
와
v_values
는 일차원 관측값이나 확률이 놓인 위치입니다.
u_weights
와
v_weights
는 각자 위치 배열과 길이가 같아야 합니다. 생략하면 각 관측에 같은 비중을 주며 두 표본의 관측 수가 같을 필요는 없습니다.[1]
예를 들어 위치
[0, 1, 10]
에서 건수
[1, 1, 0]
과
[1, 0, 1]
을 비교하면 에너지 거리는 약 2.121320입니다. 건수만 위치 인자로 넣으면 두 목록은 같은 0·1·1의 분포여서 거리 0이 됩니다. 실제 위치와 해당 건수를 분리해야 원하는 비교가 됩니다.
가중치의 합과 출력 척도를 구분합니다
확인한 구현은 가중치의 음수를 거부하고 합이 양수이며 유한한지 검사합니다. 각 분포의 가중치를 자기 합으로 정규화하므로 합이 처음부터 1일 필요는 없습니다. 일부 가중치 0과 전부 0인 집계는 다릅니다. 반환값은 실수 거리 하나이며 p값이나 구간별 기여 목록이 아닙니다.[1][5]
R의 edist는 표본 수로 가중한 통계량입니다
R energy의 기본
edist
는 각 행을 관측 벡터로 둔 합친 자료와 그룹 크기를 받습니다. 기본 지수 1에서 그룹 사이 유클리드 평균 거리들을 조합하고, 제곱근 대신
n×m/(n+m)
을 곱한 통계량을 반환합니다. SciPy 일차원 거리와 같은 눈금이라고 가정하지 않습니다.[3]
앞의 A와 B를 각각 두 번 반복해 표본 수를 4개씩 만들어도 경험분포와 SciPy 정의의 거리 1은 그대로입니다. 하지만 위 R 통계량의 표본 수 계수는 2가 되어 값은 2입니다. 분포 차이의 거리와 검정용 가중 통계량을 나누어 기록해야 하는 이유입니다. 이는 공식에 따른 검산이며 R 실행값은 아닙니다.
검정 함수는 별도의 결과를 반환합니다
R의
eqdist.etest
는 다변량 분포의 동일성을 검정하고 통계량과 근사 p값 등을 반환합니다. 문서는 재표집으로 근사 순열 검정을 수행한다고 설명합니다.
eqdist.e
는 통계량만 반환하므로 함수 이름이 비슷해도 결과를 동일하게 읽지 않습니다.[4]
에너지 거리와 헷갈리는 용어는 무엇이 다른가요?
바서슈타인 거리와 적분 방식이 다릅니다
바서슈타인 거리의 일차원 W1은 누적분포 차이의 절댓값을 적분합니다. 이 글의 에너지 거리는 제곱 차이 적분의 두 배에 제곱근을 취합니다. 입력 모양이 같아도 공식·단위 변환·임계값은 별개입니다.[1][2]
유클리드 거리와 비교 대상이 다릅니다
유클리드 거리는 두 점의 좌표 사이 거리를 잽니다. 에너지 거리는 두 분포를 비교하며 내부와 교차 쌍의 평균이 들어갑니다. 일차원 표본 배열을 각각 하나의 벡터로 보고 같은 번호끼리 빼면 다른 질문을 계산합니다. 다차원 energy 통계량에서 유클리드 거리는 표본 쌍을 재는 재료입니다.[3]
크래머–폰 미제스 검정과 같지 않습니다
SciPy 문서는 일차원 에너지 거리와 분포 자유형이 아닌 크래머–폰 미제스 거리의 관계를 설명합니다. 흔한 크래머–폰 미제스 기준은 다른 형태를 사용하므로 이름의 유사성만으로 통계량이나 p값을 바꾸어 쓰지 않습니다. 이 글의 거리 계산 자체는 동일 분포 가설검정을 실행하지 않습니다.[1]
비교 정리: W1은 누적 절대 차이, 이 글의 에너지 거리는 누적 제곱 차이와 제곱근을 봅니다. 표본 수가 곱해진 통계량과 검정 결과는 별도 산출물입니다.
실전에서는 어디에 쓰이나요?
기간별 수치 분포의 변화를 점검합니다
같은 단위·같은 관측 기준의 기준 기간과 현재 기간을 비교하는 지표 후보로 검토합니다. 거리 옆에 원래 분포 그림과 관측 수, 결측 수를 남깁니다. 표본 구성이 바뀌었는지와 실제 모델 오류가 늘었는지는 원자료에서 따로 확인합니다.
여러 변수의 결합분포를 검토합니다
energy 패키지는 다변량 표본의 비교를 지원합니다. 여러 열을 함께 쓰면 좌표별 척도가 유클리드 거리에 영향을 주므로 전처리 기준을 고정합니다. SciPy의 일차원 함수에 다차원 배열을 평탄화해서 같은 분석이라고 보고하지 않습니다. 각 열의 분포만 비교하면 변수 사이 관계는 가려질 수 있습니다.[3][4]
에너지 거리를 적용할 때 어떤 순서로 확인하나요?
1. 비교 공간과 입력 계약을 적습니다
하나의 관측이 문서인지 요청인지 센서 기록인지부터 정합니다. 측정 단위·집계 기간·기준 표본·전처리 버전을 기록하고 위치와 가중치를 나눕니다. 빈 자료·음수 가중치·유한하지 않은 값·누락의 처리를 계산 전에 확인합니다.
2. 작은 예시로 척도를 검산합니다
동일 분포의 0, 입력 교환의 대칭성, 한 점 이동의 제곱근, 모든 쌍의 분모를 시험합니다. 같은 관측을 반복했을 때 분포 거리와 표본 수 가중 통계량이 다르게 움직이는지도 봅니다. 사용 함수와 제곱근 여부를 결과 열 이름에 남깁니다.
3. 업무 판정과 검정 설계를 분리합니다
정상 기간 사이 변동을 먼저 살펴 경보 기준을 정하고 실제 오류와 함께 평가합니다. 순열 검정을 한다면 독립성·교환가능성과 재표집 단위를 별도로 검토합니다. 같은 사용자의 반복 기록이나 시간 순서가 있는 자료를 무조건 개별 행 단위로 섞는 절차는 피합니다. 이 부분은 적용 설계의 점검 사항입니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 단위가 바뀌면 거리의 눈금도 달라집니다. 모든 위치를 양의 배율 c만큼 바꾸면 이 글의 거리는 √c배, 제곱값은 c배입니다. 0과 2의 한 점 비교를 4배 확대해 0과 8로 바꾸면 거리는 2에서 4로 바뀝니다. 원래 단위의 이동량으로 읽지 않습니다.
둘째, 명목 범주의 번호를 위치로 쓰지 않습니다. 배송·환불·제품 같은 이름에 붙인 1·2·3의 간격은 측정 거리가 아닙니다. 범주 번호를 바꿔 분포 차이가 달라진다면 비교 공간의 근거부터 다시 살핍니다.
셋째, 작은 표본과 총량 정보는 따로 남깁니다. 각 분포를 정규화하면 같은 비율의 건수가 늘어도 거리는 같습니다. 표본에서 얻은 거리 0이 모집단까지 동일하다는 증거는 아닙니다. 이 거리 하나에 신뢰구간이나 유의확률이 들어 있지도 않습니다.
넷째, 값이 나오면 입력 검증이 끝났다고 보지 않습니다. 누락·무한값·극단값을 먼저 살피고 제거 기준을 기록합니다. 점수를 낮추려고 임의로 값을 자르지 않습니다. 큰 자료에서 모든 쌍을 직접 저장하면 메모리 부담이 커지므로 일차원 정렬 경로와 다변량 쌍별 계산의 비용도 구별합니다.[5]
주의: 거리의 크기는 오류율·변화 확률·전력량이 아닙니다. 두 분포의 수학적 비교와 AI의 품질·안전성 판정을 같은 결과로 보고하지 않습니다.
자주 묻는 질문
Q1. 에너지 거리와 그 제곱은 같은 값인가요?
같지 않습니다.
[0]
과
[2]
의 SciPy 정의 거리는 2이고 제곱값은 4입니다. 일부 문헌은 제곱값도 같은 이름으로 부르므로 수식과 반환 정의를 함께 확인합니다.[1]
Q2. 표본의 순서나 개수가 같아야 하나요?
순서나 개수가 같을 필요는 없습니다. 각 표본은 하나의 경험분포를 나타냅니다. 가중치를 주면 자기 위치 배열과 길이가 맞아야 하며, 표본 수 차이의 불확실성은 별도로 검토합니다.[1]
Q3. 히스토그램의 높이만 입력하면 되나요?
높이 자체의 분포를 비교할 수 있습니다. 구간 대표 위치를 values에, 건수나 확률 질량을 weights에 둡니다. 구간 폭이 다르면 밀도 높이와 구간 질량도 구별합니다.
Q4. SciPy 함수에 다차원 관측을 바로 넣나요?
설명한 함수는 일차원 분포용입니다. 다변량 비교에는 해당 입력을 지원하는 구현과 반환 정의를 따로 확인합니다. R의 edist는 다변량을 받지만 기본 반환값은 표본 수로 가중한 통계량입니다.[1][3]
Q5. 거리가 0.3이면 30%가 변했다는 뜻인가요?
아닙니다. 선택한 공간과 단위에서 계산한 거리입니다. p값·확률·오류율로 바꾸어 읽지 않으며 통계 검정은 별도의 함수와 설계가 필요합니다.[4]
Q6. 전력 사용량이나 오디오 에너지와 관련 있나요?
이 글은 분포 비교를 위한 통계 용어를 설명합니다. 값의 단위가 전력이나 소리 세기일 필요는 없습니다. 오디오 파워 특징이나 AI 하드웨어의 전력 소모와 혼동하지 않습니다.
출처
마무리
에너지 거리는 서로 다른 분포 사이의 평균 거리에서 각 분포 내부의 퍼짐을 보정하는 비교 방법입니다. SciPy의 제곱근 거리, 문헌의 제곱값, 표본 수를 곱한 통계량과 p값을 구분하면 같은 이름 아래 다른 숫자를 섞는 오류를 줄일 수 있습니다.
처음에는 두 값씩 있는 예시로 모든 쌍과 분모를 확인해 보세요. 실제 AI 자료에서는 관측 단위·기준 기간·가중치·표본 수를 함께 남깁니다. 분포 차이를 계산한 다음 원래 기록과 실제 업무 결과를 살피는 순서까지 지켜야 점수의 쓰임이 분명해집니다.
