R 데이터 분석 기초

데이터 파악하기

  • head() : 데이터 앞부분 출력
  • tail() : 데이터 뒷부분 출력
  • View() : 뷰어 창에서 데이터 확인
  • dim() : 데이터 차원 출력 (Dimension)
  • str() : 데이터 속성 출력 (Structure)
  • summary() : 요약통계량 출력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
exam <- read.csv("csv_exam.csv")
head(exam)
## id class math english science
## 1 1 1 50 98 50
## 2 2 1 60 97 60
## 3 3 1 45 86 78
## 4 4 1 30 98 58
## 5 5 2 25 80 65
## 6 6 2 50 89 98

head(exam, 10)
## id class math english science
## 1 1 1 50 98 50
## 2 2 1 60 97 60
## 3 3 1 45 86 78
## 4 4 1 30 98 58
## 5 5 2 25 80 65
## 6 6 2 50 89 98
## 7 7 2 80 90 45
## 8 8 2 90 78 25
## 9 9 3 20 98 15
## 10 10 3 50 98 45

tail(exam)
## id class math english science
## 15 15 4 75 56 78
## 16 16 4 58 98 65
## 17 17 5 65 68 98
## 18 18 5 80 78 90
## 19 19 5 89 68 87
## 20 20 5 78 83 58

tail(exam, 10)
## id class math english science
## 11 11 3 65 65 65
## 12 12 3 45 85 32
## 13 13 4 46 98 65
## 14 14 4 48 87 12
## 15 15 4 75 56 78
## 16 16 4 58 98 65
## 17 17 5 65 68 98
## 18 18 5 80 78 90
## 19 19 5 89 68 87
## 20 20 5 78 83 58

View(exam)

dim(exam)
## [1] 20 5

str(exam)
## 'data.frame': 20 obs. of 5 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ class : int 1 1 1 1 2 2 2 2 3 3 ...
## $ math : int 50 60 45 30 25 50 80 90 20 50 ...
## $ english: int 98 97 86 98 80 89 90 78 98 98 ...
## $ science: int 50 60 78 58 65 98 45 25 15 45 ...

summary(exam)
## id class math english science
## Min. : 1.00 Min. :1 Min. :20.00 Min. :56.0 Min. :12.00
## 1st Qu.: 5.75 1st Qu.:2 1st Qu.:45.75 1st Qu.:78.0 1st Qu.:45.00
## Median :10.50 Median :3 Median :54.00 Median :86.5 Median :62.50
## Mean :10.50 Mean :3 Mean :57.45 Mean :84.9 Mean :59.45
## 3rd Qu.:15.25 3rd Qu.:4 3rd Qu.:75.75 3rd Qu.:98.0 3rd Qu.:78.00
## Max. :20.00 Max. :5 Max. :90.00 Max. :98.0 Max. :98.00
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
mpg <- as.data.frame(ggplot2::mpg)
head(mpg)
## manufacturer model displ year cyl trans drv cty hwy fl class
## 1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact
## 2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact
## 3 audi a4 2.0 2008 4 manual(m6) f 20 31 p compact
## 4 audi a4 2.0 2008 4 auto(av) f 21 30 p compact
## 5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
## 6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compact

tail(mpg)
## manufacturer model displ year cyl trans drv cty hwy fl class
## 229 volkswagen passat 1.8 1999 4 auto(l5) f 18 29 p midsize
## 230 volkswagen passat 2.0 2008 4 auto(s6) f 19 28 p midsize
## 231 volkswagen passat 2.0 2008 4 manual(m6) f 21 29 p midsize
## 232 volkswagen passat 2.8 1999 6 auto(l5) f 16 26 p midsize
## 233 volkswagen passat 2.8 1999 6 manual(m5) f 18 26 p midsize
## 234 volkswagen passat 3.6 2008 6 auto(s6) f 17 26 p midsize

View(mpg)

dim(mpg)
## [1] 234 11

str(mpg)
## 'data.frame': 234 obs. of 11 variables:
## $ manufacturer: chr "audi" "audi" "audi" "audi" ...
## $ model : chr "a4" "a4" "a4" "a4" ...
## $ displ : num 1.8 1.8 2 2 2.8 2.8 3.1 1.8 1.8 2 ...
## $ year : int 1999 1999 2008 2008 1999 1999 2008 1999 1999 2008 ...
## $ cyl : int 4 4 4 4 6 6 6 4 4 4 ...
## $ trans : chr "auto(l5)" "manual(m5)" "manual(m6)" "auto(av)" ...
## $ drv : chr "f" "f" "f" "f" ...
## $ cty : int 18 21 20 21 16 18 18 18 16 20 ...
## $ hwy : int 29 29 31 30 26 26 27 26 25 28 ...
## $ fl : chr "p" "p" "p" "p" ...
## $ class : chr "compact" "compact" "compact" "compact" ...

summary(mpg)
## manufacturer model displ year
## Length:234 Length:234 Min. :1.600 Min. :1999
## Class :character Class :character 1st Qu.:2.400 1st Qu.:1999
## Mode :character Mode :character Median :3.300 Median :2004
## Mean :3.472 Mean :2004
## 3rd Qu.:4.600 3rd Qu.:2008
## Max. :7.000 Max. :2008
## cyl trans drv cty
## Min. :4.000 Length:234 Length:234 Min. : 9.00
## 1st Qu.:4.000 Class :character Class :character 1st Qu.:14.00
## Median :6.000 Mode :character Mode :character Median :17.00
## Mean :5.889 Mean :16.86
## 3rd Qu.:8.000 3rd Qu.:19.00
## Max. :8.000 Max. :35.00
## hwy fl class
## Min. :12.00 Length:234 Length:234
## 1st Qu.:18.00 Class :character Class :character
## Median :24.00 Mode :character Mode :character
## Mean :23.44
## 3rd Qu.:27.00
## Max. :44.00

데이터 수정하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
install.packages("dplyr")
library(dplyr)

?dplyr

df_raw <- data.frame(var1 = c(1, 2, 1),
var2 = c(2, 3, 3))
df_raw
## var1 var2
## 1 1 2
## 2 2 3
## 3 1 3

df_new <- df_raw
df_new
## var1 var2
## 1 1 2
## 2 2 3
## 3 1 3

df_new <- rename(df_new, v2 = var2) # dplyr 함수, '새 변수명 = 기존 변수명'
df_new
## var1 v2
## 1 1 2
## 2 2 3
## 3 1 3

실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
'''
Q1. ggplot2 패키지의 mpg 데이터를 사용할 수 있도록 불러온 뒤 복사본을 만드세요.
'''
mpg <- as.data.frame(ggplot2::mpg)
mpg_new <- mpg

'''
Q2. 복사본 데이터를 이용해서 cty는 city로, hwy는 highway로 변수명을 수정하세요.
'''
mpg_new <- rename(mpg_new, city = cty, highway = hwy)

'''
Q3. 데이터 일부를 출력해서 변수명이 바뀌었는지 확인해 보세요.
'''
head(mpg_new)

데이터에 새로운 변수 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
df <- data.frame(var1 = c(4, 3, 8),
var2 = c(2, 6, 1))
df
## var1 var2
## 1 4 2
## 2 3 6
## 3 8 1

df$var_sum <- df$var1 + df$var2
df
## var1 var2 var_sum
## 1 4 2 6
## 2 3 6 9
## 3 8 1 9

df$var_mean <- (df$var1 + df$var2)/2
df
## var1 var2 var_sum var_mean
## 1 4 2 6 3.0
## 2 3 6 9 4.5
## 3 8 1 9 4.5

''' 각 차량의 연비의 평균 구하기 '''
mpg$total <- (mpg$cty + mpg$hwy) / 2


''' 연비의 총 평균 구하기 '''
mean(mpg$total)
## [1] 20.14957

summary(mpg$total)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.50 15.50 20.50 20.15 23.50 39.50
hist(mpg$total)


''' 연비에 따른 합겹 불합격 구분 '''
mpg$test <- ifelse(mpg$total >= 20, "pass", "fail")
head(mpg, 10)
head(mpg$test,20)
## [1] "pass" "pass" "pass" "pass" "pass" "pass" "pass" "pass" "pass" "pass" "pass"
## [12] "pass" "pass" "pass" "pass" "fail" "pass" "fail" "fail" "fail"

''' 합격, 불합격 갯수 '''
qplot(mpg$test)
table(mpg$test)
## fail pass
## 106 128

mpg$grade <- ifelse(mpg$total >= 30, "A",
ifelse(mpg$total >= 20, "B", "c"))
head(mpg, 20)
table(mpg$grade)
## A B c
## 10 118 106
qplot(mpg$grade)

mpg$grade2 <- ifelse(mpg$total >= 30, "A",
ifelse(mpg$total >= 25, "B",
ifelse(mpg$total >= 20, "C", "D")))

실습

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'''
ggplot2 패키지에는 미국 동북중부 437개 지역의 인구통계 정보를 담은 midwest라는 데이터가 포함되어 있습니다.
midwest 데이터를 사용해 데이터 분석 문제를 해결해보세요.
'''


''' Q1.ggplot2의 midwest 데이터를 데이터 프레임 형태로 불러와서 데이터의 특성을 파악하세요. '''
midwest <- as.data.frame(ggplot2::midwest)
midwest
head(midwest,5)
tail(midwest,5)
View(midwest)
dim(midwest)
str(midwest)
summary(midwest)

''' Q2.poptotal(전체 인구)을 total로, popasian(아시아 인구)을 asian으로 변수명을 수정하세요. '''
midwest <- rename(midwest, total = poptotal, asian = popasian)
head(midwest, 5)

''' Q3.total, asian 변수를 이용해 '전체 인구 대비 아시아 인구 백분율'파생변수를 만들고, 히스토그램을 만들어 도시들이 어떻게 분포하는지 살펴보세요. '''
midwest$percasian <- (midwest$asian / midwest$total)*100
head(midwest, 5)
hist(midwest$percasian)

''' Q4.아시아 인구 백분율 전체 평균을 구하고, 평균을 초과하면 "large", 그 외에는 "small"을 부여하는 파생변수를 만들어 보세요. '''
mean(midwest$percasian)
midwest$percasiantotal <- ifelse(midwest$percasian > mean(midwest$percasian), "large", "small")
head(midwest, 10)

''' Q5."large"와 "small"에 해당하는 지역이 얼마나 되는지, 진도표와 빈도막대그래프로 만들어서 확인해보세요. '''
table(midwest$percasiantotal)
qplot(midwest$percasiantotal)

정리하기

1.데이터 준비, 패키지 준비

1
2
3
mpg <- as.data.frame(ggplot2::mpg)  # 데이터 불러오기
library(dplyr) # dplyr 로드
library(ggplot2) # ggplot2 로드

2.데이터 파악

1
2
3
4
5
6
head(mpg)     # Raw 데이터 앞부분
tail(mpg) # Raw 데이터 뒷부분
View(mpg) # Raw 데이터 뷰어창에서 확인
dim(mpg) # 차원
str(mpg) # 속성
summary(mpg) # 요약 통계량

3.변수명 수정

1
mpg <- rename(mpg, company = manufacturer)

4.파생변수 생성

1
2
mpg$total <- (mpg$cty + mpg$hwy)/2                    # 변수 조합
mpg$test <- ifelse(mpg$total >= 20, "pass", "fail") # 조건문 활용

5.빈도 확인

1
2
table(mpg$test)   # 빈도표 출력
qplot(mpg$test) # 막대 그래프 활용

Comments