Metrics & Formulas

Veacon 이 반환하는 모든 지표의 정확한 계산식과 해석 가이드.

Last updated: 2026-04-23

Veacon 의 핵심 상품은 집계된 시장 신호 입니다. 각 지표가 정확히 어떻게 계산되는지어떻게 해석해야 하는지를 이 페이지에서 다룹니다.

이 페이지는 리서치 팀이 모델 검증할 때 referenced 되는 것을 가정하여 작성되었습니다. 문서 보고 "이거 내 보고서에 인용해도 되겠다" 수준의 명확성을 목표.


sample_size

정의: 해당 조합(region × category × period × product_type)에 포함된 고유 매물 수.

계산식:

sql
COUNT(DISTINCT listing_id) OVER (PARTITION BY region, category, period, product_type)

해석:

  • 신뢰도의 1차 지표. confidence 필드의 근거.
  • 3 미만이면 응답 자체가 반환되지 않습니다 (k-anonymity). DB CHECK constraint 로 강제.

주의: sample_sizetotal_views 보다 훨씬 작을 수 있음 (한 매물이 여러 번 조회됨). 매물 수 ≠ 트래픽.


avg_price

정의: 평균 가격. 단위는 원(KRW). rental 은 월세, meeting 은 시간당 단가.

계산식:

sql
AVG(COALESCE(discounted_price, price))

해석:

  • discounted_price 우선 — 실제 거래가 근사치
  • 고가 이상치(outlier)에 민감 → median_price 와 비교 필수

사용 예:

  • 단순 비교 (강남권 vs 도심권) 는 OK
  • 정확한 시장가 추정은 median_priceprice_p50 권장

median_price (P50)

정의: 50 percentile. 가격 분포의 중간값.

계산식:

sql
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY COALESCE(discounted_price, price))

해석:

  • 이상치에 둔감 — 시장 대표가avg_price 보다 정확
  • avg_pricemedian_price 이면 상위 이상치 존재 (예: 고급 오피스 소수)
  • avg_pricemedian_price분포가 고른 시장

price_p25 / price_p75

정의: 25 / 75 percentile. IQR(Interquartile Range) 계산 용도.

계산식:

sql
PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY ...)
PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY ...)

해석:

  • p75 - p25 = IQR = 가격 변동성 지표
  • Box plot 그릴 때: min / p25 / median / p75 / max
  • IQR 이 크면 동일 권역 내 가격 편차가 큼 (예: 같은 강남권에도 신축 대 구축)

실전:

python
# 이상치를 IQR 기준으로 정의
q1 = row["price_p25"]
q3 = row["price_p75"]
iqr = q3 - q1
lower_fence = q1 - 1.5 * iqr
upper_fence = q3 + 1.5 * iqr
# row["max_price"] > upper_fence 이면 이상치 존재

min_price / max_price

정의: 극값.

해석:

  • 이상치 탐지 용도 (절대 평균 추정에 쓰지 말 것)
  • max_pricep75 * 3 이상이면 데이터 품질 점검 필요

total_views

정의: 해당 조합의 매물들이 집계 기간 내 받은 총 조회 수 합계.

계산식:

sql
SUM(product_views.view_count)

해석:

  • 수요의 raw signal
  • 직접 비교보다 demand_index 를 사용 권장 (정규화됨)

total_bookings

정의: 집계 기간 내 확정된 예약 건수.

계산식:

sql
SUM(booking_count WHERE status = 'confirmed')

해석:

  • 실제 거래 의도의 강 지표
  • total_views 대비 비율 = 전환율 (booking_conv_rate)

demand_index

정의: 같은 카테고리 내 지역별 상대 수요. 100 = 카테고리 평균.

계산식:

demand_index = (region_views / avg_category_views) × 100

# 여기서 avg_category_views 는:
avg_category_views = AVG(region_views) OVER (PARTITION BY category, period)

해석:

  • 100 = 카테고리 평균 수요
  • 200 = 평균의 2배 수요 (hot)
  • 50 = 평균의 절반 (cold)
  • 613.69 처럼 높으면 소수 지역에 수요 집중됨

주의:

  • 동일 카테고리 내 비교만 의미 있음 — office 와 meeting_room 의 demand_index 는 직접 비교 X
  • sample_size < 5 인 region 은 계산 신뢰도 낮음 (small N)

booking_conv_rate

정의: 조회 → 예약 전환율.

계산식:

booking_conv_rate = total_bookings / NULLIF(total_views, 0)

해석:

  • 0.05 = 조회 100회당 5건 예약
  • 카테고리별 편차 큼 — meeting_room 은 일반적으로 높음, office 는 낮음
  • 월별 비교 시 계절성(연말, 이사철) 감안

occupancy_proxy

정의: 공실률의 근사 추정치. 실제 공실률이 아닙니다.

계산식:

occupancy_proxy = LEAST(1.0, total_bookings / sample_size)

해석:

  • 0.0 = 해당 조합에서 예약이 거의 없음
  • 1.0 = 모든 매물이 최소 1건 이상 예약됨 (상한 clamp)
  • 진짜 공실률이 아님 — 실제 공실률 계산에는 매물별 실제 점유일수가 필요하나, MVP 에서는 접근 불가

주의사항:

  • 투자 / 대출 심사의 유일한 근거로 쓰지 말 것. 보조 지표로만.
  • Phase 5+ 에서 true_occupancy_rate 로 대체 예정.

yoy_growth (예정)

현재: intel.market_aggregates 컬럼은 존재하지만 API 응답에 아직 노출 안 됨.

정의: 전년 동월 대비 avg_price 증감률.

계산식 (Phase 5+ 배포 예정):

yoy_growth = (avg_price_this_year - avg_price_last_year) / avg_price_last_year

API v2 또는 Phase 9 데이터 확장 시점에 응답에 추가됩니다.


confidence

자세한 규칙은 Confidence & k-anonymity 참조.


전체 지표 관계도

raw data (Syncle rentals/meetings/bookings/product_views)
    │
    ▼
[ETL] → intel.market_aggregates
    │
    ├── sample_size, total_views, total_bookings  (원시 counter)
    ├── avg_price, median_price, min/max, p25/p75 (가격 분포)
    ├── demand_index                              (카테고리 내 상대)
    ├── booking_conv_rate, occupancy_proxy        (전환/점유 추정)
    └── confidence                                (신뢰도 레이블)
    │
    ▼
[public.veacon_get_market_pulse()] → API 응답

다음