Data Science/실습

이.데.분 03 - 예측분석

에너지_2 2025. 2. 10. 23:24

- 지도 학습과 비지도 학습의 개념

- 회귀 분석으로 예측 수행

- 시계열 데이터의 트렌드 예측

- 수학적 기법을 활용하여 평점을 예측


git 자료

 

python-data-analysis/chapter1 at master · yoonkt200/python-data-analysis

<이것이 데이터 분석이다 - 파이썬 편, 한빛미디어>의 예제입니다. 독자 여러분의 의견을 수렴하여 상시 업데이트 진행중입니다. - yoonkt200/python-data-analysis

github.com

 

[회귀분석] 2024.11.20 - [Data Science/이론] - DS 이론09- 선형회귀분석

- 예측 분석의 가장 대표적인 방법

- 독립변수(X) 와 종속변수(Y) 간의 관계를 찾음

- 실제 데이터(점)와 거리가 최소가 되는 방정식(선)을 찾아내는 것 "Y = wX + b" -> 계수 w 와 b 를 잘 정하는 것

 

(ex) 아래 표 -> 방정식: Y = w1X1 + w2X2 + b

- 회귀분석은 표의 1~3 번의 데이터로 계수(w1, w2)를 추정하는 것

- 방정식의 계수를 추정하면 아직 알려지지 않은 ??? 데이터의 키를 예측할 수 있음

- 1~3 번의 데이터: 학습(train) 전용 데이터셋/ 4 번 데이터: 테스트(test) 전용 데이터셋

- 이러한 학습 방식이 '지도 학습' (답이 정해져 있는 것)

index X1 (나이) X2 (몸무게) Y (키)
1 23 65.3 175.5
2 14 32.5 141.0
3 17 71.1 166.4
4 18 63.3 ???

 

3.1 프로야구 선수의 다음 해 연봉 예측하기

1️⃣ 탐색: 프로야구 연봉 데이터 살펴보기

💠 데이터셋의 기본 정보

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

picher_df = pd.read_csv("picher_stats_2017.csv")
batter_df = pd.read_csv("batter_stats_2017.csv")
picher_df['연봉(2018)'].hist(bins = 100)

히스토그램, 단위는 10,000원

picher_df.boxplot(column=['연봉(2018)'])

Box Plot

💠 희귀 분석에 사용할 피처 살펴보기

- 각각의 피처들은 어떤 특성을 갖고 있는 지 확인

- '선수명','팀명'과 같이 그래프로 표현할 수 없는 피처를 제외하고, 수치형 피처의 분포를 확인

picher_features_df = picher_df.iloc[:, 2:] #2번째 column부터~
picher_features_df.head(5)

 

picher_features_df

#한글 깨짐 방지
import matplotlib.pyplot as plt
plt.rc("font", family="Malgun Gothic")

#각 피처에 대한 히스토그램 출력
def plot_hist_each_column(df):
    plt.rcParams['figure.figsize'] = [20,16]
    fig = plt.figure(1)

    for i in range(len(df.columns)):
        ax = fig.add_subplot(5, 5, i+1)
        plt.hist(df[df.columns[i]], bins = 50)
        ax.set_title(df.columns[i])
    plt.show()
    
plot_hist_each_column(picher_features_df)

 

- 각 feature 간의 단위가 다름 -> feature 의 정규화/ 스케일링이 되어있지 않은 데이터임을 알 수 있음

- Feature 의 정규화: 0~1 사이 or 상대적 값을 표현할 수 있는 수치로 맞춰주는 것이 Feature 스케일링

   ex) 전체 데이터 내에서 상대적인 계산을 통해 키 150~180을 0~1 사이의 값으로 표현하고, 몸무게도 0~1 사이의 값으로 표현

 

2️⃣ 예측: 투수의 연봉 예측하기

💠Featrue 들의 단위 맞추기: Featrue Scaling

- 표준화는 정규분포에서의 z-값을 구하는 과정과 동일함

- z-값 : (X - X의 평균)/ X의 표준편차

#판다스 형태로 정의된 데이터를 출력할 때 float 모양으로 출력되게 해줍니다.
pd.options.mode.chained_assignment = None

#Feature 각각에 대한 Scaling을 수행하는 함수 정의
def standard_scaling(df, scale_colums):
    for col in scale_colums:
        series_mean = df[col].mean()   # X의 평균
        series_std = df[col].std()     # X의 표준편차
        df[col] = df[col].apply(lambda x: (x - series_mean) / series_std)
    return df

scale_columns = picher_df.columns[2:]

#Feature 각각에 대한 Scaling을 수행
picher_scaling_df = standard_scaling(picher_df, scale_columns)

#column 명 변경
picher_scaling_df = picher_scaling_df.rename(columns={"연봉(2018)": "y"})

 

💠Feature 들의 단위 맞추기: One-Hot Encoding

- 연속형이 아닌 범주형 Feature 들도 정규화해야 함

- get_dummies() 함수 사용

team_encoding = pd.get_dummies(picher_scaling_df['팀명'])

picher_scaling_df = picher_scaling_df.drop('팀명', axis = 1)

# One-Hot Encoding 데이터를 이어붙임
picher_scaling_df = picher_scaling_df.join(team_encoding)


💠회귀 분석을 위한 학습, 테스트 데이터셋 분리

- train_test_split() 함수 사용

X_columns =  picher_scaling_df.columns.difference(['선수명', 'y'])
X = picher_scaling_df[X_columns] # 독립변수
y = picher_scaling_df['y']       # 종속변수

X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, random_state=19)

 

💠회귀 분석 계수 학습 & 학습된 계수 출력

# 회귀 분석 계수를 학습 (회귀 모델 학습)
lr = linear_model.LinearRegression()
model = lr.fit(X_train, y_train)

# 학습된 계수를 출력
print(lr.coef_)

 

3️⃣ 평가: 예측 모델 평가하기

- 회귀 분석은 statsmodel 라이브러리의 OLS 클래스로도 실행이 가능하다

💠 어떤 피처가 가장 영향력이 강한 피처일까

 

~p150

 

 

 


 
이것이 데이터 분석이다 with 파이썬
데이터를 다루는 데 언어나 라이브러리는 도구일 뿐입니다. 진짜 중요한 것은 문제해결 능력입니다. 이 책은 주어진 문제를 어떻게 단계적으로 접근하면 좋을지에 대해 독자 친화적으로 가이드를 주는 책입니다. 프로그래밍 기초 지식만 있다면 통계에 대한 지식이 전혀 없는 비전공자도 데이터 분석에 입문할 수 있도록 쉽게 풀어썼습니다. 종합 예제를 통해 학습 내용을 입체적으로 실전에 적용해본다. 중고 휴대폰 거래 가격 예측, 구매 데이터를 분석하여 상품 추천하기
저자
윤기태
출판
한빛미디어
출판일
2020.02.10