Skip to main content

파이썬으로 표 형식 데이터 다루기

이 튜토리얼에서는 파이썬으로 표 형식 데이터를 다루는 방법을 살펴보고, 이를 활용해 지진을 예측해 보겠습니다. 이 글은 AI 번역본입니다. 오역이 있을 수 있으니 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
표 형식 데이터를 다루는 능력은 많은 데이터 사이언스와 머신 러닝 프로젝트의 핵심 역량입니다. 추세를 분석하든, 예측을 수행하든, 숨은 패턴을 발견하든, 구조화된 데이터가 종종 그 기반이 됩니다. 강력한 라이브러리와 도구를 갖춘 Python은 이러한 유형의 데이터를 조작하고 통찰을 도출하는 일을 더욱 쉽게 만들어 줍니다.
이 글에서는 파이썬을 사용해 표 형식 데이터를 다루는 방법을 살펴보며, 특히 지진 예측과 같은 실제 사례에 이러한 기법을 적용하는 데 초점을 맞춥니다. 글을 끝까지 읽으면 구조화된 데이터와 머신 러닝을 활용해 복잡한 문제를 해결하고 예측 모델을 구축하는 방법을 탄탄하게 이해하게 될 것입니다.

목차



Python에서 표 형식 데이터 이해하기

표 형식 데이터는 많은 실제 데이터셋을 구동하는 구조화된 형식입니다. 스프레드시트처럼 행과 열로 구성되어 있어 조작, 분석, 시각화를 손쉽게 수행할 수 있으며, 데이터 사이언티스트와 머신 러닝 엔지니어에게 필수적인 도구입니다.
Python에서는 표 형식 데이터가 CSV 파일, Excel 스프레드시트, 또는 SQL 데이터베이스에 저장된 데이터 등 다양한 형식으로 제공됩니다. pandas와 NumPy 같은 라이브러리를 활용하면 표 형식 데이터를 효율적이고 간편하게 다룰 수 있습니다. 이러한 도구들은 구조화된 데이터셋을 손쉽게 정제하고 변환하며 탐색하는 데 필요한 모든 기능을 제공합니다.
이 프로젝트에서는 Significant Earthquakes, 1965–2016을 사용합니다 Kaggle에서을 표 형식 데이터셋으로 사용합니다


지진 예측을 위한 표 형식 데이터 기반 머신 러닝

이제 표 형식 데이터를 이해했으니, 이 구조화된 정보를 활용해 머신 러닝이 지진 예측에 어떻게 도움이 되는지 살펴보겠습니다. 우리가 사용하는 데이터셋에는 지진 규모, 위치, 깊이, 타임스탬프와 같은 핵심 정보가 포함되어 있습니다. 이러한 요소들을 분석하면 머신 러닝 모델이 미래 예측에 도움이 되는 패턴을 식별할 수 있습니다.
신경망예를 들어, 과거 데이터로부터 학습해 지진 발생을 예측할 수 있으며, 다음과 같은 다른 기법들은 선형 회귀, 랜덤 포레스트, 그리고 그래디언트 부스팅 데이터를 분석하는 데 서로 다른 접근 방식을 제공합니다. 이러한 방법을 조합해 활용하면 유용한 인사이트를 도출하는 능력을 더욱 높일 수 있습니다.
이 프로젝트 전반에 걸쳐 우리는 둘 다 사용할 것입니다 지도 학습 그리고 비지도 학습 머신 러닝이 표 형식의 지진 데이터를 의미 있는 예측으로 전환하는 방법을 탐색하는 다양한 방법. Python과 강력한 라이브러리를 활용해, 이러한 모델을 구축하고 고도화하여 데이터 기반 예측을 만들어 내는 전 과정을 함께 진행하겠습니다.
필자 제공 이미지

Python으로 지진 예측 모델을 만드는 단계별 튜토리얼

이제 이론을 살펴봤으니, 실전에 들어가 보겠습니다. 이 튜토리얼에서는 Python과 표 형식 데이터를 사용해 지진을 예측하는 AI 모델을 만들어 보겠습니다.
우리의 모델로 피드포워드 신경망(FNN)을 사용할 것입니다. 걱정하지 마세요. 각 단계를 차근차근 안내해 드려 과정이 명확하고 흥미롭게 느껴지도록 하겠습니다. 그럼 시작해 보겠습니다!

1단계: Python 환경 설정

시작하기 전에, 필요한 ���구와 라이브러리를 갖춘 Python 환경을 먼저 설정해야 합니다. 여기에는 다음과 같은 패키지를 설치하고 임포트하는 작업이 포함됩니다. TensorFlow, Keras, pandas, 및 NumPy. 걱정하지 마세요. 환경을 성공적으로 설정할 수 있도록 명확한 안내를 제공하겠습니다.
!pip install basemap
!pip install scikeras
!pip install tensorflow

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau

2단계: 데이터 수집 및 전처리

다음 단계는 모델 학습을 위해 지진 데이터를 수집하는 것입니다. 이 튜토리얼에서는 “Significant Earthquakes, 1965–2016” 데이터셋을 사용하지만, 관심 있는 다른 데이터셋을 탐색해도 좋습니다.
# Loading Dataset
data = pd.read_csv("database.csv")
print(data.isnull()) # checking for null values
이 코드는 지진 데이터를 Python으로 불러오고 결측값이 있는지 확인합니다. 데이터를 불러온 뒤에는 오류를 수정하고 결측값을 채우며, 머신러닝 모델에 맞도록 형식을 정리해 깨끗한 데이터로 준비하겠습니다.
# Handling Missing Values
data=data.interpolate(method ='linear', limit_direction ='forward')
print(data)
그리고 이 코드는 선형 보간을 사용해 누락된 값을 채워 넣어, 분석에 바로 활용할 수 있도록 데이터를 준비합니다.

3단계: 탐색적 데이터 분석(EDA)

모델을 구축하기 전에 탐색적 데이터 분석(EDA)을 통해 데이터를 이해하는 것이 중요합니다. EDA는 시각화와 통계적 요약을 활용해 데이터의 추세, 이상치, 패턴을 밝혀냅니다. 이러한 인사이트는 더 효과적인 모델을 만드는 데 지침이 됩니다.
# lets see the dataset statistic
data.describe()
이 명령은 데이터셋의 통계 요약을 제공하여 평균, 표준편차, 범위와 같은 핵심 지표를 처음으로 확인할 수 있게 해줍니다.
위도와 경도 산점도
plt.figure(figsize=(10, 6))
plt.scatter(data['Longitude'], data['Latitude'], c=data['Magnitude'], cmap='viridis', s=50, alpha=0.7)
plt.colorbar(label='Magnitude')
plt.xlabel('Longitude')
plt.ylabel('Latitude')
plt.title('Earthquake Locations')
plt.show()

# Scatter plot for Magnitude and Depth
plt.figure(figsize=(10, 6))
plt.scatter(data['Magnitude'], data['Depth'], alpha=0.7)
plt.xlabel('Magnitude')
plt.ylabel('Depth')
plt.title('Magnitude vs Depth')
plt.show()

from mpl_toolkits.basemap import Basemap


m = Basemap(projection='mill',llcrnrlat=-80,urcrnrlat=80, llcrnrlon=-180,urcrnrlon=180,lat_ts=20,resolution='c')


longitudes = data["Longitude"].tolist()
latitudes = data["Latitude"].tolist()
x,y = m(longitudes,latitudes)


fig = plt.figure(figsize=(12,10))
plt.title("All affected areas")
m.plot(x, y, "o", markersize = 2, color = 'green')
m.drawcoastlines()
m.fillcontinents(color='coral',lake_color='aqua')
m.drawmapboundary()
m.drawcountries()
plt.show()
이 그래프는 지진 규모와 깊이의 관계를 보여 주어, 지진 활동에 대한 추가 인사이트를 제공합니다.
지리적 시각화를 강화하기 위해 Python의 Basemap 라이브러리를 사용할 수 있으며, 이를 통해 전 세계 지도에 지진 위치를 손쉽게 표시할 수 있습니다.


4단계: 특성 엔지니어링

모델의 입력이 될 특성을 신중하게 선정하고 준비해야 합니다. 이를 위해 지진에 대한 도메인 지식을 활용하고 통계적 방법을 적용합니다. 우리 데이터셋에서 핵심 특성은 날짜, 시간, 위도, 경도, 깊이, 규모이며, 이외에도 추가 변수를 탐색할 여지가 있습니다.
data = data[['Date', 'Time', 'Latitude', 'Longitude', 'Depth', 'Magnitude']]
data.head()
하지만 현재 Date와 Time은 문자열 형식입니다. 이 특성들을 더 효과적으로 활용하려면, 모델이 쉽게 다룰 수 있도록 datetime 형식으로 변환해야 합니다.
import datetime
import time


timestamp = []
for d, t in zip(data['Date'], data['Time']):
try:
ts = datetime.datetime.strptime(d+' '+t, '%m/%d/%Y %H:%M:%S')
timestamp.append(time.mktime(ts.timetuple()))
except ValueError:
# print('ValueError')
timestamp.append('ValueError')


timeStamp = pd.Series(timestamp)
data['Timestamp'] = timeStamp.values


final_data = data.drop(['Date', 'Time'], axis=1)
final_data = final_data[final_data.Timestamp != 'ValueError']
final_data.head()

5단계: 머신러닝 모델 구축

이제 데이터 준비와 특성 구성이 끝났으니, 지진 예측 모델을 구축할 차례입니다. 우리는 이를 위해 신경망 지진 데이터에서 패턴을 발견하고, 모델 아키텍처를 정의한 뒤 학습과 하이퍼파라미터 튜닝까지 단계별로 안내합니다.
X = final_data[['Timestamp', 'Latitude', 'Longitude']]
y = final_data[['Magnitude', 'Depth']]
현실적인 환경을 모사하기 위해 보지 못한 데이터로 모델을 평가할 수 있도록, 먼저 데이터를 학습용과 테스트용 세트로 분할합니다.
from sklearn.model_selection import train_test_split
import wandb
from wandb.integration.keras import WandbEvalCallback, WandbMetricsLogger


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)


# Normalize the data
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
다음으로 모델이 효과적으로 학습할 수 있도록 데이터를 정규화합니다.
# Define the model
model = Sequential()
model.add(Dense(128, input_dim=X_train.shape[1], activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(32, activation='relu'))
model.add(Dense(2)) # Output layer with 2 neurons for 'Magnitude' and 'Depth'


# Compile the model
model.compile(optimizer='adam', loss='mean_squared_error')


# Summary of the model
model.summary()


지진 데이터의 패턴을 발견할 수 있도록 계층을 구성해 신경망을 정의합니다. 그런 다음 학습 과정을 올바르게 이끌기 위해 최적화 알고리즘과 손실 함수를 사용해 모델을 컴파일합니다.
history = model.fit(X_train, y_train, epochs=200, batch_size=32, validation_split=0.2, verbose=1)


test_loss = model.evaluate(X_test, y_test, verbose=1)
print(f'Test Loss: {test_loss}')


# Make predictions
y_pred = model.predict(X_test)


# Calculate the Mean Squared Error
mse = mean_squared_error(y_test, y_pred) print(f'Mean Squared Error: {mse}')
마지막으로 여러 에포크에 걸쳐 모델을 학습시켜 지진 패턴을 예측하는 능력을 점진적으로 개선합니다. 학습이 끝나면 보지 못한 데이터로 성능을 평가하고, 정확도를 판단하기 위해 평균제곱오차와 같은 지표를 계산합니다.


6단계. Weights & Biases를 사용한 모델 평가

여정은 모델을 구축하는 것으로 끝나지 않습니다. 예측의 정확도를 최대한 높이기 위해 모델 성능을 엄격하게 평가해야 합니다.
여기에서 Weights & Biases가 역할을 합니다. 강력한 추적 및 시각화 도구를 통해 정확도와 손실 같은 핵심 지표를 기록하여, 모델을 반복적으로 미세 조정하고 성능을 개선할 수 있습니다.
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau
wandb.init(config={"hyper": "parameter"})

early_stopping = EarlyStopping(monitor='val_loss', patience=20, restore_best_weights=True)
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.5, patience=10, min_lr=0.0001)



class WandbClfEvalCallback(WandbEvalCallback):
def __init__(self, validation_data, data_table_columns, pred_table_columns, num_samples=100):
super().__init__(data_table_columns, pred_table_columns)
self.x = validation_data[0]
self.y = validation_data[1]
self.num_samples = num_samples

def add_ground_truth(self, logs=None):
for idx, (features, label) in enumerate(zip(self.x[:self.num_samples], self.y[:self.num_samples])):
self.data_table.add_data(idx, features.tolist(), label[0], label[1])

def add_model_predictions(self, epoch, logs=None):
preds = self._inference()
table_idxs = self.data_table_ref.get_index()

for idx in table_idxs:
pred = preds[idx]
self.pred_table.add_data(
epoch,
self.data_table_ref.data[idx][0], # features
self.data_table_ref.data[idx][1], # true magnitude
self.data_table_ref.data[idx][2], # true depth
pred[0], # predicted magnitude
pred[1] # predicted depth
)

def _inference(self):
preds = []
for features in self.x[:self.num_samples]:
pred = self.model.predict(tf.expand_dims(features, axis=0), verbose=0)
preds.append(pred[0])
return preds

history = model.fit(
X_train, y_train,
validation_data=(X_test, y_test),
epochs=300,
batch_size=32,
verbose=1,
callbacks=[
early_stopping,
reduce_lr,
WandbMetricsLogger(),
WandbClfEvalCallback(
validation_data=(X_test, y_test),
data_table_columns=["idx", "features", "true_magnitude", "true_depth"],
pred_table_columns=["epoch", "features", "true_magnitude", "true_depth", "pred_magnitude", "pred_depth"],
),
]
)



Weights & Biases는 모델 버전 관리, 실험 추적, 협업 도구와 같은 추가 기능도 제공하여 모델을 손쉽게 비교하고 결과를 공유하며, 실제 지진 예측을 위해 모델을 배포하는 것까지 지원합니다. 이러한 기능은 우리의 접근 방식을 지속적으로 최적화하고 정교화하는 데 도움이 됩니다.

과제와 향후 방향

프로젝트 전반에 걸쳐, 지진 예측을 위해 Python에서 표 형식 데이터를 효과적으로 활용하는 과정을 배우면서 여러 가지 과제에 직면했습니다. 처음에는 모델을 100에포크 동안 학습해도 좋은 결과가 나오지 않았고, 300에포크로 늘리자 과적합이 발생했습니다. 이를 해결하기 위해 조기 종료를 적용하여 과적합 없이 효율적으로 학습할 수 있도록 했습니다.
또한 표 형식 데이터에서 패턴을 더 잘 포착할 수 있도록 은닉층의 뉴런 수를 늘려 모델을 고도화했습니다. 그러나 이러한 복잡도 증가는 과적합 위험을 높였기 때문에, 이를 완화하기 위해 드롭아웃 층 개선하기 위해 모델 정규화.
앞으로는 실시간 지진 센서 데이터를 활용해 예측을 동적으로 지속 업데이트함으로써 정확도를 높일 수 있습니다. 또한 Transformer나 어텐션 기반 모델과 같은 더 발전된 아키텍처를 탐색하면, 표 형식 데이터 안의 장기 의존성과 복잡한 패턴을 더욱 효과적으로 파악하는 데 도움이 될 것입니다.
또한 지질·판구조 자료와 같은 다양한 기법과 데이터 소스를 결합하면 보다 포괄적인 지진 예측 모델을 구축할 수 있습니다. 서로 다른 분야의 전문가 간 협업은 표 형식 데이터와 머신러닝을 지진 예측에 효과적으로 활용하는 능력을 발전시키는 데 결정적으로 중요합니다.

결론

이 프로젝트에서는 지진 예측을 위해 표 형식 데이터를 다루는 데 Python과 머신러닝을 어떻게 활용할 수 있는지 탐구했습니다. 그 과정에서 과적합과 같은 과제를 해결하고, 모델 아키텍처를 정교화했으며, 구조화된 데이터가 의미 있는 통찰을 어떻게 이끌어낼 수 있는지 확인했습니다.
여기에서 배운 표 형식 데이터의 정제, 준비, 모델링에 관한 교훈은 이제 다양한 활용 사례에 적용할 수 있습니다. 금융 예측, 헬스케어 분석, 혹은 구조화된 데이터에 의존하는 어떤 분야든 이 튜토리얼에서 익힌 기법과 도구는 복잡한 데이터셋을 다루고 의미 있는 예측을 수행하는 데 큰 도움이 됩니다. 표 형식 데이터로 할 수 있는 일은 매우 넓으며, 꾸준히 연습한다면 이러한 역량을 바탕으로 다양한 실제 문제를 해결할 수 있습니다.




이 글은 AI로 번역된 기사입니다. 오역이 의심되는 부분이 있다면 댓글로 알려주세요. 원문 보고서는 아래 링크에서 확인하실 수 있습니다: 원문 보고서 보기