Metrics & Formulas
Veacon 이 반환하는 모든 지표의 정확한 계산식과 해석 가이드.
Veacon 의 핵심 상품은 집계된 시장 신호 입니다. 각 지표가 정확히 어떻게 계산되는지와 어떻게 해석해야 하는지를 이 페이지에서 다룹니다.
이 페이지는 리서치 팀이 모델 검증할 때 referenced 되는 것을 가정하여 작성되었습니다. 문서 보고 "이거 내 보고서에 인용해도 되겠다" 수준의 명확성을 목표.
sample_size
정의: 해당 조합(region × category × period × product_type)에 포함된 고유 매물 수.
계산식:
COUNT(DISTINCT listing_id) OVER (PARTITION BY region, category, period, product_type)
해석:
- 신뢰도의 1차 지표.
confidence필드의 근거. - 3 미만이면 응답 자체가 반환되지 않습니다 (k-anonymity). DB CHECK constraint 로 강제.
주의: sample_size 가 total_views 보다 훨씬 작을 수 있음 (한 매물이 여러 번 조회됨). 매물 수 ≠ 트래픽.
avg_price
정의: 평균 가격. 단위는 원(KRW). rental 은 월세, meeting 은 시간당 단가.
계산식:
AVG(COALESCE(discounted_price, price))
해석:
discounted_price우선 — 실제 거래가 근사치- 고가 이상치(outlier)에 민감 →
median_price와 비교 필수
사용 예:
- 단순 비교 (강남권 vs 도심권) 는 OK
- 정확한 시장가 추정은
median_price나price_p50권장
median_price (P50)
정의: 50 percentile. 가격 분포의 중간값.
계산식:
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY COALESCE(discounted_price, price))
해석:
- 이상치에 둔감 — 시장 대표가로
avg_price보다 정확 avg_price≫median_price이면 상위 이상치 존재 (예: 고급 오피스 소수)avg_price≈median_price면 분포가 고른 시장
price_p25 / price_p75
정의: 25 / 75 percentile. IQR(Interquartile Range) 계산 용도.
계산식:
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 이 크면 동일 권역 내 가격 편차가 큼 (예: 같은 강남권에도 신축 대 구축)
실전:
# 이상치를 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_price가p75 * 3이상이면 데이터 품질 점검 필요
total_views
정의: 해당 조합의 매물들이 집계 기간 내 받은 총 조회 수 합계.
계산식:
SUM(product_views.view_count)
해석:
- 수요의 raw signal
- 직접 비교보다 demand_index 를 사용 권장 (정규화됨)
total_bookings
정의: 집계 기간 내 확정된 예약 건수.
계산식:
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 응답
다음
- Regions & categories — 정확한 분류 기준
- Confidence & k-anonymity — 신뢰도 해석