시계열 분석이 중요한 이유 1. 예측 및 추세 분석 2. 의사 결정 지원 3. 이상 탐지 4. 자원 할당과 계획
시계열 활용 1. 금융 분석 2. 수요 예측 3. 자연재해 예측 4. 건강관리 5. 에너지 예측 및 최적화 6. 교통 및 운송 분석 7. 경제 분석 8. 환경 모니터링
주요 시계열 분석 기법 1. 이동평균 2. 지수평활법 3. ARIMA 4. SARIMA 5. Prophet 6. LSTM 7. VAR
이 외에도 선형 회귀, 의사결정나무, 랜덤포레스트 등 다양한 기법 사용하여 시계열 데이터에 활용
시계열 데이터의 구성 요소 : 추세 1. 상향추세 : 시간이 지남에 따라 데이터가 점진적으로 증가(긍정) 2. 하향추세: 시간이 지남에 따라 데이터가 점진적으로 감소 3. 평평한 추세: 큰 변동이 없을 때
시계열 데이터의 몇가지 특징
1. 시간 의존성 2. 계절성 3. 추세
결측치는 시계열 데이터에서 누락되었거나 기록되지 않은 것으로 데이터 분석과 예측에 부정적인 영향을 미칠 수 있도 모델의 퀄리티를 하락 시킨다.그래서 결측치 처리를 해주어야 한다.
결측치 처리해야하는 이유
1. 데이터 왜곡 방지 2. 예측 정확도 향상 3. 유의미한 데이터 분석
이를 위해 데이터를 예측 모델에 적합하게 변형하거나 제거해줘야 한다.
결측치 확인 방법 1. 데이터셋 요약 정보 확인 info()나 describe 메서드 이용하여 결측치 확인 2. 시각화 : 히트맵이나 누락 데이터 플롯 사용, 흰색 또는 다른 색상의 데이터 확인 3. 조건식: pandas의 isnull() 또는 isna() 메서드 이용, 또 마이너스 값도 찾을 수 있다. 4. 결측차 개수 확인 isnull().sum()메서드 사용하여 각열의 결측치 개수 확인
결측치의 빈도 및 패턴 분석방법 결측치의 빈도 및 패턴 분석하는 것은 결측치를 어떻게 처리할지 전략을 세울 때 필요하다. 그러나 패턴을 갖고 있는 경우는 드물며 갖고 있다면 특정 기간에 대한 패턴이 나타나는 경우가 많다->이 경우 그 기간만 빼고 작업
1. 결측치 개수 확인 2. 결측치의 위치 확인 3. 시각화 4. 시계열 분석
시계열 데이터 전저치 방법 1. 결측치 삭제 장점 1. 간단하고 직관적으로 결측치 처리 2. 시계열 데이터 특성 유지하며 결측치 삭제 3. 시계열 데이터에서는 시간적 연속성이 중요하므로 시간적 흐름 유지할 수 있다는 장점
단점 1. 데이터 손실 2. 결측치가 많으면 데이터셋의 크기가 크게 축소 3. 해당 시점의 데이터 패턴이나 특성 파악 불가
결측치가 적거나 다른 변수와 상관관계가 적을 때만 사용하는 게 좋은 방법
시계열 데이터 전처리 방법 2.선형보간
선형보간 원리 1. 결측치 앞과 뒤에 있는 유효한 데이터 포인트 찾는다 2. 해당 유효한 데이터 포인트의 값과 위치를 사용하여 둘 사이에 값 채워넣는다
결측치 앞뒤 데이터의 경향성을 이용하여 대체하기 때문에 해당 데이터의 추세와 패턴을 잘 따라가지만 선형적인 방법에서만 사용할 수 있다.
주로 사용되는 세 가지 보간법 1. 선형 보간 : 주어진 두 점을 직선으로 연결 주로 시계열에서 간단하고 빠른 결측치 보완이 필요할 때 사용(예시 : 온도)
2. 스플라인 보간 : 주어진 데이터를 부드러운 곡선으로 연결 주로 데이터 셋이 크고 곡석의 특징을 정확하게 파악해야할 때 사용(예시: 경제 지표)
3. 최근접 이웃 보간 : 결측치를 가장 가까운 이웃의 값으로 채운다 주로 이산적인 데이터나 이상치에 민감하지 않을 때 사용한다.(예시: 추세나 변동성 파악)
각각의 보간법은 데이터의 특성과 분석 목적에 따라 선택되어야 한다
결측치를 대처하는 또 다른 방법
1.평균값 대처 결측치를 해당 변수의 평균값으로 대처
효과: 1. 간편하다 2. 데이터의 중심 경향성 유지 3. 표본 편향 감소
한계: 1. 정보 손실 2. 변동성 왜곡 3. 상관관계 왜곡
2. ARIMA 모델을 사용한 결측치 처리
시계열 모델을 사용한 결측지 예측과 대체에 대한 몇가지 주의 -결측치 예측 모델은 학습 데이터에 의존하므로, 예측 범위를 넘어선 시간대의 결측치에 대해서는 정확한 예측이 어렵습니다. 따라서, 모델을 적용할 시계열 데이터 범위를 신중하게 선택
- 결측치 예측 모델은 데이터의 패턴과 특성을 기반으로 예측하므로, 시계열 데이터에 시간적인 의존성이 존재해야 한다. 만약 데이터에 대한 시간적 의존성이 없는 경우 다른 대체 방법 고려
- 결측치 예측 모델의 성능은 예측 변수의 품질과 결측치의 분포에 따라 달라지니 예측 변수의 품질이 낮거나 결측치의 비율이 높을 경우 모델의 성능이 저하될 수 있다.
-결츨치 예측 모델은 예측 결과의 불확실성을 포함 할 수 있다.
-모델의 선택과 하이퍼파라미터 조정에 주의, 적절한 모델 선택과 모델 파라미터 튜닝을 통해 예측 성능을 향상
-아나콘다는 머신러닝이나 데이터 분석 등에 사용하는 여러가지 패키지가 기본적으로 포함되어있는 파이 썬 배포판
-분야를 파이썬으로 접근하고자 할 때 세팅이 매우 간단
-또한, 파이썬 가상 환경을 구축하는데도 유용
-내부적으로 conda라는 환경/패키지 관리자가 존재하며 이 conda를 통해 패키지를 설치하거나 가상 환경을 관리
-하나의 가상 공간을 만들어서 버전별로 만들어져 있어서 버전관리에 용이
아나콘다를 설치 후 프롬프트를 열 때는 무조건'관리자 권한'으로 열어줄 것
1. 가상환경 만들고 들어가기
# 가상 환경 만들기
conda create -n AI python=3.8 # 여기서 AI는 원하는 대로 환경명을 지어주면 된다
# 가상환경 접속
conda activate AI
2. 가상환경에 주피터 노트북 설치
# 생성된 가상환경으로 접속하는 명령어
conda activate AI
# 가상환경에 jupyter notebook 설치
pip install jupyter notebook
pip install ipykernel
# 가상환경에 kernel 연결
python –m ipykernel install -–user -–name 가상환경명 –-display-name 가상환경명
python –m ipykernel install -–user -–name AI –-display-name AI
3. 주피터 노트북 접속 - 특정 폴더 만들고 그 폴더 안으로 경로변경(cd) 후 해줘라
jupyter notebook
#나오는 주소 들어가기
주피터 노트북에서 실습 끝나면 셧다운 해주기
평균과 표준편차는 알아둬라
1. 정규분포는 중심을 기준으로 양쪽으로 대칭되는 분포인 종모양 분포이다.
2. 내가 히스토그램으로 시각화한 데이터가 종모양이면 정규분포인 것
3. 정규분포에서는 평균과 표준편차가 아주 중요하다
# 연속형 데이터 분석 시 고려해야 할 사항 (분포, 통계 지표 등)
• 중심 경향성: 연속형 데이터의 중심 경향성을 파악하는 것은 매우 중요합니다.
이를 위해 대표적으로 평균(mean), 중앙값(median), 최빈값(mode)을 계산할 수 있습니다.
이 때, 데이터의 분포가 비대칭적 이면 평균보다 중앙값이나 최빈값이 더 적합한 경우가 있습니다
평균: 데이터 값 다 합쳐서 개수로 나눈 값
중앙값: 크기순서대로 정렬했을 때 데이터 가운데 위치한 값
최빈값: 데이터에서 등장 가장 자주하는 값
연속형 데이터 분석 시 고려해야 할 사항 (분포, 통계 지표 등)
• 산포도: 연속형 데이터의 산포도를 파악하는 것은 중요합니다. 대표적으로 분산(variance), 표준편차(s tandard deviation), 범위(range), 사분위간 범위(interquartile range) 등을 계산할 수 있습니다, 그래프가 얼마나 퍼져있는가
-산포도가 너무 높은 데이터세트로 학습시키면 특정 경향에서만 테스트 잘되는 모델이 생길 수도 있다.
이상치 : 대부분의 데이터가 모여있는 데이터들 밖으로 극단적인 값으로 나타난 데이터로 제거해주어야 함, 0으로 바꾸거나 제외해주거나 삭제해줄 수 있다. 보통은 0로 바꿔준다.
박스플롯을 통한 실습
상자 두께가 얕고 위아래 막대에 값이 많을 수록 중앙에 값이 잘 모여있다는 뜻
상관관계 : 연속형 데이터 간의 상관관계를 파악, 상관관계는 두변수간의 관련성을 -1~1로 표현, 값이 0이면 상관관계가 없다는 것. 1일수록(같이 같이 올라가면) 상관관계가 있으며(맑은 날 우산 판매량->비가 안올 때 우산 판매량 훅 떨어짐) -1이면 음의 상관관계가 있는 것.
데이터의 종류
1. 이산형 데이터 : 정수형 데이터, 동전던지기 처럼 확률이나 연속되지 않은 데이터. 가능한 값이 한정되어있음
당뇨병 데이터로 best model 뽑은 이후 과정 : 실험에 사용했던 데이터를 저장(Data store)&관리하고 서비스 배포
import numpy as np
from azureml.core import Dataset # 데이터 관리해주는 모듈
#실험에 사용했던 데이터 넘파이로 저장
np.savetxt('feature.csv', X_train, delimiter=',') # X_train의 내용을 features.csv라는 이름으로 저장, 구별자는 ','
np.savetxt('labels.csv', y_train, delimiter=',')
파일 두개 생성 완료
# 데이터 스토어에 업로드하는 작업
datastore = ws.get_default_datastore # 데이터 스토어 변수로 저장
datastore.upload_files(files=['./feature.csv','./labels.csv'], # 업로드할 (파일 현재/)경로파일 이름
target_path = 'diabetes-experiment/', # 경로 지정
overwrite=True #이전 파일이 있을 경우 덮어쓰기
)
이제 data > datastore> workspace 선택 > 아까만든 당뇨병 실험 폴 더 안에 두개의 파일 올라가 있을 것이다.
# 저장된 정보 가져오기
feature_dataset = Dataset.Tabular.from_delimited_files(path=[(datastore,'diabetes-experiment/features.csv')])
label_dataset = Dataset.Tabular.from_delimited_files(path=[(datastore,'diabetes-experiment/labels.csv')])
# best model 등록하는데 필요한 패키지
import sklearn
from azureml.core import model Model
from azureml.core.resource_configuration import ResourceConfiguration
# 시스템에 모델의 등록
model = Model.register(workspace=ws,
model_name = 'diabetes-experiment-model', # 모델 이름
model_path = f'./{str(best_run.get_file_names()[0])}', # 모델의 경로, f붙임으로써 format형태로 지정
model_framework=Model.Framework.SCIKITLEARN, # 학습에 사용한 프레임워크 저장
model_framework_version=sklearn.__version__, # 프레임워크 버전
sample_input_dataset = feature_dataset,
sample_output_dataset=label_dataset,
resource_configuration=ResourceConfiguration(cpu=1, memory_in_gb=0.5), # 해당 모델을 돌리는데 필요한 cpu와 메모리
description='Ridge regression model to predict diabetes progression', # 설명
tags= {'area':'diabetes', 'type':'regression'}
)
모델이 등록된 걸 볼 수 있다.
배포하고 나면 endpoint도 생길 것이다
# 모델 잘 등록이 되었는지 확인
print('Model name: ', model.name)
print('Model Version:', model.version)
출력>
Model name: diabetes-experiment-model
Model Version: 1
이제 모델을 실제로 배포해보자
# 모델의 배포
service_name = 'diabetes-service'
service = Model.deploy(ws, service_name, [model], overwrite=True) # 워크스페이스 지정, 서비스 이름지정, 모델지정-여러개를 한꺼번에 배포할 수 있어서 리스트 타입으로 지정, 덮어쓰기 지정
service.wait_for_deployment(show_output=True) # 배포하는 중간 아웃풋 보여주기
배포된 모습
1. endpoint
2. 테스트 가능
# Notebook에서도 아래와 같이 예측 테스트 해볼 수 있다
import json
input_payload = json.dumps({
'data': X_train[0:2].values.tolist(),
'method': 'predict'
})
output = service.run(input_payload)
print(output)
데이터를 가지고 오면 raw data가 되고 여기서 우리가 필요한 형태로 데이터 전처리 과정을 거쳐야한다.
그때 필요한 메타데이터를 따로 관리하기도 하고 그래서 전처리를 해서 나온것이 features(feature engineering)
그리고 이 feature를 가지고 트레이닝과 테스트셋으로 나눠서 트레이닝셋에 알고리즘을 먹이고 파라메타를 조정한다. 여기서 데이터를 학습해서 넣은 것이 모델이다.
그리고 이 모델에 테스트셋을 넣어 평가해보고 괜찮으면 저장하고 배포한 것이 API
1. Automates ML > Create a new Automated ML job 눌러서 시작
2. 데이터를 먼저 만들어주자
create 눌러 시작
이미 예제 파일이 로컬에 있음으로 from local file을 체크하고 넘어간다
저장 공간을 지정
업로드할 파일 선택
데이터의 구조 보기
file format : delimited 구분자로 구별되어있다
ㄴ보면서 빼줘야할 column을 미리 생각해보자
-첫번째 열
-name
-티켓번호
schema(구조)에서는 아까 빼버린 옵션을 꺼버리면 된다
그리고 결과적으로 예측을 할 survived가 0, 1의 정수형으로 되어있는데 컴퓨터는 이 값이 그냥 숫자로 착각할 수도 있기 때문에 삶과 죽음 값 2개 밖에 없음을 나타내기 위해 bool타입으로 바꿔준다
전체적인 overview에서 create까지 눌러주면 DataSet이 만들어진 것(안보이면 refresh)
3.
만들어진 데이터 셋 누르고 next 눌러 새로운 job을 만든다
이름 짓고/ 라벨 데이터 정하고 / 이걸 돌린 컴퓨터 설정(지난 과정에서 만든 vm)
4. 어떤 문제를 풀것인지 체크 (타이타닉 예제는 산자/죽은 자를 나누는 classification 문제)
deep learning을 누르면 dl까지 해주고 아니면 sklearn만 사용. 이번엔 체크해보자
next 하기전 view additional configuration settings에서 Primary metric(지표) 정해주고
Blocked model에서 아예 시도도 안해도 될 것같은 알고리듬을 정해준다.
exit criterion은 시간이 얼마나 걸렸을 때 그만 중단시킬지 정해주는 것
max concurrent iteration은 몇개를 동시에 돌릴지 정한다(올릴 수록 돈도 많이 듦^^)
그 후 저장하고 next
4. validate and test, 모델 평가방법
validatio type: (1)train-validation split 은 학습/테스트용으로 쪼개서 해서 테스트 (2)user validation data 테스트용 데이터 따로 줘서 사용
finish를 눌러준다
completed되기 전 만들어지는 과정에서도 models 들어가면 만들어지며 list up되는 과정 볼 수 있다
알고리즘 중 같은 정확도라면 duration이 짧은 게 좋다(여기선 standardScalerWrapper로 전처리, XGBoostClassifier가 알고리듬)
눌러서 들어가보면 그 모델에 대한 설명 볼 수 있다, /view generated code 하면 코드도 활용 가능./Metric을 보면 해당 알고리즘의 지표들을 보여준다./Data transformation에서는 데이터 전처리 과정을 볼 수 있다.
세번째 방법 : Notebooks
이번에는 당뇨병 데이터를 예제로 사용
파일을 새로 만들어준다
python 버전 바꾸기
애저 쪽 기능을 다 쓰려면 인증을 눌러줘야한다!
# Azure Machine Learning은 Microsoft에서
# Workspace는 머신 러닝 프로젝트의 모든 구성 요소를 포함하는 최상위 개체
# 애저 쪽 기능 임포트
from azureml.core import Workspace
# 워크스페이스 쪽 현재상황 보는 참조 변수 만들기
ws = Workspace.from_config()
# 워크스페이스의 이름 및 다른 몇가지 정보 더보기
print('Workspace name:' + ws.name,
'Azure region:' + ws.location,
'Subscription ID:' + ws.subscription_id,
'Resurce group:' + ws.resource_group
)
실험 공간? 워크 스페이스 내에 또 연구실이 있고 이 안에서 파이썬을 돌리도록 되어있다.
# 실험 공간을 준비
from azureml.core import Experiment
# 실험을 할 땐 워크스페이스에 만들어주고 실험의 이름도 지정
experiment = Experiment(workspace=ws, name='diabetes-experiment')
# 데이터 준비
from azureml.opendatasets import Diabetes
# 데이터 쪼개는 데 쓰는 모듈 임포트
from sklearn.model_selection import train_test_split
#pandas 데이터 프레임 형태로 보기, 이미 보관된 데이터를 가져오는 거라 get_tabular를 이용,dropna()로 빠진 행 지우기
x_df = Diabetes.get_tabular_dataset().to_pandas_dataframe().dropna()
# Y값만 꺼내서 저장
y_df = x_df.pop('Y')
# 데이터 쪼개기
X_train, X_test, y_train, y_test = train_test_split(x_df, y_df, test_size=0.2, random_state=66)
# 쪼개진거 확인
print(X_train)
pandas 데이터 프레임 형태로 보기 단계의 표. Y(당뇨)가 라벨이 될것이고 나머진 Feature이 될 것이다
# 모델 훈련, 로그, 모델 파일 관리
# 알고리듬/ 평가지표/ 저장 모듈 부르기
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.externals import joblib
# 수학적 도구 임포트
import math
# 학습을 시키기 위한 alpha 값 만들기(성능 비교위해)
alphas = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
# 테스트
#for alpha in alphas:
#
# model = Ridge(alpha=alpha)
# model.fit(X_train, y_train) # 데이터 학습
# y_pred = model.predict(X_test) # 예측 결과 저장
# mse = mean_squared_error(y_test, y_pred) # 오류 저장
#
# print('model_alpha={0}, mse={1}'.format(alpha, mse)) # 결과 보기
오류 측정을 rmse로 바꿔서 해주기 (mse에 루트준 값), 실험 로그 남기기
# 테스트
for alpha in alphas:
#실험의 기록
run = experiment.start_logging() # 실험 시작, 로그 시작
run.log('alpha_value',alpha) # 로그 기록 항목1
model = Ridge(alpha=alpha) # Ridge 회귀 분석 모델을 만들고,Ridge(alpha=alpha) 부분은 alpha 매개 변수를 사용하여 규제 강도를 지정
model.fit(X_train, y_train) # 데이터 학습
y_pred = model.predict(X_test) # 예측 결과 저장
rmse = math.sqrt(mean_squared_error(y_test, y_pred)) # 오류 저장
run.log('rmse', rmse) # 로그 기록 항목2
print('model_alpha={0}, rmse={1}'.format(alpha, rmse)) # 결과 보기
# 모델을 파일로 저장하는 부분
model_name = 'model_alpha_' + str(alpha) + '.pkl' # 파일 이름 정하기
filename = 'outputs/' + model_name # 경로 + 모델명
#joblib은 파이썬의 객체 직렬화 라이브러리로서, 메모리에 상주하는 파이썬 객체를 파일 형태로 저장하거나 읽어들이는 기능을 제공
joblib.dump(value=model, filename = filename) # 저장명령으로 임시저장(dump), 내용은 모델,저장할 파일의 이름
# Azure ML Service 에 모델 파일을 업로드 하는 부분
run.upload_file(name=model_name, path_or_stream=filename)
run.complete() # 기록끝
print(f'{alpha} experiment completed')
실험 완료
실험이 끝났으면 파일 창 refresh하면 훈련시킨 모델들이 저장된 걸 볼 수 있다
job 에셋 > 당뇨병 실험 들어가기
각각의 실험에 대한 모델들을 볼 수 있다.(Azure ML Service 에 모델 파일을 업로드 하는 부분)
각각의 모델에 들어가면 설정했던 alpha_value과 오류값 측정등을 볼 수 있다.
다시 해당 노트북에서 expriment 치면 리포트 등 볼 수 있다.
expriment
모델 중 가장 best 모델 탐색 후 다운로드(rmse가 가장 낮은 모델)
# Best Model을 탐색 후 다운로드
minimum_rmse = None # 오류도
minimum_rmse_runid = None # 몇번 째 실험인지 인덱스
for exp in experiment.get_runs(): # 실험 돌리기
run_metrics = exp.get_metrics(); # 평가지표 돌리기
run_details = exp.get_details(); # 실험 디테일 돌리기(몇번째 실험인지 알기위해 사용하는 듯)
run_rmse = run_metrics['rmse'] # 평가지표중에 rmse 돌리기
run_id = run_details['runId'] # 디테일 중 몇번째 실험인지 돌리기
# 가장 낮은 RMSE 값을 가진 실행 ID를 구하는 부분
if minimum_rmse is None: # minimum_rmse가 none일 때
minimum_rmse = run_rmse # 평가지표 돌리고
minimum_rmse_runid = run_id # minimum_rmse id 도 돌려
else:
if run_rmse < minimum_rmse: # rmse가 기존 minimum rmse보다 작으면
minimum_rmse = run_rmse # 걔가 새로운 minimum으로 대체
minimum_rmse_runid = run_id # id도 같은 이치로 작업
print('Best run_id: ' + minimum_rmse_runid)
print('Best run_id rmse: ' + str(minimum_rmse))
# best 파일 이름 확인
from azureml.core import Run
best_run = Run(experiment=experiment, run_id=minimum_rmse_runid)
print(best_run.get_file_names())
#베스트 모델 파일 다운로드
best_run.download_file(name=str(best_run.get_file_names()[0]))
#이제 파일 목록에 베스트 버전 모델이 다운로드 되어있다.
과정에 오류가 생기면 Jobs에 해당 실험들어가 뭔가 값이 빠지거나 여전히 생성중인 파일이 있는 것인지 확인하고 삭제 재실행한다
# n_cluster를 3으로 줬을 때
single_clustering = AgglomerativeClustering(n_clusters=3, linkage='single')
single_clustering.fit(data)
single_cluster = single_clustering.labels_
single_cluster # 결과보니 분별력 없음을 알 수 있다
plt.scatter(data[:,0],data[:,1], c=single_cluster)
# 저 single이라는 기준 자체가 문제다
1. complete linkage
# complete linkage
complete_clustering = AgglomerativeClustering(n_clusters=3, linkage = 'complete')
complete_clustering.fit(data)
complete_clust = complete_clustering.labels_
complete_cluster # single 보다 변별력 생김을 알 수 있다.
plt.scatter(data[:,0], data[:,1], c = complete_cluster)
3. dendrogram으로 나눠지는 과정 이해하기
# 덴드로그램 (dendrogram) - 클러스터가 나눠지는 원인 볼 수 있다.
from scipy.cluster.hierarchy import dendrogram
# hierarchical Cluster의 자식 노드
children = complete_clustering.children_ #_로 끝나는 건 내부속성 이름 뒤에 붙는 경우가 많다.
distance = np.arange(children.shape[0])
# 각 클러스터 단계를 포함한 노드의 수 계산
no_of_observations = np.arange(2, children.shape[0]+2) #
linkage_matrix = np.column_stack([children, distance, no_of_observations]).astype(float)
# 덴드로그램을 그린다
dendrogram(linkage_matrix, p = len(data), labels = complete_cluster, show_contracted=True, no_labels=True)
덴드로그램에서 x축은 데이터를 나타낸다 총 데이터 수인 178개의 점이 있을 것이다.
위 과정에서 클러스트를 3개로 나누었음으로 그래프가 3분파로 갈라지는 상위 부분 쯤에서 잘랐을 것이다.
# K-Means 모델 만들기
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters = 3) # 군집 세가지로 나누겠다.사실 이번 데이터는 high / middle / low로 라벨링 되있기때문에..원래는 이런 데이터는 classification하는 게 나음
kmeans.fit(data) # data를 세개의 그룹으로 쪼개갰다, 모델완
# 형성된 군집 시각화
plt.scatter(data[:,0], data[:,1], c = cluster, linewidth=1, edgecolors='black') # x좌표는 모든 데이터를 가져오는데 0번, y좌표는 모든 데이터를 가져오는데 1번 이용, data[:5] 이부분에서 사용하는 거 생각하면됨, 군집마다 컬러 나눠주기