Data Science/Python

Linear Regression (μ„ ν˜• νšŒκ·€) - 2 | Simple Linear Regression (λ‹¨μˆœ μ„ ν˜• νšŒκ·€)

Chan Lee 2024. 6. 2. 15:34

μ €λ²ˆ ν¬μŠ€νŠΈμ—μ„œλŠ” μ„ ν˜• νšŒκ·€μ—μ„œ 주둜 μ‚¬μš©λ˜λŠ” νŒ¨ν‚€μ§€λ“€μ— λŒ€ν•΄μ„œ κ°„λž΅ν•˜κ²Œ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

 

Linear Regression (μ„ ν˜• νšŒκ·€) - 1 | νŒ¨ν‚€μ§€ μ•Œμ•„λ³΄κΈ°

이번 ν¬μŠ€νŠΈμ—μ„œλŠ” νŒŒμ΄μ¬μ„ μ‚¬μš©ν•΄μ„œ 기초적 μ„ ν˜• νšŒκ·€ λͺ¨λΈμ„ λ§Œλ“€μ–΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.μ„ ν˜• νšŒκ·€μ˜ 기초적 κ°œλ…μ— λŒ€ν•΄μ„œλŠ” λ‹€μŒ ν¬μŠ€νŠΈμ— μ •λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. Regression Analysis - Linear Regression | 회

code-studies.tistory.com

 

이번 ν¬μŠ€νŠΈμ—μ„œλŠ” μš°μ„  κ°„λ‹¨ν•œ λ‹¨μˆœ μ„ ν˜• νšŒκ·€ λͺ¨λΈμ„ λ””μžμΈ ν•΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

μš°μ„ , 이번 ν¬μŠ€νŠΈμ—μ„œ ν•„μš”ν•œ νŒ¨ν‚€μ§€λ“€μ„ import ν•˜κ² μŠ΅λ‹ˆλ‹€.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm

pandas, numpy, matplotlib은 λ§€μš° ν”ν•˜κ²Œ μ‚¬μš©λ˜κ³ , numpysλŠ” 이번 ν¬μŠ€νŠΈμ—μ„œ ν•„μš”κ°€ 없을 μˆ˜λ„ μžˆμ§€λ§Œ μš°μ„  μΆ”κ°€ν•΄λ‘κ² μŠ΅λ‹ˆλ‹€.

그리고 νšŒκ·€ λͺ¨λΈμ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©ν•  statsmodels.api λΌμ΄λΈŒλŸ¬λ¦¬λ„ μΆ”κ°€ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

그리고, 뢄석 λ°μ΄ν„°λ‘œ ν™œμš©ν•  csv νŒŒμΌμž…λ‹ˆλ‹€.

이 λ°μ΄ν„°λŠ” 미ꡭ의 수λŠ₯ SAT의 성적과, λŒ€ν•™κ΅ μ‘Έμ—… μ‹œμ˜ 학점 GPA 정보λ₯Ό λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

Simple_Linear_Regression.csv
0.00MB

 

μœ„ νŒŒμΌμ„ python λ˜λŠ” ipynb 파일과 λ™μΌν•œ 폴더에 μœ„μΉ˜ν•΄μ£Όμ‹œκ³ , 

pandasλ₯Ό ν™œμš©ν•˜μ—¬ λ‹€μŒκ³Ό 같은 μ½”λ“œλ‘œ μ½μ–΄μ€λ‹ˆλ‹€.

data = pd.read_csv('Simple_Linear_Regression.csv')

 

pd.read_csv([file name])으둜 csv νŒŒμΌμ„ 읽으면,

pandasλŠ” μžλ™μœΌλ‘œ 이λ₯Ό 닀루기 μ‰¬μš΄ ν˜•νƒœλ‘œ formatting ν•΄μ€λ‹ˆλ‹€.

좜λ ₯ν•΄μ„œ 확인해보면 λ‹€μŒκ³Ό 같이 λ³΄μž…λ‹ˆλ‹€.

data 좜λ ₯ κ²°κ³Ό

 

 

ν•œλ²ˆ 이 데이터에 λŒ€ν•œ 정보λ₯Ό μ•Œμ•„λ³ΌκΉŒμš”?

data.describe()

 

좜λ ₯ κ²°κ³Ό

μš°λ¦¬κ°€ pandas둜 ν¬λ©§νŒ…ν•œ data에 describe λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•˜λ©΄,

λ°μ΄ν„°μ˜ 수, 평균, ν‘œμ€€νŽΈμ°¨, μ΅œμ†Ÿκ°’, Q1, Q2 (median), Q3, μ΅œλŒ€κ°’μ„ μ°¨λ‘€λ‘œ λ³΄μ—¬μ€λ‹ˆλ‹€.

처음 데이터λ₯Ό 이해할 λ•Œ 도움이 λ˜κ² λ„€μš”

 

총 84개의 μ μˆ˜κ°€ μ‘΄μž¬ν•˜κ³ , 평균을 λΉ„λ‘―ν•œ μ—¬λŸ¬ μƒ˜ν”Œ λ°μ΄ν„°μ˜ 값듀을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

이제 μš°λ¦¬λŠ” μœ„ 데이터λ₯Ό ν™œμš©ν•΄μ„œ 우리의 첫 νšŒκ·€ λͺ¨λΈμ„ λ””μžμΈν•  것 μž…λ‹ˆλ‹€.

우리의 λͺ¨λΈμ—μ„œλŠ” 수λŠ₯ 성적, SAT Scoreλ₯Ό 기반으둜 λŒ€ν•™κ΅ μ‘Έμ—…μ‹œμ˜ 학점, GPAλ₯Ό μ˜ˆμΈ‘ν•  것 μž…λ‹ˆλ‹€.

 

수λŠ₯ 성적과 GPAμ—λŠ” 인과관계가 μ‘΄μž¬ν•  ν™•λ₯ μ΄ λ†’κ² μ£ ?

μ΄λŸ¬ν•œ λΆ€λΆ„ μ—­μ‹œ νšŒκ·€ λͺ¨λΈμ„ λ””μžμΈν•  λ•Œ 맀우 μ€‘μš”ν•©λ‹ˆλ‹€.

λ‹Ήμ—°ν•˜μ§€λ§Œ, 말이 λ˜μ§€ μ•ŠλŠ” νšŒκ·€ λͺ¨λΈμ„ μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€.

 

μ΄ˆλ“±ν•™κ΅ 1ν•™λ…„λ•Œ λ°›μ•„μ“°κΈ° 점수둜 λŒ€ν•™κ΅ μ‘Έμ—…μ‹œμ˜ 학점을 μ˜ˆμΈ‘ν•˜λŠ” 것은 쑰금 말이 λ˜μ§€ μ•Šμ„ ν™•λ₯ μ΄ λ†’μŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, 수λŠ₯ 성적과 λŒ€ν•™ 성적 μ‚¬μ΄μ—λŠ” 인과관계가 μžˆλŠ”κ²Œ μ’€ 더 말이 되겠죠?

μ΄λŸ¬ν•œ 점을 잘 κ³ λ €ν•΄μ„œ λͺ¨λΈμ„ λ””μžμΈν•˜λ„λ‘ ν•΄λ΄…μ‹œλ‹€.

 

 

기쑴의 ν¬μŠ€νŠΈμ—μ„œ μ„€λͺ…ν–ˆλ“―, λ‹¨μˆœ μ„ ν˜• νšŒκ·€μ˜ 곡식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

yΜ‚ = b0 + b1*x1

우리의 λͺ¨λΈμ—μ„œλŠ” SAT둜 GPAλ₯Ό μ˜ˆμΈ‘ν•˜λ―€λ‘œ, μš°μ„  μ˜ˆμΈ‘κ°’ y와 독립 λ³€μˆ˜ x에 λŒ€ν•œ λ³€μˆ˜λ“€μ„ μ„ μ–Έν•˜κ² μŠ΅λ‹ˆλ‹€.

y = data['GPA']
x1 = data['SAT']

 

이둜써 μš°λ¦¬λŠ” dataμ—μ„œ 'GPA'λ₯Ό μ—΄λ‘œ κ°€μ§€λŠ” 값듀을 y에, 'SAT'λ₯Ό μ—΄λ‘œ κ°€μ§€λŠ” 값듀을 x에 μ €μž₯ν–ˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό matplotlib으둜 ν•œλ²ˆ ν•œλ²ˆ ν™•μΈν•΄λ³ΌκΉŒμš”?

plt.scatter(x1, y)
plt.xlabel("SAT", fontsize=20)
plt.ylabel("GPA", fontsize=20)
plt.show()

 

x 좕에 SAT, y 좕에 GPAλ₯Ό λ‚˜νƒ€λ‚΄μ–΄ 각 데이터듀이 μ•„μ£Ό 잘 scatter plot으둜 μ‹œκ°ν™” λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ–ΌμΆ” 이 값듀이 μš°μƒν–₯ν•˜λŠ” μ§μ„ μ˜ κ²½ν–₯성을 λ³΄μΈλ‹€λŠ” 점을 인지할 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄, ν•΄λ‹Ή κ·Έλž˜ν”„μ˜ μ‹œμž‘ μƒμˆ˜, b0 값은 λ¬΄μ—‡μΌκΉŒμš”?

 

x = sm.add_constant(x1)
results = sm.OLS(y, x).fit()
results.summary()

statsmodels νŒ¨ν‚€μ§€μ—μ„œλŠ” add_constant() ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ μƒμˆ˜ b0의 값을 κ·Όμ‚¬ν•©λ‹ˆλ‹€.

sm.OLS(y, x)λ₯Ό ν†΅ν•΄μ„œ, μš°λ¦¬λŠ” results에 Orindary Least Squares Regression, 즉 μ΅œμ†Œ μ œκ³±λ²• νšŒκ·€μ˜ κ²°κ³Όλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

ν•΄λ‹Ή 값에 .fit() λ©”μ†Œλ“œλ₯Ό μ μš©ν•˜λ©΄ νŠΉμ •ν•œ 근사 ν…Œν¬λ‹‰ (우리의 경우 OLS)을 ν™œμš©ν•˜μ—¬ 우리의 데이터에 λ§žλŠ” λͺ¨λΈμ„ μ–»μŠ΅λ‹ˆλ‹€.

μ΅œμ†Œ μ œκ³±λ²•μ— λŒ€ν•΄μ„œλŠ” λ‚˜μ€‘μ— 더 μžμ„Ένžˆ μ‚΄ν”ΌκΈ°λ‘œ ν•˜κ³ , μš°μ„  그런게 μžˆκ΅¬λ‚˜ 라고만 μ΄ν•΄ν•˜λ©΄ μ’‹κ² μŠ΅λ‹ˆλ‹€.

 

μ΄μ–΄μ„œ results.summary()λŠ” κ²°κ³Όλ₯Ό μš”μ•½ν•˜λŠ” 3개의 ν‘œλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

μžμ„Έν•œκ±΄ λ‚˜μ€‘μ— 더 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ³ , μ΄λ²ˆμ—λŠ” const, SAT와 coef 이 λ§Œλ‚˜λŠ” μ§€μ μ˜ κ°’λ§Œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

μš°λ¦¬κ°€ 찾던 μƒμˆ˜ b0은 const와 coef이 λ§Œλ‚˜λŠ” μ§€μ μ˜ 값인 0.2750이 되겠고, 

x1에 κ³±ν•΄μ§€λŠ” κ³„μˆ˜μΈ b1은 κ·Έ λ°‘μ˜ 0.0017이 λ˜κ² μŠ΅λ‹ˆλ‹€.

 

κ·Έλ ‡λ‹€λ©΄ 식이 λŒ€μΆ© yΜ‚ = 0.275 + 0.0017x1 이 λ˜κ² λ„€μš”.

ν•œλ²ˆ matplotlib으둜 ν™•μΈν•΄λ³ΌκΉŒμš”?

 

 

plt.scatter(x1, y)
yhat = 0.0017*x1 + 0.275
fig = plt.plot(x1, yhat, lw=2, c='orange', label='regression line')
plt.xlabel('SAT', fontsize=20)
plt.ylabel('GPA', fontsize=20)
plt.show()

 

 

μ–΄λ–€κ°€μš”?

우리의 첫 μ„ ν˜• νšŒκ·€ λͺ¨λΈμ€ 주어진 μƒ˜ν”Œ 데이터λ₯Ό 기반으둜 λ‚˜λ¦„ μ •ν™•ν•˜κ²Œ SAT 성적 λŒ€λΉ„ GPA 성적을 μ˜ˆμΈ‘ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

κ·Έλž˜ν”„μ—μ„œμ˜ λ…Έλž€ μ„ , νšŒκ·€μ„ μ€ 각 데이터에 λŒ€ν•΄μ„œ 평균적인 거리가 κ°€μž₯ 짧은 μ§μ„ μž…λ‹ˆλ‹€.

λ‹€μ‹œ λ§ν•˜μžλ©΄, λͺ¨λ“  κ΄€μΈ‘λœ 값듀에 λŒ€ν•΄μ„œ κ°€μž₯ 짧은 거리λ₯Ό κ°€μ§€λŠ” μ„  μž…λ‹ˆλ‹€.

 

λ‹€μŒ ν¬μŠ€νŠΈμ—μ„œλŠ” sm.OLS().fit()으둜 ν”ΌνŒ…λœ λͺ¨λΈμ— λŒ€ν•΄μ„œ 

results.summary()λ₯Ό μ‚¬μš©ν–ˆμ„ λ•Œ λ‚˜μ˜€λŠ” 3개의 ν‘œμ— λŒ€ν•΄μ„œ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.