- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 파이썬문법
- error
- 데이터
- 데이터사이언티스트
- data
- bigquery
- 개념정리
- 깃허브
- 함수
- github
- 주피터노트북
- 변수
- 파이썬
- 빅쿼리
- 2주차
- 회고록
- 딕셔너리
- ML
- 1주차
- Jupyter Notebook
- 데이터베이스
- python
- 딥러닝
- 머신러닝
- sql
- 함수활용
- 모두의연구소
- AI
- 데싸4기
- 회고
[DATATHON] 데이터톤 2015년 11월 매출을 예측(실적 관리, 상품 개발, 매장 운영 개선 지원) 본문
데이터톤 회고 (2025.05.31 ~ 06.04)
데이터톤은 짧은 기간 동안 팀을 이루어 데이터를 분석하고, 인사이트를 도출해 하나의 프로젝트로 완성한 뒤 발표를 진행한다.
각자 관심있는 도메인으로 팀을 구성하였고, 4~5명의 팀으로 총 4일간 진행되었다.
이 글은 그 과정에서 무엇을 고민했고, 어떤 방식으로 문제를 풀어나갔는지, 그리고 느낀 점들을 되돌아보기 위한 회고이다.
무엇을 고민하였고, 어떤 방식으로 해결하였는지
고민1 - 협업 툴은 어떤 걸로 사용할 것인가?
Github vs Google Drive
전공 특성상 GitHub를 자주 활용해왔지만, 팀원들 중에는 GitHub 사용이 처음인 분들도 있어 협업 방식에 대해 고민이 필요했다. 짧은 기간 안에 익숙하지 않은 도구를 새롭게 도입하는 것이 오히려 혼선을 줄 수 있다고 판단되어, 이번 프로젝트에서는 구글 드라이브를 중심으로 협업을 진행했다.
프로젝트가 마무리될 무렵, 정리된 최종 파일들을 GitHub에 업로드하는 방식으로 활용하여 형식적인 정리와 공유의 역할을 하도록 했다.
고민 2 – 러시아어로 구성된 데이터, 어떻게 처리할 것인가?
프로젝트에서 제공된 6개의 데이터 파일 중 3개가 러시아어로 구성되어 있어 전처리 단계에서 언어 처리에 대한 고민이 필요했다.
그중 2개의 파일은 약 80개 정도의 데이터로 구성되어 있어, Python을 활용해 러시아어를 영어로 번역하는 스크립트를 만들어 직접 번역을 진행했다. 이 과정은 비교적 수월했고, 번역 결과도 만족스러웠다.
문제는 items 파일로, 약 2만 개가 넘는 데이터가 존재해 직접 번역하기에는 시간이 많이 소요되었다. 게다가 해당 파일에는 괄호, 영어 단어 등이 혼용된 경우가 많아 자동 언어 감지 기반 번역을 사용했을 때 제대로 번역되지 않는 문제가 발생했다.
다행히 팀원 한 분이 이미 번역된 items 파일을 찾아주셔서 효율적으로 문제를 해결할 수 있었다.
고민 3 – 예측 대상 월의 피처가 없을 때 어떻게 할 것인가?
2013년 1월부터 2015년 10월까지의 데이터를 기반으로 2015년 11월의 상점별, 아이템별 월별 판매량을 예측해야 하는 문제였다.
하지만 11월(예측 대상 월)에 대한 피처가 존재하지 않았기 때문에, x_test를 어떻게 구성할지 막막했다.
이에 관련된 블로그 글들을 참고하였다.
데이터 구성 방식
시점 | 역할 |
2013.01 ~ 2015.09 | x_train, y_train |
2015.10 | x_valid, y_valid |
2015.11 | x_test, target (예측 대상) |
[kaggle] - 향후 판매량 예측
캐글의 안전 운전자 예측 경진대회 'Predict Future Sales' compeition에 참가해 다양한 feature engineering을 시도해보았다.과거 판매 데이터를 바탕으로 향후 판매량을 예측하는 회귀 문제로, 독특하게 train
velog.io
x_train에 적용한 피처 엔지니어링 방식을 그대로 따라 x_test도 동일한 구조로 만들어야 모델이 예측을 수행할 수 있다.
이렇게 구성한 x_test에 학습된 모델을 적용해 예측을 수행하였다.
고민4 - 코드 작성 중 겪은 예기치 못한 에러들과 해결 과정
프로젝트를 진행하면서 다양한 형태의 에러와 문제를 경험했다. 그중 몇 가지 대표적인 상황과 해결 과정을 정리해보았다.
1. MemoryError: 데이터가 너무 많아 메모리 부족
⚠ MemoryError: Unable to allocate 255. MiB for an array with shape (3, 11128004) and data type object
약 천만 건이 넘는 행을 처리하면서 머신러닝 모델까지 돌리려니, 당연히 메모리 부족 문제가 발생했다.
이를 해결하기 위해 다음과 같은 최적화 기법을 적용했다.
→ 해결 방법:
- Garbage Collector: 더 이상 사용하지 않는 변수는 명시적으로 삭제하고, gc.collect()를 사용해 메모리를 수시로 해제했다.
- Downcasting: float64, int64 등의 자료형을 float32, int16으로 다운캐스팅하여 메모리 점유율을 줄였다.
이러한 최적화 덕분에 대부분의 코드 실행은 가능했지만, XGBoost 모델에서는 여전히 메모리 부족 문제가 발생해 사용하지 못한 점이 아쉬웠다.
다른 팀들은 모든 피처를 합친 하나의 대형 데이터프레임을 그대로 쓰지 않고, 모델링에 필요한 피처만 추출해서 모델에 투입하는 방식으로 메모리를 절약했다고 한다. 이 방식도 참고할 만한 부분이었다.
2. LightGBM의 범주형 피처 오류
⚠ ValueError: train and valid dataset categorical_feature do not match.
LightGBM에서 학습/검증/테스트 데이터 간 범주형 피처(categorical feature)의 형식이나 구성이 다를 경우 발생하는 오류였다.
처음엔 X_train과 X_valid는 동일한 컬럼과 형식을 갖추고 있었지만, X_test의 컬럼 순서나 데이터 타입이 약간씩 달라서 생긴 문제였다.
→ 해결 방법:
- X_test도 X_train, X_valid와 컬럼 순서, 수, 데이터 타입을 완전히 동일하게 맞춰주어 오류를 해결했다.
3. ⚠ 중요한 피처 삭제로 인한 후처리 오류
모델 성능을 높이기 위해 feature importance를 기준으로 중요도가 낮은 피처들을 제거하는 과정을 거쳤다. 그런데 그 중 item_id까지 제거되면서 예측 후 결과를 다시 결합하는 과정에서 문제가 생겼다.
예측 결과에 item_id 정보가 없으니, 상점별-상품별 판매량 예측을 위한 매핑이 불가능했던 것이다. 처음에는 shop_id와 item_category_id를 기준으로 item_id를 붙이려 했으나, 1:1 매핑이 어려웠다.
→ 해결 방법:
- 원본 테스트셋(test.csv)에서 shop_id와 item_id를 그대로 가져와서, 예측 결과(test_preds)와 병합했다.
- 최종적으로 shop_id, item_id, predicted_sales의 3개 컬럼으로 구성된 데이터프레임을 만들 수 있었다.
시간이 더 있었다면? 아쉬웠던 점 & 개선 아이디어
이번 프로젝트에서 총 26개의 시계열 기반 파생 변수를 생성해 다양한 관점에서 데이터를 바라보고자 했다.
그중 feature importance를 통해 예측에 결정적인 영향을 미친 상위 5개 피처를 추려본 결과, 아래와 같았다:
- item_cnt_monthly_시차1
- 월간 판매량 시차평균
- item_category_id
- item_id_city별 평균 판매량 시차1
- shop_id
주요 피처 해석
- item_cnt_monthly_시차1:
전월 판매량이 다음 달 수요 예측에 가장 결정적이다.
예를 들어 10월에 많이 팔린 상품은 11월에도 일정 수준 이상의 판매가 이어질 가능성이 높기 때문이다. - 월간 판매량 시차평균:
일시적인 급등/급락보다는 중장기적인 수요 흐름을 반영하며,
최근 몇 개월간 평균적으로 얼마나 팔렸는지를 기준으로 계절성이나 점진적 수요 변화를 포착할 수 있었다. - item_category_id:
개별 상품보다는 어떤 카테고리에 속한 상품인지가 수요에 더 중요한 영향을 주는 경우가 많았다.
예를 들어, ‘게임’ 카테고리는 신작 출시 시기에 따라 수요가 증가하는 경향이 있다. - item_id_city별 평균 판매량 시차1:
같은 상품이라도 도시/지역에 따라 판매량과 가격이 달랐기 때문에, 지역 기반 수요 차이를 반영하는 피처로 작용했다. - shop_id:
상점마다 입지나 고객층, 마케팅 방식 등이 달라 판매 패턴도 달라지는 경우가 많았다.
따라서 상점 ID 자체가 중요한 예측 변수 중 하나로 선택되었다.
결론적으로,
과거 판매 이력(시차 피처), 상품 정보(카테고리, ID), 지역/상점 정보가 유기적으로 작용하며 다음 달 판매량을 예측하는 데 핵심적인 단서가 된다는 것을 알 수 있었다.
지역 특성이나 계절성과 관련된 변수를 만들어보는 것도 고려했지만,
매출이 낮은 상점에 대한 지역 이전이 직접적인 개선 방안으로 연결되기 어렵다는 판단 아래 해당 피처들은 최종적으로 제외했다.
하지만 시간이 더 있었다면,
- 계절성에 따른 제품군별 변화
- 지역 간 트렌드 비교
- 매출이 낮은 상점의 유형 분석 및 패턴 그룹화
같은 분석을 더 깊이 다뤄봤으면 좋았을 것 같다.
특히 저매출 상점의 공통 특성을 분석하고, 개선 방향을 데이터로 제안하는 방식의 접근은 실무에서도 충분히 응용될 수 있기에 개인적으로 아쉬움이 남는다.
또한, 발표 이후 피드백에서도 구체적인 개선 방안 제시의 부족이 지적되었는데, 이 부분이 특히 더 아쉽게 느껴졌다.
향후 개선 방향
- 딥러닝 기반 모델을 적용해 장기 예측을 시도
- 다양한 개선 방안 시뮬레이션을 설계
이번 프로젝트에서는 매출 데이터 정보만을 기반으로 분석하다 보니, 인사이트 도출의 깊이나 다양성에 한계가 있었다.
다음 프로젝트에서는 더 풍부한 컬럼 구성과 다양한 관점에서의 데이터 활용을 시도해보고 싶다는 생각이 들었다.
무엇보다도, 시간 내에 예측 결과를 도출해야 한다는 부담감에 다소 일반적인 내용으로 마무리된 점이 아쉽다.
더 새롭고 흥미로운 시계열 인사이트를 발굴하지 못한 것이 개인적으로 아쉬움으로 남는다.
느낀 점
1. 시계열 데이터에서 피처 엔지니어링의 중요성을 크게 느꼈다.
2. 단순히 모델 성능 향상 그 이상으로, 데이터를 통해 무엇을 볼 수 있는가에 대한 관점을 다시 한 번 배우게 되었다.
3. 기술적으로 내가 부족한 부분도 명확해졌다. 특히 데이터 병합 과정에 대한 이해와 실력이 더 필요함을 깨달았다.
4. 문제를 해결하는 과정에서, 어떤 문제들이 발생할 수 있고, 이를 어떻게 해결할 수 있는지도 경험으로 익혔다.
5. 무엇보다 팀원 각자가 잘하는 분야에서 역량을 발휘해 협력함으로써, 좋은 결과물을 만들어낼 수 있었다고 생각한다.
얻은 교훈
- 두 개의 머리가 하나보다 낫다.