본문으로 바로가기
반응형


안녕하세요! 지난 Tutorial 실습에 이어서, 오늘은 KOSIS 국가통계포털에서 실제로 제공하는 데이터 중 하나를 가지고 와서, Tutorial의 주제에 맞춰 실습을 해보도록 하겠습니다.


최근 COVID-19 바이러스 유행의 여파로 인해, 국내 수혈용 혈액 공급에 차질이 생기는 등 문제가 많았다고 합니다. 실제로 국내 수혈용 혈액 보유량은 청소년 및 대학생들의 방학 시즌에 상당한 영향을 받는다고 하는 데요. 오늘은 시계열 데이터 전처리 및 분석을 주제로, KOSIS 국가통계포털의 제공 데이터 중 대한 적십자사의 '혈액정보통계:수혈용 혈액 보유 추이' 데이터를 사용하여 실습을 진행하도록 하겠습니다. [통계자료 링크]


데이터는 2015년부터 2019년까지, 총 5년의 데이터를 사용하도록 하겠습니다. 통계포털에서 다운받은 데이터는 바로 분석에 쓸 수 없는 형태인 경우 약간의 전처리가 필요한데요. 년도별로 구분되어 5개 그룹으로 나눠진 데이터를 엑셀 상에서 한줄로 만들어, 총 두개의 column(date: 날짜 / amount: 혈액팩 보유량)으로 만들어준 후, Brightics에서 Load 함수를 사용해 데이터를 시각화하였습니다.



만약 CSV 확장자의 데이터를 사용한다면, CSV의 column은 각 column 끝에 들어간 공백 문자로 구분되게 됩니다. 따라서, Column Name인 문자열 각 끝에 공백이 들어있지 않다면, Brightics의 Load 함수에서 이를 Header로 인식하지 못 하고, 무시해버리는 경우가 있습니다. 즉, 이 경우에는 위 사진에서 보이는 First Data 칸에 2015.1.1의 날짜 데이터가 아니라, 2015.1.2가 들어가고, Column Name에 2015.1.1이 들어가게 되는 것입니다. 

따라서, 이와 같은 상황이 발생하여 CSV 데이터 로드에 어려움을 겪는다면, CSV 파일을 엑셀, Pages 등으로 열어서 각 Column Name 문자열의 끝공백을 하나씩 추가한 후 저장을 하면 되겠습니다.


위 사진은 그렇게 공백 처리를 하여, CSV 데이터의 Header를 인식시킨 상황인데요. 이번에는 Column Name에 공백이 들어있으면 안 된다는 경고가 뜹니다. 붉은 화살표로 표시된 부분을 클릭하여 각 Column Name 끝에 들어간 공백을 지워줍니다. 그럼 마침내 정상적으로 데이터를 불러올 수 있게 됩니다!



불러온 Data를 Load 함수의 시각화 기능을 통해 시각화하였습니다. 시계열 데이터는 시간의 순서에 따라 나열된 이산 데이터로, Line 함수를 사용하여 시각화하면 깔끔하게 살펴볼 수 있습니다. 

우측 하단에는 Show rows 값이 적혀있는데, 기본적으로 Brightics는 1000개의 Row 데이터를 보여주도록 설정되어 있습니다. 우측 상단을 보시면 해당 데이터는 1826개의 Row를 가지고 있음을 알 수 있는데요. 따라서, 기본값을 바꿔주지 않으면 데이터의 일부만 시각화된 결과를 보게 될 수 있습니다. 꼭 잊지 말고 바꿔주세요!


Brightics Studio Tutorial 공식 문서 - Pre Processing 시계열 데이터 전처리

한 가지 문제가 발생했습니다. 우리가 가져온 혈액 데이터는 YYYY.M.D 의 형태로 날짜(시간) 데이터가 구성되어 있는데, Brightics 공식 Tutorial에 따르면, Brightics의 시계열 함수는 시간 데이터의 형식이 'yyyyMMddHHmmsss'로 가정되어 있다고 합니다. 즉, 시계열 함수를 사용하여 분석을 진행하기 위해선, 해당 형태로 변환해줄 필요가 있습니다.



다행히 Brightics는 Datetime Formatter라는 이름의, 시간 변수의 포맷을 손쉽게 변환할 수 있는 함수를 제공하고 있습니다. 하지만 저는 여기서 또 한번, 문제에 직면하게 되는데요. Datetime Formatter는 In Format 옵션에 현재 데이터가 가진 시간 형태를 선택하고, Out Format에 바꾸어 출력하고 싶은 시간 데이터 포맷을 선택하면 됩니다. 하지만 In Format에 YYYY.MM.DD 형태는 없는 상황입니다. 비슷한 형태의 옵션을 몇 가지 선택해서 시도해보았지만, Format이 일치하지 않아 오류가 발생합니다.


즉, YYYY.MM.DD 형태의 시간 포맷을 In Format 옵션에 맞도록 일차적인 변환을 한 후, Datetime Formatter를 사용해서 변환해줄 필요가 있습니다. 잠시 머리를 굴려보니, 얼마 전 Tutorial에서 학습했던 함수가 하나 떠오릅니다. 바로 SQL Query문을 사용할 수 있는 Add Function Culumn 함수입니다.



New Column Name에 새롭게 new_date를 넣어주고, Query Expression에 . 문자를 / 문자로 바꿔주는 코드를 넣어주었습니다.

사실 Python 코드를 사용하는 것 역시 가능하지만, 아직 SQL Query문에 익숙하지 않아서, 자주 써보려고 노력중입니다! 다행히 다음 학기에 DB 수업을 두개나 수강 할 예정이라, Brightics 서포터즈 활동을 하면서 점차 잘 활용할 수 있을 것 같네요.

Expression에 넣어준 식은 다음과 같습니다.

replace(date, '.' , '/')

replace 내의 인자는 앞에서부터 차례대로 column명, 변경할 기존 문자, 대치할 문자 입니다.

함수를 실행하니, 우측처럼 new_date column이 새로 생성되었고, YYYY/MM/DD 형태로 잘 변환되었습니다. 다행히, Datetime Formatter에는 이러한 In Format 형식이 존재합니다!



다시 Datetime Formatter 함수를 생성하여, 설정해줍니다. Columns은 새롭게 생성한 new_date column으로, 아래 옵션도 차례대로 형식에 맞게 잘 설정해줍니다. Out FormatyyyyMMddHHmmss로 설정하여야 Brightics 내의 시계열 함수에 잘 적용된다는 점을 잊지 말아주세요!



이제 Brightics의 굉장히 유용한 함수를 하나 소개하겠습니다. 바로 Decompose Datetime 함수입니다. 해당 함수는 지정한 column을 바탕으로, 각 날짜의 달, 일, 주, 요일 데이터를 가진 column을 새로 생성해줍니다! 즉, 이 함수만 있으면 굉장히 편하게 달별, 요일별 분석을 진행할 수 있습니다.



마지막으로, 새롭게 만들어진 column을 사용하여 시각화를 해보도록 하겠습니다. 먼저 요일별로 시각화한 모습인데요. 위 화면과 같이, 주 중에서 주말인 토요일, 일요일과 함께 월요일이 가장 혈액팩 보유량이 많은 요일이라는 것을 알 수 있습니다. 

이를 바탕으로, 상대적으로 주말과 월요일에 헌혈량이 많았거나, 주말과 월요일의 혈액팩 소비가 다른 요일에 비해 덜했거나, 전자와 후자 모두의 영향을 받았다고 가정해 볼 수 있겠습니다.



다음으로, 월별로 시각화한 모습입니다. 4월과 10월경에 가장 보유량이 적은 것을 알 수 있습니다. 또한, 상대적으로 더운 계절에 혈액팩 보유량이 많다는 사실 또한 알 수 있는데요. 이 역시, 4월과 10월에 헌혈량이 상대적으로 감소하거나, 혈액팩 소비가 많아진다고 추론해 볼 수 있으며, 여름철에는 헌혈량이 증가하거나, 혈액팩 소비가 줄어든다고 추론해 볼 수 있겠습니다.


오늘 사용한 데이터는, 추후 Brightics 시계열 분석 포스팅에서 더욱 심도깊게 다뤄보도록 하겠습니다!


지금까지 Brightics를 통해 시계열 데이터를 전처리하고, 시각화 해보는 실습을 진행하였습니다. 

앞선 실습과 함께, Brightics 공식 Tutorial에서 제공하는 내용을 실습해보신다면 더욱 알찬 시간이 될 수 있을 것 같습니다.

[튜토리얼 링크]


그럼 오늘 포스팅은 여기서 마치도록 하겠습니다. 읽어주셔서 감사합니다! :)


본 포스팅은 2020년 삼성SDS Brightics 서포터즈 1기 활동의 일환으로 작성된 포스팅입니다.

반응형