- 캐나다 식료품 시장의 높은 집중도가 가격 경쟁을 약화시키는 상황에서, Project Hammer는 주요 업체의 과거 가격 데이터를 공개해 담합 탐지와 경쟁 촉진에 쓰려는 프로젝트임
- 데이터셋은 Voila, T&T, Loblaws, No Frills, Metro, Galleria, Walmart Canada, Save-On-Foods 등 8개 업체를 포함하며, 기간은 2024년 2월 28일부터 최신 적재분까지임
- 공개 파일은 제품 메타데이터용
product와 시계열 가격용raw로 나뉘며, CSV 2개 또는 SQLite 파일로 분석할 수 있음 - 가격은 웹사이트 UI를 스크린 스크레이핑해 수집한 토론토 한 동네의 “in store pickup” 기준이라, 내부 API 데이터와 다르거나 일부 날짜·업체에 누락이 있을 수 있음
- 경제 분석, 데이터 정규화, 버그 검토, 정치·언론·법률 활용이 결합되어야 이 데이터가 학술 분석과 법적 조치로 이어지기 쉬움
Project Hammer가 하려는 일
- Project Hammer의 목표는 캐나다 식료품 부문의 경쟁을 늘리고 담합을 줄이는 것임
- 이를 위해 세 가지 작업을 추진함
- 주요 식료품 업체 웹사이트에서 과거 가격 데이터베이스를 구축함
- 학술 분석과 법적 조치에 적합한 형태로 데이터를 제공함
- 변화를 만들 수 있는 사람들에게 데이터셋의 존재를 알리고 실제 사용을 돕는 것임
공개된 식료품 가격 데이터
- 데이터셋에는 8개 식료품 업체가 포함됨
- Voila
- T&T
- Loblaws
- No Frills
- Metro
- Galleria
- Walmart Canada
- Save-On-Foods
- 제공 기간은 2024년 2월 28일부터 최신 적재분까지임
- 데이터는 두 가지 방식으로 받을 수 있음
- CSV 2개
product파일은 제품 메타데이터와 제품 세부 정보를 담음raw파일은 시계열 가격 데이터를 담음- 두 파일은
id와product_id컬럼으로 조인함
- SQLite 파일
- SQLite 파일 확인 도구로 DB Browser가 추천됨
- 필터링과 CSV 내보내기가 가능함
- CSV 2개
- 데이터 필드와 수집 방식은 프로젝트 FAQ 섹션에서 확인할 수 있음
참여가 필요한 사람들
- 프로젝트는 한 사람이 완성하기 어렵고, 분석·정규화·검증·활용을 맡을 커뮤니티가 필요함
- 특히 다음 역할의 참여를 요청함
- 시간에 따른 여러 가격 흐름의 상호작용과 상관관계를 경제 분석할 수 있는 사람
- 데이터 처리와 정규화에 능숙한 사람
- 하루 동안 데이터를 다뤄보고 버그, 문제, 기회를 알려줄 사람
- 다른 나라에서 비슷한 가격 분석을 하거나 Mario Zechner의 작업에서 영감을 받은 사람
- 캐나다의 고도로 집중된 식료품 부문을 개선하려는 데이터 지향 정치인, 보좌관, 활동가, 기자, 변호사
데이터로 물어볼 수 있는 질문
- 표준 샌드위치 가격을 업체별로 시각화할 수 있음
- 예: 흰빵 200g, 햄 20g, 양상추 20g 등
- 어떤 업체가 가장 저렴한지 비교 가능함
- 특정 제품에 대해 11월 1일부터 2월 5일까지 가격 동결이 있었는지 확인할 수 있음
- Metro는 자체 브랜드와 전국 브랜드 식료품 제품에 대해 11월 1일부터 2월 5일까지 가격 동결이 업계 관행이며 Metro 매장에도 적용된다고 밝힌 바 있음
- “할인” 가격이 실제로 무엇을 뜻하는지도 분석 대상임
- 이전 할인 이후 얼마나 시간이 지났는지 확인함
- 계속 할인 중인 상품이면 그것이 사실상 정가인지 볼 수 있음
- 할인 직전에 가격을 올렸다가 다시 정상 수준으로 낮춘 것인지 확인 가능함
- 업체 간 가격 반응도 비교할 수 있음
- 특정 제품이나 카테고리에서 누가 가격 변동을 먼저 시작하는지 볼 수 있음
- 어떤 소매업체가 늘 반응만 하고 가격 변동을 시작하지 않는지 확인함
- 일부 업체 가격이 정확히 함께 움직이는지 볼 수 있음
- 가격이 상호작용 없이 무작위로 움직이는지도 분석 가능함
- 가격이 항상 오르기만 하거나 내리기만 하는지 확인할 수 있음
- 비교 가능한 제품군 전체에서 어떤 업체가 일반적으로 가장 저렴한지, 한 업체 안에서 계란·우유·빵 같은 제품 묶음이 함께 움직이는지도 볼 수 있음
수집 방식과 데이터 제약
- 데이터는 식료품 업체 웹사이트 UI를 스크린 스크레이핑해 얻은 정보임
- 웹사이트를 구동하는 내부 API에서 얻을 수 있는 정보가 빠져 있을 수 있음
- 가격은 토론토의 한 동네에서 설정한 “in store pickup” 옵션 기준임
- 매일 모든 업체의 모든 데이터가 있는 것은 아님
- 2024년 2월 28일부터 7월 10일 또는 11일까지는 “small basket” 제품 가격을 수집함
- 그 이후에는 훨씬 더 다양한 제품 가격을 보유함
- 특정 날짜에 특정 업체 추출이 실패해 데이터가 빠질 수 있음
product 테이블
product테이블은 제품 메타데이터를 담음- 제품명
- 업체
- 브랜드
- 단위 크기
- 새 제품이 발견될 때만 업데이트됨
- 예: 이전에 없던 단위 크기 변형이 발견된 경우
- 주요 컬럼은 다음과 같음
id:product테이블과raw테이블을 조인하는 제품 ID지만, 매일 바뀌며 안정적인 고유 식별자가 아님concatted: 업체, 제품명, 단위, 브랜드를 이어 붙인 자체 고유 식별자이며 중간 단계에서 사용됨vendor: 8개 식료품 업체 중 하나product_name: 제품명이며 브랜드나 단위가 포함될 수 있음units: g, kg, 포장 내 개수 같은 단위이며 일부 업체나 제품은 비어 있을 수 있음brand: 제품 제조사 브랜드이며 비어 있을 수 있음detail_url: 세부 제품 페이지 URL이며 SKU와 UPC 추출에 사용됨sku: 각 업체가 쓰는 제품 고유 식별자이며detail_url에서 추출됨upc: 업체를 가로지르는 범용 제품 식별자지만 찾기 어려움
- UPC 신뢰도는 업체마다 다름
- Metro, Galleria, Save-On-Foods의 UPC가 가장 신뢰도가 높으며 업체 웹사이트에서 직접 나옴
- Walmart는 SKU를 Walmart가 소유한 것으로 보이는 사이트의 UPC와 매칭했으며, 퍼지 매칭이 아닌 정확 매칭임
- Loblaws, NoFrills, T&T, Voila는 퍼지 매칭으로 잠재 UPC를 찾고 수동 품질 검사를 했지만 오류가 있을 수 있음
- 업체 간 비교 시
product_name을 보고 상식적으로 확인해야 함
raw 테이블
raw테이블은 특정 시점의 제품 가격을 담으며, 새 데이터가 매일 추가됨- 주요 컬럼은 다음과 같음
nowtime: 데이터 수집 시각current_price: 추출 시점의 가격old_price: 취소선 처리된 이전 가격이며, 할인 중임을 나타냄price_per_unit: 업체 웹사이트에 표시된 단위당 가격이며,current_price를units로 나눈 실제 계산값과 일치하지 않을 수 있음other: “Out of stock”, “SALE”, “Best seller”, “$5.00 MIN 2” 같은 기타 표시 정보product_id:product테이블과 조인하는 ID지만 매일 바뀌며 안정적인 고유 식별자가 아님
CSV와 SQLite 사용 시 주의점
- CSV 파일은 Excel에 맞춰져 있음
- 파일 시작 부분에 Excel이 UTF-8로 처리하게 하는 BOM 문자가 포함됨
- 다른 분석 도구에서 불러올 경우 BOM 제거가 필요할 수 있음
- SQLite 파일 구조는 단순함
product테이블은vendor,product_name,units,brand를 포함함raw테이블은nowtime,current_price,old_price,price_per_unit을 포함함- 두 테이블은
product.id와raw.product_id로 조인함 - 속도를 위해
raw.product_id에 인덱스가 있음
- 예시 SQL은 특정 브랜드나 제품군을 조회하는 방식으로 제공됨
- Becel 브랜드는 업체에 따라
product_name에만 있거나brand에만 있을 수 있어 두 컬럼을 모두 검색함 - Miss Vickie's 제품은 업체마다
Miss Vickies,Miss Vickie's, 특이한 UTF-8 따옴표를 쓴 표기가 섞여 있어miss vick으로 검색함 - Miss Vickie's Original Recipe chips 조회 결과에는 59g, 200g, 275g 제품이 함께 포함될 수 있어 업체 간 비교 시 SQL을 더 좁히거나 CSV로 내보내 필터링해야 함
- Becel 브랜드는 업체에 따라
- 예시 분석에서는 Miss Vickies' Original Kettle Chips 200g 가격을 Excel PivotChart로 시각화했고, Walmart가 가장 낮고 아시아 식료품점 중심 업체들이 가장 높은 가격을 보임
참고용 SQL과 분석 예시
- 6월 10일과 9월 17일 가격 비교용 SQL이 제공됨
- 설명상 첫 전체 추출일은 6월 10일이지만 SQL 조건은
2024-06-11%과2024-09-17%를 사용함 - 같은 제품의 시작 가격과 종료 가격을 한 행으로 피벗한 뒤, 양쪽 날짜에 모두 존재하지 않는 제품은 제외함
- 설명상 첫 전체 추출일은 6월 10일이지만 SQL 조건은
- 가격의 최대, 최소, 평균, 카운트를 구하는 SQL도 있음
raw에서 날짜·가격·제품 ID의 고유 조합을 만든 뒤 제품별 집계를 수행함- 결과를
product테이블과 조인해 업체, 제품명, 단위, 브랜드와 함께 확인함
- 코드, 데이터, 노트를 SQL Notebook 형태로 공유하는 방식이 더 나은지 피드백을 요청함
알려진 데이터 문제
- 같은 날 같은 제품에 서로 다른 가격점이 잡히는 문제가 있음
- 예: Loblaws의 “100% Natural Origin Moisturizing Lip Balm, Cucumber Mint”, Sisu의 “Melatonin”
- 원인은 업체 웹사이트에 이름과 단위 크기가 같은 서로 다른 제품이 존재했기 때문임
- 2024년 9월 30일까지는 둘을 구분할 방법이 없었고, 그 이후에는
detail_url과sku값으로 구분할 수 있음
- 하루에 같은 제품의 동일 가격 항목이 여러 번 들어가는 문제가 있음
- 2024년 11월 2일 기준 하루 약 6,500개 제품이 영향을 받음
- 예: Metro의 Daiya “Mexican 4 Cheeze Blend Gluten Free Shreds”
- 같은 제품이 여러 카테고리에 올라가거나 광고 상품으로 다른 카테고리 또는 페이지 상단에 반복 노출되기 때문일 수 있음
- Save-On-Foods 추출에서는 일부 제품명·브랜드 조합이
detail_url값과 맞지 않는 문제가 있었음- 영향 규모는 하루 약 9개 제품이며, 전체 약 1만 개 제품 중 일부임
- 매일 다른 제품군에서 발생할 수 있음
- 2024년 12월 25일 데이터셋부터 수정됐지만 이전 데이터에 소급 적용되지는 않음
관련 식료품 가격 자료
- 여러 캐나다 식료품 업체 가격을 한 번에 조회해 비교하는 도구: 문서화되지 않은 내부 API를 사용함
- grocerytracker.ca
- Statcan의 Monthly average retail prices for selected products: 110개 주요 제품의 월평균 소매가격 데이터
- Statcan 팟캐스트 “Eh Sayers” Episode 18 - Why Food Inflation Is Such A Hard Nut To Crack
- Statcan은 자체 웹 스크레이핑과 식료품 상인의 직접 POS 데이터를 수집함
- 해당 데이터는 공개되지 않음
- Competition Bureau의 Retail Grocery Market Study Report
- Competition Tribunal 접근성은 2025년 6월 20일 더 쉬워질 예정이라고 적혀 있음
- 반경쟁적 남용으로 유죄 판정을 받은 당사자가 내야 할 벌금에 상한을 두는 점은 비판적으로 다뤄짐
- 함께 볼 만한 관련 글과 외부 사례도 정리되어 있음