선형 회귀 방정식을 도출 및 시각화 > AI

본문 바로가기

인공지능 AI

마이홈
쪽지
맞팔친구
팔로워
팔로잉
스크랩
TOP
DOWN

[AI 참조] 선형 회귀 방정식을 도출 및 시각화

profile_image
관리자
2024-10-05 13:58 33 0
  • - 첨부파일 : 20241005140214.png (344.9K) - 다운로드
  • - 첨부파일 : 20241005140219.png (6.5K) - 다운로드

본문


이 코드는 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

등록된 댓글이 없습니다.

댓글쓰기

적용하기
자동등록방지 숫자를 순서대로 입력하세요.
게시판 전체검색