1. IQR 구하기

IQR 이란?  Q3(75%)-Q1(25%)
즉, box plot에서 박스범위 의미

IQR활용한 이상치 공식
(q1-1.5*iqr) < x data < (q3 + 1.5*iqr) 를 벗어나는값

관련코드
#4분위수 확인하기
qunatile(df$열)

#최대 최소 일치하는지 확인하기
min(df$열)
max(df$열)

#iqr구하기
q1= quantile(df$열, 0.25)
q3= quantile(df$열,0.75)
iqr=q3-q1

또는
iqr=IQR(df$열) #IQR 바로 구하는 함수 사용



2. 이상치 구하기

#이상치만있는 row만출력
con1= df$열 <(q1 - 1.5*iqr)
con2= df$열 >(q3 + 1.5*iqr)
df_out=df[con1|con2, ]


#이상치 없는 데이터셋 출력하기
df_out=df[ ! (con1|con2), ] # !반대이용
또는
con3 = df$열 >= (q1 - 1.5*iqr)
con4 = df$열 <=(q3 + 1.5*iqr)
df_in = df[con3&con4, ]

R함수 파생변수 및 요약변수의 차이와
데이터전처리를 위한 R함수들을 공유드릴게요



신규생성변수의 차이

파생변수 : 기존 변수의 값을 활용해 의미부여한 변수
vs
요약변수 : 기존 변수의 단순 산술연산 등


각 케이스별 신규 변수 생성

1. 분류문제 : 명목 이항화하기
파생변수의 결과 : 1 또는 0

df=iris #데이터셋 예시

명목 이항화 방법1. ifelse()함수활용
#ifelse(조건, true일때 값, false일때값)

df [, "새변수명"] = ifelse(df$SPecies=="setosa",
                                   yes =1, no= 0 )

명목 이항화 방법2. TRUE(1)/ FALSE(0)활용하기
#조건이 TRUE이면 1로 계산처리 : 1+0=1
#조건이 FALSE이면 0로 계산처리 : 0+0=0

df[ ,"새변수명"] = (df$Species="setosa")+0


2. 새 요약변수만들어 행합계값  넣기
df[ , "새변수명"] = apply(df[[-5],
                                      MARGIN=1,FUN=sum)

#참고 apply함수
FUN의 연산을 행(MARGIN=1)/열(2)에 일괄 실행


3.날짜시간 처리한 파생변수만들기

#R 기본함수로 시간처리

strptime()
#"시간형태"를 지정해줌으로써 조작용이

now = strptime(df$시간변수,
                                  "%Y-%m-%d %H%M:%S")

now$year = 숫자118
# 1900뺀수치로 #1900+118=2018

now$mon =2 #+1해준값 #2-(+1)=1월

now$mday=6 #날짜 그대로 #6일
now$hour =1 #시간 그대로
now$min=10 #분 그대로
now$sec=30 #초 그대로

now$wday = 2
#숫자0부터시작=일요일 #화요일 의미
일 월 화 수 목 금 토 일
0   1  2    3   4  5   6   0

# lubridate 패키지로 시간처리

date() #날짜만 뽑기

#기초응용 : 날짜를 다루는 열추가하기
df[,"새변수"]=date(df$날짜변수)

#심화응용 : casual(대여수)열의 값이 최대값 25가 넘는 날자는 총 며칠인가? #data=bike.csv

df[ ,"date"]=date(df$datetime) #날짜다루기
df_25 = df[df$casual>25, ] #25넘는 행만남기기
length(unique(df_25$date)) #중복제거 갯수

hour() #시간만 추출하기

#심화응용: 시간대별 casual 평균 산출시 가장 큰 시간은?

df[,"hour"]=hour(df$datetime)#시간다루기
agg=aggregate(df, casual~hour, FUN=mean)
#hour별 casual의 mean 산출하기 일괄연산
agg[which.max(agg$casual), ] #최대행 추출

#참고 aggregate 함수
aggregate(데이터셋, 처리할변수~기준변수,연산)
#결과 :   기준변수 연산처리된변수값 데이터프레임


ymd(20230316)  #표준날짜형식으로 나타내기
#결과 :"2023-03-16"

wday() #요일반환하기

wday("2023-03-16", week_start=1, label=TRUE)
#요일을 1(월)요일 부터 시작 #숫자1부터 시작
월 화수 목 금 토 일 월
1   2  3  4  5  6  7   1

#실전응용
wday(ymd(date(df$시간변수)) , 1, label=TRUE)

4. fastDummies패키지로 명목변수를 더미변수로 변환해서 만들기
df=dummy_cols(df,
  select_olumns="명목변수",
  remove_first_dummy=TRUE, #첫더미삭제
remove_selected_columns=TRUE#원변수삭제)


5.변수간 차이를 파생변수로 만들기
df=bike.csv #데이터셋 예시

문제 : temp변수와 atemp변수간 절대값 차이를 diff라는 변수를 데이터df에  만들어 넣어라

df[,"diff"]=abs(df$temp-df$atemp)
mean(df$diff)  #차이의 평균

















먼저 샘플링에 앞서
매번 샘플링 코드를 실행할때마다
결과값이 달라져요.
데이터분석을 쭉 진행하기위해서는
결과값을 고정해야합니다.
set.seed(숫자)
위 함수를 샘플링 코드와 !함께! 실행시킨후
빈그릇인 변수에 저장해줘야
결과값이 일정하게 나옵니다.


#기본함수를 이용한 샘플링

set.seed(1234)
df=sample(1:45, size = 6) #단순추출
, replace = TRUE #해당 옵션으로 복원추출 가능


#dplyr 패키지을 이용한 샘플링


sample_n(1:100, 6) #6 갯수로 추출
sample_frac(df , 0.05) #5% 비율로 추출

마찬기지로
, replace =TRUE #옵션으로 복원 추출가능


#caTools 패키지를 이용한 샘플링


sample.split(df, SplitRatio=0.7) #70% 추출




#R 샘플링 문제예시

문제1.
%%기준별 5%씩 행 추출시 추출되는 총 행의 갯수?

핵심문법
dplyr의 %>% #파이프
#데이터df에 대해서 연속으로
연산 및 문법처리가 가능하도록 이어주는 역할
#엔터시 %>% 뒤에서 엔터처리해야 오류안뜸
dplyr::group_by #그룹별 처리
dplyr::sample_frac(size=0.05) #5%샘플추출
nrow() #행개수

핵심답
df %>% group_by(기준열) %>%
    sample_frac(size=0.5 ) %>%
    nrow()

문제2.
학습데이터세트와 평가데이터 세트를 7:3 비율로 분리시 평가데이터의 a열의 평균은? #기본함수 sample이용해라

핵심문법 :
sample(추출할범위, 크기개수)
#sample(1:df의마지막행번호,추출비*전체행수)

핵심답
set.seed(123)
idx_train = sample(1:nrow(df) ,0.7*nrow(df))
df_train = df[idx_train, ]
df_test = df[  -idx_rain, ]
mean(df_train$a)






R을 활용하여 데이터 분석을 하기에 앞서
데이터 전처리가 중요합니다.
이때 유용하게 쓰이고,
따라서 암기해야할 R함수들 공유드려요.

#1. 연산을 통해 데이터추출하기

==  #같음의미 #결과 TRUE/ FALSE로 나와요
!=   #다름의미 #결과 TRUE/ FALSE로 나와요
%/% #몫
%% #나머지

#기초응용 : 홀수구하기
변수 %%2 == 1

#심화 응용 : 불러온 데이터 df의 age열에서 홀수인 행만 뽑아서 test데이터셋만들기
df_test = df [ age%%2 == 1, ]

#심화 응용 : 불러온 데이터 df의 ID열에서 4의 배수아닌 행만 뽑아서 test 데이터셋 만들기
df_test = df [ ID%%4 != 0, ]  


sd()  #표준편차

#심화응용 : 불러온 데이터 df의 a열 값들 중, 평균에서 1.5표준 편차 넘는 값 이상치라 취급하자. 이상치가 제거된 데이터셋을 df_test에 저장하자
val1= mean(df$a) - 1.5 *sd(df$a)
val2=mean(df$a) + 1.5 *sd(df$a)
con1=df$a>=val1
con2=df$a<=val2
con=df[con3 & con4, ] #이상치제거된 df

#참고
con3 = df$a<val1
con4=df$a>val2
con = df[con3|con4 , ] #이상치만있는 df


round(x, n)
#x를 소수점 n+1자리에서 반올림하여,
# 소수점 n번째 자리까지 반환


quatiile(1:100, probs =0~1사이값)
#분위수
#주로쓰이는 probs = 0.25 (25%), 0.5 , 0.75)

#2. 데이터 구조 파악 및 데이터 조작하기

unique(벡터)
#중복제거된 고유원소

#기초 응용:
length(unique(벡터)) #고유원소수

toupper()
#대문자로변환

paste("a","B", sep="&)
#문자열로 구분자넣어서 붙이기
#결과 : a&B

substr("asdf", start=1, stop=3)
#문자열에서 첫번째글자부터 3번째 글짜까지 추출하기
#결과 : asd


colnames(df)[c(1,2)] = c("length","width")
#df의 1번째, 2번재 열의 네이밍 변경

#암기 응용  :
t(t(colnames(df)))
#df에 들어있는 모든 열에 대해 몇번째 열이름인지 확인가능한 문구




+ Recent posts