본문 바로가기

■ 프로그래밍/R

[R 기초] 일변량 양적자료의 표, 그래프(histogram, boxplot)

[ R : 일변량 양적자료의 표, 그래프(histogram, boxplot) ]



패키지 로딩하기

library(ggplot2)


일변량 양적자료 분석

1. 표 = 빈도표 : 구간의 빈도, 백분율

  • 성별은 남/여 두개로 나뉘지만, 키는 사람마다 다르기 때문에 구간을 만들어야 함
  • 양적 자료 -> 질적 자료
    ex. cut을 factor화 시킨 후, 구간 명명 : breaks 사용
diamonds$price.group <- cut(diamonds$price,
                            breaks = seq(from = 0, to = 20000, by = 5000),
                            right = FALSE) # FALSE면 오른쪽 숫자 미만, TRUE면 오른쪽 숫자 이하

breaks로 0부터 20000만까지 5000단위로 나눈 것이다.
R에서 ‘[]’가 ’이상’ 혹은 ‘이하’, ()는 ‘초과’ 혹은 ’미만’을 뜻한다.
참고: http://kim-mj.tistory.com/25?category=810330


table(diamonds$price.group)
## 
##       [0,5e+03)   [5e+03,1e+04) [1e+04,1.5e+04) [1.5e+04,2e+04) 
##           39213            9504            3567            1656

cut을 하면, 기본적으로 숫자 보다 수식으로 나타나 진다.
만약 “0이상 5천이하”로 나타내 싶다면, factor의 labels를 설정하면 된다.

prop.table(table(diamonds$price.group)) * 100                                     # 백분율 구하기
sort(prop.table(table(diamonds$price.group)) * 100, decreasing = TRUE)            # 백분율 내림차순 
round(sort(prop.table(table(diamonds$price.group)) * 100, decreasing = TRUE), 1)  # 소수점 1자리 반올림


2. 그래프

(1) 히스토그램(Histogram)

  • hist(data$variable, breaks = )
hist(diamonds$price,
     xlim = c(0, 20000),  # x축 구간 설정
     breaks = seq(from = 0, to = 20000, by = 500)) # 막대 범위 설정 or 'breaks = 20' 약 20개 구간을 만들기

(2) 상자그림(Boxplot)

  • 목적: 양적 자료의 이상치 파악
  • boxplot(data$variable, range = 1.5, horizontal = )
  • range = 1.5가 default 값
par(mfrow = c(1, 2))

boxplot(diamonds$price)
boxplot(diamonds$price, horizontal = TRUE)


집단별로 상자그림 그리기
- boxplot(양적 자료 ~ 질적 자료)

par(mfrow = c(1, 3))

boxplot(diamonds$price ~ diamonds$cut)     # 각 cut의 price값
boxplot(diamonds$price ~ diamonds$color)   # 각 color의 price 값
boxplot(diamonds$price ~ diamonds$clarity) # 각 clarity의 price 값


- for문으로 위에 세 그래프 한 번에 그리기

par(mfrow = c(1, 3))
for(i in c("cut", "color", "clarity")){
  boxplot(as.formula(paste0("price ~ ", i)), data = diamonds) # paste0는 공백이 안 생김
}

참고

IQR(Inter Quartile Range) = 사분위 범위

price.boxplot <- boxplot(diamonds$price)

- 맨 밑의 가로 줄이 min값
- box의 맨 하단이 Q1
- box의 중간 선이 Q2이자 median(중위수)
- box의 맨 상단이 Q3
- 맨 위의 가로 줄이 max값
- 그 위의 검정색 굵은 줄이 모두 outlier(이상치).원래 하나의 원이지만 너무 많아서 직선으로 보임

price.boxplot$status # min, 사분위수, max값
price.boxplot$out    # outlier(이상치)
length(price.boxplot$out) # 이상치 개수
min(price.boxplot$out)    # 이상치 min값
max(price.boxplot$out)    # 이상치 max값


- price.boxplot의 정보보기 : str(data)

str(price.boxplot)
## List of 6
##  $ stats: 'integer' num [1:5, 1] 326 950 2401 5324 11886
##  $ n    : num 53940
##  $ conf : num [1:2, 1] 2371 2431
##  $ out  : num [1:3538] 11888 11888 11888 11897 11899 ...
##  $ group: num [1:3538] 1 1 1 1 1 1 1 1 1 1 ...
##  $ names: chr "1"


List의 Slicing

  1. list[index]
  2. list[[index]]
  3. list$variable
  • quantile(data$variable): 사분위수
quantile(diamonds$price)
##       0%      25%      50%      75%     100% 
##   326.00   950.00  2401.00  5324.25 18823.00
quantile(diamonds$price)[2] # Q1
## 25% 
## 950
quantile(diamonds$price)[4] # Q3
##     75% 
## 5324.25


- outlier(이상치) 수식

quantile(diamonds$price)[2] - 1.5*IQR(diamonds$price) # 이 보다 작은 값이 이상치
quantile(diamonds$price)[4] + 1.5*IQR(diamonds$price) # 이 보다 큰 값이 이상치