title: “inputerror_test_단일시점자료” author: “MnM_조지희” date: ‘2022 4 14’ —
knitr::opts_chunk$set(echo = TRUE)
# 필요 패키지 설치 및 불러오기
tinytex::install_tinytex()
library(tinytex)
library(knitr)
library(rmarkdown)
library(readxl)
library(tidyverse)
library(stringr)
install.packages("yaml")
library(yaml)
# 불러오기
dataset<-read_xlsx("C:\\Users\\Catharina\\Desktop\\b\\noname_data.xlsx")
# 데이터프레임 열별로 변수화
attach(dataset)
# 데이터 구조 및 유형 살펴보기
str(dataset)
# 결측치 유무
is.na(dataset)
options(tinytex.verbose=T)
These are t/f test results: using ifelse
# 참값은 TRUE, 오류는 FALSE
SEX_RESULTS<-ifelse(SEX==1|SEX==2, "TRUE", "FALSE")
GRADE_RESULTS<-ifelse(GRADE==1|GRADE==2|GRADE==3|GRADE==4|GRADE==5, "TRUE", "FALSE")
EXP_RESULTS<-ifelse(EXP==1|EXP==2, "TRUE", "FALSE")
SAT1_RESULTS<-ifelse(SAT1==1|SAT1==2|SAT1==3|SAT1==4|SAT1==5, "TRUE", "FALSE")
SAT2_RESULTS<-ifelse(SAT2==1|SAT2==2|SAT2==3|SAT2==4|SAT2==5, "TRUE", "FALSE")
SAT3_RESULTS<-ifelse(SAT3==1|SAT3==2|SAT3==3|SAT3==4|SAT3==5, "TRUE", "FALSE")
EXP1_RESULTS<-ifelse(EXP1==1|EXP1==2|EXP1==3|EXP1==4|EXP1==5, "TRUE", "FALSE")
EXP2_RESULTS<-ifelse(EXP2==1|EXP2==2|EXP2==3|EXP2==4|EXP2==5, "TRUE", "FALSE")
EXP3_RESULTS<-ifelse(EXP3==1|EXP3==2|EXP3==3|EXP3==4|EXP3==5, "TRUE", "FALSE")
REASON1_RESULTS<-ifelse(REASON1==1|REASON1==2|REASON1==3|REASON1==4|REASON1==5, "TRUE", "FALSE")
REASON2_RESULTS<-ifelse(REASON2==1|REASON2==2|REASON2==3|REASON2==4|REASON2==5, "TRUE", "FALSE")
REASON3_RESULTS<-ifelse(REASON3==1|REASON3==2|REASON3==3|REASON3==4|REASON3==5,"TRUE", "FALSE")
# 데이터 테이블로 만들기
OUTLIER_TEST_RESULTS<-data.frame(ID, SEX_RESULTS, GRADE_RESULTS, EXP_RESULTS, SAT1_RESULTS, SAT2_RESULTS, SAT3_RESULTS, EXP1_RESULTS, EXP2_RESULTS, EXP3_RESULTS, REASON1_RESULTS, REASON2_RESULTS, REASON3_RESULTS)
kable(OUTLIER_TEST_RESULTS)
FOR, IFELSE문 사용
# 데이터가 로직상 맞는지 검증
dataset1<-read_excel("C:\\Users\\Catharina\\Desktop\\b\\dataset_1.xlsx")
str(dataset1)
attach(dataset1)
summary(logic)
# logic의 결측치에 999값 넣기
logic[is.na(logic)]<-999
lt_v<-ifelse(logic==999,0,1)
# ifelse문을 사용해서 설문지 로직에 맞게 응답이 코딩되었는지 검토
logic_test_set1<-ifelse(Y_N==1<_v==0,"TRUE","FALSE")
logic_test_set2<-ifelse(Y_N==2<_v==1,"TRUE","FALSE")
logic_test_set3<-ifelse(logic_test_set1=="FALSE"&logic_test_set2=="FALSE","FALSE","TRUE")
dataset4<-data.frame(ID,Y_N,logic_test_set3)
names(logic_test_set3)[3]<-c("Q3_logic_results")
names(dataset4)[3]<-c("Q3_logic_results")
str(dataset4)
attach(dataset4)
str(Q3_logic_results)
unlist(Q3_logic_results)
# 잘못 코딩된 ID 갯수
word_table=table(Q3_logic_results) %>% sort(decreasing=TRUE)
word_df=word_table %>% as.data.frame()
word_df
#boxplot 상자 그림을 통해 이상치 눈으로 탐색
boxplot(GRADE)
boxplot(SAT1)
boxplot(SAT2)
boxplot(SAT3)
boxplot(EXP1)
boxplot(EXP2)
boxplot(EXP3)
boxplot(REASON1)
boxplot(REASON2)
boxplot(REASON3)
# IQR 방법을 사용한 outlier 검증방법
quantile(GRADE)
quantile(SAT1)
quantile(SAT2)
quantile(SAT3)
quantile(EXP1)
quantile(EXP2)
quantile(EXP3)
quantile(REASON1)
quantile(REASON2)
quantile(REASON3)
Q3_EXP1=quantile(EXP1)[4]
Q1_EXP1=quantile(EXP1)[2]
IQR_EXP1=Q3_EXP1-Q1_EXP1
upperOutlier_E2=EXP1[which(GRADE>Q3_EXP1+IQR_EXP1*1.5)]
lowerOutlier_E2=EXP1[which(GRADE>Q1_EXP1-IQR_EXP1*1.5)]
#upperOutlier_E2를 통해 이상치 파악
GRADE1<-data.frame(ID,GRADE)
subset_outlier_grade<-GRADE1[GRADE1$GRADE>"이상치값",]
# 맨 끝 쉼표는 해당 조건을 만족하는 '행'을 알려줌
# ... 동일한 방법으로 다른 변수도 시행 ...
# IQR로는 잡히지 않을 시 Grubbs.test 사용하여 검증하기.
# Grubbs test 결과 p-value>.05일 때 귀무가설 기각, 이상치 있음.
# grubbs.test는 정규분포를 가정하므로 분석 전 histogram 필요
library(outliers) # grubbs test를 위한 패키지 불러오기
library(ggplot2)
grubbs.test(GRADE)
grubbs.test(SAT1)
grubbs.test(SAT2)
grubbs.test(SAT3)
grubbs.test(EXP1)
grubbs.test(EXP2)
grubbs.test(EXP3)
grubbs.test(REASON1)
grubbs.test(REASON2)
grubbs.test(REASON3)
# 이상값 선별이 필요한 경우 grubbs.flag 함수를 정의하여 선별
# 함수 정의 방법
grubbs.flag <- function(x) { # grubbs.flag에 함수를 정의한다
outliers <- NULL # outlier가 있는 것은 영가설로 설정한다
test <- x # x라는 변수에 대해 가설검증을 한다
grubbs.result <- grubbs.test(test) # grubb.test를 시행한다
pv <- grubbs.result$p.value # grubb results에 대해 p-value를 통해 검증하고, 임계치는 0.05이다.
while(pv < 0.05) {
outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3])) # 데이터에서 반복함
test <- x[!x %in% outliers] # 검증을 시작한다
grubbs.result <- grubbs.test(test) # grubbs식을 사용하여 결과를 산출한다
pv <- grubbs.result$p.value # grubbs 식을 사용하여 산출된 결과의 유의성을 p-value를 통해 검증한다
}
return(data.frame(X=x,Outlier=(x %in% outliers))) # 결과를 데이터프레임으로 출력한다
}
# 궁금한 데이터가 있으면 grubbs.flag("궁금한 데이터")를 넣는다. 검증 자료는 벡터만 가능함
# 데이터프레임이나 티블, 리스트 구조 자료들은 unlist나 as.vector를 사용하여 벡터화 시켜주고 검증한다.
unlist(EXP1)
EXP1_flag_results<-grubbs.flag(EXP1)
# outlier만 추출
subset_gf_EXP1<-EXP1_flag_results[Outlier$EXP1_flag_results=="FALSE",]
# 난수 생성을 통해 평균과 차이가 많이 나는 값들 출력
Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.