의사결정나무(Decision Tree)를 공부하다 보면 가장 먼저 만나는 개념이 지니지수(Gini Index)입니다. 그런데 같은 이름의 "지니계수"가 경제학 뉴스에서 소득 불평등을 설명할 때도 등장합니다. 두 개념이 정말 같은 것일까요? 직접 손으로 계산해보고, 자주 헷갈리는 부분까지 한 번에 정리해보겠습니다.
지니지수란 무엇인가
지니지수는 한 노드(또는 그룹) 안에 있는 데이터가 얼마나 여러 클래스로 섞여 있는지, 즉 불순도(impurity)를 나타내는 값입니다. 의사결정나무가 데이터를 어떤 기준으로 나눌지 결정할 때, 분할 후 자식 노드들의 지니지수가 최대한 낮아지는 방향을 선택합니다.
공식은 다음과 같습니다.
Gini = 1 - Σ(p_i)² (i = 1부터 k까지, k는 클래스 개수, p_i는 클래스 i의 비율)
값이 0에 가까울수록 한 클래스로 순수하게 모여 있다는 뜻이고, 값이 커질수록 여러 클래스가 고르게 섞여 있다는 뜻입니다.
직접 계산해보기: 두 데이터셋 비교
아래 두 데이터셋으로 직접 계산해보면 개념이 훨씬 명확해집니다.
데이터셋 1: A B C A C C A D (총 8개)
A=3개, B=1개, C=3개, D=1개로 구성되어 있습니다.
1 - (3/8)² - (1/8)² - (3/8)² - (1/8)² = 1 - 0.140625 - 0.015625 - 0.140625 - 0.015625 = 0.6875 (약 0.69)
데이터셋 2: A B B A B B A A (총 8개)
A=4개, B=4개로 구성되어 있습니다.
1 - (4/8)² - (4/8)² = 1 - 0.25 - 0.25 = 0.5
두 값을 비교하면 데이터셋 2의 지니지수가 더 낮습니다. 하지만 여기서 주의할 점이 있습니다. 이 비교는 절대적인 "순수함의 정도"를 직접 비교하는 것이 아니라, 클래스 개수 자체가 다른 두 상황을 비교하고 있다는 사실입니다.
가장 많이 헷갈리는 부분: 지니지수는 1에 도달하지 않는다
"지니지수가 1에 가까울수록 완전히 다르다"는 표현은 직관적으로 이해하기 쉽지만, 정확하지는 않습니다. 지니지수의 최댓값은 클래스 개수(C)에 따라 달라지며, 1 - (1/C)로 정해집니다.
- 클래스가 2개일 때 (예: Yes/No) → 최댓값은 1 - 1/2 = 0.5
- 클래스가 3개일 때 → 최댓값은 1 - 1/3 = 0.667
- 클래스가 4개일 때 → 최댓값은 1 - 1/4 = 0.75
클래스가 무한히 많아져야 이론상 1에 근접할 수 있을 뿐, 실제 데이터셋에서는 거의 도달하지 않는 값입니다. 그래서 위 데이터셋 1(클래스 4개, 지니지수 0.69)과 데이터셋 2(클래스 2개, 지니지수 0.5)를 비교할 때, "데이터셋 2가 절대적으로 더 순수하다"라고 단정하기보다는 "각자의 클래스 구도 안에서 데이터셋 2가 최댓값(0.5)에 도달한 상태, 즉 그 조건에서는 가장 불순한 상태"라고 이해하는 것이 더 정확합니다. 실제로 의사결정나무에서 분할 전후를 비교할 때는 같은 클래스 집합을 기준으로 부모 노드와 자식 노드의 지니지수를 비교하기 때문에 이 차이가 중요해집니다.
의사결정나무에서는 어떻게 쓰이나
실무에서는 지니지수를 노드 하나만 보고 끝내지 않습니다. 분할 후 생긴 자식 노드들의 지니지수를 데이터 개수 비중으로 가중평균한 뒤, 분할 전 지니지수와 비교해서 불순도가 얼마나 줄었는지를 봅니다.
Gini_split = Σ (n_j / n) × Gini_j
이 값이 가장 크게 줄어드는(즉, Gini Gain이 가장 큰) 분할 기준을 선택해 나무를 키워나갑니다. CART(Classification and Regression Trees) 알고리즘이 기본적으로 이 방식을 사용하며, scikit-learn의 DecisionTreeClassifier에서도 기본 분할 기준으로 지니지수를 채택하고 있습니다. 로그 연산이 필요한 엔트로피(Entropy)보다 계산이 가볍다는 점도 실무에서 지니지수가 널리 쓰이는 이유 중 하나입니다.
그래서 경제학의 지니계수와는 뭐가 다른가
여기서부터가 핵심입니다. 이름이 같고 0~1 사이라는 직관도 비슷하지만, 계산 방식 자체가 완전히 다른 개념입니다.
| 구분 | 머신러닝 지니지수 (불순도) | 경제학 지니계수 (불평등) |
|---|---|---|
| 측정 대상 | 노드 안 클래스의 혼합 정도 | 소득/자산 분배의 불평등 정도 |
| 계산 방법 | 1 - Σp_i² (클래스 비율의 제곱합) | 로렌츠 곡선과 완전평등선 사이 면적 비율 |
| 값의 범위 | 0 ~ 1-(1/C) (클래스 개수에 따라 가변) | 0(완전 평등) ~ 1(완전 불평등) |
| 0의 의미 | 한 클래스로만 구성(완전 순수) | 모든 사람이 동일한 소득(완전 평등) |
경제학의 지니계수는 1905년 막스 로렌츠(Max O. Lorenz)가 제안한 로렌츠 곡선에서 출발합니다. 인구를 소득이 낮은 순서부터 누적시켜 X축에, 그 누적 인구가 차지하는 소득의 누적 비율을 Y축에 그린 곡선이 로렌츠 곡선이며, 완전평등선과 실제 로렌츠 곡선 사이의 면적을 완전평등선과 완전불평등선 사이의 전체 면적으로 나눈 비율이 지니계수입니다. 모두가 동일한 소득을 가지면 로렌츠 곡선은 대각선이 되고 지니계수는 0이 되며, 반대로 한 사람이 모든 소득을 독점하면 곡선이 완전불평등선에 붙어 지니계수는 1에 가까워집니다.
반면 머신러닝의 지니지수(Gini impurity)는 노드 안에서 무작위로 선택한 두 데이터가 서로 다른 클래스에 속할 확률, 즉 분류 오류의 가능성을 수치화한 것으로, 애초에 분배 곡선과는 무관하게 클래스 비율의 제곱합만으로 계산됩니다. 두 지표가 "0일 때 가장 균질/평등하고 값이 커질수록 섞이거나 불평등해진다"는 직관은 공유하지만, 정의 자체는 서로 독립적으로 발전한 다른 통계 개념입니다.
실전 팁
- 클래스가 2개뿐인 이진 분류에서는 지니지수가 0.5를 넘을 수 없으므로, "0.5에 가까우면 거의 무작위 섞임"이라고 바로 판단할 수 있습니다.
- 클래스 개수가 다른 노드끼리 지니지수 값을 직접 비교할 때는 각 클래스 개수에서의 최댓값(1-1/C)을 함께 적어두면 오해를 줄일 수 있습니다.
- 엔트로피와 지니지수는 거의 비슷한 분할 결과를 내는 경우가 많지만, 지니지수가 로그 연산이 없어 더 빠르므로 대용량 데이터에서는 기본값으로 선호됩니다.
- "Gini Index"라는 용어를 다른 자료에서 볼 때, 머신러닝 글인지 경제/통계 글인지 먼저 확인하는 습관을 들이면 혼동을 피할 수 있습니다.
FAQ
Q1. 지니지수와 엔트로피 중 어떤 걸 써야 하나요?
대부분의 경우 결과 차이가 크지 않습니다. 계산 속도가 중요하면 지니지수, 정보이론적 해석이 필요하면 엔트로피를 선택하는 것이 일반적입니다.
Q2. 지니지수가 0이면 더 이상 분할이 필요 없나요?
네, 노드의 지니지수가 0이라는 것은 해당 노드의 모든 데이터가 한 클래스로만 구성되어 있다는 뜻이므로, 이론적으로는 해당 노드에서 더 분할할 필요가 없습니다.
Q3. 경제학의 지니계수가 높다는 건 무조건 나쁜 신호인가요?
일반적으로 지니계수가 높을수록 소득 불평등이 크다는 의미로 해석되지만, 국가별 인구 구조, 과세 전/후 기준 등에 따라 해석이 달라질 수 있어 단순 비교에는 주의가 필요합니다. (이 부분은 본 글의 범위를 벗어나는 경제학적 논의이므로 [미확인]으로 표시합니다.)
참고문헌
- Wikipedia, "Lorenz curve" - 로렌츠 곡선과 지니계수의 정의 및 기하학적 의미 (완전평등선과 로렌츠 곡선 사이 면적 비율)
- arXiv:2504.04518, "On the bias of the Gini coefficient estimator for zero-truncated Poisson distributions" - 지니계수의 평균차이(mean-difference) 기반 통계적 정의
- Habiba Isah, "Gini Impurity: A Comprehensive Guide for Decision Trees", Medium - 머신러닝 지니 불순도의 범위가 클래스 개수(C)에 따라 [0, (C-1)/C]로 정해진다는 내용
- Towards Data Science, "Under the Hood: Using Gini impurity to your advantage in Decision Tree Classifiers" - 지니 불순도 최댓값이 1-(1/C)로 클래스 개수에 따라 달라진다는 설명 및 예시
- GeeksforGeeks, "Gini Coefficient" - 이진 분류에서 지니지수 범위(0~0.5)와 CART/scikit-learn에서의 활용
댓글
댓글 쓰기