개인(팀) 프로젝트/기타 프로젝트 & 활동

01. 전주시 빅데이터 분석 공모전 - 우수상 수상!

한소희DE 2021. 6. 1. 02:35

안녕하세요 한소희입니다. 공부를 통해 배운 내용을 작성하고 있습니다. 혹여 해당 포스팅에서 잘못된 부분이 있을 경우, 알려주시면 빠르게 수정 조치하도록 하겠습니다. 감사합니다.

 

 

 

 

 

목차
참여 계기
준비 과정
데이터 분석 과정 - 서비스 구현 계기
사이트 개발 과정
결과
아쉬웠던 점
해당 프로젝트를 통해 배운 점이 있다면?
(추가) 심사 결과 - 우수상!

 
 
 


 
 

1. 참여 계기

 
우연히 길을 가던 중, 편의점 앞에 유기된 비글 두 마리를 보았다. 어떤 한 아저씨께서 이 아이들을 발견하여 어쩔 줄 모르는 상황이었고, 구청에 신고를 해서 기다리고 계셨다.
 
그러던 중, 아저씨는 내게 "당근 마켓에는 주인 찾는 글 올렸는데, 아가씨가 다른 곳에다가도 좀 올려 주세요."라고 하더라.
 
강아지 3마리를 키우는 입장에서, 포인 핸드라는 유실 유기동물 실종 사이트가 있다는 것을 알고 있었지만, 아저씨는 모르는 듯했다. 그래서 내가 부랴부랴 포인 핸드를 깔았지만, 인증 절차가 매우 까다로워 결국 올리지 못했다. 업로드를 하려 하면 에러도 났다. (자꾸 인증 오류가 나고 이것 저것 인증 절차가 복잡했다.)
 
그래서 나는 어쩔 수 없이 인스타그램, 페이스북에 주인 찾는 글을 올렸는데, 그러던 문득, 유실유기동물 실종 신고, 대시보드가 정말 많기 때문에, 내가 강아지를 잃은 주인이라면 실종 글 찾기에도 참 난감할 것 같다는 생각이 들었다.
 
 
누구는 당근마켓에, 누구는 페이스북에, 누구는 인스타그램에... 어휴 실종 동물 가족이라면 골머리를 꽤나 앓을 것 같았다.
 
이 경험은 내게 '특정 지역 사람들끼리는 약속을 해서 실종 신고 혹은 유실 유기동물 관련 게시물을 지정된 한 플랫폼에만 올려 공유했으면 좋겠다'는 생각이 들게끔 하였다. 
 
 

 
 
 


 
 
 
이 생각을 시작으로, 서비스를 머릿속으로 기획하던 중 우연히 전주시 분석 공모전을 발견했고, (전주 사람은 아니지만) 전주시만의 유실유기동물 관련 사이트를 만들어보면 좋겠다는 생각이 들어 참여했다. (물론, 해당 아이디어의 타당성 등은 아래 준비과정에서 자세히 검토하였다.)
 

나는 디자인 감각이 좋은 대학 동기 쬰에게 협업을 제안하였고, 나의 미적 감각을 보완해줄 든든한 지원군과 함께 프로젝트 준비에 박차를 가했다.
 
 
 


 

02. 준비 과정

2-1. 시장 조사
 

제일먼저 진행한 건 시장조사였다. 
아무래도 생활 속 불편함에서 나온 기획이었으므로, 이 아이디어를 구체화해야 한다는 논리적 타당성이 필요했기 때문이다.
 
따라서 난 쬰과 함께 매주 금요일 오후 11시 30분부터 새벽 2시까지, (혹은 그것보다 더 길게) 시장 조사를 마친 뒤 회의를 했다.
 

시장조사 정리
1. 전북 지역, 유기동물 1년 새 1000여 마리가 증가하는 증가 추세
2. 전주시는 유기동물 관련 정책 예산을 높게 책정해 운영 중
3. 그러나 전주시는 예산 내로 동물보호센터 설립이 현재 불가능
4. 현재 동물병원 10개소에서 유기동물을 관리하고 있고, 1일 당 관리금을 동물병원에 지원 (소비 큼)
5. 또한 유기동물 입양률 증대 정책을 위해 미용비/의료비 최대 15만 원 지원정책 운영 중(2021년~)

👉🏻 효율적인 예산 사용을 위해, 현안을 효율적으로 해결할 수 있어야 함

 
 

2-2. 문제 정의
 

 
시장 조사를 하며 정의한 문제는 아래와 같다.

1. 유기동물 입양에 영향을 미치는 주요 요인 도출
2. 주요 요인 문제 해결을 위한 서비스 구현

 
그래서 우리는, 공공 API 데이터를 갖고 데이터 분석을 수행해보기로 했다. 입양에 가장 많은 영향을 미치는 요인을 찾아 해결할 수 있을만한 서비스를 구현해보기로 했다.
 


 

03. 데이터 분석 과정 - 서비스 구현 계기

 
데이터 엔지니어링을 중심으로 서비스를 설명할 예정이므로, 이 부분은 매우 간단하게 설명하도록 하겠다.
 
농림축산 식품부 농립 축산검역본부_동물보호관리시스템 유기동물 조회 서비스 OPEN API를 활용했다.
데이터는, 전주시의 유실 유기동물 데이터 2018년 3월부터 2021년 3월까지의 만 3년 데이터를 수집했다.
 
그 후 데이터 전처리를 수행 후 텍스트 마이닝, 데이터 분석, 모델링(랜덤 포레스트 사용)을 수행했다.
 
그 결과, 입양을 결정짓는 주요 요인이 관리소, 품종, 나이, 무게, 공고일이라는 것을 알 수 있었다.
※ 여기서 관리소는, 유기동물이 보호되고 있는 동물병원 10개소를 뜻한다.
 
나이, 품종, 무게 등도 입양률에 영향을 미치는 주요 요인이지만 이는 우리가 통제할 수 없는 요소이므로 통제할 수 있는 요소(관리소)를 해결해 입양률을 높여야 한다는 결론을 내었다.
 
우리들의 결론은 아래와 같다.
 

통제 가능요인인 '관리소'의 한계를 해결할 수 있는 서비스 제작이 필요하다.

관리소 종류마다 입양률의 차이가 있는 것은, 오프라인 시설마다의 특징(위치나 인프라 등)도 입양에 영향을 미치는 것으로 보인다. 관리소가 통합되면 가장 좋겠지만, 이는 현 예산 내에서 해결할 수 있는 문제가 아닐 수 있으므로 대안책을 찾아야 한다.

따라서 모든 유기동물들을 오프라인 특성의 한계 없이 입양 기회가 주어질 수 있도록, 온라인을 통해 시민들에게 유기동물을 많이 노출시키는 것이 관건이 된다고 판단, 유기동물 현황을 시각화&전주시에 유기된 동물을 접근하기 쉽게 볼 수 있는 홈페이지를 구현해보아야겠다는 목표를 가졌다.

 

 


 

04. 사이트 개발 과정

 

4-1. 요구사항 정의

 
우리는 실시간 대시보드를 제작하기로 했다. 요구사항은 아래와 같다.
 

1. 유기동물 현황(입양현황, 유기 현황 등)을 실시간으로 구현한다.
👉🏻 기대효과: 전주시민에게 유기 현황을 보여줌으로써, 주민들로 하여금 심각성 & 입양의 필요성을 인지

2. 전주시에 접수된 유기동물을 온라인으로 간편하게 볼 수 있도록 구현한다.
👉🏻 기대효과: 오프라인의 한계를 허물어, 모든 유기동물에게 오프라인 특성의 한계 없이 입양 기회 제공

 
 

세부 요구사항은 아래와 같다.
 

[데이터 요구사항]
전주시 최근 30일 간 접수된 유실유기동물 수 실시간 집계
Flask + SqlAlchemy를 이용. 사용자가 Heroku에 배포된 웹사이트를 열면 Open API가 자동 실행되어, DB에 최근 데이터가 추가되도록 설계. (filter 쿼리 활용)

이렇게 업데이트된 DB값을 집계해 시각화하도록 설계
[데이터 요구사항]
전주시 최근 30일 간 접수된 유실유기동물 입양 수 실시간 집계
[데이터 요구사항]
전주시 월별 유실유기동물수 누적 대시보드 구현
[기능 요구사항]
전주시에 접수된 유기동물들을 볼 수 있는 사이트 확보
정부에서 제공하는 유실유기동물 사이트 중, 전주시 유실유기동물 페이지를 링크로 웹사이트에 연동
[기능 요구사항] 로그인 기능  
[기능 요구사항] 회원가입 기능  
[기능 요구사항] 웹사이트 전용 일러스트 제작  

 
 
 
 
4-2. 프로젝트 기획/구현
 

기능을 다 정의했으면, 이에 따르는 SRS를 간단하게 작성해 기획해보았다.
 
 
그 후, 부트스트랩 중 마음에 드는 부트스트랩을 가져와, FLASK 개발을 진행했다.
Open API 한 개를 가져와 연동하는 것이므로, DB설계도 큰 무리가 없었다. 다만, 가입목적을 따로 정의하도록 설계했다.
 
 
 
 
프로젝트 구현 결과

 

 


 

05. 결과

 
결과는 아래 영상으로 보면 된다. 프로젝트 결과 발표의 일부를 발췌한 영상이라, 마지막에 내 목소리가 조금 잘렸다 ㅎㅎ;;

 

 


 

06. 아쉬웠던 점

 
1. 중간 테이블의 중요성
데이터 엔지니어링의 첫 시작이었던 것을 감안하지 않고 본다면, 데이터의 무결성과 안정성을 고려하지 않은 파이프라인 설계였으므로 상당히 불안정하다고 생각한다. (물론 이것을 처음 진행할 당시에는 생각하지 못한 부분이지만, 이 이후로 더 공부하며 이런 인사이트가 생겼다.)
웹사이트를 열 때마다, API가 실행되어 새로 생성된 데이터들이 PostgreSQL에 집계되고, 그 데이터들을 SQL 명령어로 집계해 대시보드화 하는 과정이 생각보다 매우 느렸다. 대시보드를 다 제작하고, 과정을 적는 이 시점에서 생각한다면, 중간에 데이터가 유실될 까 봐 걱정되기도 하고(데이터 추가 방식은 ※데이터 유실 가능성이 있으므로 좋지 않다.), 안정적인 프로세스가 아니라고 느껴진다.
따라서, 데이터 아키텍처를 제대로 설계해서 보완해야겠다고 생각했다. 
 
 
※ 데이터 추가 방법의 단점은 아래 게시물에 작성했다.
https://eng-sohee.tistory.com/34

 

03. 빅데이터의 분산 처리

이번에는 시각화에 적합한 데이터 마트를 구축하는 것을 목적으로, 분산 시스템에 의한 데이터 처리의 기본적 흐름에 관해 설명해보겠다. 새로운 개념이 화수분처럼 쏟아지고, 유사한 개념이

eng-sohee.tistory.com

 
※ 이번 교훈을 통해, 해상물류 프로젝트는 중간테이블을 설계할 예정이다.
https://eng-sohee.tistory.com/52

 

05. 데이터 엔지니어링 - 수집 요구사항 및 수집 파이프라인 정의

나는 해당 프로젝트에서 데이터 엔지니어링을 맡았다. 내가 할 역할은 아래 WBS 중에서도 Data Processing 파트다. (데이터 엔지니어 꿈나무 🙋🏻‍♀️🙋🏻‍♀️) ⬇ 우리 팀의 WBS 링크 https://eng-

eng-sohee.tistory.com

 
 
2. 동물 사진을 직접 끌어 와, 홈페이지 내에서 볼 수 있도록 구현하지 못한 점
이 부분은 시도하려다, 시간이 없어 진행하지 못했다. 결국 링크를 통해, 동물들을 볼 수 있도록 설계했다. 
시간이 확보된다면, 이 부분도 다시 재구성하고 싶다.
 
 
3. 더 많은 데이터 시각화 대시보드를 만들고자 하는 아쉬움
예측 모델링 자료를 시각화하거나, 여타 통계치 값을 시각화해 더 의미 있는 자료를 전달하는 페이지로 보완해보고 싶다는 생각이 들었다.
 
 
4. 도커(Docker) 사용의 필요성
도커가 이렇게 간절해질 줄 몰랐다. 혼자 개발하는 것이 아니라 쬰에게 상황을 공유하고 함께 보완해나가고 싶어도, 개발환경이 다르다 보니 정말 많이 애를 먹었다. 이 프로젝트를 하며 도커의 필요성을 절실히 느꼈고, 그래서 현재 도커 공부를 하고 있다.
 
 
 


 

07. 해당 프로젝트를 통해 배운 점이 있다면?

 
이번 프로젝트는 내가 공공 데이터 API를 연동해 본 첫 경험이었다. FLASK를 배워 만든 첫 사이트고, SQLAlchemy도 처음 써봤다. (이제껏 데이터는 csv 파일로 받아서 쓰기만 했었는데, 이번 프로젝트를 하면서 데이터 소스를 끌어온 경험을 해봤다..ㅎㅎ 너무 신기했고 재밌었다.)
 
그리고, 내 첫 대시보드 제작이었다. 지금 보면 되게 단순하고 부족한 점이 많은 대시보드지만, 이것을 처음 설계하면서 나름 많은 고민을 했었다. 이런 과정이 있었기에 지금의 내가 더 발전한 것이 아닌가라는 생각이 든다. 지금도 많이 부족하지만, 많이 성장하려고 노력하고 있다.
 
무엇보다도, 데이터 엔지니어에 대한 확신을 얻게 해 준 프로젝트였다.
데이터 엔지니어라는 직업에 더 흥미가 생겼고, 조금 더 성장해 전문성을 얻고 싶다는 생각을 들게 해줬다. 무엇보다 밤을 새워가며 공부하고 구현하는 작업임에도 이렇게 즐거울 줄 몰랐다.
 
 
 
 
이제 결과 발표만을 남기고 있는 이 프로젝트, 열심히 준비한 만큼 좋은 결실을 맺었으면 좋겠다!
 
 
 
 


 
 

08. (추가) 심사 결과 - 우수상!

 
2021년 06월 30일, 결과 발표가 나왔다. 
 

 
두구두구두구~! 우리 팀은 2등(=우수상)을 수상했다.
의미 있는 아웃풋이라고 인정을 받은 것 같아, 매우 뿌듯했다.
사실은 돌아보니 부족하다고 생각되는 부분이 많았는데, 그 부족한 부족한 점을 보완해서, 서비스를 개선해보고 싶다는 생각이 든다.
 
 
어떻게 개선해보고 싶은가?
현재 진행 중인 프로젝트가 마무리되면, 아쉬운 점을 보완해 개선해보고 싶은 마음이 크다.

  1. 적어도, Airflow나 Cron을 이용해 웹사이트 데이터 크롤링 워크플로를 자동화해보고 싶다.
  2. 또한 데이터 집계되는 공간을 MondoDB에서 GCP BigQuery로 바꾸고 싶다. (이유는 파티셔닝하기가 매우 용이하기 때문이다.)
  3. 또한 대시보드에 구현하는 결과물을 보다 유용하면서도 고도화하여 개선하고 싶다.
  4. 그리고, Lambda 를 이용해 서버리스 웹으로 변경해보고 싶다.
  5. 마지막으로, FLASK 앱 구현 시 부트스트랩 없이 구현해서 앱으로 만들고 싶은게 최종 목표다... 

 
앎이 조금씩 깊어지고 넓어질수록, 부족했었다는 것을 깨닫는 요즘이다.
 
내게 좋은 상을 주셨음에 깊은 감사를 표하며, 포스팅을 마무리하도록 하겠다!