본문 바로가기

R프로그래밍,통계학/R까기2

(명목변수별 다른명목변수 levels별 비율 표현)_reshape2 패키지의 melt()를 이용해 데이터를 가공 후 그래프로 나타내기

반응형

#R까기 예제 14를 참고하였습니다.

#명목형변수(지역)별로 다른명목변수(성별)의 비율을 막대그래프로 나타낼 때에 참고하면 좋은 예제입니다.

 

example_population_f.csv
0.02MB

library("dplyr")
library("ggplot2")
library("ggthemes")
install.packages("reshape2")
library("reshape2")
DF <- read.csv("example_population_f.csv")
DF <- DF[,-1] DF <- as_tibble(DF)

#as_tibble(DF) : 예전의 tbl_df() 와 같음 , 빠르고 쉽게 데이터프레임 객체를 다루기 위해 dplyr 객체 속성을 추가하기 위한 함수. dplyr를 사용하기전에 이 함수로 변환부터 하기.

1.데이터를 불러옵니다.  

불러와진 데이터는 아래와 같습니다. - 전국인구조사자료

 

 

2.'도' 별 합을 구합니다.

 

group <- group_by(DF, Provinces)
#DF를 provinces 별로 그룹을 지어 유지하라. 
DF2 <- summarise(group,SumPopulation=sum(Population), Male = sum(Male),Female = sum(Female))
#province 별로, 인구수의 sum, 남자인구수의 sum ,여자인구스의 sum을 나타내주는 dataframe

*group_by() - 그룹을 지어 유지하라.

*group_by(df, 그룹지을 변수)

*summarise(그룹지은객체, 함수)

#tapply함수와 유사하나, summarise함수는 결과값을 dataframe형식으로 출력하여 ggplot2에 바로 적용이 가능하다.

 

3.남녀 변수를 factor로 바꿉니다.

 

DF3 <- melt(DF2, id.vars= c("Provinces", "SumPopulation"),measure.vars= c("Male","Female"))
DF3

#melt 함수로 이상해진 변수명 바꾸기
colnames(DF3)[3] <- "Sex"
colnames(DF3)[4] <- "Population"

*melt() : 여러변수를 하나의 명목형 변수로 바꿔라(reshape2패키지) 

*melt(데이터프래임객체, id.vars=바꾸지 않을 변수들, measure.vars=바꿀 변수들) 

ex) melt(DF, idvars= Time, measure.vars = c(Apoint,Bponit)) : Apoint, Bpoint 변수를 하나의 명목형 변수로 만듬.#명목형 변수로 취급해도 되는 변수의 level이 각각 따로 변수로 나눠져 있는 경우 이를 하나의 명목형 변수의 Levels로 취급되게 만드는 함수가 melt()이다. 이렇게 하는 이유는 그래프로 나타내기 쉽다는것이다. levels 단위로 하나의 변수로 합쳐져 있는 상태라면 그 변수를 ggplot2의 colour이나 fill인자에 넣음르로써 다양한 그래프를 그릴수있게 된다. 

 

  DF2. melt()전. 16개의 행
DF3. melt()후. 32개의 행

 

4.남녀 비율을 추가합니다.

DF4 <- mutate(DF3, Ratio=Population/SumPopulation )
DF4$Ratio <- round(DF4$Ratio,3)

 

5.그래프 그리기1.

G1 <- ggplot(DF4, aes(x=Provinces, y= Ratio, fill=Sex)) + geom_bar(stat="identity") + coord_cartesian(ylim = c(0.45,0.55)) + theme_wsj()
G2 <- geom_text(aes(y=Ratio, label=Ratio,), colour="white")

G1+G2

위의 퍼센트 글자가 가독성이 떨어지고, x축 글자가 겹치게 출력된 그래프

6.텍스트 표시를 그래프 가운데 넣기 위해 테이터에 위치값을 추가하고, 

그래프를 다시 셋팅합니다. (위의 퍼센트 글자 가독성 조정)

#데이터 위치값 추가
DF4 <- mutate(DF4, position =ifelse(Sex=="Male", 0.475, 0.525))
DF4
#그래프를 다시 셋팅합니다.
G1 <- ggplot(DF4, aes(x=Provinces, y=Ratio, fill= Sex)) + geom_bar(stat="identity",position="fill") + coord_cartesian(ylim=c(0.45,0.55)) +theme_wsj() ;

G2 <- geom_text(aes(y=position, label =Ratio), colour ="white") G1+G2

*position = "" 의 옵션 3가지

fill : 전체를 1로 누적되게 표현(이 예제에서는 남녀 합이 어짜피 1이므로 생략 가능)

dodge: 피해서

identity : 겹쳐서 

 

*geom_bar(width = "" )로 막대너비조정 가능

 

위의 퍼센트 라벨이 보다 깔끔하게 정리된 그래프. 아직 x축은 겹쳐서 나온다.

 

7. X축 라벨 겹침문제 해결하기

 

#방법1: 글자의 각도를 바꾸기 (45도)
G1+G2+theme(axis.text.x=element_text(angle=45, hjust=1))

#방법2 : 글자의 가로길이를 제한함으로써 글자를 아래로 배열하기
G1+G2+ aes(stringr::str_wrap(Provinces, 1), Ratio) + xlab(NULL)  #글자의 길이를 1로 제한

 

저는 45도 각도가 좀 더 이쁜거거같습니다.

#참고 : https://rfriend.tistory.com/314 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]

 

[R ggplot2] R ggplot 배경을 흰색으로 바꾸기, x축 라벨 각도를 90도 돌리기, x축과 y축의 위치를 바꾸��

R ggplot2 패키지로 box-plot 을 그렸을 때 조금 더 손을 보고 싶을 때가 있습니다. 가령, 배경색을 흰색으로 바꾸어서 좀더 깔끔하게 보이게 하고 싶을 수 있습니다. 혹은 라벨 길이가 너무 길거가 �

rfriend.tistory.com

 

#참고1. 축 텍스트 및 제목 텍스트

 축 텍스트 및 제목에 대한 공통 테마 속성

ggplot(mtcars, aes(x = factor(cyl), y = mpg))
+ geom_point()
+ theme(
axis.text.x = element_text(color = "grey20", size = 20, angle = 90, hjust = .5, vjust = .5, face = "plain"), axis.text.y = element_text(color = "grey20", size = 12, angle = 0, hjust = 1, vjust = 0, face = "plain"),
axis.title.x = element_text(color = "grey20", size = 12, angle = 0, hjust = .5, vjust = 0, face = "plain"), axis.title.y = element_text(color = "grey20", size = 12, angle = 90, hjust = .5, vjust = .5, face = "plain"))

#참고2. 그래프 title, subtitle ,축 별 제목 설정

ggplot(Cars93, aes(x=Weight, y=MPG.highway,colour=MPG.highway))
+ geom_point()
+scale_colour_gradient(low='lightyellow', high='red',limits=c(20,30))
+ facet_grid(Origin ~ Type)+ggtitle('ggplot 예제')
+theme(plot.title=element_text(face='bold',size=30))
+ labs( subtitle = 'The sub title', x = 'x', y = 'y', color = 'colors')
+xlim(c(0,4000))+ylim(c(20,40))

 

 

 

#참고 블로그

https://rfriend.tistory.com/314#comment19806672

https://ducj.tistory.com/81

반응형