Project

[데이터분석 미니프로젝트] - 수질 정보 데이터 전처리

s2h15 2023. 12. 7. 20:39
728x90

 

국가 통계 포털에서 가져온 해수 수질 실태 보고 데이터를 바탕으로 데이터 전처리

https://kosis.kr/index/index.do

 

KOSIS 국가통계포털

내가 본 통계표 최근 본 통계표 25개가 저장됩니다. 닫기

kosis.kr

 

연근해 , 항만 , 환경관리해역 환경측정망의 2013-2022 년의 데이터를 사용하였다.

아래 엑셀 표와 같이 제일 위에 년도별로 나누어져있고 행은 지역별(항만/해역명)로 나뉘어 있으며 총 12개의 수질 정보 내역이 나와있는 데이터였는데 이를 년도별로 수질의 변화를 비교하고자 데이터 전처리를 하였다.

 

pandas 라이브러리 정의 후 파일을 읽어들였다.

df = pd.read_csv("./data/수질현황(2013-2022)/연안수질현황_환경관리해역_환경측정망(2013-2022).csv", encoding="euc-kr")
df
df_temp = pd.DataFrame()
df_temp = df.iloc[1:,:3]
df_temp

앞의 세 컬럼(해역구분, 연안구분명 , 층별구분) 을 df_temp에 넣어줬다.

각각의 년도 데이터에 합칠때 이 세 컬럼을 합친 상태로 행단위로 합칠것이기 때문에 필요하다.

df_temp1 = pd.DataFrame()
df_temp1 = df.iloc[1:,:15]
df_temp1["년도"] = "2013"
df_temp1.columns =  ['해역구분(1)', '연안구분명(1)', '층별구분(1)', '수온Temp. (℃)', '염분Sal',
                     '수소이온농도pH', '용존산소량DO (㎎/ℓ)', '화학적산소요구량COD (㎎/ℓ)',
                     '클로로필Chl-a (㎍/ℓ)', '총질소TN (㎍/ℓ)', '용존무기인DIP (㎍/ℓ)', '총인TP (㎍/ℓ)',
                     '규산규소 Si(OH)4 (㎍/ℓ)', '부유물질SPM (㎎/ℓ)', '용존무기질소DIN (㎍/ℓ)','년도']
df_temp1

우선 지역명과 2013년의 데이터만 가지는 df_temp1을 생성하였다.

 

df_tot = df_temp1
for i in range(1,10):
    df_temp3 = pd.DataFrame()
    df_temp3 = df.iloc[1:,i*12+3:(i+1)*12+3]
    df_temp3["년도"] = f"20{i+13}"
    df_temp3 = pd.concat([df_temp , df_temp3],axis=1,ignore_index=False)
    df_temp3.columns =  ['해역구분(1)', '연안구분명(1)', '층별구분(1)', '수온Temp. (℃)', '염분Sal',
                         '수소이온농도pH', '용존산소량DO (㎎/ℓ)', '화학적산소요구량COD (㎎/ℓ)',
                         '클로로필Chl-a (㎍/ℓ)', '총질소TN (㎍/ℓ)', '용존무기인DIP (㎍/ℓ)', '총인TP (㎍/ℓ)',
                         '규산규소 Si(OH)4 (㎍/ℓ)', '부유물질SPM (㎎/ℓ)', '용존무기질소DIN (㎍/ℓ)','년도']
    df_tot = pd.concat([df_tot,df_temp3],axis=0,ignore_index=True)
df_tot

2014년부터 2022년까지 for문을 통해 concat으로 데이터를 통합하였다.

열단위 합치기로 앞서 저장해둔 df_temp와 데이터를 합친 뒤 

년도별 데이터를 행단위로 합쳤다.

 

df_tot.to_csv("./datapre/수질_환경관리해역.csv",index = False)

이를 새로운 csv 파일로 저장한다.

 

데이터 프레임상으로 1150개 행으로 이루어진 통합데이터를 확인할 수 있다.

 

수질의 년도별 변화를 확인하여 시간의 흐름에 따라 어떠한 변화가 생겼는지 알아보고자 한다.

우선 해양 수질 평가 기준은 수질 평가 기준으로 계산한 값을 사용하는데 그 계산 방법은 다음과 같다.

 

수질평가 지수(WQI, Water Quality Index)
 - WQI 계산방법 : 10×[저층산소포화도(DO)]+6×[(식물플랑크톤 농도(Chl-a)+
투명도(SD))/2]+4×[(용존무기질소(DIN)+용존무기인(DIP))/2]

 

여기서 투명도 측정값 데이터의 부재로 나머지 요소들의 측정데이터의 평균을 년도별로 시각화하였다.

 

우선 전체 데이터에서 필요한 데이터만 추출하여 데이터프레임 df_temp2에 저장하였다.

df_temp2 = pd.concat([df["년도"],df["용존산소량(DO)"]*1000,df["화학적산소요구량(COD)"]*1000,df["클로로필(Chl-a)"],df["용존무기인(DIP)"],df["용존무기질소(DIN)"]],axis=1)
df_temp2 = df_temp2.groupby(["년도"],as_index=False).mean()
df_temp2

 

단위를 ㎍/ℓ 로 맞추기위해 ㎎/ℓ 단위인 요소의 데이터값에 1000을 곱한 데이터를 넣었다.

fig, ax = plt.subplots(figsize=(8,6))
for i in df_temp2.columns[1:]:
    ax.plot(df_temp2["년도"] , df_temp2[i],label = i)
ax.set_title("년도별 수질정보")
ax.legend()
ax.set_xlim(2013,2022)
plt.xlabel("년도",fontweight = "bold")
plt.ylabel("오염물질 농도(㎍/ℓ)",fontweight = "bold")
plt.show()

요소마다 값의 크기 차이로 인해 값이 적은 요소는 거의 평이한 모습으로 나타나는것을 확인할 수 있다.

 

따라서 각 요소마다 따로 그래프를 만드는 방법이 수질의 변화를 보여주기에 적합하다고 판단하여 subplot을 만들었다.

 

df_temp3 = pd.concat([df["년도"],df["용존산소량(DO)"]*1000,df["화학적산소요구량(COD)"]*1000,df["클로로필(Chl-a)"],df["용존무기인(DIP)"],df["용존무기질소(DIN)"],df["총인(TP)"]],axis=1)
df_temp3 = df_temp3.groupby(["년도"],as_index=False).mean()
df_temp3

 

위와 동일한 방식으로 필요한 데이터를 df_temp3에 넣었다.

이번에는 총인도 포함하였다.

 

fig, axs = plt.subplots(2,3,figsize=(15,10))
axs = axs.flatten()
for i , ax in zip(df_temp3.columns[1:], axs):
    ax.plot(df_temp3["년도"] , df_temp3[i],label = i,color="green")
    ax.set_title(f"년도별 수질정보-{i}")
    ax.legend()
    ax.set_xlim(2013,2022)
plt.show()

각각의 값의 변화 추이를 선 그래프로 표현하였다.

그러나 점진적으로 증가하거나 점진적으로 감소할 것이라는 나의 예상과는 달리 각각의 요소의 변화가 년도에 따라 감소할때도 증가할때도 있는 것을 알 수 있었다.

수질을 결정하는 평가 요인들은 각각 해당 년도에 기후 , 주변 환경 변화 등에 영향을 받아 불규칙적으로 변화한다는 것을 예상할 수 있다.

728x90