KPI: 대시보드 전에 측정과 판단 정의

핵심 요약

KPI는 목표를 추적하도록 선택한 지표입니다. 숫자는 원인 진단이나 사업 가치, 보안의 증거가 아닙니다.

빈 카드가 놓인 탁자 두 개, 황동 램프와 버건디 서류철이 있는 가상의 무인 분석실
이 글의 목차

KPI는 목표를 추적하도록 선택한 지표입니다. 숫자는 원인 진단이나 사업 가치, 보안의 증거가 아닙니다.

측정 합의 기록

목적, 식, 단위, 분자, 분모, 대상, 기간을 기록합니다. 책임자와 판단을 명시합니다. 잠재 고객당 비용은 신규 고객당 비용과 다르므로 지출 범위와 결과 정의가 필요합니다.

행동 전에 변화 확인

범위, 중복, 이용 지연, 정의 변경을 확인합니다. 비율의 평균이 전체 비율은 아닐 수 있으므로 해당 건수를 사용합니다. 기준 초과는 조사의 계기이며 자동적인 원인 설명이 아닙니다. 도구는 수집 품질을 보장하지 않습니다.

검토 항목
항목기록할 확인 사항
정의식, 단위, 범위 기록
품질범위, 중복, 이용 가능성 확인
판단책임자, 행동, 한계 명시

출처와 확인

각 KPI를 계약 및 의사 결정에 연결합니다.

유용한 메트릭은 변경 사항을 정당화해야 하는 조치를 명시합니다. 목표를 설정하기 전에 공식, 모집단, 출처 및 숫자가 불완전해지는 조건을 문서화합니다. 대시보드는 정의를 정확하게 따르더라도 단위나 범위가 다르면 비즈니스 질문에 대한 답을 제공하지 못할 수 있습니다.

  • 분자, 분모 및 제외 항목을 작성합니다.
  • 이벤트에서 차트까지 알려진 사례를 확인합니다.
  • 최신 업데이트 및 아직 완료되지 않은 기간을 표시합니다.

1차 자료: Google SRE — Data Processing Pipelines. 관련 방법: 실무 가이드 읽기.

KPI에 컨텍스트를 제공합니다.

백분율 KPI에는 단위, 개수 및 기간이 필요합니다. 그렇지 않으면 동일한 값이 매우 다른 볼륨과 불확실성을 나타낼 수 있습니다.

  • 비율과 함께 분자와 분모를 공개하십시오.
  • 해석 전에 부분 수집 및 누락된 모집단을 문서화하십시오.

1차 자료: NIST/SEMATECH — Confidence intervals for proportions. 관련 방법: 실무 가이드 읽기.

데이터 조인 무결성

조인은 행을 늘려 합계를 왜곡할 수 있습니다.

  • 주문 테이블의 한 행은 주문을, 항목 테이블의 한 행은 주문 내 상품을 나타냅니다. 결합 전에 반복 키와 NULL 키를 확인합니다.
  • 주문 키별로 항목을 집계합니다. 그 결과를 주문과 결합하면 상품마다 주문 금액이 반복되지 않습니다. 원래 주문 테이블의 합계와 비교합니다.
  • LEFT JOIN은 항목이 없는 주문도 남기지만, 오른쪽 테이블에 적용한 WHERE 조건이 이를 제거할 수 있습니다. 대응 없음과 금액 0은 다릅니다.

재현 가능한 수락 사례

가상 예시입니다. 고객이나 실제 관측 결과를 나타내지 않습니다.

사례 입력 보기
{
    "orders": [
        {
            "id": 1,
            "total": 100
        },
        {
            "id": 2,
            "total": 200
        }
    ],
    "line_order_ids": [
        1,
        1,
        2
    ],
    "sum_before": 300,
    "sum_after_raw_join": 400
}

예상 판단

400은 주문 하나를 중복 계산합니다. 주문별로 항목을 집계하여 300을 복원합니다. 각각 100인 가상 주문 두 건도 시험합니다. 합계는 200입니다. SUM(DISTINCT total)은 100을 반환하여 유효한 값을 제거합니다. 금액 중복 제거 대신 식별자와 조인 관계의 수를 확인합니다.

재현 가능한 SQL 쿼리

가상 예: 주문 금액 100과 200, 주문 1, 1, 2에 연결된 항목 세 개입니다. 쿼리는 VALUES만 사용하며 테스트 환경에서 실행하세요.

WITH orders(id, total) AS (VALUES (1, 100), (2, 200)),
lines(order_id) AS (VALUES (1), (1), (2))
SELECT COUNT(*) AS rows, SUM(o.total) AS total
FROM orders o JOIN lines l ON l.order_id = o.id;
WITH orders(id, total) AS (VALUES (1, 100), (2, 200)),
lines(order_id) AS (VALUES (1), (1), (2)),
per_order AS (
  SELECT order_id, COUNT(*) AS line_count
  FROM lines GROUP BY order_id
)
SELECT COUNT(*) AS orders, SUM(o.total) AS total
FROM orders o LEFT JOIN per_order l ON l.order_id = o.id;

직접 결합하면 세 행과 합계 400이 나옵니다. 먼저 집계하면 주문 두 건과 합계 300을 얻습니다.

WITH orders(id, total) AS (VALUES (1, 100), (2, 100))
SELECT SUM(total) AS correct_total,
       SUM(DISTINCT total) AS distinct_total
FROM orders;

금액이 100과 100이면 올바른 합계는 200이지만 SUM(DISTINCT total)은 100입니다.

검증 절차

  1. 주문과 항목의 세분성을 정의합니다.
  2. 두 항목을 가진 주문을 결합합니다.
  3. 키, 행 수 및 대조한 합계를 보존합니다.

PostgreSQL — Table expressions and joins

SUM(DISTINCT total)이면 충분한가요?

아닙니다. 금액 100인 주문 두 건의 합계는 200이지만 SUM(DISTINCT total)은 100을 반환합니다. 금액 중복 제거 대신 키 관계를 수정하세요.

1차 자료: PostgreSQL — Table expressions and joins. 관련 방법: 실무 가이드 읽기.