머신러닝 | 선형회귀 (Linear Regression) 실습 | tips 데이터 | 범주형 데이터 인코딩 (Encoding) 하는 방법

728x90

 

1. 라이브러리 가져오기

import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns

2. tips 데이터셋 구경하기

 

▶ tips 데이터셋 안의 데이터들은 어떻게 생겼는지 살펴보기

tips_df = sns.load_dataset('tips')
tips_df.head()

tips_df.head()

  • total_bill : 전체 결제 가격
  • tip : 팁
  • sex : 성별
  • smoker : 흡연 여부
  • day : 요일
  • time : 식사 시간대
  • size : 동반자 수

 

▶ tips 데이터의 간략한 정보 살펴보기

tips_df.info()

 

  • 결측치(null값)가 없는 각 244개의 데이터
  • 수치형 데이터 : total_bill, tip, size
  • 범주형 데이터 : sex, smoker, day, time

 

▶ tips 데이터의 기술통계량 정보 살펴보기

: 기술통계량 정보는 수치형 데이터만 집계돼서 나오는데

include = 'all'을 넣어주면 범주형 데이터의 통계량도 확인할 수 있음

tips_df.describe(include='all')

 

  • min, max값과 std(표준편차)를 보았을 때 이상치는 딱히 없어보임
  • tips 데이터 성별 비율은 남:여 대략 65% : 35%
  • tips 데이터의 흡연자 비율은 흡연자:비흡연자 대략 38% : 62%
  • 토요일 방문이 제일 많고, 저녁식사를 많이 하러 오시는 편
  • 평균 동반자 수는 2.5명 정도, 보통 2명~3명 단위로 식사를 하러 오시는 듯함

3. 컬럼 간 상관관계 시각화해보기

sns.pairplot(tips_df)

 

  • 역시 특별하게 이상치가 있어 보이지는 않음
  • 동반자수 size = 2인 경우가 압도적으로 많음
  • total_bill과 tip은 양의 상관관계가 있어보이므로
    두 변수를 모두 X변수(독립변수)로 넣어서는 안됨(다중공선성의 문제가 생길 수 있음)

4. tips 데이터 전처리하기(인코딩)

 

▶ sex 컬럼의 Male, Female 값을 0, 1로 인코딩하기

# tips_df['sex'] 남자는 0 , 여자는 1

# 인코딩 함수 만들어주기
def get_sex(x):
    if x == 'Male':
        return 0
    elif x == 'Female':
        return 1

# .apply()로 get_sex함수 적용시켜주기
tips_df['sex_encoding'] = tips_df['sex'].apply(get_sex)

tips_df.head()

sex_encoding 컬럼이 잘 생성됨


5. 선형회귀 모델링 시작

 

▶ total_bill과 인코딩한 sex_encoding 데이터로 tip 데이터 예측하기

X = tips_df[['total_bill', 'sex_encoding']]
y = tips_df['tip']

 

▶ 선형회귀 라이브러리 가져오기

from sklearn.linear_model import LinearRegression

 

▶ 선형회귀 모델을 가져와서 X, y 데이터로 훈련시키기

# 선형회귀 모델 가져오기
model_lr = LinearRegression()

# 모델에 데이터 X, y를 넣고 훈련 고고링
model_lr.fit(X, y)

훈련 완료!


▶ 가중치와 편향 살펴보기

print('가중치(w1):', model_lr.coef_[0].round(2))
print('편향(w0):', model_lr.intercept_.round(2))

round(2) 하기 전 값
round(2) 해준 값

  • 선형회귀식 y = 0.11x + 0.91 도출
  • x가 1 증가할 때 y는 약 0.11씩 증가함

※ 잠깐!! 다중선형회귀 방정식이면 X변수(독립변수)가 2개니까 가중치도 두 개 나와야 하는 게 아닐까?

  • y = (w1*x1) + (w2*x2) + wo 이런 식으로..!
  • 이 부분을 다시 알아보고 이 글 다시 수정하러 오겠음

▶ 선형회귀식으로 tip 예측값 구하기

y_pred = model_lr.predict(X)
y_pred[:10]

y_pred값(tip 예측값) 10개 미리보기


6. 모델 평가하기(MSE, R Square)

 

▶ sklearn(사이킷런) 라이브러리 가져오기

from sklearn.metrics import mean_squared_error, r2_score

 

▶ MSE 구하기

# 실제 y값이랑 예측한 y값이랑 비교
print('다중선형회귀', mean_squared_error(y, y_pred))

 

▶ R square 구하기

# 실제 y값이랑 예측한 y값이랑 비교
print('다중선형회귀', r2_score(y, y_pred))


7. 모델 시각화하기

 

▶ 시각화해보기

  • total_bill과 sex_encoding에 대한 tip의 상관관계를 보고 싶었는데
    sex_encoding이 카테고리형 변수라 .as_ordered() 함수를 사용하라고 하는데 아직 해결 못함..ㅎ
    나중에 해결하면 다시 이 글 수정하러 올게요!
  • 일단 수치형 변수인 total_bill과 size를 X변수로 한 3D 모형 그려봄
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
import plotly.express as px
import plotly.graph_objs as go
import itertools

def surface_3d(df, f1, f2, target, length=20, **kwargs):
  
    # scatter plot(https://plotly.com/python-api-reference/generated/plotly.express.scatter_3d)
    plot = px.scatter_3d(df, x=f1, y=f2, z=target, opacity=0.5, **kwargs)
    
    # 다중선형회귀방정식 학습
    model = LinearRegression()
    model.fit(df[[f1, f2]], df[target])    

    # 좌표축 설정
    x_axis = np.linspace(df[f1].min(), df[f1].max(), length)
    y_axis = np.linspace(df[f2].min(), df[f2].max(), length)
    coords = list(itertools.product(x_axis, y_axis))
    
    # 예측
    pred = model.predict(coords)
    z_axis = pred.reshape(length, length).T
    
    # plot 예측평면
    plot.add_trace(go.Surface(x=x_axis, y=y_axis, z=z_axis, colorscale='Viridis'))
    
    return plot


surface_3d(
    tips_df,
    f1='total_bill', 
    f2='size', 
    target='tip',  
    title='tip data'
)

>> 360˚ 회전도 되고, 마우스 커서를 가져다 대면 가져다 댄 곳의 데이터 값이 다 뜸

완전 신세계...ㅇㅁㅇ 엄청나다..

 

코드는 하단 글 참고해서 가져왔습니다!

 

[참고 게시글]

https://velog.io/@dlskawns/Linear-Regression-%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80-%EC%A0%95%EB%A6%AC-%EA%B3%BC%EC%A0%81%ED%95%A9%EA%B3%BC%EC%86%8C%EC%A0%81%ED%95%A9-%ED%8E%B8%ED%96%A5%EB%B6%84%EC%82%B0-%EB%8B%A4%EC%A4%91%EC%84%A0%ED%98%95%ED%9A%8C%EA%B7%80-%EB%B0%8F-%ED%9A%8C%EA%B7%80%EB%AA%A8%EB%8D%B8-%ED%8F%89%EA%B0%80%EC%A7%80%ED%91%9C

 

velog

 

velog.io

 

[참고 게시글]

카테고리형 변수 변환 cat.as_ordered() 참고

https://steadiness-193.tistory.com/233

 

판다스 - 카테고리 자료형 : Categorical, cat 속성, categories, codes, categorical 메서드

Pandas에는 정수 기반의 범주형 데이터를 표현(인코딩)할 수 있는 Categorical형이라고 하는 특수한 데이터형이 존재한다. 데이터프레임 제작 fruit 컬럼을 카테고리형 시리즈로 제작 fruit 컬럼은 파이

steadiness-193.tistory.com

 

728x90

댓글