데이터 방법론
카드픽은 해외 가격의 관측 표본과 중앙값, 이상치 필터를 바탕으로 참고가와 신뢰도 등급을 표시합니다. 표본은 거래 건수가 아니며, HIGH도 가격의 정확성이나 카드의 진품 여부를 보장하지 않습니다. 국내 실거래가와는 구분해서 보세요.
1. 표본 정의 (distinct count)
관측 표본은 실거래 건수나 독립 매물 수가 아닙니다. 카드별로 variant(마감 등 가격 구분) + date(수집 날짜) + source(출처) 조합을 세며, 구매자나 판매자를 세지 않습니다.
distinct_7d = count(distinct (variant, date, source))
WHERE fetched_at > now() - interval '7 days'
distinct_30d = count(distinct (variant, date, source))
WHERE fetched_at > now() - interval '30 days'
같은 variant·출처·날짜의 반복 수집은 가격이 달라도 관측 표본 1건으로 셉니다. 반대로 가격이 같아도 수집 날짜가 달라지면 표본 수가 늘어납니다. 표본이 늘었다고 거래가 늘었거나 서로 다른 판매자의 가격을 확인했다는 뜻은 아닙니다.
2. Clean Median + MAD Outlier 제거
중앙값은 극단적인 값의 영향을 줄이기 위해 사용합니다. 최근 30일의 양수 가격 관측값에서 중앙값과 MAD(중앙값으로부터 떨어진 거리의 중앙값)를 구한 뒤, 아래 범위 안에 남은 값으로 중앙값을 다시 계산합니다.
median = percentile_cont(0.5) over price_30d MAD = median(|p - median|) for p in price_30d clean = price_30d 중 |p - median| < max(3 × MAD, median × 5%) clean_median = median(clean) clean_n = count(clean)
max(3×MAD, median×5%)는 MAD가 0이어도 중앙값의 5%를 필터 폭으로 사용합니다. clean_n은 필터를 통과한 가격 행 수로, 위의 중복 제거 관측 표본 수(distinct)와 다릅니다. 반복 수집된 행도 남아 있을 수 있습니다.
이 필터는 관측된 분포에서 벗어난 값을 줄일 뿐, 모든 가격 오류를 잡지는 못합니다. 잘못 연결된 카드나 출처 오류가 반복되면 통과할 수 있고, 낮은 가격이라는 이유만으로 오류라고 판정하지도 않습니다.
3. Price-band별 Ratio Gate
최신 가격을 그대로 표시할지 판단할 때, 정제된 30일 중앙값과 비교합니다. 아래 범위는 카드픽의 산정 기준이며 시장에서 정상 가격임을 보증하는 범위가 아닙니다. 가격대는 최신 가격이 아니라 비교 기준 중앙값으로 나눕니다.
| 가격대 | 허용 범위 | 이유 |
|---|---|---|
| ₩3,000 미만 | 절대차 |new - median| < ₩5,000 | 배수 대신 금액 차이 비교 |
| ₩3,000 이상, ₩50,000 미만 | 0.3배 이상, 3.0배 이하 | 중앙값 대비 배수 비교 |
| ₩50,000 이상 | 0.5배 이상, 2.0배 이하 | 배수 범위를 더 좁게 적용 |
function cardpick_ratio_gate(p_new, p_median): if p_new is null or p_median is null or p_median <= 0: return false if p_median < 3000: return abs(p_new - p_median) < 5000 if p_median < 50000: return 0.3 <= p_new/p_median <= 3.0 else: return 0.5 <= p_new/p_median <= 2.0
4. 4단계 신뢰도 등급 산출
저장소의 Trust Gate 산정 정의에서는 정제 후 가격 행 수(clean_30d_n)가 5 미만인지 먼저 확인합니다. 그 다음 HIGH, MEDIUM, LOW 순서로 판정합니다. 아래 조건은 관측 데이터의 분류 기준이지 거래량이나 구매 안전 등급이 아닙니다.
| 등급 | 조건 | 표시 가격 | 화면 라벨 |
|---|---|---|---|
| HIGH | clean_30d_n ≥ 5, distinct_7d ≥ 5, ratio gate 통과 | 최신 가격을 display_krw로 표시 | 현재 참고가 |
| MEDIUM | clean_30d_n ≥ 5, HIGH 조건 미충족, distinct_30d ≥ 10 | 정제된 30일 중앙값을 display_krw로 표시 | 최근 1개월 중앙값 |
| LOW | clean_30d_n ≥ 5, HIGH·MEDIUM 조건 미충족 | 정제된 30일 중앙값을 display_krw로 표시 | 30일 중앙값 · 표본 부족 |
| NONE | clean_30d_n < 5 | null (가격 숨김) | "참고가 산출 불가" |
5. 신뢰도 분포 (매일 변동)
신뢰도 등급 분포는 가격 수집과 정제 결과에 따라 달라집니다. 특정 등급의 카드 수가 계속 늘거나 줄어든다고 가정하지 않으며, 각 집계 시점의 결과만 사용합니다.
분포는 고정 수치로 적지 않습니다. 등급별 카드 수를 확인할 때는 /facts/site JSON의 catalog.last_count_at과 catalog.trust_distribution을 함께 확인해야 합니다.
6. 운영 기준 요약
- 카드 식별 정보: TCGCSV와 Pokémon TCG API의 카드·세트 정보
- 원화 참고가의 원천: TCGCSV로 수집한 TCGplayer 북미 USD market price. 국내 거래가나 PSA 등급별 거래가격이 아닙니다.
- 별도 지표: Pokémon TCG API의 Cardmarket EUR 자료. Cardmarket 7일/30일 평균 비교는 TCGplayer 원화 참고가의 등락률과 다릅니다.
- 갱신: 자동 수집 실행일과 카드별 마지막 관측일은 다를 수 있습니다. 각 카드의 데이터 기준일을 확인하세요.
- 카탈로그: 영문 Pokémon TCG. 신뢰도 기준을 통과한 카드만 참고가를 표시
- 신뢰도 분류: 4단계 (HIGH/MEDIUM/LOW/NONE)
- 알고리즘: distinct count + MAD outlier 제거 + price-band ratio gate
- HIGH 등급: 표본과 ratio gate 조건을 통과해 최신 가격을 표시하는 카드
- NONE 등급 카드는 "참고가 산출 불가"로 표시
7. 이미지·상표 안내
- 카드 이미지·아트워크·카드명·세트명은 © The Pokémon Company / Nintendo / Creatures Inc.의 저작물이며, 카드픽은 정보 제공(참고가·식별) 목적으로 제3자 커뮤니티 API (pokemontcg.io)를 통해 인용합니다.
- "Pokémon", "Pocket Monsters" 등 상표는 각 권리자에게 있습니다. 카드픽은 공식 서비스가 아니며 The Pokémon Company / Nintendo와 제휴·계약 관계가 없습니다.
- 이미지 저작권 문의: [email protected] — 권리자 요청 시 즉시 조치합니다.
8. 절대 사용하지 않는 패턴
- 관측 횟수를 거래 건수로 표시하지 않습니다. 정제 후 행 수와 distinct 관측 표본 수도 구분합니다.
- 원화 참고가의 정제 집계에는 중앙값을 사용합니다. 별도 출처인 Cardmarket의 평균 지표와 혼동하지 않습니다.
- 유효한 display_krw가 없으면 참고가를 표시하지 않습니다. 누락값을 0원이나 검증 전 원천 가격으로 대신하지 않습니다.
- 원천 low/high를 국내 최저·최고 거래가로 해석하지 않습니다. 카드 상태나 그레이딩 등급별 가격을 뜻하지도 않습니다.
- 가격·표본·변동률은 출처와 기준일을 함께 확인합니다. 통계 필터만으로 정확성이 보장되지는 않습니다.
9. 알고리즘 보강 이력
Trust Gate v1은 코드 리뷰와 실제 운영 중 발견한 오류를 바탕으로 다음 항목을 보강했습니다.
- composite distinct 패턴 → 별도 CTE에서 dedupe (PostgreSQL 호환성)
- display_krw IS NOT NULL 명시 (coalesce fallback 회피)
- price-band ratio threshold 권장값 적용 (저가 절대차 / 중가 0.3-3 / 고가 0.5-2)
- get_hot_cards RPC overload 충돌 패턴 표준화
10. 자주 묻는 질문
NONE 등급이 왜 이렇게 많나요?
정제 후 가격 행 수가 5 미만이면 산정 정의상 NONE으로 분류합니다. 수집 데이터가 있어도 필터를 통과한 값이 부족할 수 있습니다. 화면에서도 신뢰도 결과나 유효한 표시 가격을 받지 못하면 참고가를 표시하지 않습니다. 이것이 카드의 가치가 없다는 뜻은 아닙니다.
왜 평균(avg) 안 쓰나요?
원화 참고가를 집계할 때 극단적인 관측값의 영향을 줄이기 위해 중앙값과 MAD 필터를 사용합니다. 중앙값도 반복된 출처 오류나 잘못 연결된 카드를 자동으로 바로잡지는 못합니다. Cardmarket의 평균 지표는 별도 출처 지표로 구분합니다.
price_low / price_high는 신뢰 가능?
원천 자료의 low/high는 카드픽의 신뢰도 필터로 산출한 참고가가 아닙니다. 국내 거래 범위나 raw·PSA 9·PSA 10별 가격으로 해석하면 안 됩니다. 카드픽 참고가를 볼 때는 display_krw에 해당하는 표시 가격과 신뢰도, 데이터 기준일을 함께 확인하세요.
질문 · 알고리즘 정정 제안: [email protected] · 설명 수정 (가격 산정 로직 변경 없음)