이 코드는 Google 스프레드시트의 데이터를 가져와서 선형 회귀 모델을 학습시키고, 이를 통해 예측 값을 계산한 후 그래프로 시각화하는 전체 과정을 보여줍니다. 주요 흐름은 다음과 같습니다:
1. 한글 폰트 설정: 그래프에서 한글을 제대로 표시하기 위해 `NanumGothic` 폰트를 사용하도록 설정합니다.
2. Google Sheets API 설정:
- 서비스 계정을 사용하여 Google Sheets API에 인증하고 클라이언트를 생성합니다.
- 특정 스프레드시트 ID와 시트 이름을 기반으로 데이터를 가져옵니다.
3. 데이터 가공:
- 스프레드시트에서 B 열과 C 열(두 번째, 세 번째 열)을 X로, D 열(네 번째 열)을 y로 설정하여 회귀 분석에 사용할 데이터를 준비합니다.
4. 회귀 모델 학습:
- LinearRegression 클래스를 사용해 선형 회귀 모델을 생성하고, X와 y 데이터를 사용해 학습시킵니다.
- 학습이 완료되면 회귀 계수(가중치) `w1`, `w2`와 절편 `b` 값을 계산해 출력합니다.
5. 새로운 데이터 예측:
- 1000번째 행의 B, C 값을 가져와 D1000 값을 예측하고, 실제 값과 예측 값을 비교합니다.
6. 그래프 시각화:
- 실제 D값과 예측된 D값을 비교하여 그래프로 시각화하고, D1000 예측 값을 강조하여 표시합니다.
- 그래프 제목, 축 레이블, 범례 등에 한글 폰트를 적용하여 표시합니다.
이 코드는 데이터 분석과 예측 결과를 시각화하는 좋은 예로, 특히 Google Sheets API와 회귀 분석을 연계한 작업을 보여줍니다.
LinearRegression.py
python LinearRegression.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' # 폰트 경로
fontprop = fm.FontProperties(fname=font_path) # 폰트 속성 설정
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)
# 범위 설정: A2:D999 범위에서 데이터 가져오기 (2행부터 999행까지 사용)
range_name = 'A2:D999'
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)
# D1000의 실제 값과 예측 값을 출력
actual_value_D1000 = 3572 # 실제 값 설정
print(f"\nD1000 의 실제 값: {actual_value_D1000}")
print(f"D1000 의 예측 값: {predicted_value[0]:.4f}")
# 예측 값과 실제 값을 비교하는 그래프 그리기
plt.figure(figsize=(10, 6))
plt.plot(range(2, 1000), y, label="실제 D값", color='blue')
plt.plot(range(2, 1000), predicted_y, label="예측 D값", linestyle='--', color='red')
plt.scatter(1000, predicted_value, label=f"D1000 예측 값: {predicted_value[0]:.2f}", color='green', marker='x', s=100)
# 그래프 제목, 축 레이블 및 범례 설정 (폰트 적용)
plt.title("실제 D값 vs 예측 D값 (Linear Regression)", fontsize=16, fontproperties=fontprop)
plt.xlabel("데이터 인덱스 (2 ~ 999)", fontsize=12, fontproperties=fontprop)
plt.ylabel("D 값", fontsize=12, fontproperties=fontprop)
# 범례 설정
plt.legend(prop=fontprop)
# 그리드 추가
plt.grid(True)
# 그래프 보여주기
plt.show()
댓글목록0
댓글 포인트 안내