본문 바로가기
R연습 200제/02_00. (R)데이터객체,벡터,행렬

제4강 4.2 데이터프레임 요소 접근하기 & 통계분석

by 통컨이 2020. 7. 25.
728x90

데이터프레임에서 변수를 읽어 들이는 방법은 여러 가지가 있습니다.

이렇게 읽어들이 변수명들을 이용하여 새로운 변수를 만든다.

이를 이용하여 새로운 외부 파일을 만들거나, 추출하기도 합니다.

 

1. 위치번호로 요소 접근하기

 

> health[1,]

> health[1:2,]

> health[,2]

> health[,2:3]

 

(실습)

1. 데이터프레임(health) 에서 1 번째 관측치를 프린트하기

2. 데이터프레임 health 에서 1~2 번째 관측치를 프린트하기

3. 두 번째 변수 hei를 프린트하기.

4. ~세 번째 변수 hei, wei를 프린트하기

 

(실행결과 및 설명)

 

> health[1,]
데이터프레임(health) 에서 1 번째 관측치를 프린트합니다.

gender hei wei hei_wei

1 F 161 45 16145

 

> health[1:2,]
데이터프레임 health 에서 1~2 번째 관측치를 프린트합니다.

gender hei wei hei_wei

1 F 161 45 16145

2 F 162 49 16249

 

> health[,2]
# 두 번째 변수 hei를 프린트합니다.

[1] 161 162 163 164 161 162 163 164

 

> health[,2:3]
# ~세 번째 변수 hei, wei를 프린트합니다.

 

hei wei

1 161 45

2 162 49

3 163 53

4 164 67

5 161 72

6 162 72

7 163 73

8 164 74

2. 변수명으로 요소 접근하기

 

> health$gender

> health$hei

> health[gender]

> health[,gender]

 

> health$gender
# 데이터프레임 health 에서 gender 변수를 프린트합니다.

[1] F F M M F F M M

Levels: F M

 

> health$hei

# 데이터프레임 health 에서 hei 변수를 프린트합니다.

 

 

3. 새로운 변수를 만들기

 

이제 데이터프레임에서 새로운 변수를 만들거나 변경하는 방법을 다룹니다. 일단 health 을 이용하여 새로운 n_health 만든다. 그리고 키(n_health$hei)100을 곱하고 몸무게(n_health$wei)를 더하여 새로운 변수(n_health$hei_wei)를 만든다.

 

1 > dataf21 <- hei_wei; dataf21

2 > heiwei100 <- dataf21$hei*100+dataf21$wei

3 > heiwei100 <- with(dataf21,hei*100+wei)

4 > #as.data.frame(hei_wei)

5 > #is.vector(hei_wei)

6 > dataf21 <- cbind(dataf21,heiwei100); dataf21

7 > write.table(dataf21,"d:/sample_r/heiwei100.csv",sep=",",row.names=F)

 

 

# 변수 만들기

hei_wei <- read.table(file='d:/sample_r/hei_wei.txt',header=T)

hei_wei

n_heiwei <- hei_wei

n_heiwei$health <- (n_heiwei$hei-110)*0.9-n_heiwei$wei

n_heiwei

 

4. 데이터프레임에서 추출하기와 합치기

성별, , 몸무게로 구성된 외부 텍스트파일 hei_wei.txt를 만든다. 조건을 지정하거나 subset 함수를 이용합니다.

 

(1) 데이터프레임에서 추출하기

 

dataf02 <- read.csv("d:/r_class/survey_h.csv",header=T)

dataf03 <- dataf02

dataf03

dataf03[2]

dataf03[c(2,5)]

dataf03[-2] # gender 제외하가

dataf03[-c(2,5)] # 변수 genderedu 제외하기

 

dataf03[1:3,]

dataf03[1:3,c(2,5)]

dataf03["gender"]

dataf03[c("gender","edu")]

 

dataf03[,names(dataf03) %in% c("gender","edu")] # 변수 genderedu 추출하기

dataf03[,!names(dataf03) %in% c("gender","edu")] # 변수 genderedu 제외하기

 

dataf03$gender

dataf03$work

 

 

 

(2) 데이터프레임 합치기

 

두개의 데이터프레임을 아래 위로 합치기 rbind 

 

gender <- c("F","F","M","M")

hei <- c(161,162,163,164)

wei <- c(72,72,73,74)

df3 <- data.frame(gender,hei,wei)

df3

rdf1 <- rbind(cdf1,df3) # 두개의 데이터프레임을 아래 위로 합치기

rdf1

 

 

두 개의 데이터프레임 dataf_a dataf_b를 아래위로(세로) 합쳐서 dataf_ab 이라는 데이터프레임을 만드는 작업입니다.

 

(1) 데이터프레임 dataf_a dataf_b를 만들기

 

앞에서 만든 cdf1 에 아래위로(세로)로 합칠 새로운 데이터프레임 df3를 만든다.

 

> gender <- c("F","F","F","F")

> hei <- c(161,162,163,164)

> dataf_a <- data.frame(gender,hei)

> dataf_a

-----------------------------------------

gender hei

1 F 161

2 F 162

3 F 163

4 F 164

-----------------------------------------

 

> gender <- c("M","M","M","M")

> hei <- c(171,172,173,174)

> dataf_b <- data.frame(gender,hei)

> dataf_b

-----------------------------------------

gender hei

1 F 171

2 F 172

3 F 173

4 F 174

-----------------------------------------

 

(2) 데이터프레임 dataf_ab 만들기(dataf_a dataf_b 아래 위로 붙이기)

 

> dataf_ab <- rbind(dataf_a, dataf_b)

> dataf_ab

gender hei wei

gender hei

1 F 161

2 F 162

3 F 163

4 F 164

5 F 171

6 F 172

7 F 173

8 F 174

 

 

 

두 개의 데이터프레임 옆으로 합치기 - cbind

 

 

gender <- c("F","F","M","F","M","F","M")

hei <- c(155,160,165,170,175,170,169)

dataf1 <- data.frame(gender,hei)

df1

-----------------------------------------

gender hei

1 F 161

2 F 162

3 F 163

4 F 164

-----------------------------------------

 

 

(1) 데이터프레임 dataf_a (gendder hei) dataf_c(hei) 를 만들기

 

wei <- c(58,60,63,68,70,66,67)

dataf2 <- data.frame(wei)

dataf3 <- cbind(dataf1,dataf2) # 두개의 데이터프레임을 옆으로 붙이기(gener/hei + wei)

-----------------------------------------

wei

1 45

2 49

3 53

4 67

 

 

데이터프레임 dataf_ac 만들기(dataf_a dataf_c 옆으로 붙이기)

 

몸무게로 구성된 새로운 데이터프레임 dataf_c 을 만들어, 앞에서 만든 데이터프레임 dataf_a 와 옆으로 합치는 작업을 합니다.

 

> dataf_ac <- cbind(dataf_a,dataf_c)

> dataf_ac

-----------------------------------------

gender hei wei

1 F 161 45

2 F 162 49

3 M 163 53

4 M 164 67

-----------------------------------------

 

df1 의 성별, 키에 df2 의 몸무게가 옆으로 붙어있는 것을 확인할 수 있습니다.

 

 

데이터프레임 통계분석

 

벡터에서 기술통계량을 구하던 함수를 데이터프레임에서도 그대로 사용할 수 있습니다.

 

데이터프레임 기술통계량 구하기

 

함수명 기능

sum(vec01) 합계구하기
mean(vec01) 평균구하기
vec01-mean(vec01) 평균과의 차이구하기
median(vec01) 중앙값 구하기
min(vec01) 최소값 구하기
max(vec01) 최대값 구하기
sd(vec01) 표준편차 구하기
var(vec01) 분산 구하기
range(vec01) 최소값과 최대값 구하기
diff(range(vec01)) 범위구하기
quantile(vec01) 4분위수 구하기
IQR(vec01) 4분위수 범위 Q3-Q1
summary(vec01) 요약통계 구하기 

 

survey <- read.table("d:/sample_r/survey_h.txt",header=T);survey

attach(survey)

sum(wage) # 합계구하기

mean(wage) # 평균구하기

wage-mean(wage) # 평균과의 차이구하기

median(wage) # 중앙값 구하기

min(wage) # 최소값 구하기

max(wage) # 최대값 구하기

sd(wage) # 표준편차 구하기

var(wage) # 분산 구하기

range(wage) # 최소값과 최대값 구하기

diff(range(wage)) # 범위구하기

quantile(wage) # 4분위수 구하기

IQR(wage) # 4분위수 범위 Q3-Q1

summary(wage) # 요약통계 구하기; 벡터,행렬,요인,데이터프레임

 

 

1 survey <- read.table("d:/sample_r/survey_h.txt",header=T);survey

 

> sum(wage) # 합계구하기

[1] 2201

> mean(wage) # 평균구하기

[1] 55.025

> wage-mean(wage) # 평균과의 차이구하기

[1] -13.025 -13.025 -12.025 -10.025 -10.025 -8.025 -6.025 -5.025 -4.025 -3.025 -11.025 -10.025 -9.025 -8.025

[15] -3.025 -1.025 6.975 6.975 4.975 5.975 -8.025 -6.025 -4.025 -2.025 -0.025 1.975 1.975 1.975

[29] 8.975 7.975 -12.025 -8.025 -7.025 -3.025 0.975 15.975 22.975 26.975 23.975 37.975

 

> median(wage) # 중앙값 구하기

[1] 52

> min(wage) # 최소값 구하기

[1] 42

> max(wage) # 최대값 구하기

[1] 93

> sd(wage) # 표준편차 구하기

[1] 11.81587

> var(wage) # 분산 구하기

[1] 139.6147

 

> range(wage) # 최소값과 최대값 구하기

[1] 42 93

 

> diff(range(wage)) # 범위구하기

[1] 51

 

> quantile(wage) # 4분위수 구하기

0% 25% 50% 75% 100%

42.00 47.00 52.00 60.25 93.00

 

> IQR(wage) # 4분위수 범위 Q3-Q1

[1] 13.25

 

> summary(wage) # 요약통계 구하기

Min. 1st Qu. Median Mean 3rd Qu. Max.

42.00 47.00 52.00 55.02 60.25 93.00

데이터프레임과 통계분석기법

 

데이터프레임을 이용하여 여러 가지 통계분석기법을 적용하여 살펴보기로 합니다.

 

t 검정 실행하기

> t.test(hei~gender) 

Welch Two Sample t-test 

data: hei by gender

t = -3.4499, df = 2.884, p-value = 0.04351

alternative hypothesis: true difference in means is not equal to 0

95 percent confidence interval:

-21.3826796 -0.6173204

sample estimates:

mean in group F mean in group M

160 171

 

 

1 survey <- read.table("d:/sample_r/survey_h.txt",header=T);survey
2 t.test(survey$wage~survey$gender)

Welch Two Sample t-test

 data: survey$wage by survey$gender

t = -2.8938, df = 31.077, p-value = 0.006901

alternative hypothesis: true difference in means is not equal to 0

95 percent confidence interval:

-16.091569 -2.787219

sample estimates:

mean in group F mean in group M

49.83333 59.27273

 

 상관계수 구하기 

1 survey <- read.table("d:/sample_r/survey_h.txt",header=T);survey
2 cor(survey$age,survey$wage) # 상관계수 구하기
3 cor(survey$age,survey$wage,method="pearson")
4 cor.test(survey$age,survey$wage) # 상관계수와 검정통계량 구하기
5 cov(survey$age,survey$wage) # 공분산 구하기
6 var(survey$age,survey$wage) # 공분산 구하기

 

> cor(survey$age,survey$wage) # 상관계수 구하기
[1] 0.9496433

 > cor(survey$age,survey$wage,method="pearson")

[1] 0.9496433

method=“pearson” 을 지정하여 Pearson 상관계수를 구합니다.

kendall, spearman 옵션을 지정할 수 있습니다.

 

 > cor.test(health$hei,health$wei) 

Pearson's product-moment correlation

 

data: survey$age and survey$wage

t = 18.683, df = 38, p-value < 2.2e-16

alternative hypothesis: true correlation is not equal to 0

95 percent confidence interval:

0.9062121 0.9732447

sample estimates:

cor

0.9496433

 

> cov(survey$age,survey$wage) # 공분산 구하기

[1] 83.07051 

 

회귀분석 하기

 

lm(wei~hei+age)

Call:
lm(formula = wei ~ hei + age)

 Coefficients:

(Intercept) hei age

-38.99135 0.61902 0.01811

 

1 survey <- read.table("d:/sample_r/survey_h.txt",header=T);survey
2 lm(survey$wage~survey$age)
3 lm(survey$wage~survey$age+survey$edu)

 

2 > lm(survey$wage~survey$age)
Call:
lm(formula = survey$wage ~ survey$age)

Coefficients:

(Intercept) survey$age

10.692 1.516

 

3 > lm(survey$wage~survey$age+survey$edu) 

Call:

lm(formula = survey$wage ~ survey$age + survey$edu)

 

Coefficients:

(Intercept) survey$age survey$edu

7.706 1.439 1.423