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

2021. 2. 20. 16:12빅데이터 잡아라/ADP

반응형

안녕하세요~

데이터에듀에서 나온 ADP실기 데이터 분석 전문가의 모의고사가 R로만 짜여저 있어서

ADP실기를 파이썬(python)언어로 보시는 분들을 위해 

제가 파이썬 언어로 바꾸면서 코딩을 한 내용을 공유드리고자 합니다.

 

ADP 실기 모의고사 2회

1. 통계분석 (사용데이터: Admission)

Admission.csv
0.01MB

 

1) 종속변수인 Chance_of_Admit(입학 허가 확률)와 독립변수(GRE, TOEFL, Univ_Rating, SOP, LOR, CGPA)에 대해 피어슨 상관계수를 이용한 상관관계 분석을 수행하고 그래프를 이용하여 분석결과를 설명하시오.

import pandas as pd
from scipy import stats
import seaborn as sns
import matplotlib.pyplot as plt
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm
import statsmodels.api as sm
from mlxtend.feature_selection import SequentialFeatureSelector as sfs
from statsmodels.stats.multicomp import pairwise_tukeyhsd


path = './모의고사 2회/Admission.csv'
data= pd.read_csv(path)
data.head()
data.info()
data.describe().T

#결측지 확인
data.isnull().sum()

#컬럼명 변경(뒤에 space까지 반영되어있음..;)
data.rename(columns = {'LOR ' : 'LOR'}, inplace = True)

cor=data[['Chance_of_Admit','GRE', 'TOEFL', 'Univ_Rating', 'SOP','CGPA','LOR']].corr(method='pearson')

print(cor)
#모두 통계적으로 유의하다
print(stats.pearsonr(x = data['GRE'], y = data['Chance_of_Admit']))
print(stats.pearsonr(x = data['TOEFL'], y = data['Chance_of_Admit']))
print(stats.pearsonr(x = data['Univ_Rating'], y = data['Chance_of_Admit']))
print(stats.pearsonr(x = data['SOP'], y = data['Chance_of_Admit']))
print(stats.pearsonr(x = data['CGPA'], y = data['Chance_of_Admit']))
print(stats.pearsonr(x = data['LOR'], y = data['Chance_of_Admit']))

pearson 상관계수
pearson 상관계수 검증(첫번째 값:상관계수, 두번째 값:p-value)

모든 독립변수는 종속변수와 양의상관관계에 있고, 통계적으로 유의함을 볼 수 있다. 

#그래프상 산점도가 오른쪽으로 올라가는 직선형태는 양의 상관관계라 볼 수 있음.
sns.pairplot(data[['Chance_of_Admit','GRE', 'TOEFL', 'Univ_Rating', 'SOP','CGPA','LOR']])
plt.show()

sns.heatmap(cor, cmap='viridis')

독립변수중에서 종속변수에 가장 큰 영향을 미치는 변수는 CGPA(0.87)로 볼 수 있다.

 

2) GRE, TOEFL, Univ_Rating, SOP, LOR, CGPA, Research가 Chance_of_Admit에 영향을 미치는지 알아보는 회귀분석을 단계적 선택법을 사용하여 수행하고 결과를 해석하시오. 

def stepwise_selection(data, target,SL_in=0.05,SL_out = 0.05):
    initial_features = data[['GRE','TOEFL','Univ_Rating','SOP','LOR','CGPA','Research']].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 = data[['GRE','TOEFL','Univ_Rating','SOP','LOR','CGPA','Research']]
y = data['Chance_of_Admit'].values

stepwise_selection(X,y)

변수선택법을 사용하여 CGPA, GRE, LOR, Research, TOEFL이 선택되었다.

선택된 변수를 사용하여 회귀분석를 수행해본다.

model = ols('Chance_of_Admit ~ CGPA+ GRE + LOR +Research + TOEFL', data).fit()
anova_lm(model)

선택된 변수들은 모두 유의하다는 것을 확인할 수 있으며,

추정된 회귀식은 아래와 같다. 

model.summary2()

Chance_of_Admit = -1.2985+0.12*CGPA+0.001*GRE+0.022*LOR+0.024*Research+0.003*TOEFL

 

3) 단계 선택법을 사용해 변수를 선택한 후 새롭게 생성한 회귀모형에 대한 잔차분석을 수행하고, 그래프를 활용하여 결과를 해석하시오. 

회귀모형은 분석데이터가 선형성, 독립성, 등분산성, 정규성의 가정을 만족하지 않으면 제대로된 선형회귀모델을 생성할 수 없습니다.  

잔차의 독립성, 정규성, 등분산성을 만족하는지 봐야한다. 

첫번째는 잔차의 등분산성이다. 

아래 그래프는 예측값(X축)에 따라 잔차가 어떻게 달라지는지 보여준다.

따라서 실선이 수평선에 가까울수록 등분산성이 있다는 것이다. 

fitted = model.predict(data[['CGPA', 'GRE', 'LOR', 'Research', 'TOEFL']])
residual = data['Chance_of_Admit'] - fitted
sns.regplot(fitted, residual, lowess=True, line_kws= {'color':'red'})
plt.plot([fitted.min(), fitted.max()], [0,0], '--', color = 'grey')

 

두번쨰는 잔차의 정규성입니다. 

#2) 잔차의 정규성
sr = stats.zscore(residual)
(x,y), _ = stats.probplot(sr)
sns.scatterplot(x,y)
plt.plot([-3,3],[-3,3],'--',color='grey')

또한, 샤피로 검정할 수 있다. 

두번째 값이 p-value이므로 유의주순에서 정규성이 통계적으로 유의하다고 볼 수 있따. 

 

마지막으로 잔차의 독립성은 summary()결과값에 나오는 Durbin-Watson을 보면 된다. 

Durbin-Watson은 2에 가까울수록 자기상관이 없고, 0에 가까우면 양의 상관관계, 4에 가까우면 음의 상관관계

0.750이므로 0에 가깝기때문에 독립성 가정을 만족하다고 보기 힘들다.