Project/DE

[DE] 고객 행동 분석을 통한 맞춤형 마케팅 전략 수립

JABHACK 2024. 11. 16. 13:23

프로젝트 구상

 

 

  • 목표
    • 여러 출처에서 수집한 고객 데이터를 기반으로 행동 패턴을 분석하여 개인 맞춤형 마케팅 전략을 수립합니다. 이 프로젝트는 데이터 레이크, 웨어하우스, 데이터 마트, 그리고 시각화 도구를 통합하여 최적의 분석 환경을 구축하고자 합니다.
  • 기술 스택
    • 데이터 레이크: AWS S3 (원시 데이터를 저장)
    • 데이터 웨어하우스: AWS Redshift (정제된 데이터를 효율적으로 쿼리하고 분석)
    • 데이터 마트: Redshift 기반 데이터 마트 (자주 사용하는 고객 세그먼트 데이터를 저장)
    • 데이터 처리: Apache Spark (데이터 레이크의 원본 데이터를 전처리하고 정제)
    • 시각화 도구: Apache Superset, Tableau (분석 결과를 시각화하여 대시보드 형태로 제공)
  • 구현 단계
    • 데이터 수집 및 저장
      • 고객의 웹사이트 클릭 로그, 구매 이력, 고객 서비스 요청 데이터를 AWS S3에 저장하여 데이터 레이크를 구축합니다. 비정형 데이터(로그)와 구조화된 데이터(이력, 요청)를 모두 수용할 수 있습니다.
    • 데이터 처리 및 정제
      • Apache Spark를 통해 S3에 저장된 원시 데이터를 전처리하여 필요한 정보만 추출합니다. 예를 들어, 고객의 제품 카테고리 선호도나 특정 페이지의 체류 시간 등을 정리합니다.
    • 데이터 웨어하우스로 이동
      • 정제된 데이터를 AWS Redshift로 이동하여 구조화된 데이터베이스에 저장합니다. Redshift를 통해 정제된 고객 데이터를 쿼리하고 분석할 수 있습니다.
    • 데이터 마트 생성
      • Redshift 상에서 자주 사용하는 분석 쿼리를 미리 실행해두어 성능을 최적화합니다. 예를 들어, 고객의 최근 구매 제품 카테고리나 방문 빈도가 높은 페이지 정보를 데이터 마트로 저장해 빠른 응답을 지원합니다.
    • 시각화 및 리포트 생성
      • Tableau와 Superset을 통해 고객 행동 분석 대시보드를 구축합니다. 데이터 시각화는 마케팅 팀이 손쉽게 접근할 수 있도록 구성하여, 특정 고객 세그먼트의 행동을 즉시 확인하고 맞춤형 마케팅 전략을 수립할 수 있도록 합니다.

 

요구사항 분석

 

1. 비즈니스 요구사항

  • 고객 행동 분석
    • 고객의 웹사이트 행동 데이터를 기반으로 구매 가능성이 높은 고객 세그먼트를 파악할 수 있어야 합니다.
    • 고객의 관심사, 구매 패턴을 기반으로 타겟 마케팅을 위한 개인화된 정보를 생성해야 합니다.
  • 시각화와 접근성
    • 마케팅 팀이 데이터에 쉽게 접근하여 고객 행동을 이해하고 분석 결과를 빠르게 적용할 수 있어야 합니다.
    • 특정 기간, 특정 고객 그룹별로 분석 데이터를 자유롭게 조회하고, 필요한 경우 시각화 대시보드에서 데이터를 직접 다운로드할 수 있어야 합니다.

2. 데이터 수집 요구사항

  • 다양한 데이터 소스 연동
    • 고객 웹사이트의 행동 로그 데이터, 구매 이력 데이터, 고객 서비스 데이터 등 다양한 데이터 소스를 연동해야 합니다.
    • 실시간 또는 일 단위로 데이터를 자동 수집하고, 누적 저장할 수 있는 메커니즘이 필요합니다.
  • 데이터의 포맷 통일
    • 수집된 비정형 및 구조화된 데이터를 모두 수용할 수 있도록 데이터 포맷을 통일하고 저장하는 방식이 필요합니다.

3. 데이터 처리 요구사항

  • 데이터 전처리 및 정제
    • Apache Spark를 활용하여 데이터 레이크에 있는 원본 데이터를 정제합니다. 예를 들어, 필요한 컬럼 추출, Null 값 처리, 중복 데이터 제거 등의 전처리 작업이 필요합니다.
    • 고객의 구매 빈도, 선호 카테고리 등 추가적인 파생 변수를 생성할 수 있어야 합니다.
  • 데이터 업데이트 주기
    • 데이터는 최소 일 단위로 업데이트 되어야 하며, 최신 상태의 데이터를 사용할 수 있어야 합니다.

4. 데이터 저장 및 쿼리 요구사항

  • 데이터 웨어하우스 요구사항
    • 정제된 데이터를 AWS Redshift 또는 GCP BigQuery에 저장해 데이터 분석을 위한 데이터 웨어하우스를 구축합니다.
    • 빠른 쿼리를 지원하고, 대용량 데이터를 효율적으로 조회할 수 있어야 합니다.
  • 데이터 마트 요구사항
    • 자주 조회하는 세그먼트 데이터(예: 주요 구매 카테고리, 월별 구매 패턴)는 미리 데이터 마트로 구성해 빠르게 접근할 수 있어야 합니다.
    • 데이터 마트는 최신화된 데이터를 기반으로 주기적으로 업데이트되어야 합니다.

5. 데이터 시각화 및 대시보드 요구사항

  • 대시보드 요구사항
    • Superset이나 Tableau 같은 도구를 활용해 대시보드를 구축하고, 마케팅 팀이 쉽게 고객 행동 데이터를 이해할 수 있어야 합니다.
    • 시각화는 다양한 필터와 차트(예: 파이 차트, 바 차트, 라인 그래프 등)를 제공해, 특정 시간대, 고객 세그먼트별로 맞춤 조회할 수 있도록 구성합니다.
  • 데이터 접근성 및 보안
    • 대시보드에는 접근 권한이 필요하며, 마케팅 팀 구성원만 접근할 수 있어야 합니다.
    • 데이터 접근 및 시각화 권한은 역할 기반으로 설정하여 보안을 강화해야 합니다.

6. 성능 및 확장성 요구사항

  • 확장 가능한 인프라 구축
    • 데이터의 양이 증가해도 성능이 저하되지 않도록 확장 가능한 클라우드 인프라(AWS, GCP)를 기반으로 시스템을 설계합니다.
    • Spark 및 Redshift 등의 분산 시스템을 통해 대용량 데이터를 효율적으로 처리할 수 있어야 합니다.
  • 실시간 데이터 처리 지원
    • 실시간 또는 거의 실시간에 가까운 데이터 분석을 지원하여 최신 고객 행동을 반영한 마케팅 캠페인이 가능해야 합니다.

 

설계 패턴

 

1. 계층형 아키텍처 (Layered Architecture)

  • 설명: 데이터 수집, 전처리, 저장, 분석, 시각화가 단계적으로 진행되므로, 각 단계를 독립된 계층으로 구성하여 유지보수와 확장성을 높입니다.
  • 구성:
    • 데이터 수집 계층: 원본 데이터를 수집하고 데이터 레이크(S3/GCS)에 저장.
    • 데이터 처리 계층: Apache Spark를 이용해 데이터 전처리 및 파생 변수 생성.
    • 데이터 저장 계층: 정제된 데이터를 AWS Redshift 또는 BigQuery에 저장하여 데이터 웨어하우스를 구축.
    • 데이터 마트 계층: 자주 사용하는 분석 데이터를 별도로 정리해 데이터 마트로 저장.
    • 시각화 계층: Superset 또는 Tableau와 같은 시각화 도구로 대시보드를 생성하여 마케팅 팀에 제공.

2. 파이프라인 패턴 (Pipeline Pattern)

  • 설명: 데이터 수집부터 분석까지 일련의 단계를 파이프라인으로 처리하여 일관된 데이터 흐름을 보장합니다.
  • 구성:
    • ETL 파이프라인: Apache Spark를 이용해 S3/GCS에서 데이터 전처리를 수행하여 Redshift 또는 BigQuery에 저장하는 파이프라인을 구성합니다.
    • 데이터 파이프라인 자동화: 주기적 스케줄링을 통해 데이터 파이프라인이 자동으로 실행되도록 설정합니다. AWS Glue, Apache Airflow 등을 활용해 스케줄링 및 오류 복구를 자동화할 수 있습니다.

3. 리포지토리 패턴 (Repository Pattern)

  • 설명: 데이터 저장소와 비즈니스 로직을 분리하여 각 계층에서 데이터를 효율적으로 저장하고 조회할 수 있도록 합니다.
  • 구성:
    • 데이터 웨어하우스 리포지토리: AWS Redshift나 BigQuery에서 데이터를 조회하고 필요한 데이터를 데이터 마트로 제공하는 역할을 수행합니다.
    • 데이터 마트 리포지토리: 데이터 마트 테이블을 통해 최적화된 데이터를 제공합니다. 자주 조회되는 고객 세그먼트와 같은 데이터는 미리 집계하여 성능을 향상시킵니다.
    • API 리포지토리: 시각화 도구와 연결된 API가 데이터 웨어하우스와 데이터 마트에서 필요한 데이터를 조회하여 제공하는 인터페이스로 작동합니다.

4. 팩토리 패턴 (Factory Pattern)

  • 설명: 다양한 데이터 소스를 처리할 수 있도록 객체 생성을 캡슐화하여 유연성을 높입니다.
  • 구성:
    • 데이터 수집 팩토리: 웹사이트 로그, 구매 이력, 고객 서비스 데이터를 수집하는 다양한 모듈을 팩토리 패턴을 사용해 관리합니다.
    • 데이터 처리 팩토리: 수집된 데이터 유형에 맞춰 적절한 전처리 클래스를 생성하여 처리합니다. 예를 들어, 로그 데이터 처리 클래스, 구매 이력 데이터 처리 클래스 등을 별도로 생성할 수 있습니다.

5. 전략 패턴 (Strategy Pattern)

  • 설명: 데이터를 분석하는 다양한 전략을 유연하게 적용할 수 있도록 설계합니다.
  • 구성:
    • 고객 세그먼트 전략: 고객 행동 분석에 필요한 다양한 세그먼트 전략(예: 구매 이력 기반, 웹사이트 클릭 기반, 시간대 기반 등)을 정의하고 적용할 수 있습니다.
    • 마케팅 캠페인 전략: 분석된 고객 세그먼트를 기반으로 맞춤형 마케팅 전략을 구성할 수 있도록 합니다. 전략을 각각의 세그먼트 특성에 맞춰 정의할 수 있습니다.

6. 프록시 패턴 (Proxy Pattern)

  • 설명: 시각화 도구와 데이터베이스 간의 접근 제어를 위해 프록시 패턴을 사용하여 보안을 강화합니다.
  • 구성:
    • 데이터베이스 프록시: Superset, Tableau 등 시각화 도구에서 Redshift와 BigQuery와 같은 데이터 웨어하우스에 직접 접근하지 않고 프록시를 통해 접근하도록 합니다. 프록시는 쿼리 요청을 관리하고, 데이터 접근 권한을 검증하며, 로깅을 통해 데이터 보안을 강화합니다.

7. 옵저버 패턴 (Observer Pattern)

  • 설명: 데이터가 업데이트되었을 때 이를 시각화 도구나 다른 관련 시스템이 즉시 반영할 수 있도록 옵저버 패턴을 활용합니다.
  • 구성:
    • 데이터 업데이트 알림: 데이터 파이프라인이 업데이트되거나 새로운 데이터가 저장될 때 시각화 도구가 자동으로 이를 감지해 최신 데이터로 업데이트합니다. 예를 들어, 데이터 파이프라인 완료 시 이벤트가 발생하면 Superset 또는 Tableau가 이를 받아 최신 데이터를 반영하도록 할 수 있습니다.

 

구현

1. 계층형 아키텍처: 데이터 수집, 처리, 저장 계층

  • 데이터 수집 계층: AWS S3에 데이터를 저장
import boto3

def upload_data_to_s3(data, bucket_name, file_path):
    s3 = boto3.client('s3')
    s3.put_object(Bucket=bucket_name, Key=file_path, Body=data)
    print("Data uploaded to S3")

# 예시 데이터 업로드
data = "customer_id,action,timestamp\n1,view_product,2023-10-10 10:00"
upload_data_to_s3(data, 'my-data-lake', 'raw_data/customer_logs.csv')

 

  • 데이터 처리 계층: Spark로 데이터 전처리
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("DataProcessing").getOrCreate()

# S3에서 데이터 로드
raw_data = spark.read.csv("s3://my-data-lake/raw_data/customer_logs.csv", header=True, inferSchema=True)

# 전처리 작업
processed_data = raw_data.filter(raw_data['action'] == 'view_product').dropna()

# 결과를 데이터 웨어하우스로 저장 (Redshift 예시)
processed_data.write \
    .format("jdbc") \
    .option("url", "jdbc:redshift://my-redshift-cluster/mydb") \
    .option("dbtable", "processed_customer_logs") \
    .option("user", "username") \
    .option("password", "password") \
    .mode("overwrite") \
    .save()

 

2. 파이프라인 패턴: ETL 파이프라인 구성 (Airflow 예시)

  • Airflow DAG를 사용하여 매일 S3에서 데이터를 가져와 Spark로 처리하고 Redshift에 저장하도록 구성합니다.
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime

def extract_data():
    # 데이터 수집 로직 구현
    pass

def transform_data():
    # Spark 전처리 로직
    pass

def load_data():
    # Redshift에 저장하는 로직
    pass

default_args = {
    'owner': 'airflow',
    'start_date': datetime(2023, 10, 10),
}

with DAG('daily_etl_pipeline', default_args=default_args, schedule_interval='@daily') as dag:
    extract_task = PythonOperator(task_id='extract_data', python_callable=extract_data)
    transform_task = PythonOperator(task_id='transform_data', python_callable=transform_data)
    load_task = PythonOperator(task_id='load_data', python_callable=load_data)

    extract_task >> transform_task >> load_task

 

3. 리포지토리 패턴: 데이터 접근 계층 구현

import psycopg2

class CustomerDataRepository:
    def __init__(self, connection_string):
        self.conn = psycopg2.connect(connection_string)

    def get_customer_segments(self):
        query = "SELECT segment, COUNT(*) FROM customer_segments GROUP BY segment"
        cursor = self.conn.cursor()
        cursor.execute(query)
        return cursor.fetchall()

# 예시 리포지토리 사용
repository = CustomerDataRepository("dbname=mydb user=username password=password host=my-redshift-cluster")
segments = repository.get_customer_segments()

4. 전략 패턴: 고객 세그먼트 전략 적용

from abc import ABC, abstractmethod

class CustomerSegmentationStrategy(ABC):
    @abstractmethod
    def segment_customers(self, data):
        pass

class PurchaseBasedSegmentation(CustomerSegmentationStrategy):
    def segment_customers(self, data):
        return data.filter(lambda x: x['purchase_amount'] > 100)

class WebsiteVisitSegmentation(CustomerSegmentationStrategy):
    def segment_customers(self, data):
        return data.filter(lambda x: x['visit_count'] > 10)

# 전략 사용
data = [...]  # 고객 데이터 예시
segmentation_strategy = PurchaseBasedSegmentation()
segments = segmentation_strategy.segment_customers(data)

5. 시각화 계층: 데이터 시각화 (Superset 설정 예시)

 

Superset에서 Redshift와 연결하여 시각화를 생성합니다.

  1. Superset 설정 페이지에서 Data > Databases로 이동합니다.
  2. Redshift 연결 정보 (데이터베이스 URI) 추가:
redshift+psycopg2://username:password@my-redshift-cluster/mydb
  1. 연결 후, 데이터베이스를 선택하여 시각화할 테이블을 추가합니다.
  2. 대시보드를 생성하여 마케팅 팀에서 사용할 수 있도록 설정합니다.

 

6. 옵저버 패턴: 데이터 업데이트 시 알림 처리

예를 들어, 데이터 파이프라인이 완료될 때 Superset API를 사용하여 최신 데이터를 강제로 새로고침하는 방식입니다.

import requests

def notify_superset():
    # Superset 데이터 새로고침 요청
    response = requests.post("http://superset-instance/api/v1/dataset/<dataset_id>/refresh", headers={"Authorization": "Bearer <token>"})
    print("Superset notified" if response.status_code == 200 else "Notification failed")

# ETL 파이프라인 완료 후 알림 호출
notify_superset()