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 Studio 활용시 외우면
훨씬 쉬워지는 단축키 5가지를 공유드려요


#1. 콘솔창 내용 지우기

ctrl+l

#2. 스크립트와 콘솔창 입력 커서 변환

ctrl +1(스크립트창)
ctrl+2(콘솔창)

#3. 새스크립트창 만들기

ctrl+shift+n

#4. 주석 "#" 처리

ctrl+shift +c   #드래그후 일괄처리가능

#5. dplyr 패키지의 파이프 %>% 단축키

ctrl+shift+m








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)






활용데이터셋 : iris_missing.csv

#결측치 개수구하기

문제1:
각 수치형 변수에 대해서 결측치 개수의 총합을 구해라.

핵심문법 :
sum() #합계                    
is.na(벡터) #na가 있으면 true, 없으면 false
여기서 true는 1로 처리되며, false는 0으로 처리됨

핵심답 :
sum(is.na(df[,"수치형변수이름" 혹은 위치])
#na가 있는 행의 수(true=1갯수)의 합

반복처리 방법1 : for 반복문 활용
for ( i in 1:4) {
   print(paste( i , sum(is.na(df [ , i  ] ))))
}

반복처리 방법2: apply()함수 활용
apply (df[, 1:4], MARGIN=2
              , FUN =function(x){sum(is.na(x))}

#참고 apply함수 :
MARGIN=1일때 행별로 연산처리
                =2일때 열별로 연산처리
FUN = 연산함수
              기본함수 sum, mean 등 사용가능
                apply(df[,1:4],2, FUN=mean)
              사용자지정함수 fnction(x){x처리함수}


#결측치를 평균으로 대치하기
문제 :

데이터df의 a열 변수 결측치를 평균으로 대치하고, 대치된 df의 a열 값의 분산?

핵심문법:
df[조건이 true인행, "열이름") #df[행,열] 값 추출 mean(df$a, na.rm=TRUE) #na들 제외하고 계산
df[행조건,열조건]=변경값 #df내 값 변경

핵심답:
df[is.na(df$a), "a"] = mean(df$a, na.rm=TRUE)
#df의 "a"열에서 a열의 값이 na인 값들 =평균대치


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에 들어있는 모든 열에 대해 몇번째 열이름인지 확인가능한 문구





R로 데이터분석을 하실때
주로 csv확장자의 엑셀파일을 읽어들여
분석을 진행하시게 됩니다.
이를 위한 기본세팅 문법들을 공유드려요.

가장먼저
한글이깨지는걸 방지하기위해
R STUDIO에서 다음 설정이 필요합니다.

한글깨짐방지

global options > code > saving > UTF-8

csv 엑셀파일 입출력에 관한 기본 문법들

파일을 불러들여오실때
변수(빈 그릇)에 저장해주는 꼴로 불러오면 됩니다.

#변수명 : df
df = read.csv("파일명.csv")

head(df, 6)
#상위 6행까지 파일내용이 간단히 표현됩니다.
tail(df , 6) #하위 6행


이때 읽어들이는 파일이
R의 워킹디렉토리와 동일한 위치에 있어야 합니다.

R 엑셀파일이 있는 위치로 디렉토리 설정

R Studio에서 워킹디렉토리를 생성할 수 있습니다.

file>New Project >existing directory>분석에 사용할 엑셀파일이 들어있는 폴더로 경로 설정

혹은 함수를 이용해 변경하는 방법이 있습니다.

getwd() # 현작업디렉토리 추출
#엑셀파일이 있는 경로와 다른지 확인 합니다.

setwd("주소") # 현작업디렉토리 주소 변경
#다르다면 엑셀파일이 있는 경로로 수정합니다.

그후
df= read.csv("파일명.csv") #파일을 불러옵니다.

,fileEncoding = "UTF-8-BOM"
#만일 여전히 한글이 깨진다면 다음 옵션 추가하기
,na.strings = c("NA", "." , "null" , "NULL")
#간혹 NA가 글자로 인식되어 null처리가 안되는데, 해당 경우를 입력해 NA 처리해주기


write.csv(df , "파일명.csv", row.names=false) #저장 #저장위치는 setwd("주소")로 설정가능


로지스틱 회귀분석의 목표
종속변수(y)가 연속형이 아닌 범주형 값인 경우 분류문제를 다루기위한 통계적 방법
 
회귀식 : y = b0 + b1x1+b2x2+...+bnxn
 
주요 이론
- 분류문제를 회귀의 방법으로 해결하는 방법.
  회귀기법의 하나이므로 종속변수가 숫자로 표현.
- 로지스틱회귀식 : 다중선형회귀와 공식이 동일. 
- R : pred = predict(모델,예측값)
    #predict()함수로 예측결과 출력가능
  pred는 정수가 아닌 실수가 표시되며, 소수 첫째자리에서 반올림한 값이 예측값이다.
- 주요변수 : *** 별표 확인
- R : lm()이 아닌 glm()으로 모델학습
 
 
주요 R코드 (암기)
df$범주형y = as.integer(df$범주형y)
#범주형 자료(a,b,c..) 를 정수(1,2,3..)로 변환

모델 = glm(범주형y ~ . , 데이터셋)
summary(모델)

pred = predict(모델, 예측대상값) #범주예측
pred = round(pred,0) #list형태로 나옴.

levels(df$범주형y)[pred] #실제 범주명 알아보기

ans = as.integer(df$범주형y)
acc = mean(pred == ans) #예측정확도 계산 및 출력
 
로지스틱회귀분석 R실습
문제 : 여러독립변수 이용해 종속변수에측
 
 
#실습코드
#1)데이터셋 준비
df = iris
df$Species = as.integer(df$Species)
#범주형자료 정수로변환
 
#2)로지스틱회귀모델 학습
model=glm(Species~ . , data=df)
summary(model) #coefficients부분, ***확인
 
#3)모델로 예측하기
val = data.frame(rbind(c(5,3,1,2)) #예측대상값
names(val) = names(df)[1:4]
pred = predict(model, val) #품종예측
pred= round(pred,0)
levels(iris$Species)[pred] #실제 범주와 매칭하기
 
#4) 다수데이터 예측하기
test = iris[, 1:4]
pred = predict(model, test)
pred=round(pred,0)
ans = as.integer(iris$Species)
acc= mean(pred == ans) #예측정확도
 
 
 

 

+ Recent posts