[머신러닝 경진대회] 향후 판매량 예측 ❶ – 경진대회 이해와 탐색적 데이터 분석

과거 판매 데이터를 기반으로 향후 판매량을 예측하는 경진대회를 공략합니다. 탐색적 데이터 분석은 간단하게만 다룹니다. 대신 많은 시간을 피처 엔지니어링에 할애해서 성능 향상을 위한 파생 피처를 만들어봅니다. 이 과정에서 다양한 피처 엔지니어링 기법을 배울 수 있습니다.

 

학습 순서

향후 판매량 예측은 총 3편입니다. 1편에서는 경진대회 이해와 탐색적 데이터 분석을 알아보고, 2편에서는 베이스라인 모델(LightGBM), 3편에서는 성능 개선(LightGBM + 피처 엔지니어링 강화)를 정리합니다.

 

학습 키워드

  • 유형 및 평가지표 : 회귀, RMSE
  • 탐색적 데이터 분석 : 데이터 병합, 그룹화
  • 머신러닝 모델 : LightGBM
  • 피처 엔지니어링 : 피처명 한글화, 데이터 다운캐스팅, 조합, 이어 붙이기, 병합, 이상치 제거, 파생 피처 생성

 

파이썬 버전

3.7.10

 

사용 라이브러리 및 버전

  • numpy (numpy==1.19.5)
  • pandas (pandas==1.3.2)
  • seaborn (seaborn==0.11.2)
  • matplotlib (matplotlib==3.4.3)
  • sklearn (scikit-learn==0.23.2)
  • lightgbm (lightgbm==3.2.1)
  • itertools, gc

 

1. 경진대회 이해

본 글에서는 향후 판매량 예측 경진대회(Predict Future Sales)를 다룹니다.

본 경진대회는 2018년 2월에 개최되었으며, 2023년 1월까지 진행됩니다. 집필 시점 기준으로 진행 중인 대회이며, 13,613팀이 참가 중입니다. 다른 경진대회에 비해 기간도 길고 참가팀도 상당히 많습니다. 특수한 플레이그라운드 대회라 그렇습니다. 실력을 쌓으라는 취지로 개최된 대회라고 보시면 됩니다.

본 경진대회 목표는 과거 판매 데이터를 보고 향후 판매량을 예측하는 것입니다. 타깃값은 판매량이므로 범주형 데이터가 아닙니다. 따라서 본 경진대회는 회귀(regression) 문제에 속합니다. 주어진 훈련 데이터는 2013년 1월부터 2015년 10월까지의 일별 판매 내역입니다. 더불어 상점, 상품, 상품분류에 관한 추가 데이터도 있습니다. 이 데이터들을 토대로 2015년 11월 각 상점의 상품별 월간 판매량을 예측해야 합니다. 피처는 상점 및 상품에 관한 정보이며, 타깃값은 월간 판매량입니다.

지금까지 다룬 경진대회에서는 데이터 파일을 3개씩 제공했습니다. 훈련 데이터, 테스트 데이터, 샘플 제출 데이터였죠. 하지만 본 경진대회는 6개나 제공합니다. 훈련 데이터와 관련된 추가 데이터가 더 있습니다. 각 데이터의 의미는 다음과 같습니다. 1

  • sales_train : 2013년 1월부터 2015년 10월까지 일별 판매 내역
  • shops :상점에관한추가정보
  • items :상품에관한추가정보
  • item_categories : 상품분류에 관한 추가 정보
  • test : 테스트 데이터(2015년 11월 각 상점의 상품별 월간 판매량을 예측해야 함)
  • sample_submission : 샘플 제출 파일

sales_train이 기본적인 훈련 데이터이고, shops, items, item_categories는 추가 정보입니다.

주의점이 하나 있습니다. 각 상점의 상품별 월간 판매량(타깃값)은 0개에서 20개 사이여야 한다는 점입니다. 경진대회 Overview 메뉴의 [Evaluation] 탭에 설명되어 있습니다. 2 다시 말해, 월간 판매량이 20개보다 많으면 20개로 간주한다는 뜻입니다. 음수도 허용하지 않습니다. 타깃값 뿐만 아니라 판매량과 관련된 피처는 모두 0~20 사이로 값을 제한해야겠죠?

 

1 https://www.kaggle.com/c/competitive-data-science-predict-future-sales/data
2 https://www.kaggle.com/c/competitive-data-science-predict-future-sales/overview/evaluation

 

2. 탐색적 데이터 분석

캐글 검색창에 “Predict Future Sales”라고 검색해서 경진대회에 접속합니다. 이번 글에서는 시각화할 데이터가 별로 없습니다. 그래서 탐색적 데이터 분석은 간단하게만 해볼 계획입니다.

 

 

탐색적 데이터 분석에 사용한 코드는 본 경진대회에서 추천수가 세 번째로 많은 다음 노트북을 참고해 작성했습니다.

 

2.1 데이터 둘러보기

이번 절에서는 sales_train, shops, items, item_categories 데이터가 어떻게 구성돼 있는지 살펴본 뒤, 이 데이터들을 병합하겠습니다. 이어서 병합한 데이터를 활용해 피처 요약표까지 만들어보겠습니다.

각 데이터를 하나씩 살펴볼까요? 먼저 데이터를 불러옵니다.

 

sales_train 데이터

첫 번째로 sales_train 데이터를 살펴보겠습니다.

 

▼ 실행 결과

 

date 피처는 날짜를 나타냅니다. ‘일.월.연도’ 형식이네요. date_block_num 피처는 편의상 사용하는 날짜(월) 구분자입니다. 0은 2013년 1월을 뜻합니다. 순서대로 1은 2013년 2월, 2는 2013년 3월, 그리고 33은 2015년 10월을 의미합니다. 본 경진대회 타깃값은 ‘월별’ 판매량이라고 했습니다. 월별 판매량을 구해야 하니 ‘월’ 구분자만 있으면 됩니다. 따라서 date_block_num 피처만 있으면 됩니다. date 피처는 필요 없으니 제거하겠습니다.

💡 분석 결과

월별 판매량만 구하면 되니 date 피처는 제거

 

shop_id와 item_id는 각각 상점 ID와 상품 ID를 나타냅니다. item_price는 상품 판매가입니다. 러시아 데이터라서 화폐 단위는 루블ruble일 것입니다. 1루블은 약 15원입니다. 상식적으로 생각해보면 상품 판매가는 날짜나 상점에 따라 달라질 수 있습니다. 첫 행을 보시죠. 2013년 1월 2일에 ID가 59인 상점에서 ID가 22154인 상품을 팔았습니다. 당시 판매가는 999루블(약 15,000원)입니다. 이 가격은 고정된 게 아니라 시간이 지나면 바뀔 수 있다는 말입니다.

item_cnt_day 피처는 당일 판매량을 나타냅니다. 첫 행의 item_cnt_day 값은 1.0입니다. 2013년 1월 2일에 ID 59인 상점에서 ID 22154인 상품을 1개 팔았다는 뜻입니다. 그런데 타깃값인 ‘월간’ 판매량이 아니군요! 그래서 item_cnt_day로 월간 판매량을 구해야 합니다. 각 상점의 상품별 일일 판매량을 월별로 합친 값이 곧 각 상점의 상품별 월간 판매량입니다. 즉, date_block_num 피처를 기준으로 그룹화해서 item_cnt_day 값을 합하면 타깃값이 됩니다. 이 개념은 앞으로 자주 쓰이니 잘 기억해두세요.

💡 분석 결과

티깃값 = date_block_num 피처의 값이 같은 데이터들의 item_cnt_day 값의 합

 

다음으로 info( ) 함수를 활용해 세부 사항을 살펴보죠. 참고로 DataFrame 행이 1,690,785개보다 많거나 열이 100개보다 많으면 info( ) 함수는 비결측값 개수를 출력하지 않습니다. sales_train은 행이 2,935,849개라서 기본값으로 info( )를 호출하면 비결측값 개수를 출력하지 않습니다. 이런 경우에 비결측값 개수를 표시하려면 show_counts 파라미터에 True를 전달하면 됩니다.

 

 

모든 피처의 Non-Null 개수가 전체 데이터 수인 2,935,849와 같습니다. 모든 피처에 결측값이 하나도 없다는 뜻이죠. 데이터 타입은 object, int64, float64로 다양합니다. 데이터가 300만 개 가까이 돼서 메모리 사용량도 134MB 정도 됩니다. 메모리 사용량은 가능한 한 줄여주는 게 바람직합니다. 작업 속도가 빨라지거든요. 메모리 사용량을 줄이는 방법은 2편에서 배워보겠습니다.

💡 분석 결과

메모리 관리 필요

 

한편, 보다시피 본 경진대회에서 제공한 데이터는 시계열 데이터입니다. 훈련 데이터에는 2013년 1월부터 2015년 10월까지 판매 내역이라서 시간순으로 기록돼 있습니다. 시계열 데이터는 시간 흐름이 중요합니다. 그렇기 때문에 2013년 1월부터 2015년 9월까지 판매 내역을 훈련 데이터로 사용하고, 2015년 10월 판매 내역을 검증 데이터로 사용해보겠습니다. 앞 장에서는 여러 폴드로 나눠 훈련 데이터와 검증 데이터를 지정했습니다(OOF 예측). 하지만 시계열 데이터에서 이렇게 하면 과거와 미래가 뒤섞이기 때문에 이용할 수 없습니다.

Note: 시계열 데이터에서는 시간 흐름 자체가 중요한 정보입니다.

💡 분석 결과

훈련 데이터 중 가장 최근인 2015년 10월 판매 내역을 검증 데이터로 사용

 

shops 데이터

두 번째로 shops 데이터를 살펴봅시다. shops는 상점에 관한 추가 정보가 담긴 데이터입니다.

 

▼ 실행 결과

 

상점명과 상점 ID 피처가 있습니다. 상점명이 러시아어군요. 텍스트 데이터에도 때론 유용한 정보가 담겨 있을 수 있지만, 그렇다고 이제부터 러시아어 공부를 시작할 순 없습니다. 이럴 때는 번역기를 이용하거나 다른 캐글러가 공유한 아이디어를 활용하면 됩니다. 상점명에서 새로운 피처를 구하는 방법은 9.4절 ‘성능 개선’에서 다루겠습니다. 결론부터 미리 말하자면 상점명의 첫 단어는 상점이 위치한 도시를 나타냅니다. 추후 shop_name에서 첫 단어를 추출해 도시 피처를 새로 만들 예정입니다.

💡 분석 결과

상점 이름의 첫 단어는 도시를 뜻함

 

shops 데이터의 shop_id 피처는 sales_train에도 있는 피처입니다. 그러므로 shop_id를 기준으로 sales_train과 shops를 병합할 수 있습니다.

💡 분석 결과

shop_id를 기준으로 sales_train과 shops 병합

 

이번에도 info( ) 함수를 호출해보겠습니다.

 

 

상점은 딱 60개만 있습니다. 결측값도 없고, 데이터 개수가 적어서 메모리 사용량도 1.1KB 정도로 적습니다.

 

items 데이터

이제 items 데이터를 살펴보시죠.

 

 

상품명, 상품 ID, 상품분류 ID로 구성돼 있습니다. 상품명도 역시 러시아어입니다. 상품명에서는 유용한 정보를 얻기 힘들어 모델링할 땐 제거할 계획입니다. 아울러, item_id 피처는 sales_train 데이터에도 존재하는 피처입니다. item_id 피처를 기준으로 sales_train과 items를 병합할 수 있겠네요.

💡 분석 결과

상품명 피처 제거

💡 분석 결과

item_id를 기준으로 sales_train과 items 병합

 

마찬가지로 info( ) 함수를 호출해보겠습니다.

 

상품은 총 22,170개입니다. 역시나 결측값은 없습니다.

 

item_categories 데이터

이번에 살펴볼 데이터는 item_categories입니다. 상품분류를 나타내는 데이터죠.

 

▼ 실행 결과

 

상품분류명과 상품분류 ID로 구성돼 있습니다. sales_train에도 item_category_id 피처가 보입니다. 이 피처를 기준으로 sales_train과 item_categories를 병합할 수 있겠네요.

💡 분석 결과

item_category_id를 기준으로 sales_train과 items_categories 병합

 

그런데 상품분류명도 러시아어입니다. 이 경진대회의 데이터를 ‘1C 컴퍼니’라는 러시아 소프트웨어 회사에서 제공했기 때문입니다. 겁 먹지 마세요. 요즘은 온라인 번역기도 훌륭하거니와, 공유된 캐글 노트북이나 토론을 참고하면 유용한 정보를 얻을 수 있습니다. 공유 문화는 캐글의 장점이니까요. 실제로 상품분류명의 첫 단어는 대분류를 뜻합니다. 추후 피처 엔지니어링 시 대분류 피처로 만들어보겠습니다.

💡 분석 결과

상품분류명에서 첫 단어는 대분류

 

이어서 info( )를 호출합니다.

 

 

84개의 상품분류가 있으며 결측값은 없습니다.

💡 분석 결과

모든 데이터에서 결측값 없음

 

테스트 데이터

이제 테스트 데이터를 살펴봅시다.

 

▼ 실행 결과

 

테스트 데이터 식별자인 ID와 상점 ID, 상품 ID로 구성돼 있습니다. 여기서 각 상점의 상품별 월간 판매량을 예측해야 합니다.

 

데이터 병합

지금까지 각 데이터가 어떻게 구성되어 있는지 살펴봤습니다. 이번에는 이 데이터들을 서로 병합해보려고 합니다. 병합한 데이터를 활용해 피처 요약표를 만들고 시각화도 하기 위해서죠. 앞서 설명한 바와 같이 sales_train, shops, items, item_categories 데이터는 특정 피처를 기준으로 병합할 수 있습니다.

판다스의 merge( )는 하나 이상의 열을 기준으로 DataFrame 행을 합쳐줍니다. SQL의 join 연산과 유사하죠. 사용법은 간단합니다. 기준이 되는 DataFrame에서 merge( ) 함수를 호출하고, 병합할 DataFrame을 인수로 넣어주면 됩니다. on 파라미터에는 병합 시 기준이 되는 피처를 전달합니다. how 파라미터에 ‘left’를 전달하면 왼쪽 DataFrame의 모든 행을 포함하는 결과를 반환합니다.

sales_train, shops, items, item_categories를 모두 병합해 그 결과를 train에 할당해보죠.

 

▼ 실행 결과

잘 병합됐네요.

 

피처 요약표 만들기

방금 병합한 train을 활용해서 피처 요약표를 만들겠습니다. 피처 요약표에는 데이터 타입, 결측값 개수, 고윳값 개수, 첫 번째 값, 두 번째 값을 담아보겠습니다.

 

 

▼ 실행 결과-피처 요약표

 

전체적으로 쓱 훑어보시기 바랍니다. 데이터 타입은 object, int64, float64로 다양하죠? 앞서 살펴봤듯이 결측값은 하나도 없네요. 고윳값 개수를 같이 보시죠. shop_id와 shop_name, item_id와 item_name, item_category_id와 item_category_name 피처의 고윳값 개수가 서로 같습니다. id와 name이 일대일로 매칭된다는 뜻입니다. 이 이유로 id와 name 둘 중 하나만 있어도 됩니다. 같은 정보를 갖는 두 피처를 함께 사용할 필요는 없으니까요. 다만 name 피처 중 모델링에 도움되는 파생 피처를 만들 수 있는 경우가 있습니다. name 피처를 활용해 파생 피처는 만드는 방법은 3편 성능 개선에서 다룹니다.

💡 분석 결과

상점ID, 상품ID, 상품분류ID는 각각 상점명, 상품명, 상품분류명과 1:1로 매칭되므로 둘 중 하나 제거

 

Note: 피처 요약표가 별 거 아닌 듯 보여도, 이번 예에서처럼 개별 데이터를 info() 함수로 살펴볼 때 미처 파악하지 못한 정보를 얻을 수도 있습니다. 번거롭더라도 피처 요약표를 만드는 습관을 들여보세요.

 

2.2 데이터 시각화

앞 절에서 병합한 train을 이용해 데이터 시각화를 해보겠습니다. 다른 장과 다르게 이번 장에서는 시각화할 게 별로 없습니다. 피처 개수가 많지 않고, 그중 일부는 식별자거나 문자 데이터이기 때문입니다. 간단하게 몇 가지 그래프만 그려보겠습니다.

 

일별 판매량

train에서 식별자나 문자 데이터를 제외하면 item_cnt_day 피처와 item_price 피처만 남습니다. 수치형 데이터인 두 피처를 박스플롯으로 시각화해보겠습니다. 먼저 item_cnt_day 피처를 박스플롯으로 그려보죠.

▼ 실행 결과

 

박스플롯 모양이 이상합니다. 6장(202쪽)에서 본 박스플롯 모양이 아니네요. 이상치가 많아서 그렇습니다. 이상치 범위가 과도하게 넓어서 1사분위 수, 2사분위 수, 3사분위 수를 나타내는 박스 모양이 납작해진 것입니다. 과한 이상치는 제거해야 합니다. 회사 임직원의 평균 연봉을 구할 때 CEO 연봉은 빼고 계산해야 하는 것처럼 말입니다. 이상치 제거도 ‘성능 개선’ 절에서 다룹니다. 그런데 얼마 이상을 이상치로 봐야 할까요? 정해진 건 없습니다. 여러 가지 값을 실험해보길 권합니다. 여기서는 item_cnt_day가 1,000 이상인 데이터를 제거할 계획입니다.

💡 분석 결과

일별 판매량에서 1,000 이상 데이터(이상치) 제거

 

판매가(상품 가격)

이어서 item_price 피처도 박스플롯으로 그려보겠습니다.

 

▼ 실행 결과

 

이번 박스플롯도 납작하네요. 300,000루블(약 450만 원)이 넘는 판매가 때문입니다. 추후 판매가가 50,000루블 이상인 이상치는 제거하겠습니다.

 

그룹화

이제는 데이터를 특정 피처 기준으로 그룹화해서 그려보겠습니다. 특정 피처를 기준으로 그룹화해 원하는 집곗값을 구하려면 groupby( ) 함수를 사용합니다. 회귀 문제에서 자주 쓰이는 함수로, 지금처럼 주로 집곗값을 구할 때 사용하죠. 피처 엔지니어링 때도 사용하니 사용법을 잘 익혀두기 바랍니다.

다음은 train의 date_block_num 피처를 기준으로 그룹화해 item_cnt_day 피처 값의 합(sum)을 구하는 코드입니다. 월별(date_block_num) 월간 판매량(item_cnt_day의 합)을 구한다는 말입니다.

 

▼ 실행 결과

 

reset_index( )를 호출하지 않으면 그룹화한 date_block_num 피처가 인덱스로 설정됩니다. 그래프를 그릴 때 date_block_num 피처를 사용해야 해서 새로운 인덱스를 만들었습니다.

지면 관계상 10행까지만 실었습니다. 2013년 1월부터 2015년 10월까지 월별 판매량이므로 실제로는 34행까지출력됩니다.

 

groupby 원리

groupby 작동 원리는 이렇습니다.

  1. DataFrame에 있는 한 개 이상의 피처를 기준으로 데이터를 분리합니다(앞 코드에서 기준이 되는 피처는 date_block_num).
  2. 분리된 각 그룹에 함수를 적용해 집곗값을 구합니다(앞 코드에서는 agg( ) 메서드로 item_cnt_day 피처에 ‘sum’ 함수를 적용해 판매량 합계를 구함).
  3. 기준 피처별로 집곗값 결과를 하나로 결합합니다.

이 과정을 도식화하면 다음과 같습니다.

 

▼ groupby 연산 예시

 

다음 표는 groupby( )에 적용할 수 있는 집계 함수 예시입니다.

 

▼ 집계 함수

 

groupby( ) 함수를 활용해 원하는 집곗값을 그래프로 그려볼까요. 총 세 가지 그래프, 즉 월별 판매량, 상품분류별 판매량, 상점별 판매량을 막대 그래프로 그려보겠습니다. 이 그래프에서 모델링하는 데 도움될 정보는 얻지 못합니다. 다만, 상품 판매량 양상을 대략 알아볼 수 있습니다. groupby( ) 함수의 활용법을 연습한다고 생각하셔도 좋겠습니다.

 

월별 판매량

먼저 groupby 합 연산 결과를 막대 그래프로 시각화해보겠습니다. 월별 판매량을 의미합니다.

▼ 실행 결과 – 월별 월간 판매량

 

보다시피 date_block_num 0부터 33까지, 즉 2013년 1월부터 2015년 10월까지 월별 월간 판매량을 알 수 있습니다. 11일 때와 23일 때 판매량이 가장 많은데, 각각 2013년 12월과 2014년 12월입니다. 연말이라 판매량이 급증한 것으로 보이네요.

 

상품분류별 판매량

다음으로 상품분류별 판매량을 보겠습니다. 상품분류는 총 84개로, 피처 고윳값 개수를 알려주는 nunique( )으로 구할 수 있습니다.

 

train['item_category_id'].nunique()

84

 

84개는 막대 그래프로 한 번에 표현하기에는 너무 많으니 판매량이 10,000개를 초과하는 상품 분류만 추출해서 그려보겠습니다.

 

▼ 실행 결과 – 상품 분류별 월간 판매량

 

ID 40인 상품분류가 가장 많이 팔렸습니다. ID 30과 55가 뒤를 잇네요. 몇몇 상품분류가 다른 범주에 비해 많이 팔리는 양상입니다.

 

상점별 판매량

이어서 상점별 월간 판매량을 살펴봅시다. 상점 개수는 60개입니다. 역시나 그래프 하나로 나타내기에 많아서 판매량이 10,000개를 초과하는 상점만 추렸습니다.

▼ 실행 결과 – 상점별 월간 판매량

 

ID가 31인 상점이 가장 많은 상품을 판매했고, ID가 25인 상점이 뒤를 잇습니다. 7~8개 상점이 다른 상점보다 많이 판매하는 양상을 보입니다.

 

3. 분석 정리 및 모델링 전략

3.1 분석 정리

1. 대회의 타깃값 규정상, 판매량 관련 피처의 값은 모두 0~20 사이로 제한해야 합니다.

2. 시계열 데이터이므로 데이터 순서를 꼭 지켜야 합니다.

a. OOF 예측 등 데이터 순서가 무시되는 기법은 사용할 수 없습니다.

b. 검증 데이터는 훈련 데이터 중 가장 최근 1개월치를 이용하겠습니다.

3. 타깃값 : 월별 판매량을 예측해야 하나, 주어진 데이터에는 일별 판매량만 있습니다. 같은 달의 일별 판매량을 합쳐 타깃값을 구해야 합니다.

4. 데이터 병합 : 추가 정보 파일(상점, 상품, 상품분류)은 각각의 ID(상점ID, 상품ID, 상품분류ID)를 기준으로 훈련 데이터에 병합할 수 있습니다.

5. 다양한 피처 엔지니어링 후에 데이터 크기가 커져서 메모리 관리가 필요합니다.

6. 파생 피처 추가 : 상점명과 상품분류명의 첫 단어는 각각 도시와 대분류를 뜻합니다.

7. 피처 제거 : 월별 판매량만 구하면 되니 date 피처는 필요 없습니다.

8. 피처 제거 : 상점ID, 상품ID, 상품분류ID는 각각 상점명, 상품명, 상품분류명과 1:1로 매칭되므로 둘 중 하나만 있으면 됩니다.

9. 이상치 제거 : 일별 판매량과 판매가에는 값이 과한 데이터(이상치)가 보입니다.

10. 모든 데이터에서 결측값이 없습니다.

 

3.2 모델링 전략

본 글은 피처 엔지니어링에 집중합니다. 다른 모델링 요소는 최소한만 수행하겠습니다. 특히 성능 개선 단계에서는 위 분석 정리에서 미처 발견하지 못한 피처 엔지니어링도 수행합니다.

  • 베이스라인 모델 : LightGBM
    • 피처 엔지니어링 : 피처명 한글화, 데이터 다운캐스팅, 데이터 조합 생성, 타깃값 추가
  • 성능 개선 : LightGBM 유지
    • 피처 엔지니어링 : 이상치 제거, 전처리 등 다양한 파생 피처 추가, 인코딩, 결측값 처리

베이스라인 모델과 성능 개선은 다음 노트북을 리팩터링하여 작성했습니다.

2편에서는 데이터를 적절히 처리하여 베이스라인 모델을 만들겠습니다.

신백균
KAIST 산업및시스템공학과 졸업 후 한국생산성본부에서 직무교육 기획 및 운영을 담당하는 전문위원입니다. 세계 랭킹 0.18%의 캐글 노트북 엑스퍼트(Expert)이며, 월 평균 6만여 명이 방문하는 데이터 분석/머신러닝 관련 기술 블로그를 운영하고 있습니다. 참여자 1,200명 이상인 머신러닝 관련 오픈 채팅방의 운영진이기도 합니다.

3 Comments

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내