본문 바로가기
  • "You can't manage what you can't measure" Peter Drucker
데이터 분석 (with Rstudio)

Rstudio 데이터 가공 및 기초 분석 #3

by Vitaminymc 2023. 8. 3.
반응형

그룹간 데이터 비교

Slam Dunk 상북고와 다른학교 신장 비교

엑셀 피벗

 

slam_dunk_total_엑셀.xlsx
0.01MB

Rstudio

names (slam_dunk_total)
[1] "uniform_no" "name"       "height"     "weight"     "blood type" "age"       
[7] "position"   "school" 
library(tidyverse)

compare_team <- slam_dunk_total %>%
 group_by(school) %>%
  summarise(
    no_player = n(),     # 플레이어(학생) 수
    lower = min (height),   # 최저 신장
    average = mean (height),  # 평균 신장
    upper = max (height),   # 최고 신장
    difference = max(height) - min(height)  #최고 신장과 신저 신장의 차이
  ) 


compare_team
# A tibble: 6 × 6
  school     no_player      lower        average      upper         difference
  <chr>          <int>          <dbl>         <dbl>         <dbl>           <dbl>
1 능남               8             165            182.           202                37
2 산왕               7             171            189.           210                39
3 상북             12             162            177.           197                35
4 상양               6             178            188.           197                19
5 풍전               6             180            184.           190                10
6 해남               9             160            181.           191                31
  • 학교별로 그룹화 : "school" 열을 기준으로 그룹화,  group_by(school)를 사용하여 각 학교별로 계산을 수행됨
  • summarise() 함수는 데이터의 각 학교에 대해 집계 계산을 수행함
    • no_player = n()는 각 학교별로 플레이어의 수를 계산
    • lower = min(height)는 각 학교별로 플레이어의 최소 키를 계산
    • average = mean(height)는 각 학교별로 플레이어의 평균 키를 계산합니다.
    • upper = max(height)는 각 학교별로 플레이어의 최대 키를 계산합니다.
    • difference = max(height) - min(height)는 각 학교별로 플레이어의 최대 키와 최소 키의 차이를 계산
  • 학교별 플레이어 수는 6명 (상양)에서 12명 (상북) 까지 다양  
  • 가장 낮은 최소 키는 160 (해남) 이고, 가장 높은 최대 키는 210 (산왕)
  • 학교별로 177에서 189 사이에 있음
  • 키 범위(최대 키와 최소 키의 차이)는 가장 큰 키 차이는 39 (산왕) 이고, 가장 작은 키 차이는 10 (풍전)

Box Plot

slam_dunk_total %>%
  ggplot (aes(x = school, y = height)) + geom_boxplot()

Box Plot #1

slam_dunk_total %>%
  ggplot(aes(x = school, y = height)) +
  geom_boxplot() +
  stat_summary(fun = max, geom = "text", aes(label = round(..y.., 1)), vjust = -1, color = "blue") +
  stat_summary(fun = min, geom = "text", aes(label = round(..y.., 1)), vjust = 1, color = "green") +
  stat_summary(fun = mean, geom = "point", color = "red", size = 3, shape = 20) +
  stat_summary(fun = mean, geom = "text", aes(label = round(..y.., 1)), vjust = -1, color = "red", show.legend = FALSE) +
  coord_cartesian(ylim = c(150, 220))

Box Plot #2

  • 첫 번재, 두 번째, 네 번째 stat_summary() 함수를 사용하여  최대값, 평균값, 최소값 을 텍스트로 표시
    • geom = "text"로 지정
    • aes(label = round(..y.., 1))로 지정하여 수치를 소수점 첫 번째 자리까지 반올림하여 표시
    • ..y..는 stat_summary() 함수 내에서 사용되는 특수한 변수로, fun = mean으로 stat_summary() 함수를 사용하면, ..y..는 각 그룹의 평균을 반환  (fun = max는 최대값, fun = min은 최소값)
    • vjust : 텍스트의 세로 위치를 조정합니다. 음수 값은 아래쪽으로, 양수 값은 위쪽으로 조정
    • 평균은 vjust = -1로 설정하여 텍스트가 점 위쪽에 표시하고, show.legend = FALSE로 지정하여 범례에는 해당 텍스트가 나타나지 않도록 설정
  • 세 번째 stat_summary() 함수를 사용하여 평균 위치 표시
    • geom = "point"로 지정하여 점 형태로 표시
    • color = "red"로 지정하여 빨간색으로 표시되도록 하고, size = 3로 지정하여 점의 크기를 설정
    • shape = 20로 지정하여 점의 모양을 둥근 점으로 설정
  • coord_cartesian(ylim = c(150, 220))를 추가하여 y축의 범위를 150부터 220까지로 설정하여, 
    y축을 150부터 220까지 표시

최고 신장 선수와 최저 신장 선수 찾기

slam_dunk_total[which.max(slam_dunk_total$height),]
         uniform_no      name      height     weight      blood type     age    position    school
 48                  15     신현필         210         130          NA               17           C         산왕
slam_dunk_total[which.min(slam_dunk_total$height),]
         uniform_no      name      height     weight      blood type     age    position    school
 31                  15     홍익현         160           42          NA               18           G         해남
  • 키 범위(최대 키와 최소 키의 차이) 결과 처럼, 산왕고 Box Plot의 높이가 가장 높고, 풍전고 Box Plot 높이가 가장 낮음 
  • Box Plot #2을 보면, 평균 신장은 성북고가 가장 낮고, 산왕고(189)와 상양고(188)가 비슷하게 높게 나타남
  • Box Plot #1 (또는 #2)을 보면, 해남고는 이상치가 있음 (매우 낮은 데이터)
  • 최고 신장은 산왕고 신현필 (210)이고, 최저 신장은 해남고 홍익현(160)

CSV 파일 저장하기

fileEncoding = "cp949"

write.csv (compare_team, "compare_team.csv", fileEncoding = "cp949")

compare_team.csv

fileEncoding = "EUC-KR"

write.csv (compare_team, "compare_team2.csv", fileEncoding = "EUC-KR")

compare_team2.csv

728x90