이번 글은 「쿨링 샴푸 기획기」 시리즈의 첫 번째 글입니다.
올리브영 온라인몰에서 쿨링 샴푸 상품과 리뷰 데이터를 직접 수집하고,
이후 분석을 위한 데이터 기반을 구축했습니다.
크롤링 대상과 수집 범위를 정의하고,
신제품 기획을 위한 초기 가설을 설정하는 과정을 정리했습니다.
왜 쿨링 샴푸인가?
저는 주변에서 흔히 말하는 ‘쿨친놈’입니다. 계절과 상관없이 두피가 조금만 답답해도 시원한 샴푸를 찾고, 새로운 쿨링 샴푸가 나오면 직접 사서 써볼 정도로 관심이 많았습니다.
하지만 막상 제품을 고르려고 하면 항상 같은 고민이 생겼습니다. ‘진짜 시원한 걸까?’, ‘향은 어떨까?’, ‘머리카락이 뻣뻣해지진 않을까?’ 리뷰는 많지만 기준이 모두 달라 어떤 제품을 선택해야 할지 판단하기 어려웠습니다.
그래서 이번에는 소비자의 감각을 데이터로 확인해 보기로 했습니다. 단순히 평점이 높은 제품이 아니라, 사람들이 어떤 경험을 긍정적으로 이야기하고 어떤 이유로 불만을 남기는지 리뷰 데이터를 직접 수집해 분석했습니다.
좋아하는 제품을 더 잘 이해하기 위해 시작한 프로젝트가, 소비자의 구매 경험을 데이터로 해석하는 프로젝트가 되었습니다.
분석 질문
데이터를 수집하기 전에 가장 먼저 정리한 것은 소비자는 실제로 어떤 기준으로 쿨링 샴푸를 평가하는가?였습니다.
제품 상세 페이지에서는 대부분 ‘강력한 쿨링감’을 핵심 장점으로 소개하지만,
실제 구매자들은 전혀 다른 요소를 중요하게 생각할 수도 있습니다.
따라서 리뷰를 분석하기에 앞서 소비자의 구매 경험에 대해 몇 가지 질문을 세우고,
이후 데이터를 통해 하나씩 확인해 보기로 했습니다.
Q1. 소비자는 정말 ‘시원함’을 가장 중요한 기준으로 제품을 평가할까?
Q2. 쿨링감 외에도 소비자가 함께 중요하게 언급하는 요소는 무엇일까?
Q3. 만족과 불만족을 결정하는 핵심 요인은 어떤 경험에서 비롯될까?
데이터 수집
분석을 위해 올리브영 온라인몰에서 ‘쿨링 샴푸’를 검색하여 판매 중인 상품과 리뷰 데이터를 직접 수집했습니다. 단순히 리뷰만 저장하는 것이 아니라, 상품 정보와 리뷰를 하나의 데이터셋으로 연결해 제품 단위의 분석이 가능하도록 데이터를 구성했습니다.
올리브영은 상품 목록과 리뷰가 JavaScript를 통해 동적으로 생성되는 구조였습니다. 따라서 브라우저를 실제 사용자처럼 제어하고, 리뷰 API 응답까지 확인할 수 있는 Playwright를 사용해 크롤러를 구현했습니다.
- 01 검색 조건 설정
-
올리브영 온라인몰에서 ‘쿨링 샴푸’를 검색한 뒤
리뷰 많은 순으로 상품을 정렬했습니다.
특정 상품을 제외하기 위한 기준이 아니라, 소비자 반응이 많이 축적된 상품부터 순차적으로 수집하기 위한 기준으로 활용했습니다. - 02 상품 목록 정보 수집
-
검색 결과 페이지를 순회하며
브랜드, 상품명, 가격, 상품 URL 등 기본 상품 정보를 수집했습니다.
특히 상품 URL은 이후 상세 페이지로 이동하고, 리뷰 데이터와 상품 정보를 연결하기 위한 기준값으로 함께 저장했습니다. - 03 상품 상세 페이지 탐색
-
수집한 상품 URL을 기준으로 각 상세 페이지에 접속한 뒤
리뷰 탭으로 이동했습니다.
페이지가 완전히 로드된 이후 Review API 요청이 발생할 때까지 대기하도록 구현했으며, 상품마다 최대 20개의 리뷰를 동일한 방식으로 수집했습니다. - 04 Review API 응답 수집
-
리뷰 화면의 HTML을 직접 파싱하는 대신,
리뷰 탭 진입 시 발생하는 네트워크 요청을 감지했습니다.
API의 JSON 응답에서 리뷰 본문, 평점, 작성일 등의 데이터를 추출하여 화면 구조 변경의 영향을 줄이고, 보다 안정적으로 리뷰 데이터를 확보할 수 있었습니다. - 05 상품 정보와 리뷰 연결
-
수집한 리뷰 데이터에
상품명, 브랜드, 가격, 상품 URL을 함께 연결했습니다.
이를 통해 리뷰 단위뿐 아니라 상품별 리뷰 수와 평점, 주요 키워드 등을 비교할 수 있는 분석용 데이터 구조를 구성했습니다. - 06 DataFrame 변환 및 CSV 저장
-
최종 데이터는 Pandas DataFrame으로 변환한 뒤
CSV 파일로 저장했습니다.
컬럼명과 데이터 형식을 정리하여 이후 전처리와 EDA를 별도의 병합 작업 없이 바로 수행할 수 있도록 분석용 데이터셋을 구축했습니다.
분석 데이터
크롤링을 통해 상품 정보와 리뷰 정보를 각각 별도의 데이터셋으로 구축했습니다.
상품 데이터셋은 분석 대상이 되는 제품의 기본 정보를, 리뷰 데이터셋은 소비자의 실제 사용 경험과 평점 정보를 담고 있습니다.
이후 두 데이터셋을 함께 활용하여 상품 특성과 소비자 반응을 연결해 분석할 수 있도록 구성했습니다.
- 리뷰순위
- 리뷰 많은 순 정렬 기준
- 페이지
- 검색 결과 페이지 번호
- 정렬
- 검색 정렬 방식
- 브랜드
- 상품 브랜드명
- 상품명
- 올리브영 등록 상품명
- 가격
- 판매 가격
- 상품URL
- 상품 상세 페이지 주소
- 리뷰순위
- 상품 리뷰 순위
- 브랜드
- 상품 브랜드명
- 상품명
- 상품명
- 가격
- 판매 가격
- 상품내리뷰번호
- 상품 내 리뷰 번호
- 리뷰ID
- 리뷰 고유 식별자
- 리뷰내용
- 소비자가 작성한 리뷰 본문
- 리뷰평점
- 리뷰 평점(1~5점)
- 도움돼요수
- 도움돼요를 받은 횟수
- 사진여부
- 포토 리뷰 여부
- 옵션명
- 구매 옵션 정보
분석 데이터 준비
수집한 원본 데이터에는 검색 페이지 정보와 수집 과정에서 사용한 값까지 포함되어 있었습니다.
이번 단계에서는 이후 분석에 필요한 컬럼만 선별하고, 상품 데이터와 리뷰 데이터를 각각 별도의 데이터셋으로 정리했습니다.
이 단계에서는 분석에 필요한 데이터 구조를 정리하는 데까지만 진행했습니다. 결측치 확인, 데이터 타입 변환, 가격 정제, 리뷰 텍스트 전처리 등의 작업은 다음 글에서 상품 데이터 분석과 함께 다룰 예정입니다.
- 01 분석 컬럼 선택
-
상품 분석과 리뷰 분석에 직접 활용할 수 있는 컬럼을 중심으로 데이터를 선별했습니다.
상품 데이터에는 리뷰순위, 브랜드, 상품명, 가격, 상품 URL을 남겼고, 리뷰 데이터에는 리뷰 내용과 평점, 도움돼요 수, 사진 여부, 옵션명 등을 포함했습니다. - 02 상품·리뷰 데이터 분리
-
상품의 기본 정보와 소비자 리뷰는 분석 목적이 다르기 때문에
하나의 파일에 모두 담지 않고 각각 별도의 DataFrame으로 구성했습니다.
이를 통해 다음 분석에서 상품 분포와 리뷰 특성을 독립적으로 살펴볼 수 있도록 했습니다. - 03 분석용 CSV 저장
-
선별한 컬럼을 기준으로 상품 데이터와 리뷰 데이터를 각각 CSV 파일로 저장했습니다.
이후 분석 단계에서는 크롤러를 다시 실행하지 않고 저장된 파일을 불러와 전처리와 EDA를 진행할 수 있도록 구성했습니다.
어려웠던 점
프로젝트를 진행하며 데이터를 수집하는 과정에서 예상하지 못했던 문제를 마주했고, 그 과정에서 크롤링 환경과 데이터 수집 방식에 대해 많은 것을 배울 수 있었습니다.
실행 환경 변경으로 크롤링 안정화
초기에는 Google Colab에서 Playwright를 실행했지만, 브라우저가 정상적으로 열리지 않거나 자동화 접근으로 인식되는 문제가 발생했습니다. 이후 VS Code에서 설치된 Chrome을 직접 제어하는 방식으로 변경하면서 상품 탐색과 리뷰 API 수집을 안정적으로 수행할 수 있었습니다.
리뷰 수집 범위의 한계
상품당 30개의 리뷰를 수집하는 것을 목표로 했지만, 리뷰 API는 한 번의 요청에서 최대 20개의 리뷰만 반환했습니다. 이후 요청을 이어가는 방식도 여러 차례 시도했지만 안정적으로 구현하지 못해 이번 프로젝트에서는 상품당 20개의 리뷰를 활용했습니다. 향후에는 API 요청 구조를 더 분석해 수집 범위를 확장해보고자 합니다.
“쿨링 샴푸 기획기 ① | 올리브영 리뷰 크롤링 및 가설 설정”에 대한 1개의 생각