• 검색 결과가 없습니다.

환경오염 예측 알고리즘: 녹조 오염도 예측

구분 파일 내용

분석결과 재생

P_TFIDF=ggarrange(P_NAVTFIDF,P_METFIDF,ncol=2,nrow=1) ggsave(file="P_TFIDF.png",P_TFIDF)

```

![**TF_IDF 키워드 순위 비교**](P_TFIDF.png)

분석결과 해석

이와 같은 경향은 TF_IDF 값이 높은 20개의 키워드를 추출하여 비교하여도 확인된다.

Figure 2는 TF_IDF를 기준으로 추출한 상위 20개 키워드의 TF_IDF 값을 보여준다.

Figure 2에서도 ‘대형마트’, ‘비닐봉투’, ‘쓰레기’, ‘폐기물’과 같은 키워드는 NAVER 뉴스에서만 찾아볼 수 있고, ‘흰꼬리수리’, ‘갈매기’, ‘조류’, ‘멸종위기’, ‘신차’, ‘화물차’와 같은 키워드들은 환경부 문건에서만 찾아볼 수 있다.

자료: 저자 작성.

<표 5-1>의 계속

2022년 10월 현재 환경 텍스트 분석 알고리즘이 생산하는 정보 중 뉴스레터에 반영된 정보는 환경 텍스트 키워드의 분포, TF_IDF 값 그리고 키워드 네트워크이다.

제5장 환경 빅데이터 플랫폼 뉴스레터 개발 ∣ 71

synoptic observing system)에서 제공하는 기상정보를 입력자료로 이용한다. 이 알고리 즘은 8일간의 과거 실측치를 사용하여 1일 후의 수질오염도를 예측한다. 알고리즘은 python으로 구축되어 있으며 Prediction.ipynb라는 jupyter notebook 파일 형태로 관 리되고 있다. 현재 이 예측 알고리즘은 2015년 4월 1일부터 2018년 12월 31일 동안의 자료를 사용하여 파라미터 값을 학습해 놓은 상태이다.

파라미터 값이 학습되어 있기 때문에 입력자료만 갱신되면 1일 1회 익일 클로로필-a 예측치 도출이 가능하다. 그런데 데이터 수집의 자동화 및 전처리의 자동화는 아직 작업이 필요한 상황이다. 기상청 종관기상관측 시스템에서는 1일 전 측정치까지 수집이 가능하지 만 수질오염 자동측정망에서는 수질오염도 확정치를 2개월 전의 값만 제공하고 있다. 이들 자료들은 직접 다운로드하거나 API 서비스를 이용하여 수집 가능하다. 반면 수질오염 자동 측정망에서는 최근 2개월 이내의 수질오염도 미확정치를 조회만 할 수 있는 형태로 제공하 고 있다. 따라서 최근 2개월 이내의 수질오염도 측정치를 수집하기 위해서는 웹 스크래핑 기법을 사용해야 한다. 2022년 현재 기상청 측정치 및 2개월 이내의 수질오염 측정치를 API 서비스를 이용해서 수집하는 프로세스는 자동화되어 있지 않다. 그리고 최근 2개월 수질오염 측정치를 수집하는 웹 스크래핑 프로세스 역시 자동화되어 있지 않다.

수집이 자동화된다고 해도 많은 경우 수집된 자료는 결측치가 존재하기 때문에 보간작업이 필요하다. 그리고 수질측정소와 기상측정소가 공간적으로 일치하지 않기 때문에 개별 수질측 정소에서 사용하는 기상측정소 자료는 거리에 따른 보정이 필요하다. 2019년 알고리즘 구축 당시에는 수질 자동측정망 수질오염 추정치 보간은 kalman filter를 이용하였고, 거리에 따른 보정은 Inverse Distance Weighting(IDW)을 이용하였다. 2022년 6월 현재 IDW를 수행하 는 python 프로그램을 구축하여 기상자료의 거리 보정에 사용하고 있다. 그리고 결측치 보정 역시 동일 측정소의 과거 값을 이용하는 Kalman filter 방식보다는 인근 측정망의 추정치를 이용하는 IDW를 활용하고자 하였다. 현재 IDW는 “IDW를 활용한 기상 데이터 보간.ipynb”

라는 jupyter notebook 파일에 python으로 구현되어 구동이 가능한 상태로 유지되고 있다.

2022년 10월 현재 녹조 예측 알고리즘 분석결과를 전달하는 뉴스레터 역시 R 마크다운 언어로 작성한 algeapred_0824.rmd 파일 형태로 관리되고 있다. 환경 텍스트 정보추출 관 련 뉴스레터와 유사하게 분석결과 정보를 전달하는 부문은 R coding을 이용하여 문서 작성

시마다 갱신되도록 하였고, 결과에 대한 해석을 전달하는 부분은 연구자가 작성하도록 하였 다. algeapred_0824.rmd 파일을 컴파일하면 html 파일 형식의 뉴스레터인 algearpred_

0824.html이나 pdf 파일 형식의 뉴스레터인 algearpred_0824.pdf 파일이 생성된다.

구체적으로 녹조 예측 알고리즘인 Prediction.ipynb는 예측치를 CSV 파일인 y_predicted.

csv 파일로 출력한다. algeapred_0824.rmd에서 예측결과를 재생하는 부분은 예측결과인 y_predicted.csv를 읽어들이고, 읽어들인 결과로부터 클로로필-a 예측치가 25㎍/m3 이상이 어서 녹조 농도가 높다고 예측되는 측정소를 추출한다. 그리고 추출한 측정소에 대한 정보를 표의 형태로 제공하고, 해당 측정소의 위치와 오염도 예측치 수준을 지도에 표시한다. 이 부분 은 R coding으로 작성되어 문서를 컴파일할 때마다 자동적으로 갱신된다. 반면, 예측결과를 해석하는 부분은 텍스트로 작성되어 연구자가 별도로 작성하여야 한다. 단, 예측결과를 작성하 는 내용 중 예측결과를 재생하는 부분이 포함될 경우, 그 부분은 R coding으로 작성하여 자동 적으로 갱신되게 하였다. <그림 5-2>는 algeapred_0824.pdf 중 예측결과를 전달하는 부분과 예측결과를 해석하는 부분을 보여준다. <표 5-2>는 algeapred_0824.rmd 파일에서 <그림 5-2>

를 출력하는 부분이다. <표 5-2>에서 ‘예측결과 해석’에 해당하는 내용 중 ‘r dim(WARNINGSPOT)[1]’,

‘r dim(WARNING_NACDONG)[1]’, ‘r dim(WARNING_NACDONG_BO)[1]’는 예측결과의 일부를 재생하는 부분이다.

자료: 저자 작성.

<그림 5-2> 녹조 예측 알고리즘 뉴스레터 구성(예시)

제5장 환경 빅데이터 플랫폼 뉴스레터 개발 ∣ 73

구분 파일 내용

예측결과 재생

```{r predictionday,echo=FALSE}

Rdate="2018-08-15"

WARNINGSPOT=Pred_CH %>% filter(date=="2018-08-15") %>%

filter(ChloA_P>25,BigError=="NO") %>%

select(c("Kname","RiverLake","WaterR","WARN_WS","WARN_BO","ChloA_P"))

%>% arrange(WaterR,desc(ChloA_P))

colnames(WARNINGSPOT)=c("측정소","하천/호소/보","수계","상수원","보","예측치") WARNINGSPOT_WS = Pred_CH %>% filter(date=="2018-08-15") %>%

filter(ChloA_P>25,WARN_WS=="YES",BigError=="NO")

WARNINGSPOT_BO = Pred_CH %>% filter(date=="2018-08-15") %>%

filter(ChloA_P>25,WARN_BO=="YES",BigError=="NO")

```

```{r Report1,echo=FALSE}

kable(WARNINGSPOT)

```

```{r Reportmap,echo=FALSE,include=FALSE}

WARNINGSPOT_LOC=left_join(WARNINGSPOT,STATIONINFO,by=c("측정소"="

Kname"))

map=readOGR("./CTPRVN_20220324/ctp_rvn.shp")

ls_crs = list(wgs84="+proj=longlat + ellps=WGS84 +datum=WGS84 +no_defs") map = spTransform(map,CRSobj=CRS(ls_crs$wgs84))

df_map = fortify(map)

df_map = df_map %>% filter(id!="16") p=ggplot(data=df_map,

aes(x=long,y=lat,group=group))+

geom_polygon(fill="#FFFFFF", color="#000000",

linetype=0)+ # dotted line geom_point(data=WARNINGSPOT_LOC,

aes(x=Longitude,y=Latitude,size=`예측치`), inherit.aes = FALSE) +

geom_text(data=WARNINGSPOT_LOC, aes(x=Longitude,y=Latitude), label=WARNINGSPOT_LOC$`측정소`, nudge_x=0.4,

inherit.aes = FALSE)+

<표 5-2> 녹조 예측 알고리즘 뉴스레터 algeapred_0824.rmd 파일 내용

구분 파일 내용

예측결과 재생

` labs(size = "클로로필_A 예측치",x="",y="",title="녹조 위험 예고 지역") + theme(axis.ticks.x=element_blank(),

axis.text.x=element_blank(), axis.ticks.y=element_blank(), axis.text.y=element_blank())

```

```{r Reportmap2,include=FALSE}

ggsave("Highchol_P.png",p)

```

![녹조 위험 예고 지역](Highchol_P.png)

예측결과 해석

```{r ReporNacdong,echo=FALSE}

WARNING_NACDONG=WARNINGSPOT %>% filter(`수계`=="낙동강")

WARNING_NACDONG_BO=WARNINGSPOT %>% filter(`수계`=="낙동강") %>%

filter(`보`=="YES")

```

지도에서 알 수 있듯이 녹조 농도가 높다고 예측되는 측정소는 낙동강 수계에 집중적으로 분포하였다. 녹조의 농도가 높을 것으로 예측된 ‘r dim(WARNINGSPOT)[1]’개 측정소 중 ‘r dim(WARNING_NACDONG)[1]’개 측정소가 낙동강 수계에 위치하였다. 그리고 그중 ‘r dim(WARNING_NACDONG_BO)[1]’개 측정소가 보에 설치된 측정소였다.

자료: 저자 작성.

<표 5-2>의 계속