기본 콘텐츠로 건너뛰기

지니지수 (Gini coeffiecient)의 계산

의사결정나무(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. 경제학의 지니계수가 높다는 건 무조건 나쁜 신호인가요?
일반적으로 지니계수가 높을수록 소득 불평등이 크다는 의미로 해석되지만, 국가별 인구 구조, 과세 전/후 기준 등에 따라 해석이 달라질 수 있어 단순 비교에는 주의가 필요합니다. (이 부분은 본 글의 범위를 벗어나는 경제학적 논의이므로 [미확인]으로 표시합니다.)

참고문헌

  1. Wikipedia, "Lorenz curve" - 로렌츠 곡선과 지니계수의 정의 및 기하학적 의미 (완전평등선과 로렌츠 곡선 사이 면적 비율)
  2. arXiv:2504.04518, "On the bias of the Gini coefficient estimator for zero-truncated Poisson distributions" - 지니계수의 평균차이(mean-difference) 기반 통계적 정의
  3. Habiba Isah, "Gini Impurity: A Comprehensive Guide for Decision Trees", Medium - 머신러닝 지니 불순도의 범위가 클래스 개수(C)에 따라 [0, (C-1)/C]로 정해진다는 내용
  4. Towards Data Science, "Under the Hood: Using Gini impurity to your advantage in Decision Tree Classifiers" - 지니 불순도 최댓값이 1-(1/C)로 클래스 개수에 따라 달라진다는 설명 및 예시
  5. GeeksforGeeks, "Gini Coefficient" - 이진 분류에서 지니지수 범위(0~0.5)와 CART/scikit-learn에서의 활용

댓글

이 블로그의 인기 게시물

PyMOL 명령어 정리: 논문·발표용 이미지 스크립트까지 한 번에

PyMOL 명령어 정리: 논문·발표용 이미지 스크립트까지 한 번에 지난 PyMOL 설치·마우스 조작 글에 대한 반응이 예상보다 컸습니다. 설치는 끝냈고 화면도 어느 정도 돌려봤는데, 그다음이 막막하다는 분들이 많았습니다. 커맨드 라인에 뭘 쳐야 할지 몰라 결국 캡처 화면만 들고 보고서를 쓰거나, 어디서 복사해온 스크립트를 그대로 붙여 넣었다가 에러 메시지만 보고 포기하는 경우입니다. 이번 글은 그 다음 단계, 즉 실제로 자주 쓰는 명령어와 논문·발표용 이미지를 뽑아내는 스크립트를 정리합니다. 다만 인터넷에 떠도는 PyMOL 스크립트 중에는 예전 버전 문법이거나, 애초에 존재하지 않는 세팅 이름이 섞여 있는 경우가 적지 않습니다. 그래서 이 글에 실린 모든 명령어는 PyMOL 공식 문서와 PyMOL Wiki를 기준으로 하나씩 확인한 뒤 실었습니다. 확인 과정에서 실제로 동작하지 않는 표현 3곳을 발견해 수정했고, 어떤 부분이 왜 틀렸는지는 별도로 짚어두었습니다. 1. 화면 제어 및 구조 불러오기 커맨드 라인은 화면 하단에 있습니다. 아래 명령어들은 세션을 시작할 때 거의 매번 쓰게 되는 기본기입니다. PDB 구조 불러오기 : fetch 1tup — 인터넷에서 해당 PDB ID의 구조를 바로 내려받아 표시합니다. 배경색 변경 : bg_color white — 논문·발표 자료는 흰 배경이 기본입니다. 화면 정렬/초기화 : orient — 구조 전체가 화면에 꽉 차도록 각도와 확대 비율을 자동으로 맞춥니다. zoom 은 현재 각도를 유지한 채 확대 비율만 조정한다는 점에서 차이가 있습니다. 특정 부위로 확대 : zoom resi 150 — 150번 잔기를 중심으로 확대합니다. 도킹 부위나 특정 변이 위치를 자세히 볼 때 유용합니다. 2. 표시 방식과 컬러링 리본형(2차 구조 강조) : show cartoon 막대형(원자·결합 강조) : show sticks 공간 채움형 : show spheres 표면형 : show ...

PyMOL 설치 방법부터 마우스 사용법까지 — AI 신약개발 시대 분자 시각화 입문 가이드

"AI가 신약을 설계해준다"는 말은 이제 뉴스 헤드라인이 아니라 실험실의 일상이 되었습니다. 알파폴드 같은 단백질 구조 예측 모델이 구조 데이터를 쏟아내면서, 그 결과물을 사람이 눈으로 확인하고 해석하는 능력은 오히려 더 중요해졌습니다. 그 확인 작업의 표준 도구가 바로 PyMOL입니다. 그런데 막상 PyMOL을 처음 켜본 분들의 반응은 대체로 비슷합니다. 마우스를 드래그했는데 분자가 움직이는 줄 알았더니 사실은 화면(카메라)이 돌아간 것이고, 어떤 때는 또 분자 자체가 진짜로 움직여서 구조가 깨진 것처럼 보이기도 합니다. 단축키를 몰라서 우왕좌왕하다가 그냥 캡처 화면만 들고 보고서를 쓰는 경우도 많습니다. 이 글에서는 컴퓨터 비전공자도 따라 할 수 있도록 PyMOL 설치부터, 가장 많이 헷갈리는 마우스 동작의 원리, 실전 사용법까지 순서대로 정리합니다. PyMOL이 AI 신약개발 시대에 필수가 된 이유 PyMOL은 단백질, 핵산, 저분자 화합물 같은 생체분자의 3차원 구조를 시각화하는 프로그램입니다. 단순히 "예쁜 그림"을 만드는 도구가 아니라, 결합 부위의 형태를 확인하고 화합물이 들어갈 공간을 가늠하고 변이가 일어난 자리를 짚어내는 분석 도구입니다. 요즘 AI 신약개발 파이프라인은 보통 이런 흐름을 따릅니다. AI 모델이 단백질 구조를 예측하거나 결합 후보 화합물을 제안하면, 연구자가 그 결과를 분자 시각화 프로그램으로 열어 타당성을 검토합니다. 예측이 그럴듯해 보이는지, 입체 장애는 없는지, 알려진 결합 부위와 일치하는지를 눈으로 확인하는 단계가 빠지지 않습니다. 그 검증 단계에 PyMOL이 사실상 업계 표준으로 쓰이고 있어서, 생물학이나 제약 전공자라면 코딩 경험이 없어도 PyMOL 사용법 정도는 익혀두는 편이 유리합니다. PyMOL 설치, 두 가지 무료 경로 중 나에게 맞는 것 고르기 PyMOL은 신기하게도 "무료"라는 말이 두 가지 다른 의미로 쓰입니다. 어떤 경로로 받느냐에 따...

CQA(Critical Quality Attribute)란 무엇인가: 바이오의약품 CMC에서 "관리해야 할 것"을 정하는 방식

CQA(Critical Quality Attribute)란 무엇인가: 바이오의약품 CMC에서 "관리해야 할 것"을 정하는 방식 시험 목록을 보다 보면 이런 의문이 듭니다. "이 시험은 왜 하는 거지?" SEC-HPLC로 Aggregation을 보고, CEX로 Charge Variant를 보고, ELISA로 HCP를 보는데, 정작 "왜 이 항목들을 관리해야 하는가"에 대한 답은 문서 어디에도 명확히 적혀 있지 않은 경우가 많습니다. 이 질문에 답하는 개념이 바로 CQA, Critical Quality Attribute입니다. 이전 글 RACI Matrix: 바이오·제약 CMC 조직에서 의사결정이 꼬이는 진짜 원인 에서는 "누가 결정하는가"를 다뤘다면, 이번 글은 그 결정의 대상, 즉 "무엇을 관리해야 하는가"를 다룹니다. CQA는 시험 항목을 나열한 표가 아니라, 제품 품질과 환자 안전을 연결하는 과학적 의사결정 체계입니다. CQA란 무엇인가 ICH Q8(R2)에서는 CQA를 이렇게 정의합니다. "제품이 요구되는 품질, 안전성, 유효성을 확보하기 위해 적절한 한계, 범위 또는 분포 내에서 관리되어야 하는 물리적, 화학적, 생물학적 또는 미생물학적 특성 또는 성질" 풀어 말하면 이렇습니다. CQA = 제품의 품질 특성 중, 변화가 생겼을 때 환자에게 미치는 영향을 고려해 반드시 관리해야 하는 핵심 특성 항체(mAb) 제품을 예로 들면, 하나의 분자 안에도 관리 가능한 특성이 수십 가지 존재합니다. 품질 특성 대표 시험 Primary structure Peptide mapping Aggregation SEC-HPLC Charge variant CEX-HPLC Glycosylation LC-MS Potency Cell-based assay Host Cell Protei...