1 중학교 1학년

이지통계 프로그램 http://www.ebsmath.co.kr/easyTong을 참고하여 줄기잎그림과 비교해보자.

1.1 자료의 정리와 해석

교학사 중1 교과서 6단원에 나와 있는 2011년부터 2015년까지 노벨 평화상을 받은 개인 수상자들의 수상 나이를 조사한 것을 두고 최고령자의 나이와 40세 미만 나이에 노벨 평화상을 받은 수상자가 몇명인지 구하라는 문제를 제시하고 있다.

scale = 2로 지정하여 나이 십자리가 기준 줄기(stem)가 되고 나이 일자리가 잎(leaf)가 되도록 그래프를 그린다. 이를 통해서 가장 최고령자는 78세임을 알 수 있고 40세 미만은 17, 32, 39 3명임을 알 수 있다.

변량(Variable)은 변한다는 뜻을 갖는 것으로 노벨평화상 수상자의 나이가 고정되지 않고 변화하는 특징을 갖는 것을 확인할 수 있다.

library(tidyverse)
library(aplpack)

novel_age <- c(63, 78, 56, 64, 63, 66, 59, 71, 48, 45, 73, 39, 32, 60, 17)

stem(novel_age, scale = 2)

  The decimal point is 1 digit(s) to the right of the |

  1 | 7
  2 | 
  3 | 29
  4 | 58
  5 | 69
  6 | 03346
  7 | 138
# stem.leaf(novel_age, unit = 2, m = 1, depths = FALSE)

어느 중학교의 여학생과 남학생 각각 10명이 하루동안 휴대전화로 발송한 문자의 횟수를 조사하여 양쪽으로 비교를 할 수 있도록 줄기잎 그래프를 그려보자.1

female_sms <- c(31, 38, 67, 45, 59, 79, 36, 83, 72, 74)
male_sms   <- c(17, 18, 25, 78, 62, 67, 22, 57, 23, 39)

stem.leaf.backback(female_sms, male_sms, unit = 1, back.to.back = TRUE, add.more.blanks = 5, show.no.depths = FALSE)
___________________________________
  1 | 2: represents 12, leaf unit: 1 
     female_sms     male_sms   
___________________________________
               | 1 |78         2   
               | 2 |235       (3)  
   3        861| 3 |9         (1)  
   4          5| 4 |               
  (1)         9| 5 |7          4   
  (1)         7| 6 |27         3   
   4        942| 7 |8          1   
   1          3| 8 |               
               | 9 |               
___________________________________
n:           10     10         
___________________________________

1.2 도수분포표

도수분포표는 영어로 Frequency Table로 빈도표로 간략화 시킬 수 있고 추구하는 바는 특정 구간에 출현횟수가 몇개가 되는지를 표로 나타낸 것이다.

합창단 나이를 벡터로 표현한다. 벡터를 데이터프레임으로 바꾸고 난 후 나머지 연산을 통해 몫만 취해 연령대를 구한다. 그리고 나서 각 연령대가 범주형 변수이기 때문에 빈도를 count() 함수로 구해서 개수하면 된다. 가장 빈도가 많은 연령대는 “40대”로 파악된다.

glee_club_age <- c(30, 41, 43, 45, 38, 51, 56, 42, 36, 39, 33, 49, 27, 52, 48, 29, 25, 26, 40, 51)

glee_club_tbl <- tibble(age = glee_club_age)

glee_club_tbl %>% 
  mutate(연령대 = age %/% 10) %>% 
  mutate(연령대 = glue::glue("{연령대}0대")) %>% 
  count(연령대, name = "도수(명)") %>% 
  add_row(연령대="합계", `도수(명)`=20)
# A tibble: 5 x 2
  연령대 `도수(명)`
  <glue>      <dbl>
1 20대            4
2 30대            5
3 40대            7
4 50대            4
5 합계           20

1.3 도수분포 시각화

상기와 같은 도수분포를 막대그래프를 사용해서 시각화하면 좀더 명확한 의미를 알 수 있다.

novel_dat <- tibble(나이 = novel_age)
 
novel_tbl <- novel_dat %>% 
  mutate(연령대 = 나이 %/% 10) %>% 
  mutate(연령대 = glue::glue("{연령대}0대")) %>% 
  count(연령대, name = "도수(명)") %>% 
  add_row(연령대 = "20대", `도수(명)` = 0) %>% 
  arrange(연령대)

novel_tbl %>% 
  ggplot(aes(x= 연령대, y = `도수(명)`)) +
    geom_col(width = 0.5, stat = "identity") +
    theme_light() +
    labs(x     = "노벨 평화상 수상 연령대",
         title =  "2001년부터 2015년까지 노벨 평화상을 받은 개인 수상자들의 수상 당시 나이 분포")

동일한 그래프를 원그래프를 사용해서 표현해보자.

novel_tbl %>% 
  ggplot(aes(x= "", y = `도수(명)`, fill = 연령대)) +
    geom_col() +
    coord_polar(theta = "y", start = 0, direction = -1) +
    geom_text(aes(label = paste(연령대, "\n", `도수(명)`, "명")),
            position = position_stack(vjust = 0.5)) +
    theme_void() +
    scale_fill_brewer(palette = "Pastel1") +
    labs(x     = "노벨 평화상 수상 연령대",
         title =  "2001년부터 2015년까지 노벨 평화상을 받은 개인 수상자들의 수상 당시 나이 분포")

1.4 도수분포다각형 시각화

도수분포다각형은 Frequency Polygon을 번역한 것으로 앞으로 다룰 히스토그램과 밀접한 연관관계가 있다. 노벨평화상 수상자를 연령대별로 seq(10, 80, by=10)을 사용해서 10, 20, 30, 40, 50, 60, 70, 80 구간을 만들어 이를 geom_freqpoly()를 사용하여 시각화한다.

novel_dat %>% 
  ggplot(aes(x= `나이`)) +
    geom_freqpoly(breaks= seq(10, 80, by=10)) +
    geom_point(stat="bin", aes(y=..count..), breaks= seq(10, 80, by=10), size = 3, color ="midnightblue") +
    scale_x_continuous(breaks = seq(10, 80, by=10)) +
    labs(x = "연령대", 
         y = "노벨평화상 수상자수",
         title =  "2001년부터 2015년까지 노벨 평화상을 받은 개인 수상자들의 수상 당시 나이 분포") +
    theme_light()

1.5 상대도수

상대도수는 Relative Frequency를 번역한 것으로 앞서 빈도수를 절대도수 Absolute Frequency를 나타낸 것인데 두집단이상을 비교할 때 전체를 100으로 두고 퍼센트를 사용해서 비율을 구하듯이 전체 도수 총계를 분모에 두고 각 해당 사건이 발생된 빈도를 나눠 상대 도수를 구한다. 이렇게 상대 도수를 구하게 되면 두 집단을 비교할 때 유용하다. 먼저 남녀학생이 보낸 SMS 문자건수를 범주화하여 각각 빈도수를 계산한다.

sms_dat <- tibble(여자 = female_sms, 
                  남자 = male_sms)

sms_tbl <- sms_dat %>% 
  pivot_longer(cols = everything(), names_to = "성별", values_to = "문자발송건수") %>% 
  mutate(SMS발송범주 = cut_width(`문자발송건수`, width=10, boundary = 0, closed = "left")) %>% 
  count(성별, SMS발송범주, name = "명수") %>% 
  pivot_wider(names_from = 성별, values_from = 명수, values_fill  = 0)

sms_tbl
# A tibble: 8 x 3
  SMS발송범주  남자  여자
  <fct>       <int> <int>
1 [10,20)         2     0
2 [20,30)         3     0
3 [30,40)         1     3
4 [50,60)         1     1
5 [60,70)         2     1
6 [70,80)         1     3
7 [40,50)         0     1
8 [80,90]         0     1

상대도수 공식에 의해 계급으로 표현된 SMS발송범주의 상대도수를 계산한다.

\[\text{어떤 계급의 상대도수} = \frac{\text{그 계급의 도수}}{\text{도수의 총합}}\]

sms_tbl <- sms_tbl %>% 
  mutate(남자_상대도수 = 남자 / sum(남자), 
         여자_상대도수 = 여자 / sum(여자) )

sms_tbl
# A tibble: 8 x 5
  SMS발송범주  남자  여자 남자_상대도수 여자_상대도수
  <fct>       <int> <int>         <dbl>         <dbl>
1 [10,20)         2     0           0.2           0  
2 [20,30)         3     0           0.3           0  
3 [30,40)         1     3           0.1           0.3
4 [50,60)         1     1           0.1           0.1
5 [60,70)         2     1           0.2           0.1
6 [70,80)         1     3           0.1           0.3
7 [40,50)         0     1           0             0.1
8 [80,90]         0     1           0             0.1

이제 모든 데이터가 준비되었으니 절대도수로 그래프를 그려보고 상대도수로 그래프를 그려 비교해보자.

sms_dat %>% 
  pivot_longer(cols = everything(), names_to = "성별", values_to = "발송건수") %>% 
  ggplot(aes(x= `발송건수`, group = 성별, color = 성별)) +
    geom_freqpoly(breaks= seq(10, 90, by=10)) +
    geom_point(stat="bin", aes(y=..count..), breaks= seq(10, 90, by=10), size = 3)  +
    scale_x_continuous(breaks = seq(10, 80, by=10)) +
    labs(x = "문자발송건수", 
         y = "학생수",
         title =  "흔한 중학교 남녀 학생 문자발송건수 절대돗수 비교") +
    theme_light() +
    theme(legend.position = "top")

geom_freqpoly의 인자를 조정하여 절대도수가 아닌 상대도수를 표현하여 남녀를 상대적으로 비교할 수 있도록 ggplot으로 시각화한다.

sms_dat %>% 
  pivot_longer(cols = everything(), names_to = "성별", values_to = "발송건수") %>% 
  ggplot(aes(x= `발송건수`, group = 성별, color = 성별)) +
    geom_freqpoly(aes(y = stat(count) / sum(count)), breaks= seq(10, 90, by=10)) +
    geom_point(stat="bin", aes(y=..count.. / sum(..count..) ), breaks= seq(10, 90, by=10), size = 3)  +
    scale_x_continuous(breaks = seq(10, 80, by=10)) +
    scale_y_continuous(labels = scales::percent_format(accuracy = 2L)) +
    labs(x = "문자발송건수", 
         y = "상대빈도",
         title =  "흔한 중학교 남녀 학생 문자발송건수 절대돗수 비교") +
    theme_light() +
    theme(legend.position = "top")

2 중1: 통계프로젝트

앞서 배운 도구를 바탕으로 통계프로젝트를 진행하여 통계표를 작성한다.

  1. 주제정하기
  2. 계획하기
  3. 자료 수집하기
  4. 자료 정리하기
  5. 자료 해석하기
  6. 발표자료 만들기
 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com