5주차 교육에 대한 회고 (4L)
이번 주도 열심히 유데미 강의를 들었다.태블로, 파이썬 시계열 분석 강의 총 2가지였다. 태블로 강의를 듣는데 꼼꼼하게 공부해서 그런가 생각보다 오래 걸려서 마음이 조급해졌다..!
그리고 금요일에 중간 평가를 쳤다. 파이썬과 SQL 총 20문제였는데, SQL이 생각보다 많이 어려웠다.ㅠㅠ 평가를 잘 보진 못해서 그 외의 다른 프로젝트나 과제를 정말 열심히 해볼 생각이다!💪💪
생각보다 시간이 많이 타이트해서 이번 주는 굉장히 버거웠다.강의 밀림 + 시험 공부 때문에 이번 주는 화요일 빼고 월, 수, 목, 금 모두 늦게까지 했다..유독 피곤한 이번 주..🥱
다음 주부터는 오프라인 강의가 진행되니까 이전 디자인 씽킹 강의처럼 조금은 즐겁게 할 수 있지 않을까?하는 기대를 해본다...!
1. 이번주 수업에서 좋았던 점은? (Liked)
2. 이번주에 새롭게 배운 점은? (Learned)
3. 배운 것에 관해서 내가 부족했던 부분은? (Lacked)
4. 앞으로 뭘 더 하면 좋을까? (Longed for)
1. 이번주 수업에서 좋았던 점은? (Liked)
✔ 꼼꼼하게 공부한 나 자신
유데미 강의를 빠르게 들을 수도 있었지만 그것보다는 이해하면서 듣는 것이 더 낫겠다는 판단을 해서 꼼꼼하게 들었다. 지금 당장은 강의가 밀린 게 좋진 않지만, 나중에 태블로, 시계열 자료를 다룰 때에는 더 많은 도움이 되지 않을까라는 생각을 했다.
또 그만큼 꼼꼼히 TIL을 작성했으니까 헷갈리는게 있을 때 TIL도 큰 도움이 될 듯하다!
2. 이번주에 새롭게 배운 점은? (Learned)
✔ 파이썬 기본 문법 복습 & 시계열 자료
파이썬에서 Numpy를 제대로 공부한 적이 없어서 잘 몰랐는데 이번에 유데미 강의를 통해서 제대로 공부할 수 있었다.그리고 시계열 데이터를 많이 다뤄보지 않았는데 유데미 강의 덕에 여러가지 많이 배웠다. 시계열과 관련된 statsmodels 라이브러리는 처음 봤는데.. 통계적 지식이 가득해서 정말 어려웠다.ㅠㅠ
3. 배운 것에 관해서 내가 부족했던 부분은? (Lacked)
✔ SQL
SQL을 주로 사용해서 프로젝트를 진행하곤 했지만, 이번 중간 평가에서 SQL 문제를 많이 틀렸다.
데이터베이스에 관련된 지식이 많이 부족했고, 특정 SQL 문법을 명확하게 알지 못해서 쿼리를 정확하게 작성하지 못했다.
이번 중간평가를 통해서 부족한 부분을 깨닫게 되었다. 그래도 다행인 것은 4월부터 SQL 오프라인 강의 + 프로젝트를 진행한다는 점이다. 이를 통해서 SQL 역량을 다시 다지고 성장시키고자 한다!
4. 앞으로 뭘 더 하면 좋을까? (Longed for)
✔ 통계 강의
이번 파이썬 시계열 강의를 들으면서 통계 부분이 많이 어려웠고, 이를 보완해야겠다는 생각이 들었다.
우선, 현재 개별 스터디를 진행하면서 수강하고 있는 통계 강의를 거의 다 들어가는데, 다시 듣고 찬찬히 정리해서 내것으로 만들 예정이다.
✔ 태블로 오프라인 강의
다음주 월요일부터 태블로 오프라인 강의가 시작된다.
직접 강사님께서 오셔서 오프라인으로 강의를 해주시고, 조별로도 태블로를 활용한 팀 활동과 과제를 수행해야 한다.
오프라인 강의이고 팀원들과의 활동도 같이 해서 강사님께, 그리고 팀원들에게 많이 배울 수 있지 않을까하는 기대가 된다. 그만큼 나도 열심히 해서 팀원들에게 도움이 되도록 노력해볼 예정이다!.😎
5주차 교육 내용 - 23.03.06 ~ 23.03.10
📌 태블로 고급 강의
1)계산된 필드 vs 테이블 계산
- 계산된 필드 : 집계 전에 수행되며 데이터 집합 수준에서 수행된다.
계산된 필드는 데이터 집합을 분석하는 열로 포함하려는 새 측정값, 또는 새 차원으로 만들고자 할 때 사용한다.
- 테이블 계산 : 집계 후에 수행되며 태블로 자체에서 계산이 된다.
✅ 함수를 활용하여 나만의 테이블 계산을 만들어서 이를 그래프에 적용해볼 수 있다.
- 이동평균 함수 (현재 행보다 왼쪽, 오른쪽에 있는 n개의 막대들의 평균) : Window_avg
WINDOW_AVG(sum([Tones]), -7, 0)
window는 작업하려는 행의 일부와 간격을 의미한다.
현재 막대에서 n개의 막대들의 이동 평균을 나타내줌 (빨간색 박스처리)
아래의 그래프에서는 총 8개의 막대들의 평균이 나타나있다.
이렇게 기간을 설정하여 이동 평균을 계산하게 되면, 7일간의 데이터가 없는 경우에는 계산적 오류가 발생하게 된다.
그렇기 때문에 이를 방지하기 위해서 조건을 추가할 수 있다.
✅ 데이터가 충분하지 않으면 이동 평균을 계산하지 않는다는 조건 추가하기
# 막대(데이터)의 갯수가 8이면 막대의 평균을 반환하고 그렇지 않으면 0을 반환한다.
IF (WINDOW_COUNT([Idle Capacity Percent Pos], -7, 0) = 8)
THEN WINDOW_AVG([Idle Capacity Percent Pos], -7, 0)
ELSE NULL
END
그래프가 변경된 것을 확인할 수 있다.
2) 데이터 예측하기
태블로에서도 시계열 데이터는 이후의 데이터를 예측할 수 있다.
→ 분석 > 모델 - 예측 드래그
예측에 대한 옵션을 변경할 수 있다.
→ 우클릭 > 예측 > 예측 옵션
옵션을 변경하면 3년치의 데이터가 예측되어 나타난다.
3) 애니메이션
시간이 지남에 따라 데이터가 어떻게 변하는지를 보여주는 기능이다.
여러가지 기능이 있으며, 흔적을 남길 수 있으며 다른 데이터끼리 비교도 할 수 있다.
✅ 원하는 데이터끼리 비교하기
→ 마크를 수동으로 설정 > 데이터 선택 > 우클릭 > 페이지 기록 - 항상 표시
✅ 특정 지역 전체 데이터 확인하기
→ 마크를 하이라이트로 설정 > Region에서 원하는 지역 클릭
4) 세부 계산 수준
- 세부 계산 수준의 방법 : ① 포함하기 / ② 제외하기 / ③ 고정하기
① 포함하기
INCLUDE 매개변수 만들기 → {INCLUDE 포함하고자 하는 것 : 하고자 하는 계산}
# LOD INCLUDE City Profit
{INCLUDE [City] : SUM([Profit])}
② 제외하기
EXCLUDE 매개변수 만들기 → {EXCLUDE 포함하고자 하는 것 : 하고자 하는 계산}
# LOD EXCLUDE City Profit
{EXCLUDE [City] : SUM([Profit])}
③ 고정하기
FIXED 매개변수 만들기 → {FIXED 포함하고자 하는 것 : 하고자 하는 계산}
# LOD FIXED City Profit
{FIXED [Country], [State], [City] : SUM([Profit])}
5) 고정 매핑 기술
주어진 x, y의 위치를 활용하여 다각형을 그릴 수 있다.
→ 마크 > 다각형
→ 경로 > Path Order 추가
이를 활용하여 도면에 다각형을 그려 도면에 있는 각 위치의 현황을 한 눈에 파악할 수 있다.
① 열과 행에 X, Y 설정
② 세부 정보에 Room 드래그 > 마크 - 다각형으로 설정 > 경로에 Path 드래그
③ 색상에 Room 드래그하여 회의실 별 색상 다르게 설정
④ 필터로 Floor 설정하여 1층, 2층 별 배경 지도 만들기
⑤ 배경 지도에 이미지 삽입하기
→ 맵 > 배경 이미지 > 데이터 이름
⑥ 회의실 별 예약 현황 시각화
→ 예약 현황 필드를 색상으로 드래그
📌 파이썬 기본 문법
1) Numpy
✅ 브로드캐스팅 (Broadcasting)
파이썬 리스트와 다르게 함수와의 연산을 브로드캐스트 할 수 있다.
슬라이스를 기반으로 변수 재할당에 브로드캐스팅을 수행하면 기존 배열에 적용된다
arr = np.arange(0,11)
arr
[out] array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
slice_of_arr = arr[0:6]
slice_of_arr[:]=99
slice_of_arr
[out] array([99, 99, 99, 99, 99, 99])
# 기존 배열에 영향 받음
arr
[out] array([99, 99, 99, 99, 99, 99, 6, 7, 8, 9, 10])
그렇기 때문에 기존 배열에 영향을 받지 않도록 하려면 복사본을 만들어야 한다.
arr_copy = arr.copy()
arr_copy[:] = 1000
arr_copy
[out] array([1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000])
# 기존 배열에 영향을 받지 않는다.
arr
[out] array([99, 99, 99, 99, 99, 99, 6, 7, 8, 9, 10])
✅ 산술 계산
array끼리 곱하기, 더하기 등 다양한 산술 계산을 할 수 있다.
Numpy는 0이나 무한대로 나누는 연산을 수행할 때 error를 발생하는 것이 아닌, 경고를 표시하며 값은 출력된다.
arr = np.arange(0,10)
arr
[out] array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 1. 0을 0으로 나누었을 때, nan 값이 출력이 됨 (+ 경고 메시지 출력)
arr/arr
[out]
<ipython-input-5-4a148932dd5e>:5: RuntimeWarning: invalid value encountered in true_divide
arr/arr
array([nan, 1., 1., 1., 1., 1., 1., 1., 1., 1.])
# 2. # 0이 아닌 값을 0으로 나누면 inf로 출력이 됨 (+ 경고 메시지 출력)
1/arr
[out]
<ipython-input-6-2ee210defa4b>:3: RuntimeWarning: divide by zero encountered in true_divide
1/arr
array([ inf, 1. , 0.5 , 0.33333333, 0.25 ,
0.2 , 0.16666667, 0.14285714, 0.125 , 0.11111111])
2) Datetime Index
✅ Numpy Datetime Array
- numpy의 데이터 유형 : datetime64
- Python에 내장된 datetime 객체와는 구별된다.
- 3개의 날짜 형태의 문자열을 입력한 후, dtype='datetime64' 추가하면 datetime 형식으로 지정된다.
- 'datetime64[D]' : D는 day(일)을 나타낸다.
→ 이를 통해 기본적으로 numpy가 일 수준의 날짜 정밀도를 적용했음을 알 수 있다.
- 만약, 다른 수준의 날짜 정밀도를 적용하려면 [h], [Y]를 같이 입력하면 된다.
np.array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64')
# [out] array(['2016-03-15', '2017-05-24', '2018-08-09'], dtype='datetime64[D]')
✅ Pandas Datetime Index
Pandas는 datetime 객체에 대해 유연성이 있음
datetime 객체를 위한 내장 유틸리티가 많이 있음
💡 DatetimeIndex
- Pandas에는 datetime을 위한 인덱스가 존재함
- 시계열 자료를 생성하려면 인덱스를 DatetimeIndex 자료형으로 만들어야 함
- 특정한 순간에 기록된 타임스탬프(timestamp) 형식의 시계열 자료를 다루기 위한 인덱스
→ 참고 포스팅
Pandas는 문자열 코드를 유추하는데 뛰어남 → 다양한 datetime 형식을 사용해도 됨
그러나 Pandas는 날짜를 미국 스타일의 날짜 형식으로 유추함
pd.to_datetime(['2/1/2018','3/1/2018'])
[out] DatetimeIndex(['2018-02-01', '2018-03-01'], dtype='datetime64[ns]', freq=None)
유럽 스타일의 날짜 형식으로 변환하고 싶으면 직접 형식을 지정해주면 된다. → format =
pd.to_datetime(['2/1/2018','3/1/2018'], format = '%d/%m/%Y')
[out] DatetimeIndex(['2018-01-02', '2018-01-03'], dtype='datetime64[ns]', freq=None)
📌 Statsmodels를 이용한 시계열 자료 분석
1) statsmodels 라이브러리
시계열 예측을 하는데 사용하는 주 라이브러리로
다양한 통계 모형의 추정과 통계 검정, 통계적 데이터 탐색 등을 다루는 클래스와 함수를 제공하는 파이썬 모듈이다.
✅ 시계열 데이터
- 추세 : 시계열 데이터는 경향성이 있는 경우가 있다.
- 계절성 : 반복적 추세 (잘 알려진 주기이며 매년 반복된다)
- 순환적 요소 : 반복성이 없는 요소
✅ 호드릭-프레스콧 필터
✔ tsa : 시계열 분석 모듈
✔ hp_filter : 호드릭-프레스콧 필터
from statsmodels.tsa.filters.hp_filter import hpfilter
순환요소, 추세요소 2개의 데이터를 반환하기 때문에 반환값인 튜플을 언패킹한다.
gdp_cycle, gdp_trend = hpfilter(df['realgdp'], lamb=1600)
추세요소를 trend 컬럼으로 추가하고 추세요소와 실제 추세값을 시각화해보자.
df[['trend','realgdp']].plot(figsize=(12,8)).autoscale(axis='x',tight=True);
2) ETS 모델 (Error/Trend/Seasonality Models)
✅ ETS 모델
오차(E), 추세(T), 계절성(S)의 줄임말로 지수평활법과 ETS 분해, 추세 모형과 같이 다양한 모델들을 포함하는 일반적 표현이다.
오차(E), 추세(T), 계절성(S) 세 요소를 더하거나 곱하거나 일부를 사용하지 않고 데이터를 평활화한다.
모델에 따라 주요 요소에 기반하여 데이터에 맞는 일반화 모형을 만들 수 있다.
✅ ETS 모델의 종류
덧셈 모델 : 추세가 선형에 더 가깝고 계절성이 거의 일정해보일 때 적용
곱셈 모델 : 지수적 증감하는 경우와 같이 비선형적으로 증가 혹은 감소하는 경우에 적용
statsmodels의 ETS 분해를 실행하면 datetime을 x축으로 그려진 4개의 플롯들을 리턴한다.
- 첫번째 : 전체 그래프
- 두번째 : 추세 그래프 → 데이터의 전반적인 상승세 또는 하강세를 보여줌 (추세가 지수형인지 선형인지 확인 가능)
- 세번째 : 계절성 그래프 → 추세 요소를 제거한 계절성 요소
- 네번째 : 잔차(오차)항 그래프 → 추세, 계절성으로 설명되지 않는 잔차, 오차가 잔차항에 표시 (잡음)
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(airline['Thousands of Passengers'], model='multiplicative')
result.plot();
3) EWMA (지수 가중 이동 평균)
✅ SMA (단순 이동 평균)
# 6개월 이동 평균 컬럼
airline['6-month-SMA'] = airline['Thousands of Passengers'].rolling(window=6).mean()
# 12개월 이동 평균 컬럼
airline['12-month-SMA'] = airline['Thousands of Passengers'].rolling(window=12).mean()
airline.plot(figsize = (10, 8));
✅ EWMA (지수 가중 이동 평균)
가장 최근의 값에 적용되는 가중치는 매개변수에 의해 결정되며 이동 평균 기간에 따라서도 변화한다.
ewm 메소드 : 지수 가중 함수들을 제공함
✔ span : 기간 설정 / 12개월(1년)
airline['EWMA12'] = airline['Thousands of Passengers'].ewm(span=12,adjust=False).mean()
시작 부분과 끝 부분이 조금 다르게 보인다.
계절성 추세가 끝부분으로 갈수록 더 잘 보인다. → 오래된 자료보다 최신의 자료에 더 큰 가중치를 두었기 때문
SMA와 EWMA를 비교해보면 EWMA가 좀 더 실제 추세선과 비슷한 것을 확인할 수 있다.
airline[['Thousands of Passengers','EWMA12','12-month-SMA']].plot(figsize=(12,8)).autoscale(axis='x',tight=True);
4) Holt-Winters Methods (홀트-윈터스 계절성 기법)
- 예측식에 더해 3개의 평활식으로 구성되어 있음
→ 수준 : l_t, 추세 요소 : b_t, 계절성 요소 : s_t
→ 각각에 대응하는 평활 매개변수 : α, β, γ
- 계절성 요소를 다루기 위한 방법
→ 덧셈 기법 : 계절성 요소가 전체 데이터에서 일정한 폭으로 나타날 때 사용
→ 곱셈 기법 : 계절적 변동폭이 데이터의 수준에 비례해 나타날 때 사용
✅ 지수 가중 이동 평균
- ewm() 메소드 vs SimpleExpSmoothing 메소드
→ ewm() 메소드를 활용한 지수 가중 이동 평균과 SimpleExpSmoothing 메소드를 이용해 데이터에 맞는 모형을 피팅한 값이 동일한지 확인하고자 한다.
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
# span, alpha 값 설정
span = 12
alpha = 2/(span+1)
# ewm() 메소드
df['EWMA12'] = df['Thousands of Passengers'].ewm(alpha=alpha,adjust=False).mean()
# SimpleExpSmoothing 메소드
df['SES12']=SimpleExpSmoothing(df['Thousands of Passengers']).fit(smoothing_level=alpha,optimized=False).fittedvalues.shift(-1)
df.head()
▶ SimpleExpSmoothing의 결과가 지수 가중 이동 평균의 값과 동일하다는 점을 확인할 수 있다.
✅ 이중 지수 평활법 (홀트 기법)
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# 덧셈 모형 사용
df['DESadd12'] = ExponentialSmoothing(df['Thousands of Passengers'], trend='add').fit().fittedvalues.shift(-1)
# 곱셈 모형 사용
df['DESmul12'] = ExponentialSmoothing(df['Thousands of Passengers'], trend='mul').fit().fittedvalues.shift(-1)
df.head()
▶ 곱셈 모형이 실제 데이터에 더 가깝게 예측하고 있다 → 곱셈 모형을 사용해야 함
✅ 삼중 지수 평활법 (홀트-윈터스 계절성 기법)
계절성을 표현하는 새로운 평활 매개변수인 감마가 추가된다.
계절성 요소를 나타내는 c_t라는 새로운 요소가 추가되고 감마로 표현된다.
예측 모형에 L은 주기 당 데이터 포인트의 수이다.
# 추세 : 덧셈 모형 → trend='add'
# 계절성 : 덧셈 모형 → seasonal='add'
df['TESadd12'] = ExponentialSmoothing(df['Thousands of Passengers'],trend='add',seasonal='add',seasonal_periods=12).fit().fittedvalues
# 추세 : 곱셈 모형 → trend='mul'
# 계절성 : 곱셈 모형 → seasonal='mul'
df['TESmul12'] = ExponentialSmoothing(df['Thousands of Passengers'],trend='mul',seasonal='mul',seasonal_periods=12).fit().fittedvalues
df.head()
이중 vs 삼중 지수 평활법을 비교해보았다.
df[['Thousands of Passengers','DESmul12','TESmul12']].iloc[:24].plot(figsize=(12,6));
▶ 삼중 지수 평활법에 의한 예측이 실제 데이터에 더 가깝다.
📌 중간 평가 (SQL)
중간 평가 SQL 문제 중에 기억나는 틀린 문제들에 대한 개념을 다시 복기하고자 한다.
1) LIMIT
- LIMIT는 출력하는 개수를 제한함
- 형식 : LIMIT 시작, 개수 = LIMIT 개수 OFFSET 시작
- LIMIT는 첫 데이터를 0번으로 설정하여 시작함
평균 키(height)가 4~5번째로 큰 회원 추출하기 (출처 : 혼공SQL)
select mem_name, height from member
order by height desc
limit 3, 2; -- 3번째부터 2건 조회
2) 테이블 복사
필드의 타입과 숫자가 동일한 두 테이블의 데이터를 복사하기
✅ 복사한 데이터를 넣을 테이블이 존재하지 않는 경우 → 테이블 생성 + 테이블 복사
CREATE TABLE [생성 테이블] SELECT * FROM [원본 테이블]
# 기본 모드 데이터까지 복사
SELECT * INTO [생성 테이블] FROM [원본 테이블명]
# 데이터 없이 테이블의 구조만 복사
SELECT * INTO [생성 테이블] FROM [원본 테이블명] WHERE '1' = '2'
# 데이터까지 복사하기
SELECT * INTO [생성 테이블] FROM [원본 테이블명] WHERE '1' = '1'
✅ 복사한 데이터를 넣을 테이블이 존재하는 경우 → 테이블 복사
INSERT INTO [생성 테이블] SELECT * FROM [원본 테이블]
✅ 다른 DB 간의 테이블 복사
INSERT INTO [복사 데이터베이스].[복사 테이블]
SELECT * FROM [원본 데이터베이스].[원본 테이블]
🔎 참고 포스팅
[MS SQL] 테이블 복사 (다른 DB간 복사포함)
필드의 타입과, 필드의 숫자가 동일한 두 테이블간의 데이터를 복사하는방법 입니다. 복사한 데이터를 넣을 테이블이 존재하지 않을 경우 (테이블 생성 + 테이블 복사) □ Create Table [대상 테이블
overit.tistory.com
시각화 업로드한 Tableau Public
송아람 - Profile | Tableau Public
송아람's Tableau Public profile. View interactive data visualizations published by this author.
public.tableau.com
이번주에 작성한 TIL
[스타터스 TIL] 20일차.Tableau 고수되기 (1) -그룹, 집합, 테이블 계산, 데이터 소스 필터
[스타터스 TIL] 21일차.Tableau 고수되기 (2) - 애니메이션, 세부 수준 계산 (LOD), 고급 매핑 기술
[스타터스 TIL] 22일차.시계열 데이터 분석 with 파이썬 (1) - Numpy, Pandas, Pandas 기반 시각화
[스타터스 TIL] 23일차.시계열 데이터 분석 with 파이썬 (2) - Pandas를 사용한 시계열, Statsmodels 활용 시계열 분석
[스타터스 TIL] 24일차.시계열 데이터 분석 with 파이썬 (3) - 일반 예측 모델
* 유데미 큐레이션 바로가기 : https://bit.ly/3HRWeVL
* STARTERS 취업 부트캠프 공식 블로그 : https://blog.naver.com/udemy-wjtb
본 후기는 유데미-웅진씽크빅 취업 부트캠프 4기 데이터분석/시각화 학습 일지 리뷰로 작성되었습니다.
'웅진X유데미 STARTERS > 주간 학습일지' 카테고리의 다른 글
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 7주차 학습 일지 (0) | 2023.03.26 |
---|---|
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 6주차 학습 일지 (0) | 2023.03.19 |
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 4주차 학습 일지 (1) | 2023.03.05 |
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 3주차 학습 일지 (0) | 2023.02.26 |
[유데미 스타터스 취업 부트캠프 4기] 데이터분석/시각화(태블로) - 2주차 학습 일지 (0) | 2023.02.19 |