iris
R의 기초
1 R 창(pane)의 구조
1.1 R Studio 초기 화면 구성
RStudio를 실행하면 아래와 같은 초기 화면이 나타난다. 크게 세 부분으로 구성되어 있는데, 좌측의 큰 창은 콘솔(console)창, 우상단의 창은 환경(environment)창, 우하단의 창은 결과(output)창 혹은 파일(file)창이라 부른다.
콘솔창: 직접 코드를 입력 및 실행하거나 소스창에서 실행한 R 코드의 결과나 나타나는 곳
환경창: 값을 할당한 각종 변수 및 객체의 리스트를 볼 수 있는 곳
결과창: 파일 리스트 확인(Files), 그래프 및 지도 등 시각화 객체 출력(Plots), 설치된 패키지 확인(Packages), 도움말 출력(Help) 등의 기능을 수행하는 곳
1.2 소스창 추가
콘솔창에서의 코드는 Eneter
를 치는 순간 즉각적으로 실행되고 저장되지 않기 때문에 코드를 길게 작성하거나 수정하기에는 불편하다. 이를 해결하기 위한 새로운 창이 바로 소스(source)창이다. 소스창을 추가하는 방법은 세 가지이다.
-
최상단 메뉴 이용: File > New File > R Script
-
콘솔창 우상단의 창 아이콘 클릭
단축키:
Ctrl + Shift + N
(윈도우) /Command + Shift + N
(Mac)
소스창을 생성하면 아래와 같이 콘솔창 위에 새로운 창이 생긴 것을 확인할 수 있다. 이곳에서 작성하는 코드는 Enter
키를 누르더라도 코드가 바로 실행되지 않고, 줄바꿈이 되어 코드를 이어 작성할 수 있다. 만약 코드를 실행하고 싶다면 실행하고 싶은 코드가 있는 라인에 커서를 두거나 드래그를 하여 여러 코드 라인을 선택한 후, Ctrl + Enter
를 누르거나 소스창 우상단의 Run
버튼을 누르면 된다.
2 R과 놀아보기
2.1 R 콘솔과 프롬프트
R 콘솔은 사용자의 명령문을 받고 결과물을 출력하는 곳이다. 콘솔창에 나타나는 >
기호는 명령 프롬프트라 불리며, R이 사용자의 명령을 받을 준비가 되었음을 의미한다. 프롬프트에 명령문을 입력하고 Enter
키를 누르면 입력된 명령문이 R에 전달되어 실행된다. 출력 결과는 >
이 없는 행에 표시된다. 아래 코드를 R 콘솔창 프롬프트에 입력하고 Enter
키를 눌러 R 명령문을 실행해보자.
iris
에 대해 자세히 알고 싶다면 ?
명령어를 이용할 수 있다.
?iris
위 코드를 실행하면 오른편의 Help 창에 도움말이 나타난다. iris
는 R 내장 데이터로 붓꽃 세 종(Setosa, Versicolor, Virginica)에 대해 각각 50개의 꽃 표본의 측정값을 포함하고 있음을 알 수 있다. 변수로는 꽃받침(sepal)의 길이와 너비, 꽃잎(petal)의 길이와 너비가 있으며, 단위는 센티미터(cm)이다. ?
은 내장 데이터 뿐만 아니라 함수에 대한 설명도 제공한다.
?summary
도움말을 보면 알 수 있듯이 summary()
함수는 기초 통계량을 제공하는 함수이다. summary()
를 사용하여 iris
데이터의 기초 통계량을 구해보자.
summary(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50
Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
setosa
종의 꽃받침 너비와 길이의 상관 관계를 파악하기 위해 산점도를 그려보고 싶다면 plot()
함수를 이용하면 된다. 출력 결과는 콘솔창이 아닌 Plots 창에 나타나는 걸 확인할 수 있다. 이때 data
옵션에 iris
가 아닌 iris[1:50, ]
을 입력한 것은 종이 setosa
인 데이터가 iris
데이터의 1~50행에 위치하고 있기 때문에 해당 데이터 영역만 인덱싱하기 위함이다.
plot(Sepal.Length ~ Sepal.Width, data = iris[1:50,])
2.2 변수와 할당
지금부터의 실습은 콘솔창이 아닌 소스창에서 진행한다. 상술하였듯 콘솔창의 코드는 수정이 어렵고 저장이 불가능하기 때문이다. 소스창에 입력한 코드를 실행하기 위해서는 Ctrl + Enter
를 입력한다.
동아시아 국가의 인구를 활용하여 총합과 평균을 구한다고 가정해보자. 2024년 기준 한국은 51,738,086명, 중국은 1,429,060,864명, 일본은 124,071,179명이다. 동아시아 인구 총합과 평균을 계산하기 위해선 다음과 같은 코드를 입력해야 한다.
51738086 + 1429060864 + 124071179 # 합
[1] 1604870129
(51738086 + 1429060864 + 124071179) / 3 # 평균
[1] 534956710
코드를 직접 타이핑 하는 순간 한중일의 인구 수를 좀 더 간단하게 표현할 수 있으면 좋겠다는 생각이 들 것이다. 또한, 두 연산에서 인구의 합 계산이 반복되고 있음을 알 수 있다. 이러한 문제를 해결할 수 있는 방법이 변수와 할당이다.
변수는 데이터를 저장해두는 공간이라고 생각하면 쉽다. 예를 들어, 한국의 인구 수를 메모리에 저장하고, 그 저장 위치를 가리키는 이름을 korea
라고 붙였다고 하자. 이 때 korea
가 변수, 이름을 붙이는 행위가 할당이라 볼 수 있다. R에서 할당은 할당 연산자 <-
를 이용하여 수행한다.
각 국가의 인구수를 각 국가명의 변수에 할당해보자. 할당이 완료된 후 각 국가명을 호출하면 각 국가의 인구 수가 정상적으로 호출되는 것을 볼 수 있다.
korea <- 51738086
china <- 1429060864
japan <- 124071179
korea
[1] 51738086
변수에는 연산 수행 결과도 할당시킬 수 있다. 동아시아 인구 총합을 total
이라는 변수에 할당해보자.
total <- korea + china + japan
total
[1] 1604870129
변수 자체를 이용하여 다양한 명령을 수행하는 것도 가능하다. 동아시아 인구 평균을 계산할 때 미리 할당해 둔 total 변수를 이용하면 불필요한 연산을 추가로 할 필요 없이 계산할 수 있다.
total / 3
[1] 534956710
2.3 함수
R에는 다양한 함수가 존재하며, 필요에 따라서는 사용자가 자신만의 함수를 만들 수도 있다. 함수는 괄호 ( )
안의 값을 입력으로 받아 해당 입력값을 활용하여 다양한 연산을 수행한 후 그 결과를 출력으로 반환하며, 함수에 따라 입력과 출력의 형태가 달라진다. 위에서 살펴본 summary()
나 plot()
도 함수의 하나이다. 지금은 간단한 내장 함수들을 위주로 살펴보자.
2.4 패키지 설치 및 로드
R에는 R을 설치할 때부터 같이 설치되는 내장함수도 있지만, 내장함수에 없는 다양한 함수와 데이터를 담고 있는 패키지를 설치하여 사용할 수 있다. 앞으로의 실습에 있어 다양한 패키지를 설치하고 불러와 사용할 것이므로 아래 과정에 익숙해지도록 하자.
패키지를 설치하는 방법은 크게 두 가지이다. 첫 번째는 코드를 사용하는 것이다.
install.packages("패키지명")
두 번째 방법은 결과창의 Packages
탭을 활용하는 것이다. Packages
탭을 누르고 상단에 Install
버튼을 클릭하면 설치창이 뜬다. 여기에 필요한 패키지명을 검색하여 패키지를 설치할 수 있다.
설치한 패키지를 로드하기 위해서는 다음 코드를 실행하면 된다.
library(패키지명)
연습삼아 우리가 앞으로 자주 사용할 패키지 하나인 tidyverse
를 설치해보자. tidyverse
는 데이터 전처리부터 시각화까지 수행하는 아주 강력한 패키지이다.
install.packages("tidyverse")
tidyverse
의 유용성을 확인하기 위해 iris
데이터를 활용하여 간단한 데이터 분석을 진행해보자. 예를 들어, 종이 virginica
이고 꽃잎의 길이가 짧은 순서대로 10개의 데이터의 꽃잎 길이와 너비만 보고 싶다 하자. tidyverse
를 사용하지 않고 base R 함수를 사용하면 iris
데이터에서 종이 virginica
인 개체를 추출하여 vir
변수에 할당한 후, 이를 꽃잎 길이로 정렬하여 상위 10개를 뽑아와야 한다. 코드로 작성하면 다음과 같다.
vir <- iris[iris$Species == "virginica", ]
head(vir[order(vir$Petal.Length), c("Petal.Length", "Petal.Width")], 10)
Petal.Length Petal.Width
107 4.5 1.7
127 4.8 1.8
139 4.8 1.8
122 4.9 2.0
124 4.9 1.8
128 4.9 1.8
114 5.0 2.0
120 5.0 1.5
147 5.0 1.9
102 5.1 1.9
데이터의 일부를 대괄호 []
을 사용하여 추출하는 것을 인덱싱이라한다. 특히, 표 형태의 데이터에서 인덱싱을 할 경우 [행 조건, 열 조건]
으로 입력해주어야 한다.
iris[iris$Species == "virginica", c("Petal.Length", "Petal.Width")]
Petal.Length Petal.Width
101 6.0 2.5
102 5.1 1.9
103 5.9 2.1
104 5.6 1.8
105 5.8 2.2
106 6.6 2.1
107 4.5 1.7
108 6.3 1.8
109 5.8 1.8
110 6.1 2.5
위 코드는 iris
라는 데이터에서 종이 virginica
인 개체를 행 조건으로 부여하여 해당 조건을 만족하고 있는 행만 추출하고, 열 조건에는 꽃잎 길이와 너비 변수만 선택하도록 하여 특정 열만을 선택한 것을 알 수 있다.
이때 사용된 $
과 ==
은 연산자라고 한다. 각 연산자의 기능은 다음과 같다.
-
$
: 데이터의 특정 구성 요소(이름이 있는 열 또는 항목)를 지정할 때 사용length(iris$Species)
[1] 150
-
==
: 두 같이 같은지를 비교할 때 사용1 == 1
[1] TRUE
1 == 2
[1] FALSE
이외에도 R에는 <
, >
, <=
, >=
, !=
등과 같은 다양한 연산자가 존재한다.
base R로 작성된 코드를 tidyverse
를 사용하면 보다 쉽게 코드를 작성할 수 있다. 먼저 tidyverse
패키지를 불러온다.
── Attaching core tidyverse packages ──────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.4
── Conflicts ────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
iris |>
filter(Species == "virginica") |> # Species가 virginica인 행 필터링
select(Petal.Length, Petal.Width) |> # 꽃잎 길이와 너비 열 선택
arrange(Petal.Length) |> # Petal.Length 기준 정렬
head(n = 10) # 10개 값만 추출
Petal.Length Petal.Width
1 4.5 1.7
2 4.8 1.8
3 4.8 1.8
4 4.9 2.0
5 4.9 1.8
6 4.9 1.8
7 5.0 2.0
8 5.0 1.5
9 5.0 1.9
10 5.1 1.9
코드가 보다 깔끔해지고 직관적으로 작성된 것을 알 수 있다. 이것이 tidyverse
의 힘이다.
|>
파이프 연산자(pipe operator)는 여러 함수나 연산을 연결(chain)하여 데이터를 순차적으로 처리할 수 있도록 해주는 연산자다. |>
혹은 %>%
으로 나타내며, 단축키는 Ctrl(cmd) + Shift + M
이다. 각 함수의 결과를 다음 함수의 입력으로 전달하는 데 사용하며, 코드를 가독성 있게 작성하고 데이터 처리 순서를 논리적으로 표현하는 데 매우 유용하다.
3 RStudio 프로젝트 생성
3.1 RStudio 프로젝트란?
RStudio 프로젝트는 R 작업을 보다 체계적으로 관리할 수 있도록 도와주는 기능이다. 이를 사용하면 다음과 같은 장점이 있다.
코드 실행 시 작업 디렉토리(working directory)가 자동으로 프로젝트 폴더로 설정됨
모든 파일을 프로젝트 내에서 상대 경로로 참조 가능
다른 사용자와 협업 시,
.Rproj
설정을 공유하여 같은 환경에서 작업할 수 있게 해줌
3.2 RStudio 프로젝트 만들기
1단계: 프로젝트 생성창 열기
-
최상단 메뉴를 이용: File > New Project
-
우상단 프로젝트 아이콘 클릭
2단계: New Directory 혹은 Existing Directory 클릭
-
과제 폴더를 새로 생성해야 하는 경우 → New Directory 선택 > New Project 선택
-
이미 존재하는 폴더에 프로젝트를 생성하는 경우 → Existing Directory 선택
3단계: 프로젝트 파일 생성 경로 지정
-
New Directory를 선택한 경우: 프로젝트 폴더명과 폴더 생성 위치 지정
-
Existing DIrectory를 선택한 경우: 프로젝트 폴더로 사용할 폴더 선택
Output 창의 Files
탭을 누르면, 다양한 기본 파일들이 해당 폴더에 생성되었음을 확인할 수 있다. 가장 중요한 .Rproj
확장자를 가진 파일이다. 나중에 R 외부에서 이 파일을 더블클릭하면 RStudio 프로젝트를 열 수 있다. 앞으로의 실습에 활용될 코드와 데이터는 Rstudio 프로젝트 폴더를 생성하였다는 가정 하에 진행될 예정이니, 각자 RStudio 프로젝트 폴더를 만들어 코드와 데이터를 관리하길 바란다.