데이터 분석가:Applied Data Analytics

Main Quest06_Project_Tableau 태블로 시각화 6-3

데이터분석가 과정을 기록합니다. 2025. 3. 30. 20:46

태블로용 예측결과 데이터 생성

현재 머신러닝 예측 중 One-Hot Encoding으로 인해 메모리 초과(MemoryError)가 발생
이유는 state, name 같은 범주형 변수가 너무 많은 고유 값을 가져서 수천 개의 열로 확장되었기 때문.

해결 방안

범주형 변수는 Label Encoding으로 바꾸고, 나머지는 그대로 유지하여 메모리를 줄임. 다시 예측 파일을 생성. ​​

여전히 메모리 초과가 발생. 데이터 양이 많아서 모델 전체 학습에 부담이 가는 상황. 이를 해결하기 위해:

해결 전략

데이터의 일부만 샘플링하여 모델을 학습하고 예측.

샘플 데이터(예: 10,000건)를 사용하면 빠르게 예측 가능, 태블로 테스트용으로도 충분.  ​​

지속적인 메모리 초과로 인해 학습 및 저장이 어려운 상황!

해결 방안 요약 (태블로용 예측결과 필요시)

  1. 최종 CSV 생성은 로컬 환경 또는 Colab에서 실행하시는 것이 안정적.
  2. 아래는 그대로 복사해서 실행 가능한 코드이며, logistics_analysis.csv 파일을 로컬이나 Colab에 업로드한 후 예측결과를 얻을 수 있다.

Colab 실행용 코드

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder

# 데이터 불러오기
df = pd.read_csv("logistics_analysis.csv")
df['created_at'] = pd.to_datetime(df['created_at'], errors='coerce')
df['order_hour'] = df['created_at'].dt.hour
df['order_weekday'] = df['created_at'].dt.weekday
df['is_weekend'] = df['order_weekday'] >= 5

# 인코딩
le_name = LabelEncoder()
le_state = LabelEncoder()
df['name_enc'] = le_name.fit_transform(df['name'])
df['state_enc'] = le_state.fit_transform(df['state'])

# 샘플링 (예: 10,000건)
df_sample = df.sample(n=10000, random_state=42)

X = df_sample[[
    'order_hour', 'order_weekday', 'is_weekend',
    'latitude', 'longitude', 'name_enc', 'state_enc'
]]
y = df_sample['delayed']

# 모델 학습
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# 예측
df_sample['delay_predicted'] = model.predict(X)

# 저장
df_sample[[
    'order_id', 'user_id', 'city', 'state', 'country',
    'name', 'latitude', 'longitude', 'delayed', 'delay_predicted'
]].to_csv("logistics_delay_prediction_sample.csv", index=False)

이 코드를 실행하면 logistics_delay_prediction_sample.csv라는 파일이 생성, 태블로에 바로 업로드하여 지연 예측 결과 시각화가 가능


SHAP 기반 설명형 모델 개요

항목 설명
목적 모델이 배송 지연 여부를 예측한 이유를 시각적으로 설명
방법 SHAP값을 이용해 각 Feature가 예측값에 얼마나 영향을 주었는지 계산
도구 shap, matplotlib, sklearn 등 사용
모델 RandomForestClassifier 또는 XGBoostClassifier 등 tree-based 모델

 


필요한 준비사항

Colab 또는 로컬 환경에서 다음 패키지를 설치해주세요:

pip install shap
pip install xgboost



전체 코드 예시 (Colab / 로컬 실행용)

import pandas as pd
import shap
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt

# 데이터 불러오기
df = pd.read_csv("logistics_analysis.csv")
df['created_at'] = pd.to_datetime(df['created_at'])
df['order_hour'] = df['created_at'].dt.hour
df['order_weekday'] = df['created_at'].dt.weekday
df['is_weekend'] = df['order_weekday'] >= 5

# 인코딩
le_name = LabelEncoder()
le_state = LabelEncoder()
df['name_enc'] = le_name.fit_transform(df['name'])
df['state_enc'] = le_state.fit_transform(df['state'])

# 피처 / 타겟 설정
X = df[['order_hour', 'order_weekday', 'is_weekend', 'latitude', 'longitude', 'name_enc', 'state_enc']]
y = df['delayed']

# 샘플링
X_sample, _, y_sample, _ = train_test_split(X, y, train_size=1000, stratify=y, random_state=42)

# XGBoost 모델 학습
model = xgb.XGBClassifier(n_estimators=100, use_label_encoder=False, eval_metric='logloss')
model.fit(X_sample, y_sample)

# SHAP값 계산
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_sample)

# 시각화 1: 전반적인 특성 영향도 (Summary Plot)
shap.summary_plot(shap_values, X_sample)

# 시각화 2: 개별 예측 설명 (force plot)
shap.initjs()
shap.force_plot(explainer.expected_value, shap_values[0], X_sample.iloc[0], matplotlib=True)


해석 가이드

시각화 의미
summary_plot 어떤 feature가 전체 예측 결과에 큰 영향을 미쳤는지 (ex. 위도, 시간대)
force_plot 특정 주문에 대해 지연 예측을 만든 이유 (파란색: 감소 영향, 빨간색: 증가 영향)

 


적용 예시

"이 주문은 오후 8시에 접수되었고, 주말이며, 특정 물류센터에서 출발했기 때문에 지연 예측됨"


 

1. SHAP 시각화 결과를 대시보드에 통합

목표

SHAP 값 기반 배송 지연 예측 이유를 사용자가 쉽게 이해할 수 있도록 태블로/대시보드/웹앱에 시각적으로 표현.


1-1. SHAP summary_plot 저장 → 이미지 or 테이블 형태

  • summary_plot() 또는 force_plot()을 이미지로 저장해서 태블로에 첨부하거나 웹 대시보드에 삽입 가능.
 
shap.summary_plot(shap_values, X_sample, show=False)
plt.savefig("shap_summary.png")

→ shap_summary.png를 태블로의 이미지 오브젝트로 삽입하거나, Streamlit에 표시 가능


1-2. SHAP 값을 테이블화해서 함께 보여주기

shap_df = pd.DataFrame(shap_values, columns=X_sample.columns)
shap_df["order_id"] = df["order_id"].iloc[:len(shap_df)]
shap_df["delay_predicted"] = model.predict(X_sample)

→ shap_df는 각 주문에 대해 배송 지연에 영향을 준 요인값을 테이블로 나타냄
→ 이걸 CSV로 저장해서 태블로에 연결된 테이블로 불러오기 가능


1-3. SHAP Feature Importance Top 3를 텍스트 박스로 제공

 
def get_top_features(shap_row, features, top_n=3):
      shap_series = pd.Series(shap_row, index=features)
      top_features = shap_series.abs().sort_values(ascending=False).head(top_n)
      return ", ".join(top_features.index)
 
shap_df["top_influences"] = shap_df.iloc[:, :-2].apply(lambda row: get_top_features(row, X_sample.columns), axis=1)

→ top_influences 컬럼을 태블로에서 표시 → "이 주문은 시간대, 위도, 센터 때문에 지연 가능성이 높습니다"

정리: 태블로에 SHAP 통합 방법

방법 구현 방식
시각화 이미지 삽입 summary_plot() → PNG → 태블로에 삽입
영향도 테이블 SHAP 테이블 → CSV → 태블로 데이터 소스로 연결
영향도 텍스트 SHAP top 요인 문자열 → 텍스트 필드로 표시

특정 조건일 때 자동 배송 지연 경고

목표

배송 지연 가능성이 높을 때 자동 경고 표시 or 우선 조치 대상 선정


2-1. 조건 정의

예측 지연 + 주요 원인이 특정 요인일 때 "주의 표시"

예시 조건:

  • delay_predicted = True
  • top_influences에 order_hour, state 포함
 
def get_warning_flag(row):
    if row['delay_predicted'] and "order_hour" in row['top_influences']:
        return "지연 위험 (야간 주문)"
    elif row['delay_predicted'] and "state_enc" in row['top_influences']:
        return "지연 위험 (지역 이슈)"
    elif row['delay_predicted']:
        return "지연 위험"
    else:
        return "정상"

shap_df["delay_warning"] = shap_df.apply(get_warning_flag, axis=1)

→ delay_warning 필드를 태블로에서 색상 or 아이콘 마크로 표시


2-2. 태블로 대시보드에서 자동 경고 구현

구성 요소 설정
조건부 마크 색상 delay_warning = 지연 위험일 때 빨간색
텍스트 팝업 주문 Hover 시 top_influences, delay_warning 텍스트 표시
필터 지연 위험 주문만 따로 필터링 가능

전체 흐름 요약

  1. SHAP 모델 학습 및 결과 생성
  2. 주문별 SHAP 영향도, 예측값, 주 요인 텍스트 필드 생성
  3. CSV 저장 후 태블로에 연결
  4. 태블로에서:
    • SHAP 영향도 테이블/텍스트/이미지 표시
    • 조건부 경고 마크 및 필터 구성

SHAP 분석 결과 CSV 템플릿 예시

order_iduser_idcitystatenamelatitudelongitudedelayeddelay_predictedtop_influencesdelay_warning
A12345 U001 Dallas TX Houston DC 32.78 -96.8 True True order_hour, name_enc, latitude 지연 위험 (야간 주문)
B23456 U002 Chicago IL Memphis DC 41.88 -87.6 False False order_weekday, state_enc, name 정상
C34567 U003 Phoenix AZ LA DC 33.45 -112.1 True True state_enc, latitude, order_hour 지연 위험 (지역 이슈)

CSV 템플릿 다운로드

파일에는 다음 정보가 들어갑니다:

  • 주문 ID, 유저 ID, 도시/주
  • 물류센터명
  • 지연 여부(실제 및 예측)
  • SHAP top 영향 변수
  • 지연 경고 메시지

shap_delay_explanation_template.csv  : SHAP 분석 결과를 기반으로 한 배송 지연 예측 설명 템플릿 CSV 파일이 생성

파일 구성 요약

컬럼명                                                                                    설명
order_id, user_id 주문 및 사용자 ID
city, state, country 지역 정보
name 물류센터명
latitude, longitude 사용자 위치
delayed, delay_predicted 실제/예측 배송 지연 여부
top_influences SHAP 기반 주요 영향 요인 3개
delay_warning 지연 위험 여부에 따른 경고 메시지

이제 이 파일을 태블로에 업로드하여:

  • 각 주문별 지연 원인 분석
  • 지연 위험 경고 표시
  • 지역/센터별 리스크 분석

을 구현할 수 있다.