ํ์ด์ฌ์ ํ์ฉํ ๊ธฐ์ ๋ถ์์ ํ๊ตฌํ์ธ์. ๋ฐ์ดํฐ ์์ง, ์๊ฐํ, ๋ชจ๋ธ๋ง ๋ฐ ์ ์ธ๊ณ ๋ ์จ์ ๋ํ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
ํ์ด์ฌ ๋ ์จ ๋ฐ์ดํฐ: ๊ธฐ์ ๋ถ์์ ์ํ ์ข ํฉ ๊ฐ์ด๋
๋ ์จ๋ ๋์ ๊ณผ ๊ตํต๋ถํฐ ์ฌ๋ ๋๋น ๋ฐ ๊ธฐํ ๋ณํ ์ฐ๊ตฌ์ ์ด๋ฅด๊ธฐ๊น์ง ์ฐ๋ฆฌ ์ถ์ ๋ชจ๋ ์ธก๋ฉด์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๋ ๊ฒ์ ์ด๋ฌํ ์ํฅ์ ์ดํดํ๊ณ ์ ๋ณด์ ๊ธฐ๋ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ์ด์ฌ์ ๊ด๋ฒ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๊ตฌ ์ํ๊ณ๋ฅผ ๊ฐ์ถ๊ณ ์์ด ๊ธฐ์ ๋ถ์์ ์ด์์ ์ธ ์ธ์ด์ ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ๋ฐ์ดํฐ ์์ง, ์ฒ๋ฆฌ, ์๊ฐํ ๋ฐ ๋ชจ๋ธ๋ง์ ๋ค๋ฃจ๋ฉฐ ์ ์ฒด ๊ณผ์ ์ ์๋ดํฉ๋๋ค.
๋ ์จ ๋ฐ์ดํฐ ๋ถ์์ ํ์ด์ฌ์ ์ฌ์ฉํ๋ ์ด์
ํ์ด์ฌ์ ๋ ์จ ๋ฐ์ดํฐ ์์ ์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ํ๋ถํ ์ํ๊ณ: pandas, numpy, matplotlib, seaborn, scikit-learn๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฐ์ดํฐ ์กฐ์, ๋ถ์ ๋ฐ ์๊ฐํ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง: ํ์ด์ฌ์ ๊ธฐ์ ๊ธฐ๊ด์ API(์ ํ๋ฆฌ์ผ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค) ๋ฐ ์น ์คํฌ๋ํ ๊ธฐ์ ์ ํฌํจํ ๋ค์ํ ๋ ์จ ๋ฐ์ดํฐ ์์ค์ ์ฝ๊ฒ ์ฐ๋ํ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ: ํ์ด์ฌ์ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌํ ์ ์์ด ์ฌ๋ฌ ์์ค์ ๊ธฐ๊ฐ์ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
- ์ปค๋ฎค๋ํฐ ์ง์: ํฌ๊ณ ํ๋ฐํ ์ปค๋ฎค๋ํฐ ๋๋ถ์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋ํ ์๋ฃ, ํํ ๋ฆฌ์ผ, ํด๊ฒฐ์ฑ ์ ์ฝ๊ฒ ์ป์ ์ ์์ต๋๋ค.
- ์คํ ์์ค: ํ์ด์ฌ์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ๊ณ ๋ฐฐํฌํ ์ ์์ด ์ ์ธ๊ณ ์ฐ๊ตฌ์์ ๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ ์จ ๋ฐ์ดํฐ ์์งํ๊ธฐ
๊ธฐ์ ๋ถ์์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ป๋ ๊ฒ์ ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค:
1. ๋ ์จ API
๋ง์ ๊ธฐ์ ๊ธฐ๊ด์์ ์ค์๊ฐ ๋ฐ ๊ณผ๊ฑฐ ๋ ์จ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ช ๊ฐ์ง ์ธ๊ธฐ ์๋ ์ต์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- OpenWeatherMap: ์ ์ธ๊ณ ์์น์ ํ์ฌ ๋ ์จ ๋ฐ์ดํฐ ๋ฐ ์๋ณด์ ์ ๊ทผํ ์ ์๋ ๋ฌด๋ฃ ๋ฑ๊ธ์ ์ ๊ณตํฉ๋๋ค. API ํค๊ฐ ํ์ํฉ๋๋ค.
- AccuWeather: ์๊ฐ๋ณ ์๋ณด ๋ฐ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ์์ธํ ๋ ์จ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ตฌ๋ ์ด ํ์ํฉ๋๋ค.
- ๋ฏธ๊ตญ ํด์๋๊ธฐ์ฒญ(NOAA): ์งํ ๊ด์ธก, ๋ ์ด๋ ๋ฐ์ดํฐ, ๊ธฐํ ๋ชจ๋ธ์ ํฌํจํ ํ๋ถํ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ API๋ฅผ ํตํด ์ ๊ณตํฉ๋๋ค. ์ฃผ๋ก ๋ฏธ๊ตญ ๋ด์์ ์ฌ์ฉ๋์ง๋ง ์ ์ธ๊ณ ๋ถ์์ ์ํ ๋ฐ์ดํฐ๋ ์ ๊ณตํฉ๋๋ค.
- Visual Crossing Weather API: ๊ณผ๊ฑฐ, ํ์ฌ ๋ฐ ์๋ณด ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด API๋ ๊ณผ๊ฑฐ ๋ ์จ ๋ฐ์ดํฐ์ ๋๋ ๋ค์ด๋ก๋๋ ์ ๊ณตํฉ๋๋ค.
์์ : OpenWeatherMap์ผ๋ก ๋ ์จ ๋ฐ์ดํฐ ์ ๊ทผํ๊ธฐ
OpenWeatherMap API๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด `requests` ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ API ํค๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค. ๋ค์์ ํ์ด์ฌ ์์ ์ ๋๋ค:
import requests
api_key = "YOUR_API_KEY" # ์ค์ API ํค๋ก ๊ต์ฒดํ์ธ์
city_name = "London"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={api_key}&units=metric"
response = requests.get(url)
data = response.json()
if response.status_code == 200:
temperature = data["main"]["temp"]
humidity = data["main"]["humidity"]
description = data["weather"][0]["description"]
print(f"{city_name}์ ๋ ์จ:")
print(f"์จ๋: {temperature}ยฐC")
print(f"์ต๋: {humidity}%")
print(f"์ค๋ช
: {description}")
else:
print(f"์ค๋ฅ: {data['message']}")
2. ์น ์คํฌ๋ํ
API๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ, ์น ์คํฌ๋ํ์ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ์์ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ์ ์์ต๋๋ค. Beautiful Soup์ด๋ requests์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๊ณผ์ ์ ์๋ํํ ์ ์์ต๋๋ค.
์ค์: ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋ํํ๊ธฐ ์ ์ ํญ์ ์น์ฌ์ดํธ์ ์๋น์ค ์ฝ๊ด์ ํ์ธํ์ธ์. robots.txt๋ฅผ ์กด์คํ๊ณ ์๋ฒ์ ๊ณผ๋ํ ์์ฒญ์ ๋ณด๋ด์ง ์๋๋ก ํ์ธ์.
์์ : ์น์ฌ์ดํธ์์ ๋ ์จ ๋ฐ์ดํฐ ์คํฌ๋ํํ๊ธฐ
import requests
from bs4 import BeautifulSoup
url = "https://www.timeanddate.com/weather/"
city = "tokyo"
response = requests.get(url + city)
soup = BeautifulSoup(response.content, 'html.parser')
temperature = soup.find('div', class_='h2').text
print(f"{city}์ ์จ๋๋: {temperature}")
3. ๊ณต๊ฐ ๋ฐ์ดํฐ์
์ฌ๋ฌ ๊ธฐ๊ด์์ ๋ค์ด๋ก๋ํ์ฌ ๋ถ์ํ ์ ์๋ ๊ณต๊ฐ ๋ ์จ ๋ฐ์ดํฐ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ์ ์๋ ์ข ์ข ๋ค์ํ ์์น์ ๊ณผ๊ฑฐ ๋ ์จ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
- NOAA ๊ตญ๋ฆฝ ํ๊ฒฝ ์ ๋ณด ์ผํฐ(NCEI): ์งํ ๊ด์ธก, ๋ ์ด๋ ๋ฐ์ดํฐ ๋ฐ ๊ธฐํ ๋ชจ๋ธ์ ํฌํจํ ๋ฐฉ๋ํ ๋ ์จ ๋ฐ์ดํฐ ์์นด์ด๋ธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ ๋ฝ ์ค๊ธฐ ์๋ณด ์ผํฐ(ECMWF): 1979๋ ๋ถํฐ ํ์ฌ๊น์ง์ ๊ณผ๊ฑฐ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ERA5 ์ฌ๋ถ์ ๋ฐ์ดํฐ์ ์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํฉ๋๋ค.
- ์ธ๊ณ๊ธฐ์๊ธฐ๊ตฌ(WMO): ๊ตญ์ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ๋ฉฐ ๊ฐ๊ตญ ๊ธฐ์์ฒญ๊ณผ ํ๋ ฅํฉ๋๋ค.
๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐ ์ ์
๋ ์จ ๋ฐ์ดํฐ๋ฅผ ์์งํ ํ์๋ ๋ถ์ ์ ์ ์ ์ฒ๋ฆฌํ๊ณ ์ ์ ํด์ผ ํฉ๋๋ค. ์ด ๊ณผ์ ์๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ ์ ํ ๋ณํ, ์ด์์น ์ ๊ฑฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
1. ๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ
๊ฒฐ์ธก๊ฐ์ ์ผ์ ์ค์๋์ด๋ ๋ฐ์ดํฐ ์ ์ก ์ค๋ฅ๋ก ์ธํด ๋ ์จ ๋ฐ์ดํฐ์ ์์ ํํ ๋ฐ์ํฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ฒฐ์ธก๊ฐ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค:
- ์ญ์ : ๊ฒฐ์ธก๊ฐ์ด ์๋ ํ์ด๋ ์ด์ ์ ๊ฑฐํฉ๋๋ค. ๊ฒฐ์ธก๊ฐ์ ์๊ฐ ์ ์ ๋ ์ ํฉํฉ๋๋ค.
- ๋์ฒด: ๊ฒฐ์ธก๊ฐ์ ์ถ์ ๋ ๊ฐ์ผ๋ก ๋์ฒดํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋์ฒด ๋ฐฉ๋ฒ์ผ๋ก๋ ํ๊ท , ์ค์๊ฐ ๋๋ ์ต๋น๊ฐ ๋์ฒด๊ฐ ์์ต๋๋ค.
- ๋ณด๊ฐ: ์ธ์ ๋ฐ์ดํฐ ํฌ์ธํธ์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ์ธก๊ฐ์ ์ถ์ ํฉ๋๋ค. ์๊ณ์ด ๋ฐ์ดํฐ์ ์ ํฉํฉ๋๋ค.
์์ : pandas๋ก ๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌํ๊ธฐ
import pandas as pd
import numpy as np
# ๊ฒฐ์ธก๊ฐ์ด ์๋ ์ํ ๋ ์จ ๋ฐ์ดํฐ
data = {
"date": ["2024-01-01", "2024-01-02", "2024-01-03", "2024-01-04", "2024-01-05"],
"temperature": [10, 12, np.nan, 14, 15],
"humidity": [80, np.nan, 75, 70, 65]
}
df = pd.DataFrame(data)
# ๊ฒฐ์ธก๋ ์จ๋ ๊ฐ์ ํ๊ท ์ผ๋ก ๋์ฒด
df["temperature"].fillna(df["temperature"].mean(), inplace=True)
# ๊ฒฐ์ธก๋ ์ต๋ ๊ฐ์ ์ค์๊ฐ์ผ๋ก ๋์ฒด
df["humidity"].fillna(df["humidity"].median(), inplace=True)
print(df)
2. ๋ฐ์ดํฐ ์ ํ ๋ณํ
๋ถ์์ ์ ํฉํ๋๋ก ์ด์ ๋ฐ์ดํฐ ์ ํ์ ํ์ธํ์ธ์. ์๋ฅผ ๋ค์ด, ๋ ์ง๋ datetime ํ์์ด์ด์ผ ํ๊ณ ์ซ์ ๊ฐ์ float ๋๋ integer ํ์์ด์ด์ผ ํฉ๋๋ค.
์์ : pandas๋ก ๋ฐ์ดํฐ ์ ํ ๋ณํํ๊ธฐ
df["date"] = pd.to_datetime(df["date"])
3. ์ด์์น ์ ๊ฑฐ
์ด์์น๋ ๋ถ์์ ์๊ณกํ ์ ์์ผ๋ฏ๋ก ์ ๊ฑฐํ๊ฑฐ๋ ์กฐ์ ํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ด์์น ํ์ง ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Z-์ ์: ํ๊ท ์์ ํน์ ํ์คํธ์ฐจ๋งํผ ๋จ์ด์ง ๊ฐ์ ์๋ณํฉ๋๋ค.
- ์ฌ๋ถ์์ ๋ฒ์(IQR): IQR์ ๋ฒ์ด๋๋ ๊ฐ์ ์๋ณํฉ๋๋ค.
- ์๊ฐ์ ๊ฒ์ฌ: ๋ฐ์ดํฐ๋ฅผ ํ๋กํ ํ์ฌ ์๊ฐ์ ์ผ๋ก ์ด์์น๋ฅผ ์๋ณํฉ๋๋ค.
์์ : IQR๋ก ์ด์์น ์ ๊ฑฐํ๊ธฐ
def remove_outliers(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df = df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
return df
df = remove_outliers(df, "temperature")
print(df)
๋ฐ์ดํฐ ์๊ฐํ
๋ ์จ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๋ ๊ฒ์ ํจํด, ์ถ์ธ ๋ฐ ๊ด๊ณ๋ฅผ ์ดํดํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ํ์ด์ฌ์ ์ ์ตํ ์๊ฐํ๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. ์ ๊ทธ๋ํ
์ ๊ทธ๋ํ๋ ์๊ฐ์ ๋ฐ๋ฅธ ์จ๋๋ ์ต๋์ ๊ฐ์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์ : matplotlib์ผ๋ก ์ ๊ทธ๋ํ ์์ฑํ๊ธฐ
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.plot(df["date"], df["temperature"], marker='o')
plt.xlabel("๋ ์ง")
plt.ylabel("์จ๋ (ยฐC)")
plt.title("์๊ฐ์ ๋ฐ๋ฅธ ์จ๋ ๋ณํ")
plt.grid(True)
plt.show()
2. ์ฐ์ ๋
์ฐ์ ๋๋ ์จ๋์ ์ต๋์ ๊ฐ์ ๋ ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ์๊ฐํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์ : matplotlib์ผ๋ก ์ฐ์ ๋ ์์ฑํ๊ธฐ
plt.figure(figsize=(8, 6))
plt.scatter(df["temperature"], df["humidity"])
plt.xlabel("์จ๋ (ยฐC)")
plt.ylabel("์ต๋ (%)")
plt.title("์จ๋ ๋ ์ต๋")
plt.grid(True)
plt.show()
3. ํ์คํ ๊ทธ๋จ
ํ์คํ ๊ทธ๋จ์ ์จ๋์ ๊ฐ์ ๋จ์ผ ๋ณ์์ ๋ถํฌ๋ฅผ ์๊ฐํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์ : matplotlib์ผ๋ก ํ์คํ ๊ทธ๋จ ์์ฑํ๊ธฐ
plt.figure(figsize=(8, 6))
plt.hist(df["temperature"], bins=10)
plt.xlabel("์จ๋ (ยฐC)")
plt.ylabel("๋น๋")
plt.title("์จ๋ ๋ถํฌ")
plt.grid(True)
plt.show()
4. ํํธ๋งต
ํํธ๋งต์ ์ฌ๋ฌ ๋ณ์ ๊ฐ์ ์๊ด ๊ด๊ณ๋ฅผ ์๊ฐํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์์ : seaborn์ผ๋ก ํํธ๋งต ์์ฑํ๊ธฐ
import seaborn as sns
correlation_matrix = df.corr()
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap="coolwarm")
plt.title("์๊ด๊ด๊ณ ํํธ๋งต")
plt.show()
5. ์ง๋ฆฌ์ ์๊ฐํ
์ง๋์ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ธฐ ์ํด์๋ GeoPandas๋ Basemap(๋๋ ๊ทธ ํ๋์ ๋์์ธ Cartopy)๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ง๋ฆฌ์ ์ง๋์ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ํ๋กํ ํ์ฌ ๊ธฐ์ ํจํด์ ๊ณต๊ฐ์ ์ผ๋ก ๋ํ๋ด๋ ์๊ฐํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์์ : Cartopy๋ก ์ง๋ฆฌ์ ํ๋กฏ ์์ฑํ๊ธฐ (๊ฐ๋ ์ )
์ฐธ๊ณ : ์ด ์์ ๋ Cartopy ๋ฐ ๊ด๋ จ ์ข ์์ฑ ์ค์น๊ฐ ํ์ํ๋ฉฐ, ์ด๋ ๋ณต์กํ ์ ์์ต๋๋ค. ์ฝ๋ ์ค๋ํซ์ ๊ฐ์ํ๋ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
# ํน์ ํฌ์๋ฒ์ผ๋ก ๊ทธ๋ฆผ ๋ฐ ์ถ ๊ฐ์ฒด ์์ฑ
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
# ํด์์ ์ถ๊ฐ
ax.coastlines()
# ์์ ๋ฐ์ดํฐ (์๋, ๊ฒฝ๋, ์จ๋)
latitude = [40.71, 34.05, 51.51] # ๋ด์, ๋ก์ค์ค์ ค๋ ์ค, ๋ฐ๋
longitude = [-74.01, -118.24, -0.13]
temperature = [15, 25, 10]
# ๋ฐ์ดํฐ ํ๋กํ
plt.scatter(longitude, latitude, c=temperature, transform=ccrs.PlateCarree())
# ์ปฌ๋ฌ๋ฐ ์ถ๊ฐ
plt.colorbar(label='์จ๋ (ยฐC)')
# ํน์ ์ง์ญ(์: ์ ๋ฝ)์ผ๋ก ๋ฒ์ ์ค์
# ax.set_extent([-10, 40, 35, 70], crs=ccrs.PlateCarree())
plt.title('์จ๋ ์ง๋')
plt.show()
๋ ์จ ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ๋ชจ๋ธ๋ง
๋ฐ์ดํฐ๋ฅผ ์ ์ฒ๋ฆฌํ๊ณ ์๊ฐํํ ํ์๋ ๋ค์ํ ๋ถ์์ ์ํํ๊ณ ์์ธก ๋ชจ๋ธ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
1. ์๊ณ์ด ๋ถ์
์๊ณ์ด ๋ถ์์ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์์ง๋ ๋ฐ์ดํฐ ํฌ์ธํธ๋ฅผ ๋ถ์ํ์ฌ ํจํด, ์ถ์ธ ๋ฐ ๊ณ์ ์ฑ์ ์๋ณํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ถํด: ์๊ณ์ด์ ์ถ์ธ, ๊ณ์ ์ฑ ๋ฐ ์์ฐจ ๊ตฌ์ฑ ์์๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- ์๊ธฐ์๊ด: ์๊ณ์ด๊ณผ ๊ทธ ์ง์ฐ๋ ๊ฐ ์ฌ์ด์ ์๊ด ๊ด๊ณ๋ฅผ ์ธก์ ํฉ๋๋ค.
- ์์ธก: ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฏธ๋ ๊ฐ์ ์์ธกํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์์ธก ๋ชจ๋ธ์๋ ARIMA(์๊ธฐํ๊ท ๋์ ์ด๋ ํ๊ท ) ๋ฐ ์ง์ ํํ๋ฒ์ด ์์ต๋๋ค.
์์ : statsmodels๋ก ์๊ณ์ด ๋ถํดํ๊ธฐ
from statsmodels.tsa.seasonal import seasonal_decompose
# ์๊ณ์ด ๋ถํด๋ฅผ ์ํด 'date' ์ด์ด ์ธ๋ฑ์ค์ธ์ง ํ์ธ
df = df.set_index('date')
# ๊ณ์ ์ ๋ถํด ์ํ
decomposition = seasonal_decompose(df["temperature"], model='additive', period=7) #์ฃผ๊ฐ ๊ณ์ ์ฑ์ ๊ฐ์
# ๊ตฌ์ฑ ์์ ํ๋กํ
plt.figure(figsize=(12, 8))
plt.subplot(411)
plt.plot(decomposition.observed, label='๊ด์ธก๊ฐ')
plt.legend(loc='upper left')
plt.subplot(412)
plt.plot(decomposition.trend, label='์ถ์ธ')
plt.legend(loc='upper left')
plt.subplot(413)
plt.plot(decomposition.seasonal, label='๊ณ์ ์ฑ')
plt.legend(loc='upper left')
plt.subplot(414)
plt.plot(decomposition.resid, label='์์ฐจ')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
2. ํ๊ท ๋ถ์
ํ๊ท ๋ถ์์ ์ข ์ ๋ณ์(์: ์จ๋)์ ํ๋ ์ด์์ ๋ ๋ฆฝ ๋ณ์(์: ์ต๋, ํ์) ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ํ๊ท ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ ํ ํ๊ท: ๊ด๊ณ๋ฅผ ์ ํ ๋ฐฉ์ ์์ผ๋ก ๋ชจ๋ธ๋งํฉ๋๋ค.
- ๋คํญ ํ๊ท: ๊ด๊ณ๋ฅผ ๋คํญ ๋ฐฉ์ ์์ผ๋ก ๋ชจ๋ธ๋งํฉ๋๋ค.
- ๋ค์ค ํ๊ท: ์ข ์ ๋ณ์์ ์ฌ๋ฌ ๋ ๋ฆฝ ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ชจ๋ธ๋งํฉ๋๋ค.
์์ : scikit-learn์ผ๋ก ์ ํ ํ๊ท ๋ถ์ํ๊ธฐ
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# ๋ฐ์ดํฐ ์ค๋น
X = df[["humidity"]]
y = df["temperature"]
# ๋ฐ์ดํฐ๋ฅผ ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# ์ ํ ํ๊ท ๋ชจ๋ธ ์์ฑ
model = LinearRegression()
# ๋ชจ๋ธ ํ๋ จ
model.fit(X_train, y_train)
# ์์ธก ์ํ
y_pred = model.predict(X_test)
# ๋ชจ๋ธ ํ๊ฐ
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y_test, y_pred)
print(f"ํ๊ท ์ ๊ณฑ ์ค์ฐจ: {mse}")
#๊ฒฐ๊ณผ ์๊ฐํ
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.xlabel("์ต๋")
plt.ylabel("์จ๋")
plt.title("์ ํ ํ๊ท: ์จ๋ ๋ ์ต๋")
plt.show()
3. ๋ถ๋ฅ ๋ถ์
๋ถ๋ฅ ๋ถ์์ ๋ ์จ ์กฐ๊ฑด์ ๋ฏธ๋ฆฌ ์ ์๋ ํด๋์ค(์: ๋ง์, ํ๋ฆผ, ๋น)๋ก ๋ถ๋ฅํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ถ๋ฅ ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ก์ง์คํฑ ํ๊ท: ์ด์ง ๊ฒฐ๊ณผ์ ํ๋ฅ ์ ๋ชจ๋ธ๋งํฉ๋๋ค.
- ๊ฒฐ์ ํธ๋ฆฌ: ๋ ๋ฆฝ ๋ณ์์ ๊ฐ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ํ์ ์งํฉ์ผ๋ก ๋ถํ ํฉ๋๋ค.
- ์ํฌํธ ๋ฒกํฐ ๋จธ์ (SVM): ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ๋ ์ต์ ์ ์ดํ๋ฉด์ ์ฐพ์ต๋๋ค.
- ๋๋ค ํฌ๋ ์คํธ: ๊ฒฐ์ ํธ๋ฆฌ์ ์์๋ธ์ ๋๋ค.
์์ : scikit-learn์ผ๋ก ๋ถ๋ฅ ๋ถ์ํ๊ธฐ
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
# 'weather_condition'์ด๋ผ๋ ์ด๋ฆ์ ๋ฒ์ฃผํ ๊ฐ์ ๊ฐ์ง ์ด์ด ์๋ค๊ณ ๊ฐ์
# ์: 'Sunny', 'Cloudy', 'Rainy'
# ๋จผ์ , ๋ฒ์ฃผํ ๋ ์ด๋ธ์ ์ซ์ํ์ผ๋ก ๋ณํ
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['weather_condition_encoded'] = le.fit_transform(df['weather_condition'])
# ํน์ฑ๊ณผ ๋ชฉํ ๋ณ์ ์ค๋น
X = df[['temperature', 'humidity', 'wind_speed']] # ์์ ํน์ฑ
y = df['weather_condition_encoded']
# ๋ฐ์ดํฐ์
์ ํ๋ จ ์ธํธ์ ํ
์คํธ ์ธํธ๋ก ๋ถํ
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ๋๋ค ํฌ๋ ์คํธ ๋ถ๋ฅ๊ธฐ ์ด๊ธฐํ ๋ฐ ํ๋ จ
rf_classifier = RandomForestClassifier(n_estimators=100, random_state=42)
rf_classifier.fit(X_train, y_train)
# ํ
์คํธ ์ธํธ์ ๋ํ ์์ธก ์ํ
y_pred = rf_classifier.predict(X_test)
# ๋ชจ๋ธ ํ๊ฐ
accuracy = accuracy_score(y_test, y_pred)
print(f"์ ํ๋: {accuracy}")
# ๋ถ๋ฅ ๋ณด๊ณ ์ ํ์
print(classification_report(y_test, y_pred))
๊ณ ๊ธ ๊ธฐ๋ฒ ๋ฐ ์์ฉ
1. ์ผ๊ธฐ ์๋ณด๋ฅผ ์ํ ๋จธ์ ๋ฌ๋
๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ก๋ถํฐ ํ์ตํ๊ณ ๋ณต์กํ ํจํด์ ์๋ณํ์ฌ ์ผ๊ธฐ ์๋ณด ์ ํ๋๋ฅผ ํฅ์์ํค๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ํ ์ ๊ฒฝ๋ง(RNN) ๋ฐ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง(CNN)๊ณผ ๊ฐ์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ์ผ๊ธฐ ์๋ณด์์ ์ ๋งํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ์์ต๋๋ค.
2. ๊ธฐํ ๋ณํ ๋ถ์
๋ ์จ ๋ฐ์ดํฐ๋ ๊ธฐํ ๋ณํ ์ถ์ธ์ ํจํด์ ๋ถ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ฅ๊ธฐ์ ์ธ ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํจ์ผ๋ก์จ ์ฐ๊ตฌ์๋ค์ ์จ๋, ๊ฐ์๋ ๋ฐ ๊ธฐํ ๊ธฐํ ๋ณ์์ ๋ณํ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ถ์์ ๊ธฐํ ๋ณํ์ ์ํฅ์ ์ดํดํ๊ณ ์ํ ๋ฐ ์ ์ ์ ๋ต์ ๊ฐ๋ฐํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
3. ๋์ ๊ณผ ๋ ์จ
๊ธฐ์ ํจํด๊ณผ ๊ทธ๊ฒ์ด ์๋ฌผ ์ํ๋์ ๋ฏธ์น๋ ์ํฅ์ ์ดํดํ๋ ๊ฒ์ ๋์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ ์จ ๋ฐ์ดํฐ๋ฅผ ์๋ฌผ ๋ฐ์ดํฐ์ ํจ๊ป ๋ถ์ํจ์ผ๋ก์จ ๋๋ถ์ ๋์ ๊ธฐ๊ด์ ํ์ข , ๊ด๊ฐ ๋ฐ ์ํ์ ๋ํด ์ ๋ณด์ ๊ธฐ๋ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๊ธฐ์ ์กฐ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ์๋ฌผ ์ํ๋์ ์์ธกํ์ฌ ๋์ ๊ดํ์ ์ต์ ํํ ์ ์์ต๋๋ค.
์์ : ๋ ์จ๊ฐ ์ปคํผ ์์ฐ์ ๋ฏธ์น๋ ์ํฅ (์ค๋ช ์ฉ)
๋ธ๋ผ์ง์ ์ปคํผ ์๋ ์์ฐ์ ๋ถ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ๊ณผ๊ฑฐ ๋ ์จ ๋ฐ์ดํฐ(์จ๋, ๊ฐ์ฐ๋)๋ฅผ ์ปคํผ ์ํ๋ ๋ฐ์ดํฐ์ ๊ฒฐํฉํ ์ ์์ต๋๋ค. ๊ฐํ๊ธฐ ๋์ ๋น๊ฐ ๋๋ฌด ๋ง์ด ์ค๋ฉด ๊ณฐํก์ด๋ณ์ด ๋ฐ์ํ์ฌ ์ํ๋์ด ๊ฐ์ํ ์ ์์ต๋๋ค. ์ฑ์ฅ๊ธฐ ๋์ ๊ณ ์จ์ ์์ฑ์ ๊ฐ์ํํ์ฌ ์ ์ฌ์ ์ผ๋ก ์๋ ํ์ง์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ํ์ด์ฌ์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๋ ์จ ๋งค๊ฐ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปคํผ ์ํ๋์ ์์ธกํ๋ ๋ชจ๋ธ์ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
4. ์ฌ๋ ๋๋น
๋ ์จ ๋ฐ์ดํฐ๋ ์ฌ๋ ๋๋น ๋ฐ ๋์์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ธฐ์ ํจํด์ ๋ถ์ํ๊ณ ํ๋ฆฌ์ผ์ธ, ํ์, ๊ฐ๋ญ๊ณผ ๊ฐ์ ๊ทน๋จ์ ์ธ ๊ธฐ์ ์ด๋ณ์ ์์ธกํจ์ผ๋ก์จ ๋น๊ตญ์ ์๊ธฐ์ ์ ํ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ๋ นํ๊ณ ์ ์ฌ์ ์ธ ์ฌ๋์ ๋๋นํ ์ ์์ต๋๋ค. ์ด๋ ์๋ช ์ ๊ตฌํ๊ณ ์ฌ์ฐ ํผํด๋ฅผ ์ต์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
5. ์ฌ์ ์๋์ง
๋ ์จ ๋ฐ์ดํฐ๋ ์ฌ์ ์๋์ง ๋ถ๋ฌธ, ํนํ ํ์๊ด ๋ฐ ํ๋ ฅ ๋ฐ์ ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ ํํ ์ผ๊ธฐ ์๋ณด๋ ํ์๊ด ๋ฐ ํ๋ ฅ ์์์ ๊ฐ์ฉ์ฑ์ ์์ธกํ๋ ๋ฐ ํ์์ ์ด๋ฉฐ, ์ด๋ฅผ ํตํด ์๋์ง ํ์ฌ๋ ์ด์์ ์ต์ ํํ๊ณ ์ ๋ขฐํ ์ ์๋ ์ฌ์ ์๋์ง ๊ณต๊ธ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๋ ์จ ๋ฐ์ดํฐ ๋ถ์์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ฐ์ดํฐ ํ์ง: ๋ฐ์ดํฐ๊ฐ ์ ํํ๊ณ ์์ ํ๋ฉฐ ์ผ๊ด์ฑ์ด ์๋์ง ํ์ธํ์ธ์.
- ๋ฌธ์ํ: ์ฝ๋์ ๋ถ์์ ์ฒ ์ ํ ๋ฌธ์ํํ์ธ์.
- ์ฌํ์ฑ: ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ฝ๋๋ฅผ ๊ณต์ ํ์ฌ ๋ถ์์ ์ฌํํ ์ ์๋๋ก ํ์ธ์.
- ํ์ : ๋ค๋ฅธ ์ฐ๊ตฌ์ ๋ฐ ๋ฐ์ดํฐ ๊ณผํ์๋ค๊ณผ ํ๋ ฅํ์ฌ ์ง์๊ณผ ์ ๋ฌธ์ฑ์ ๊ณต์ ํ์ธ์.
- ์ค๋ฆฌ์ ๊ณ ๋ ค์ฌํญ: ๋ฐ์ดํฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ๋ณด์๊ณผ ๊ฐ์ ์ค๋ฆฌ์ ๊ณ ๋ ค์ฌํญ์ ์ ์ํ์ธ์.
๊ฒฐ๋ก
ํ์ด์ฌ์ ๋ ์จ ๋ฐ์ดํฐ ๋ถ์์ ์ํ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ฐ์ด๋์์ ๋ ผ์๋ ๊ธฐ์ ๊ณผ ๋๊ตฌ๋ฅผ ์๋ฌํจ์ผ๋ก์จ ๋ ์จ ํจํด, ๊ธฐํ ๋ณํ ๋ฐ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ ์ถ์ ๋ค์ํ ์ธก๋ฉด์ ๋ฏธ์น๋ ์ํฅ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค. ์ฐ๊ตฌ์, ๋ฐ์ดํฐ ๊ณผํ์ ๋๋ ๋ ์จ ์ ํธ๊ฐ์ด๋ ๊ด๊ณ์์ด ํ์ด์ฌ์ ๋ ์จ ๋ฐ์ดํฐ์ ํ์ ๋ฐํํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
์ถ๊ฐ ํ์ต ์๋ฃ
- ์จ๋ผ์ธ ๊ฐ์ข: Coursera, Udacity, edX์ ๊ฐ์ ํ๋ซํผ์์ ๋ฐ์ดํฐ ๊ณผํ, ๋จธ์ ๋ฌ๋, ๋ ์จ ๋ถ์์ ๋ํ ๊ฐ์ข๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์์ : "Python Data Science Handbook" (์ ์ดํฌ ๋ฐด๋ํ๋์ค ์ ), "Hands-On Machine Learning with Scikit-Learn, Keras & TensorFlow" (์ค๋ ๋ฆฌ์ ์ ๋กฑ ์ ).
- ์ปค๋ฎค๋ํฐ: Stack Overflow, Reddit (r/datascience, r/weather), GitHub์ ๊ฐ์ ์จ๋ผ์ธ ์ปค๋ฎค๋ํฐ์ ๊ฐ์ ํ์ฌ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ณผํ์ ๋ฐ ๋ ์จ ์ ํธ๊ฐ๋ค๊ณผ ๊ต๋ฅํ์ธ์.