Skip to content

우리FISA - 우리카드 데이터를 활용한 ELK 프로젝트

Notifications You must be signed in to change notification settings

FISA-Team-CE/elk-project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 

Repository files navigation

우리카드 데이터를 활용한 ELK 프로젝트

진행 기간 : 2026.01.15

👩🏻‍💻 팀원 소개

류승환
@Federico-15
서가영
@caminobelllo
유동균
@dbehdrbs0806

⚙️ 기술 스택

DuckDB Elasticsearch Kibana DBeaver Logstash

1. 데이터 전처리

  • DuckDB: 대용량 CSV 데이터를 메모리 효율적으로 처리하기 위한 분석용 DB 엔진
    • Usage: 결측치(NULL) 처리(COALESCE), 데이터 타입 변환(TRY_CAST), 고객 세그먼트 분류(CASE WHEN) 등 전처리 로직 수행.
  • SQL: 데이터 추출 및 가공

2. 시각화 및 분석

  • Elasticsearch(@8.19.3): 전처리된 데이터를 인덱싱하여 검색 및 집계 속도 최적화
  • Kibana(@8.19.3): 데이터 시각화 및 대시보드 구축

3. 도구 및 환경

  • DBeaver: SQL 쿼리 작성, 실행 및 데이터베이스 관리를 위한 툴
  • CSV: 원본 데이터(Raw Data) 및 전처리 완료된 데이터(Processed Data) 저장 포맷

4. 협업 도구

  • Notion & Slack


선정 주제

🎯 주제 1

라이프스테이지 기반의 소비 패턴 분석을 통해 잠정 고객 활성화 전략 고안

스크린샷 2026-01-16 오전 9 56 00

💡 주제 선정 이유

  • 소비의 주축이 되는 4060 세대를 라이프스테이지별로 분류해 실제 결제 패턴을 기반으로 타겟 고객 클러스터를 구성
  • 데이터를 통해 지출 분야의 변화가 생기는 시점을 파악해 이에 맞는 타겟팅 전략을 수립해 잠재 고객을 충성 고객으로 전환시키는 인사이트를 도출하고자 함


DuckDB를 통한 데이터 전처리

우리카드의 대용량 데이터 (약 900만 건)를 효율적으로 처리하기 위해 DuckDB를 활용하였으며, 효율적인 분석을 위해 다음과 같은 전처리 과정을 거침

스크린샷 2026-01-16 오전 9 57 48

⚒️ 주요 전처리 과정

COPY를 통한 데이터 분할

실제 컬럼명은 표기하지 않음

-- 라이프스테이지별 잠정 고객 분류
COPY (
    SELECT
    ...
        (
        	COALESCE(대분류컬럼명, 0) + 
        	COALESCE(대분류컬럼명, 0) + 
        	...
        	COALESCE(대분류컬럼명, 0)
        ) AS 대분류_금액합계,

        CASE 
            WHEN (
              COALESCE(대분류컬럼명, 0) + 
        	    COALESCE(대분류컬럼명, 0) + 
        	    ...
        	    COALESCE(대분류컬럼명, 0)
            ) < 150 THEN 'Low_잠정고객'
            WHEN (
              COALESCE(대분류컬럼명, 0) + 
        	    COALESCE(대분류컬럼명, 0) + 
        	    ...
        	    COALESCE(대분류컬럼명, 0)
            ) < 300 THEN 'Mid_일반고객'
            ELSE 'High_충성고객'
        END AS usage_segment,
    ...
-- 시니어
COPY (
    SELECT
        
		..
        CASE 
    	
    	-- 학원비 + 식비
    		WHEN TRY_CAST(연령대컬럼명 AS INTEGER) BETWEEN 40 AND 55
         		AND COALESCE(TRY_CAST(대분류컬럼명 AS BIGINT), 0) > 0 
         		AND COALESCE(TRY_CAST(대분류컬럼명 AS BIGINT), 0) > 10 
    		THEN '학원비+식비 클러스터'  

    		-- 학원비만 
    		WHEN TRY_CAST(연령대컬럼명 AS INTEGER) BETWEEN 40 AND 65 
         		AND COALESCE(TRY_CAST(대분류컬럼명 AS BIGINT), 0) > 0 
    		THEN '학원 클러스터'     
    		
    		WHEN TRY_CAST(연령대컬럼명 AS INTEGER) >= 55 
         		AND ( 
             		COALESCE(TRY_CAST(대분류컬럼명 AS BIGINT), 0) > 0  
             			OR 
             		COALESCE(TRY_CAST(대분류컬럼명 AS BIGINT), 0) > 5 
         		)
    		THEN '시니어 클러스터'
    		ELSE '기타'	
		END AS 타겟_클러스터,

        -- 분석용 상세 금액 
        COALESCE(TRY_CAST(중분류컬럼명 AS BIGINT), 0) AS 학원비_상세,
        COALESCE(TRY_CAST(중분류컬럼명 AS BIGINT), 0) AS 병원비_상세,

        COALESCE(TRY_CAST(대분류컬럼명 AS BIGINT), 0) AS 교육_전체,   -- 교육 전체
        COALESCE(TRY_CAST(대분류컬럼명 AS BIGINT), 0) AS 의료_전체,   -- 의료 전체

        -- 총 이용금액
        (
            COALESCE(대분류컬럼명, 0) + 
            COALESCE(대분류컬럼명, 0) + 
            ...
            COALESCE(대분류컬럼명, 0)
        ) AS 총_이용금액

    ...

1. 결측치(NULL) 및 타입 핸들링

  • COALESCETRY_CAST 함수를 사용하여 NULL 값을 0으로 치환
  • 문자열로 기재된 수치 데이터를 변환하여 연산 오류를 방지

2. 고객 세그멘테이션

  • 단순 이용 금액 합계가 아닌 대분류와 중분류를 활용한 소비 패턴에 따라 고객들을 클러스터링


Kibana를 이용한 데이터 시각화

전처리된 데이터를 Elasticsearch에 적재하고, Kibana Dashboard를 통해 지표들을 시각화함

📊 대시보드 1

1. 라이프스테이지별 잠정 고객 비율 (Stacked Bar Chart)

  • 전체 고객들을 라이프스테이지에 따라 구분
  • 총 이용 금액 150만원 미만을 Low (잠정 고객) 으로 정의하여 해당 비율이 가장 높은 그룹을 타켓 페르소나로 선정
image 스크린샷 2026-01-16 오전 10 00 31
  • 사람수로 정렬했을 때 상위 두 라이프스테이지 '중년기타' 중 잠정 고객의 비율은 약 38.4%, '2nd life' 중 잠정 고객 비율은 46.8%
    • 따라서 중장년층 타겟 페르소나로 선정하여 해당 페르소나의 잠정 고객 그룹에 대한 분석을 진행

2. 교육 카테고리 심층 분석 (Unstacked Bar Chart)

  • 연령대는 타겟 페르소나에 맞춰 40-65(40세-69세)로 필터링
  • 대분류인 '사무/서적/학원' 비용 중 실질적인 '학원비(중분류)'의 비중을 분석
image 스크린샷 2026-01-16 오전 10 01 53
  • 발견점 : '사무통신/서적/학원' 대분류의 약 90%가 학원비임을 규명해 타겟팅의 정당성 확보

3. 4060 세대별 지출 변화 추이 (Stacked Bar Chart)

  • 연령대별(x축) 총 이용 금액(y축)을 타겟 페르소나별로 다른 색상을 사용해 시각화
image
  • 발견점 : 연령대 55(55-59세)를 기점으로 '교육비 지출'이 급감하고, '병원비' 지출이 급증하는 cross-over point를 발견
  • 따라서 전체적인 타겟 페르소나에게 교육비 & 병원비에 관한 혜택을 통해 잠정 고객 유치에 적용할 수 있을 것이라 판단

💸 마케팅 인사이트 및 전략 도출 1

시각화 데이터를 통해 잠정 고객 유치를 위한 실행 전략을 도출

스크린샷 2026-01-16 오전 10 08 27

1. 4050을 위한 학원비 할인 전략

  • 인사이트 : 데이터 분석 결과, 4050 그룹의 '사무통신/서적/학원' 분류에 대한 지출 대부분은 '학원'에 집중되어 있음
  • 전략 : 해당 연령대에서 실효성이 낮은 서적 할인을 없애고, '학원비 집중 할인' 혜택을 제공해 자녀를 둔 부모들의 메인 카드 이용을 유도
  • 기대 효과 :
    1. 고정비 자동 결제 : 매달 고정적으로 지출되는 학원비를 결제
    2. 마케팅 비욜 효율화 : 해당 대분류에서 이용률이 낮은 서적 및 사무통신에 대한 예산을 삭감하고, 핵심적인 지출인 학원비에 집중하여 비용 대비 효용을 극대화

2. 55+를 위한 시니어 전략

  • 인사이트 : 55 (55세~59세) 구간에서 '보험 및 병원'에 대한 지출 비율이 크게 증가하는 것을 확인
  • 전략 : 종합 검진 우대, 병원비 청구 할인 등의 헤택이 담인 헬스케어 특화 카드로 교체 발급을 유도
  • 기대 효과 :
    1. 고객 이탈 방지 : 기존에 교육비 등의 지출에 카드를 이용했던 경우, 자녀 교육비 지출 종료와 함께 카드를 해지하는 경우가 있을 수 있음. 하지만 고객에게 새로운 사용 명분을 제공하여 타 카드사로의 이탈을 방지
    2. 장기 고객군 확보 : 청년층에 비해 구매력이 높은 시니어층을 확보하여 고령화 시대에 맞는 장기 우량 고객군 확보 가능
    3. 고객 단가 유지 : 비교적으로 결제 단위가 큰 병원비나 종합 검진비 결제를 유치 가능

선정 주제

🎯 주제 2

고객 등급에 따른 소비를 분석 및 디지털 채널 사용 여부 분석


Kibana를 이용한 데이터 시각화

📊 대시보드

2. 고객 등급과 디지털 채널 이용 여부에 따른 지출 행태 분석

  • 고객 등급에 따른 소비를 분석 후, 각 등급에 소비가 집중된 종목을 확인
  • 디지털 채널 사용에 있어 4060세대의 중장년층 가입여부를 확인하고 학원비에 따른 소비 분석

1-1. 높은 등급(VVIP, VIP등)에 따른 종목별 카드 사용 차트

image-1

유통(유통업 비영리), 보험/병원, 요식업(음식료품), 자동차/연료/정비, 여행(여행업)

  • 발견점: 높은 등급의 고객들은 보통 유통과, 보험/병원, 요식업(식사), 자동차/연료/정비에 많은 카드 지출 발견

1-2. 낮은 등급(골드, 해당없음)에 따른 종목별 카드 사용 차트

image-2

유통(유통업 비영리), 보험/병원, 요식업(음식료품), 자동차/연료/정비, 여행(여행업)

  • 발견점: 낮은 등급의 고객들도 높은 등급의 고객과 같이 유통, 보험/병원, 요식업 등에 많은 카드 지출을 발견

2-1. 4060세대별 디지털채널가입 여부 확인 차트

image (5)
  • 발견점: 4060세대 고객 중 디지털채널 미가입을 고객이 56%임을 확인

2-2. 높은 고객등급에 속하는 4060세대 고객의 학원비 소비 차트

image (9)
  • 발견점: 4060연령대 고객 중 디지털 채널을 등록한 고객이 아닌 고객에 비해 학원비에 많은 카드 지출을 발견

기각 가설: 디지털 채널 페르소나 분석

  • 가설: 4060대연령대 고객은 디지털 채널 미가입 고객이 학원비에 카드 지출이 많을 것
  • 검증 과정: 4060대 연령대 고객의 디지털 채널 가입여부에 따른 카드 소비 차트를 분석하고 비교하여 검증 확인
  • 기각 사유: 분석 시 4060대 연령대 고객은 디지털 채널에 미가입이 56%임을 확인. 따라서 미가입자의 학원비에 대한 카드 지출이 많을 것이라 가설. 분석 및 확인 후 디지털 채널 등록 고객이 더 많이 지출 하는 것을 도출
  • 가설 결론: 4060세대 고객은 디지털 채널을 등록하고 사용하는 고객이 학원비에 있어 카드 지출이 더 높은 것을 도출

💸 마케팅 인사이트 및 전략 도출 2

  1. 높은 고객 등급에 따른 혜택 전략
  • 인사이트 : 유통, 보험/의료, 자동차/연료/정비 등 생활 필수 소비 영역에 카드 지출이 집중되는 경향을 확인
  • 전략 : 고객 등급이 상승할수록 필수 소비 영역 중심의 차등화된 할인과 혜택을 제공하는 전략을 통해 고객 등급을 유지하고 상위 등급으로 이동 유도
  • 기대 효과 :
    1. 필수 소비 고정 결제 활성화: 필수 소비 영역에서의 지속적 카드 사용을 유도로 장기적 높은, 우수 고객 확보 기대
  1. 4060세대 고객을 위한 디지털 채널 서비스 제략
  • 인사이트 : 4060세대 고객 중 디지털 채널 미가입 비율은 56%로 절반 이상을 차지하지만, 디지털 채널을 등록한 고객에 있어 학원비 항목에서는 더 높은 카드 지출이 보임을 확인
  • 전략 : 4060세대를 대상으로 가입 절차를 단순화한 디지털 채널 서비스를 제공하고 이를 통한 학원비, 생활비 등 관심도가 높은 소비 항목 중심의 혜택과 서비스 제공을 통해 디지털 채널 유입을 확대
  • 기대 효과 :
    1. 디지털 채널 접근성 개선 : 가입 절차 단순화 및 사용 편의성 향상을 통해 4060대 고객의 디지털 전환을 촉진
    2. 다양한 고객 확보: 디지털 채널 접근성을 개선함으로써 4060세대의 디지털 전환을 촉진하고 중장년층뿐만 아니라 다른 연령대 고객까지 신규 고객 유입 및 확대를 유

선정 주제

🎯 주제 3

거주지역과 소비지역이 다른 소비자들에 대한 가설을 수립 장기 가입자 중 이용 금액이 낮은 사용자 분석


Kibana를 이용한 데이터 시각화

📊 대시보드 3. 장기 가입 소액 이용자의 지출 행태 분석

라이프스테이지 분석 외에도, 우리카드를 오랫동안 보유하고 있으나 이용 금액이 저조한 고객층을 타겟팅하여 구체적인 지출 패턴을 분석함

1-1. 결제 수단별 이용 비중 (신용카드 vs 체크카드)

  • 대상: 2010년 이전 가입자 중 월 이용 금액 30만 원 미만 고객
image
  • 발견점: 장기 가입 소액 이용자들은 체크카드보다 신용카드를 사용하는 비중이 약 2.5배 이상 압도적으로 높게 나타남
  • 인사이트: 소액 이용자임에도 신용카드를 선호한다는 것은 신용카드 고유의 포인트 적립이나 부가 혜택을 선별적으로 이용하는 '실속형 체리피커' 성향이 강함을 시사
  • 전략: 이들을 위해 '서브 카드로 사용해도 혜택 체감이 큰' 맞춤형 신용카드 프로모션을 제공한다면 주력 카드 전환 및 이용 금액 증대를 기대할 수 있음

1-2. 업종별 지출 비율 분석 (Top Categories)

  • 주요 소비 업종: 유통, 요식업, 보험/병원, 자동차/연료
image
  • 발견점: 장기 가입 소액 이용자들의 지출 비율 중 '유통(마트/백화점)''유통영업리' 업종이 가장 높은 비중을 차지함
  • 인사이트: 이들은 광범위한 소비보다 생필품 구매나 정기적인 의료 서비스 이용 등 필수 생활 동선에만 우리 카드를 집중적으로 사용하고 있음
  • 활성화 방안:
    1. 리텐션 확보: 가장 높은 지출 비율을 보이는 유통 및 생활 필수 영역에 대한 상시 할인 혜택을 강화하여 카드 이용 동기 부여

2. 데이터 분석의 한계 및 가설 검증 실패 사례

분석 과정에서 특정 페르소나를 도출하기 위한 가설을 수립하였으나, 데이터의 해상도 한계로 인해 실패한 사례를 공유함

❌ 실패 가설: 직주 분리(이동자) 페르소나 분석

  • 가설: 거주지와 소비 지역이 다른 '장거리 출퇴근자'는 이동 중 OTT 이용 및 교통비 혜택에 민감할 것이다.
  • 가설 내용: 이동 시간 소요가 많은 고객을 대상으로 배달비, 편의점, OTT 구독, 교통비/주유비 할인 혜택이 유효할 것으로 가정함
  • 검증 과정: 거주지(HOUS_SIDO_NM) 필드와 실제 소비가 발생한 가맹점 소재지 데이터를 대조하여 이동 패턴 분석 시도
  • 실패 사유: 현재 데이터의 지리적 해상도가 '시/도' 단위로만 구분되어 있어, 동일 지역 내에서의 구체적인 직주 분리 여부를 판별하기에는 데이터가 모호함
  • 교훈: 현재 데이터 구조로는 지리적 차이를 유의미하게 분석할 수 없음을 확인하여 해당 가설을 기각함
image

💸 마케팅 인사이트 및 전략 도출 3

시각화 데이터를 통해 잠정 고객 유치를 위한 실행 전략을 도출

1. 장기 가입 소액 고객을 위한 실속형 신용카드 전략

  • 인사이트: 장기 가입 소액 이용자들은 이용 금액은 적지만, 체크카드보다 신용카드 이용 비중이 2.5배 이상 높으며, 지출의 대부분이 유통(마트/백화점) 및 생활 필수 업종에 집중되어 있음.

  • 전략: '서브 카드'로 활용 중인 이들에게 실질적인 체감 혜택이 큰 유통 및 생활 밀착형 특화 프로모션을 제공하여 메인 카드 전환을 유도함.

  • 기대 효과:

    1. 메인 카드화(Up-selling): 소액이라도 신용카드를 선호하는 '체리피커' 성향을 공략하여, 생활 필수 업종 결제 시 포인트 적립률을 높여 주력 카드로의 사용 빈도 확대를 유도함.
    2. 리텐션(Retention) 강화: 장기 가입자들의 주된 소비 처인 유통 및 의료 분야에 대한 상시 할인 혜택을 강화함으로써, 경쟁사 카드로의 이탈을 방지하고 충성도를 제고함.
    3. 고정 지출 유치: 중장년층 비중이 높은 특성을 고려하여 병원비나 보험료 등 고정적인 대액 결제를 우리 카드로 유도하여 고객당 평균 결제 금액(ARPU) 상승을 기대함.

2. 데이터 기반 페르소나 재정의 및 타겟팅 정교화

  • 인사이트: 초기 가설이었던 '장거리 이동자' 페르소나는 데이터 해상도 한계로 기각되었으나, 분석을 통해 이들이 '집 근처 마트와 병원을 이용하는 실속파'라는 실제 페르소나를 발견함.

  • 전략: 위치 기반의 모호한 혜택(OTT, 교통비 등) 보다는 거주지 중심의 생활 밀착형 혜택으로 마케팅 자원을 재배치함.

  • 기대 효과:

    1. 마케팅 효율 극대화: 실효성이 낮은 이동 관련 혜택 예산을 삭감하고, 실제 소비가 일어나는 유통 및 의료 업종에 집중하여 마케팅 비용 대비 효용을 높임.

    2. 데이터 분석의 선순환: 가설 실패 과정을 통해 파악된 데이터의 한계를 바탕으로, 향후 구 단위 상세 주소 데이터 확보 등 분석 고도화를 위한 명확한 방향성을 수립함.


🛠️ 트러블 슈팅: Elasticsearch 메모리 제한(1GB) 환경 극복

🚨 문제 상황

  • 제한 사항: 프로젝트 환경 설정 상 Kibana(키바나) 업로드 용량 파일이 1GB로 엄격히 제한됨.
  • 현상: 1.5GB 규모의 대용량 CSV 파일을 한 번에 인덱싱할 경우, 메모리 부족(OutOfMemory)이나 연결 타임아웃(ETIMEDOUT) 에러가 발생하며 서버가 중단되는 현상 발생.
  • 원인: 서버 용량을 초과하는 대량의 데이터를 한꺼번에 Bulk 처리하려다 발생하는 시스템 과부하.

✨ 해결 방안: Logstash를 활용한 데이터 파이프라인 최적화

Elasticsearch 서버에 가해지는 부담을 최소화하기 위해 Logstash를 도입하여 데이터를 적절한 단위로 분할 전송하는 방식을 채택함.

[핵심 전략]

  • 분할 적재(Batch Processing): Logstash의 배치 사이즈를 조절하여, 한 번에 전송되는 데이터 양이 Elasticsearch의 제한된 메모리(1GB) 내에서 충분히 처리될 수 있도록 최적화함.
  • 실시간 모니터링: stdout { codec => dots } 설정을 통해 서버 과부하 여부를 체크하며 안정적으로 데이터를 소화함.

⚙️ Logstash 설정 파일 (card_batch.conf)

⚠️ 보안을 위해 비밀번호는 변수 처리하였으며, 컬럼명은 변수로 요약되었습니다.

input {
  file {
    path => "C:/devEnv/ELK/data/*.csv"
    start_position => "beginning"
    sincedb_path => "NUL"
    codec => plain { charset => "UTF-8" }
  }
}

filter {
  csv {
    separator => ","
    # [보안 처리] 실제 컬럼명을 변수명으로 매핑하여 노출 방지
    columns => [
      "Field_Age", "Field_Gender", "Field_Rank", "Field_Date", "Field_Location", 
      "Total_Amount", "Credit_Amount", "Check_Amount", "Fuel_Amount", "Medical_Amount", 
      "Food_Amount", "Shopping_Amount"
    ]
    skip_header => "true"
  }

  mutate {
    # 데이터 정제 및 타입 변환
    strip => ["Field_Location"]
    convert => {
      "Field_Age" => "integer"
      "Total_Amount" => "integer"
      "Fuel_Amount" => "integer"
      "Medical_Amount" => "integer"
      "Food_Amount" => "integer"
    }
    # 메모리 효율을 위해 불필요한 메타데이터 삭제
    remove_field => ["message", "@version", "path", "host", "event"]
  }
}

output {
  elasticsearch {
    hosts => ["${ES_HOST}"]      # 환경변수 활용
    index => "card-data-stream"
    user => "${ES_USER}"        # 환경변수 활용
    password => "${ES_PWD}"      # 환경변수 활용
    
    ssl => true
    ssl_verification_mode => "none"
  }
  # 처리 상태 실시간 시각화 (서버 다운 방지 모니터링)
  stdout { codec => dots }
}

About

우리FISA - 우리카드 데이터를 활용한 ELK 프로젝트

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •