Python

Python: 연습 6 (데이터 분석과 시각화 2)

이지파이 2025. 4. 30. 16:26

데이터 분석과 시각화 

지난번 연습에 이어 데이터 분석과 시각화 작업을 해볼 것이다.

수자원공사에서 실질적으로 쓰이거나 실용적일 수 있는 것은 댐, 보 등의 주변지역 기상상황을 분석하고 시각화하는 것이라고 생각했다. 

그래서 대청댐 주변의 기상 데이터를 수집하고 분석 및 시각화 하는 작업을 해보려고 한다. 

 

 

STEP 1. 목표 정의 및 지역 설정

1. 분석 주제: 대청댐 주변 기상데이터 분석

2. 주요 목표: 기후 변화 추이 분석, 수자원/생태계에 미치는 영향 탐색

3. 분석 지역: 청주시 상당구 대청댐 

- 대청댐 위치: 충북 청주시 상당구 문의면 문의삼거리 990

- 기상 관측소 선택 기준: 대청댐 해당 지역 

 

 

STEP 2. 데이터 수집

1. 수집 대상 데이터 정의

- 트렌드 파악 및 이상기후 비교를 위해 충분한 기간 필요: 최근 5년간 데이터 수집 예정

2. 데이터 출처

- 주소: https://data.kma.go.kr/

 

기상자료개방포털

 

data.kma.go.kr

- 로그인 후 상단 메뉴에서 '기상자료 → 기온/강수/풍속 등 종관기상관측자료' 선택

- 지점 선택: 청주

- 기간 선택: 2020.01.01 ~ 2025.04.29

- 항목 선택: 평균 기온, 최고/최저 기온, 강수량, 평균 풍속, 평균 상대습도 

- 자료 형식: CSV

- CSV 로 파일 저장 후 위치 확인 

 

 

STEP 3. 데이터 전처리

목표

- 날짜, 숫자 데이터 형식 통일

- 결측치 및 이상값 제거

- 분석용 컬럼만 남기고 정리 

 

1. python 코드(전처리 코드 + 연/월 컬럼 등 추가 정리)

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns

# 한글 폰트 설정 (Windows 기본 폰트 중 하나 사용)
plt.rcParams['font.family'] = 'Malgun Gothic'  # '맑은 고딕'
plt.rcParams['axes.unicode_minus'] = False     # 마이너스(-) 깨짐 방지

# 1. CSV 파일 불러오기
df = pd.read_csv("C:/Users/kwater/Desktop/Python 연습/대청댐데이터_자동수집및분석/청주_기상데이터.csv", encoding='euc-kr')

# 2. 날짜 컬럼 변환
df['일시'] = pd.to_datetime(df['일시'])

# 3. 필요 없는 컬럼 제거
df = df.drop(columns=['지점', '지점명'])

# 4. 컬럼명 변경
df.columns = ['날짜', '평균기온', '최고기온', '최저기온', '강수량', '풍속', '습도']

# 5. 문자열 숫자 → float 변환
for col in ['평균기온', '최고기온', '최저기온', '강수량']:
    df[col] = pd.to_numeric(df[col], errors='coerce')

# 6. 결측치(-99.9 등) 처리
df.replace(-99.9, pd.NA, inplace=True)
# df.replace(0.0, pd.NA, inplace=True)  # 실제 0은 유효값일 수 있으므로 제거 또는 주석처리
df.dropna(inplace=True)

# 7. 연도/월 추가
df['연도'] = df['날짜'].dt.year
df['월'] = df['날짜'].dt.month

# ✅ 데이터 확인
print(df.head())
print(df.info())
print(df.groupby('연도')['평균기온'].mean())

 

2. 코드 실행 결과

 

 

STEP 4. 탐색적 데이터 분석(EDA)

목적

- 연도별/월별 기온 및 강수량 변화 파악

- 계절별 특성 확인

- 이상치, 누락값 등 데이터 특성 확인

- 향후 분석 방향(기후변화, 수자원 예측 등)을 정하기 위한 기반

 

1. 데이터 구조 다시 확인: 전처리 후 데이터프레임은 아래와 같은 컬럼 구조일 것이다. 

df.columns
# ['날짜', '평균기온', '최고기온', '최저기온', '강수량', '풍속', '습도', '연도', '월']

 

2. 연도별 평균 기온 변화

annual_temp = df.groupby('연도')['평균기온'].mean()

plt.figure(figsize=(10, 5))
sns.lineplot(x=annual_temp.index, y=annual_temp.values, marker='o')
plt.title('연도별 평균기온 변화 (청주)', fontsize=14)
plt.xlabel('연도')
plt.ylabel('평균기온 (°C)')
plt.grid(True)
plt.tight_layout()
plt.show()

2025년도는 1월부터 4월까지의 기온변화만을 관측한 것이기에 급격한 기온변화를 보일 수 있다. 

 

3. 박스 플롯: 월별 기온 분포 (계절별 특성 확인)

박스 플롯을 통해 계절별 기온 분포와 이상치(outlier) 여부도 확인 가능하다. 

plt.figure(figsize=(12, 6))
sns.boxplot(x='월', y='평균기온', data=df)
plt.title('월별 평균기온 분포 (청주)', fontsize=14)
plt.xlabel('월')
plt.ylabel('평균기온 (°C)')
plt.grid(True)
plt.tight_layout()
plt.show()

 

4. 히트맵: 월/연도별 평균기온

연도별로 특정 월의 기온이 상승하고 있는지 시각적으로 확인 가능하다. 

pivot_temp = df.pivot_table(index='연도', columns='월', values='평균기온')

plt.figure(figsize=(12, 6))
sns.heatmap(pivot_temp, cmap="coolwarm", annot=True, fmt=".1f")
plt.title('연도-월별 평균기온 히트맵 (청주)', fontsize=14)
plt.xlabel('월')
plt.ylabel('연도')
plt.tight_layout()
plt.show()

 

5. 코드 실행 결과 

 

 

STEP 5. 시각화 고도화 (Interactive Visualization & 지도 시각화)

목적

- 보다 직관적이고 상호작용 가능한 시각화 제공

- 시간 흐름, 계절성, 이상기후를 더 뚜렷하게 탐색

- 공간적 요소(지도 기반)와 연계해 관측소 위치 등 시각화

 

1. Plotly 로 인터랙티브 꺾은선 그래프

Plotly 는 마우스 오버 툴팁, 줌인, 저장 등 다양한 기능을 기본으로 제공한다. 

pip install plotly
import plotly.express as px

# 연도별 평균기온 데이터
fig = px.line(annual_temp, x='연도', y='평균기온',
              markers=True,
              title='연도별 평균기온 변화 (청주)',
              labels={'평균기온': '평균기온 (°C)', '연도': 'Year'})

fig.update_layout(title_font_size=18)
fig.write_html("C:/Users/kwater/Desktop/plotly_기온그래프.html")

 

2. Plotly 로 월별 강수량 Boxplot

이를 통해 비가 많이 오는 계절이 언제인지 직관적으로 볼 수 있다.

# 월별 강수량 Boxplot 저장
fig = px.box(df, x='월', y='강수량', title='월별 강수량 분포 (청주)',
             labels={'강수량': '강수량 (mm)', '월': 'Month'})

fig.update_layout(title_font_size=18)
fig.write_html("C:/Users/kwater/Desktop/plotly_강수량박스플롯.html")

 

3. 실행 후 그래프 확인

- 파일 탐색기에서 바탕화면으로 이동

- [plotly_기온그래프.html] 또는 [plotly_강수량박스플롯.html] 더블클릭

- Chrome 브라우저가 파일을 정상적으로 열어줄 것