빅데이터 분석과 R 프로그래밍 1: Ⅲ. R 데이터구조

  • POSTECH에서 제공하는 MOOC 중, 빅데이터분석과 R프로그래밍 Ⅰ 과정입니다.

1. R 데이터 생성

파일 불러들이기

  1. csv

    brain <- read.csv(“week3_2/brain2210.csv”, header=T)

  2. xls

  • *.xls 파일인 경우, 데이터를 csv(comma separated value)로 저장한
    다음 read.csv 함수를 사용해 r로 불러들이는 게 편리
  • readxl로도 가능함
  1. txt
파일을 부를 이름 <- read.table(file = "파일명.txt, na = " ", header = TRUE)

데이터 저장 폴더

  • 데이터와 프로그램 저장 폴더 지정
    • 폴더 이름은 영문으로 생성할 것
  • r 프로그램의 기본 경로 지정하는 명령어
# change working directory
#set working directory
setwd("경로") 

# check the current working directory
getwd()

데이터와 변수 이름

attach를 사용하면 정의된 파일 이름 입력 없이 바로 항목 조회가 가능

# attach 사용  
attach(brain)  

# 원래대로라면  
table(brain$sex)  

## 
##   f   m 
##  77 108

# attach를 쓰고 나면  
table(sex)  

## sex
##   f   m 
##  77 108

2. R 데이터 활용 Ⅰ

데이터 추출_subset

  • subset(데이터 이름, 조건)
    예제 1. brain 데이터에서 female만 있는 subset 데이터 생성
brainf <- subset(brain, sex = "f")
mean(brainf$wt)

## [1] 1206.822

예제 2. brain 데이터에서 wt < 1300 이하인 데이터 생성

# subset with wt < 1300
brain1300 <- subset(brain, brain$wt < 1300)

# same subset of brain1300
# brain1300 <- subset(brain, !brain@wt => 1300)
summary(brain1300)

##        wt           sex           
##  Min.   : 915   Length:138        
##  1st Qu.:1074   Class :character  
##  Median :1155   Mode  :character  
##  Mean   :1145                     
##  3rd Qu.:1230                     
##  Max.   :1289

# subset with female
# brainf <- subset(brain, sex = "f")
brainf <- subset(brain, sex == "f")
mean(brainf$wt)

## [1] 1117.169

sd(brainf$wt)

## [1] 98.97094

# subset with male
brainm <- subset(brain, sex == "m")
mean(brainm$wt)

## [1] 1270.741

sd(brainm$wt)

## [1] 129.22

요약통계치 (그룹별)_aggregate

  • aggregate(변수~그룹, 데이터, 함수)
# 'aggregate' for statistics by group
aggregate(wt~sex, data = brain, FUN = mean)

##   sex       wt
## 1   f 1117.169
## 2   m 1270.741

aggregate(wt~sex, data = brain, FUN = sd)

##   sex        wt
## 1   f  98.97094
## 2   m 129.21997
  • 추출한 데이터의 활용 (그룹별 히스토그램)
# histogram for female and male
# 2*2 multiple plot
par(mfrow=c(2,2))
brainf<-subset(brain,brain$sex=='f') 
hist(brainf$wt, breaks = 12,col = "green",cex=0.7, main="Histogram (Female)" ,xlab="brain weight")

# subset with male
brainm<-subset(brain,brain$sex=='m') 
hist(brainm$wt, breaks = 12,col = "orange", main="Histogram with (Male)" ,  xlab="brain weight")

  • 추출한 데이터의 활용
# histogram with same scale
hist(brainf$wt, breaks = 12,col = "green",cex=0.7, main="Histogram with Normal Curve (Female)" , xlim=c(900,1700),ylim=c(0,25), xlab="brain weight")

hist(brainm$wt, breaks = 12,col = "orange", main="Histogram with Normal Curve (Male)" , xlim=c(900,1700), ylim=c(0,25),xlab="brain weight")

  • csv로 내보내기
# plot margin
# par(mar=c(2,2,2,2))

# export csv file - write out to csv file 
write.table(brainf,file="week3_2/brainf.csv", row.names = FALSE, sep=",", na=" ")

write.csv(brainf,file="week3_2/brainf.csv", row.names = FALSE)

# export txt file 
write.table(brainm, file="week3_2/brainm.txt", row.names = FALSE,  na=" ")
  • 퀴즈
    brain1000 <- subset(brain, brain$wt < 1000) brain1000

table(brain1000)

3. R 데이터 활용 Ⅱ

dplyr 패키지

library(dplyr)

## 
## Attaching package: 'dplyr'

## The following objects are masked from 'package:stats':
## 
##     filter, lag

## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

car <- read.csv("week3_3/autompg.csv")
head(car)

##   mpg cyl disp hp   wt accler year origin                   carname
## 1  18   8  307 17 3504   12.0   70      1 chevrolet chevelle malibu
## 2  15   8  350 35 3693   11.5   70      1         buick skylark 320
## 3  18   8  318 29 3436   11.0   70      1        plymouth satellite
## 4  16   8  304 29 3433   12.0   70      1             amc rebel sst
## 5  17   8  302 24 3449   10.5   70      1               ford torino
## 6  15   8  429 42 4341   10.0   70      1          ford galaxie 500

데이터 구조 파악하기

# 데이터의 수와 변수는?
dim(car)

## [1] 398   9

# 데이터 수: 398개, 변수: 9개

# 데이터 전체 주고 파악하기: str 함수
str(car)

## 'data.frame':    398 obs. of  9 variables:
##  $ mpg    : num  18 15 18 16 17 15 14 14 14 15 ...
##  $ cyl    : int  8 8 8 8 8 8 8 8 8 8 ...
##  $ disp   : num  307 350 318 304 302 429 454 440 455 390 ...
##  $ hp     : num  17 35 29 29 24 42 47 46 48 40 ...
##  $ wt     : int  3504 3693 3436 3433 3449 4341 4354 4312 4425 3850 ...
##  $ accler : num  12 11.5 11 12 10.5 10 9 8.5 10 8.5 ...
##  $ year   : int  70 70 70 70 70 70 70 70 70 70 ...
##  $ origin : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ carname: chr  "chevrolet chevelle malibu" "buick skylark 320" "plymouth satellite" "amc rebel sst" ...

# num: 실수, int: 정수

# 데이터 요약하기: summary 함수
summary(car)

##       mpg             cyl             disp             hp              wt      
##  Min.   : 9.00   Min.   :3.000   Min.   : 68.0   Min.   : 1.00   Min.   :1613  
##  1st Qu.:17.50   1st Qu.:4.000   1st Qu.:104.2   1st Qu.:26.00   1st Qu.:2224  
##  Median :23.00   Median :4.000   Median :148.5   Median :60.50   Median :2804  
##  Mean   :23.51   Mean   :5.455   Mean   :193.4   Mean   :51.39   Mean   :2970  
##  3rd Qu.:29.00   3rd Qu.:8.000   3rd Qu.:262.0   3rd Qu.:79.00   3rd Qu.:3608  
##  Max.   :46.60   Max.   :8.000   Max.   :455.0   Max.   :94.00   Max.   :5140  
##      accler           year           origin        carname         
##  Min.   : 8.00   Min.   :70.00   Min.   :1.000   Length:398        
##  1st Qu.:13.82   1st Qu.:73.00   1st Qu.:1.000   Class :character  
##  Median :15.50   Median :76.00   Median :1.000   Mode  :character  
##  Mean   :15.57   Mean   :76.01   Mean   :1.573                     
##  3rd Qu.:17.18   3rd Qu.:79.00   3rd Qu.:2.000                     
##  Max.   :24.80   Max.   :82.00   Max.   :3.000

# 데이터 요약통계치(빈도 구하기): table 함수
attach(car) # attach를 쓰면 변수에 이름을 안 써도 됨

## The following object is masked from brain:
## 
##     wt

table(origin)

## origin
##   1   2   3 
## 249  70  79

table(year)

## year
## 70 71 72 73 74 75 76 77 78 79 80 81 82 
## 29 28 28 40 27 30 34 28 36 29 29 29 31

# 데이터 요약통계치 (평균, 표준편차): mean
mean(mpg)

## [1] 23.51457

mean(hp)

## [1] 51.38945

mean(wt)

## [1] 2970.425

4. 데이터 핸들링

dplyr 활용

dplyr: 전처리 과정을 하기 위한 편리한 기능

library(dplyr)

attach(car)

## The following objects are masked from car (pos = 3):
## 
##     accler, carname, cyl, disp, hp, mpg, origin, wt, year

## The following object is masked from brain:
## 
##     wt

str(car)

## 'data.frame':    398 obs. of  9 variables:
##  $ mpg    : num  18 15 18 16 17 15 14 14 14 15 ...
##  $ cyl    : int  8 8 8 8 8 8 8 8 8 8 ...
##  $ disp   : num  307 350 318 304 302 429 454 440 455 390 ...
##  $ hp     : num  17 35 29 29 24 42 47 46 48 40 ...
##  $ wt     : int  3504 3693 3436 3433 3449 4341 4354 4312 4425 3850 ...
##  $ accler : num  12 11.5 11 12 10.5 10 9 8.5 10 8.5 ...
##  $ year   : int  70 70 70 70 70 70 70 70 70 70 ...
##  $ origin : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ carname: chr  "chevrolet chevelle malibu" "buick skylark 320" "plymouth satellite" "amc rebel sst" ...

변수 추출: select

car 데이터에서 mpg, hp 변수만 추출

# Data handling usin "dplyr"
# 1 subset data: selecting a few variables
set1 <- select(car, mpg, hp)
head(set1)

##   mpg hp
## 1  18 17
## 2  15 35
## 3  18 29
## 4  16 29
## 5  17 24
## 6  15 42

car 데이터에서 mpg로 시작하는 변수를 제외

# 2 subset data: drop variables with -
set2 <- select(car, -starts_with("mpg"))
head(set2)

##   cyl disp hp   wt accler year origin                   carname
## 1   8  307 17 3504   12.0   70      1 chevrolet chevelle malibu
## 2   8  350 35 3693   11.5   70      1         buick skylark 320
## 3   8  318 29 3436   11.0   70      1        plymouth satellite
## 4   8  304 29 3433   12.0   70      1             amc rebel sst
## 5   8  302 24 3449   10.5   70      1               ford torino
## 6   8  429 42 4341   10.0   70      1          ford galaxie 500

데이터 추출: filter

  • 조건에 맞는 데이터 추출: filter(데이터, 변수 조건, …)
    car 데이터에서 mpg가 30보다 큰 행 추출
# 3 subset data: filter mpg > 50
set3 <- filter(car, mpg > 30)
head(set3)

##   mpg cyl disp hp   wt accler year origin             carname
## 1  31   4   71 62 1773   19.0   71      3 toyota corolla 1200
## 2  35   4   72 66 1613   18.0   71      3         datsun 1200
## 3  31   4   79 64 1950   19.0   74      3         datsun b210
## 4  32   4   71 62 1836   21.0   74      3 toyota corolla 1200
## 5  31   4   76 53 1649   16.5   74      3       toyota corona
## 6  32   4   83 58 2003   19.0   74      3          datsun 710

변수 생성: mutate

  • mutate(새로운 변수 이름 = 기존 변수 활용)
  • %>% 파이프 연산자: 연산자 사용하여 연결
# create a derived variable
set4 <- car %>%
   filter(!is.na(mpg)) %>%
   mutate(mpg_km = mpg*1.609)
head(set4)

##   mpg cyl disp hp   wt accler year origin                   carname mpg_km
## 1  18   8  307 17 3504   12.0   70      1 chevrolet chevelle malibu 28.962
## 2  15   8  350 35 3693   11.5   70      1         buick skylark 320 24.135
## 3  18   8  318 29 3436   11.0   70      1        plymouth satellite 28.962
## 4  16   8  304 29 3433   12.0   70      1             amc rebel sst 25.744
## 5  17   8  302 24 3449   10.5   70      1               ford torino 27.353
## 6  15   8  429 42 4341   10.0   70      1          ford galaxie 500 24.135

# filter: car 데이터 mpg열의 NA가 아닌 모든 데이터 추출
# mutate: 기존 mpg열을 사용해 새로운 mpg_km열 생성

데이터 요약 통계치(평균)

  • summarize(mean(변수이름))
# mean and standard deviation
car %>%
   summarize(mean(mpg), mean(hp), mean(wt))

##   mean(mpg) mean(hp) mean(wt)
## 1  23.51457 51.38945 2970.425

# 몇 개 변수의 평균값 한 번에 구하기
select(car, 1:6) %>%
   colMeans() # 데이터를 열로 재구성하여 평균값 구함

##         mpg         cyl        disp          hp          wt      accler 
##   23.514573    5.454774  193.425879   51.389447 2970.424623   15.568090

백터화 요약치: summarize_all(FUN)

  • 열추출하여 기술통계치 구하고 요약치 보기
a1 <- select(car, 1:6) %>% summarize_all(mean)
a2 <- select(car, 1:6) %>% summarize_all(sd)
a3 <- select(car, 1:6) %>% summarize_all(min)
a4 <- select(car, 1:6) %>% summarize_all(max)

table1 <- data.frame(rbind(a1,a2,a3,a4))
rownames(table1) <- c("mean", "sd", "min", "max") # data.frame을 tbl_df로 전환시켰으므로 data.frame으로 원상복귀하여 행 이름을 바꿈

table1

##            mpg      cyl     disp       hp        wt    accler
## mean 23.514573 5.454774 193.4259 51.38945 2970.4246 15.568090
## sd    7.815984 1.701004 104.2698 29.93236  846.8418  2.757689
## min   9.000000 3.000000  68.0000  1.00000 1613.0000  8.000000
## max  46.600000 8.000000 455.0000 94.00000 5140.0000 24.800000

그룹별 통계량: group_by

  • group_by(변수), summarize(__=FUN()) 그룹별 요약통계량 구하기
# summary statistics by group variable
car %>%
   group_by(cyl) %>%
   summarize(mean_mpg = mean(mpg), na.rm = TRUE)

## `summarise()` ungrouping output (override with `.groups` argument)

## # A tibble: 5 x 3
##     cyl mean_mpg na.rm
##   <int>    <dbl> <lgl>
## 1     3     20.6 TRUE 
## 2     4     29.3 TRUE 
## 3     5     27.4 TRUE 
## 4     6     20.0 TRUE 
## 5     8     15.0 TRUE

# group_by: car 데이터의 cyl열을 그룹으로 묶음
# summarize: cyl그룹의 mpg 평균을 구함
# na.rm = TURE: 통계 분석 시 결측값을 제외
  • 퀴즈
height <- c(165, 170, 155, 185)  
weight <- c(55, 65, 50, 110)  
gender <- c("Female", "Male", "Female", "Male")

df <- data.frame(height, weight, gender)

df

##   height weight gender
## 1    165     55 Female
## 2    170     65   Male
## 3    155     50 Female
## 4    185    110   Male

df %>% 
   group_by(height) %>%
   summarize(result = mean(gender))

## Warning in mean.default(gender): argument is not numeric or logical: returning
## NA

## Warning in mean.default(gender): argument is not numeric or logical: returning
## NA

## Warning in mean.default(gender): argument is not numeric or logical: returning
## NA

## Warning in mean.default(gender): argument is not numeric or logical: returning
## NA

## `summarise()` ungrouping output (override with `.groups` argument)

## # A tibble: 4 x 2
##   height result
##    <dbl>  <dbl>
## 1    155     NA
## 2    165     NA
## 3    170     NA
## 4    185     NA

summarize(group_by(df, gender), result=mean(height))

## `summarise()` ungrouping output (override with `.groups` argument)

## # A tibble: 2 x 2
##   gender result
##   <chr>   <dbl>
## 1 Female   160 
## 2 Male     178.

filter(df, gender = c("Male", "Female")) %>%
   summarize(result = mean())

## Error: Problem with `filter()` input `..1`.
## x Input `..1` is named.
## i This usually means that you've used `=` instead of `==`.
## i Did you mean `gender == c("Male", "Female")`?

df %>%
   select(height) %>%
   summarize(result = mean(gender))

## Warning in mean.default(gender): argument is not numeric or logical: returning
## NA

##   result
## 1     NA
Share