[데이터에듀]ADP실기 데이터 분석 전문가 모의고사 1회 2번 파이썬 코드

2021. 2. 17. 05:45빅데이터 잡아라/ADP

반응형

(데이터에듀) ADP실기 데이터 분석 전문가가 드디어 출판 되었습니다!

ADP실기 공부를 어떻게 해야할지 막막하신분들은 한번 훑어보는 것도 괜찮을 것 같더라구요!

다만 모의고사가 R코드로 되어있어서 제가 Python코드로 문제를 풀어보았습니다. 

 

FIFA.csv
1.56MB

ADP를 파이썬(python)으로 보시는 분들을 위해서 제가 공부한 것을 공유하려고 합니다. 

많은 도움이 되셨으면 좋겠습니다!

혹시 제가 잘못알고 있거나 궁금한 점이 있으시면 언제든지 댓글 달아주세요 :) 

(개발환경은 jupyter notebook입니다~! 티스토리의 코드블럭이 python코드뿐이라 ipython형태말고 python코드 형태인점 유의해주세요ㅠㅠ ipython코드를 티스토리에 예쁘게 넣는 방법을 공부해올게요ㅜㅜ)

 

모의고사 1회 2번 통계분석(사용데이터: FIFA)

FIFA의 데이터 변수 설명은 아래와 같다.

1) FIFA데이터에서 각 선수의 키는 Height변수에 피트와 인치로 입력되어있다. 이를 cm로 변환하여 새로운 변수 Height_cm을 생성하시오

import pandas as pd
import matplotlib.pyplot as plt

path = './모의고사 1회/NEW_FIFA.csv'
data= pd.read_csv(path, encoding='cp949')
data.head()
data.describe().T

#null값이 있는지 확인하기
data.isnull().sum()
data['Height_cm']= data['Height']

for i in range(len(data)):
    data['Height_cm'][i]= (float(data['Height'][i][0])*30) + (float(data['Height'][i][2:])*2.5) 
    
data['Height_cm']

결과

 

2) 포지션을 의미하는 Position변수를 아래 표를 참고하여 "Forward", "Midfielder", "Defender", "GoalKeeper"로 재범주화하고, factor형으로 변환하여 Position_Class라는 변수는 생성하고 저장하시오.

 

data['Position'].astype('string')
data['Position_Class'] = data['Position'].copy()


rep = ['LS','ST','RS','LW','LF','CF','RF','RW']
rep1 = ['LAM','CAM','RAM','LM','LCM','CM','RCM','RM']
rep2 = ['LWB','LDM','CDM','RDM','RWB','LB','LCB','CB','RCB','RB']
rep3 = ['GK']

for i in range(len(data)):
    for j in range(len(rep)):
        if data['Position_Class'][i] == rep[j]:
            data['Position_Class'][i] = data['Position_Class'][i].replace(data['Position_Class'][i],'Forward')


for i in range(len(data)):
    for j in range(len(rep1)):
        if data['Position_Class'][i] == rep1[j]:
            data['Position_Class'][i] = data['Position_Class'][i].replace(data['Position_Class'][i],'Midfielder')
            

for i in range(len(data)):
    for j in range(len(rep2)):
        if data['Position_Class'][i] == rep2[j]:
            data['Position_Class'][i] = data['Position_Class'][i].replace(data['Position_Class'][i],'Defender')
            

for i in range(len(data)):
    for j in range(len(rep3)):
        if data['Position_Class'][i] == rep3[j]:
            data['Position_Class'][i] = data['Position_Class'][i].replace(data['Position_Class'][i],'GoalKeeper')
            
            

 

결과 확인

 

3) 새로 생성한 Position_Class 변수의 각 범주에 따른 Value(선수의 시장가치)의 평균값의 차이를 비교하는 일원배치 분산분석을 수행하고 결과를 해석하시오. 그리고 평균값의 차이가 통계적으로 유의하다면 사후검정을 수행하고 설명하시오.

먼저 가설세우기!

귀무가설: 4가지의 포지션에 대해 Value의 평균은 모두 같다.

대립가설(내주장): 4가지 포지션에 대해 적어도 하나의 포지션에 대한 Value의 평균값에는 차이가 있다.

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

model = ols('Value~Position_Class', data).fit()
anova_lm(model)

결과확인

즉, 포지션별(Position_Class) 선수의 시장가치(Value)의 평균값들 중에서 적어도 어느 하나의 포지션은 통계적으로 유의한 차이가 있는 값을 가진다고 말할 수 있다.

특히 네 가지 포지션들 중 특히나 어떠한 포지션들 간에 선수의 시장가치에 차이가 있는지 파악하기 위해 사후검정을 수행한다. 

from statsmodels.stats.multicomp import pairwise_tukeyhsd

posthoc = pairwise_tukeyhsd(data['Value'], data['Position_Class'], alpha=0.05)
print(posthoc)

결과 확인!

포지션 Forward-Midfielder는 유의수준이 0.05보다 크므로 통계적으로 시장가치에 대해서 차이가 있다고 볼 수 없다. 

반면 모든 포지션에 대해서는 유의수준이 0.05보다 작으므로 통계적으로 시장가치에 대해 차이가 있다고 볼 수 있다.

 

4) Preferred Foot(주로 사용하는 발)과 Position_Class(재범주화된 포지션)변수에 따라 Value(선수의 시장가치)의 차이가 있는지를 알아보기 위해 이원배치분산분석을 수행하고 결과를 해석하시오.  

귀무가설: 선수의 발에 따른 선수의 가치에는 차이가 없다. 선수의 포지션에 따른 선수의 가치에는 차이가 없다. 발과 포지션간의 상호작용 효과가 없다. 

대립가설: 선수의 발에 따른 선수의 가치에는 차이가 있다. 선수의 포지션에 따른 선수의 가치에는 차이가 있다. 발과 포지션간의 상호작용 효과가 있다.

model = ols('Value ~ Position_Class * Preferred_Foot', data).fit()
anova_lm(model)

포지션과 발에 대해 p-value값이 유의주순 0.05보다 작으므로 대립가설을 선택한다. 

즉, 선수의 포지션에 따른 선수의 가치에 차이가 있고 선수의 발에 따른 선수의 가치의 차이가 있다.

또한, 발과 포지션 변수의 교호작용에 대해서도 유의수준보다 작으므로 대립가설을 채택한다. 즉, 선수의 발과 포지션의 상호작용에 의한 효과가 있다. 

 

5) Age, Overall, Wage, Height_cm, Weight_lb가 Value에 영향을 미치는지 알아보기 위해서 회귀분석을 단계적 선택법을 사용하여 수행하고 결과를 해석하시오. 

def stepwise_selection(data, target,SL_in=0.05,SL_out = 0.05):
    initial_features = df[['Wage','Overall','Age','Height_cm','Weight_lb']].columns.tolist()
    best_features = []
    while (len(initial_features)>0):
        remaining_features = list(set(initial_features)-set(best_features))
        new_pval = pd.Series(index=remaining_features)
        for new_column in remaining_features:
            model = sm.OLS(target, sm.add_constant(data[best_features+[new_column]])).fit()
            new_pval[new_column] = model.pvalues[new_column]
        min_p_value = new_pval.min()
        if(min_p_value<SL_in):
            best_features.append(new_pval.idxmin())
            while(len(best_features)>0):
                best_features_with_constant = sm.add_constant(data[best_features])
                p_values = sm.OLS(target, best_features_with_constant).fit().pvalues[1:]
                max_p_value = p_values.max()
                if(max_p_value >= SL_out):
                    excluded_feature = p_values.idxmax()
                    best_features.remove(excluded_feature)
                else:
                    break 
        else:
            break
    return best_features
    
    
X = df[['Wage','Overall','Age','Height_cm','Weight_lb']]
y = df['Value'].values 

stepwise_selection(X,y)

선택된 변수는 Wage, Overall, Age, Height_cm이다. 

model = ols('Value ~ Wage+ Overall + Age +Height_cm', df).fit()
anova_lm(model)

model.summary2()

모형은 y = -8690.818 + 184.184*Wage + 241.345*Overall -202.160*Age -8.446*Height_cm이고

모형의 결정계수와 수정된 결정계수는 0.79이다. 즉, 다변량 회귀식은 전체 데이터의 80%를 설명하고 있다. 또한, F통계량은 유의수준 0.05보다 작음으로 모형이 통계적으로 유의하다는 것을 알 수 있다. 

끝!

 

마지막으로... 

R에서 Python으로 코드를 변경해서 문제를 풀어보았을때, 변수선택법에서 조금 막혔었네요ㅜㅜ 

그 외의 어려움은 없던 것 같습니다. 이론과 대응하는 함수만 알고 있으면 문제될 것은 없을 것 같습니다.

(데이터 전처리에서....시간이 너무 까먹어요ㅜㅜ)

제가 참고한 변수선택법 사이트를 공유하면서 마무리 짓도록 하겠습니다^^

https://www.analyticsvidhya.com/blog/2020/10/a-comprehensive-guide-to-feature-selection-using-wrapper-methods-in-python/

 

Feature Selection using Wrapper Method - Python Implementation

In this article we will see wrapper feature selection method and how to use it with practical implementation in Python

www.analyticsvidhya.com

 

http://rasbt.github.io/mlxtend/user_guide/feature_selection/SequentialFeatureSelector/

 

Sequential Feature Selector - mlxtend

From here you can search these documents. Enter your search terms below.

rasbt.github.io

 

 

ADP실기 데이터분석 전문가(데이터에듀) 모의고사 1회의 1번 문제 보기 ▼