파이썬에서 회귀: 데이터에서 관계 찾기
단순히 데이터를 수집하는 것만으로는 부족합니다. 데이터로 스프레드시트를 채울 수 있지만, 이를 활용할 수 없다면 의미가 없습니다. 회귀 분석은 데이터에서 관계를 찾는 가장 강력한 통계 도구 중 하나입니다. 파이썬은 이를 쉽게 만들어주며, 스프레드시트보다 훨씬 유연합니다. 연필과 자를 내려놓고 대신 파이썬을 사용해 보세요. 시작하는 방법은 이렇습니다.
단순 선형 회귀: 경향 찾기
파이썬에서 가장 간단한 회귀 형태는, 음, 단순 선형 회귀입니다. 단순 선형 회귀를 사용하면 두 변수 간의 관계가 있는지 확인하려고 합니다. 첫 번째 변수는 "독립 변수"로 알려져 있고, 두 번째 변수는 "종속 변수"로 알려져 있습니다. 일반적으로 독립 변수는 x축에, 종속 변수는 y축에 플롯됩니다. 이는 데이터 포인트의 고전적인 산점도를 생성합니다. 목표는 이 산점도에 가장 잘 맞는 선을 플롯하는 것입니다.
우리는 뉴욕시 레스토랑의 팁 예제 데이터를 사용하여 시작할 것입니다. 총 청구서와 팁 간에 관계가 있는지 확인하고자 합니다. 이 데이터 세트는 내가 가장 좋아하는 데이터 시각화 도구인 Seaborn 통계 플로팅 패키지에 포함되어 있습니다. 나는 이러한 도구들을 쉽게 접근할 수 있도록 Mamba 환경에 설정했습니다.
먼저, 우리는 통계 플로팅 데이터베이스인 Seaborn을 가져올 것입니다.
import seaborn as sns
그러면 우리는 데이터셋을 로드할 것입니다:
tips = sns.load_dataset('tips')
Jupyter 노트를 사용하고 있다면, 제 GitHub 페이지에 링크된 노트와 같이 이미지를 외부 창이 아닌 노트북 내에서 표시하려면 이 줄을 포함하는 것이 좋습니다:
%matplotlib inline
이제 relplot 메서드를 사용하여 산점도를 살펴보겠습니다:
sns.relplot(x='total_bill',y='tip',data=tips)
산점도는 대부분 선형으로 보입니다. 이는 청구 금액과 팁 사이에 양의 선형 관계가 있을 수 있음을 의미합니다. 우리는 regplot 방법으로 회귀선을 그릴 수 있습니다:
sns.regplot(x='total_bill',y='tip',data=tips)
그 줄은 꽤 잘 맞는 것 같네요.
우리는 더 공식적인 분석을 위해 Pingouin이라는 다른 라이브러리를 사용할 수 있습니다. Pingouin의 linear_regression 메서드는 데이터 포인트에 맞게 선의 회귀 방정식의 계수를 계산하고 적합성을 결정합니다.
import pingouin as pg
pg.linear_regression(tips['total_bill'],tips['tip']).round(2)
반올림하면 결과를 읽기 쉬워질 것입니다. 선형 회귀에서 주목해야 할 숫자는 상관 계수입니다. 결과 테이블에서는 상관 계수의 제곱이므로 "r2"로 나와 있습니다. 그 값은 0.46으로, 좋은 적합성을 나타냅니다. 제곱근을 계산하면 약 0.68이 되어 1에 매우 가깝고, 이는 우리가 앞서 본 그래프보다 좀 더 공식적으로 긍정적인 선형 관계를 나타냅니다.
우리는 또한 표의 값을 사용하여 모델을 만들 수 있습니다. 여러분은 직선의 방정식인 y=mx + b를 기억할지도 모릅니다. 여기서 y는 종속 변수이고, m은 x의 계수, 즉 총 요금으로 0.11입니다. 이것이 선의 기울기를 결정합니다. b는 y-절편으로 0.92입니다.
이 모델을 기반으로 한 결과 방정식은
tip = 0.11(total bill) + 0.92
회귀의 방정식은 이것을 반대로 하므로, 다음과 같습니다:
tip = 0.92 + 0.11(total_bill)
우리는 청구서의 금액에 따라 팁을 예측하는 짧은 파이썬 함수를 작성할 수 있습니다.
def tip(total_bill):
return 0.92 + 0.11 * total_bill
두 번째 줄은 들여쓰기가 되어 있어야 하지만, 우리의 CMS는 이를 표시할 수 없으므로, 귀하의 컴퓨터에서 이 줄을 들여쓰기를 확인해 주세요. 파이썬에서의 들여쓰기는 네 개의 공백으로 이루어져 있다는 것을 기억하세요.
100달러 식사에서 팁을 예측해 봅시다:
tip(100)
예상되는 팁은 약 12달러입니다.
다중 선형 회귀: 회귀를 3차원으로, 그리고 그 너머로
선형 회귀는 두 개 이상의 변수로 확장될 수 있습니다. 더 많은 독립 변수를 살펴볼 수 있습니다. 평면에 있는 데이터 포인트에 선을 맞추는 대신, 산점도 위에 평면을 맞추고 있습니다. 불행히도, 이것은 2D 회귀보다 시각화하기가 더 어렵습니다. 저는 노트북 사양을 기반으로 가격 모델을 구축하기 위해 다중 회귀를 사용했습니다.
우리는 팁 데이터셋을 사용할 것입니다. 이번에는 "size" 열을 사용하여 파티의 크기를 살펴보겠습니다. Pingouin에서는 쉽게 할 수 있습니다.
pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
첫 번째 인수에서 총 청구서와 파티 규모를 지정하는 이중 괄호를 주목하십시오. r²가 동일하다는 점도 주목하십시오. 이는 다시 한 번 좋게 맞아떨어진다는 뜻이며, 총 청구서와 테이블 크기가 팁을 잘 예측한다는 것을 의미합니다.
우리는 테이블 크기의 계수를 사용하여 크기를 고려할 수 있도록 이전 모델을 다시 작성할 수 있습니다:
def tip(total_bill,size):
return 0.67 + 0.09 * total_bill + 0.19 * size
비선형 회귀: 곡선 맞추기
선형 회귀를 맞출 수 있을 뿐만 아니라 비선형 곡선도 맞출 수 있습니다. 나는 NumPy를 사용하여 이차 곡선을 나타낼 수 있는 데이터 포인트를 생성하는 방법을 시연하겠습니다.
먼저, x축을 위해 NumPy에서 큰 데이터 포인트 배열을 생성하겠습니다:
x = np.linspace(-100,100,1000)
이제 y축을 위한 이차 함수 그래프를 만들겠습니다.
y = 4*x**2 + 2*x + 3
회귀 분석을 생성하기 위해 x축과 y축에 대한 데이터 구조인 Pandas DataFrame을 구축하겠습니다. 이로 인해 x값과 y값에 대한 열이 생성되며, 이름은 "x"와 "y"입니다. 우리는 생성할 DataFrame에 대해 사전을 Pandas에 전달합니다. 우리는 DataFrame을 "df"라고 부를 것입니다.
import pandas as pd
df = pd.DataFrame({'x':x,'y':y})
우리는 head 메소드를 사용하여 DataFrame을 살펴볼 수 있습니다:
df.head()
우리는 이전에 선형 데이터로 했던 것처럼 Seaborn을 사용하여 산점도를 만들 수 있습니다:
sns.relplot(x='x',y='y',data=df)
수학 수업에서 기억할 수 있는 고전적인 포물선 그래프로 보입니다. 그래프 계산기에서 그려본 것처럼 (Python이 이를 대체할 수 있습니다). 포물선을 그릴 수 있는지 한번 알아보겠습니다. Seaborn의 regplot 메서드에는 적합할 다항식의 차수를 지정하는 order 옵션이 있습니다. 우리는 이차선을 그리려고 하므로 차수를 2로 설정하겠습니다:
sns.regplot(x='x',y='y',order=2,data=df)
확실히 고전적인 이차 포물선에 맞는 것 같습니다.
형식 회귀를 얻기 위해, 우리는 Pingouin을 사용하여 비선형 회귀 기법을 적용할 수 있습니다. x 값을 제곱하기 위해 데이터프레임에 또 다른 열을 추가할 것입니다:
df['x2'] = df['x']**2
그런 다음 우리는 선형 회귀를 사용하여 2차 곡선을 적합시킬 수 있습니다:
pg.linear_regression(df[['x','x2']],df['y']).round(2)
이것이 인공적으로 만들어진 것이기 때문에 r² 값이 1로, 매우 좋은 적합성을 나타내며, 이는 아마 실제 데이터에서는 볼 수 없는 수치입니다.
우리는 함수 사용하여 예측 모델을 구축할 수도 있습니다:
def quad(x):
return 3 + 2*x + 4*x**2
이 방법을 차수가 2보다 큰 다항식에 대해서도 확장할 수 있습니다.
논리 회귀: 이진 범주 적합하기
이진 범주, 예를 들어 흡연 여부와 같은 특정 위험 요소의 관계를 찾고 싶다면 로지스틱 회귀를 사용할 수 있습니다.
이를 시각화하는 가장 쉬운 방법은 다시 한번 Seaborn 라이브러리를 사용하는 것입니다. 우리는 타이타닉 승객의 데이터 세트를 로드할 것입니다. 우리는 티켓 가격이 불행한 여행에서 누가 살아남을지를 예측하는 데 영향을 미쳤는지 여부를 보고 싶습니다.
titanic = sns.load_dataset('titanic')
우리는 2차 DataFrame에서 했던 것처럼 데이터를 검사할 수 있습니다:
titanic.head()
우리는 로지스틱 곡선을 맞출 수 있기 때문에 lmplot 방법을 사용할 것입니다:
sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)우리는 생존 여부에 따라 구분된 승객 수에 대한 로지스틱 곡선을 봅니다. '생존' 열은 이미 '생존하지 않은' 경우 0, '생존한' 경우 1로 나누어져 있습니다.
우리는 Pingouin을 사용하여 타이타닉에서 요금이 생존의 예측변수였는지를 공식적으로 결정할 수 있습니다. Pingouin은 많은 통계 테스트 중에서 로지스틱 회귀를 제공합니다:
pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)
통계 테스트에서 주목해야 할 숫자는 p-value로, 표에서 "pval."로 표시됩니다. 이 값은 0.0으로, 티켓 가격이 타이타닉 여정을 생존하는 강력한 예측 변수임을 나타냅니다.
이러한 작업들은 왜 파이썬이 데이터 분석을 위한 선택 언어인지 보여줍니다. 손으로 하려면 며칠이 걸리거나 통계학자들이 감히 시도하지도 않았던 작업이 파이썬에서는 단 몇 초 만에 완료됩니다. 이러한 회귀 작업은 데이터에서 관계를 찾고 예측을 하는 데 도움이 될 것입니다.









