이전에 작성한 포스팅에서는 등산객수만을 이용하여 단순한 예측을 하게 하였습니다. 하지만 실제로 하나의 사건은 여러 요소에 의해 발생합니다. 이번에는 등산객수와 기온이라는 2가지 요소가 산불에 어떻게 영향을 미치는지 알아보는 프로그램을 통해 다중 선형회귀 모델을 알아보도록 하겠습니다.
선형회귀 모델에 대해서는 아래 링크에서 확인할수 있습니다.
https://coding-guide.tistory.com/20
파이썬을 이용한 인공지능 선형회귀 프로그램-등산객수에 따른 산불 발생량 예측
성형회귀 모델을 설명하기 위해 등산객 수와 산불 발생량 사이의 연관성을 분석하는 샘플 프로그램을 작성해 보겠습니다. 파이썬과 scikit-learn 라이브러리를 사용하여 선형회귀(Linear Regression) 모
coding-guide.tistory.com
1. 다중선형회귀 모델이란?
다중 선형 회귀는 하나의 결과(종속 변수)를 여러 개의 원인(독립 변수)으로 예측하는 통계 기법입니다. 예를 들어 산불 발생량을 예측할 때, 등산객 수와 기온을 함께 고려하면 더 정확한 예측이 가능합니다. 회귀식은 "y = a₁x₁ + a₂x₂ + ... + b" 형태로, 각 독립 변수(x₁, x₂ 등)는 결과에 영향을 미치는 요인이며, a₁, a₂는 그 영향의 크기입니다. 파이썬에서는 scikit-learn으로 쉽게 구현할 수 있습니다.
2. 다중 선형회귀를 이용한 샘플 프로그램 - 등산객수와 기온에 따른 산불 발생량 예측
[예제]
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import platform
# 한글 폰트 설정
if platform.system() == 'Windows':
plt.rc('font', family='Malgun Gothic')
elif platform.system() == 'Darwin':
plt.rc('font', family='AppleGothic')
else:
plt.rc('font', family='NanumGothic')
plt.rcParams['axes.unicode_minus'] = False
# 데이터 준비
data = {
'hikers': [10, 20, 30, 40, 50, 60, 70],
'temperature': [15, 17, 20, 23, 25, 27, 30],
'fires': [1, 2, 2, 3, 4, 4, 5]
}
df = pd.DataFrame(data)
# 다중 선형회귀 모델 학습
X = df[['hikers', 'temperature']]
y = df['fires']
model = LinearRegression()
model.fit(X, y)
# 새로운 데이터 예측 (예: 등산객 80, 기온 29도)
future = pd.DataFrame({'hikers': [80], 'temperature': [29]})
prediction = model.predict(future)
print(f"예측된 산불 발생량: {prediction[0]:.2f}건")
# 예측 평면 만들기
hikers_range = np.linspace(df['hikers'].min(), df['hikers'].max(), 10)
temp_range = np.linspace(df['temperature'].min(), df['temperature'].max(), 10)
hikers_grid, temp_grid = np.meshgrid(hikers_range, temp_range)
X_pred = pd.DataFrame({
'hikers': hikers_grid.ravel(),
'temperature': temp_grid.ravel()
})
fires_pred = model.predict(X_pred).reshape(hikers_grid.shape)
# 3D 시각화
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
# 산점도 (실제 데이터)
ax.scatter(df['hikers'], df['temperature'], df['fires'], color='green', label='실제 데이터')
# 예측 평면
ax.plot_surface(hikers_grid, temp_grid, fires_pred, alpha=0.5, cmap='coolwarm', edgecolor='none')
# 축 라벨
ax.set_xlabel('등산객 수 (천 명)')
ax.set_ylabel('기온 (°C)')
ax.set_zlabel('산불 발생 건수')
ax.set_title('등산객 수 및 기온에 따른 산불 발생 예측 (3D)')
plt.legend()
plt.tight_layout()
plt.show()
[결과]
3. "등산객수와 기온에 따른 산불 발생량 예측" 프로그램 설명
3-1. 데이터 준비
data = {
'hikers': [10, 20, 30, 40, 50, 60, 70],
'temperature': [15, 17, 20, 23, 25, 27, 30],
'fires': [1, 2, 2, 3, 4, 4, 5]
}
df = pd.DataFrame(data)
- hikers: 등산객 수 (단위: 천 명)
- temperature: 해당일의 평균 기온 (도씨)
- fires: 실제로 발생한 산불 건수
여기서 우리는 두 개의 독립 변수 hikers, temperature를 이용해 종속 변수 fires를 예측합니다.
3-2. 회귀 모델 학습
from sklearn.linear_model import LinearRegression
X = df[['hikers', 'temperature']] # 독립 변수 2개
y = df['fires'] # 종속 변수 (예측 대상)
model = LinearRegression()
model.fit(X, y)
- X: 입력값으로 등산객 수와 기온이 함께 들어감
- model.fit(X, y): 이 데이터를 바탕으로 컴퓨터가 최적의 기울기와 절편을 학습함
결과: fires = a × hikers + b × temperature + c 형태의 예측 공식이 만들어집니다.
3-3. 예측 평면 만들기 (시각화용 데이터)
hikers_range = np.linspace(df['hikers'].min(), df['hikers'].max(), 10)
temp_range = np.linspace(df['temperature'].min(), df['temperature'].max(), 10)
hikers_grid, temp_grid = np.meshgrid(hikers_range, temp_range)
X_pred = pd.DataFrame({
'hikers': hikers_grid.ravel(),
'temperature': temp_grid.ravel()
})
fires_pred = model.predict(X_pred).reshape(hikers_grid.shape)
- np.meshgrid: 등산객 수와 기온을 조합한 격자형 데이터를 생성
- model.predict: 예측된 산불 발생량을 2차원 격자형 배열로 출력
이 데이터를 바탕으로 예측 결과를 3D 표면 그래프로 시각화할 수 있습니다.
3-4. 시각화 (3D 그래프)
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
# 실제 측정 데이터
ax.scatter(df['hikers'], df['temperature'], df['fires'], color='green', label='실제 데이터')
# 예측된 평면
ax.plot_surface(hikers_grid, temp_grid, fires_pred, alpha=0.5, cmap='coolwarm', edgecolor='none')
ax.set_xlabel('등산객 수 (천 명)')
ax.set_ylabel('기온 (°C)')
ax.set_zlabel('산불 발생 건수')
ax.set_title('등산객 수 및 기온에 따른 산불 발생 예측')
plt.legend()
plt.tight_layout()
plt.show()
- ax.scatter: 실제 측정된 데이터를 초록 점으로 표시
- ax.plot_surface: 예측된 산불 발생량을 컬러 표면으로 표현
- 각 축(X, Y, Z)을 등산객 수, 기온, 산불 건수로 구성해 입체적으로 표현함
'파이썬' 카테고리의 다른 글
파이썬으로 엑셀파일 만들어 데이터 쓰고 저장하기 (0) | 2025.04.09 |
---|---|
파이썬으로 텍스트 및 엑셀 파일 불러오기 (예제 코드 포함) (1) | 2025.04.09 |
파이썬 자료형-리스트(List) 문법 강좌 정리 노트 (1) | 2025.04.08 |
파이썬 자료형-숫자형 문법 강좌 정리 노트 (정수형, 실수형, 복소수형) (2) | 2025.04.08 |
파이썬에서 텐서플로 사용시 발생되는 oneDNN 관련 오류 해결방법 (tensorflow onednn custom operations error) (0) | 2025.04.08 |