R

[R] 시각화 - 원그래프(pie)

ㄷㅐ장님 2022. 1. 25. 02:39

양적자료

: 숫자, 크기로 측정되는 값
-연속형 자료 : 실수형, 키/몸무게 ...
-이산형 자료 : 정수형, 여학생수/남학생수/출생아수 ...

질적자료(범주형)

: 자료에 내포된 의미가 있는 데이터(이산형자료와 유사)
-순위형 자료 : 학점(A,B,C...), 설문조사(좋다,보통,나쁘다)
-명목형 자료(순서X) : 성별(여,남), 혈액형(A,B,AB,O), 거주지역            

  요약방법 자료정리 시각화(그래프)
양적 자료 수치, 표 도수분포표
합,평균,분산,표준편차,중앙값,최댓값,최솟값,범위
히스토그램
상자도표, 산점도
막대그래프
질적 자료 도수분포표
빈도표
상대빈도표
원,막대그래프

 

원그래프(pie chart)

범주형 자료에 대한 상대도수분포표를 나타내기 위해 일반적으로 사용되는 그래프
예) S회사에서 새로 개발한 스마트폰의 디자인에 대하여 고객 100명을 임의로 뽑아 선호도 조사를 했다.
100명 중에 45명은 좋다, 25명은 보통, 20명은 싫다, 10명은 답을 하지 않았다.
조사에 대한 도수분포표(빈도표)를 생성해 보자

도수분포표(frequency table)
범주형 자료에 대해서 도수와 상대도수를 나열하는 표

 

선호도     도수        상대도수         각도
----------------------------------------------------
좋다        45       45/100=0.45      360*0.45
보통        25       25/100=0.25      360*0.25
싫다        20       20/100=0.2       360*0.2
응답없음    10       10/100=0.1       360*0.1

선호도 도수 상대도수 각도
좋다 45 45/100 = 0.45 360*0.45
보통 25 25/100 = 0.25 360*0.25
싫다 20 20/100 = 0.2 360*0.2
응답 없음 10 10/100 = 0.1 360*0.1
data <- data.frame(labels=c('좋다','보통','싫다','응답없음'),
                   frequency=c(45,25,20,10))
data$상대도수 <- data$frequency / sum(data$frequency)

pie(data$상대도수,labels=data$labels)

pie(data$상대도수,
    labels=paste0(data$labels,' ',data$상대도수*100,'%'), #%표시
    col=c('red','blue','yellow','green'), #색상
    main='고객만족도조사', #제목
    cex=0.8, #글자크기
    lty=3) #점선

 

색상표

① pie(rep(1,12),col=1:12)
② pie(rep(1,12),col=rainbow(12))
③ pie(rep(1,12),col=heat.colors(12))
④ pie(rep(1,12),col=terrain.colors(12))
⑤ pie(rep(1,12),col=topo.colors(12))
⑥ pie(rep(1,12),col=cm.colors(12))

library(RColorBrewer)
display.brewer.all()
display.brewer.pal(개수,"색상표 이름")


[문제152]  blood.csv 파이를 읽어 들여서 도수분포표를 작성하시고 pie chart도 생성해주세요.
BLOODTYPE cn  pct
A               7   0.35
AB             4    0.20
B               3    0.15
O              6    0.30
total          20   1.00

1) 도수분포표 작성하기

blood <- read.csv("c:/data/blood.csv",header=T)

x <- aggregate(NAME~BLOODTYPE,blood,length)
names(x)[2] <- 'CN'
x$PCT <- x$CN/sum(x$CN)
rbind(x,list('total',sum(x$CN,sum(x$PCT)))

2-1) pie chart 생성하기

pie(x$PCT[1:4],
    labels=paste0(x$PCT[1:4]*100,'%'),
    main='혈액형 분포',
    col=brewer.pal(4,"Set1"),
    clockwise=T) #clockwise : 큰값부터 시계방향으로 표시
#범례설정
legend("topleft",x$BLOODTYPE[1:4],fill=brewer.pal(4,"Set1"),cex=0.5)

2-2) 3D pie chart 생성하기

p <- plotrix::pie3D(x$PCT[1:4],
                    labels=paste0(x$PCT[1:4]*100,'%'),
                    labelcex=0.7,
                    main='혈액형분포',
                    explode=0.1, #구역간 간격
                    shade=0.5) #음영
#구역 이름 설정하기
plotrix::pie3D.labels(p,labels = x$BLOODTYPE[1:4],
                      labelcex = 0.5,
                      labelrad = 0.8,
                      labelcol = "darkblue")

[문제153] survey.csv 파일을 읽어 들여서 도수분포표를 작성 하시고 pie chart도 생성해 주세요.

20행 1열에서 1행 20열로 변경하기 : t()

survey <- read.csv("c:/data/survey.csv",header=F)
dim(survey) #20행 1열
dim(t(survey)) #1행 20열                     
survey <- data.frame(name=t(survey))

<빈도표 구하기> -다음장에 더 자세히

방법1) dplyr

library(dplyr)
survey%>%
  group_by(name)%>%
  summarise(cnt=n())

방법2) sqldf

library(sqldf)
sqldf("select name,count(*)
       from survey
       group by name")

방법3) aggregate

aggregate(rownames(survey)~name,survey,length)

 

<빈도그래프 생성하기>

result <- aggregate(rownames(survey)~name,survey,length)
names(result)[2] <- "빈도"
result$상대도수 <- result$빈도/sum(result$빈도)

label <- paste(result$name,result$상대도수*100)
label <- paste0(label,'%')

pie(result$상대도수,labels=label)