R로 데이터를 파악하는 방법은 무수히 많습니다. 처음엔 한 게시물에 데이터 요약과 NA값, 변수별 상관성 등등 모든 파악방법을 다 다루려고 했는데 생각보다 내용이 방대할 듯 하여 여러 글로 나누어 정리해보려 합니다. 😊
오늘은 아래의 세 가지를 기준으로 작성하였습니다.
🍏 전체 데이터 보기
🍏 데이터 일부 보기
🍏 기술통계량
예제 데이터는 지난 boxplot 그리는 방법에서도 사용했던 ggplot2의 diamonds를 활용하였습니다.
1) 전체 데이터 보기
View 함수를 통해 아래 이미지와 같이 테이블을 새 창으로 불러올 수 있습니다.
R은 대소문자를 구분하므로 V를 대문자로 표기해야 하는 점 유의해 주세요.
View(diamonds) # View(데이터 명)
어느 세월에 전체 테이터를 새 창으로 불러와 다 살펴 보나요..? 특히 데이터가 엄청나게 클 경우 View함수를 막 써버리면 파일을 불러오는데 시간만 오래 걸릴 수도 있습니다. 지금부터는 출력창에 데이터의 일부 혹은 요약을 확인하는 법에 대해 알아봅시다.👁👁
2) 데이터 일부 보기
# 위에서부터 행 출력 : head(데이터 명, n = 출력하고 싶은 데이터 내 행의 수
> head(diamonds, n = 10)
# A tibble: 10 x 11
carat cut color clarity depth table price x y z carat_group
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 0이상~2미만
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 0이상~2미만
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 0이상~2미만
4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63 0이상~2미만
5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 0이상~2미만
6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 0이상~2미만
7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 0이상~2미만
8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 0이상~2미만
9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 0이상~2미만
10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 0이상~2미만
# 밑에서부터 행 출력 : tail(데이터 명, n = 출력하고 싶은 데이터 내 행의 수
> tail(diamonds, n = 10)
# A tibble: 10 x 11
carat cut color clarity depth table price x y z carat_group
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <fct>
1 0.71 Premium E SI1 60.5 55 2756 5.79 5.74 3.49 0이상~2미만
2 0.71 Premium F SI1 59.8 62 2756 5.74 5.73 3.43 0이상~2미만
3 0.7 Very Good E VS2 60.5 59 2757 5.71 5.76 3.47 0이상~2미만
4 0.7 Very Good E VS2 61.2 59 2757 5.69 5.72 3.49 0이상~2미만
5 0.72 Premium D SI1 62.7 59 2757 5.69 5.73 3.58 0이상~2미만
6 0.72 Ideal D SI1 60.8 57 2757 5.75 5.76 3.5 0이상~2미만
7 0.72 Good D SI1 63.1 55 2757 5.69 5.75 3.61 0이상~2미만
8 0.7 Very Good D SI1 62.8 60 2757 5.66 5.68 3.56 0이상~2미만
9 0.86 Premium H SI2 61 58 2757 6.15 6.12 3.74 0이상~2미만
10 0.75 Ideal D SI2 62.2 55 2757 5.83 5.87 3.64 0이상~2미만
# 기본 함수 : str(데이터 명)
> str(diamonds)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 53940 obs. of 11 variables:
$ carat : num 0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
$ cut : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
$ color : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
$ clarity : Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
$ depth : num 61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
$ table : num 55 61 65 58 58 57 57 55 61 61 ...
$ price : int 326 326 327 334 335 336 336 337 337 338 ...
$ x : num 3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
$ y : num 3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
$ z : num 2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
$ carat_group: Factor w/ 3 levels "0이상~2미만",..: 1 1 1 1 1 1 1 1 1 1 ...
# dplyr은 tidyverse 로드 시 함께 불러와집니다.
# dplyr 패키지 함수 : str(데이터 명)
library(tidyverse)
> dplyr::glimpse(diamonds)
Observations: 53,940
Variables: 10
$ carat <dbl> 0.23, 0.21, 0.23, 0.29, 0.31, 0.24, 0.24, 0.26, 0.22, 0.23, 0.30, 0…
$ cut <ord> Ideal, Premium, Good, Premium, Good, Very Good, Very Good, Very Goo…
$ color <ord> E, E, E, I, J, J, I, H, E, H, J, J, F, J, E, E, I, J, J, J, I, E, H…
$ clarity <ord> SI2, SI1, VS1, VS2, SI2, VVS2, VVS1, SI1, VS2, VS1, SI1, VS1, SI1, …
$ depth <dbl> 61.5, 59.8, 56.9, 62.4, 63.3, 62.8, 62.3, 61.9, 65.1, 59.4, 64.0, 6…
$ table <dbl> 55, 61, 65, 58, 58, 57, 57, 55, 61, 61, 55, 56, 61, 54, 62, 58, 54,…
$ price <int> 326, 326, 327, 334, 335, 336, 336, 337, 337, 338, 339, 340, 342, 34…
$ x <dbl> 3.95, 3.89, 4.05, 4.20, 4.34, 3.94, 3.95, 4.07, 3.87, 4.00, 4.25, 3…
$ y <dbl> 3.98, 3.84, 4.07, 4.23, 4.35, 3.96, 3.98, 4.11, 3.78, 4.05, 4.28, 3…
$ z <dbl> 2.43, 2.31, 2.31, 2.63, 2.75, 2.48, 2.47, 2.53, 2.49, 2.39, 2.73, 2…
# summary(데이터 명)
> summary(diamonds)
carat cut color clarity depth
Min. :0.2000 Fair : 1610 D: 6775 SI1 :13065 Min. :43.00
1st Qu.:0.4000 Good : 4906 E: 9797 VS2 :12258 1st Qu.:61.00
Median :0.7000 Very Good:12082 F: 9542 SI2 : 9194 Median :61.80
Mean :0.7979 Premium :13791 G:11292 VS1 : 8171 Mean :61.75
3rd Qu.:1.0400 Ideal :21551 H: 8304 VVS2 : 5066 3rd Qu.:62.50
Max. :5.0100 I: 5422 VVS1 : 3655 Max. :79.00
J: 2808 (Other): 2531
table price x y z
Min. :43.00 Min. : 326 Min. : 0.000 Min. : 0.000 Min. : 0.000
1st Qu.:56.00 1st Qu.: 950 1st Qu.: 4.710 1st Qu.: 4.720 1st Qu.: 2.910
Median :57.00 Median : 2401 Median : 5.700 Median : 5.710 Median : 3.530
Mean :57.46 Mean : 3933 Mean : 5.731 Mean : 5.735 Mean : 3.539
3rd Qu.:59.00 3rd Qu.: 5324 3rd Qu.: 6.540 3rd Qu.: 6.540 3rd Qu.: 4.040
Max. :95.00 Max. :18823 Max. :10.740 Max. :58.900 Max. :31.800
3) 변수별 기술 통계량 확인
library(prettyR) # 최빈수를 구하기 위해 e1071 패키지 로드
mean(diamonds$carat) # 평균 : mean(데이터 명$변수 명)
mean(diamonds$carat, trim = 0.05) # 5% 절사평균 : trim = 절사할 값 추가
median(diamonds$carat) # 중위수 : mean(데이터 명$변수 명)
prettyR::Mode(diamonds$carat) # 최빈수 : Mode(데이터 명$변수 명)
max(diamonds$carat) # 최댓값
min(diamonds$carat) # 최솟값
range(diamonds$carat) # 범위 (최솟값, 최댓값 한번에 출력
diff(range(diamonds$carat)) # 최솟값과 최댓값의 차를 알고 싶다면
IQR(diamonds$carat) # 사분위 범위
var(diamonds$carat) # 분산
sd(diamonds$carat) # 표준편차
mad(diamonds$carat) # 절대편차
library(e1071) # 왜도와 첨도를 구하기 위해 e1071 패키지 로드
e1071::skewness(diamonds$carat) # 왜도
e1071::kurtosis(iamonds$carat) # 첨도
위의 것들을 한번에 출력하기
(저렇게 각각 하면 출력도 각각 되는데, 보기에 깔끔하진 않겠죠?)
🌈dplyr 패키지의 summarise를 활용
summarise 안에 위의 함수들을 몽땅 넣어주면 됩니다.
최빈수를 반환해주는 PrettyR 패키지의 Mode 함수는 문자 형태로 출력됩니다. 때문에 속성을 숫자형으로 바꾸려고 as.numeric 함수를 사용하였습니다.
> diamonds %>%
+ dplyr::summarise(n = n(),
+ Mean = mean(carat),
+ TrimmedMean = mean(carat, trim = 0.05),
+ Mediam = median(carat),
+ Mode = as.numeric(prettyR::Mode(carat)),
+ Range = diff(range(carat)),
+ IQR = IQR(carat),
+ VAR = var(carat),
+ SD = sd(carat),
+ MAD = mad(carat),
+ SKEW = e1071::skewness(carat),
+ KURT = e1071::kurtosis(carat))
# A tibble: 1 x 12
n Mean TrimmedMean Mediam Mode Range IQR VAR SD MAD SKEW KURT
<int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 53940 0.798 0.757 0.7 0.3 4.81 0.64 0.225 0.474 0.474 1.12 1.26
🌈psych 패키지의 describe를 활용
저렇게 길게 썼던 코드가 아래의 한줄로 모두 해결됩니다.
trimmed를 별도로 설정하지 않을 시 10% 절사 평균으로 나옵니다.
(참고로, 요 함수를 for문이나 purrr의 map 함수와 활용하면 데이터 내 모든 수량적 변수의 기술통계량을 한번에 뽑아낼 수 있겠죠! => 포스팅 했습니다! 보러가기)
# psych 패키지 설치 및 로드
> install.packages("psych")
> library(psych)
# psych::describe(데이터)
# trimmed : 5% 절사평균
> psych::describe(diamonds$carat, trim = 0.05)
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 53940 0.8 0.47 0.7 0.76 0.47 0.2 5.01 4.81 1.12 1.26 0
데이터를 분석하기에 앞서 데이터가 어떤 데이터인지, 업종에 따른 특성은 무엇이 있는지, 숫자의 특징은 무엇이 있는지 등등을 아는 것은 매우 중요합니다.
예를 들어, 음악 앱 관련된 데이터를 분석한다면 해당 데이터 내에 포함된 변수(장르, 음악 템포, 가수, 별점 ...)가 무엇을 뜻하는지와 어떤 형태로 분포되어 있는지, 숫자형 데이터인지, 문자형 데이터인지, 단순 데이터 내의 내용을 넘어 요즘 음악 앱 트렌드는 어떤지, 사용 성연령대는 어떠한지, 유저의 라이프 스타일은 어떠할지 등등을 알고 있어야 더 유의미한 인사이트를 얻을 수 있습니다. 이에 대해 R은 쉽고 빠르게 수량적 정보를 파악할 수 있게 해주니 참 유용하네요😎
위 내용과 관련하여 더 쉽게 데이터 살필 수 있는 코드를 알게된다면 계속해서 추가해볼게요. 그럼 감사합니다.