20260518 TIL

2026. 5. 18. 12:09TIL

📢 오늘의 목표

🚩품질 경영 기사를 공부하면서 품질 역량을 키운다.

 

🚩시계열 데이터를 공부하면서 시계열 데이터 분석 역량을 키운다.

 

🚩태블로 강의를 수강하면서 데이터 시각화 역량을 기른다.

 

🚩대시보드 강의를 수강하면서 데이터 시각화 역량을 기른다.


📅 TIL

❇️ Tableau 강의

Tabpy는 Tableau 환경에서 python 코드를 사용할 수 있도록 해주는 것

 

Python 스크립트(머신러닝·통계·데이터 전처리 등) 를 직접 실행할 수 있게 해주는 외부 서비스 게이트웨이

 

Tableau 계산식(SCRIPT_REAL, SCRIPT_INT, SCRIPT_STR, SCRIPT_BOOL) 안에서 Python 코드를 직접 호출

 

ex)

SCRIPT_REAL(
"import numpy as np
return np.mean(_arg1)"
, SUM([Sales])
)

 

→ Tableau의 [Sales] 데이터를 Python으로 보내서 numpy.mean()으로 평균

 

2. Send Code to TabPy and Run it

  • Tableau는 사용자가 작성한 Python 코드를 TabPy 서버로 전송
  • TabPy는 Python이 설치된 환경에서 코드를 실행
  • 이때 Python의 다양한 라이브러리(numpy, pandas, scikit-learn 등)를 활용할 수 있음
  • → 즉, 머신러닝 모델 훈련, 예측, 통계 분석 등을 Tableau 안에서 수행

3. Return a List back to Tableau

  • Python이 실행 결과를 리스트 형태로 Tableau에 반환
  • 예를 들어 Python이 계산한 예측값이나 통계 결과를 Tableau로 다시 보내면,
  • Tableau는 그 값을 시트 또는 차트에 시각화

4. Tableau Table Calc

  • 반환된 값은 Tableau에서 일반 계산식처럼 사용할 수 있음
  • → 즉, Tableau의 다른 필드들과 조합해서 그래프, KPI, 예측 차트 등을 만들 수 있음

SCRIPT_REAL(" ... ") → 🟥

  • 의미 : Tableau가 TabPy 서버를 통해 Python 코드를 실행하도록 하는 Script 함수
  • REAL은 숫자형(float) 결과를 반환할 때 사용
    • SCRIPT_REAL() → 숫자형 결과
    • SCRIPT_INT() → 정수형 결과
    • SCRIPT_STR() → 문자열 결과
    • SCRIPT_BOOL() → True/False 결과

② text = _arg1 → 🟦

  • 의미 : Tableau에서 넘겨준 첫 번째 인수(_arg1)를 Python 변수 text에 저장하는 부분
  • _arg1, _arg2, _arg3 … 은 Tableau가 전달하는 입력값으로, SCRIPT 함수 뒤에 쉼표(,)로 구분해 전달
  • 이 예시에서는 _arg1이 ATTR([Comment])로부터 넘어온 텍스트 목록(댓글 데이터)이 됨

③, ATTR([Comment]) → 🟨

  • 의미 : Tableau 필드 [Comment]를 Python 코드의 _arg1로 전달하는 부분
  • 즉, Tableau 시트의 댓글(Comment) 데이터 열이 Python 코드의 입력값으로 사용

실습

Tabpy 설치

 

1. CMD창을 통해 명령 프롬프트 열기

 

2. 설치 전 pip 업데이트

python -m pip install --upgrade pip
# python3 -m pip install --upgrade pip

 

3.Tabpy 패키지 설치

pip install tabpy

 

4. 설치된 Tabpy를 실행

tabpy

# Do you wish to proceed without authentication? (y/N): 뜨면 y 엔터

 

이때 Do you wish to proceed without authentication는 권한 없이 실행할 것인지 물어보는 것으로 우리는 로컬 서버에서 사용하므로 사용할 필요 x

 

➡️브라우저에서 http://localhost:9004 접속 → TabPy REST API 페이지가 뜨면 OK

 

성공적으로 실행

  • 호스트 이름 : localhost ( Tabpy가 설치된 IP)
  • 포트 : 9004 (Default

 

Tabpy를 활용한 클러스터링

3-1. K-Means

  • K-Means는 가장 대표적인 비지도 학습(unsupervised learning) 알고리즘 중 하나로, 데이터를 K개의 그룹(클러스터)으로 나누는 방법
  • 즉, 비슷한 데이터끼리 묶어 패턴이나 구조를 찾는 데 쓰임
  1. **K 선택 :**사용자가 만들고 싶은 클러스터 개수 K를 정함
  2. 초기 중심점(centroid) 설정 : 임의로 K개의 점을 데이터 공간 안에 초기 중심으로 둠 (랜덤 선택)
  3. 할당 단계 (Assignment Step) : 각 데이터를 가장 가까운 중심점에 할당합니다. → 클러스터 형성
  4. 업데이트 단계 (Update Step) : 각 클러스터의 데이터를 평균 내서 새로운 중심점으로 갱신합니다.
  5. 반복 : 중심점이 더 이상 크게 변하지 않거나, 수렴 조건에 도달할 때까지 3~4단계를 반복합니다.

3-2. Mini-Batch KMeans

  • Mini-Batch KMeans는 일반적인 K-Means 알고리즘을 대규모 데이터셋에 더 효율적으로 적용할 수 있도록 개선한 방식
  • 기존 K-Means는 모든 데이터를 반복(iteration)마다 클러스터 중심(centroid)에 대해 계산해야 하기 때문에 대용량 데이터에서는 연산량과 메모리 사용량이 매우 커짐
  • Mini-Batch KMeans는 이를 해결하기 위해 전체 데이터를 한 번에 쓰지 않고, 작은 배치(mini-batch) 단위로 무작위 샘플링하여 클러스터링을 진행
  1. 초기화: 일반 K-Means처럼 k개의 클러스터 중심(centroid)을 무작위로 설정
  2. 미니배치 샘플링: 전체 데이터에서 일부(예: 100~1000개 정도)를 랜덤하게 뽑아 사용
  3. 할당(Assignment): 샘플 데이터 각각을 가장 가까운 중심점(centroid)에 할당
  4. 업데이트(Update): 선택된 샘플을 기준으로 중심점을 조금씩 업데이트 (확률적 경사하강법과 유사)
  5. 반복: 여러 배치를 반복하면서 전체 데이터 분포에 맞는 중심점으로 수렴

실습

 

 

SCRIPT_INT("
import numpy as np
from sklearn.cluster import KMeans, MiniBatchKMeans

x1 = np.asarray(_arg1, dtype=np.float32)
x2 = np.asarray(_arg2, dtype=np.float32)
algo = _arg3[0]; k = int(_arg4[0])

X = np.column_stack((x1, x2))
n = X.shape[0]; k = max(1, min(k, n))

if algo == 'KMeans':
    labels = KMeans(n_clusters=k, n_init=5, random_state=59).fit_predict(X)
else:
    labels = MiniBatchKMeans(n_clusters=k, batch_size=20, random_state=59).fit_predict(X)

return labels.tolist()
",
SUM([매출]),   
SUM([수익]),   
[P_Cluster Algorithm],
[P_Cluster Numbers]
)

 

> 색깔이 안나오는 문제 발생 했는데 매개변수 표시하고 CLuster를 7개로 맞춰줬더니 해결

 

  • 행 : 합계(매출)
  • 열 : 합계(수익)
  • 색상 : C_Cluster (계산 대상 : 제품명)
  • 세부정보 : 제품명

4-1. Prophet

Prophet은 페이스북이 2017년에 공개한 시계열 데이터 예측용 오픈소스 라이브러리

  • Python과 R에서 사용 가능
  • 일별, 주별, 월별 시계열 데이터에 특히 강함
  • 계절성(Seasonality), 추세(Trend), 휴일 효과(Holiday effects) 등을 자동으로 고려

즉, “비전문가도 쉽게 시계열 예측을 할 수 있도록 만든 라이브러리”라고 볼 수 있음

Prophet의 모델 구조

Prophet은 시계열을 다음과 같이 분해함:

 

 

SCRIPT_REAL("
import pandas as pd
import numpy as np
from prophet import Prophet

# 1) 스캐폴드(뷰의 전체 날짜)
scaf = pd.DataFrame({'ds': _arg1})
scaf['ds'] = pd.to_datetime(scaf['ds'], errors='coerce')
scaf = scaf.dropna().sort_values('ds')

# 2) 히스토리(실데이터) 구성
hist = pd.DataFrame({'ds': _arg1, 'y': _arg2})
hist['ds'] = pd.to_datetime(hist['ds'], errors='coerce')
hist = hist.dropna(subset=['ds','y']).sort_values('ds')
hist = hist.groupby('ds', as_index=False)['y'].sum()

if len(hist) < 2:
    return [float('nan')] * len(scaf)

# 3) 예측 기간 = 파라미터만 사용
try:
    periods = int(_arg3[0])
except:
    periods = 0
periods = max(0, periods)

# 4) 모델 학습 & 예측
m = Prophet(yearly_seasonality=True,
            weekly_seasonality=True,
            daily_seasonality=False,
            seasonality_mode='multiplicative')
m.fit(hist)

future = m.make_future_dataframe(periods=periods, freq='D')
fcst = m.predict(future)[['ds','yhat']]

# 5) 스캐폴드와 정합 → 뷰 길이에 맞춰 반환
out = scaf.merge(fcst, on='ds', how='left')['yhat'].tolist()
return out
",
ATTR([Date]),   // 스캐폴드 날짜
SUM([매출]),                               // 히스토리 값
[P_Periods to Forecast]                    // 슬라이더: 예측 일수
)

C_Time Series Forecasting 실행할 떄 

위와 같은 오류가 나타남

 

그래서 CMD를 확인한 결과 Prophet가 설치가 안되어 있어서

 

pip install prophet

 

을 통해 prophet을 설치하니

 

정상적으로 작동됨!

'TIL' 카테고리의 다른 글

20260522 TIL  (0) 2026.05.22
20260519 TIL  (1) 2026.05.19
20260511 TIL  (0) 2026.05.11
20260504 TIL  (0) 2026.05.04
20260429 TIL  (0) 2026.04.29