이틀 전 부터 따릉이 수요예측 프로젝트를 시작했습니다. 깜빡하고 당일에 업로드를 하지 않아서 지금 몰아서 적성하게 되었습니다.
일단 간단하게 EDA는 진행했고 전처리 과정을 진행 중입니다. 그런데 몇 시간 동안 매달려 해결 되지 않은 문제가 있어서 정체 되었습니다
본 데이터는 위와 같이 되어 있습니다. 결측치가 많습니다. 일괄적으로 bfill을 사용하려고 했으나 hour가 뒤죽박죽이라서 적용하지 못했습니다. 각 시간대 별 평균 값을 넣어 볼려고 아래처럼 시도를 했습니다.
위 코드를 실행해도 결측치가 그대로여서 이것저것 실험해 본 결과, fillna 같은 경우는 위 처럼 train[train 블라블라] 와 같은 필터? 조회형식으로는 채워지지 않는다는 걸 알게 되었습니다. train.fillna() 혹은 train['column'].fillna() 형식으로 해야 적용이 되더라구요. 그래서 현재는 결측치를 어떻게 하면 될까 고민 중에 있습니다.
3번의 iteration 학습 과정을 보려 봤을 때, 각 cost function에 projection 방향으로 다가가고 있다. interation 돌릴 때마다 cost function이 달라진다는 점 헷갈리지 말아야 한다.
계속 interation 학습과정을 보면 가장 왼쪽의 cost function의 기울기가 급하게 그러져 있다. 즉, 입력 데이터의 크기가 크다는 점을 뜻하게 되고, X 값이 크면 Gradient도 크게 계산되기 때문에 껑충 뛰는 모습을 볼 수 있다. 반대로 가운데 그림의 기울기는 x축과 평행할수록 x의 값이 작아지며 또한 학습 속도가 느리게 된다는 걸 저번 시간에 배웠었다. 따라서 가운데 그림의 학습 속도가 갑자기 느려졌음을 알 수 있다.
빨간색 크로스 되는 지점이 본래의 Opimal point이다. 노이즈가 있기 때문에 빨간색 교차점과 다소 떨어진 곳에 Opimal point가 생긴 것이다. 가장 오른쪽 그림을 보면 빨간색 교차점에 도달했을 때 학습을 멈췄어야 했지만 노이즈가 포함된 optimal point 때문에 아래 방향으로 학습된 걸 볼 수 있다. 만일 노이즈가 더 컸더라면 교차점과의 거리가 더 멀어지기 때문에 결국 학습이 되지 않는다.
batch size 2일 때보다는 전체적으로 안정적인 모습을 가지고 있다. batch size가 커지면서 평균적인 위치를 나타내기 때문에 상대적으로 안정적이다.
32로 설정 시, 위처럼 거의 동글동글한 모양을 취한다. 또한 noise의 효과도 거의 사라졌기 때문에 교차점과 optimal point의 위치가 비슷하게 위치해 있다. 하지만 실제 딥러닝에서 32를 적용하기란 문제가 있다. '복잡한 함수'를 만들지 못하게 된다. 동글동글하게 만들어지는 함수를 추구하기 때문에 적당히 batch size를 줄여 줘야 data sample들에 맞는 gradient를 반영할 수 있다.
noise 효과가 거의 없다시피 학습이 이뤄지고 있는데 실제 딥러닝에서는 noise가 오버 핏팅을 방지 역할을 하기 때문에 noise가 아~주 없는 것도 문제가 될 수 있다.
2. for one sample-Theory
노드들을 활용하여 이론을 정리하는 시간을 가져본다. 하나의 sample에 대해서 진행하기 때문에 cost가 아니라 loss의 forward, backward이다..
bias term을 추가하면 위처럼 표현할 수 있겠다. back propagation은 어떻게 되는지 아래 그림을 통해 알아본다.
bias인 theta0도 학습 대상이기 때문에 BP를 해줘야 한다. Z1과 theta0에 대한 미분 값이 각각 1씩 나왔으므로 위 식처럼 계산이 된다.
실제 숫자를 넣어서 어떻게 적용되는지 알아보자.
노이즈가 없는 dataset y=x+1이 있다고 가정했을 때, 초기값은 각각 0.1로 설정한다. 그럴 때의 Gradient가 그림처럼 표현이 가능한데, 이 gradient의 특징이 data에 따라서 어떻게 변화하는지 확인해 본다.
(1,2)을 넣었을 때 theta0,1의 값이 같고 norm이 5.09이다. x=1이라는 것 theta 0,1이 같은 비율로 학습이 된다는 의미이다. 또한 -3.6 값이 둘 다 값으므로 y=x 방향과 평행하다는 것이다(y=-x와도 평행할 수도 있다) 학습이 균등하게 갈 수 있는 이유가 이 때문이다.
(2,3) 일 경우엔 theta1의 편미분 값이 크게 증가함에 따라 norm길이도 5.09에 비해서 크게 증가했다. 즉 벡터의 길이가 길어졌다는 뜻이며 이는 곧 크게 학습이 되었다는 것과 연결된다.
x가 더욱 증가함에 따라 norm도 증가를 하게 되고, theta1에 지배적인 학습이 이뤄지므로 theta0은 천천히 학습하게 된다.
반대로 X에 1보다 작은 값들을 넣게 되면 어떻게 변하는지 한 번에 보도록 한다.
X값이 점점 줄어들수록 norm길이도 줄어들게 된다.
정리를 하게 되면 X가 1보다 크면 클수록 norm의 길이도 커지기 때문에 지그재그로 학습될 가능성이 크다. 이렇게 되면 norm길이가 커서 학습도 무조건 빨리된다는 보장이 없는 것이다. 지그재그로 이동하기 때문에 학습이 더욱 느려질 수 있다.
반대로, 1보다 작으면 지그재그로 이동하는 건 없지만 norm길이가 짧기 때문에 학습이 굼벵이처럼 느리게 진행된다.
그래서 x=1일 때, 즉 y=x or y=-x 대칭일 때 어느 한쪽으로 쏠리지 않고 공평하게 학습이 이뤄진다(학습되는 비율이 같으므로)
3. for one sample Implementation
앞서 배운 one sample Theory를 직접 코드를 통해 구현해 보는 시간을 갖도록 한다.
실습을 위해서 y=5x+2의 dataset을 생성해 준다.
각 과정에 맞는 노드를 정의해준다.
파라미터를 설정한 후 그간의 실습에서 했던 내용과 동일하게 forward, backward를 진행한다. dth1은 x라는 term이 추가로 붙는다는 사실을 잊지 말아야 한다.
y=5x+2에서 만들어진 데이터를 가지고 th1, th0을 학습한 그래프이다. th1, th0가 각각 5와 2에 잘 수렴되고 있다. 학습 시 이용된 데이터는 평균이 아닌 각각의 데이터를 이용했으므로 loss가 위 그림처럼 파동이 생기면서 학습이 진행된다. 설명을 추가하자면, 큰 데이터가 뽑히면 큰 loss가 생기고 작은 데이터로 학습하면 작은 loss가 생기기 때문에 loss 그래프가 커졌다 작아졌다 반복하면서 학습된다.
이번엔 다양한 input data가 들어왔을 때 어떻게 학습이 되는지 그래프를 통해 알아본다.
가장 이상적인 상태인 standard normal 분포를 가지고 학습을 시킬 때 모습이다. 즉, th1, th0가 "공평하게" 학습이 진행된다.
평균인 높아지면 x값이 증가한다는 뜻이다. 이는 즉 학습 시 th1에 지배적으로 학습이 된다는 것이다. 지난 포스팅에서 x값이 커질수록 loss function이 아래처럼 수직에 가까워진다. 그래서 th1이 th0보다 더 빨리 학습이 진행된다.
x의 값이 더 높아지면 th1에 대해서 더욱 지배적인 학습이 이뤄진다. 반면 th0은 아주 천천히 학습이 된다.
반면 x값이 1보다 작은 값일 땐, th0이 th1보다 빠른 학습을 보인다. 엄밀히 말하자면 th0 학습 속도가 빨라지는게 아니라 th1 학습속도가 느려지는 것이다. 왜냐하면 th1의 gradient 식에서 -2*x*lr*(y-y^), 즉 x가 곱해지기 때문이다. 소수점을 곱하면 당연히 업데이트 양 또한 줄어들기 마련이다. 그래서 무지개색 그래프를 보면 th0가 먼저 학습되기 때문에 기울기보다는 위아래 위치가 업데이트에 따라 먼저 변하게 되는 것이다.
두개 data sample에 대해서 각각 loss function이 왼쪽과 같이 그러져 있다. 이 두개의 loss function을 평균내서 cost function의 contour plot을 그리면 오른쪽 처럼 동글 동글한 모양을 가지게 된다. 이 contour plot은 theta0,1이 균일하게 학습되므로 가장 이상적인 모습이다. 그래서 우리가 해야 할건 여기서 정해진다. 어떤 데이터 이건 모두 평균내서 최대한 오른쪽 contour plot 처럼 동글동글한 모양을 가지도록 해야 학습에 유리하다는 것이다. 이해를 돕기 위해 다른 data sample의 cost function을 보도록 하자
X 절대값 2의 data sample들이 있을때 loss function은 왼쪽처럼 표현이 가능하고 cost function의 contour plot은 오른쪽처럼 위 아래가 쭉 늘어진 형태를 보인다. 즉, 절대값에 따라서 cost function의 모양이 결정된다.
1보다 작은 x 절대값일 경우엔 위 예시 처럼 양쪽으로 늘어진 형태를 취한다. 이번엔 여러 data sample에 대해서 보도록 해보자.
해당 data sample들은 contour plot이 최대한 동글동글하게 만들도록 해준다. loss function들을 보면 가운데를 기준으로 왼쪽과 오르쪽이 완벽하게 대칭이다. 반대로 대칭 아닐수록 동글동글한 contour plot을 만들지 못한다는 것을 알수 있겠다. 아래 내용들을 통해 좀다 자세히 정리를 해본다.
*동글동글한 contour plot을 만들기 위한 조건 2가지
1. 좌우대칭
각각 3개씩 data sample들을 가지고 있는 loss function들이다. 이 두개의 data sample들은 양수와 음수로 나뉘면서도 x의 절대값이 같다는 특징을 가진다. 이 두개를 평균내서 cost function을 그리면 완벽한 동글한 모양은 아니지만 적어도 왼쪽, 오른쪽을 같게 만들 수가 있다. 그래서 우리가 data set을 만들때 각 feature들이 0을 기준으로 대칭하도록 만들어야 한다.
현실적으로 완벽한 대칭은 만들지 못하지만 최소한 x1 = 2 가 있다면 x2 = -1 정도 있어야 한쪽으로 치우칠 모양이 최대한 동그한 모양으로 만들수 있게 된다.
미니배치 8개를 뽑을때, 그 안에는 양수 4개, 음수 4개 균일하게 있어야 최대한 동글동글한 contour plot을 만들어 낼수 있다.
data sample들을 수집했는데 0을 기준으로 분포가 되어 있지 않다면 억지로 옮길 필요가 있다.(만일 평균 170을 기준으로 분포가 형성되었다면 각각의 loss function은 양수 있을 뿐더러 값이 워낙 크기 때문에 weight만 학습 될것이다. 따라서 0을 기준으로 양수와 음수를 조화롭게 scaling 해줘야 한다.)
정리하면 평균을 0으로 맞춰주는 이유는 동글동글한 contour plot을 만들기 위함이다.
2. 대각을 기준으로 대칭만들기
X절대값이 1보다 클수록 Y축과 평행을 이루려고 한다. 반대로 X 절대값이 0에 가까울수록 X축과 평행을 이루려고 한다.
여기서 관건은 0<X절대값<1 범위에 만족하는 대각선을 기준으로 좌우 대칭을 만드는게 가장 이상적이다.
위 두개의 데이터에 대한 loss function을 합치게되면 두 loss function 가운데에 cost function이 생기지 않는다. 절대값 X가 일단 1보다 크게 되면 1보다 작은 값이 하나만으로는 상쇄시키기 어렵다(왜 상쇄를 해야할까? 위에서 말했듯이 대각선을 기준으로 좌우 대칭을 만들어야 하기 때문이다.) 다시말해서 X = 0.5의 loss function만 가지고는 X= 2의 loss function을 대각선으로 만들지 못한다. 대각선 이라 함은 y= x, or y= -x 이다. 대각선이 양쪽을 으로 대칭적으로 있어야 동글동글한 밥그릇 모양의 cost function을 만들수 있다. 그러면 학습 시 theta들이 골고루 균등하게 학습이 가능해진다.
기존 dataset 은 y= x+1에서 나왔는데 이 두개를 합치니까 x의 기울기가 1보다 커졌다는 얘기다. 절대값 X값이 큰 loss function이 cost function을 만들때 지배적인 영향력을 끼친다.
0.5 -> 0.2로 더 줄여봐도 오른쪽 그림의 기울기가 1보다 크다. 그래서 단순하게 1대1로 대응을 시킬수 없다. 해결법은 간단하다. 한개로 부족하면 여러개를 대응시키면 된다.
1보다 큰 값이 한개가 있고 (1.2)는 거의 영향력이 없다. 결국 0.1 과 0.2 이 두개가 2를 상쇄시키기 위해 달라붙은 것이다. 오른쪽 그림을 보면 완벽하진 않지만 기울기가 1과 가까워 졌음을 알수있다. 정리하면 절대값이 1보다 큰게 하나가 있으면 1보다 작은 X값들이 여러개 있어야 y=-x에 대칭인 것들을 만들수 있다.
동글 동글한 모양을 갖기 위해서는 y=x, y=-x 서로 대칭인 것들이 필요하고, 절대값 x가 1보다 큰 값들은 적어야 하며 반대로 0보다 작은 x값들은 상대적으로 더 많아야한다.
이것들을 따르는 분포가 있는데 이를 정규분포라 한다. 특히 표준정규분포는 완벽한 대칭을 이루면서 절대값 자체가 1보다 큰 값들이 적다. 그렇기때문에 dataset가 표준정규분포를 따르게 된다면 가장 이상적인 동글동글한 모양의 contour plot이 만들어진다.
많은 데이터들이 정규분포를 따른다. 그러면 이 정규분포를 잘 조절 해줘서 표준정규분포로 만들어만 준다면 딥러닝 학습에 유리하게 된다. 정규분포에서 표준 정규분포로 바꾸는 방법은 나중에 뒤에서 배우게 된다.
표준정규분포를 따르는 데이터 16개를 cost function으로 그리게 되면 상당히 동글동글한 모양을 가지고 있다.
이번엔 y=x방향쪽으로 쏠리게 되었는데, 그 이유는 음수 절대값에서 큰수가 나온 것을 loss function을 통해 확실히 알수가 있다. 0보다 낮은 값들과 상쇄해서 오른쪽과 같은 cost function이 만들어 진것이다.
이번엔 반대로 y = -x 방향쪽으로 살짝 지배적인 모습을 보인다. 이렇게 위 예시처럼 완벽한 동글동글한 모습은 아니지만 이러한 작업 자체가 상당히 딥러닝 학습에 큰 효과를 가져와준다.
loss function을 가지고 학습 시키면 지그재그로 이쁘지 않게 학습이 되는데, 이를 cost function으로 바꾸면 대체로 동글동글한 contour plot이므로 theta0,1이 균일하고 부드럽게 학습이 된다.
평균이 0이고 표편이 1인 분포가 있을때 왼쪽처럼 이쁜 밥그릇 모양을 가진다. 하지만 정규분포라고 해서 다 이와 같은 모습을 보이지 않는다.
평균이10이고 표편이 동일하게 1이라고 할지언정 뽑히는 X 값 자체가 10 언저리 이므로 cost function이 왼쪽처럼 만들어 진다. 즉, 정규분포라 할지라도 평균값을 0에 꼭 반드시 맞춰줘야 한다. 그래야지 좌우 대칭이 맞춰지기 떄문이다.(양수 음수 골고루 나오게끔)
그러면 평균이 0이고, 표편을 1보다 작게 만들면 어떻게 될까? 1보다 큰 값이 적어지게 되고 0에 가까운 값들이 너무 많아지게 되므로 기울기가 x축과 평행한 cost function이 만들어 지게 된다. 따라서 어느 한 곳으로 치우치지 않은 y= x, y= -x 즉, 대각선을 취할때가 가장 좋은 균형을 가진다.
2. Feature Scaling
Feature Scaling 식을 통해서 평균은 0, 표준편차는 1로 표준정규분포를 만들수 있다.
*평균은 같고 표편만 다를경우
파란색이 평균이 0, 표편이 10인 본래의 dataset이다. Feature scaling을 해주면 표준편차 10을 나눴기 때문에 초록색으로 변하게 된다. 원래 가지고 있던 dataset과는 다른 dataaset을 가지게 된다.
*평균은 다르고 표편은 같을 경우
Feature Scaling해주면 평균이 0으로 변화했기 때문에 왼쪽 그림처럼 다른 dataset를 갖게 된다.
*평균,표편 모두 다른경우
본래 dataset은 평균이 10이고 표편도 10정도라고 했을때 왼쪽 그림의 파란색처럼 dataa의 분포를 볼수 있겠다. 여기에 Feature scaling을 해주게 되면 표편 10으로 나눴기 때문에 기울기가 달라지고, 평균도 0으로 변경됨에 따라 이동하게 된다. 여기서 유의할 점이 있다. 자세한 내용은 아래를 통해 알아보자.
feature Scaling한 dataset을 가지고 학습을 진행하여 predictor를 생성했다고 하자. 이제 새로운 data을 가지고 predictor를 이용하여 예측값을 구하고자 넣는 행위는 틀렸다고 볼수 있다. 앞서 말했듯이 Feature scaling을 하게 되면 전혀 다른 dataset을 가진다. 즉, 분포가 기존의 data와는 다른 dataset이 만들어 지기 때문에 바로 다이렉트로 넣지 못하고, new data도 FS을 통해 같은 dataset으로 만들어 준 뒤, predictor를 이용해야 한다.
dataset 처음 수집할때 중요한 점이 있다. dataset을 대충, 적당하게 수집해서 FS 적용 후 predictor를 만들게 되면, 이 predictor는 본래 dataset에서 빠졌던 data를 잘 예측하지 못하게 된다. 즉, '너는 dataset에 없었으니까 나는 널 예측 못한다' 로 정리 할수 있겠다. 그래서 dataset을 최대한 많이 확보해야 한다.
평균:0, 표편:10 인 왼쪽 loss function(16개 data)과 오른쪽 FS을 진행 후 loss function이다. 왼쪽보다는 골고루 흩어 졌기 때문에 그나마 원에 가깝게 cost function을 만들수 있을 것이다. 아래 그림을 통해 자세히 보도록 하자.
양쪽의 cost function 모양이 다르다는 걸 확인 할수 있다. 오른쪽은 y=-x방향쪽으로 쏠려 있다. 즉 1보다 큰 절대값x가 지배적이라는 걸 알수 있다. 학습의 유리함을 보자면 당연히 오른쪽 Cost function이 그나마 theta들을 균등하게 학습할 기회를 주게 된다.
시도가 경기도라면 매출값을 출력하고 아니면 null을 출력하는 계산식 필드를 만든다. 같은 원리로 서울 매출 계산식 필드를 생성해 준다.
경기도 매출, 서울특별시 매출을 행 선반에 올린 뒤 누계로 변경한 후 이중축&축 동기화 적용한다.
2019년 12월을 기준으로 증가 한다는 의미를 전달해주기 위해서 x축의 참조선을 선택 후 위 처럼 설정한다.
2 step) 누적매출
경기도 누적 매출 -> 텍스트에 삽입 후 서울 누적 매출은 떠블클릭한다. 서식을 이용하여 위 처럼 모양을 갖춘 뒤 도수 설명은 나오지 않도록 설정한다.
3 step) 대시보드 만들기
누적 매출 추이, 누적 매출을 넣은 뒤 위 처럼 정리만 간단하게 하면 완성된다.
1-2)영역 차트
*완성본 미리보기(1)
*완성본 미리보기(2)
1 step)
시도를 필터 적용하여 서울과 경기도만 체크한다.
마크를 영역으로 표시한뒤, 시도를 색상마크에 넣어주면 위처럼 표현이 가능하다. 경기도 VS 서울의 매출을 누계 형식으로 겹쳐서 표현했는데, 경기 따로 서울 따로 매출을 표시하고 싶다면 2 step 과정을 참고하면 되겠다.
2 step) 경기도 평균 분기별 매출
행,열 선반을 설정 뒤, 분석패널에서 평균라인을 적용해준다.
3 step) 서울특별시 평균 분기별 매출
서울매출을 행 선반에 넣어 준 뒤 색상은 오렌지로 설정한다.
4 step) 경기도 평균 분기별 매출(2) ->평균 매출액 텍스트만 출력
위 워크시트에서 계산식 필드를 사용하여 경기도 평균 금액을 구한다.
열 선반에 있던 연속혀 분기를 ctrl잡고 드래그 하면 아래와 같이 자동으로 수식이 생긴다.
자동으로 생긴 수식에 : sum([경기도 매출]) 을 입력한 후 맨 앞에 AVG을 붙이면 평균 금액을 알수있게 된다.
계산식이 만들어 졌으면 열 선반의 분기는 버리고 방금 만든 계산식 필드를 텍스트에 넣는다
경기도 분기별 평균 매출이 출력된다. 텍스트 크기 및 레이블 편집을 통해서 정리를 해준다.
이 과정을 서울특별시에도 똑같이 적용한다.
5 step) 서울특별시 분기별 평균 매출(평균 매출액 텍스트만 출력)
경기도 분기별 평균 매출과 같은 과정으로 만들어 준다.
6 step) 대시보드 만들기
각 분기별 배출 그래프를 넣은 뒤 좌측 하단의 부동을 클릭한다.
경기도 평균 분기별 매출 과 서울특별시 평균 분기별 매출을 그래프위에 올려준 뒤 알맞게 크기 변경해준다.
1-3) 막대차트
*완성본 미리보기
1 step) 서울특별시 분기별 매출
평균이상, 이하에 따른 색상 구분을 하도록 아래 계산식 필드를 만들도록 한다.
계산된 필드를 색상 마크에 넣은 후 평균라인을 적용하면 쉽게 구분 할수 있다. 막대들이 서로 붙어 있는 이유는 '분기'가 연속형이기 때문에 불연속형으로 변경하면 떨어뜨릴수 있다.
분기를 불연속형으로 변경시 위 처럼 변경 가능하다.
2 step) 고객 세그먼트별 누적 매출
마크의 고객 세그먼트 -> 정렬 클릭 후 위 내용처럼 변경한다. 매출 합계 기준으로 오름차순 설정 후 닫아 준다.
y축을 구성 비율로 변경해서 다르게 표현할수도 있다. 아래를 참고해 보자
매출의 합계에 대한 구성 비율로 변경이 가능하다.
2. 주제에 적합한 시각화 방법(2)-순위 기반 비교
2-1) 막대차트
*완성본 미리보기
MTD VS PMTD 두 개를 비교해 보고, 특정 날짜를 기준으로 색상도 표현해 본다.
1 step) MTD,PMTD 만들기
현재 값은 2021-06-30일로 설정하고 나머지도 이미지 처럼 맞춰준다. 매개변수 표시 클릭 후 표현방식을 '입력'으로 변경한다.
MTD 계산식 필드를 만들어 본다.
p.날짜가 2021-06-30이라면, MTD은 같은 달이면서 30일 이전 날짜들을 모두 보여준다. 즉 6월1일 ~30일까지를 보여주는 계산식이다. 이를 필터에 넣는다.
저번 시간에 배웠던 것 처럼 필터를 사용하면 속도가 느려질수 있기 때문에 되도록이면 필터는 지양하는 편이 좋다. 따라서 아래 이미지처럼 계산식 필드를 만들면 필터가 필요 없어진다
c.MTD를 마크의 합계(수익)와 교체한다.
PMTD 계산식 필드를 만들어 본다.
MTD가 당월에 대한 수익이였다면 PMTD는 전월에 대한 수익이다.
2 step) MTD & PMTD를 활용한 완성본 만들기
이제 MTD & PMTD을 이용하여 새 워크시트에 본격적으로 그래프를 그려보자.
위 처럼 설정을 하면 그래프가 나타난다. 여기서 순위를 넣고 싶다면 계산식 필드를 이용하면 된다.
연속형 -> 불 연속형으로 변경후 레이블 마크에 넣으면 순위를 볼수 있게 된다. 더 나아가서 순위에 단위를 계산식을 통해 적용해 보자.
해당 접미사 계산식을 레이블에 넣어준다.
머리글 표시 해제와 레이블 위치 조정을 하면 아래와 같이 깔끔하게 만들수 있다.
이제 여기에 PMTD(전월)을 넣어서 비교하도록 만든다.
PMTD를 열 선반에 넣은 후 마크의 합계(c.PMTD)에서 모든 값을 빼주고 간트차트로 변경한다.
PMCD를 이중축으로 합치면 MTD가 원으로 변경 되는데, 이럴땐 다시 막대로 변경해준다.
축 동기화를 해준다. 이로써 전월 대비 당월에 얼만큼 수익이 증감했는지 한눈에 알수 있다.
2-2) 라인차트
*완성본 미리보기
1 step) 제품 중분류별 넘버
기본 셋팅으로 행,열 선반과 측정값을 위 내용처럼 넣는다. 단 할인율은 평균 집계로 설정한다. 그리고 제품 중분류에서 수익기준으로 정렬을 하게 되면 위와 같아진다.
2 step) 연간 수익기준 순위
행 선반의 합계 수익을 순위로 변경 하고 '다음을 사용하여 계산' -> '제품 중분류' 를 클릭한다. 그러면 제품 중분류별 순위가 매겨진다.
눈금의 반전을 선택해서 1위가 맨위로 오게끔 한다.
합계(수익)(2)의 순위도 반전을 시킨다.
합계(수익)(2)의 레이블에 합계(수익)을 넣으면 순위가 표시된다. 레이블의 세로 -> 가운데 정렬을 누르면 위 처럼 원 가운데 순위가 표시된다.
3 step) 대시보드 만들기
크기는 자동으로 설정하고 전체보기로 크기를 조정한다. 제품 중분류에 마우스 오바 했을때 순위가 나타나는 하이라이팅을 적용한다.
필요한 모든 설정을 완료 후 확인을 클릭한다.
2-3) 텍스트
*완성본 미리보기
매출을 기준으로 시군구별 순위를 매긴다.
1 step)
시도필터는 서울만 체크 하고 매출과 시군구는 위 처럼 설정해준다.
순위를 매기기위한 계산식 필드를 만들어준다. -> 불연속형으로 따로 설정해준다.
순위를 나타낼때 '01위' 형식으로 표현하기 위해서 그림처럼 설정해준다.
3. 데이터 시각화를 더 돋보이게 만드는 요소(1)
3-1) 색상
*완성본 미리보기
1 step) 2020년 수익대비 워크시트 생성하기
2020년 수익과 2021년 수익을 기준으로 색상을 비교해보자.
하나의 덩어리로 만들기 위해서 집계방식을 sum으로 설정한다 2021년 수익 계산식 필드도 위 처럼 만들어 준다.
2020수익 대비를 만들어 준 뒤, 백분율 소수점 첫째자리까지 설정해준다.
2020년 수익 대비을 행 과 색상에 넣어주면 된다.
2 step) 월별 수익 비교
가운데 값 0을 기준으로 +,-성장 두가지로 색상을 입힐수 있다. 레이블에 2020수익 대비를 넣으면 전년도와 얼마나 차이가 났는지 볼수 있다. 위 데이터를 이용하여 계절별 수익비교를 만들어 보자.
3 step) 계절 수익 비교
Datepart는 불연속형태로써 날짜 -> 정수로 변경해주는 함수이다.
계절을 열 선반에 넣으면 계절별로 수익 비교 수치가 나온다. 가을 부터 나오기 때문에 이를 수정하기 위해서는 기본 속성의 정렬을 활용한다.
정렬기준을 수동을 하고 봄,여름,가을,겨울로 수정해준다.
4 step) 지역 수익 비교
열 선반에 지역을 넣는다.
5 step) 시도 수익 비교
지역뒤에 시도를 넣는다.
6 step) 대시보드 생성
세로개체를 넣은 뒤, 만들어 놨던 워크시트 네개를 차례대로 넣는다. 전체보기를 통해 간격 동일하게 설정시킨다.
3-2) 모양
*완성본 미리보기
1 step)
아이콘을 만들기 위해서 먼저 위 계산식을 만든다.
마크를 모양으로 변경 하면 강원도만 다른 모양을 가진다.
적용할 모양을 다운 받아서 위 경로에 저장해준다.
sad-울고 있는 모양 차례대로 선택 후 모양 할당을 눌러준다. 스마일도 같은 과정을 반복 한 후 확인을 눌러준다
2020 수익 대비_Icon을 색상마크에 넣으면 위 처럼 표현이 가능해 진다.
+2021-08-30 학습내용 추가합니다.
4. 데이터 시각화를 더 돋보이게 만드는 요소(2)
4-1) 맵에 다중 마크 계층지원
*완성본 미리보기
지도에 대한 파이, 시도에 대한 파이, 전체종합에 대한 파이 이렇게 세가지로 구성되어 있다. 좌측 상단 페이지 란에 분기가 있다. 이렇게 되면 분기별에 따른 차트를 변경하면서 볼수 있다. 변경하는 곳은 가장에 위치한 분기(주문 일자)의 화살표를 클릭하면 된다.
맵에서 표현할수 있도록 기준점을 임의로 계산식을 이용하여 만들어 준다. 맵 형태로 표현 할수 있는 함수인 makepoint(위도,경도)를 사용해 준다. 임의로 0,0 위도경도를 위처럼 넣어준다. 만들어진 계산식을 보면 데이터 유형이 지구본 모형 즉, 맵 형태로 만들어 졌음을 알수있다.
이를 떠블클릭하면 0,0인 아프리카 해안쪽을 가리키게 된다. 마크 상태를 맵이 아니라 파이로 변경한다.
마크상단 빈 여백에 min(1)를 입력한다.
마크 상태를 세부정보가 아닌 크기로 변경한다. 이렇게 되면 파이의 크기를 조절할수 있다. 왜 굳이 min(1)를 만들었을까?
기존에 있던 것에다가 크기를 최대로 올려봐도 저 정도 밖에 커지지 않는다. 더 크게 하기 위해서 min(1)을 이용 해야 한다. 최소값을 1로 정함으로써 설정값 자체를 키우는 것같다. 다음으로는 지역별로 색상을 입혀준다. 지역필드 -> 색상, 매출 -> 각도 마크에 각각 넣어준다.
지역의 정렬 기준은 위처럼 설정해준다.
이렇게 만들어진 파이에 안에 시도별 계층을 추가 해준다.
아까 만들었던 기준 포인트 필드를 드래그하여 맵 위에 옮기면 위 그림처럼 마크 계층 추가가 뜬다. 아이콘 위에 해당 필드를 넣어준다. 그러면 기준 포인트(2)에 대한 마크가 생성되고, 여기에 시도별 정보를 넣어주면 계층 추가가 완성된다.
지역을 색상마크에 넣어 준 뒤, 시도 필드를 레이블에 넣는다.
지역과 시도 이름이 겹쳐서 지저분해 보인다. 시도별 이름을 모두 두자리로 깔끔하게 만들기 위해서는 계산된 필드를 통해 해결할수 있다.
case 함수를 이용하여 두 자리로 통일해줄 수 있다. 이를 레이블에 넣어준뒤 정렬기준 필드, 내림차순, 필드명은 매출로 정렬기준을 설정한다.
매출을 각도에 넣어주면 오른쪽 그림처럼 만들어진다.
기준 포인트 계층을 추가 한뒤 매출을 레이블에 넣어주면 가운데 매출 합계를 볼수 있다. 뒷 배경에 지도 그림을 제거할려면 아래 처럼 실행해준다.
없음을 클릭 한뒤에 배경 서식에 가서 아래처럼 적용해 준다.
행,열 선반에 있는 머리글 표시 해제 후, min(1)의 도구 설명에 포함을 해제 시키면 마우스 오버 시 나타나는 설명들을 제거할수 있다. (기준 포인트 1~3모두 해제)
각 분기별로 흐름을 살펴 보기위해서 주문일자를 페이지에 넣어준다 이때, 분기형식으로 넣는다. (연속형)
오른쪽에 페이지 컨트롤러가 생긴다. 재생 버튼을 눌러주면 분기별로 흐름을 볼수 있다.
가운데 매출 값을 각 년도의 분기별 매출 값을 누계 형태로 바꿀수 있다. 즉, 각 년도의 분기별 합계를 가운데에 표시하겠다는 뜻이다.
기준포인트 1~3의 매출를 누계 형식으로 바꾼 뒤,
테이블 계산에서 특정 차원 -> 주문 일자의 분기를 모두 클릭 해준다.
4-2) Mapbox활용
*완성본 미리보기
맵박스와 연동하여 표현 할수 있도록 해보자.
7개의 템플릿이 있다. 사용하고자 하는 템플릿을 선택해 준다.
원래대로 돌아가기 위해서 style을 선택한다.
태블릿에 적용하기 위해서 위 그림처럼 클릭해준다.
시도를 맵 형태로 변경해 준다. 시군구도 같은 과정을 거친다. (카운티)
이 둘에 대한 계층을 만들어 준다. 이름을 '지도'라고 설정한다.
시군구를 떠블클릭하면 위 지도처럼 나온다.
맵 관리를 통해 맵 박스를 추가 해준다.
복사한 URL을 넣어주면 된다.
좀더 자세히 보기 위해서, 시도 필터를 서울만 해당하여 올려준다.
마크에 순차적으로 넣어주면 새로운 맵 형태에서 값을 표현 할수 있다.
5. 우수한 대시보드 구성하기
5-1) 통일성을 갖추기
*완성본 미리보기
상단에 특정 연도를 클릭하면 아래 트리맵에서 각 시도별 매출값이 나오도록 하는 대시보드이다.
트리맵의 특정 지역을 또 클릭하면 위 처럼 막대그래프를 볼수있다. 위 그림은 경기도의 각 시군구별 매출값을 보여준다.
1 step) 상단에 위치할 하이라이트 테이블 만들기
하이라이트 테이블을 선택한다.
위 처럼 서식으로 정리를 해주면서 마무리 해준다.
2 step) 트리맵 만들기
시도별 매출을 위 트리맵으로 간단하게 만들어 줄수 있다.
3 step) 시군구 별 막대 차트 만들기
시군구 중첩의 합계 매출을 눌러주면, 앞에 있는 시도 까지 고려하여 시군구별 매출 기준으로 내리차순 정렬이 된다.
매출필드를 각각 레이블과 색상에 넣어준다.
4 step) 대시보드 만들기
각 워크시트를 위 처럼 배치해 놓는다. 위에서 아래로 세부적인 정보, 왼쪽에서 오른쪽으로 세부적인 정보 흐름을 만들어 놓는 것이다.
상단의 연도 매출을 클릭하면 시도별 매출이 변경되도록 설정 해준다.
모든 값 제외를 선택함으로써 선택된 것 말고는 모두 제외를 해준다.
특정 시도를 한번 클릭 후 다시 클릭하면 시군구별 매출 공간이 아예 사라져야 한다. 이를 위해서 아래와 같은 과정을 거친다.
가로개체를 가장 왼쪽에 넣어준다. 그 공간에 시도별 매출을 넣어준다.
시군구별 매출을 시도별 매출 오른쪽에 넣어준다.
그러면 위 와 같이 표현된다. 시군구별 매출 제목을 숨기기 누르면
사라지는 것처럼 꾸밀수 있다.
5-2) 심플하고 사용자 관점에서 꼼꼼하게 가이드하기
*완성본 미리보기
각 고객별 수익과 할인율 상관관계를 scatter plot 차트로 표현해본다. 그리고 수익이 가장 높은 고객과 낮은 고객의 이름을 표시해준다. 또한 상단에는 각 고객에 대한 정보를 표현해 보도록 한다.
1 step) 수익과 할인율의 상관관계 그리기
할인율의 집계 방식을 평균으로 변경해준다. 그리고 숫자형식을 백분율 둘째자리로 설정한다.
행,열선반에 각각 할인율과 수익을 넣고, 고객명을 세부정보로 입력해준 뒤 색상에 수익을 넣어서 수익별 구분이 가도록 해준다.
최고 수익과 최저 수익의 고객명을 표기해주기 위해서 위 처럼 계산식필드를 생성해준다. 이때 then [고객명] 으로만 적어주면 에러가 난다. window_max 같은 집계 함수를 사용했을때 고객명도 집계방식으로 바꿔줘야 한다(이부분은 이해가 잘 안감) 차원에 있는 값을 집계로 변경해주기 위해서 ATTR을 적용해준다.
위 처럼 변경해주면 최고 수익과 최저 수익 고개명만 알수 있다.
2 step)
각 고객별 가장 처음 주문한 날을 추출하고자 한다. 이를 추출하기 위해서 계산된 필드를 만들어 준다.
행 선반에 넣은 뒤 불 연속형으로 적용한다. 이와 반대로 위 계산된 필드를 max로 고치면 '최근 구매일'을 구할수 있다. 마찬가지로 행 선반에 넣어준다.
1 step 에서 최저수익을 기록한 고객 정보만 보이도록 하기 위해서 집합을 활용한다.
고객명의 집합을 누르고 이서준 고객을 선택한다. 열 선반에 넣으면
in, out 아래 이미지처럼 표시가 나온다.
out 부분은 숨기기를 해주고, IN 머리글도 숨기기 해준다.
나머지 값을 하나씩 넣어준다. 수익기준으로 순위도 표현해주기 위해서 계산된 필드를 아래처럼 만들어준다.
만들어진 계산된 필드도 넣어준다.
위 그림처럼 정리를 해준다.
3 step) 대시보드 만들기
부동인 상태로 고객별 정보를 옮겨준다.
텍스트 개체를 하나 만들어서 첫구매일, 최근 구매일을 만들어준다.
집합값 변경을 통해 특정 고객의 정보를 볼수 있도록 한다.
6. 데이터 구하기
6-1) 공공 데이터 활용하기
국가통계포털 사이트 이동
상품군별의 합계와 판매매체별의 계를 제외해준다.
합계 선택 -> 제외 선택 후 확인버튼 누른다.
같은 원리로 계를 제외해준다.
열 데이터 모두 선택 후, 피벗을 클릭한다.
위와 같이 표현방식이 변경되고, 피벗 필드명을 날짜 타입을 변경해준다. (상단의 ABC를 날짜로 ) 날짜 타입으로 바뀌다 보니까 일자가 임의로 추가가 된다.
컬러명은 아래와 같이 수정해준 뒤 시트로 이동한다.
위 처럼 만들어 준 뒤, 새 워크시트로 이동한다.
데이터 원본의 거래액 단위가 백만원이였다. 단위까지 적용시켜서 레이블에 넣어보자.
서식에서 숫자는 두자리로 변경한다. 2017년에는 각각 3.92조, 3.39조 였는데 2021년에는 그 격차가 크게 벌어졌음을 볼수있다.
6-2) 구글 시트 활용하기
위와 같이 주식데이터를 가져올수 있다.
옆 칸에는 close 대신 open을 넣어서 데이터를 가져온다.
같은 원리로 row,high를 불러온 후 태블로에서 불러오기를 실행해 보자.
태블로의 자세히 -> 스프레시트 클릭한다. 본인의 계정 클릭 후 연결해주면 된다.
Date1,2,3는 숨겨준다.
date필드의 시간은 활용하지 않으므로 날짜로 타입을 변경시켜서 제외시켜 줄수 있다.
+2021-08-31 학습내용 추가합니다.
7. 분야별 대시보드 만들기(1)-인구 데이터
7-1) 우리나라 인구수 대시보드 만들기
연령별 인구통계 자료를 다운받는다.(피벗을 활용하여 위 처럼 만들어 준다) 피벗 필드명의 성별과 나이를 분할해 준다.
피벗 필드명의 오른쪽 클릭 하면 사용자 지정분할이 있다. 스페이스 바 기준이며 분할해제는 전체로 설정해준다.
피벗 필드명 - 분할3 을 보면 '이상'이 있는데 이를 분할2와 합쳐준다. 그러기 위해선 계산식 필드가 필요하다
피벗 필드명- 분할 2의 오른쪽 클릭-> 계산식 필드에 가서 아래 처럼 수식을 적어준다.
계산된 필드 적용 후, 위 그림처럼 필요없는 컬럼 정리 및 필드명 변경해준다. 행정기관코드는 숫자로 되어 있는데 이는 문자열로 변경해주면 아래그림처럼 된다.
해엉기관을 보면 시도와 시군구 같이 병합되어 있는데 이 역시 분할해준다. 방법은 위에서 했던 분할과 같다.
분할이 3개로 나뉘어 진다. 컬럼명을 아래와 같이 변경해준다.
일반구는 시군구보다 더 하위 개념이다. 일반구는 사용하지 않기 때문에 일반구가 없는 지역만 필터링을 아래처럼 진행한다.
값이 없는 빈칸을 선택 후 확인 클릭한다.
시군구가 없는 서울특별시는 25개구를 모두 합산한 결과 이기 때문에 이 역시 필요없다. 이를 단순히 필터링을 적용하면 안된다. 왜냐하면 세종특별자치도는 시군구가 없기 때문에 사라질수 있다.
이를 해결하기 위한 방법은 행정기관코드를 이용하는 것이다. 맨 앞자리의 두자리는 시도에 대한 부분이며 그 뒤의 두자리는 시군구에 대한 두자리이다. 즉, 필터링을 뒤에 연속된 8개의 0이 있는 것에만 제외 처리를 하면 된다.
0 여덟개가 끝 부분에 해당되는 경우 '제외'처리하는 과정이다. 또한
출장소가 포함된 곳은 우리가 원하는 데이터가 아니므로 제외처리해준다.
출장소가 포함된 것은 제외 처리를 하고 확인을 눌러준다.
모든 과정이 정리된 데이터 모습이다. 9618의 행을 가지고 있다. 본격적으로 워크시트로 이동해 보자.
1 step) 시도, 시군구를 맵으로 표현하기
시도를 지리적 역할의 '시/도'로 변경해준다. 시군구는 '카운티'로 변경한다. 시군구를 드래그 하여 시구 위에 위치하여 계층을 만들어 준다. 이름은 지도라고 설정해준다.
우측 맨아래 알수없는 항목을 선택 후 위치편집을 클릭한다.
세종특별자치시가 시도명은 있지만 시군구명은 따로 표시가 없기 때문이다. 이럴땐 인식할 수 없음 항목에 아래 처럼 입력하고 확인눌러준다.
확인을 누르면 보이지 않았던 세종특별자치시가 보이게 된다.
인구수를 색상에 넣고 색상표를 위처럼 변경한다. 그리고 반전을 클릭 후 적용을 선택해준다.
파란색이 너무 많이 있는 것 같다. 좀더 구분을 명확하게 하기 위해서 고급버튼을 클릭한다.
가운데 값을 인구 20만을 설정해준다. 20만을 기준으로 색상을 대비하도록 한다.
다른 나라는 보이지 않도록 투명도 100% 설정해준다.
2 step) 남녀 인구 비교
위 방식보다는 남녀가 확실히 분리되어 비교할수 있도록 해준다. 그러기 위해서 계산된 필드를 아래처럼 만들어준다.
인구가 남자라면 마이너스 인구수, 여자라면 양수로 표현해준다. 해당 필드를 열 선반에 대체하여 넣어주면 아래와 같이 변한다.
하지만 남자 부분은 마이너스 값으로 표현되는 문제점이 있다. 이를 해결해보자.
아래 머리글 서식에서 위 처럼 설정을 완료 후 사용자 지정으로 넘어간다.
사용자 지정에서 위처럼 변경해준다. 이러면 모든 값들이 절대값으로 표현된다.
3 step) 대시보드 만들기
시군구별 인구수 지도에서 클릭하면 오른쪽 성별 연령별 인구수가 반응하도록 설정해본다.
시군구별 인구수 지도의 필터를 선택만 하면 된다.
8. 분야별 대시보드 만들기(2) - 주식데이터
8-1) 네이버 금융에서 데이터 수집하기
시가총액이라는 맨 위에 테이블과 그 바로 아래 테이블은 해당되는 회사들의 주식데이터 테이블이 있다. 태블로를 통해서 두번째 테이블을 가져오도록 한다.
2번째 테이블의 4번째 페이지까지 긁어 오도록 해보자.
1 step) 구글시트
네이버 시가총액의 URL을 넣은 뒤, 형식은 table로 가져오고, 두번째 테이블에 해당되는 정보를 가져오기 때문에 마지막에 2를 적어준다.
1페이지에 대한 50개 기업을 볼수 있다. 해당 페이지를 복제해준다. 복제된 시트를 2페이지라고 변경해준다.
네이버 금융의 2페이지 URL을 복붙하여 enter 하면 내용이 바뀐다. 이를 반복하여 4페이지까지 만들어 준다.
2 step) 태블로에 적용하기
1페이지 밑에 나머지 데이터를 이어 붙이려면 유니온으로 적용해야 한다. 위 그림처럼 2페이지를 드래그하여 겹치면 유니온이라고 뜬다.
-딥러닝 수학 1~8까지는 y =theta*x에 대한 내용을 학습했다. 지금부터는 y= theta1*x+theta0에 대한 학습을 진행한다. 오늘은 그 중에 Loss function의 변화와 그에 따른 Gradient Descent를 알아본다.
bias term이 추가가 되면서, loss에 대한 하나의 theta 함수가 아니라 theta1,0에 대한 함수 즉, 편미분과 gradient가 필요해진다.
loss 자체가 theta1,0에 대한 함수이기 때문에 gradient를 적용한다. gradient는 각각의 편미분을 벡터로 만든 형태이기 때문에 위 처럼 만들수 있다. cost도 theta1,0에 대한 함수이기때문에 같은 과정을 거친다.
각 theta로 미분했을 때, 차이점은 x가 있느냐 없느냐 이다. 앞으로 x가 어떤 차이를 보여주는지 배우게 될 것이다.
Loss를 이용한 theta 업데이트 식 같은 경우에는 위 와 같이 표현이 된다. theta0은 x가 없는 상태에서 업데이트가 된다는 걸 인식해야 한다.
cost도 각 partial Derivatives를 구하면 위와 같다.
cost의 partial Derivatives를 이용하여 gradient Descent method까지 구할수 있다.
Parameter 가 어떻게 update되는지 loss 부터살펴보겠다.
예전에 배웠던 내용과 흡사하다. 단지 bias가 추가 되었을 뿐인데, 왼쪽처럼 x가 없기 때문에 더 간단한 모양을 가진다. 이를 자세히 살펴보겠다.
실제값이 예측값보다 큰 경우, y^ = theta1*x+ theta0 에서 x는 변하지 안하고 theta0만 증가하므로 결국 예측값도 커져서 실제 y값과의 차이가 줄어들게 된다. 반대로 theta0이 줄어 들면 예측값도 줄기 때문에 y<y^ 인 경우에선 y-y^의 차이가 줄어들게 된다.
2.Loss function
y=x+1이 있을때, 가장 이상적인 모양은 왼쪽 그림일 것이다. 어떠한 initial theta가 주어지든간에 (1,1)로 예쁘게 수렴되는 형태를 바란다. 하지만 현실은 그렇지 않다
이쁜 종 모양을 가질려면 theta1**2 + theta0**2의 형태의 이차식을 가져야 한다.
하지만 현실은 크게 다르다. 위 식을 전개하면 복잡한 형태를 볼수가 있게 되는데 일단은 파란색 박스가 쳐진 곳을 집중적으로 보도록 해본다.
(1,2)일때는 이쁜 모양을 갖지만, 본격적으로 x**2가 1이상의 값을 가지게 될수록 위아래가 길쭉한 모양을 갖게 된다. 즉, theta1**2 에서 x**2만큼 곱해지기 때문에 theta1에 더 민감한 반응을 하게 된다. 그림에서 가로가 theta1을 나타내는데, 그림에서 보듯이 가로에 변화가 더 심한 걸 알수 있다.
산과 비교하자면 등고선이 일정한 간격으로 펼쳐진 산 정상에서 지상까지 가는데 큰 무리가 없이 내려갈수있다. 왜냐면 간격이 일정하고 급격한 경사가 없기 때문이다. 하지만 오르녹 그림을 보면 땅에 갈수록 등고선의 간격이 점점 좁아진다. 즉 급경사, 변화가 많아진다는 의미이다.
그래서, theta0이 변화해서 얻는 loss양보다는 theta1의 변화에 따라 얻는 loss양이 더 크다(민감하다).
x=1 일 경우 어느쪽으로도 기울어져 있지 않은 예쁜 모양을 갖고 있다.
x=2 일 경우, 한쪽으로 길쭉한 모양이 만들어 지면서 균형을 이뤘던 모양이 점차 변형되기 시작한다.
theta1에 대해서 -2 -> -1 로 갈때 급격한 변화가 발생한다.
반면 theta0에 대해서도 -2 -> -1로 변화가 일어나도 거의 같은 선상에서 움직이는 걸 알수가 있다. 즉 loss 변화량이 적다는 것이다. 이번엔 극단적으로 x값을 늘려보겠다.
theta1이 변화할때는 급격하게 떨어지지만 theta0이 변화할땐 거의 변화가 없게 된다. 결론적으로 theta들의 학습 속도의 차이가 나버리게 된다는 것이다. 아래 그림을 통해서 이해해보자.
왼쪽처럼 최적의 경로로 빠르게 학습 되는 것이 아닌 오른쪽 처럼 theta1이 빠르게 먼저 학습이 된 후에야 theta0이 천천히 학습이 된다. theta1은 민감한 부분이기 때문에 먼저 반응을 하게 된것이다. 이런 상황이되면 전체적인 학습 속도가 느려지게 된다.
더 극단적인 예시를 통해 알아보자
왼쪽그림처럼 두 theta간의 차이가 두드러진다. 어쨌든 최종적으 학습이 잘 진행되어 가고 있기 때문에 다행이라 볼수 있다. 진짜 문제는 오른쪽 그림과 같을 것이다. weight 와 bias의 학습속도 차이가 난다는 것은 같은 lr이라 하더라도 theta1이 발산 될 확률이 커지게 된다. (위 두 예시그림은 lr이 동일하다)
문제점은 여기서 그치지 않는다.
-2xytheta1, -2ytheta0과 같은 것은 평행이동과 관련 된 것이라서 큰 영향을 주지 않는다. 바로 2xtheta1 * theta0이 큰 영향을 준다. 구체적으로 어떤 영향을 미치는지 살펴본다.
x의 변화에 따른 cost 함수의 모양을 비교해 본다. theta1*theta0 같은 경우는 길쭉한 형태의 축을 결정하는 요소이다. 그래서 값이 커질수록 한쪽 방향으로 길어지는 모습을 볼수 있다. 극단적인 예시를 통해 자세히 알아본다.
값이 더욱 커질수록 극단적인 cost fuction을 갖는다. 이해를 돕기 위해 차례대로 3차원 그림을 살펴보자.
theta1*theta0이 아예 없을 경우엔 균형잡힌 밥그릇이 된다.
0.6을 줬을때 한쪽 방향으로 눕는 형태로 변하게 된다.
1.0을 줬을때 한쪽 방향으로 더욱 눕는 형태로 변하게 된다.
2가 됐을땐 아예 드러 눕는 형태가 된다. 일직선으로 보이는 것이 한쪽방향으로 펴진 축을 나타낸다. 여기서 알수 있는 점은 학습의 방향이다. 이는 스케이드 보드를 타는 것과 같다. 스케이드 보드는 U모양이며 사람들은 맨 위에서 출발한다. 각자 출발점의 위치는 다르겠지만 결국은 모두 쭉 펴진 축 선 안에 빨리 도달하게 된다. 쉽게 말해서 U의 바닥부분(기울기가 없는곳)이다. 이는 딥러닝에도 똑같이 적용된다. 기울기가 가파른 곳 방향으로 먼저 학습이 되며, theta들간의 학습 차이가 발생하면 발산할 확률이 커지게 된다.
모양을 변하게 만드는 theta1*theta0이 어떤 문제점을 야기 시키는지 자세히 알아보자.
0.2만 줘도 다이렉트로 찾아 가는데, 1만 되어도 오른쪽 처럼 차이가 난다.
1.6인 왼쪽 그림은 점점더 가파른 형태를 보이며, 오른쪽은 정사영 시키는 모습을 보인다. 정사형 처럼 일직선으로 학습된 것은 target theta1,0 에 가까워 지지 않는다. 오른쪽 그림을 보면 모두 대각방향을 일직선이다. 즉, 가운데로 보이는 등고선이 없다는 점이 큰 차이점이다. 오른쪽은 비록 target theta1,0 정중앙에 미치치는 못했지만 등고선, 즉 기울기가 있기 때문에 어찌됐든 target을 향해 가고 있다.
이번엔 파란박스을 모두 제대로 적용했을 때 cost function 모양을 보겠다.
x가 커질수록 거의 일차식에 가까운 모양을 보이게 된다. 100은 U모양에서 더울 폭이 좁은 형태가 될것이다. 그래서 위에서 바라 봤을때 마치 일직선 처럼 보일수 있다.
x 절대값이 커질수록 y축과 같은 방향을 보고 있는 형태로써 V 모양으로 점점 변하게 된다. 따라서 실제는 위 처럼 V모양으로 띄는 cost function 이며 projection되는 방향으로 학습이 진행 된다.
8가지를 모두 합쳐봤을때 위 와 같이 볼수가 있게 되며 x를 많이 늘리게 되면 아래와 같은 모습을 볼수 있다.
모두 가운데 축을 지는 V형태를 가지고 있다.
x가 0~1까지 해당되는 것은 오른쪽 삼각형, x가 -1~0까지 해당되는 것은 왼쪽 삼각형이 된다. 1보다 커질 경우엔 위, 아래에 축이 생긴다. 즉 x의 절대값이 커질수록 theta0축에 가까워지고, 절대값이 작을수록 theta1축에 가까워진다.
3.Gradient Descent
x가 작을수록 그나마 U형태를 보이는데 x가 커질수록 V형태로 더욱 좁아지는 모양을 가진다.
평행이동에만 관심있는 두 파란 박스를 다뤄보자. D 데이터는 y =x+1 함수를 따르는 data이다.
x가 커질수록 theta0축에 가까워 지며 U에서 V 형태로 점점 변하게 된다.
각 data에 따른 loss function을 모두 그려본 이미지이다.
표준정규분포의 데이터를 가지고 loss function은 왼쪽과 같다(100개) 또한 아웃라이어들이 theta0 축과 그나마 가장 가까운 것들일 것이다.
mean=3이므로 theta0축에 가까운 loss function들이 위처럼 생길 것이다. 이로써 알수있는 것은 어떤 데이터가 주어지든 loss fucntion을 예상할수 있다.
이 세개 이미지중 가자 좋은 것은 표준정규분포 loss function인 가장 왼쪽 그림이다.값이 커질수록 V형태를 가지므로 발산할 우려가 더욱 커지게 될것이다.
Gradient Descent
-평행이동을 관할하는 term은 제외한 후, 나머지에 대해 gradient descent먼저 보겠다.
각 theta별로 gradient descent를 할수 있겠다.
x가 커질수록 theta0과 가깝게 변하게 되며 초기 theta는 projection되는 방향으로 학습이 진행된다. 이때 학습 속도를 보면 x=10일때 파란 point의 간격이 넓직하게 움직인 걸 볼수 있다. 왜냐면 기울기가 더욱 급하기 때문이다.
x의 크기별로 학습의 속도가 어떤지 아래 그림을 통해 알아보자.
x=1은 균형잡힌 밥그릇이라 했을대 theta1,0 에 대한 학습속도와 방향은 위 하늘색처럼 대각선 방향으로 진행되었다. 그리고 x가 커짐에 따라 project 방향이 갈색처럼 눕는 형태를 보였다.
또한 눈여겨 볼게 점의 간격이다. theta1에 대한 학습이 지배적으로 변하게 된다. 왼쪽 theta1 식을 보면 theta1에 x가 곱해져 있다. x의 크기에 따라 얼만큼 업데이트 될건지 정해진다.
initial theta를 각각 -2씩 주었을때, interation 10의 theta1은 약 1만큼 증가한 반면 theta0은 미미하게 업데이트가 되었다. x가 있고 없고의 차이가 분명하게 드러난다. 더욱이 Loss가 144 -> 50으로 감소했기 때문에 가뜩이나 theta0 느린 학습속도가 더욱 느려지게 된다. loss 50에 대해서도 theta1의 업데이트로 넘어가기 때문에 theta0은 더더욱 느려지게 되는 것이다. 따라서 theta1이 먼저 학습하게 되면 loss가 확 줄기 때문에 전체적인 학습속도가 늦어 진다. 그래서 theta0 같은 경우엔 학습할 기회 조차 없어진다.
0<x<1인 경우를 보면, x가 작아질수록 theta1방향으로 눕게 된다. projection이 될수록 theta0의 0으로 학습이 되어 가는데 theta1의 0으로는 학습될 기미조차 없다. 여기서는 반대로 불균형이 생기게 된다. 수식으로 살펴보면 이해가기 쉽다.
x가 0.1이라면 theta1은 2*(0.01)^2 만큼 업데이트 양이 결정된다. 소수점이므로 theta0보다 훨신 적게 업데이트가 된다는 걸 알수가 있다.
아까와는 반대로 업데이트가 되어가고 있다.
여기서 알수 있는 점을 간추려 보자면, 입력되는 절대값x의 값이 크면 weight가 bias보다 압도적으로 학습속도가 빠르게 진행된다. 이와 반대로
절대값 x가 1보다 작고 0보다 크다면 bias의 학습속도가 빠르게된다.
위 내용은 x가 양수일때를 살펴봤다. 반대로 x값이 음수가 들어왔을때 어떻게 변하는지 알아보도록 한다.
x의 절대값이 커질수록 y축과 같은 모양을 띈다고 앞서 배웠다. 따라서 x의 값이 증가 할수록 theta1은 빠르게 학습 할 것이며 theta0은 느리게 학습하게 된다.
(수정: 왼쪽이 -0.8, 오른쪽이 -0.5)
절대값이 1보다 점점더 작아지게 만든 경우이다. 눕는 형태가 되므로 theta0만 학습이 되고 theta1는 점점 학습이 느려지게 된다.
정리를 하자면, 절대값x가 0에 가까울수록 bias만 거의 학습이 되고, 절대값 x가 클수록 weight만 거의 학습이 된다.
결국 weight, bias 두개의 학습속도를 맞추기 위해서 feature scaling이 필요하게 된다. 표준정규분포처럼 0과 1로 맞추는 것도 좋지만 만일 0으로 대부분 맞춰진다면 bias 만 학습이 되는 불균형은 사라지지않게 된다. 따라서 스케일링을 할때에도 절대값 1에 가깝게 최대한 맞춰줘야 weight와 bias의 학습속도를 맞출수가 있다.
보고서를 받는 대상이 시간 관리에 타이트한 사람이거나 결과를 우선시 하는 편이라면 아래와 같이 매개변수를 활용하여 요약하는게 좋다.
3-1) 요약 대시보드
Year 와 month 변경에 따라 당월, 전월,전년 동월 매출이 나타나도록 만들기
1 step) 당월매출
Year 와 month의 매개변수를 만드는데 모두 문자열의 목록형으로 생성한다. 이를 계산된 필드로 엮는다. (날짜를 정수형태로 바꿔주는 DATAPART를 사용)
계산된 필드 생성 후 위 처럼 필터와 행 선반 등 설정 후 서식을 통해 정리한다.
2 step) 전월매출
당월의 계산된 필드내용을 재활용 할수 없다. 2021년 0월은 없기때문이다. 먼저 p.year & p.month를 조합한 매개변수를 생성한다.
조합한 후 행 선반에 넣는다. 문자열을 날짜로 변경해주는 함수 dateparse를 사용한다.
위 수식을 통하여 parameter 매개변수가 문자열-> 날짜로 변경 되었다. 시분초는 필요 없으므로 날짜로 필드 변경한다.(매개변수의 달려 표시 클릭) c.parameter의 2020-06-01에서 01은 일자가 없어서 자동으로 01 붙는다.
주문일자의 month와 c.parameter의 차이가 1이라는 뜻이다. 필터를 f.전월을 넣어서 정리하면 아래와 같다.
3 step) 전년 동월 매출
동월 매출의 계산식 필드에서 year 부분에서 -1을 해주면 전년 동월 매출을 알수있다.
4 step) 대시보드로 요약하기
똑같은 크기로 만들기 위해서 가로 개체를 넣는다. 그리고 시트를 넣는다.
위처럼 차례때로 넣으면 가로를 넣었기 때문에 같은 크기로 할당된다.
대시보드1 밑에 가로 개체를 하나 넣은 후에 p.year 와 p.month를 넣어서 정리하여 마무리한다.
가급적 필터를 적게 사용하는게 좋다라는 뜻이다. 따라서 필드를 제거한 수정본을 만들어 본다.
** 필터를 제거한 수정 본 만들기
만들어진 c.당월매출 계산식필드를 마크에 있는 합계 필드위에 오버랩한다.
필터를 제거해도 값이 유지가 되었다. 합계는 sum이다. 여기에 계산식을 오버랩 시켰으므로 sum과 위 iif 함수 공식이 동시에 적용 된 것이다. 오버랩 시키서 하는 것보다는 애초에 계산식에서 sum을 함께 적용하는 것이 효율적이다.
c. 당월매출을 위처럼 수정한 뒤, 마크에 새로 넣으면 완성이다.
4. 효율적인 대시보드 만들기(2)-사람 중심의 디자인
*보(고 받)는 사람의 시선이 먼저 가는 곳 공략하기-좌측상단 공략
*보(고 받)는 사람이 집중하도록 Views & Colors 제한 두기
*보(고 받)는 사람이 직접 참여하도록 유도하기
Profit 대시보드 완성하기
매개변수 변경에 따른 전체적인 수치 변화을 디자인 해본다
1step) 당월수익
주문일자에서 매개변수를 선택한다.
범위에서 주문일자를 선택하면 데이터 원본에 있는 날짜를 모두 반영할수 있다. 만들어진 매개변수 날짜를 기준으로 값을 만들어본다.
위 수식의 뜻을 알아본다. 먼저 윗줄의 주문일자 month와 p. date의 month 차이가 0이라는 것은 매개변수에 2021년 6월 11일로 설정했으면 month와의 차이가 없으므로 6월을 나타낸다. 맨일 차이가 1이라면 2021년 5월 11일이다. 그리고 주문일자의 day와 p.date와의 차이가 0보다 같거나 크다는 것에 1일 부터 11일까지를 조회하다는 것이다. 왜 이렇게 될까? 먼저 차이가 0이라면 11일 자기자신을 뜻한다. 차이가 1이라면, 10일, 차이가 2라면 9일,차이가 10이라면 1일, 이런식을 해서 1일부터 11일까지 조회가 가능하다.
저번에 언급 했던 대로, 필터는 지양하는게 좋으므로 계산식을 사용한다. f.당월인 경우엔 수익을 가져오고 그게 아닌 나머지 경우엔 null을 가져온다 라는 뜻이다. sum은 총 합계를 구하기 위함이다.
마지막으로 위 처럼 정리를 해준다.
2 step) 전월수익
당월은 차이가 0이라면 전월은 차이가 1이기 때문에 계산식을 위 처럼 수정한다. 나머지 과정은 동일하다.
3 step) 전월 대비 수익
+인 경우, -인 경우, 0일 경우가 있을수 있기 때문에 위 처럼 설정한다.
값에 색상을 넣기 위해서 계산식을 만든 후 색상 컬러에 넣는다. 값이 없을 경우엔 black으로 표현한다.
값이 없을 경우엔 빈 화면이 아니라 0으로 표현하기 위한 작업이 필요하다.
전월 대비 수익이 null인 경우엔 0으로 표현한다.
4 step) 전월 대비 수익
당월 or 전월 계산식을 만든 후 필터에 넣고, 아래 처럼 행,열 선반을 설정해준다.
어떤 월인지 구분안가므로 월 주문일자(연속형)를 색상 and 레이블에 삽입한다.
5 step) 대시보드
가로개체를 넣은 뒤 시트 삽입한다.
대시보드 제목표시 후 가로개체를 제목 쪽에 넣어서 대시보드 제목과 매개변수를 포함시킨다.
매개변수는 아래 세모 옵션의 너비 편집을 사용하여 줄일수 있다. (245로 변경) 개체의 텍스트를 대시보드 제목 옆에 넣어서 작성자를 입력한다.
너비 조정은 245로 설정한다.
매개변수 설명란을 작성하기 위해서 빈 페이지 개체를 넣는다. 그 안에 부동으로 설정한 텍스트 개체를 넣는다.
5. 효율적인 대시보드 만들기(3)
여러 매개변수를 활용한 대시보드를 만든다.
특정 고객을 선택하면 추가 설명이 뜨도록 한다.
1 step)
할인율의 기본설정을 평균으로 설정 한뒤 위 수식을 만든다
x,y축 매개변수 생성한다. 두개 매개변수를 활용하여 동적으로 변화하도록 계산식을 만든다.
*x축 계산식 필드
할인율은 집계가 안되어 있기 때문에 AVG를 적용한다.
*y축 계산식 필드
생성한 계산식 필드를 위와 같이 설정한다. 투명도는 60, 테두리는 하얀색이다. 참조선 평균을 기준으로 사분면을 나누도록 한다 .
사분면을 기준을 위 와같이 정해준 뒤 색상 마크에 넣어준다. 다음을 사용하여 계산 -> 고객명 순서대로 클릭하여 각 고객에 따라 색상을 달리 구분한다.
현재 데이터는 4년치 데이터이다. 이를 매개변수를 통해 연도별로 구분해 본다.
f. 연도를 필터에 넣는다. 각 데이터 마다 추가설명을 달기 위한 계산식을 만든다.
이 계산식 필드를 마크의 도구 설명에 넣는다.
마우스 오버하면 추가설명이 뜬다.
도구설명은 위와 같이 편집 할수 있다. 이때 x_축 단위,x_축 단위가 보이는데 이를 만들어 본다.
x_축 단위 및 y_축 단위는 위와 같이 생성한 뒤 도구설명에 넣는다.
2 step) 고객별 분기별 KPI
행,열 선반을 위 처럼 설정 한 후 열 선반에 있는 y축을 옆으로 복제한다.
주문일자를 드래그 하여 '세부정보'에 넣는다. 불연속형 분기(주문일자)를 클릭한다.
집계2번을 선택하여 도구설명으로 들어와 있는 분기를 레이블로 설정한다.
라인으로 설정 후 마우스 오버된 빈 곳에 더블클릭하면 위 처럼 빈칸이 나타난다.
1,2,3,4 분기별로 순서대로 라인을 경로로 이동시킨다.
위 처럼 설정 후, 두 그래프를 합치기 위해서 이중축을 사용한다. 두 그래프가 합쳐졌으므로 축 동기화 시킨다.
축 동기화 후 상단에 있는 c.x축의 축 편집 -> 눈금선에서 위 처럼 없음으로 설정한다.
고객 클러스터 워크시트의 도구설명에서 삽입을 이용하여 방금까지 만들었던 고객별 분기별 KPI를 넣어준 뒤 400*400로 크기 조정 한다.
고객 클러스터에 적용된 연도 필터를 도구 설명에 링크된 고객별 분기별 KPI와 연동이 되어야 하므로 '이 데이터원본을 사용하는 모든 항목'을 선택한다. 그러면 고객별 분기별 KPI에도 연도 필터가 적용된다.
고객을 마우스 오버 시, 각 분기별로 1-2-3-4 라인으로 연결된 정보를 볼수가 있다.
좀 더 정확한 정보를 보기 위해서 각 분기별 '수치' 볼수 있도록 새 워크시트를 만든다.
3 step) 고객별 분기별 KPI(2)
해당 되는 테이블들을 텍스트에 넣은 후 위 form으로 편집을 진행한다.
서식을 이용하여 위 처럼 정리를 해주면 된다.
마찬가지로 고객 클러스터의 도구 설명에 가서 방금 만든 워크시트를 삽입한다.
4 step) 대시보드 만들기
고객명 하이라이트를 만들어서 특정 고객의 세부정보를 볼수 있도록 설정해둔다.
가로 개체를 사용하여 매개변수를 정리한다.
p.Y축을 위 처럼 배치 하기 위해서는 세로 개체를 수익률 옆에 배정한뒤 p.Y축을 옮긴다. 이때. 가운데로 오게끔 만들기 위해서 빈 페이지를 두번 넣으면 가운데 부분에 빈페이지 끼리 맞닿은 경계선이 생긴다. 아래처럼 경계선이 생기는데 여기에 p.Y축을 다시 옮기면 위에 이미지 처럼 만들수 있다.
'측정값을 선택하세요' 글 삽입과 p.x축의 가운데 정렬를 하기 위해서는 텍스트 & 빈페이지 개체를 이용하여 만들수 있다.
텍스트 개체를 대시보드 제목 밑 절취선에 위치 시킨 후 레이아웃 필드에서 색깔을 선택해주면 아래와 같이 꾸밀수 있다.
위 처럼 설정하면, 필터 2를 선택했을때 필터1에서는 고객 세그먼트 및 월간 기준으로만 필터를 적용 한다는 의미이다.
2018년 기업고객 12월을 클릭하면 상단에는 각 년도 별 기업고객(고객 세그먼트)의 월간(월 주문일자) 매출을 보여준다.
1-2) 하이라이트
위 처럼 매출을 레이블에 넣은 후 하이라이트를 선택하면 평사시엔 나타지 않다가 하이라이트가 레이블이 보인다. 아래는 대시보드에서 하이라이트 거는 방법이다.
대시보드의 동작 누른 후 추가 -> 하이라이트를 선택하여 위처럼 설정하면 아래처럼 마우스 오버 시 강조되는 부분만 레이블을 볼수 있다.
1-3) URL 이동
클릭 시, 위 내용만 간단하게 나온다. 여기에 네이버 쇼핑 URL을 넣어서 해당 제품의 네이버 쇼핑 part로 이동하게끔 만들수 있다.
(1)
(2)
가구라고 적혀 있던 글을 제외한 나머지 URL을 복사하여 아래처럼 진행한다.
(3)
가구 빠진 자리에 위처럼 설정하면 제품 중분류가 대신 그자리를 차지하게 된다.
(4)
URL 클릭 시 네이버 쇼핑으로 해당 품목을 볼수가 있다.
2. 대시보드 액션 적용(2)
2-1) 시트로 이동
*시도별 맵
*시군구별 맵
*시도 -> 시군구 대시보드 & 시군구 -> 시도 대시보드
시도 -> 시군구 대시보드는 동작의 필터를 누른뒤 아래처럼 설정해준다
시도맵에서 아무곳을 클릭하면 클락 된 해당 지역의 시군구 맵이 나오게 된다.
시군구 -> 시도 대시보드는 왼쪽 아래 탐색버튼을 눌러준 뒤, 편집 을 활용하면 된다.
위 순서대로 과정을 거친 뒤에 ALT+클릭 하면 시도맵으로 변경된다.
2-2) 매개 변수 변경
매출, 수량, 수익 아이콘에 마우스 오버 시키면 월간 추이가 자동으로 변경되도록 해본다.
*아이콘 만들기
위처럼 뼈대를 만든 뒤, 마크를 모양을 클릭 하면 아래처럼 모양 마크가 새로 생긴다.
열 선반에 있는 측정값 이름을 ctrl+왼쪽 마우스 드래그 하여 새로 생긴 모양에 넣어준다.
마크에 있는 연속형 측정값을 '세부정보' 넣어주면 숫자가 사라져서 모양만 남게 된다.
*월간추이는 배운 내용 이므로 skip하였습니다.
대시보드 생성 뒤, 대시보드 -> 동작 -> 매개변수 변경을 클릭하여 최종적으로 아래처럼 설정한다.
이 작업은 월간 추이에서 걸어둔 p. 측정값 매개변수를 아이콘에 이관?하는 작업이다.
2-3) 집합 값 변경
위처럼 왼쪽 지역을 선택하면 오른쪽엔 해당 지역의 시도별로 측정값을 볼수 있도록 해본다. 내가 궁금한 것과 궁금 하지 않은 것 두개로 나뉘므로 집합을 이용할수 있겠다.
*지역별 측정값 만들기
지역에 대한 집합을 위 처럼 일단 설정한다. 해당 집합을 생성함으로써 수도권과 수도권이 아닌 지역 둘로 나뉜다. 열 선반에 있는 측정값 대신 매출,수량 같은 수치로 대체가 가능하다. 방금 만든 지역 set을 색상에 넣어서 구분 한뒤, 행 선반에 한번 더 넣는다. 행 앞자리에 넣음으로써 선택된 지역은 무조건 맨 먼저 나오게끔 설정할수가 있다.
in,out 머리글은 제거해주면 깔끔해진다.
*시도별 측정값 생성
지역별 측정값을 복제한 워크시트를 가지고 계산된 필드를 만든다.
지역집합에 해당되는 것은 시도로 나타내고 그렇지 않은 것은 지역으로 나타낸다는 의미이다. (지역 set은 대시보드에서 클릭으로 in,out 수시로 변경 가능하다.)
만든 계산식 필드 인 지역 or 시도별을 행 선반에 넣는다.(강의 에서는 이 직후 행 선반에 있는 지역을 제거해주었다.)
*대시보드 생성
대시보드 -> 동작 -> 집합 값 변경 순으로 들어가서 위처럼 설정하면 최종적으로 완성된다.
각 loss들에 대해서 1/n씩 곱해진다. n=10이면 1/10씩 각 loss에 곱해진다.
data의 값이 크면 loss도 크기 때문에 위에 그림 세타5처럼 튀는 값이 생길수 있다. 이러한 큰 수의 data를 이상치라고도 불리는데 FE과정에서 이상치를 제거하기도 한다. 하지만 무조건 제거하는 건 좋지 않다. 왜냐하면 소수의 case를 제거 하는 것과 마찬가지이기 때문이다. 가장 best 모델은 이상치를 포함한 (학습 방해가 되지 않는 선에서) 전 범위를 커버 할수 있는 것이다. 따라서 cost를 사용하면 위 그림의 초록색 세타 처럼 협의점?을 활용하여 제거 없이 학습을 시킬수 있다.
만일 배치 사이즈가 위 예시처럼 5개 아닌 더 많을 경우엔 어떻게 해석을 해야 할까? 각 data 마다 loss값으로 업데이트하게 되면 누구 장단에 맞춰야 할지 몰라서 예측 선이 분주하게 증감을 반복 할것이다. 반면 배치사이즈가 8이라고 한다면 모든 데이터가 납득할만한 예측선을 찾아서 학습 시킬 것이다. 즉, 데이터의 특성들을 반영한 예측선이 나오게 된다. 하지만 local optimal 빠질수도 있기 때문에 마냥 배치사이즈를 늘리는게 좋은건 아니다. 단지 늘릴수록 dataset의 전반적인 특성을 따라간다 라는 의미이다.
*Numpy 계산
backpropagation 연산은 numpy가 이용된다. numpy는 Hadamard Product를 이용한다. hadamard는 element-wise 해주는 방법이다. 이에 대해 조금 자세히 알아본다.
왼쪽은 기존에 알고 있던 방법인 matrix Multiplication이다. B 매트릭스는 대각성분만 남기 때문에 오른쪽 b벡터같이 표현이 가능하게 된다. 그래서 a벡터 O b벡터를 hadamard 이용하면 그림과 같이 표현이 가능하다.
왼쪽과 오른쪽의 결론이 같으면서 hadamard 연산이 간결함을 한눈에 알수가 있다. 이러한 원리가 backpropagation 에서 사용이 되는 것이다. 아래 그림은 적용한 모습이다.
*벡터로 연산되는 과정보기
x_data,y_data 각 100개를 한번에 넣어서 계산 했을때의 과정을 본다
1)forward
2)backward
one sample의 빨간박스 dth은 스칼리였기 때문에 바로 lr을 곱해도 되었지만 vetorized samples은 데이터가 복수개 이므로 dth을 싹다 더한 다음에 lr을 곱해줘야 한다.(각 loss들에 대한 편미분 값을 모조리 더함)
2. batche gradiant methods
미니배치가 정해지면 네트워크를 통해 세타가 한번 업데이트가 된다. 이를 1iteration이라고 부르고, 이런 과정을 통해 전체 데이터가 한번돌아갔다면 1epoch라 부른다. 이때 batch사이즈를 어떻게 조정하느냐에 따라 여러 테크닉 이름으로 불린다.
2-1. batch gradient descent method
전체 dataset을 한번에 이용하는 것이다. 즉, 미니배치를 전체 데이터로 이용한 것이다.
전체 데이터를 X,Y에 받아 놓고(굳이 객체를 따로 생성 안해도된다) forward 및 backward를 진행한다.
1epoch마다 전체 dataset이 사용되므로 스무스한 감소를 보인다. 즉, dataset 전체의 특성을 반영한다.
2-2. stochastic gradient descent method
mini-batch size=1로 설정한 방법이다. 요즘에는 1로 학습하는 경우가 거의없다.
윗 부분은 without replacement 비복원 방법일 채택한 경우이다. 데이터 하나를 뽑고 interation 돌린 뒤에, 뽑았던 데이터를 제외한다. 반대로 replacement 방법은 뽑았던 데이터를 다시 포함시키는 방법이다. 이때 주의할점이 있다. epoch은 전체 데이터가 한번씩 돌렸을때 1epoch이라 한다. 이런 측면에서 비복원은 epoch이라 말할수 있다. 반면복원은 같은 데이터가 또 뽑힐 수가 있기 때문에 전체 데이터가 한번씩 interation 했다고 확신할 수가 없게 된다 따라서 복원은 epoch이라는 명칭 대신 interation이라 말한다. 그래서 아랫부분 2번을 보면 for iteration이라고 적혀있다.
*without Replacement
epoch을 돌릴때마다 셔플을 해줘야 오버핏팅, 반복적인 같은 패턴의 학습을 지양할수 있다.
데이터를 하나씩 뽑기 때문에 loss에 대한 fluctuation이 심하다. 왜냐면 데이터의 크기에 따라 loss도 비례하기 때문이다. loss가 많이 잡히는 곳은 그만큼 세타에 많이 업데이트가 되므로 기울기 경사가 급해진다.
*Replacement
random.choice를 사용하여 0~99번 인덱스 중 하나를 뽑아서 forward 및 backward를 진행한다. 전체 데이터를 한번씩 사용 못하므로 epoch 대신 iteration으로 표현했다.
2-3. mini-batchgradient descent method
mini-batch size=n로 설정한 방법이다. 적당한 n개를 적용하며 이 또한 without replacement, replacement로 나눌수 있다.
*without Replacement
if 절에 있는 것은 100개 데이터를 16개씩 쪼갠 후 마지막 나머지 4개를 사용하기 위함이다.
loss 그림에서 같은 형태의 fluctation이 있다. 랜덤셔플을 이용하지 않았기 때문에 미니배치가 순서대로 반복학습이 일어나서 저러한 형태를 보인다. 이는 학습 시 좋은 모습이 아니므로 랜덤 셔플을 이용하는게 좋다.
랜덤셔플을 추가 한 후 loss 그래프를 보면 반복되는 형태가 사라졌다.
*Replacement
복원방식이므로 epoch가 빠졌다. random.choice는 batch_size 만큼 뽑아서 각 데이터에 적용한다.