728x90
반응형

 파이썬은 다루기 쉽고, 다양한 기능을 가지고 있고, 공짜라는 장점을 가지고 있지만, 인터넷이 가능한 환경이 아니라면, 패키지를 바로바로 설치하기가 불가능하다는 단점이 있다.

 그리고, 때때로 당신은 보안 수준이 상당히 높아서 인터넷이 사용할 수 없는 공간에서 파이썬을 써야할 수도 있다. 그렇다면, 파이썬은 인터넷만 안된다면 사용할 수 없는 것일까? 

 가장 좋은 방법은 외부에서 미리 필요한 모든 패키지들을 다운받아서 들어가는 것이겠지만, 보안수준이 높은 기관이라면, 이것이 불가능할 가능성이 높다.

 이외의 방법은 필요한 패키지들을 파일로 다운받아서, 이를 CD 혹은 USB로 반입하는 것인데, 이번 포스트에선 해당 방법에 대해 자세히 알아보도록 하겠다.

 

 

 

패키지를 파일로 다운로드 받아보자.

1. cmd에 들어가보자.

  • cmd를 관리자로 들어가자.

 

 

2. 내가 원하는 경로로 이동해보자.

  • 파이썬 패키지들이 다운로드될 경로를 정한다.
  • c 드라이브에 packages라는 폴더에 저장하도록 하겠다.
    (c 드라이브에 packages라는 폴더를 미리 생성해놓자.)
  • dir
    : directory의 약자로 현 위치에 있는 파일 및 폴더의 목록들이 나온다.

  • cd..
    : 현 디렉토리에서 하위 디텍토리로 이동한다.

  • cd packages
    : packages라는 파일로 디렉토리를 옮긴다.

 

 

3. 이동된 경로에 내가 원하는 패키지를 다운로드 받아보자.

  • 다운로드 받을 파일의 이름은 pip_packages로 임의로 정하였다.
  • pip download -d ./pip_packages/ pandas==1.0.1
    •  pip download: 패키지를 설치하는 것이 아닌 다운로드 하는 코드이다.
    •  -d: 디렉토리를 말한다.
    •  ./pip_packages/: 패키지가 설치될 파일이다(없는 경우 자동으로 생성 됨).
    •  pandas==1.0.1: 다운로드 받고자 하는 패키지와 그 패키지의 버전이다.
      (애초에 아나콘다를 인터넷이 안되는 곳에 가져가서 깔면 대부분의 패키지가 설치되므로, 아나콘다에 없는 패키지만 다운로드 받도록 하자.)
    • 버전을 따로 쓰지 않으면 최신 버전이 설치된다.
  • 다운로드 되는 패키지는 의존성이 있는 다른 패키지까지 전부 다운로드된다.

  • 위와 같이 방금 지정하였던 폴더에 관련 패키지들이 모두 다운로드 된 것을 볼 수 있다.
  • 다운로드 되는 파일 형태는 whl, tar 확장자이다.
  • 필요한 패키지들을 모두 다운로드 받았다면, 이를 압축파일로 묶어서 USB나 CD로 옮기도록 하자.

 

 

4. 패키지를 오프라인 환경에서 설치해보자.

  • 오프라인 환경에서 해당 파일에 들어있는 패키지를 다운받는 방법은 다음과 같다.
  • pip install --no-index --find-links=./pip_packages/ pandas==1.0.1
    • pip를 이용해서 가져올때 보는 곳을 PyPI가 아닌 ./패키지들이 들어 있는 파일 이름/ 으로 한다.
    • 띄어쓰기를 주의하도록 하자.
  • 다운받았던 패키지의 이름을 그대로 입력해주면 내가 원하는 패키지를 설치할 수 있으며, 의존성 있는 패키지 역시 자동으로 설치된다.

 

 

지금까지 내가 원하는 모듈을 다운로드 받는 방법에 대해 학습해보았다.

다음 포스트에서는 현재 파이썬에서 가장 핫한 모듈이자, 빅데이터 분석 시대의 꽃인 텐서플로우(Tensorflow)의 설치 방법에 대해 학습해보도록 하겠다.
(텐서플로우 설치 방법은 다른 패키지들과 달리 조금 더 과정이 필요하다.)

728x90
반응형
728x90
반응형

 

모듈(Module)이란?

 여러분이 파이썬을 본격적으로 활용하다보면 어느 순간부터인가 모듈, 모듈화한다 등의 말을 듣게 될 것이다. 모듈은 함수(Function), 변수(Variable), 클래스(Class)를 이쁘게 잘 모아서 잘 포장해놓은 것을 말한다. 

 그리고, 이렇게 이쁘게 잘 정리해놓은 모듈에서 우린 언제든지 내가 원하는 기능을 뽑아서 사용할 수 있다. 자, 만약 당신이 R을 미리 학습하고 왔다면, R의 라이브러리(Library)가 떠오르지 않는가?

 파이썬에서는 R의 library를 모듈(Module)이라 부르고, 우리는 언제든지 내가 필요한 모듈에서 내가 필요한 기능을 가져와서 사용할 수 있다. 앞서서 파이썬의 특징에 대해 설명할 때, 파이썬은 다양한 모듈(라이브러리라고 혼용하여 사용하였음.)들이 서로서로 의존성을 가지고 있으므로, 설치가 꽤나 어렵다고 했는데, 이번엔 그 어려운 모듈 설치를 한번 해보도록 하겠다.
(환경은 이전까지 학습한 PyCharm에 아나콘다 가상환경으로 진행할 것이다.)

 

 

 

 

모듈 설치 방법은?

아나콘다, 파이참 이 2가지를 설치한 우리에겐 총 3가지의 모듈 설치방법이 있다.

1) pip로 설치하기

  • 파이참 터미널에서 설치
    • 파이참 좌측 하단을 보면 Terminal이라는 버튼이 있으며, 해당 버튼을 누르면 cmd창을 파이참에서 바로 사용할 수 있다.
    • 우측의 Event Log에서는 코드 실행 후 발생한 특이사항들을 확인할 수 있다.
    • 우측하단의 Event Log 버튼도 동일한 기능을 갖는다.

 

  • cmd 창을 바로 이용한다.
    • Anaconda를 설치하면서 생긴 Anaconda prompt 창을 사용해보자(그냥 cmd 창도 가능).
    • 만약 이전 포스트의 내용까지 잘 따라왔다면, 아마 Anaconda prompt (가상환경이름)이라는 파일도 생겼을 것이다. 해당 파일을 클릭하면, 가상환경에 대한 prompt로 들어가게 된다.

 

  • pip install 모듈이름
    : "모듈이름"을 pip로 설치한다.
  • pip uninstall 모듈이름
    : "모듈이름"을 제거한다.
  • pip list
    : 현재 환경에 설치되어 있는 파이썬 모듈의 목록을 가지고 온다.
  • pip install --upgrade pip
    : pip를 최신 버전으로 업그레이드 한다(처음 pip를 쓰기 전이라면 꼭 해주도록 하자.)
  • pip --version
    : pip 버전 확인
  • pip란?
    • pip는 파이썬으로 작성된 패키지 소프트웨어를 설치, 관리하는 패키지 관리 시스탬이다. Python Package Index(PyPI)에서 많은 파이썬 패키지를 볼 수 있다(위키피디아).
    • 그러나, pip는 앞서 다른 포스트에서 말했듯, 모듈 설치 시 충돌이 발생하면 이 부분을 무시해버리기 때문에 설치가 제대로 안될 위험이 있다.
    • 그러므로, 가능한 conda를 써보도록 하자.

 

 

2) Conda 써보기

앞서 우리는 아나콘다를 깔았고, 가상환경을 깔았으므로, 아나콘다 prompt를 이용해서 설치해보도록 하겠다.

  • 아나콘다 가상환경 프롬프트인 Anaconda prompt (가상환경이름)으로 들어가보자.

  • 그냥 Anaconda의 명령 prompt는 (Base)... 로 시작하지만, 가상환경에서는 (가상환경이름).. 으로 시작한다는 차이가 있다.
  • 파이썬은 모듈을 설치 및 관리할 때, 충돌이 일어나기 쉬우며, 충돌이 발생한 경우, 그때 그때마다 파이썬과 관련된 모든 파일을 삭제하여야할 수도 있지만, 가상환경을 사용하면, 해당 가상환경만 제거하면 된다.
  • conda install 패키지이름
    : conda로 내가 원하는 패키지를 설치할 수 있다.
  • conda란?
    • 아나콘다의 패키지 관리자로, 패키지 설치 시 현재 환경과 충돌 여부를 확인한다. 
    • 일반적으로 "conda install 패키지이름"으로 패키지를 설치해보고, 그 후에 "pip install 패키지이름"을 사용하는 것을 추천한다.

 

 

3) 파이참에서 설치해보자

파이참에서 터미널을 사용하지 않고, 파이참만의 방식으로도 설치가 가능하다.

  • File > Settings을 클릭하고 들어가보자.
  • Project: 프로젝트이름 > Project Interpreter를 눌러보면 아래와 같은 화면이 뜬다.

 

  • + 버튼을 눌러보자.

  • + 버튼을 누르면 설치돼있는 모듈은 파란색으로, 설치가 아직 안된 모듈은 하얀색으로 표시가 된다.
  • 또한 Description을 보면 간략한 상세 정보를 볼 수 있다.
  • 우측 하단 Specify version을 체크하면, 내가 원하는 버전으로 설치할 수 있다.
  • 설치하고자 하는 패키지를 클릭하고 좌측 하단의 Install package를 클릭하면, 해당 패키지가 설치된다.
  • 설치 진행 상황은 파이참의 최하단부에서 확인 가능하다.
  • 설치 가능한 모든 패키지가 검색 가능하진 않다. 특정 패키지의 경우 파이참 UI를 이용해서 설치가 불가능하므로, 그런 경우 conda나 pip를 써서 설치하도록 하자.

 

 

만약, 파이썬 모듈을 설치하다가, 설치된 패키지들끼리 충돌을 일으키거나, 잘못된 패키지 설치 등으로 인해, 문제가 생겨서 환경을 처음부터 다시 셋팅하고자 한다면, 새로운 가상환경을 만들면 된다.

다음 시간엔 오프라인으로 파이썬 패키지들을 다운받는 방법에 대해 학습해보도록 하자.

728x90
반응형
728x90
반응형

dplyr 패키지

dplyr 패키지란?

: dplyr 패키지는 데이터 전처리에서 굉~~~~장히 많이 쓰이는 패키지로, dplyr과 tidyr, reshape2, stringr 이 4가지 패키지만 다룰 수 있어도 데이터 핸들링은 거의 다 할 수 있다고 해도 과언이 아니다. 

 특히 tidyr, reshape2, stringr은 보다 원초적인 상황(데이터가 지저분하게 섞여 있거나, 텍스트 마이닝을 하는 상황)에서 주로 쓰인다면, dplyr은 공공데이터포털 등과 같은 어느정도 정제된(한 셀에 하나의 원소만 들어가 있는) 원시자료를 사용할 때, dplyr 하나만 있어도 충분하다고 할 정도로 다양한 기능을 제공한다고 할 수 있다.

 이제 dplyr 패키지가 얼마나 중요한지는 알겠는데, 데이터 전처리가 대체 무엇이길래 dplyr 패키지가 중요하다는 것일까? 이번엔 데이터 전처리에 대해서 간략하게 알아보자.

 

 

 

 

데이터 전처리(Data Preprocessing)란?

 데이터 전처리는 데이터 가공(Data Manipulation), 데이터 핸들링(Data Handling), 데이터 랭글링(Data Wrangling), 데이터 먼징(Data Munging) 등 다양한 이름으로 불리며, 원시적인 상태의 데이터를 내가 원하는 형태로 바꿔주는 모든 과정을 말한다.

 데이터 전처리는 데이터에서 내가 원하는 정보를 찾아내는 데이터 분석의 모든 과정에서 약 80% 가까운 비중을 차지할 정도로 매우 중요한 작업이며, 우리가 아는 회귀분석, 랜덤포레스트, 군집분석 등과 같은 멋들어진 이름을 가진 분석 기법들은 이 데이터 전처리 작업을 거치지 않는다면, 실시할 수 없다.

 몇 몇 데이터 분석가는 데이터 전처리를 단순하고, 귀찮고, 아까운 시간이 소모되는 과정이라고도 생각하는데, 데이터 전처리 과정에서 데이터를 세세하게 뜯어보며 내가 원하는 형태로 만들어가다보면, 데이터 자체에 대한 이해와 데이터 자체의 특성을 이용해 보다 효율적이고 논리적인 변수를 만들어낼 수 있고, 사용하고자 하는 분석 기법에 맞게 데이터를 만들어주는 과정에서 분석 기법에 대한 심층적인 이해와 같이 다양한 insight를 얻을 수도 있다.

 그만큼 데이터 전처리는 중요하고, 데이터 전처리 과정에서 코딩 실력 역시 많이 늘게 되므로, 꼭 데이터 전처리의 필수 패키지인 dplyr를 공부해보도록 하자. 

 

 

 

 

dplyr 패키지의 특징

  • R 데이터 타입의 꽃이라고 할 수 있는 데이터 프레임 처리에 특화된 패키지이다.
  • C++ 을 기반으로 만들어졌기 때문에 매우 빠르다.
  • 파이프 라인(%>%)이라는 연산자를 사용할 수 있으며, 그로인해 코드의 가독성이 매우 크게 올라간다.
    • 파이프 라인의 단축키는 Alt + Shift + m 이다.
  • R을 효과적으로 사용하려면 apply함수(다음에 자세히 다루겠다.)의 기능을 아주 쉽게 쓸 수 있다.
  • tibble이라는 데이터 프레임을 보다 편리하게 쓸 수 있는 데이터 타입을 제공한다.

자 그럼 이제 본격적으로 dplyr 패키지에 대해 공부해보도록 하자.

 

※ 예제 데이터

# 예제 데이터
name = c("쯔위", "미나", "다현", "모모", "나연", "정연", "사나", "지효", "채영")
math = c(100, 75, 90, 60, 65, 70, 80, 70, 100)
english = c(80, 80, 65, 45, 70, 80, 70, 65, 75)
Korean = c(65, 70, 70, 80, 90, 60, 60, 85, 80)

exam = data.frame(name, math, english, Korean)
exam
##   name math english Korean
## 1 쯔위  100      80     65
## 2 미나   75      80     70
## 3 다현   90      65     70
## 4 모모   60      45     80
## 5 나연   65      70     90
## 6 정연   70      80     60
## 7 사나   80      70     60
## 8 지효   70      65     85
## 9 채영  100      75     80

 

 

 

 

컬럼 이름 바꾸기

  • rename()
    : dplyr 패키지의 rename()이란 함수로, 기존의 dataframe에서 컬럼의 이름을 바꾸려면, colnames()란 함수를 이용해서 벡터로 새로운 컬럼명이 포함된 컬럼의 이름 벡터를 넣어줘야했지만, rename()함수는 내가 원하는 컬럼의 이름만 바꿀 수 있다.
  • 주요 Parameter
    rename(data, afterColumnName1 = beforeColumnName1, afterColumnName2 = beforeColumnName2)
    바꾼 후 컬럼의 이름 = 바꾸기 전 컬럼 이름으로 넣으면 된다.
  • 컬럼 이름에서 english는 Eng, Korean은 Kr로 바꿔보자.

1) 일반적인 함수 사용.

library(dplyr)
# 컬럼을 dplyr의 rename()함수로 바꿔주자.
rename(exam, Eng = english, Kr = Korean)
##   name math Eng Kr
## 1 쯔위  100  80 65
## 2 미나   75  80 70
## 3 다현   90  65 70
## 4 모모   60  45 80
## 5 나연   65  70 90
## 6 정연   70  80 60
## 7 사나   80  70 60
## 8 지효   70  65 85
## 9 채영  100  75 80

 

2) 파이프라인 사용.

# 파이프라인을 써서 컬럼의 이름을 바꿔보자.
exam = exam %>% rename(Eng = english, Kr = Korean)
##   name math Eng Kr
## 1 쯔위  100  80 65
## 2 미나   75  80 70
## 3 다현   90  65 70
## 4 모모   60  45 80
## 5 나연   65  70 90
## 6 정연   70  80 60
## 7 사나   80  70 60
## 8 지효   70  65 85
## 9 채영  100  75 80
  • 자 1)과 2)를 보면, 함수의 재료가 되는 data가 함수 안에 있느냐 밖에 있느냐란 차이가 생겼다.
  • 파이프라인은 dplyr 패키지의 특징 중 하나로, 파이프라인을 쓰면, 최소한의 변수만 지정하여, 데이터 핸들링을 할 수 있다. 그로 인해 코드의 가독성이 증가하고, 변수명을 잘못 써서 오류가 발생하는 일도 줄일 수 있다.
  • 아직은 잘 와닿지 않을테니, 좀 더 학습을 진행해보자.

 

 

 

 

새로운 컬럼 만들기

  • mutate()
    : 기존의 변수를 조합하거나 다른 함수를 적용하여 새로운 컬럼을 만들 수 있다.
  • mutate 함수의 괄호 안에 생성하고 싶은 변수 식을 넣으면 된다.
  • mutate 함수를 이용하여 변수를 n개 만드는 경우 괄호 안에서 변수식을 쉼표로 연결하면 된다.
  • R(기초) 데이터프레임에서 다루었던 "df$newColumn <- 벡터"와 유사하지만 보다 사용하기 직관적이다.
  • 파이프라인을 사용하여, 총점, 평균, 등급 컬럼을 생성해보자.
    (등급은 80점을 초과하는 경우 A등급, 70점을 초과하는 경우 B등급, 나머지는 C등급으로 한다.)
# 총점, 평균, 등급 변수를 생성해보자.
library(dplyr)
exam = exam %>% mutate(total = math + Eng + Kr,
                mean = total/3,
                grade = ifelse(mean > 80, "A", ifelse(mean > 70, "B", "C")))
  • 생성된 결과를 원 데이터 변수의 이름에 담거나 다른 변수의 이름에 담아야만 생성된 결과가 반영된다.
##   name math Eng Kr total     mean grade
## 1 쯔위  100  80 65   245 81.66667     A
## 2 미나   75  80 70   225 75.00000     B
## 3 다현   90  65 70   225 75.00000     B
## 4 모모   60  45 80   185 61.66667     C
## 5 나연   65  70 90   225 75.00000     B
## 6 정연   70  80 60   210 70.00000     C
## 7 사나   80  70 60   210 70.00000     C
## 8 지효   70  65 85   220 73.33333     B
## 9 채영  100  75 80   255 85.00000     A
  • ifelse는 조건문으로, 컬럼을 새로운 컬럼으로 만들어낼 때, 조건을 부여한다.
  • ifelse 함수 사용법
    • ifelse(변수이름 논리연산자, TRUE인 경우 값, FALSE인 경우 값)
    • FALSE인 경우 값에 또 ifelse를 추가할 수 있다.
    • ex1) ifelse(math > 80, "A", "B")
      math가 80 초과일 때 A, 그렇지 않을 때 B로 한다.
    • ex2) ifelse(math > 80, ifelse(math > 70, "B", "C")
      math가 80 초과일 때 A, 그렇지 않은 경우 70 초과일 때 B, 나머지는 C로 한다.
  • ifelse의 값에서 일부 값은 원래 값으로 할 수도 있다. 
    • 점수가 75점 미만인 사람은 "바뀐값"으로, 나머지는 본인의 점수인 NewCol을 만들어보자.
exam %>% mutate(NewCol = ifelse(mean >= 75, mean, "바뀐값"))
##   name math Eng Kr total     mean grade      NewCol
## 1 쯔위  100  80 65   245 81.66667     A    81.66667
## 2 미나   75  80 70   225 75.00000     B          75
## 3 다현   90  65 70   225 75.00000     B          75
## 4 모모   60  45 80   185 61.66667     C      바뀐값
## 5 나연   65  70 90   225 75.00000     B          75
## 6 정연   70  80 60   210 70.00000     C      바뀐값
## 7 사나   80  70 60   210 70.00000     C      바뀐값
## 8 지효   70  65 85   220 73.33333     B      바뀐값
## 9 채영  100  75 80   255 85.00000     A          85
  • 위에 사용한 함수를 보면, 본래의 컬럼 이름인 mean을 그대로 넣은 영역인 본래의 값이 나왔다.

 

 

 

 

필요한 행(Row)만 추출하기

  • filter()
    : 조건을 걸어 사용자가 원하는 행만 출력할 수 있다.
  • 연산자와 데이터 타입에서 공부한 논리연산자를 활용해보자.
# exam에서 grade가 A인 학생들만 추출해보자.
exam %>% filter(grade == "A")
##   name math Eng Kr total     mean grade
## 1 쯔위  100  80 65   245 81.66667     A
## 2 채영  100  75 80   255 85.00000     A
# exam에서 math가 70점보다 높은 학생들을 출력해보자.
exam %>% filter(math >= 70)
##   name math Eng Kr total     mean grade
## 1 쯔위  100  80 65   245 81.66667     A
## 2 미나   75  80 70   225 75.00000     B
## 3 다현   90  65 70   225 75.00000     B
## 4 정연   70  80 60   210 70.00000     C
## 5 사나   80  70 60   210 70.00000     C
## 6 지효   70  65 85   220 73.33333     B
## 7 채영  100  75 80   255 85.00000     A
# exam에서 math가 70점 이상이면서 Eng가 80점 이상인 학생들을 출력해보자.
exam %>% filter(math >= 70 & Eng >= 80)
##   name math Eng Kr total     mean grade
## 1 쯔위  100  80 65   245 81.66667     A
## 2 미나   75  80 70   225 75.00000     B
## 3 정연   70  80 60   210 70.00000     C
# exam에서 math가 90점 이상이거나 Eng가 80점 이상인 학생들을 출력해보자.
exam %>% filter(math >= 90 | Eng >= 80)
##   name math Eng Kr total     mean grade
## 1 쯔위  100  80 65   245 81.66667     A
## 2 미나   75  80 70   225 75.00000     B
## 3 다현   90  65 70   225 75.00000     B
## 4 정연   70  80 60   210 70.00000     C
## 5 채영  100  75 80   255 85.00000     A
# exam에서 grade가 B가 아닌 학생들만 출력해보자.
exam %>% filter(grade != "B")
##   name math Eng Kr total     mean grade
## 1 쯔위  100  80 65   245 81.66667     A
## 2 모모   60  45 80   185 61.66667     C
## 3 정연   70  80 60   210 70.00000     C
## 4 사나   80  70 60   210 70.00000     C
## 5 채영  100  75 80   255 85.00000     A
# exam에서 math가 70점 이상이면서 Eng가 70점 이상이고 Kr가 70점 이상인 학생들만 출력해보자.
exam %>% filter(math >= 70 & Eng >= 70 & Kr >= 70)
##   name math Eng Kr total mean grade
## 1 미나   75  80 70   225   75     B
## 2 채영  100  75 80   255   85     A

 

 

 

 

 

필요한 컬럼(Column)만 추출하기

  • select()
    : 원하는 열만 추출할 수 있다.
  • "R(기초) 데이터프레임"에서 학습한 Indexing 방법과 동일한 기능과 비슷한 사용방법을 가지고 있으며, 사용하지 않아도 큰 불편은 없으나, 파이프라인을 사용하여 dplyr의 다른 함수들과 조합한다면, 상당히 편리한 함수라고 할 수 있다.
# exam에서 math, Eng 컬럼만 가지고 온다.
exam %>% select(math, Eng)
##   math Eng
## 1  100  80
## 2   75  80
## 3   90  65
## 4   60  45
## 5   65  70
## 6   70  80
## 7   80  70
## 8   70  65
## 9  100  75
# exam에서 -math 컬럼을 제외하고 가지고 온다.
exam %>% select(-math)
##   name Eng Kr total     mean grade
## 1 쯔위  80 65   245 81.66667     A
## 2 미나  80 70   225 75.00000     B
## 3 다현  65 70   225 75.00000     B
## 4 모모  45 80   185 61.66667     C
## 5 나연  70 90   225 75.00000     B
## 6 정연  80 60   210 70.00000     C
## 7 사나  70 60   210 70.00000     C
## 8 지효  65 85   220 73.33333     B
## 9 채영  75 80   255 85.00000     A
# exam에서 math부터 Kr까지 가지고 온다.
exam %>% select(math : Kr)
##   math Eng Kr
## 1  100  80 65
## 2   75  80 70
## 3   90  65 70
## 4   60  45 80
## 5   65  70 90
## 6   70  80 60
## 7   80  70 60
## 8   70  65 85
## 9  100  75 80

 

 

 

 

 

순서대로 정렬하기.

  • arrange()
    : 특정 컬럼을 원하는 순서로 정렬할 수 있다.
    arrage(컬럼이름)
  • 오름차순은 Default 값으로 돼 있다.
  • 내림차순을 원하는 경우 arrage(desc(컬럼이름))을 하면 된다.
  • 여러 변수를 기준으로 정렬을 하고 싶은 경우 arrage()함수 안에 컬럼의 이름을 여러 개 넣으면 된다.
# exam에서 math를 오름차순 정렬해보자.
exam %>% arrange(math)
##   name math Eng Kr total     mean grade
## 1 모모   60  45 80   185 61.66667     C
## 2 나연   65  70 90   225 75.00000     B
## 3 정연   70  80 60   210 70.00000     C
## 4 지효   70  65 85   220 73.33333     B
## 5 미나   75  80 70   225 75.00000     B
## 6 사나   80  70 60   210 70.00000     C
## 7 다현   90  65 70   225 75.00000     B
## 8 쯔위  100  80 65   245 81.66667     A
## 9 채영  100  75 80   255 85.00000     A
# exam에서 Eng를 내림차순 정렬해보자.
exam %>% arrange(desc(math))
##   name math Eng Kr total     mean grade
## 1 쯔위  100  80 65   245 81.66667     A
## 2 채영  100  75 80   255 85.00000     A
## 3 다현   90  65 70   225 75.00000     B
## 4 사나   80  70 60   210 70.00000     C
## 5 미나   75  80 70   225 75.00000     B
## 6 정연   70  80 60   210 70.00000     C
## 7 지효   70  65 85   220 73.33333     B
## 8 나연   65  70 90   225 75.00000     B
## 9 모모   60  45 80   185 61.66667     C
# exam에서 math, Eng 순으로 오름차순 정렬해보자.
exam %>% arrange(math, Eng)
##   name math Eng Kr total     mean grade
## 1 모모   60  45 80   185 61.66667     C
## 2 나연   65  70 90   225 75.00000     B
## 3 지효   70  65 85   220 73.33333     B
## 4 정연   70  80 60   210 70.00000     C
## 5 미나   75  80 70   225 75.00000     B
## 6 사나   80  70 60   210 70.00000     C
## 7 다현   90  65 70   225 75.00000     B
## 8 채영  100  75 80   255 85.00000     A
## 9 쯔위  100  80 65   245 81.66667     A
# exam에서 math는 오름차순, Eng는 내림차순 순서로 정렬해보자.
exam %>% arrange(math, desc(Eng))
##   name math Eng Kr total     mean grade
## 1 모모   60  45 80   185 61.66667     C
## 2 나연   65  70 90   225 75.00000     B
## 3 정연   70  80 60   210 70.00000     C
## 4 지효   70  65 85   220 73.33333     B
## 5 미나   75  80 70   225 75.00000     B
## 6 사나   80  70 60   210 70.00000     C
## 7 다현   90  65 70   225 75.00000     B
## 8 쯔위  100  80 65   245 81.66667     A
## 9 채영  100  75 80   255 85.00000     A

 

 

 

 

 

컬럼별 요약하기와 집단별로 요약하기

  • group_by()
    : 한 컬럼 안에 있는 집단별로 그룹을 묶는다.
  • group_by() 안에 컬럼의 이름이 n개가 들어가면, 그룹을 여러 컬럼에 대해서 나눌 수 있다.
  • summarise()
    : 총합, 평균과 같은 요약 통계량을 추출한다.
  • summarise() 함수는 데이터 안에 결측값이 하나라도 있는 경우 결과를 결측값으로 출력한다.
    na.rm = TRUE를 내가 구하려는 요약통계량 함수 안에 넣는 경우, 결측값을 제외하고 결과를 출력한다.
  • 집단별 요약은 위 2개 함수를 동시에 사용하여 실행한다.
  • 위에서 mutate로 만든 평균이나 총합은 특정 변수들을 어떠한 계산식을 통해 만들어낸 새로운 변수라면
  • summurise()는 한 변수에 대한 요약 통계량이라고 할 수 있다.
# exam에서 math의 평균을 구해보자.
exam %>% summarise(mean_math = mean(math))
##   mean_math
## 1  78.88889
# exam에서 grade별 Eng의 총점과 평균 점수, 빈도를 구해보자.
exam %>% group_by(grade) %>% summarise(mean_Eng = mean(Eng),
                                       total_Eng = sum(Eng),
                                       n())
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 4
##   grade mean_Eng total_Eng `n()`
##   <chr>    <dbl>     <dbl> <int>
## 1 A         77.5       155     2
## 2 B         70         280     4
## 3 C         65         195     3
  • 위 결과가 dplyr에서 사용되는 데이터프레임과 비슷한 데이터 타입인 tibble이다.
  • tibble은 차원, 변수별 변수 타입을 보여주는 형태라고 할 수 있다.

※ summarise() 함수에서 자주 사용하는 요약통계량 함수.

함수 의미 함수 의미
mean() 평균 min() 최솟값
sd() 표준편차 max() 최댓값
sum() 합계 n() 빈도
median() 중앙값    

 

 

 

 

※ dplyr의 내장 데이터인 starwars를 이용해서 원하는 결과를 만들어보자.

library(dplyr)
# dplyr 패키지의 starwars 데이터의 변수 목록을 가지고 와보자
colnames(starwars)
##  [1] "name"       "height"     "mass"       "hair_color" "skin_color"
##  [6] "eye_color"  "birth_year" "sex"        "gender"     "homeworld" 
## [11] "species"    "films"      "vehicles"   "starships"
  • starwars 데이터의 변수 목록을 보고 무엇을 사용할 것인지 판단해보자.
    변수내 원소의 종류가 비교적 적을 것으로 판단되는 gender와 species에 대해 분석을 진행해보자.
# starwars 데이터에서 gender, species에 대한 빈도표를 뽑아보자.
table(starwars$gender)
##  feminine masculine 
##        17        66
  • table() 함수는 벡터에 대한 빈도 분석을 하는데 사용하는 함수이다.
    (이외에도 여러 기능이 있으나, 이는 이후에 다루도록 하자.)
table(starwars$species)
## 
##         Aleena       Besalisk         Cerean       Chagrian       Clawdite 
##              1              1              1              1              1 
##          Droid            Dug           Ewok      Geonosian         Gungan 
##              6              1              1              1              3 
##          Human           Hutt       Iktotchi        Kaleesh       Kaminoan 
##             35              1              1              1              2 
##        Kel Dor       Mirialan   Mon Calamari           Muun       Nautolan 
##              1              2              1              1              1 
##      Neimodian         Pau'an       Quermian         Rodian        Skakoan 
##              1              1              1              1              1 
##      Sullustan     Tholothian        Togruta          Toong      Toydarian 
##              1              1              1              1              1 
##     Trandoshan        Twi'lek     Vulptereen        Wookiee          Xexto 
##              1              2              1              2              1 
## Yoda's species         Zabrak 
##              1              2
  • 변수 species는 Human이 35명으로 가장 많고, 나머지는 최소값 1, 최대값 6으로 그 수가 그리 많지 않다. 그러므로 Human, NonHuman 이 2가지 집합으로 이루어진 새로운 변수를 만들어보자.
# starwars 데이터에서 species 컬럼을 Human과 NonHuman 2가지로 나눈 isHuman 컬럼을 만들어보자.
starwars = starwars %>% mutate(isHuman = ifelse(species == "Human",  "Human", "NonHuman"))

# starwars 데이터에서 gender, isHuman으로 group_by하여, height에 대한 총합, 평균, 표준편차, 최대값, 최소값, 빈도를 구해보자.
starwars %>% group_by(gender, isHuman) %>% summarise(height_sum = sum(height),
                                                     height_mean = mean(height),
                                                     height_sd = sd(height),
                                                     height_min = min(height),
                                                     height_max = max(height),
                                                     n())
  • 연속형 변수 중에 결측값이 가장 적을 것으로 예측되는 height에 대해 요약 통계량을 생성해보자.
## `summarise()` regrouping output by 'gender' (override with `.groups` argument)
## # A tibble: 5 x 8
## # Groups:   gender [3]
##   gender    isHuman height_sum height_mean height_sd height_min height_max `n()`
##   <chr>     <chr>        <int>       <dbl>     <dbl>      <int>      <int> <int>
## 1 feminine  Human           NA         NA       NA           NA         NA     9
## 2 feminine  NonHum~       1353        169.      33.1         96        213     8
## 3 masculine Human           NA         NA       NA           NA         NA    26
## 4 masculine NonHum~         NA         NA       NA           NA         NA    40
## 5 <NA>      <NA>            NA         NA       NA           NA         NA     4
  • 분석 결과 대부분이 <NA>로 표시된 것을 알 수 있다.
  • <NA>는 값이 없음을 의미한다.
  • 데이터 분석을 하기 위해선 이러한 내가 원하지 않는 결과가 나온 경우 그 원인을 파악해보아야한다.
  • 위에서 말했듯이 summarise() 함수는 분석하려는 대상인 데이터 안에 결측값(<NA>)이 단 하나라도 있는 경우, 요약통계량을 <NA>로 출력한다. 이 경우 na.rm = TRUE를 각 요약 통계량 안에 삽입하여, 다시 결과를 출력해보자.
# starwars 데이터에서 species 컬럼을 Human과 NonHuman 2가지로 나눈 isHuman 컬럼을 만들어보자.
starwars = starwars %>% mutate(isHuman = ifelse(species == "Human",  "Human", "NonHuman"))

# starwars 데이터에서 gender, isHuman으로 group_by하여, height에 대한 총합, 평균, 표준편차, 빈도를 구해보자.
starwars %>% group_by(gender, isHuman) %>% summarise(height_sum = sum(height, na.rm = TRUE),
                                                     height_mean = mean(height, na.rm = TRUE),
                                                     height_sd = sd(height, na.rm = TRUE),
                                                     height_min = min(height, na.rm = TRUE),
                                                     height_max = max(height, na.rm = TRUE),
                                                     n())
## `summarise()` regrouping output by 'gender' (override with `.groups` argument)
## # A tibble: 5 x 8
## # Groups:   gender [3]
##   gender    isHuman height_sum height_mean height_sd height_min height_max `n()`
##   <chr>     <chr>        <int>       <dbl>     <dbl>      <int>      <int> <int>
## 1 feminine  Human         1282        160.      6.98        150        167     9
## 2 feminine  NonHum~       1353        169.     33.1          96        213     8
## 3 masculine Human         4194        182.      8.19        170        202    26
## 4 masculine NonHum~       6750        173.     46.9          66        264    40
## 5 <NA>      <NA>           544        181.      2.89        178        183     4
  • 도출된 결과를 보면 정상적으로 나온 것을 알 수 있다.
  • gender, isHuman에서 <NA>라고 출력된 결과가 있는 것을 볼 수 있다.
  • 해당 결과가 나온 원인을 알기 위해 gender와 isHuman에 대한 결측값 여부에 대한 빈도분석을 실시해보자.
  • is.na(백터)
    : 벡터 안에 결측값이 있는 경우, 해당 결측값을 TRUE로 결측값이 아닌 값을 FALSE로 나타낸다.
  • table(is.na(벡터))
    :위 함수를 이용하면, 해당 벡터 안에 몇 개의 결측값이 존재하는지 쉽게 알 수 있다. 
# is.na()함수를 이용해서 결측값의 갯수를 파악해보았다.
table(is.na(starwars$gender))
## FALSE  TRUE 
##    83     4
table(is.na(starwars$isHuman))
## FALSE  TRUE 
##    83     4
  • 두 함수 모두 결측값이 각각 4개 존재하는 것으로 나타났다.
  • 스칼라에서 공부한 Boolean의 성격을 이용해보면, 두 변수의 결측값이 동일한 객체(행)에 대한 것인지를 볼 수 있다.
# 두 변수의 결측값이 중복되는 것인지 확인해보자.
gender = is.na(starwars$gender)
isHuman = is.na(starwars$isHuman)
table(gender + isHuman)
##  0  2 
## 83  4
  • gender와 isHuman이라는 2개의 벡터를 is.na()를 이용해서 TRUE와 FALSE 2개의 인자로 구성된 벡터를 만들었다.
  • 두 벡터를 합치는 경우, 객체(행)에 대한 위치는 두 벡터 모두 동일하므로, 2개 벡터가 같은 객체에 대해 결측값으로 구성된 경우 2가 나올 것이며(TRUE + TRUE = 2), 2개 벡터가 서로 다른 객체에 대해 결측값이 있는 경우 1이 나올 것이다.(TRUE + FALSE = 1)
  • 결과가 0과 2로 이루어져있으며, 2의 숫자가 4개인 것을 보면, gender와 isHuman의 결측값을 가진 객체가 일치하는 것을 알 수 있다.

 

 

 

※ summarise 함수에서 na.rm = TRUE의 주의 사항

  • gender와 isHuman의 결측값이 동일한 객체(행)에 대해 존재한다는 것을 알았으므로, 이번엔 결측값이 있는 행들을 분석 대상에서 제외하고 보도록 하자.
  • 일반적으로 결측값 제거는 함부로 해서는 안되지만, 이는 사회과학에서 그 결측값의 발생이 어떠한 의도에 의해 발생했을 위험이 있기 때문이다.
  • 해당 데이터는 할리우드 영화인 Starwars에서 캐릭터들의 이름과 키, 몸무게, 머리카락색과 같은 개인정보가 담긴 데이터이다. 결측값이 발생한 대상에 대해 구체적으로 보도록 하자.
starwars[, c("name", "height", "gender", "isHuman", "species")] %>% filter(is.na(gender))
## # A tibble: 4 x 5
##   name           height gender isHuman species
##   <chr>           <int> <chr>  <chr>   <chr>  
## 1 Ric Olie          183 <NA>   <NA>    <NA>   
## 2 Quarsh Panaka     183 <NA>   <NA>    <NA>   
## 3 Sly Moore         178 <NA>   <NA>    <NA>   
## 4 Captain Phasma     NA <NA>   <NA>    <NA>
  • 보면 위 캐릭터들은 성별과 종(species)이 결측값(측정할 수 없는) 캐릭터임을 알 수 있다.
  • 이번 분석은 성별이 있으며 종이 인간/비인간인 객체를 대상으로 하고 있으므로, 이런 경우엔 위 대상들을 분석 대상에서 아예 제거하고 실시해도 된다.
  • 이번엔 결측값이 있는 행을 제거하고 진행해보자

 

1) 결측값이 행에서 아예 제거된 상태의 결과.

# 분석 대상에서 결측값이 제거된 상태에서 분석 결과
chooseColumns = starwars[,c("gender", "isHuman", "height")]
removeNA = na.omit(chooseColumns)

removeNA %>% group_by(gender, isHuman) %>% summarise(height_sum = sum(height),
                                                     height_mean = mean(height),
                                                     height_sd = sd(height),
                                                     height_min = min(height),
                                                     height_max = max(height),
                                                     n())
  • na.omit()은 결측값이 하나라도 있는 행을 제거하는 함수로, 데이터 전처리에서 필수인 결측값 제거에서 꼭 알고 있어야하는 함수이다.
    (추후 결측값에 대해 아주 상세히 다룰 예정이다.)
## `summarise()` regrouping output by 'gender' (override with `.groups` argument)
## # A tibble: 4 x 8
## # Groups:   gender [2]
##   gender    isHuman height_sum height_mean height_sd height_min height_max `n()`
##   <chr>     <chr>        <int>       <dbl>     <dbl>      <int>      <int> <int>
## 1 feminine  Human         1282        160.      6.98        150        167     8
## 2 feminine  NonHum~       1353        169.     33.1          96        213     8
## 3 masculine Human         4194        182.      8.19        170        202    23
## 4 masculine NonHum~       6750        173.     46.9          66        264    39

 

2) na.rm = TRUE를 적용한 결과.

# na.rm = TRUE의 결과.
starwars %>% group_by(gender, isHuman) %>% summarise(height_sum = sum(height, na.rm = TRUE),
                                                     height_mean = mean(height, na.rm = TRUE),
                                                     height_sd = sd(height, na.rm = TRUE),
                                                     height_min = min(height, na.rm = TRUE),
                                                     height_max = max(height, na.rm = TRUE),
                                                     n())
## `summarise()` regrouping output by 'gender' (override with `.groups` argument)
## # A tibble: 5 x 8
## # Groups:   gender [3]
##   gender    isHuman height_sum height_mean height_sd height_min height_max `n()`
##   <chr>     <chr>        <int>       <dbl>     <dbl>      <int>      <int> <int>
## 1 feminine  Human         1282        160.      6.98        150        167     9
## 2 feminine  NonHum~       1353        169.     33.1          96        213     8
## 3 masculine Human         4194        182.      8.19        170        202    26
## 4 masculine NonHum~       6750        173.     46.9          66        264    40
## 5 <NA>      <NA>           544        181.      2.89        178        183     4
  • 위, 아래 표를 비교해보면 총합, 평균, 표준편차, 최소값, 최댓값은 동일하나, n()이 서로 다르고 , 5번째 행이 위엔 없으나 아래에 있는 것을 볼 수 있다.
  • 이는 위의 na.omit()을 이용해서 결측값이 있는 행을 모두 제거한 결과는 행에 서 결측값이 있는 것을 모두 제거하였기 때문에, gender, isHuman, height 이 3가지 변수 중에 <NA>를 하나라도 가진 객체를 분석 대상에서 아예 제거해버렸기 때문에 키에 대한 n()을 제외한 모든 요약 통계량은 같게 나오지만, n()은 na.rm이라는 인자가 아예 존재하지 않기 때문에 다른 결과가 나온 것이다.
  • 즉, 간단하게 말하자면 n()는 결측값이 있던 없던 대상의 수를 세버려기 때문에 height에 결측값이 있다할지라도 수를 세어버리고, na.omit()으로 결측값이 있는 행을 모두 제거한 결과는 성별, 종족이 측정된 값이며, 키를 측정한 대상에 한정한 결과를 가져오는 것이다.
  • na.rm은 단순하게 해당 벡터에 대해서만 결측값을 제거하므로, na.rm을 적용할 수 없는 n()은 조금 조심해서 사용하도록 하자.
  • 위 문제를 명확하게 해결하기 위해선 분석 대상에 대한 명확한 정의가 필요하다.

 

 

 

 

데이터 합치기

  • left_join()
    : 두 데이터 프레임을 동일한 열을 기준으로 열로 합치는 경우 left_join()을 사용한다.
  • left_join(기준이 되는 합쳐지는 쪽, 합칠 데이터)
    • 기준이 될 ID와 같은 동일한 컬럼이 필요하다.
    • left_join()을 응용하여 특정 변수를 기준으로 새로운 변수를 추가할 수 있다.
    • 데이터는 한 번에 2개만 합치는 것이 가능하다.
    • cbind()는 열의 길이만 같다면 통으로 합치지만, left_join()은 기준 변수를 제외한 변수들이 기준 변수의 위치에 맞춰서 합춰진다.
    • 즉, left_join()에서 기준으로 사용할 열에 일치하는 값만 존재한다면(전부 존재 하지 않아도 된다.) 두 데이터 프레임의 길이가 서로 다르더라도 붙일 수 있다.
    • 기준이 되는 합쳐지는 쪽과 합칠 데이터에 대하여, 기준 컬럼의 인자가 동일한 집합이 아닌 경우에도 합쳐지며,기준이 되는 합쳐지는 쪽의 기준 컬럼에 없는 인자들은 모두 NA로 합쳐진다.
  • bind_rows()
    : 두 데이터 프레임의 열 이름이 동일한 경우 행을 위주로 합치는 경우, bind_rows()를 사용한다.
    • 세로로 합치는 경우, 합치는 두 데이터의 변수명이 일치해야한다.
    • 동일하지 않다면 rename()을 하거나, 일치하지 않는 변수를 제거해주자.
    • 합칠 두 데이터 프레임의 컬럼별 변수 타입이 동일해야한다.
      • 특히 character와 factor는 단순하게 눈으로 비교해서는 같게 보이므로, 꼭 주의하도록 하자.
# 한 열이 동일한 2개의 데이터 프레임을 한 열을 기준으로 합쳐보자.
mid_examResult = data.frame(name = c("민철", "재성", "현승", "기훈", "윤기"), midterm = c(60, 80, 90, 70, 85))
final_examResult = data.frame(name = c("민철", "재성", "현승", "기훈", "윤기"), finalterm = c(80, 75, 88, 65, 90))

left_join(mid_examResult, final_examResult)
## Joining, by = "name"
##   name midterm finalterm
## 1 민철      60        80
## 2 재성      80        75
## 3 현승      90        88
## 4 기훈      70        65
## 5 윤기      85        90
# 열의 이름이 동일한 2개의 데이터 프레임을 행끼리 세로로 합쳐보자.
class1 = data.frame(class = 1, name = c("민철", "재성", "현승", "기훈", "윤기"), mean = c(75, 80, 65, 90, 80))
class2  = data.frame(class = 2, name = c("태경", "시라", "재빈", "미선", "선화"), mean = c(70, 85, 80, 75, 90))

bind_rows(class1, class2)
##    class name mean
## 1      1 민철   75
## 2      1 재성   80
## 3      1 현승   65
## 4      1 기훈   90
## 5      1 윤기   80
## 6      2 태경   70
## 7      2 시라   85
## 8      2 재빈   80
## 9      2 미선   75
## 10     2 선화   90

 

 

 

지금까지 dplyr에 대해서 간략한 학습을 해보았다. 

이번 포스트에서 공부한 rename, mutate, filter, select, arrange, group_by, summarise, left_join, bind_rows는 개인적으로 dplyr 패키지에서 이것만 알아도 충분하다 싶어서 뽑은 함수들이며, 추후 dplyr에 대해 더 학습을 하다가, 괜찮은 함수가 있다면, 그 함수들도 추가해보도록 하겠다.

728x90
반응형
728x90
반응형

패키지(Packages)란

오픈 소스인 R의 장점은 다른 사용자들이 만들어놓은 함수들을 쓸 수 있다는 것이다. 이 함수들의 모음을 패키지(Package)라고 하며, R을 이용하는 사람은 인터넷이 된다면, 언제, 어디서든지 이 패키지를 다운 받아서 사용할 수 있다.

  • 패키지 공유는 CLAN(http://cran.r-project.org)의 'Packages'를 눌러서 어떤 패키지가 있는지 볼 수 있으며, 인터넷을 사용할 수 없는 환경에서 R을 써야하는 경우, 해당 싸이트에서 미리 사용할 패키지들을 다운받아올 수 있다. 
  • R은 스크립트 언어(간략히 말하면, 어떤 기능을 쓰고자할 때, 그 기능을 처음부터 만들 필요 없이, 그 기능이 담긴 함수를 사용하면 되는 언어란 소리이다.)이며, 스크립트 언어로써의 기능을 잘 활용하려면, 상황에 맞게 내게 필요한 패키지를 찾는 능력이 필요하다.
  • 각 패키지는 그 사용방법을 익히는데 도움을 주기 위한 내장 데이터셋을 가지고 있다.
  • 패키지 설치 후 패키지 이름에 커서를 올린 상태에서 F1을 누르면 해당 패키지에 대한 자세한 정보를 얻을 수 있는 링크등으로 이동할 수 있다.

 

 

 

패키지 관련 함수

  • available.packages("패키지 이름")
    : 해당 패키지가 CRAN에 등재되어 있는지 확인할 수 있는 함수.
  • install.packages("패키지 이름")
    : 해당 해키지를 설치하는 방법.
    패키지는 한번 설치하면, 더 이상 설치하지 않아도 된다.
  • library(패키지 이름)
    : 패키지를 사용하기 위해 가지고 온다.
    특정 패키지를 사용하고 싶을 때, 반드시 해당 코드를 한 번은 실행해 줘야한다.
  • library(help = 패키지 이름)
    : 패키지에 대한 정보를 출력한다.
    (패키지의 라이센스, 버전, 제작자 등을 표시하고, 패키지 안에 들어 있는 함수등을 표기한다.)
  • update.packages("패키지 이름")
    : 해당 패키지를 업데이트한다.
  • updata.packages()
    : 모든 패키지를 업데이트한다.
  • remove.packages("패키지 이름")
    : 해당 패키지를 삭제한다.
  • remove.packages()
    : 모든 패키지를 삭제한다.
  • 패키지이름::패키지의함수()
    : library() 함수를 사용하지 않고, 특정 패키지의 특정 함수를 사용한다.
    • 여러 패키지를 사용하는 경우, 패키지의 이름은 다르나, 함수가 동일한 경우가 종종 있다. 이 경우, 위 방법처럼 콜론을 2개 연달아 사용하면, 해당 함수가 어떤 패키지의 것인지를 쉽게 구분할 수 있다.
  • data(package = .packages(all.available = TRUE))
    : 설치된 패키지의 모든 내장 데이터를 볼 수 있다.
# dplyr 패키지의 내장데이터를 확인해보자
data_list = data(package = .packages(all.available = TRUE))
data_list$results[data_list$results[,"Package"] == "dplyr", ]
##      Package LibPath                             Item               
## [1,] "dplyr" "C:/RBasicFolder/R/R-4.0.1/library" "band_instruments" 
## [2,] "dplyr" "C:/RBasicFolder/R/R-4.0.1/library" "band_instruments2"
## [3,] "dplyr" "C:/RBasicFolder/R/R-4.0.1/library" "band_members"     
## [4,] "dplyr" "C:/RBasicFolder/R/R-4.0.1/library" "starwars"         
## [5,] "dplyr" "C:/RBasicFolder/R/R-4.0.1/library" "storms"           
##      Title                
## [1,] "Band membership"    
## [2,] "Band membership"    
## [3,] "Band membership"    
## [4,] "Starwars characters"
## [5,] "Storm tracks data"
  • 위 코드는 dplyr 패키지의 내장 데이터 목록을 행렬 형태로 가지고 온 것이다.
  • Item은 내장 데이터의 이름이다.
  • 위에서 "dplyr"만 다른 패키지의 이름으로 바꿔주면, 해당 패키지의 내장 데이터셋 목록을 가지고 올 수 있다.

 

 

 

수동으로 패키지 사용하기

  • R을 효율적으로 사용할 수 있게 해주는 RStudio에는, 설치된 패키지, library로 import된 패키지, 패키지 업데이트 등을 쉽게 할 수 있는 창을 따로 제공하고 있다.

  • 우측 하단의 Packages 버튼을 누르면, 현재 R에 어떤 패키지들이 설치 되어있고, 그 버전은 어떠한지를 구체적으로 볼 수 있다.
  • 특정 패키지의 체크박스를 선택하고, Packages 바로 아래에 있는 Update 버튼을 누르면, 해당 패키지를 업데이트 할 수 있다.
  • 패키지의 이름을 클릭하면 Help창으로 자동 이동되고, 해당 패키지에 어떤 함수가 있는지와 간략한 설명을 볼 수 있다. 또한 내가 궁금한 함수를 클릭하면, 보다 자세한 설명을 볼 수 있다.

 

 

 

패키지와 오류

1) 패키지의 의존성 문제

  • 대부분의 패키지는 설치할 때, 큰 어려움이 없으나, 가끔 아주 강력한 패키지를 설치할 때, 오류가 걸리는 일이 종종 발생할 수 있다.
  • 이는, 환경의 문제로 해당 패키지를 개발할 때, 들어간 소프트웨어가 해당 패키지를 설치하고자 하는 사람의 컴퓨터에 깔려 있지 않아서 발생하는 문제이다.
    (물론 전부 이 경우라고는 할 수 없지만, 대부분 이렇다!)
  • 이 경우에는 설치하고자 하는 패키지의 정보를 확인하고, 이 패키지에 필요한 소프트웨어를 설치해주면 된다.
  • R > CRAN > Korea(하단 아무 거나 클릭) > Packages > Table of available packages, sorted by name(이름 순 정렬) > ctrl + F로 문제 있는 패키지 검색 후 클릭 > SystemRequirements 옆에 있는 내용 확인
  • SystemRequirements 에 있는 소프트웨어가 설치되어야만 해당 패키지를 정상적으로 사용할 수 있다.
  • 추가로 에러 문구를 자세히 읽어보고, 구글링을 생활화하자!
    • 위에서 말한 소프트웨어 설치가 또 쉽지만은 않다. 그러므로, 해당 패키지 설치 방법을 구글에서 검색해보는 것이 베스트다.(이 고통을 나 혼자 겪은 것이 아니므로!)
    • R에서 당신이 겪은 대부분의 문제는 다른 사람도 겪었고, 개발자와의 소통 등을 통해서 대부분 해결된 문제이므로, 구글링을 하거나 Stack Overflow를 이용해서 해당 문제를 찾도록 해보자.

 

 

2) 패키지 업데이트의 문제

  • 일반적으로 우리가 생각할 땐, 업데이트가 된 최신 버전이 가장 좋은 것이라고 생각하기가 쉬운데, 그 말이 R과 같은 오픈소스에서도 똑같이 통용되는 말은 아니다.
  • 업데이트가 되면서 기존에 사용했던 함수에 새로운 파라미터가 주어졌을 수도 있고, 약간 기능이 바뀌었거나, 기존에 쓰고 있던 기능이 사라졌을 수도 있다!
    (물론 제작자가 상식적인 수준에서 변화를 주긴 했겠지만!)
  • 당장 코드를 짤 땐, 큰 지장이 없을 수 있지만, 이미 길게 짜놓은 코드가 에러를 일으킬 가능성이 있으므로, 업데이트가 반드시 만능은 아니라고 생각하면 된다.
  • 특히나, 지금까지 잘 사용했던 패키지가 돌연 업데이트를 멈추게 되는경우, R을 업데이트 했으나, R 패키지는 업데이트 되지 않아 서로 호환되지 않는 문제가 발생할 수도 있다.

 

 

3) 리눅스에서 R 패키지를 다운받는 경우 발생할 수 있는 문제.

  • 리눅스에서 R을 사용하다보면 다음과 같은 문제가 종종 발생할 수 있다.

  • ANTICONF ERROR Configuration failed because libmysqlclient was not found.......
  • 위 오류에서 libmysqlclient 특히 "mysql" 이 부분은 설치하고자 하는 패키지 이름에 따라 바뀔 수 있다.
  • 해당 오류는 말 그대로 내가 설치하고자 하는 패키지를 찾지 못한 문제인데, 해결 방법은 매우 단순하다.
  • 리눅스 터미널에서 내가 사용하고 있는 리눅스 버전에 맞는 방법으로 설치하면 된다.
  • 예를 들어, 내가 CentOS를 사용하고 있다면, CentOS용인 rpm을 이용하여 설치하면 된다.
  • 구체적인 해결 방법은 다음과 같다.
  • 리눅스 터미널 > yum install mysql-devel 입력 및 설치 > RStudio에서 패키지 설치 재실시

 

 

지금까지 R의 패키지에 대해 학습해보았다. 패키지는 설치에서 간간히 문제가 발생할 수는 있지만, 그 방법이 생각보다 단순하고, 패키지 관련 함수들도 install.packages()나 library() 같은 일부 함수를 제외하곤 거의 쓰이지 않기 때문에, 몇 번 쓰다보면 금새 익숙해질 것이다.

물론 몇몇 패키지를 설치하다가 오류가 나면 엄청 스트레스를 받긴 하겠지만, 그러한 문제 하나하나를 해결해나가다 보면, 어느새 실력이 부쩍 올라간 나 자신을 볼 수 있을 것이다.

이번 포스트는 여기서 마치도록 하겠다. 다음 포스트에선 R을 사용하는 데이터 분석가라면 거의 필수적으로 공부해야하는 패키지인 dplyr에 대해 공부해보도록 하자.

728x90
반응형

+ Recent posts