[공학적 의구심]
미래에 지속적으로 이슈화될 주제는 무었이 있을까? 바로 미세먼지 일것이다. 미세먼지는 어느덧 지역 상권, 부동산에도 영향을 미칠 정도다.
공기가 좋은것이 마켓팅에 일환이 될 정도
그럼 우리나라에서 국민들을 괴롭히는 미세먼지는 모두 중국 때문일까?
국립환경과학원이 2019년에 발표한 바에 따르면 아래 사진처럼 우리나라 미세먼지 원인 중 50% 이상이 국내에서 발생되는 미세먼지 때문이라고 한다.
- 왜 지역마다 미세먼지 지수가 다를까?
- 국내 한정 어떤 특징 들이 국내 미세먼지 발생에 영향력을 가지고있을까 ?
- 앞으로 국내 미세먼지 동향은 어떻게 변화할까?
- 이런 동향은 국내 지역 부동산 시장에 많은 영향을 미칠까?
라는 공학적 의구심을 가지고 연구를 해보고자 한다.
[공학적 해결]
K-MEANS 클러스터링 , 선형회귀분석 , 로지스틱 회귀분석을 가지고 분석 및 결론 도출
[파생효과]
- 거주 지역의 대기질 전망과 대기질 위협 요인 을 제공함으로써 사용자들의 거주 지역 선정에 도움을 줄수있다.
- 거주 지역과 거주 공간의 규모 경재력 등 다양한 특징에 따라 적합한 집안 공기 케어 방법을 제시하고 각종 상품들을 연계할 수 있다.
LG퓨리케어를 구매할 경재력이 없는 학생들에겐 스파티필름 등 정화식물제품을 추천하고
거주 공간 규모와 거주지역 대기 전망에 따라 몇개의 상품이 필요한지 어떻게 관리하는지 정보 제공
PYTHON: K-means , 선형회귀 분석 , 로지스틱 회귀분석
spring boot
flask
vue.js
MySQL
1. K-means 분석파트
미세먼지 농도 별로 시단위로 군집화
미세먼지 농도 별로 도단위로 군집화
미세먼지 농도 별로 구단위로 군집화
가장 적합한 분할 단위 선택 (단위가 디테일할수록 베스트) [발표 포인트]
2. 로지스틱 회귀 분석 파트
x는 영향을 미칠만한 속성들 50가지+a 선별 (최대한 많이)
어떤 속성이 영향력이 큰지 알아보는게 목적이기 때문
y는 미세먼지 등급 (좋음 0 보통 1 나쁨 2 매우나쁨 3)으로 설정
로지스틱 회귀 분석
회귀 결과로 어떤 속성이 영향력이 높은지 확인 [발표 포인트]
영향력 높은 데이터만 뽑아서 간략하게 로지스틱 회귀
이전 회귀 결과와 정확도가 유사한지 확인 [발표 포인트]
3. 선형회귀 분석 파트
영향력 높은 데이터만 가지고 동일하게 다중 선형회귀를 돌린다.
4. 결과 정제 파트
로지스틱
각 구 별로 대표 데이터 선별
대표 데이터 회귀 공식에 input
도출된 점수(0 or 1 or 2..) 와 속할 확률을 리스트로 저장 (이를 result라고 칭한다.)
선형회귀
대표 데이터를 선형회귀 추세선 공식에 넣어 전망을 예측한다.
미세먼지는 상한이 존재함으로 상승세일지 하양세일지만 알려주도록 한다. (이를 result라고 칭한다.)
5. 서비스 파트(서버)
서버는 2분할 혹은 3분할 구조로 만든다. (2분할을 가정해서 설명)
머신러닝 서버 와 MVC 서버로 만든다.
머신러닝 서버는 OpenAPI로 부터 받은 json을 dataframe으로 만들어준다.
csv가 아닌 OpenAPI로 부터 받아오는 이유는 데이터는 향후 새롭게 축적될 데이터를 고려해 어플리케이션 데이터 업데이트가 필요할때
자동으로 받아와 별도의 코드수정없이 정재과정을 거칠수있도록 하기위해
...딥러닝 중략....
MVC서버는 결과로 나온 result 리스트를 머신러닝 서버로부터 받아온다.
result를 자신의 서버에 저장해둔다. (캐시데이터)
캐시데이터는 유효기간이 존재한다. (1년 단위 계획중: 공공데이터가 충분히 쌓이면 결과가 바뀜으로)
일정 기간이 지나면 머신러닝서버로부터 캐시데이터를 다시 받아온다.
그전까지는 모든 요청은 자신이 가지고있는 result에서 빠르게 답변한다.
요청은 지역과 집 평수를 받는다. (사용자 자유입력이 아니라 버튼으로 해서 json 규격을 제한해 parsing 필요없게 한다.)
응답은 해당 지역의 위치 점수와 전망 그리고 추천 제품들을 출력한다.
spring boot
-
캐싱
-
AOP: 캐시로직 - 핵심 로직으로 부터 분리
-
MVC
-
창업팀에서 vue로 핸들링 도와줄수있으면 이것도 restAPI로 변경
-
캐싱을 하는 이유는 머신러닝은 괭장히 무겁기때문에 매 요청마다 처리하면 서버 부하가 심해져 트래픽을 감당할수없다.
분리 해두고 필요할때만 새롭게 받아오는 방식으로 설계하는게 옳다.
-
이 경우엔 새롭게 데이터가 적재되어 머신러닝 결과가 변할가능성이있는 경우 캐시데이터를 업데이트한다.
간격은 1년 단위로 계획중
-
머신러닝을 이용해서 요청 응답을 처리함으로 서버는 응답에 많은 리소스를 이용하는 편이다.
-
따라서 트래픽이 몰리는 경우 서버에 부하가 걸릴 위험이 있다.
-
Spring WebFlux를 도입해 기존의 blocking I/O 방식의 처리에서 Asynchronous Non-blocking I/O 처리 방식으로 바꿔서 적은 Thread로도 트래픽을 감당하도록 설계할것이다.
flask
- REST API
- 머신러닝을 돌리고 그 결과로 나온 지역별 점수와 확률을 return한다.(json data format)
- 동적코딩기술(like java reflection)을 이용해 중복을 최소화하고 유지보수 효율을 극대화한다.
- 캐싱개념을 응용하여 cashe storage(DB)에 API로 받아온 데이터들을 파일로 유지한다.
- 위와같이 하는 이유는 API요청만 300개 이상( KOSIS 서버에 통계데이터가 쌓임에 따라 추후 계속 늘어날예정)임으로 그때그때 데이터를 불러오기엔 서버 부하와 리소스 낭비가 심하다. (모든 응답 파싱시간만 3분이상 소요됨)
- 갱신이 필요할때만 API요청을 다시한번 보내서 cashe storage(DB)를 갱신하고 그렇지 않을때는 cashe storage(DB)의 데이터를 가지고 작업을 수행한다.
pandas_readcsv는 해당 csv파일을 데이터 프레임으로 만드는 역할을 한다.
줄여서 df라고 부르겠다.
pandas를 이용해 df를 수정할수있다.
다른 df와 합치기, 값 변경 등등
즉, 서버가 할 일은 공공 API로 부터 받아온 필요한 json data를 df로 바꿔주기만 하면된다.
df 정제 담당자가 df를 우리가 분석하는 목적으로 정제한다.
분석 담당자가 df를 가지고 시각화 및 result를 return한다.
기존 데이터 들로 로지스틱 회귀분석 및 학습시켜 하나의 공식을 갖게한다.
x 축: 성별 월급 나이
y축: 등급
- 위 과정에서 어떤 속성(x) 가 가장 y에 영향력 있는지도 알수있다.
- 영향력 있는 속성들로만 이후에 작업을 수행해도 비슷한 결과가 나온다.
이후 어떤 데이터가 삽입되었을때 그 데이터는 어디 범주에 속하는지 결과를 알아볼수있다.
input: [1, 200, 23] //성별 월급 나이 output: 1 or 2 or 3 .. 범주형 데이터