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

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

by Vitaminymc 2023. 8. 1.
반응형

타학교_농구부.xlsx
0.01MB

데이터 가공 및 분석

엑셀을 활용하여 데이터를 가공하며, 특히 엑셀의 피벗 기능을 자유 사용하게 된다.

그러나, 데이터가 일부 변경되는 경우에 새로고침으로 피벗을 업데이트 할 수 있으나,
데이터 전체가 변경되는 경우에는 새롭게 피벗을 작성해야 한다.

(물론 기존 데이터에 어퍼 씌울 수도 있으나, 동일한 열과 행이 아니라면...)

엑셀대시 Rstudio를 사용하는 이유 중에 하나는 반복성이다. 데이터는 변경되나, 동일한 데이터 분석을 한다면, Rstuido에 코드만 잘 정리해 놓으면, 다음 부터는 엑셀보다 편하게 가공 및 분석할 수 있다.

슬램덩크 상북고 학년(나이)별 평균, 최소, 최대 신장

엑셀 피벗

 

Rstudio

library(tidyverse)

slam_dunk %>% drop_na(height) %>%   #결측치 제외
  group_by(age) %>%                               #나이별로 group_by()
  summarise(
    lower = min (height),                             #최소값 : min()
    average = mean (height),                      #평균값 : mean()
    upper = max (height),                            #최대값 : max()
    difference = max(height) - min(height)  # 범위 : 최대값 - 최소값
  ) %>%
  arrange (desc(age))                                #내람차순 (descending, 큰 값부터 작은 값 순으로 결과 표시) : dese ()
arrange (desc(age))  결과


# A tibble: 3 × 5
    age lower average upper difference
  <dbl> <dbl>   <dbl> <dbl>      <dbl>
1    19   178    186.   197         19
2    18   164    170.   180         16
3    17   162    176.   189         27
arrange (age)  결과

# A tibble: 3 × 5
    age lower average upper difference
  <dbl> <dbl>   <dbl> <dbl>      <dbl>
1    17   162    176.   189         27
2    18   164    170.   180         16
3    19   178    186.   197         19
slam_dunk$age <- as.factor(slam_dunk$age)

slam_dunk %>%
ggplot(aes(x= age, y=height)) + geom_boxplot()

다른 학교 데이터 불러오기 + 합치기

(나무위키) Slam Dunk 등장 학교 학교별 선수 데이터 취합 

library(readxl)

slam_dunk2 <- read_excel("타학교_농구부.xlsx") 

str(slam_dunk2)
tibble [36 × 8] (S3: tbl_df/tbl/data.frame)
 $ uniform_no: num [1:36] 4 5 6 7 8 13 11 15 4 5 ...
 $ name      : chr [1:36] "변덕규" "허태환" "안영수" "정대협" ...
 $ height    : num [1:36] 202 183 174 190 170 188 188 165 178 197 ...
 $ weight    : chr [1:36] "90" "NA" "62" "79" ...
 $ blood type: chr [1:36] "NA" "NA" "NA" "NA" ...
 $ age       : num [1:36] 19 19 18 18 18 18 17 17 19 18 ...
 $ position  : chr [1:36] "C" "F" "G" "F" ...
 $ school    : chr [1:36] "능남" "능남" "능남" "능남" ...

rbind

  • rbind 함수는 row bind(행 연결)의 약자로, 여러 개의 데이터 프레임을 행으로 합치는 데 사용
  • 합치려는 데이터 프레임들의 열 수와 데이터 타입이 일치해야 함
  • 열 수가 다르거나 열의 이름이 일치하지 않는 경우 오류가 발생할 수 있음
  • 데이터 프레임의 크기가 매우 큰 경우, rbind 함수는 성능 저하를 일으킬 수 있으므로 주의해야 함
    • rbind 함수가 데이터를 합치기 위해 새로운 데이터 프레임을 생성하고 그 안에 데이터를 복사하기 때문에, 데이터 프레임의 크기가 크면 데이터를 복사하는데 많은 시간과 메모리가 필요하게 되므로 성능 저하 가능성 잠재
  • 데이터 프레임을 합치기 위한 다른 방법으로는 data.table 패키지의 rbindlist 함수가 있음
slam_dunk3 <- rbind (slam_dunk, slam_dunk2)
Error in rbind(deparse.level, ...) : 
  numbers of columns of arguments do not match
  • 두 데이터 프레임의 변수(Field, Column)가 다르기 때문에 Error 발생
names(slam_dunk#slam_dunk의 변수명 확인
[1] "uniform_no" "name"       "height"     "weight"     "blood type" "age"       
[7] "position" 

names(slam_dunk2) #slam_dunk2의 변수명 확인
[1] "uniform_no" "name"       "height"     "weight"     "blood type" "age"       
[7] "position"   "school" 
slam_dunk2$school <- "상북"  #slam_dunk 데이터 프레임에 school이라는 변수를 추가하고, 데이터는 모두 '상북'으로 반영

slam_dunk_total <- rbind (slam_dunk, slam_dunk)

str(slam_dunk_total)
tibble [48 × 8] (S3: tbl_df/tbl/data.frame)
 $ uniform_no: Factor w/ 12 levels "4","5","6","7",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ name      : chr [1:48] "채치수" "권준호" "이달재" "송태섭" ...
 $ height    : num [1:48] 197 178 164 168 170 180 189 187 170 171 ...
 $ weight    : chr [1:48] "90" "62" "NA" "59" ...
 $ blood type: chr [1:48] "A" "A" "NA" "B" ...
 $ age       : num [1:48] 19 19 18 18 18 18 17 17 17 17 ...
 $ position  : chr [1:48] "C" "SF" "PG" "PG" ...
 $ school    : chr [1:48] "상북" "상북" "상북" "상북" ...
  • slam_dunk의 12개 데이터와 slam_dunk2의 36개 데이터가 합쳐져서
    48개 데이터를 가진 slam_dunk_total 데이터 프레임 생성

rbindlist

  • 'data.table' 패키지에 포함되어 있는 함수
  • rbindlist 함수는 데이터를 복사하지 않고 데이터 테이블을 효율적으로 합칩
  • 이로 인해 대용량 데이터를 다룰 때 성능이 우수
rm(slam_dunk_total)  #합쳐진 데이터 프레임 'slam_dunk_total' 삭제

slam_dunk <- read_excel ("상북고_농구부.xlsx")  # school 필드가 없는 데이터 프레임을 사용하기 위해서 해당 엑셀파일 다시 불러오기
install.packages('data.table')  #data.table 패키지 설치

library(data.table)  #data.table 패키지 불러오기

slam_dunk_total  <- rbindlist(list(slam_dunk, slam_dunk2))
Error in rbindlist(list(slam_dunk, slam_dunk2)) : 
  Item 2 has 8 columns, inconsistent with item 1 which has 7 columns. To fill missing columns use fill=TRUE.
slam_dunk$school <- "상북"

slam_dunk_total  <- rbindlist(list(slam_dunk, slam_dunk2))

str(slam_dunk_total)

Classes ‘data.table’ and 'data.frame': 48 obs. of  8 variables:
 $ uniform_no: num  4 5 6 7 8 9 10 11 12 13 ...
 $ name      : chr  "채치수" "권준호" "이달재" "송태섭" ...
 $ height    : num  197 178 164 168 170 180 189 187 170 171 ...
 $ weight    : chr  "90" "62" NA "59" ...
 $ blood type: chr  "A" "A" NA "B" ...
 $ age       : num  19 19 18 18 18 18 17 17 17 17 ...
 $ position  : chr  "C" "SF" "PG" "PG" ...
 $ school    : chr  "상북" "상북" "상북" "상북" ...
 - attr(*, ".internal.selfref")=<externalptr> 

 

728x90