title: “inputerror_test_단일시점자료” author: “MnM_조지희” date: ‘2022 4 14’ —

1. 패키지 설치 및 자료 불러오기

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)

2. input error 찾기

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)

3. 데이터 로직 검토하기

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&lt_v==0,"TRUE","FALSE")
logic_test_set2<-ifelse(Y_N==2&lt_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

4. outlier 검증방법

#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.