데이터 과학에 필요한 프로그래밍 언어로 R과 파이썬이 경쟁을 한동안 했다면 이제 그 세월도 흘러 데이터 과학을 R과 파이썬을 적절히 잘 활용하는 시점으로 변경이 되었다. 데이터 과학에 필수적으로 요구되는 몇가지 구성요소로 다음이 있다. 프로그래밍 언어, 통합개발환경(코드 편집기), 버전 제어 및 형상관리, 공유와 협업이 대표적으로 요구되는 사항이다.
RStudio 통합개발환경 즉, 코드 편집기에서 파이썬을 연결하기 위해서는 Miniconda를 설치하여 파이썬과 파이썬 팩키지 관리자(conda)를 함께 설치한다. Git and Bash도 설치하여 윈도우에서 리눅스 터미널을 사용할 수 있도록 CLI 환경을 일치시킨다.
RStudio와 R을 윈도우에 설치하는 것은 R을 설치하게 되면 RStudio에서 자동으로 인식해 RStudio와 R 설치는 CRAN R 최신 버전을 다운로드 받아 설치한다.
~/.bash_profile 파일을 편비하여 R이 설치된 경로를 지정하여 Git Bash 터미널에서 R을 실행할 수 있도록 한다.
# 경로에 R과 Rscript 추가
export PATH="/c/Program Files/R/R-4.0.2/bin/x64":$PATH~/.bash_profile 작업을 통해서 Git Bash 터미널에서 R 경로명을 등록시켜 R을 Git Bash와 연결시키는 작업을 완수했다.
RStudio 터미널과 Git Bash 터미널을 연결시켜 두면 추후 생길 수 있는 터미널 혼선을 막을 수 있다. 이를 위해서 Tools → Global Options → Terminal에서 Shell을 Git Bash로 설정한다.
CustomC:/Program Files/Git/bin/bash.exe-l상기 작업 실행결과 RStudio 터미널이 Git Bash 터미널로 일원화 되었다.
미니콘다 Miniconda를 설치했기 때문에 파이썬과 팩키지 관리자(conda)가 동시에 설치가 되었다. 파이썬과 R을 연결해주는 팩키지가 reticulate로 install.packages("png")와 install.packages("reticulate") 명령어로 설치를 하게 되면 기본준비는 되었다. 이제 usethis::edit_r_profile 명령어를 R 콘솔에서 쳐서 .Rprofile 파일에 Sys.setenv(RETICULATE_PYTHON = "C:\\Users\\사용자명\\miniconda3\\python.exe")을 설정하여 파이썬을 돌릴 수 있도록 준비를 한다. 참고로 .Rprofile 파일은 ~/Documents/.Rprofile에 위치한다.
python 코드 덩어리를 만들어 헬로월드를 찍어 R마크다운 문서에 파이썬을 실행할 수 있음을 확인한다.
print("Hello World! 2+3 = ", 2+3)Hello World! 2+3 = 5
아나콘다가 아닌 miniconda를 기본 파이썬 엔진으로 사용할 경우 아나콘다에 포함된 팩키지들이 빠져있어 별도 설치를 해야 한다. pandas, matplotlib이 대표적인다.
파이썬 팩키지 관리자로 conda를 사용하는 경우 conda install 팩키지명을 사용하여 원하는 파이썬 팩키지를 설치할 수 있다. matplotlib의 경우 QT 의존성이 있어 pyqt5도 함께 설치한다.
conda install pandas conda install pyqt5 conda install matplotlib
QT를 설치한 후에 환경변수로 등록하는 작업이 함께 수반되어야 한다. 간단히 다음 코드를 사용해서 matplotlib 그래프를 그릴 때 사용하는 QT 라이브러리를 환경변수에서 참고하여 시각화시키는데 도움을 준다.
library(reticulate)
py_run_string("import os as os")
py_run_string("os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:/Users/사용자명/miniconda3/Library/plugins/platforms'")RStudio IDE 를 가지고 윈도우 10 환경에서 R과 파이썬을 데이터 과학 주 언어로 사용하는 사례를 살펴보자.
tidyverse에 대응되는 대표적인 데이터 과학 팩키지가 pandas다. import 명령어로 가져온다.
파이썬
import pandas as pdR/Tidyverse
library(tidyverse)판다스 pd.read_csv() 메쏘드가 파일 데이터를 메모리로 불러읽어 데이터 과학 작업을 수행할 수 있도록 준비한다. tidyverse에는 read_csv() 명령어가 이에 상응한다.
파이썬
titanic = pd.read_csv("data/titanic.csv")R/Tidyverse
titanic_tbl <- read_csv("data/titanic.csv")파이썬은 matplotlib 라이브러리를 통해 판다스 데이터프레임을 시각화한다. R은 ggplot으로 그래프 문법에 맞춰 시각화를 한다.
파이썬
titanic.plot.scatter(x='age', y='fare', alpha=0.3)R/Tidyverse
titanic_tbl %>%
ggplot(aes(x = age, y = fare)) +
geom_point(alpha = 0.3)판다스 데이터프레임이나 R 티블(tibble) 데이터프레임은 직사각형 테이블 데이터이기 때문에 SQL 쿼리문에 대응되는 문법에 맞춰 데이터를 조작할 수 있다. 사례로 칼럼을 선택하는 경우를 비교해보자.
파이썬
titanic[["age", "fare"]] age fare
0 29.0000 211.3375
1 0.9167 151.5500
2 2.0000 151.5500
3 30.0000 151.5500
4 25.0000 151.5500
... ... ...
1304 14.5000 14.4542
1305 NaN 14.4542
1306 26.5000 7.2250
1307 27.0000 7.2250
1308 29.0000 7.8750
[1309 rows x 2 columns]
R/Tidyverse
titanic_tbl %>%
select(age, fare)# A tibble: 1,309 x 2
age fare
<dbl> <dbl>
1 29 211.
2 0.917 152.
3 2 152.
4 30 152.
5 25 152.
6 48 26.6
7 63 78.0
8 39 0
9 53 51.5
10 71 49.5
# ... with 1,299 more rows
칼럼이 아니고 행을 필터(filtering)를 걸어 추출하는 사례를 살펴보자. 예를 들어 나이가 70 이상인 타이나틱호 승선인을 추출해보자.
파이썬
titanic[titanic["age"] > 70] pclass survived ... body home.dest
9 1 0 ... 22.0 Montevideo, Uruguay
14 1 1 ... NaN Hessle, Yorks
61 1 1 ... NaN Little Onn Hall, Staffs
135 1 0 ... NaN New York, NY
727 3 0 ... 171.0 NaN
1235 3 0 ... NaN NaN
[6 rows x 14 columns]
R/Tidyverse
titanic_tbl %>%
filter(age > 70)# A tibble: 6 x 14
pclass survived name sex age sibsp parch ticket fare cabin embarked
<dbl> <dbl> <chr> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <chr> <chr>
1 1 0 Arta~ male 71 0 0 PC 17~ 49.5 <NA> C
2 1 1 Bark~ male 80 0 0 27042 30 A23 S
3 1 1 Cave~ fema~ 76 1 0 19877 78.8 C46 S
4 1 0 Gold~ male 71 0 0 PC 17~ 34.7 A5 C
5 3 0 Conn~ male 70.5 0 0 370369 7.75 <NA> Q
6 3 0 Sven~ male 74 0 0 347060 7.78 <NA> S
# ... with 3 more variables: boat <chr>, body <dbl>, home.dest <chr>
마지막으로 titanic은 파이썬 객체로 이를 py$ 방식으로 R에서 인식하기 때문에 시각화 함수로 ggplot을 사용하게 되면 파이썬의 장점과 R의 장점을 함께 사용할 수 있다.
py$titanic %>%
ggplot(aes(x = age, y = fare)) +
geom_point(alpha = 0.5) +
labs(x = "탑승객 나이",
y = "탑승객 지불요금",
title = "타이타닉 탑승객 나이와 요금에 대한 산점도") +
theme_light(base_family = "NanumGothic")데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com