참고 : https://wikidocs.net/book/4315
1. R 기본문법 1단계
getwd() # 현재 경로
setwd('바꿀경로') # 경로 변경
1) 벡터
c()
: 벡터
rep()
: repeat ( 반복된 데이터 )
seq()
: sequence ( 순차적 데이터 )
x1 = c(1:10)
# 1,2,...,10
x2 = seq(1,10,2)
# 1,3,5,7,9
x3 = rep(1,10)
# 1,1,...,1
2) 데이터 프레임
df = data.frame(
X = c(1:10),
y = rep(1,10)
)
head(df)
3) for loop
A=c(1,2,3,4,5)
for (i in A){
print(i)
}
4) indexing
벡터
A[2] # 2번째
A[1:2] # 1,2번째
A[-1] # 1번째 제외
A[c(1,2,5)] #1,2,5번째
데이터프레임
df[1,] # 1행
df[,1] # 1열
df[c(1,2,3),-2] # 1,2,3 행 & 2열 제외
5) change datatype
데이터 형태 바꾸기
x1 = as.integer(x)
x2 = as.numeric(x)
x3 = as.factor(x)
x4 = as.character(x)
데이터 형태 확인하기
is.integer(x)
is.numeric(x)
is.factor(x)
is.character(x)
데이터 형태/요약 확인하기
str(x1)
summary(x1)
6) sample
복원추출/비복원추출
sample(1:45, 6) # 비복원추출
sample(1:45, 6, replace = FALSE) # 비복원추출
sample(1:45, 6, replace = TRUE) # 복원추출
난수 고정
set.seed(1234)
7) if 문
A = c(1,2,3,4,5)
if( 7 %in% A){
print("TRUE")
} else{
print("FALSE")
}
8) 함수
my function = function(x){
y = 2*x
return(y)
}
9) 패키지
install.packages("패키지명")
library(패키지명)
2. R 기본문법 2단계
1) 데이터 불러오기
- 데이터 불러오기
data = read.csv('경로')
- 기본적인 EDA
head(data)
str(data)
summary(data)
2) conditioning & subset
- conditioning
data$new_column = ifelse(data$old > 0,'POS','NEG')
- subset
df_partial = subset(df,old>0)
df_partial = subset(df,old>0 & height>175)
df_partial = subset(df,old>0 | height>175)
3) 집계된 데이터 ( plyr 패키지 )
library(plyr)
Summary_df = ddply(df, # (1)
c("department","salary"), # (2)
summarise,
M_SF=mean(satisfaction_level), # (3)
COUNT=length(department),
M_WH=round(mean(average_montly_hours),2))
)
해석
- (1) dataframe
- (2) department & salary 칼럼 별로(groupby) summarize하기
- (3) 다음의 3가지 변수 생성
- 1) satisfaction_level의 평균
- 2) 직원 수
- 3) average_montly_hours의 평균
결과 :
Summary_df
----------------------------------------------------
department salary M_SF COUNT M_WH
1 accounting high 0.6140541 74 205.91
2 accounting low 0.5741620 358 199.90
3 accounting medium 0.5836418 335 201.47
4 hr high 0.6731111 45 209.07
5 hr low 0.6086567 335 202.46
6 hr medium 0.5803064 359 193.86
........
3. ggplot2
1) 큰 틀
ggplot(data,aes(x=var1,y=var2))
- aes ( aesthetic ) : 변수는 이 안에 있어야!
다양한 그래프들
geom_bar( )
: bar plotgeom_histogram( )
: histogramgeom_boxplot( )
: box plotgeom_line( )
: line plot
다양한 옵션들
labs( )
: legend labelggtitle( )
: titlexlabs( )
,ylabs( )
: x & y label
2) barplot : geom_bar
기본 그래프
- x축 : salary
- y축 : 집계된 값 ( count )
ggplot(HR,aes(x=salary)) + geom_bar()
색상 꾸미기
# royal blue 색으로
ggplot(HR,aes(x=salary)) + geom_bar(fill = 'royalblue')
# var1에 따라 색 다르게
ggplot(HR,aes(x=salary)) + geom_bar(aes(fill=var1))
범례 / 축 이름
ggplot(HR,aes(x=salary)) +
geom_bar(aes(fill=left)) +
labs(fill = "Divided by left") +
xlab("봉급") + ylab("")
img1
3) histogram : geom_histogram
기본 그래프
ggplot(HR,aes(x=satisfaction_level))+geom_histogram()
histogram 꾸미기
ggplot(HR,aes(x=satisfaction_level)) +
geom_histogram(binwidth = 0.01,col='red',fill='royalblue')
4) density plot : geom_density
기본 그래프
ggplot(HR,aes(x=satisfaction_level))+geom_density()
density plot 꾸미기
ggplot(HR,aes(x=satisfaction_level)) +
geom_density(col='red',fill='royalblue')
5) box plot : geom_boxplot
기본 그래프
ggplot(HR,aes(x=left,y=satisfaction_level)) + geom_boxplot()
box plot 꾸미기
ggplot(HR,aes(x=left,y=satisfaction_level)) +
geom_boxplot(aes(fill = salary),alpha = I(0.4),outlier.colour = 'red') +
xlab("이직여부") + ylab("만족도") + ggtitle("Boxplot") +
labs(fill = "임금 수준")
img2
6) scatter plot : geom_point
기본 그래프
ggplot(HR,aes(x=average_montly_hours,y=satisfaction_level))+
geom_point()
scatter plot 꾸미기
ggplot(HR,aes(x=average_montly_hours,y=satisfaction_level))+
geom_point(aes(col = left)) +
labs(col = '이직 여부') + xlab("평균 근무시간") + ylab("만족도")
4. 통계값
데이터 요악값 (summary)
summary(df$var1)
quantile
- ex) 10%, 30%, 60%, 90% 분위수
quantile(df$var1,probs = c(0.1,0.3,0.6,0.9))
colMeans, colSums
colMeans(df[1:5])
colSums(df[1:5])
5. 결측치 & 이상치
결측치 여부 확인
# 특정 변수의 결측치 여부
is.na(df$var1)
# 특정 변수의 결측치 개수
sum(is.na(df$var1))
# 모든 변수의 결측치 개수
colSums(is.na(df))
결측치 제거
- 모든 변수 중, 결측치가 1개라도 있는 행은 모두 제거
df2 = na.omit(df)
- 특정 변수에 결측치 있는 행 제거
df3 = df[complete.cases(df$var1),]
결측치 대체
df$var2=df$var1
df$var2[is.na(df$var2)]=999
결측치 생략 후 계산
mean(df$var,na.rm = TRUE) # return : NA
mean(df$var,na.rm = TRUE) # return : NA 제외 후 평균
이상치 기준 선정 & 제거
Q1 = quantile(df$var1,probs = c(0.25),na.rm = TRUE)
Q3 = quantile(df$var1,probs = c(0.75),na.rm = TRUE)
LC = Q1 - 1.5 * (Q3 - Q1)
UC = Q3 + 1.5 * (Q3 - Q1)
df2 = subset(df, var1>LC & var2<UC)
6. 문자열 처리
- 문자열 대체 :
gsub()
- 문자열 분리 :
strsplit()
- 문자열 합치기 :
paste()
- 문자열 추출 :
substr()
- 텍스트마이닝 함수:
Corpus()
&tm_map()
&tdm()
문자열 추출
-
ex) 1~5번째 글자
substr(df$var1,1,5)
문자열 붙이기
-
ex) “@” & “naver.com” 붙이기
paste(df$id,"@","naver.com") # default : 한 칸씩 띄어서 ### seunghan96 @ naver.com ### seunghan97 @ naver.com ### ... paste(df$id,"@","naver.com", sep="") ### seunghan96@naver.com ### seunghan97@naver.com ### ...
문자열 분리
-
특정 문자를 기준으로, 분리하기
( 주의 : 무조건 character 형태의 변수여야! )
-
ex) “,”를 기준으로 분리
strsplit(df$charvar1, split=",") strsplit(as.character(df$var1), split=",")
문자열 대체
-
ex) “,”를 “!”로 대체하기
df$var2 = gsub(",","!",df$var1)
7. Text Mining
library(tm)
Text Mining 프로세스
-
Corpus 생성
-
TDM 생성
-
문자 처리
(특수문자 제거, 조사 제거, 숫자 제거 등..)
-
문자열 변수 생성
step 1) corpus 생성
코퍼스 생성
my_corpus = Corpus(VectorSource(df$var1))
전처리 과정
- 1) 공백 제거
- 2) 특수문자 제거
- 3) 숫자 제거
- 4) 소문자 변환
- 5) 불용어 제거
my_corpus = tm_map(my_corpus,stripWhitespace)
my_corpus = tm_map(my_corpus,removePunctuation)
my_corpus = tm_map(my_corpus, removeNumbers)
my_corpus = tm_map(my_corpus, tolower)
my_corpus = tm_map(my_corpus,removeWords,
c(stopwords("english"),"my","custom","words"))
step 2) TDM 생성
my_tdm = DocumentTermMatrix(my_corpus)
my_tdm_df = as.data.frame(as.matrix(my_tdm))
기존 데이터랑 합치기
df_total = cbind(df,my_tdm_df)
step 3) 문자열 데이터 시각화
- term document matrix 만들기
my_tdm2 = TermDocumentMatrix(my_corpus)
my_tdm2_mat = as.matrix(my_tdm2)
- 최빈 등장 순으로 sorting & df로 만들기
v = sort(rowSums(my_tdm2_mat),decreasing=TRUE)
df_for_wc = data.frame(word = names(v),freq=v)
- 시각화 1 : word cloud
- min.freq : 단어 최소 등장 횟수
- max.words : 최대 단어 개수
- random.order : 단어 위치 random 여부
library("SnowballC")
library("wordcloud")
library("RColorBrewer")
wordcloud(words = df_for_wc$word, freq = ddf_for_wc$freq,
min.freq = 5, max.words=200, random.order=FALSE,
colors=brewer.pal(8, "Dark2"))
- 시각화 2 : 단어 빈도 그래프
top_N = 10
barplot(d[1:top_N,]$freq, las = 2,
names.arg = d[1:top_N,]$word,
col ="lightblue",
main ="Most frequent words",
ylab = "Word frequencies")
8. dplyr
library(dplyr)
library(reshape)
apply 함수
apply(df, 1, function) # row
apply(df, 2, function) # column
# A = B
apply(df[,1:2],1,mean) # [A]
rowMeans(df[,1:2]) # [B]
%>%
( pipeline )
df[,1:2] %>%
rowMeans() %>%
head()
df2022 = df %>% filter(Year == "2022")
# 샘플링
df_partial = df %>% sample_frac(size = 0.4, replace = FALSE)
df_partial = df %>% sample_n(size = 2, replace = FALSE)
# index 통해 추출
df_partial = df %>% slice(1:10)
# 특정 기준으로 추출
df_TOP = df %>% top_n(5,var1)
# 정렬하기
df_sorted = df %>% arrange(var1) # 오름차순
df_sorted = df %>% arrange(-var1) # 내림차순
# 특정 변수만 추출
df_selected = df %>% select(1:2)
df_selected = df %>% select(var1,var2)
# 조건 따라 필터링 ( ex. 데이터 타입 )
df_factor = df %>% select_if(is.factor)
df_integer = df %>% select_if(is.integer)
데이터 집계
df %>%
summarise(new_var1 = mean(var1),
new_var2 = max(var2),
new_var3 = length(var3))
df2 = df %>%
subset(var1 == 1) %>%
group_by(var2) %>%
dplyr::summarise(new_var1 = mean(var1),
new_var2 = max(var2),
new_var3 = length(var3))
변수 추가
df3 = df2 %>% mutate(new_var4 = new_var1 / new_var2)
9. 중복 데이터 제거 & 정렬
1) 중복 데이터 제거
- 1차원
unique_vector = unique(vector)
- 2차원
# 2차원
## 1개의 변수라도 중복이면, 전부 제거
df2 = df[-which(duplicated(df)),]
## 특정 변수 1개가 중복이면, 제거
df2 = df[-which(duplicated(df$var1)),]
## 특정 변수 n개가 중복이면, 제거
df2 = df[!duplicated(df[,c(3,4,5)]),]
df2 = df[!duplicated(df[,c('var1','var2')]),]
2) 데이터 정렬
- 날짜 최신순으로 정렬!
df$DATE = as.Date(df$DATE,"%Y-%m-%d")
df = df[order(df[,'DATE'],decreasing = TRUE), ]
10. Reshape
library(reshape)
[형태1]
img3
[형태2]
img4
형태 1 -> 형태2 : cast
형태 2 -> 형태1 : melt
cast_data = cast(df,OBS + NAME + ID + DATE ~ TEST)
melt_data = melt(cast_data,id=c("OBS","NAME","ID","DATE"))
melt_data = na.omit(MELT_DATA)
11. Merge
특정 key값을 기준으로 합치기
merged_df = merge(df1,df2, by = "ID",all.x = TRUE)
merged_df = merge(df1,df2, by = "ID",all = TRUE)
merged_df = merge(df1,df2, by = "ID",all.y = TRUE)
merged_df = merge(df1,df2, by = "ID",all = FALSE)
img5
12. group_by ( feat dplyr
)
- grouping
group_df = df %>%
group_by(var1,var2) %>%
summarise(new_var1 = round(mean(var3)),
new_var2 = round(median(var4)),
new_var3 = round(max(var5)),
new_var4 = length(var6))
- un-grouping
ungroup_df = group_df %>% ungroup()
13. mutate
for 새로운 변수 생성
- ex) mutate(), mutate_if(), mutate_at()
1) mutate
1개의 변수 추가
df2 = df %>%
mutate(new_var = round(var1/var2,2)) %>%
select(var3,var4,var5)
2) mutate_if
지정해준 모든 변수에 대해, 조건 만족 시, 적용
# ex) integer 타입 변수를 모두 numeric으로 변경
df2 = df %>% mutate_if(is.integer,as.numeric)
3) mutate_at
지정해준 모든 변수에 대해 적용
df2 = df %>%
mutate_at(vars(-var1,-var2,-var3),log) %>%
select_if(is.numeric)