일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 백준
- 그리디 알고리즘
- 유데미부트캠프
- DataFrame
- 데이터프레임
- 브루트포스 알고리즘
- numpy
- Tableau
- 부트캠프후기
- 파이썬
- 유데미
- 데이터분석
- 판다스
- 유데미코리아
- 정렬
- 넘파이
- 데이터시각화
- 코딩테스트
- ndarray
- 유데미큐레이션
- 스타터스부트캠프
- 취업부트캠프
- Leetcode
- pandas
- python
- matplotlb
- 시각화
- 데이터드리븐
- Til
- 태블로
- Today
- Total
Diary, Data, IT
[TIL] 12일차 TIL(20230221) - 데이터 전처리, 시각화, dplyr 본문
[TIL] 12일차 TIL(20230221) - 데이터 전처리, 시각화, dplyr
1. 산술 연산자
- ^: 제곱 연산자
- %%: 나머지 연산자
- %/%: 몫 연산자
2. 논리 연산자
- R에서는 logical 값들을 벡터화시켜 논리 연산에 적용 가능
- &: AND, 벡터일 경우 원소단위로 개별연산하여 각각의 결과를 모두 출력
&&: 벡터일 경우 첫번째 원소간의 연산결과를 출력
- |: OR, 벡터일 경우 원소단위로 개별연산하여 각각의 결과를 모두 출력
||: 벡터일 경우 첫번째 원소간의 연산결과를 출력
3. 산술 함수
- prod(vector): 입력 벡터들의 곱셈 값 출력
- factorial(n): 1부터 입력값까지의 팩토리얼 값 출력
- abs(vector): 입력값들의 절대값 출력
- range(vector): 입력 벡터의 최소값, 최대값 출력
- var(vector)/sd(vector): 입력 벡터의 분산/표준편차 값 출력
- quantile(vector): 0%부터 100%까지 사분위 수 값을 모두 출력
4. 문자열 관련 함수
- paste(문자열1, 문자열2, ...): 값들을 하나의 문자열로 합치는 함수
벡터 값들을 개별로 인식하여 각각 합쳐서 반환
ex) paste(c(1,2,3), c(‘번’, ‘번’, ‘번’)) -> c(‘1 번‘, ‘2 번’, ‘3 번’)
- rep(vector, n): 벡터를 반복하여 길이가 n인 벡터 생성
each = n옵션을 지정하여 각각의 요소를 먼저 반복하는 형태로도 사용 가능
5. 조건문
5.1 if
if (조건식){
실행문1
}else if{
실행문2
}
# 삼항연산자를 이용한 간단한 조건문 작성
ifelse(조건식, '참'인 경우 실행문, '거짓'인 경우 실행문)
5.2 switch
switch(입력 값, 비교값1=실행문1, 비교값2=실행문2, … , 기본 실행문)
- 입력 값과 비교값이 같다면 해당하는 실행문 실행
- 입력값은 단순 문자열 등의 크기가 1인 벡터여야 함
- 기본 실행문은 입력 값과 같은 비교 값이 없을 때 실행
- 비교 값은 문자열 형식만 가능
5.3 which
which(조건문)
- 조건에 해당하는 입력 벡터 내부 값의 인덱스(위치) 출력
- vector[which(조건문)]을 이용하면 조건을 만족하는 해당 값들을 뽑아올 수 있음
6. 반복문
# 1. for 반복문
for( 변수 in 데이터){
명령문
}
# 2. while 반복문
while(조건식){
조건이 참인 경우 수행할 명령문
}
- min함수를 반복문을 이용하여 구현하는 예제
data <- c(32, 45, 21, 10, 43)
min <- Inf
for (i in data){
min <- ifelse(i <min, i, min)
}
print(min)
7. 벡터의 위치 참조
- 벡터[index]를 통해 해당하는 인덱스의 값들만 참조할 수 있음
- index에 음수 값을 넣게 되면 해당하는 인덱스의 값들만 제외하고 가져옴
8. 사용자 정의 함수
함수명 <- function(매개변수1, 매개변수2=초기 값, ...) {
실행문
return(리턴 값) #생략 가능
}
9. 데이터 가져오기
- scan(): 사용자에게 값을 직접 입력받아서 가져올 수 있음, numeric 형식만 지원
- scan(what = character()): character형식 값 입력 가능
- read.table(파일명, header=TRUE, sep=“”, col.names=c(), na.string=“”)
na.string: 데이터에 NA가 있다면 어떤 문자로 표현되고 있는지 설정
- read.csv(파일명, header=TRUE, col.names=c(), na.string=“”)
- read_excel(파일명, sheet=NULL, range=NULL, col_names=TRUE, col_types=NULL, na=“”)
sheet = 시트명 지정
range = 데이터를 어디서부터 어디까지 불러올 것인지 행,열의 위치에 맞게 지정(R3C1: 3row 1col)
10. 데이터 내보내기
- write.table(데이터 프레임 변수, 저장할 파일 명, row.name=TRUE, quote = TRUE, sep=“ ”)
row.name: 행 번호 붙일지 말지 선택
quote: character형식 데이터에 "붙일지 말지 선택
- write.csv(데이터 프레임 변수, 저장할 파일 명, row.name=TRUE, quote = TRUE, nrows = n)
- write_xlsx(데이터 프레임 변수, path =저장할 파일 명)
11. 데이터 확인하기
- dim: 데이터의 차원 확인
- length: 데이터의 길이 확인 / nrows(data): 데이터프레임의 행의 길이 반환
데이터를 통째로 넣으면 col의 길이/ row의 길이를 알고싶다면 data$column 형태로 넣을 것
- str(data): class, 크기, 미리보기 값 제공
- names: data 칼럼들을 보여줌
- View(data): RStudio 뷰어 창에서 데이터 확인
- table(data$column): 벡터 내에서 각각의 데이터 값이 몇 회 존재하였는지 체크
12. 그래프 그리기
- 산점도: plot(x,y, type=‘p’, main=NULL, xlab=“”, ylab=“”, xlim=c(), ylim=c())
type = 'p'(점), 'l'(선), 'b'(점&선)
pch = 점의 모양(숫자 1~25, 문자로 지정 가능)
main = 그래프 제목 지정
- x축을 따로 지정하지 않으면 0부터 순차적으로 그려줌
- 파이차트: pie(data, label = "", init.angle = 0, radius = 1)
int.angle: 기준선 각도
radius: 원의 크기 조절
table객체를 넣게 되면 label이 자체적으로 붙음
- 히스토그램: hist(data, breaks = 10, frep = T)
breaks: 범주의 개수 지정
frep = T(횟수) or F(비율)
- 상자그림: boxplot(data, boxwex = 박스의 너비)
data에 data.frame형식 사용 시, 컬럼별 boxplot이 그려짐
- plot()으로 그래프를 그리고 그 위에 lines()를 그려서 하나의 그래프 뒤에 다른 하나를 겹쳐서 그릴 수 있음
- 범례: legend("topright"(위치), legend=c("label1", "label2"), fill=c("color1", "color2"))
12.1 여러 개의 그래프 나눠서 표현
- par(mfrow = c(분할할 행 개수, 분할할 열 개수))
행 개수 * 열 개수의 그래프를 한 화면에 그릴 수 있음
## 화면 분할해서 그리기
par(mfrow = c(1, 2))
hist(data$Temp, breaks = 15)
hist(data$Temp, breaks = 20)
13. dplyr
- rename(data, 변경 후 컬럼명1=기존 컬럼명1, 변경 후 컬럼명2=기존 컬럼명2, … ): 특정 칼럼의 이름 변경
- arrange(data, desc(컬럼 이름), 컬럼 이름): 특정 컬럼의 값을 기준으로 데이터 정렬(내림차순은 desc)
- distinct(data, 컬럼 이름): 데이터에서 특정 컬럼의 중복 값 제거
- select(dataframe, 컬럼명1, 컬럼명2, ...): 특정 컬럼을 순서대로 추출
파이프라인 사용시: df %>% select(column1, column2)
- filter(dataframe, 조건식)
파이프라인 사용시: df %>% filter(math > 60 & english < 80)
- mutate(dataframe, 생성할 컬럼명1 = 수식1, ...): 기존 컬럼값을 사용하여 새로운 컬럼을 생성
파이프라인 사용시: df %>% mutate(average = (math + science + english)/3)
- group_by + summarise: 특정 컬럼으로 그룹화한 뒤 계산 수행
파이프라인 사용시: exam %>% group_by(id) %>% summarise(mathAvg = mean(math))
- count(df, 컬럼명, sort = T): 컬럼의 요소들 개수를 세서 반환
* select를 통해 추출한 결과에 연산을 적용하고 싶을 때, pull()을 적용하면 벡터화하여 값을 가져와서 연산 적용이 가능
14. 데이터 전처리 및 시각화 실습
14.1 문제)
코로나19 백신 접종 집계 데이터에서 2021.09.01~2021.09.30일 한달간의 '당일 1차 접종자' 데이터와 '당일 2차 접종자' 데이터를 한 그래프 안에 그리세요. 또한, 같은 기간 '1차 접종률‘ 데이터와 '2차 접종률‘ 데이터를 한 그래프안에 그리세요.
# 데이터 불러오기
covid = read.csv('covid19.csv')
names(covid)
# 9월 데이터를 확인하여 추출
# 순서가 반대로 되어있어 이를 반영하여 원래 순서대로 불러옴
covid_1 = covid[c(64:35), c(3, 6)] # 접종자 데이터
covid_2 = covid[c(64:35), c(5, 8)] # 접종률 데이터
# 칼럼명 변경
names(covid_1) = c('first', 'second')
names(covid_2) = c('first_rate', 'second_rate')
# 그래프 그리기
par(mfrow = c(2, 1))
plot(1:length(covid_1$first), covid_1$first, pch = 19, type = 'o', main = '코로나 일일 백신 접종 수', col = 'red', xlab = 'day', 'ylab' = 'count')
lines(covid_1$second, pch = 19, type = 'o', col = 'blue')
legend('bottomright', legend = c('first', 'second'), fill = c('red', 'blue'))
plot(1:length(covid_2$first_rate), covid_2$first_rate, pch = 19, type = 'o', main = '총 백신 접종률 (%)', col = 'red', ylim = c(20, 80), xlab = 'day', 'ylab' = 'count')
lines(covid_2$second_rate, pch = 19, type = 'o', col = 'blue')
legend('bottomright', legend = c('first', 'second'), fill = c('red', 'blue'))
14.2 문제)
1. 대륙별 평균 GDP를 구하시오.
2. 아메리카 대륙에 대한 데이터 프레임을 구하고, 총 몇 개의 행이 있는지 확인하시오.
3. 아메리카 대륙에서 인구가 3천만 이상인 데이터 프레임을 구하고, 해당 데이터 프레임의 country 컬럼별 행 개수를 구하시오.
4. Brazil, Mexico, United States의 년도 별 인구수를 한 그래프에 그리시오.
## 대륙별 평균 GDP
gapminder %>% group_by(continent) %>% summarise(mean_gdpPercap = mean(gdpPercap))
## 아메리카 대륙에 대한 데이터 프레임을 구하고, 총 몇 개의 행이 있는지 확인
gapminder %>% filter(continent == 'Americas') %>% nrow()
## 아메리카 대륙에서 인구가 3천만 이상인 데이터 프레임을 구하고,
## 해당 데이터 프레임의 country 컬럼별 행 개수를 구하기
gapminder %>% filter(continent == 'Americas' & pop >= 30000000) %>% count(country, sort = T)
## Brazil, Mexico, United States의 년도 별 인구수를 한 그래프에 그리기
brazil <- gapminder %>% filter(country == 'Brazil') %>% select(year, pop)
mexico <- gapminder %>% filter(country == 'Mexico') %>% select(year, pop)
us <- gapminder %>% filter(country == 'United States') %>% select(year,pop)
min_y = min(c(brazil$pop, mexico$pop, us$pop))
max_y = max(c(brazil$pop, mexico$pop, us$pop))
plot(brazil$year, brazil$pop, type = 'o', pch = 19, ylim = c(min_y, max_y),
xlab = 'year', ylab = 'pop', col = 'red', main = '나라의 년도별 인구 수 추이')
lines(brazil$year, mexico$pop, type = 'o', pch = 19, col = 'blue')
lines(brazil$year, us$pop, type = 'o', pch = 19, col = 'green')
legend('topleft', legend = c('brazil', 'mexico', 'united states'),
fill = c('red', 'blue', 'green'))
소감 및 정리
오늘은 어제에 이어 본격적으로 R을 다루는 시간을 가졌다. 우려했던대로 전체적인 문법의 구조가 약간씩 기억나기는 했지만 세세한 부분은 많이 잊어버려서 실습을 직접 해보는데 시간이 오래걸렸다. 그래도 실습 문제가 많이 주어져서 다시 빠르게 감을 익히는데 도움이 됐다. 2~3년 전쯤 R을 주로 사용했을 때 dplyr 패키지를 많이 이용했었고, 파이썬으로 넘어왔을 초창기에 dplyr 패키지의 편리성이 그리웠던 때가 있었는데 이제는 파이썬이 더 편한 언어가 되어버렸다ㅎㅎ... 그래도 실습을 진행하면서 확실히 dplyr 패키지는 여전히 R에서 전처리를 빠르고 효율적으로 할 수 있는 좋은 도구라는 느낌을 받았다. 내일 ggplot 패키지를 이용한 시각화에 대해서 배우는데 dplyr과 함께 많이 사용해보면서 더 연습해봐야겠다!
'STARTERS > TIL' 카테고리의 다른 글
[TIL] 14일차 TIL(20230223) - 디자인 씽킹 1일차 (1) | 2023.02.23 |
---|---|
[TIL] 13일차 TIL(20230222) - ggplot, 가설검정, 상관계수 (0) | 2023.02.23 |
[TIL] 11일차 TIL(20230220) - R 기초 (0) | 2023.02.20 |
[TIL] 10일차 TIL(20230217) - RANK, ROLL UP, 공공데이터를 이용한 SQL 실습 (0) | 2023.02.19 |
[TIL] 9일차 TIL(20230216) - 집계함수, 문자열/날짜 자료형, 서브쿼리, JOIN (0) | 2023.02.16 |