AI

Bright Data, Gemini, Streamlit을 활용한 AI 기반 아마존 제품 분석기 구축

Bright Data API, Gemini AI, Streamlit을 활용하여 강력한 인사이트와 대시보드를 제공하는 AI 기반 아마존 제품 분석기 앱을 만드는 방법을 알아보세요.
8 분 읽기
Amazon Product Analyzer with Bright Data, Gemini, and Streamlit

아마존에서 제품을 수동으로 비교하는 데 지치셨나요? 검색 결과에 대해 AI에게 질문하고 싶으신가요? 가격이나 평점 정렬 이상의 통찰력이 필요하신가요? 이 튜토리얼에서는 23개 아마존 마켓플레이스 중 어디든 검색하고, AI로 결과를 분석하며, 대화형 대시보드를 통해 통찰력을 제공하는 아마존 제품 분석기를 구축하게 됩니다.

구축할 내용

이 가이드를 마치면 아마존 제품 데이터를 가져와 AI 기반 인사이트가 포함된 탐색하기 쉬운 대시보드로 정리하는 기능성 웹 앱을 갖게 됩니다.

amazon-product-analytics-bright-data

핵심 기능 및 사용자 워크플로

작동 방식은 다음과 같습니다:

  1. 검색 및 데이터 수집. 23개 아마존 마켓플레이스(미국, 독일, 일본 등) 중 하나를 선택하고 “무선 헤드폰”과 같은 제품 키워드를 입력하세요. 앱은 Bright Data의 웹 스크레이퍼 API를 사용하여 제품 정보를 수집합니다.
  2. 정리된 결과 표시. 데이터는 깔끔한 탭 기반 인터페이스로 제공됩니다:
    • 추천 기능. 맞춤형 점수 알고리즘(평점, 리뷰 수, 할인율 결합)으로 순위를 매긴 제품을 “최고의 가성비”, “최고 평점”, “최저가” 3개 카테고리로 확인하세요.
    • 시장 분석. 가격 분포와 평점 패턴을 보여주는 인터랙티브 차트를 탐색하여 제품 환경을 파악하세요.
    • AI 어시스턴트. “100달러 미만 최고 평점 제품은?”과 같은 자연어 질문을 할 수 있습니다. AI가 현재 검색 결과를 분석하여 제품 인용과 함께 답변을 제공합니다.
    • 제품 결과. 전체 데이터셋을 탐색하고 정렬하며, 추가 분석을 위해 CSV로 내보낼 수 있습니다.

앱의 기능을 살펴봤으니, 이제 이를 가능하게 하는 기술들을 살펴보겠습니다.

기술 스택 및 프로젝트 아키텍처

본 앱은 최신식 Python 기반 스택을 사용하며, 데이터 처리, AI, 웹 개발 분야에서 각 구성 요소의 특화된 강점을 고려하여 선택되었습니다.

구성 요소 기술 목적
데이터 소스 Bright Data Amazon 스크레이퍼 API 프록시 관리나 CAPTCHA 해결의 번거로움 없이 안정적이고 기업 규모의 Amazon 데이터 수집을 제공합니다.
프론트엔드 Streamlit Python만으로 인터랙티브하고 아름다운 웹 대시보드를 빠르게 구축하세요.
AI 통합 Google Gemini 자연어 인사이트, 데이터 요약 및 AI 어시스턴트 기능.
데이터 처리 Pandas 모든 데이터 정리, 변환 및 분석의 초석.
수학 연산 NumPy 값 스코어링 알고리즘 및 통계 계산.
시각화 Plotly 사용자가 탐색할 수 있는 풍부하고 상호작용적인 차트 및 그래프.
HTTP(S) 및 재시도 요청 + 끈기 외부 API와의 강력하고 탄력적인 통신.

프로젝트 아키텍처

이 프로젝트는 관심사 분리를 명확히 하여 코드의 유지 관리 및 확장을 용이하게 하기 위해 모듈식 구조로 구성됩니다.

├── streamlit_app.py         # 메인 Streamlit 애플리케이션 진입점
├── requirements.txt         # 프로젝트 종속성
├── .env                     # API 키 및 환경 변수 (비공개)
└── amazon_analytics/        # 핵심 애플리케이션 로직 모듈
    ├── __init__.py          # 패키지 초기화
    ├── api.py               # Bright Data API 통합
    ├── data_processor.py    # 데이터 정리, 정규화 및 피처 엔지니어링
    ├── shopping_intelligence.py # 제품 추천 및 스코어링 엔진
    ├── gemini_ai_engine.py  # Gemini를 활용한 AI 분석 및 프롬프트 엔지니어링
    ├── ai_engine_interface.py   # 추상화된 AI 엔진 인터페이스
    ├── ai_response.py       # 표준화된 AI 응답 객체
    └── config.py            # 구성 관리

아키텍처가 명확해졌으니, 이제 개발 환경을 준비해 보겠습니다.

필수 조건

코딩을 시작하기 전에 다음 사항을 준비하세요:

이들 준비가 완료되면 프로젝트 설정을 진행할 수 있습니다.

1단계 – 개발 환경 설정

먼저 프로젝트 저장소를 복제하고, 종속성을 분리하기 위한 가상 환경을 생성한 후 필요한 패키지를 설치합니다.

설치

터미널을 열고 다음 명령어를 실행하세요:

# 저장소 복제
git clone https://github.com/triposat/amazon-product-analytics.git
cd amazon-product-analytics

# 가상 환경 생성 및 활성화
python -m venv venv
source venv/bin/activate  # Windows에서는 venvScriptsactivate 사용

# 필수 라이브러리 설치
pip install -r requirements.txt

API 키 구성

다음으로, 프로젝트 루트 디렉터리에 .env 파일을 생성하여 API 키를 안전하게 저장하세요.

# .env 파일 생성
touch .env

이제 텍스트 편집기로 .env 파일을 열고 키를 추가하세요:

BRIGHT_DATA_TOKEN=your_bright_data_token_here
GOOGLE_API_KEY=your_google_api_key_here

이제 환경 설정이 완료되었습니다. 데이터 수집부터 시작하여 핵심 로직을 살펴보겠습니다.

2단계 – Bright Data로 아마존 제품 데이터 스크래핑하기

우리 앱의 기반은 고품질 데이터입니다. 아마존과 같은 사이트를 수동으로 스크래핑하는 것은 복잡합니다. 프록시를 관리하고, 다양한 페이지 레이아웃을 처리하며, 아마존의 CAPTCHA 및 차단 메커니즘을 우회할 방법을 찾아야 합니다.

Bright Data의 Amazon 웹 스크레이퍼 API는 이러한 복잡성을 모두 추상화합니다. 이 API는 다음을 제공합니다:

  • 기업급 안정성. 195개국에 걸쳐 윤리적으로 확보된 1억 5천만 개 이상의 주거용 프록시 IP 네트워크를 기반으로 구축되어 일관되고 중단 없는 접근을 보장합니다.
  • 인프라 관리 부담 제로. 자동 IP 로테이션, CAPTCHA 해결, 프록시 관리가 백그라운드에서 처리됩니다.
  • 포괄적인 구조화된 데이터. ASIN, 가격, 평점, 리뷰, 판매자 정보, 제품 설명, 이미지, 재고 현황 등 제품당 20개 이상의 데이터 포인트를 포함한 깔끔하고 구조화된 JSON 데이터를 제공합니다.
  • 비용 효율적인 가격 정책. 레코드당 $0.001부터 시작하는 종량제 모델로, 모든 규모의 프로젝트에 확장 가능합니다.

API 통합 (api.py)

api.py의 BrightDataAPI 클래스는 API와의 모든 상호작용을 처리합니다. 트리거-폴링-다운로드 워크플로를 사용하며, 이는 잠재적으로 장시간 실행되는 스크래핑 작업을 처리하는 데 이상적입니다.

trigger_search 메서드는 스크래핑 작업을 시작합니다. tenacity 라이브러리의 @retry 데코레이터 사용에 주목하세요. 요청 실패 시 지수적 백오프(exponential backoff)로 자동 재시도하여 복원력을 추가합니다.

# amazon_analytics/api.py

class BrightDataAPI:
    def __init__(self, token: Optional[str] = None):
        self.token = token or BRIGHT_DATA_TOKEN
        self.base_url = "https://api.brightdata.com/datasets/v3"
        self.headers = {
            "Authorization": f"Bearer {self.token}",
            "Content-Type": "application/json"
        }

    @retry(
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=4, max=10),
        retry=retry_if_exception_type((requests.RequestException, BrightDataAPIError))
    )
    def trigger_search(self, keyword: str, amazon_url: str, pages_to_search: str = "") -> str:
        """새로운 스크래핑 작업을 트리거하고 스냅샷 ID를 반환합니다."""
        payload = [{
            "keyword": keyword,
            "url": amazon_url,
            "pages_to_search": pages_to_search
        }]

        response = requests.post(
            f"{self.base_url}/trigger",
            headers=self.headers,
            json=payload,
            params={
                "dataset_id": BRIGHT_DATA_DATASET_ID,
                "include_errors": "true",
                "limit_multiple_results": "150"
            },
            timeout=30
        )
        response.raise_for_status()
        return response.json()["snapshot_id"]

검색을 트리거한 후, wait_for_results 메서드는 작업이 완료될 때까지 API를 폴링한 다음 데이터를 다운로드합니다. 이는 대기 중 앱이 멈추는 것을 방지하고 무한 루프를 피하기 위한 타임아웃을 포함합니다.

신뢰할 수 있는 데이터 수집이 마련되면, 다음 단계는 이 원시 데이터를 정리하고 보강하는 것입니다.

3단계 – 데이터 처리 파이프라인 구축

어떤 출처에서든 원시 데이터가 분석에 완벽한 형식으로 제공되는 경우는 거의 없습니다. data_processor.py의 DataProcessor 클래스는 스크랩된 아마존 데이터를 정리하고 정규화하며 새로운 특징을 추출하여 AI 및 시각화 계층에 바로 사용할 수 있도록 준비합니다. 데이터 처리 전반에 대한 더 넓은 시각은 Python을 활용한 데이터 분석 가이드를 참조하세요.

지능형 가격 파싱

전자상거래 데이터의 주요 과제 중 하나는 국제적 형식 처리입니다. 예를 들어 독일의 가격은 “1.234,56”인 반면 미국에서는 “1,234.56”으로 표기됩니다. parse_float_locale 함수는 이러한 변형을 지능적으로 처리합니다.

# amazon_analytics/data_processor.py (가독성을 위해 단순화됨)

def parse_float_locale(self, value: Any) -> Optional[float]:
    """국제 숫자 형식을 처리하는 견고한 부동 소수점 파서."""
    if value is None or value == "":
        return None
    if isinstance(value, (int, float)):
        return float(value)
    if isinstance(value, str):
        s = re.sub(r"[^0-9.,]", "", value)
        has_comma = "," in s
        has_dot = "." in s

        if has_comma and has_dot:
            # 마지막 위치로 소수점 구분자 판단
            if s.rfind(',') > s.rfind('.'):
                s = s.replace('.', '').replace(',', '.')  # 유럽식
            else:
                s = s.replace(',', '')  # 미국식
        elif has_comma:
            # 쉼표가 천 단위 구분자인지 소수점 구분자인지 확인
            if re.search(r",d{3}$", s):
                s = s.replace(',', '')  # 천 단위 구분자
            else:
                s = s.replace(',', '.')  # 소수점 구분자

        return float(s)
    return None

사용자 정의 가치 점수 알고리즘

사용자가 최적의 제품을 신속하게 식별할 수 있도록 맞춤형 value_score를 개발했습니다. 이 복합 지표는 여러 요소를 단일하고 이해하기 쉬운 점수로 통합합니다.

# amazon_analytics/data_processor.py

def compute_value_score(
    self,
    rating: Optional[float],
    num_ratings: Optional[int],
    discount_pct: Optional[float],
    min_reviews: int = 10)
 -> float:
    """품질, 사회적 증거, 거래 가치를 기반으로 복합 가치 점수를 계산합니다."""
    score = 0.0

    # 제품 품질(평점)에 40% 가중치 부여
    if rating and rating > 0:
        score += (rating / 5.0) * 0.4

    # 사회적 증거(평점 수)에 30% 가중치
    if num_ratings and num_ratings >= min_reviews:
        # 인기 폭발 상품의 점수 독점을 방지하기 위한 로그 스케일
        review_score = min(math.log10(num_ratings) / 4, 1.0)
        score += review_score * 0.3

    # 거래 가치(할인율) 30% 가중치
    if discount_pct and discount_pct > 0:
        discount_score = min(discount_pct / 50, 1.0)  # 최대 50% 할인 적용
        score += discount_score * 0.3

    return round(score, 2)

이 알고리즘은 품질(평점), 사회적 증거(리뷰 수), 거래 가치(할인)를 균형 있게 고려하여 제품의 매력을 종합적으로 측정합니다.
이제 데이터가 정리되고 보강되었으므로, 더 깊은 통찰을 위해 AI 엔진에 입력할 수 있습니다.

4단계 – Gemini를 활용한 AI 통합으로 스마트 분석 구현

이제 앱이 진정한 지능을 갖추게 됩니다. Google의 Gemini AI를 활용해 처리된 데이터를 분석하고 사용자 질문에 답변합니다. 대규모 언어 모델(LLM)의 주요 문제점은 환각 현상(원본 데이터에 존재하지 않는 사실을 생성하는 것)입니다. 저희 GeminiAIEngine은 이를 방지하도록 설계되었습니다.

# amazon_analytics/gemini_ai_engine.py (튜토리얼 명확성을 위해 크게 단순화됨)

def _create_anti_hallucination_prompt(self, user_query: str, df: pd.DataFrame) -> str:
    """모든 데이터 컨텍스트를 포함하여 환각 방지 프롬프트 생성"""

    # 참고: 실제 구현에는 20개 이상의 제품 속성에 대한 상세한 필드 매핑,
    # 유형 변환 및 NaN 처리가 포함됩니다.
    products_data = []
    for _, row in df.iterrows():
        product = {
            'name': str(row.get('name', 'N/A')),
            'asin': str(row.get('asin', 'N/A')),
            'final_price': float(row.get('final_price', 0)) if pd.notna(row.get('final_price')) else 0,
            'rating': float(row.get('rating', 0)) if pd.notna(row.get('rating')) else 0,
            'num_ratings': int(row.get('num_ratings', 0)) if pd.notna(row.get('num_ratings')) else 0,
            # ... 추가 필드 (적절한 타입 처리 포함)
        }
        products_data.append(product)

    return f"""당신은 고급 추론 능력을 갖춘 아마존 제품 분석 전문가입니다.

제로 환각 규칙:
1. 제품 정보를 절대 임의로 생성하거나 발명하지 마십시오
2. 아래 명시적으로 제공된 데이터만 사용하십시오
3. 정보가 누락된 경우 "이 정보는 제공되지 않습니다"라고 명확히 표기하십시오
4. 항상 검증 가능한 특정 제품 ASIN을 인용하십시오
5. 실제 데이터를 기반으로 추론을 통해 가치 있는 통찰력을 제공하십시오

추론 능력:
- 가격, 평점, 리뷰, 기능을 분석하여 제품을 비교하십시오
- 가격 대 평점 관계를 고려하여 최고의 가성비 제품을 식별하십시오
- 평점 품질과 리뷰 양을 평가하여 제품 신뢰도를 판단하십시오
- 초기 가격과 최종 가격을 비교하여 특가 상품을 감지하십시오

사용자 질의: {user_query}

사용 가능한 제품 데이터 ({len(df)}개 제품):
{json.dumps(products_data, indent=2)}

이 데이터를 분석하여 유용하고 정확한 통찰력을 제공하십시오. 검증용으로 특정 ASIN과 숫자를 포함하세요."""

주요 환각 방지 기법:

  1. 완전한 데이터 포함. 모든 제품 정보가 AI에 제공되어 추측의 여지를 남기지 않습니다.
  2. 명시적 경계 설정. AI가 수행할 수 있는 작업과 불가능한 작업에 대한 명확한 규칙.
  3. ASIN 인용. 검증 목적으로 AI가 특정 제품을 참조하도록 강제합니다.
  4. 구조화된 데이터 형식. JSON 형식은 AI의 데이터 파싱을 안정적으로 만듭니다.

이러한 프롬프트 엔지니어링 접근법은 AI를 신뢰할 수 있는 데이터 분석가로 전환하여 출력 결과의 신뢰성과 검증 가능성을 보장합니다.

AI 엔진이 준비되면 추천 시스템을 구축할 수 있습니다.

5단계 – 쇼핑 인텔리전스 엔진 생성

shopping_intelligence.py의 ShoppingIntelligenceEngine은 처리된 데이터를 사용하여 “최고의 종합 가치”, “최고 평점”, “최고의 거래”라는 3가지 주요 추천을 생성합니다. 이 엔진은 정교한 필터링 기준을 적용하여 품질 높은 추천을 보장합니다.

이 시스템은 제품 사전 목록으로 작동하며, 각 추천 범주에 대해 별도의 헬퍼 메서드를 사용하며, 각각 특정 품질 기준을 적용합니다.

# amazon_analytics/shopping_intelligence.py

class ShoppingIntelligenceEngine:
    def analyze_products(self, products: List[Dict[str, Any]]) -> Dict[str, Any]:
        """제품 데이터로부터 쇼핑 인텔리전스 생성"""
        if not products:
            return {'total_items': 0, 'top_picks': []}

        top_picks = self._generate_top_picks(products)

        return {
            'total_items': len(products),
            'top_picks': top_picks
        }

    def _generate_top_picks(self, products: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
        """합리적인 근거와 함께 상위 제품 추천 생성"""
        try:
            # 먼저 유효한 제품만 필터링
            valid_products = []
            for product in products:
                rating = product.get('rating')
                price = product.get('final_price')

                if rating is not None and price is not None and rating > 0 and price > 0:
                    valid_products.append(product)

            if not valid_products:
                return []

            picks = []
            used_asins = set()

            # 각 카테고리를 전용 메서드로 찾음
            best_value = self._find_best_value(valid_products)
            if best_value and best_value.get('asin') not in used_asins:
                picks.append({
                    'product': best_value,
                    'reason': '최고의 종합 가치',
                    'explanation': '품질, 가격, 고객 리뷰의 탁월한 균형'
                })
                used_asins.add(best_value['asin'])

            highest_rated = self._find_highest_rated(valid_products)
            if highest_rated and highest_rated.get('asin') not in used_asins:
                picks.append({
                    'product': highest_rated,
                    'reason': '최고 평점',
                    'explanation': '검증된 실적을 바탕으로 한 최고의 고객 만족도'
                })
                used_asins.add(highest_rated['asin'])

            best_deal = self._find_best_deal(valid_products)
            if best_deal and best_deal.get('asin') not in used_asins:
                picks.append({
                    'product': best_deal,
                    'reason': '최적 거래',
                    'explanation': '상당한 절감 효과와 우수한 품질로 뛰어난 가치'
                })
                used_asins.add(best_deal['asin'])

            # 필요한 경우 품질 좋은 제품으로 남은 슬롯 채우기
            if len(picks) < 3:
                remaining_products = [p for p in valid_products if p.get('asin') not in used_asins]
                remaining_products.sort(key=lambda x: x.get('value_score', 0), reverse=True)

                for product in remaining_products[:3-len(picks)]:
                    picks.append({
                        'product': product,
                        'reason': '품질 선택',
                        'explanation': '품질과 가격의 균형이 우수함'
                    })

            return picks[:3]

        except Exception:
            return []

품질 필터링 방법

각 추천 카테고리는 신뢰할 수 있는 추천을 보장하기 위해 특정 품질 기준을 적용합니다:

def _find_best_value(self, products: List[Dict[str, Any]]) -> Dict[str, Any]:
    """가성비 점수가 가장 높은 상품 찾기 - 10개 이상의 리뷰 필요"""
    candidates = [p for p in products if
                 p.get('value_score') is not None and
                 p.get('num_ratings', 0) >= 10]

    if not candidates:
        return None

    return max(candidates, key=lambda p: p.get('value_score', 0))

def _find_highest_rated(self, products: List[Dict[str, Any]]) -> Dict[str, Any]:
    """평점 4.0 이상, 리뷰 50개 이상인 최고 평점 제품 찾기"""
    candidates = [p for p in products if
                 p.get('rating', 0) >= 4.0 and
                 p.get('num_ratings', 0) >= 50]

    if not candidates:
        return None

    return max(candidates, key=lambda p: (p.get('rating', 0), p.get('num_ratings', 0)))

def _find_best_deal(self, products: List[Dict[str, Any]]) -> Dict[str, Any]:
    """최적 할인 상품 찾기 - 10% 이상 할인 및 3.5 이상 평점 필수"""
    candidates = [p for p in products if
                 p.get('discount_pct') is not None and
                 p.get('discount_pct', 0) >= 10 and
                 p.get('rating', 0) >= 3.5]

    if not candidates:
        return None

    return max(candidates, key=lambda p: p.get('discount_pct', 0))

핵심 설계 결정 사항:

  1. 품질 기준. 각 카테고리에는 품질이 낮은 제품 추천을 방지하기 위한 최소 기준이 적용됩니다.
  2. 중복 방지. used_asins 집합을 통해 각 상품이 한 번만 표시되도록 보장합니다.
  3. 대체 로직. 추천 항목이 3개 미만일 경우, 차선책인 값 점수로 채움.
  4. 오류 처리. Try/catch로 잘못된 데이터로 인한 크래시를 방지합니다.

이 접근 방식은 사용자가 단순히 처음 발견된 제품이 아닌 신뢰할 수 있는 고품질 추천을 받도록 보장합니다.

이제 모든 백엔드 구성 요소가 준비되었습니다. 사용자 인터페이스를 구축하여 모든 요소를 통합해 보겠습니다.

6단계 – Streamlit으로 대화형 대시보드 설계

마지막으로 streamlit_app.py에서 처리하는 사용자 인터페이스를 구현합니다. Streamlit을 사용하면 최소한의 코드로 반응형 웹 기반 대시보드를 구축할 수 있습니다. 이 앱은 실시간 진행 상황 추적과 다양한 차트 유형을 지원하는 정교한 탭 기반 레이아웃을 사용합니다.

세션 상태 및 컴포넌트 캐싱

이 앱은 데이터 흐름 관리를 위해 특정 세션 상태 변수를 사용하고 성능 향상을 위해 백엔드 컴포넌트를 캐싱합니다:

# streamlit_app.py - 세션 상태 초기화

if 'search_results' not in st.session_state:
    st.session_state.search_results = []
if 'shopping_intelligence' not in st.session_state:
    st.session_state.shopping_intelligence = {}
if 'current_run_id' not in st.session_state:
    st.session_state.current_run_id = None

@st.cache_resource
def get_backend_components():
    """백엔드 컴포넌트 초기화 및 캐싱."""
    api = BrightDataAPI()
    processor = DataProcessor()
    intelligence = ShoppingIntelligenceEngine()
    ai_engine = get_gemini_ai()
    return api, processor, intelligence, ai_engine

진행 상황 추적이 포함된 인라인 검색 처리

검색 로직은 상세한 진행 상황 추적 및 데이터 지속성을 통해 메인 앱 흐름에 직접 내장됩니다:

# streamlit_app.py - 검색 처리 (간소화)

# 진행 상황 추적과 함께 검색 실행
if search_clicked and keyword.strip():
    progress_bar = st.progress(0)
    status_text = st.empty()
    start_time = time.time()

    try:
        # 검색 트리거
        status_text.text("아마존 검색 시작 중...")
        snapshot_id = api.trigger_search(keyword, amazon_url)
        progress_bar.progress(25)

        # 스마트 진행률 업데이트로 결과 대기
        status_text.text("Amazon에서 검색 처리 중...")
        results = smart_wait_for_results(api, snapshot_id, progress_bar, status_text)
        progress_bar.progress(75)

        # 결과 처리
        status_text.text("상품 분석 중...")
        processed_results = processor.process_raw_data(results)
        shopping_intel = intelligence.analyze_products(processed_results)

        # 종합 결과를 세션 상태에 저장
        st.session_state.search_results = processed_results
        st.session_state.shopping_intelligence = shopping_intel
        st.session_state.current_run_id = str(uuid.uuid4())
        st.session_state.raw_data = results
        st.session_state.search_metadata = {
            'keyword': keyword,
            'country': countries[selected_country],
            'domain': amazon_url,
            'timestamp': datetime.now(timezone.utc).isoformat()
        }

        elapsed_time = time.time() - start_time
        status_text.text(f"{elapsed_time:.1f}초 만에 {len(processed_results)}개의 상품을 찾았습니다!")
        progress_bar.progress(100)

    except Exception as e:
        st.error(f"검색 실패: {str(e)}")

다양한 대화형 시각화

시장 분석 탭은 각각 특정 스타일과 주석이 적용된 다양한 차트 유형을 인라인으로 생성합니다:

# streamlit_app.py - 중앙값 선이 포함된 가격 분포

fig_price = px.histogram(
    x=display_prices,
    nbins=min(20, max(1, unique_prices)),
    title="가격 범위",
    labels={'x': f'가격 ({currencies.get(current_country_code, "USD")})', 'y': '제품 수'},
    color_discrete_sequence=['#667eea']
)

# 맥락을 위한 중앙값 선 추가
fig_price.add_vline(x=q50, line_dash="dash", line_color="orange", annotation_text="중앙값")
st.plotly_chart(fig_price, use_container_width=True)

# 평점 대 가격 산점도 (크기 및 색상 인코딩 적용)
fig_scatter = px.scatter(
    df_scatter,
    x='final_price',
    y='rating',
    size='num_ratings',
    hover_data=['name', 'num_ratings'],
    title="품질 대 가격",
    labels={'final_price': f'가격 ({currencies.get(current_country_code, "USD")})', 'rating': '평점 (별점)'},
    color='rating',
    color_continuous_scale='Viridis')

st.plotly_chart(fig_scatter, use_container_width=True)

# 백분위 마커가 있는 가치 점수 분포
fig_value = px.histogram(
    x=value_scores,
    nbins=20,
    title="가성비 최고 제품",
    labels={'x': '가치 점수 (0.0-1.0)', 'y': '제품 수'},
    color_discrete_sequence=['#28a745']
)
p50 = np.percentile(value_scores, 50)
p75 = np.percentile(value_scores, 75)
fig_value.add_vline(x=p50, line_dash="dash", line_color="orange", annotation_text="중간값")
fig_value.add_vline(x=p75, line_dash="dash", line_color="red", annotation_text="75번째 백분위수")
st.plotly_chart(fig_value, use_container_width=True)

고급 차트 기능

대시보드에는 비즈니스 인텔리전스를 활용한 정교한 시각화 기능이 포함됩니다:

  • 가격 히스토그램. 시장 포지셔닝을 위한 중앙값 및 사분위수 마커 포함.
  • 평점 산점도. 크기는 리뷰 수를, 색상은 평점 품질을 나타냅니다.
  • 순위 파이 차트. 검색 순위 분포(1-5, 6-10, 11-20, 21+)를 보여줍니다.
  • 가격대 막대 차트. 제품을 예산형/가성비형/프리미엄형/럭셔리형으로 분류합니다.
  • 할인 분석. 실제 할인과 부풀려진 가격을 구분합니다.

이 포괄적인 접근 방식은 실행 가능한 시장 인사이트를 제공하는 전문적인 분석 대시보드를 구축합니다.

결론

기업급 데이터 수집, 고급 AI, 인터랙티브 데이터 시각화를 활용한 아마존 제품 분석기를 성공적으로 구축했습니다. 이 프로젝트의 전체 소스 코드는 GitHub에서 확인하고 수정할 수 있습니다.

다음과 같은 방법을 확인했습니다:

  • Bright Data의 웹 스크레이퍼 API를 사용하여 대규모 아마존 데이터를 안정적으로 수집하는 방법.
  • 복잡한 실제 데이터 문제를 처리하기 위한 강력한 데이터 처리 파이프라인 구현.
  • 신뢰할 수 있는 분석을 위해 Google Gemini로 환각 현상 방지 AI 어시스턴트 설계.
  • Streamlit과 Plotly를 활용한 직관적이고 인터랙티브한 사용자 인터페이스 구축.

이 프로젝트는 방대한 웹 데이터를 실행 가능한 비즈니스 인텔리전스로 전환해야 하는 모든 앱을 위한 강력한 템플릿 역할을 합니다. 이를 기반으로 전용 아마존 가격 추적기를 구축하거나 다른 데이터 소스를 통합할 수 있습니다.

전자상거래 데이터의 세계는 방대합니다. 미리 수집되어 바로 사용 가능한 데이터 세트가 필요하다면, 다양한 옵션을 제공하는 Bright Data의 마켓플레이스를 살펴보세요.