이 코드는 Google 스프레드시트에서 데이터를 가져와 기 설계된 선형 회귀 모델을 분석, 회귀계수, 절편을 보정 적용하고 선형 회귀 방정식을 도출하는 선형회귀의 예 입니다. 예측된 결과를 실제 데이터와 비교하여 시각화하는 내용을 담고 있습니다. 주요 흐름은 다음과 같습니다.
1. 한글 폰트 설정: 그래프에서 한글이 깨지지 않도록 `NanumGothic` 폰트를 설정합니다.
2. Google Sheets API 설정:
- 서비스 계정을 통해 Google Sheets API에 접근할 수 있도록 인증 설정을 합니다.
- 특정 스프레드시트 ID와 시트 이름을 통해 데이터를 불러옵니다.
3. 데이터 가공:
- B 열과 C 열 데이터를 회귀 분석의 입력 변수 X로, D 열 데이터를 출력 변수 y로 설정합니다.
4. 선형 회귀 모델 학습:
- LinearRegression 모델을 사용해 데이터를 학습시킵니다.
- 학습된 모델로부터 회귀 계수(가중치) `w1`, `w2`와 절편 `b`를 출력합니다.
- 회귀 방정식은 `D = w1 * B + w2 * C + b`로 표현됩니다.
5. D1000 값 예측:
- 1000번째 행의 B, C 값을 기반으로 D1000 값을 예측합니다.
- 예측된 값과 실제 값(3572)을 비교하여 출력합니다.
6. 그래프 시각화:
- 실제 D값(파란 점)과 예측된 D값(빨간 선)을 그래프로 나타냅니다.
- D1000의 예측 값을 초록색으로 강조하여 표시합니다.
- 제목, 축 레이블, 범례 등을 설정하고, 시각적으로 명확하게 표현합니다.
이 코드는 데이터 분석 및 예측, 시각화를 포함한 과정을 매우 직관적으로 보여주며, Google Sheets API와 머신러닝을 결합한 예시입니다.
LR_equation.py
python LR_equation.py
import gspread
import numpy as np
from sklearn.linear_model import LinearRegression
from google.oauth2.service_account import Credentials
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 한글 폰트 설정 (NanumGothic)
font_path = 'C:/Windows/Fonts/NanumGothic.ttf' # NanumGothic 폰트 경로
fontprop = fm.FontProperties(fname=font_path, size=12) # 폰트 설정
plt.rc('font', family='NanumGothic') # 폰트 설정
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 방지
# Google Sheets API 스코프 설정
# 서비스 계정 JSON 파일 경로
creds = Credentials.from_service_account_file(
'F:/app/ai-gpt.kr/public_html/key/centreor-e8c3cad54c74.json',
scopes=SCOPES
)
# Google Sheets API 클라이언트 생성
client = gspread.authorize(creds)
# 스프레드시트 ID 및 시트 이름 설정
spreadsheet_id = '1VtpNYw6GpMU1mOQzw0etSB6Bu7Zd3qJRBz8xi0cGHL4'
sheet_name = 'Sheet1'
# 스프레드시트에서 시트 선택
sheet = client.open_by_key(spreadsheet_id).worksheet(sheet_name)
# 2행부터 1000행까지 데이터 가져오기 (D1000 값 포함)
range_name = 'A2:D1000'
data = sheet.get(range_name)
# 데이터 가공
X = np.array([[int(row[1]), int(row[2])] for row in data]) # B값과 C값
y = np.array([int(row[3]) for row in data]) # D값
# 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X, y)
# 회귀 계수와 절편 저장
w1, w2 = model.coef_
b = model.intercept_
# 회귀 계수와 절편 출력
print(f"회귀 계수 (가중치): w1 = {w1:.4f}, w2 = {w2:.4f}")
print(f"절편: b = {b:.4f}")
print(f"회귀 방정식: D = {w1:.4f} * B + {w2:.4f} * C + {b:.4f}")
# 1000번째 행의 B값과 C값을 사용하여 D1000 값을 예측
range_name_1000 = 'B1000:C1000'
data_1000 = sheet.get(range_name_1000)[0]
new_x = np.array([[int(data_1000[0]), int(data_1000[1])]])
# D1000 값 예측
predicted_value = model.predict(new_x)
# 예측된 D값 생성
predicted_y = model.predict(X)
# 예측 결과 출력 및 실제 값과의 비교
print(f"\nD1000 의 실제 값: 3572")
print(f"D1000 의 예측 값: {predicted_value[0]:.4f}")
# 그래프 그리기
plt.figure(figsize=(12, 8))
# 실제 D값을 파란색 점으로 표시
plt.scatter(range(2, 1001), y, color='blue', label="실제 D값", alpha=0.6)
# 예측된 D값을 빨간색 선으로 표시
plt.plot(range(2, 1001), predicted_y, color='red', linestyle='--', label="예측 D값", alpha=0.8)
# D1000의 예측값을 초록색으로 강조
plt.scatter(1000, predicted_value, color='green', label=f"D1000 예측 값: {predicted_value[0]:.2f}", marker='x', s=200)
# 제목과 레이블 설정 (한글 폰트 적용)
plt.title("실제 D값 vs 예측 D값 (Linear Regression)", fontsize=16, fontproperties=fontprop)
plt.xlabel("데이터 인덱스 (2 ~ 1000)", fontsize=12, fontproperties=fontprop)
plt.ylabel("D 값", fontsize=12, fontproperties=fontprop)
# 범례 추가
plt.legend(prop=fontprop)
# 그리드 추가
plt.grid(True)
# 그래프 보여주기
plt.show()
댓글목록0
댓글 포인트 안내