2026. 5. 18. 12:09ㆍTIL
📢 오늘의 목표
🚩품질 경영 기사를 공부하면서 품질 역량을 키운다.
🚩시계열 데이터를 공부하면서 시계열 데이터 분석 역량을 키운다.
🚩태블로 강의를 수강하면서 데이터 시각화 역량을 기른다.
🚩대시보드 강의를 수강하면서 데이터 시각화 역량을 기른다.
📅 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개의 그룹(클러스터)으로 나누는 방법
- 즉, 비슷한 데이터끼리 묶어 패턴이나 구조를 찾는 데 쓰임
- **K 선택 :**사용자가 만들고 싶은 클러스터 개수 K를 정함
- 초기 중심점(centroid) 설정 : 임의로 K개의 점을 데이터 공간 안에 초기 중심으로 둠 (랜덤 선택)
- 할당 단계 (Assignment Step) : 각 데이터를 가장 가까운 중심점에 할당합니다. → 클러스터 형성
- 업데이트 단계 (Update Step) : 각 클러스터의 데이터를 평균 내서 새로운 중심점으로 갱신합니다.
- 반복 : 중심점이 더 이상 크게 변하지 않거나, 수렴 조건에 도달할 때까지 3~4단계를 반복합니다.
3-2. Mini-Batch KMeans
- Mini-Batch KMeans는 일반적인 K-Means 알고리즘을 대규모 데이터셋에 더 효율적으로 적용할 수 있도록 개선한 방식
- 기존 K-Means는 모든 데이터를 반복(iteration)마다 클러스터 중심(centroid)에 대해 계산해야 하기 때문에 대용량 데이터에서는 연산량과 메모리 사용량이 매우 커짐
- Mini-Batch KMeans는 이를 해결하기 위해 전체 데이터를 한 번에 쓰지 않고, 작은 배치(mini-batch) 단위로 무작위 샘플링하여 클러스터링을 진행
- 초기화: 일반 K-Means처럼 k개의 클러스터 중심(centroid)을 무작위로 설정
- 미니배치 샘플링: 전체 데이터에서 일부(예: 100~1000개 정도)를 랜덤하게 뽑아 사용
- 할당(Assignment): 샘플 데이터 각각을 가장 가까운 중심점(centroid)에 할당
- 업데이트(Update): 선택된 샘플을 기준으로 중심점을 조금씩 업데이트 (확률적 경사하강법과 유사)
- 반복: 여러 배치를 반복하면서 전체 데이터 분포에 맞는 중심점으로 수렴
실습



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 |