ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Box Plot 그리기(boxplot)
    R/Data Visualization 2022. 3. 9. 01:41

    SSmath_AfterSchool_Time.csv
    0.00MB

     

     

    상자 그래프를 그리는 방법 중 한가지는, boxplot 명령어를 사용하는 것으로 상자그래프를 간단하게 그릴 수 있는 명령어이다.  상자그래프를 그리기 위한 boxplot의 기본 형태는 boxplot(y축 ~ x축, 데이터=데이터명)을 입력하면 된다. 만약 col="색상명"을 추가하면 그래프의 색깔을 정할 수 있다.  

     

    예시를 위해 첨부되어 있는 파일을 ach라는 이름으로 불러오고, 변수명을 살펴보았다.

     

    ach <- read.csv("SSmath_AfterSchool_Time.csv", stringsAsFactors=FALSE)
    str(ach)

     

    SS_math는 수학점수를 의미하고, AfterSchool은 정규 수업 후  자기주도학습 또는 강의듣기를 나타내고 있으며 Time은 1,2,3으로 시간을 의미한다. 

    'data.frame':	120 obs. of  3 variables:
     $ SS_math    : num  54.2 61.5 57.3 55.8 56.4 60 61.1 61.2 55.2 57 ...
     $ AfterSchool: chr  "Class" "Class" "Class" "Class" ...
     $ Time       : int  1 1 1 1 1 1 1 1 1 1 ...

     

    1. 집단 변수가 1개일 경우 

     

    이 데이터를 사용해서 가장 기본 적인 상자그래프를 그려보았다.  강의를 듣던, 자기주도학습을 하던 공부하는 시간에 따라 수학점수의 분포가 어떤지 살펴보았다.

    boxplot(SS_math ~ Time, data=ach)
    title("SS_math by Time")

    [그림1] SS_math by Time

     

    만약 상자그래프의 색깔을 바꾸고 싶다면 col="색상명"을 추가해주면 된다. 

    boxplot(SS_math ~ Time, data=ach, col="lightblue")
    title("SS_math by Time")

    [그림2] SS_math by Time with color change

     

    이렇게 생성된 상자그래프에 전체 수학 평균값을 나타낼 수 있는 수평선을 추가해보았다.  이를 위해 mean(ach$SS_math) 을 실행하였고, 그 결과 전체 수학평균 값은 68.49167점이고 반올림해서 68.50을 전체 수학평균값으로 사용하였다.  abline(h="값", col="색상명", lty="선 형태")를 추가해주면 된다. 

    boxplot(SS_math ~ Time, data=ach, col="lightblue")
    title("SS_math by Time")
    abline(h=68.50, col="pink", lty=6)

    [그림3] SS_math by Time with Mean score

     

    각각의 상자그래프에 평균값을 표시해보았다. 각 상자그래프의 평균값은 60.575, 68.985, 75.915이다. 

    temp1 <- ach %>% filter(Time == 1)
    temp2 <- ach %>% filter(Time == 2)
    temp3 <- ach %>% filter(Time == 3)
    
    mean(temp1$SS_math) ##60.575
    mean(temp2$SS_math) ##68.985
    mean(temp3$SS_math) ##75.915

     

    각 평균값을 meanval에 할당하였고, points 명령어를 이용하여 표시를 하였다. pch는 표시형태를 의미하고, cex는 크기를 의미한다.  

    boxplot(SS_math ~ Time, data=ach, col="lightblue")
    title("SS_math by Time")
    ## add mean line mean(ach$SS_math)
    abline(h=68.50, col="gray", lty=6)
    meanval <- c(60.575, 68.985, 75.915)
    points(meanval, col="White", pch=3, cex=0.7)

    [그림 4]&amp;amp;amp;amp;nbsp; 각 box plot에 평균 값 표시

     

    다음 단계로 각각의 상자그래프에 표시된 평균을 나타내는 표시에 평균값이 얼마인지 나타내보았다. text라는 명령어를 사용하였고 1은 상자그래프 순서를 나타낸다. 그래서 상자 그래프가 3개 이니까 3개의 text 명령어를 추가했고 각각 1, 2, 3의 값을 입력하였다.  첫번째 text 명령어에서 61.5는 평균값을 표시할 위치로 그래프에 나타나있는 + 표시 위의 값(즉, 평균값보다 큰 숫자) 혹은 아래 값(평균값보다 작은 숫자)를 넣어주면 된다. 그리고 나서 cexcol명령어를 통해 글씨 크기와 색상을 설정해주면 된다. 

     

    boxplot(SS_math ~ Time, data=ach, col="lightblue")
    title("SS_math by Time")
    abline(h=68.50, col="gray", lty=6)
    meanval <- c(60.575, 68.985, 75.915)
    points(meanval, col="White", pch=3, cex=0.7)
    text(1, 61.5, "M=60.575", cex=.5, col="red")
    text(2, 69.9, "M=68.985", cex=.5, col="red")
    text(3, 76.9, "M=75.915", cex=.5, col="red")

    [그림 5] 각각의 상자 그래프에 평균값 표시

     

    마지막으로 각각의 상자 그래프가 무엇을 의미하는지 나타내주는 설명 표시해보았다. 위에 언급한 text 명령어를 사용하였다. 

    boxplot(SS_math ~ Time, data=ach, col="lightblue")
    title("SS_math by Time")
    abline(h=68.50, col="gray", lty=6)
    meanval <- c(60.575, 68.985, 75.915)
    points(meanval, col="White", pch=3, cex=0.7)
    text(1, 61.5, "M=60.575", cex=.5, col="red")
    text(2, 69.9, "M=68.985", cex=.5, col="red")
    text(3, 76.9, "M=75.915", cex=.5, col="red")
    text(1, 75, "Mean of SS_Math by Time=1 : 60.575", cex=.7, col="darkgray")
    text(2, 80, "Mean of SS_Math by Time=2 : 68.985", cex=.7, col="darkgray")
    text(3, 63, "Mean of SS_Math by Time=3 : 75.915", cex=.7, col="darkgray")

    [그림 6] 각각의 상자그래프를 나타내는 설명 추가하기

     

     

    2. 집단 변수가 2개 일 경우

     

    앞에서는 정규 수업 후에 공부하는 시간만 고려한 수학성취도를 비교한 상자그래프를 그렸다면, 여기에서는 두개의 조건인 자기주도학습인지 아니면 강의를 듣는 시간에 따라 수학성취도가 어떻게 나타나는지 살펴보는 상자그래프를 그려보고자 한다. 사용하는 데이터는 동일하다. 

     

    기본적인 명령어 형태는 boxplot(y축에 들어갈 종속변수 ~ 집단1 독립변수 + 집단2 독립변수, data=데이터명)을 입력하면 된다. 

    boxplot(종속변수 y축 ~ 독립변수(집단1) + 독립변수(집단2), data=데이터명)
    
    boxplot(SS_math ~ Time + AfterSchool, data=ach)
    title("SS_math by time & AfterSchool")

    [그림 6] 두 집단을 고려한 상자 그래프

     

    마찬가지로 각각의 그래프에 색깔을 넣어보았다. 여기서 중요한 것은 앞선 예에서는 col="색깔명"을 넣어주면 되었지만, [그림 6]에서는 총 6개의 그래프가 있고 앞에 3개는 방과후 Class에 참석하는 학생들의 수학평균 성취도, 뒤에 3개는 자기주도학습에 참여하는 학생들의 수학성취도를 나타내고 있다. 그래서 만약 아래와 같이 col=c("색깔명1", "색깔명2")를 넣어주면 어떻게 되는지 살펴보자(참고로, " 대신에 ' 을  사용해도 무관하다).

    boxplot(SS_math ~ Time + AfterSchool, data=ach, col=c('powderblue', 'mistyrose'))
    title("SS_math by time & AfterSchool")

    그 결과, powerblue색과 mistyrose 색이 반복되어 표시되는 것을 확인할 수 있다.  

    [그림 7] 각각의 그래프에 색상을 넣기 (1)

     

    그런데 만약 우리가 Class는 powerblue 색으로, SelfStudy는 mistyrose 색으로 구분하여 나타내고 싶으면 다음과 같이  rep('색상명', 반복횟수)를 추가해주면 된다. 

     

    boxplot(SS_math ~ Time + AfterSchool, data=ach, col=c(rep('powderblue', 3), rep('mistyrose',3)))
    title("SS_math by time & AfterSchool")

    [그림 8] 집단별로 동일한 색 설정하기

    각 집단(Class와 SelfStudy)의 평균을 나타내는 선을 넣어보았다. 앞선 예와 동일하게 h='각 집단의 평균값'을 넣어주면 되고, col를 지정해주면 된다. Class 집단의 전체 평균값은 67.02점이고, SelfStudy 집단의 전체 평균값은 69.96점 이었다.

    각각 생상은 navy와 darkseagreen4로 지정해 주었다. 그 다음 각 선을 나타내는 설명을 넣어주었는데 이때 text라는 명령어를 사용하면 된다. 첫번째 text(0.77, 66,....)에서 0.77은 글자가 시작하는 위치를 나타내는 것이다. 숫자가 커질수록 글자의 시작점이 오른쪽으로 이동하고 작아질수록 왼쪽으로 이동한다. 66은 설명이 들어갈 위치로 평균값을 나타내는 선보다 아래에 위치하게 하기 위하여 66을 입력하였다. 이 명령어의 단점은 text의 숫자를 대입해보면서 가장 적합한 위치를 찾아야 한다는 한계점이 있다. 

    boxplot(SS_math ~ Time + AfterSchool, data=ach, col=c(rep('powderblue', 3), rep('mistyrose',3)))
    title("SS_math by time & AfterSchool")
    abline(h=67.02, col="navy", lty=6)
    text(0.77, 66, "Mean Score at Class:67.02", cex=.7, col="darkred") 
    abline(h=69.9633, col="darkseagreen4", lty=6)
    text(0.82, 71, "Mean Score at SelfStudy:69.96", cex=.7, col="darkred")

    [그림 9] 각 집단별 그래프 색상 설정하기

    각 그래프에 평균값을 표시해 보았다.

    boxplot(SS_math ~ Time + AfterSchool, data=ach, col=c(rep('powderblue', 3), rep('mistyrose',3)))
    title("SS_math by time & AfterSchool")
    abline(h=67.02, col="navy", lty=6)
    text(0.77, 66, "Mean Score at Class:67.02", cex=.7, col="darkred") 
    abline(h=69.9633, col="darkseagreen4", lty=6)
    text(0.82, 71, "Mean Score at SelfStudy:69.96", cex=.7, col="darkred")
    meanval <- c(58.02, 67.27, 75.77,63.13 ,70.70, 76.06)
    points(meanval, col="White", pch=3, cex=0.7)

    [그림 10] 각 집단의 평균값 표시

     

    표시된 각 집단의 평균값에 설명을 추가하였다. 이때는 text 명령어를 사용하면 된다. 

    boxplot(SS_math ~ Time + AfterSchool, data=ach, col=c(rep('powderblue', 3), rep('mistyrose',3)))
    title("SS_math by time & AfterSchool")
    abline(h=67.02, col="navy", lty=6)
    text(0.77, 66, "Mean Score at Class:67.02", cex=.7, col="darkred") 
    abline(h=69.9633, col="darkseagreen4", lty=6)
    text(0.82, 71, "Mean Score at SelfStudy:69.96", cex=.7, col="darkred")
    meanval <- c(58.02, 67.27, 75.77,63.13 ,70.70, 76.06)
    points(meanval, col="White", pch=3, cex=0.7)
    text(1, 58.02, "M=58.02", cex=.5, col="red")
    text(2, 67.27, "M=67.27", cex=.5, col="red")
    text(3, 75.77, "M=75.77", cex=.5, col="red")
    text(4, 63.13, "M=63.13", cex=.5, col="red")
    text(5, 70.70, "M=70.70", cex=.5, col="red")
    text(6, 76.06, "M=76.06", cex=.5, col="red")

    [그림 11] 각 집단의 표시된 평균값에 설명 추가하기

    마지막으로 각 그래프에 설명을 추가하였다. 

    boxplot(SS_math ~ Time + AfterSchool, data=ach, col=c(rep('powderblue', 3), rep('mistyrose',3)))
    title("SS_math by time & AfterSchool")
    abline(h=67.02, col="navy", lty=6)
    text(0.77, 66, "Mean Score at Class:67.02", cex=.7, col="darkred") 
    abline(h=69.9633, col="darkseagreen4", lty=6)
    text(0.82, 71, "Mean Score at SelfStudy:69.96", cex=.7, col="darkred")
    meanval <- c(58.02, 67.27, 75.77,63.13 ,70.70, 76.06)
    points(meanval, col="White", pch=3, cex=0.7)
    text(1, 58.02, "M=58.02", cex=.5, col="red")
    text(2, 67.27, "M=67.27", cex=.5, col="red")
    text(3, 75.77, "M=75.77", cex=.5, col="red")
    text(4, 63.13, "M=63.13", cex=.5, col="red")
    text(5, 70.70, "M=70.70", cex=.5, col="red")
    text(6, 76.06, "M=76.06", cex=.5, col="red")
    text(1, 63, "Mean by Class & Time=1", cex=.5, col="darkgray")
    text(2, 62, "Mean by Class & Time=2", cex=.5, col="darkgray")
    text(3, 63, "Mean by Class & Time=3", cex=.5, col="darkgray")
    text(4, 57, "Mean by SelfStudy & Time=1", cex=.5, col="darkgray")
    text(5, 63, "Mean by SelfStudy & Time=2", cex=.5, col="darkgray")
    text(6, 82, "Mean by SelfStudy & Time=3", cex=.5, col="darkgray")

    [그림 12] 각 그래프의 설명 추가하기

     

    3. 특정 집단만 선택

     

    AfterSchool 변수에서 SelfStudy만 추출해서 상자 그래프를 그렸보았다. 기본형태는 == "SelfStudy" 만 추가해주면 된다. 

    boxplot(SS_math ~ AfterSchool == "SelfStudy", data=ach)
    boxplot(SS_math ~ AfterSchool == "SelfStudy", data=ach, col=c('powderblue', 'mistyrose')

     

    col 지정이 없으면 아래의 [그림 13]과 같이 회색의 상자그래프가 그려진다. 

    [그림 13] 특정 집단만 선택 한 후 상자 그래프 그리기

    col를 지정해주면 [그림 14]와 같은데 여기에서는 powderblue와 mistyrose 색으로 지정하였다. 

    [그림 14] 특정집단만 추출후 상자 그래프 그리기 2

     

    마지막으로 한가지 예를 더 살펴보았다. SeflStudy에 참여하는 응답자만 추출한 후 시간에 따라 수학평균점수가 어떠한지 살펴보았다. 이를 위해서는 subset=변수명=="값"을 추가하거나 두번째 명령어 처럼 [변수명 == "값"]을 종속변수인 SS_math와 독립변수인 Time에 추가하는 방법이다. 

     

    boxplot(SS_math ~ Time, data=ach, subset = AfterSchool == "SelfStudy", 
            col=c('darkseagreen4', 'powderblue', 'mistyrose'))
    title("SS_math by Time with SelfStudy")
    
    boxplot(SS_math[AfterSchool =="SelfStudy"] ~ Time[AfterSchool == "SelfStudy"], 
            data=ach,col=c('darkseagreen4', 'powderblue', 'mistyrose'))
    title("SS_math by Time with SelfStudy")

    [그림 15] 특정집단(SelfStudy)을 추출한 후 시간에 따른 수학 평균 점수&nbsp;

    'R > Data Visualization' 카테고리의 다른 글

    Bar Graph II - 막대그래프  (0) 2022.10.01
    원그래프 pie -1 (pie3D)  (0) 2021.10.20
    막대그래프 barplot - 1  (0) 2021.10.19
    막대그래프 qplot - 1  (0) 2021.10.19

    댓글

Designed by Tistory.