setwd("C:/ADP/data")
fifa <- read.csv("FIFA.csv")
str(fifa)
# na 값이 존재하는지 확인
sum(is.na(fifa))
# Height 변수의 피트, 인치 단위로 저장된 키 값을 cm 단위의 값으로 변환하기
# 원활한 연산을 위해 Height 변수를 문자형으로 변환
fifa$Height <- as.character(fifa$Height)
# "'" 앞의 숫자는 피트이며, "'" 뒤의 숫자는 인치를 의미함
# 따라서, "'" 앞 숫자를 추출하여 30을 곱하고, "'" 뒤 숫자를 추출하여 2.5를 곱한 뒤
# 숫자를 더하여 cm 단위 값으로 변환
# regexpr 함수는 text 내에서 패턴이 가장 먼저 나오는 위치 찾는 함수로 분석에 활용
as.numeric(substr(fifa$Height,1,regexpr("'", fifa$Height) - 1))*30 +
as.numeric(substr(fifa$Height,regexpr("'",fifa$Height) + 1, nchar(fifa$Height)))*2.5
# 단위를 변환한 값을 Height_cm 변수에 저장
fifa$Height_cm <- as.numeric(substr(fifa$Height,1,regexpr("'",fifa$Height) - 1)) * 30 +
as.numeric(substr(fifa$Height,regexpr("'",fifa$Height) + 1, nchar(fifa$Height))) * 2.5
# 선수의 포지션을 의미하는 Position 변수를 문제에 주어진 조건에 맞게 재범주화하여 Position_Class라는 변수에 저장
fifa <- within(fifa,
{
Position_Class = character(0)
Position_Class[ Position %in% c("LS", "ST", "RS", "LW", "LF", "CF", "RF", "RW")] = "Forward"
Position_Class[ Position %in% c("LAM", "CAM", "RAM", "LM", "LCM", "CM", "RCM", "RM")] = "Midfielder"
Position_Class[ Position %in% c("LWB", "LDM", "CDM", "RDM", "RWB", "LB", "LCB", "CB", "RCB", "RB")] = "Defender"
Position_Class[ Position == "GK"] = "GoalKeeper"
})
# Position_Class 변수를 팩터형(factor)으로 변환
fifa$Position_Class <- factor(fifa$Position_Class, levels = c("Forward", "Midfielder","Defender","GoalKeeper"),
+ labels = c("Forward","Midfielder","Defender","GoalKeeper"))
str(fifa)
# 귀무가설 : 4가지 포지션에 대해 Value의 평균은 모두 같다.
# 대립가설 : 적어도 하나의 포지션에 대한 Value의 평균값에는 차이가 있다.
# 분산분석 수행
fifa_result <- aov(Value~Position_Class, data=fifa) # 분산분석 결과를 fifa_result 변수에 저장
summary(fifa_result) # 분산분석표 확인
# Df Sum Sq Mean Sq F value Pr(>F)
# Position_Class 3 4.081e+09 1.360e+09 41.87 <2e-16 ***
# Residuals 16638 5.405e+11 3.249e+07
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 분산분석표를 통해 확인한 결과, SSA의 자유도는 3(집단의 수-1 = 4-1), SST의 자유도는 16638
# (관측값의 수 - 집단의 수 = 16642 - 4)임을 확인할 수 있다. p-value 값(<2e-16)이 매우 작게 나와
# 유의수준 0.05하에서 귀무가설을 기각한다. 따라서 네 가지 포지션(Position_Class)에 따른 선수의
# 시장가치(Value)가 모두 동일하지 않다고 결론내릴 수 있다. 즉, 포지션(Position_Class)별 선수의
# 시장가치(Value)의 평균값들 중에서 적어도 어느 하나의 포지션은 통계적으로 유의한 차이가 있는 값을 가진다고 말 할 수 있다.
# Tukey's HSD(honestly significant difference) test는 studentized range distribution을 이용하여
# 모든 가능한 두 수준들의 평균간의 차이가 있는지를 검정(pairwise post-hoc testing using Tukey HSD test)하는 방법
TukeyHSD(aov(Value~Position_Class, data=fifa))
# Tukey multiple comparisons of means
# 95% family-wise confidence level
#
# Fit: aov(formula = Value ~ Position_Class, data = fifa)
#
# $Position_Class
# diff lwr upr p adj
# Forward-Defender 930.3730 610.7412 1250.0048 0.0000000
# GoalKeeper-Defender -507.3848 -887.6282 -127.1415 0.0034079
# Midfielder-Defender 760.8787 486.7108 1035.0465 0.0000000
# GoalKeeper-Forward -1437.7579 -1865.9257 -1009.5900 0.0000000
# Midfielder-Forward -169.4944 -507.0010 168.0122 0.5691282
# Midfielder-GoalKeeper 1268.2635 872.8761 1663.6509 0.0000000
#
# 사후분석에서는 귀무가설을 '집단들 사이의 평균은 같다', 대립가설을 '집단들 사이의 평균은 같지않다'로
# 두고, 모든 집단 수준에 대해서 두 집단씩 짝을 지어 각각 다중비교를 수행한다. 사후분석 결과를 보면
# Midfielder-Forward 포지션 간의 비교에 대해서 p-value(p adj)값이 0.05보다 크므로 귀무가설을 기각하지 않는다.
# 즉, 포지션이 Midfielder인 선수와 Forward인 선수들 간의 시장가치는 통계적으로 유의한 차이가 있다고 볼 수 없다.
# 반면 Defender-Forward, GoalKeeper-Forward, Defender-Midfielder, GoalKeeper-Midfielder, 비교에 대한
# 귀무가설을 모두 기각한다. 즉 해당 포지션들에 대한 선수들의 시장가치 평균값은 각각 통계적으로 유의한 차이가 있다는 것을 알 수 있다.
# 또한 diff는 하이픈(-)의 왼쪽 집단과 오른쪽 집단 간 반응값의 차이를 나타내는데, Defender-Forward, GoalKeeper-Forward, Defender-Midfielder,
# GoalKeeper-Midfielder, GoalKeeper-Defender 모두에 대한 diff값은 음수이므로, 하이픈(-) 뒤에 있는 집단(오른쪽 집단)의 Value(선수의 시장가치)
# 평균이 더 크다는 것을 알 수 있다.
# 예를 들어 선수의 포지션이 Defender일 때보다 Forward일 때가 선수의 시장가치는 통계적으로 유의하게 큰 값을 가진다고 해석할 수 있다.
# 주발(Preferred_Foot)과 포지션(Position_Class)에 따라서 선수의 가치(Value)에 차이가 있는지 않아보기 위한 이원배치 분산을 수행한다.
#
# 귀무가설 : 선수의 주발(Preferred Foot)에 따른 선수의 가치(Value)에는 차이가 없다.
# 선수의 포지션(Position_Class)에 따른 선수의 가치(Value)에는 차이가 없다.
# 주발(Preferred Foot)과 포지션(Position_Class)간의 상호작용 효과가 없다.
#
# 대립가설 : 선수의 주발(Preferred Foot)에 따른 선수의 가치(Value)에는 차이가 있다.
# 선수의 포지션(Position_Class)에 따른 선수의 가치(Value)에는 차이가 있다.
# 주발(Preferred Foot)과 포지션(Position_Class)간의 상호작용 효과가 있다.
# 이원배치 분산분석 수행
# 이원분산분석이란? 결과값인 y에 영향을 주는 두개의 x인자를 변화시켜 가면서 분석을 수행하는 것을 말합니다.
# 예를 들어 제품의 강도에 영향을 주는 인자가 촉매와 경화제 두개가 있을때,
# 촉매의 각 수준별로 경화제를 변화시켜 가면서 반응값이 제품강도를 측정하고 분석하는 것입니다.
fifa_twoway_anova <- aov(Value ~ Preferred_Foot + Position_Class +
Preferred_Foot:Position_Class, data=fifa)
summary(fifa_twoway_anova)
# Df Sum Sq Mean Sq F value Pr(>F)
# Preferred_Foot 1 1.461e+08 1.461e+08 4.501 0.03390 *
# Position_Class 3 4.087e+09 1.362e+09 41.976 < 2e-16 ***
# Preferred_Foot:Position_Class 3 4.736e+08 1.579e+08 4.864 0.00221 **
# Residuals 16634 5.399e+11 3.246e+07
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 먼저 주발(Prefferd_Foot) 변수에 대한 p-value는 0.03390으로 유의수준 0.05보다 작으므로 귀무가설을
# 기각하고 대립가설을 채택하여 "선수의 주발에 따른 선수의 가치에는 차이가 있다"고 판단할 수 있다.
# 그리고 포지션(Position_Class) 변수에 대한 p-value는 2e-16보다 작아 유의수준 0.05하에서 매우 유의하므로
# 귀무가설을 기각하고 대립가설을 채택하여 "선수의 포지션에 따른 선수의 가치에는 차이가 있다"고 판단할 수 있다.
# 마지막으로 주발(Preferred_Foot)과 포지션(Position_Class) 변수의 교호작용에 대한 p-value는
# 0.00221로 유의수준 0.05보다 작으므로 귀무가설을 기각하고 대립가설을 채택하여 "선수의 주발과 포지션의
# 상호작용에 의한 효과가 있다"라고 판단할 수 있다.
# Age, Overall, Wage, Height_cm, Weight_lb가 Value에 영향을 미치는지 알아보는 회귀분석을
# 단계적 선택법을 사용하여 수행하고 결과를 해석하시오.
# 단계적선택법을 통한 변수선택 수행
step(lm(Value~1, data=fifa), scope=list(lower=~1, upper=~Age + Overall + Wage + Height_cm + Weight_lb), direction = "both")
# Start: AIC=287969.5
# Value ~ 1
#
# Df Sum of Sq RSS AIC
# + Wage 1 4.0424e+11 1.4037e+11 265409
# + Overall 1 2.1561e+11 3.2900e+11 279584
# + Age 1 3.1824e+09 5.4143e+11 287874
# + Weight_lb 1 1.0611e+09 5.4355e+11 287939
# <none> 5.4461e+11 287969
# + Height_cm 1 1.9447e+06 5.4461e+11 287971
#
# Step: AIC=265408.8
# Value ~ Wage
#
# Df Sum of Sq RSS AIC
# + Overall 1 1.4741e+10 1.2563e+11 263564
# + Age 1 1.4800e+09 1.3889e+11 265234
# + Height_cm 1 1.3065e+08 1.4024e+11 265395
# + Weight_lb 1 7.9650e+07 1.4029e+11 265401
# <none> 1.4037e+11 265409
# - Wage 1 4.0424e+11 5.4461e+11 287969
#
# Step: AIC=263564.5
# Value ~ Wage + Overall
#
# Df Sum of Sq RSS AIC
# + Age 1 1.1662e+10 1.1397e+11 261945
# + Weight_lb 1 7.0549e+08 1.2493e+11 263473
# + Height_cm 1 2.3851e+08 1.2539e+11 263535
# <none> 1.2563e+11 263564
# - Overall 1 1.4741e+10 1.4037e+11 265409
# - Wage 1 2.0337e+11 3.2900e+11 279584
#
# Step: AIC=261945.2
# Value ~ Wage + Overall + Age
#
# Df Sum of Sq RSS AIC
# + Height_cm 1 5.1404e+07 1.1392e+11 261940
# + Weight_lb 1 4.9934e+07 1.1392e+11 261940
# <none> 1.1397e+11 261945
# - Age 1 1.1662e+10 1.2563e+11 263564
# - Overall 1 2.4922e+10 1.3889e+11 265234
# - Wage 1 1.8259e+11 2.9656e+11 277858
#
# Step: AIC=261939.7
# Value ~ Wage + Overall + Age + Height_cm
#
# Df Sum of Sq RSS AIC
# <none> 1.1392e+11 261940
# + Weight_lb 1 6.1905e+06 1.1391e+11 261941
# - Height_cm 1 5.1404e+07 1.1397e+11 261945
# - Age 1 1.1475e+10 1.2539e+11 263535
# - Overall 1 2.4906e+10 1.3883e+11 265228
# - Wage 1 1.8264e+11 2.9656e+11 277860
#
# Call:
# lm(formula = Value ~ Wage + Overall + Age + Height_cm, data = fifa)
#
# Coefficients:
# (Intercept) Wage Overall Age Height_cm
# -8690.818 184.184 241.345 -202.160 -8.445
# 첫번째 단계를 확인해보면 Wage 변수가 모형에 추가되었을 때 AIC값이 265409로 가장 작은 것을 확인할 수 있다.
# 따라서 첫 번째 단계에서 Wage 변수가 모형에 추가되었다. 두번째 단계에서는 Overall 변수가 새롭게 추가되었을 때
# AIC값이 가장 작아지기 때문에 Overall 변수가 모형에 추가되었다.
# 위와 같은 변수의 제거 혹은 추가를 반복하여 lm(formula = Value ~ Wage + Overall + Age + Height_cm, data = fifa)
# 이라는 최종 모형이 결정되었다.
# 최종적으로 선택된 추정된 회귀식은 y = -8690.818 + 184.184 * Wage + 241.345 * Overall - 202.160 * Age - 8.445 * Height_cm이다.
# 변수선택 결과, 선택된 변수들을 이용해 회귀모형을 생성한다.
# 변수 선택을 통해 도출도니 회귀모형
fifa.lm <- lm(Value ~ Wage + Overall + Age + Height_cm, data = fifa)
summary(fifa.lm)
# Call:
# lm(formula = Value ~ Wage + Overall + Age + Height_cm, data = fifa)
#
# Residuals:
# Min 1Q Median 3Q Max
# -24272 -837 -120 668 58287
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) -8690.818 588.280 -14.77 < 2e-16 ***
# Wage 184.184 1.128 163.32 < 2e-16 ***
# Overall 241.345 4.002 60.31 < 2e-16 ***
# Age -202.160 4.938 -40.94 < 2e-16 ***
# Height_cm -8.445 3.082 -2.74 0.00615 **
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 2617 on 16637 degrees of freedom
# Multiple R-squared: 0.7908, Adjusted R-squared: 0.7908
# F-statistic: 1.572e+04 on 4 and 16637 DF, p-value: < 2.2e-16
# 단계선택법을 이용한 변수 선택을 수행한 후 선택도니 변수들로 회귀분석을 수행한 결과,
# 상수항, Wage, Overall, Age 변수들은 유의수준 0.001 하에서 통계적으로 유의하며,
# Height_cm 변수는 유의수준 0.01하에서 통계적으로 유의함을 확인할 수 있다.
# 모형의 결정계수는 0.7908 수정된 결정계수는 0.7908로 추정된 다변량 회귀식은
# 전체 데이터의 80%를 설명하고 있다. 또한 회귀모형의 F통계량에 대한 p-value 값은
# 0.05보다 작으므로 유의수준 0.05 하에서 모형이 통계적으로 유의한 것을 알 수 있다.
# 회귀분석 결과로 추정된 회귀식은 y = -8690.818 + 184.184*Wage + 241.345*Overall - 202.160*Age -8.445*Height_cm이다.