개인 공부

데이터 과학 - 기상청 최고 기온, 최저 기온 데이터 크롤링하기

Beige00 2024. 4. 1. 16:39
!pip install mechanize

import mechanize
import http.cookiejar

cj = http.cookiejar.CookieJar()
br = mechanize.Browser()
br.set_cookiejar(cj)

br.open("https://www.weather.go.kr/w/obs-climate/land/past-obs/obs-by-day.do")

data = br.response().read().decode('utf-8')

import time
import re

a = 0

data_points = []

for i in range(1, 120):
    for j in range(1, 13):
        url = "https://www.weather.go.kr/w/obs-climate/land/past-obs/obs-by-day.do?stn=108&yy=" + str(1999+i) + "&mm=" + str(j) + "&obs=1"
        print("waiting... ", url)
        br.open(url)
        data = br.response().read().decode("utf-8") 
        # Do something here with `data`
        x = re.findall('최저기온:(-*[0-9]+\.[0-9]+)', data)  # 최저기온
        y = re.findall('최고기온:(-*[0-9]+\.[0-9]+)', data)  # 최고 기온
        for low, high in zip(x, y):
            data_points.append((float(low), float(high)))
        if len(data_points) >= 1000:
            a = 1
            break
        time.sleep(1)
    if a==1:
        break
    time.sleep(1)

print(len(data_points))

for a in data_points[:5]:
    print(a)

다음은 기상청 사이트에서 수집된 data_points가 1000개 이상이 될 때까지 최고 기온, 최저 기온을 읽어오는 코드이다.

 

여기서 정규 표현식을 조금 설명하면,

"최저(고)기온:" 를 시작 문자열로 치고, 그 이후에 () 사이를 캡처 그룹으로 친다.

그 후, 정수의 반복을 소숫점을 나타내는 '.'이 인식될 때까지 읽고, '.'의 뒤 소숫점 기온도 똑같이 읽어온다.

그리고 해당 최저, 최고 기온 데이터를 zip tuple로 묶어 리스트에 저장한다.

이제 해당 데이터들을 히스토그램 등 다양한 방법으로 표시해보자.

 

# 문제 3
import seaborn as sns
lows, highs = zip(*data_points) #데이터 최저, 최고로 분리.
sns.histplot(data = lows, bins=40); #최저~최대 값을 40개 구간을 나눈다.
sns.histplot(data = highs, bins=40); #최저~최대 값을 40개 구간을 나눈다.

최저 기온 분포


최고 기온 분포

 

import matplotlib.pyplot as plt
import numpy as np

plt.scatter(lows,highs, alpha=0.5)
plt.xlabel('low temp') #최저
plt.ylabel('high temp')#최고
plt.show()

최고, 최저기온 산점도

 

해당 과정을 통해 한국의 최저~최고 기온의 분포를 알 수 있다.

우선 히스토그램을 통해 우리나라의 33달 간의 기온 분포 수를 알 수 있었다.

보통 -5~10 도 사이에서 최저 기온이 많이 형성되며, 13~28 사이에 최고 기온이 많이 생성됨을 알 수 있다.

또한 산점도의 선형적인 관계를 통해 최저-최고 기온 관계는 선형적인 관계를 가지고 있음을 알 수 있다.

따라서 우리나라는 최고 온도와 최저온도가 어느정도의 일관된 관계를 가지는 나라임을 알 수 있었다.

 

해당 데이터를 기반으로 분석해보고 싶은 문제가 떠올랐는데, 혹시 이 데이터를 월별로 분할하여 각 년도별의 월별 기온 분포를 그려내고, 이를 사이트의 연도별 범죄율 척도와 연관지어 분석하여 기온 분포가 범죄율 척도와 얼마만큼의 상관 관계가 있는지 분석해보고 싶다는 생각을 했다.

우선 여기까지 하고 데이터 과학 과제 해결을 마쳤다.