본문 바로가기

배운 책들 정리/만만한 통계 : R 활용

0224 만만한 통계 R 외부 챕터 4~6 - 데이터 프레임, 데이터 분석, 데이터 가공

1. 외부 챕터 4~5 (데이터 프레임, 데이터 분석 기초)

1) 실습 (csv파일 저장 및 불러오기)

# Q1
apple <- c(1800,24)
strawberry <- c(1500,38)
water <- c(3000,13)
fr<- data.frame(fruit=c("apple","strawberry","water-melon"),
  prcie=c(1800,1500,3000),
  quantity = c(24,38,13))
fr
head(fr)
# csv파일로 저장하기
write.csv(fr, file="./SpyderBD_01/data/sales.csv",row.names=F)
# 데이터 객체 삭제
rm(sales)
sales

# rdata로 저장하기
save(sales,file="./SpyderBD_01/data/sales.rda")

# rdata 불러오기
load("./SpyderBD_01/data/sales.rda")
sales

# csv파일 불러오기
sales <- read.csv("./SpyderBD_01/data/sales.csv")
head(sales)

정리

rds : 하나만 저장

rda : 여러개 저장

 

2)실습 (데이터 확인)

# 텍스트데이터
df_txt_exam <- read.csv("./SpyderBD_01/data/csv_exam.txt",sep="\t")
str(df_txt_exam)

# 데이터 파악하기
exam <- read.csv("./SpyderBD_01/data/csv_exam.csv")
dim(exam)
# 데이터 앞부분 보기, 기본 값이 6개의 행
head(exam)
# 2개의 행만 보고 싶다면
head(exam,2)
# 데이터 뒷부분 보기, 기본 값이 6개의 행
tail(exam)
# 2개의 행만 보고 싶다면
tail(exam,2)
# 데이터 전체 구조나 속성 보기
str(exam)
dim(exam)
# 행 개수만 알고 싶다면
dim(exam)[1]
# 열 개수만 알고 싶다면
dim(exam)[2]

3) 실습 (데이터 분포 확인)

# 새로운 창에서 전체 데이터 보기
View(exam)
# 데이터 분포 보기
summary(exam)
# 원하는 데이터만
summary(exam$math)
# 반의 정보 확인
table(exam$class)


# 내장 데이터 불러오기
mpg <- as.data.frame(ggplot2::mpg)
head(mpg)
tail(mpg)
str(mpg)
dim(mpg)
summary(mpg)
table(mpg$trans)
table(mpg$model)

4) 내장 데이터 불러오기(ggplot2::mpg) & 복사본 생성 & 이름 변경

# 내장 데이터 불러오기
mpg <- as.data.frame(ggplot2::mpg)
head(mpg)
tail(mpg)
str(mpg)
dim(mpg)
summary(mpg)
table(mpg$trans)
table(mpg$model)


# 데이터 수정
library(tidyverse)
# 샘플 데이터 수정
df_raw <- data.frame(var1 = c(1,2,1),
                     var2 = c(2,3,2)
                     )
df_raw
# 복사본 만들기
df_new <- df_raw
df_new
# 변수 이름 변경 (변경하고 싶은 이름=변경되기 전 이름)
df_new <- rename(df_new, 
                v2 = var2)
df_new

5) mpg 데이터 실습 문제 (복사본 생성 & 이름 변경)

# mpg 데이터의 변수명은 긴 단어를 짧게 줄인 축약어로 되어있습니다. cty 변수는 도시 연비, hwy 변수는 고속도로 연비를 의미합니다. 변수명을 이해하기 쉬운 단어로 바꾸려고 합니다. mpg 데이터를 이용해서 아래 문제를 해결해 보세요

# Q1. ggplot2 패키지의 mpg 데이터를 사용할 수 있도록 불러온 뒤 복사본을 만드세요.
mpg <- as.data.frame(ggplot2::mpg)
mpg
new_mpg <- mpg
new_mpg
# • Q2. 복사본 데이터를 이용해서 cty는 city로, hwy는 highway로 변수명을 수정하세요.
new_mpg <- rename(new_mpg, 
                  city = cty,
                  highway = hwy)

# • Q3. 데이터 일부를 출력해서 변수명이 바뀌었는지 확인해 보세요. 아래와 같은 결과물이 출력되어야 합니다.
head(new_mpg)

 

6) 파생변수

파생변수란 새로운 변수를 의미

# 새로운 변수 만들기
df <- data.frame(var1 = c(4,8,6),
                 var2 = c(2,5,4)
                 )
df
# 합계 변수
df$sum <- df$var1+df$var2
df
# 평균 변수
df$mean <- df$sum/2
df
# 
(df$var1+df$var2)/ncol(df)
# 통합연비 변수
mpg$total <- (mpg$cty+mpg$hwy)/2
head(mpg)
summary(mpg$total)
hist(mpg$total)
# 통합연비 변수를 범주형 변수로 만들기
# ifelse(조건,조건을 만족할 때 값, 조건을 만족하지 않을 때 값)
mpg$test <- ifelse(mpg$total >= 20, "pass", "fail")
head(mpg)
# 빈도표
table(mpg$test)
# 막대그래프
library(ggplot2)
qplot(mpg$test)
# 3개의 그룹을 가지는 범주형 변수 만들기
25보다 크면 a등급
20보다 크면 b등급
나머지는 c등급
mpg$grade <- ifelse(mpg$total >= 25, "A",
                    ifelse(mpg$total>=20, "B", "C"))
head(mpg)
table(mpg$grade)

# 4개의 그룹을 가지는 범주형 변수 만들기
# 30보다 크면 A, 
# 25보다 크면 B, 
# 20보다 크면 C, 
# 나머지는 D
mpg$grade_new <- ifelse(mpg$total >= 30, "A",
                    ifelse(mpg$total>=25, "B",
                           ifelse(mpg$total>=20, "C", "D")))

head(mpg)
table(mpg$grade_new)
qplot(mpg$grade_new)

7) 실습문제 1 (인구통계 분석)

# 교수님
# ggplot2 패키지에는 미국 동북중부 437개 지역의 인구통계 정보를 담은 midwest라는 데이터가 포함되어 있습니다. midwest 데이터를 사용해 데이터 분석 문제를 해결해보세요.

# • 문제 1. ggplot2 의 midwest 데이터를 데이터 프레임 형태로 불러와서 데이터의 특성을 파악하세요.
library(dplyr)
library(ggplot2)
new_mid <- as.data.frame(ggplot2::midwest)
head(new_mid)
tail(new_mid)
str(new_mid)
View(new_mid)
summary(new_mid)

# • 문제 2. poptotal(전체 인구)을 total 로, popasian(아시아 인구)을 asian 으로 변수명을 수정하세요.
new_mid <- rename(new_mid,total=poptotal,
                  asian=popasian)
head(new_mid)
# • 문제 3. total, asian 변수를 이용해 '전체 인구 대비 아시아 인구 백분율' 파생변수를 만들고, 히스토그램을 만들어 도시들이 어떻게 분포하는지 살펴보세요.

new_mid$asian_pct <- (new_mid$asian/new_mid$total)*100
head(new_mid)
hist(new_mid$asian_pct)
# • 문제 4. 아시아 인구 백분율 전체 평균을 구하고, 평균을 초과하면 "large", 그 외에는 "small"을 부여하는 파생변수를 만들어 보세요.
ap_mean<- mean(new_mid$asian_pct)
new_mid$asian_pct_group <- ifelse(new_mid$asian_pct > ap_mean, "large","small")
head(new_mid)

# • 문제 5. "large"와 "small"에 해당하는 지역이 얼마나 되는지, 빈도표와 빈도 막대 그래프를 만들어 확인해보세요
table(new_mid$asian_pct_group)
qplot(new_mid$asian_pct_group)

문제 1번
문제 2 (변수명 수정)
문제 3번 (asian_pct, 히스토그램 확인)
문제 4번 (백분율 평균 구하고 조건식 부여해서 파생변수 생성)
문제 5번 (해당 지역의 빈도표와 막대 그래프 생성)
문제 5번 막대 그래프 (qplot)

2. 외부 챕터 6 - 자유자재로 데이터 가공

1) dplyr 패키지 내용 확인

bind_rows = union all (sql문과 같음)

 

2) 조건식을 통해 제어

# 오후
# 데이터 전처리
# 조건에 맞는 행(데이터) 추출
library(tidyverse)
exam <- read.csv("./SpyderBD_01/data/csv_exam.csv")
head(exam)
# 파이프라인 : shift + ctrl + m
# %>% 
# 조건에 맞는 행(데이터) 추출
exam %>% 
  filter(class == 1)
exam %>% 
  filter(class !=5)
# 크다 = 초과
exam %>% 
  filter(math >80)
# 크거나 같다 = 이상
exam %>% 
  filter(math >=80)
# 작거나 같다 = 이하
exam %>% 
  filter(english<= 68)

# 여러 개의 조건
# and = 교집합 / or 합집함
# and
exam %>% 
  filter(class == 2 & science > 60)

# or = 조건 중 하나라도 만족하는 경우
exam %>% 
  filter(class == 2 & science > 60)ㅊ]
# or 조건을 여러개 사용
exam %>% 
  filter(class == class 1 class ==3, class+5)
exam %>% 
  filter(class %in% c(1,3,5))


# 조건에 맞는 행을 데이터로 저장
class135 <- exam %>% 
  filter(class == 1 | class == 3 | class == 5)
class135
# 1반만 추출하여 저장
class1 <- exam %>% 
  filter(class == 1)
# 3반만 추출하여 저장
class3 <- exam %>% 
  filter(class == 3)
class1;class3
# 각 반의 수학 평균 점수
mean(class1$math)
mean(class3$math)
# 


# 산술연산자
# 더하기
3+4
# 나누기의 몫 
4%/%2
5%/%2
# 나누기의 나머지
4%%2
5%%2

3) 실습 문제

# mpg 데이터를 이용해 분석 문제를 해결해 보세요.
# • Q1. 자동차 배기량에 따라 고속도로 연비가 다른지 알아보려고 합니다. displ(배기량)이 4 이하인 자동차와 5 이상인 자동차 중 어떤 자동차의 hwy(고속도로 연비)가 평균적으로 더 높은지 알아보세요.
# 독립표본 t검정
mpg <- as.data.frame(ggplot2::mpg)
mpg_4 <- mpg %>% filter(mpg$disp <= 4)
mpg_5 <- mpg %>% filter(mpg$disp >= 5)         
mean(mpg_4$hwy)
mean(mpg_5$hwy)

# • Q2. 자동차 제조 회사에 따라 도시 연비가 다른지 알아보려고 합니다. "audi"와 "toyota" 중 어느 manufacturer(자동차 제조 회사)의 cty(도시 연비)가 평균적으로 더 높은지 알아보세요.
mpg_audi<- mpg %>% filter(mpg$manufacturer == "audi")
mpg_toyota <- mpg %>% filter(mpg$manufacturer == "toyota")
mean(mpg_audi$cty)
mean(mpg_toyota$cty)

# • Q3. "chevrolet", "ford", "honda" 자동차의 고속도로 연비 평균을 알아보려고 합니다. 이 회사들의
# 자동차를 추출한 뒤 hwy 전체 평균을 구해보세요
mpg_all <-mpg %>% filter(mpg$manufacturer %in% c("chevrolet","ford","honda"))
mpg_all
mean(mpg_all$hwy)

5) 파이프라인을 통해 필터, 셀렉 기능 사용하기

# 열 = 변수 추출
head(exam)
exam %>% 
  select(math)

# 변수 여러 개 추출
exam %>% 
  select(math,english,science)
# 특정 변수 제외하고 추출
exam %>% 
  select(-id,-math)
# 변수를 추출하여 저장
score <- exam %>% 
  select(math,english,science)
score
# 행과 열을 동시에 추출
exam %>% 
  filter() %>% 
  select() 

c3_science <- exam %>% 
  filter(class == 3) %>% 
  select(science)

# 데이터 앞부분만 빠 르게 조회하고 싶을 때
exam %>% 
  filter() %>% 
  select()  

# 3개의 행만 보기
exam %>% 
  filter(class %in% c(1,3,5)) %>%
  select(english,science) %>% 
  head(3)

# 기본값 = 6개 행 보기
exam %>% 
filter(class %in% c(1,3,5)) %>%
  select(english,science) %>% 
  head

exam %>% 
  filter(class %in% c(1,3,5)) %>%
  select(english,science) %>% 
  head()

6) 문제풀기 (filter, select 사용)

# mpg 데이터를 이용해서 분석 문제를 해결해보세요.
# • Q1. mpg 데이터는 11 개 변수로 구성되어 있습니다. 이 중 일부만 추출해서 분석에 활용하려고 합니다. mpg
# 데이터에서 class(자동차 종류), cty(도시 연비) 변수를 추출해 새로운 데이터를 만드세요. 새로 만든데이터의 일부를 출력해서 두 변수로만 구성되어 있는지 확인하세요.
mpg <- as.data.frame(ggplot2::mpg)
mpg_class_cty<- mpg %>% 
  filter() %>% 
  select(class,cty)
head(mpg_class_cty)

# • Q2. 자동차 종류에 따라 도시 연비가 다른지 알아보려고 합니다. 앞에서 추출한 데이터를 이용해서 class(자동차 종류)가 "suv"인 자동차와 "compact"인 자동차 중 어떤 자동차의 cty(도시 연비)가 더 높은지 알아보세요
# 독립표본 t검정

suv<- mpg %>% 
  filter(class == "suv") 

compact<- mpg %>% 
  filter(class == "compact") 

mean(suv$cty)
mean(compact$cty)

7) 순서대로 정렬

# 정렬하기
# 오름차순 = 낮은 값에서 높은 값으로 정렬
 exam %>% 
  arrange(id)
 
 exam %>% 
  arrange(math)
# 내림차순 = 높은 값에서 낮은 값으로 정렬
 exam %>% 
   arrange(desc(math))
# 변수 여러개로 정렬
 exam %>% 
   arrange(class,science)
 exam %>% 
   arrange(class,desc(math))

mpg 데이터를 이용해서 분석 문제를 해결해보세요. • "audi"에서 생산한 자동차 중에 어떤 자동차 모델의 hwy(고속도로 연비)가 높은지 알아보려고 합니다. "audi"에서 생산한 자동차 중 hwy가 1~5위에 해당하는 자동차의 데이터를 출력하세요.

 

 

7) 순서대로 정렬 실습 문제

 # mpg 데이터를 이용해서 분석 문제를 해결해보세요.
 # • "audi"에서 생산한 자동차 중에 어떤 자동차 모델의 hwy(고속도로 연비)가 높은지 알아보려고 합니다. 
 # "audi"에서 생산한 자동차 중 hwy가 1~5위에 해당하는 자동차의 데이터를 출력하세요
mpg <- as.data.frame(ggplot2::mpg)
head(mpg)

audi<- mpg %>% 
  filter(manufacturer == "audi")


top_audi<- audi %>% 
  arrange(desc(hwy)) %>% 
head(5)

 

8) 파생변수 추가하기

# 새로운 변수 생성
# 변수 하나
str(exam)
exam %>% 
  mutate(score_sum = math + english + science)

str(exam)

# 변수 2개
exam %>% 
  mutate(score_sum = math + english + science,
         score_mean = (math + english + science)/3
  )
exam %>% 
  mutate(score_sum = math + english + science,
         score_mean = score_sum/3
  )

exam %>% 
  mutate(score_sum = math + english + science,
         score_mean = score_sum/3
  )
# 범주형 변수 만들기
a <- exam %>% 
  mutate(math_test = ifelse(math >= 80, "pass", "fail"))
a  
a %>%
  filter(math_test == "pass")


# 새로 만든 변수를 이용해서 바로 함수에 적용
exam %>% mutate(score_sum = math+english+science) %>% 
  arrange(desc(score_sum)) %>% 
  head(5)

 

9) 문제풀이 - mutate 활용

# 문제풀이
# mpg 데이터를 이용해서 분석 문제를 해결해보세요.
# mpg 데이터는 연비를 나타내는 변수가 hwy(고속도로 연비), cty(도시 연비) 두 종류로 분리되어 있습니다. 두 변수를 각각 활용하는 대신 하나의 통합 연비 변수를 만들어 분석하려고 합니다.

# • Q1. mpg 데이터 복사본을 만들고, cty 와 hwy 를 더한 '합산 연비 변수'를 추가하세요.
mpg<- as.data.frame(ggplot2::mpg)
mpg_copy <- mpg

mpg_copy<- mpg_copy %>% 
  mutate(sum_cty_hwy = cty+hwy)


# • Q2. 앞에서 만든 '합산 연비 변수'를 2 로 나눠 '평균 연비 변수'를 추가세요.
mpg_copy<- mpg_copy %>% 
  mutate(mean_cty_hwy = sum_cty_hwy/2)

# • Q3. '평균 연비 변수'가 가장 높은 자동차 3 종의 데이터를 출력하세요.
mpg_copy %>% 
  mutate(mean_cty_hwy = sum_cty_hwy/2) %>% 
  arrange(desc(mean_cty_hwy)) %>% 
  head(3)


# • Q4. 1~3 번 문제를 해결할 수 있는 하나로 연결된 dplyr 구문을 만들어 출력하세요. 데이터는 복사본 대신 mpg 원본을 이용하세요

mpg %>% 
  mutate(sum_cty_hwy = cty+hwy,
         mean_cty_hwy = sum_cty_hwy/2,
         ) %>% 
  arrange(desc(mean_cty_hwy)) %>% 
  head(3)

핵심
최종 결과

10) 집단별 요약 - group-by

# 요약하기
exam %>%
  summarise(math_mean = mean(math),
            english_mean = mean(english),
            science_mean = mean(science))
# 그룹별로 요약하기(분석시 anova 분석)
exam %>%
  group_by(class) %>% 
  summarise(math_mean = mean(math),
            english_mean = mean(english),
            science_mean = mean(science))

# 다른 요약 통계량
exam %>%
  group_by(class) %>% 
  summarise(science_mean = mean(science),
            science_sum = sum(science),
            science_median = median(science),
            science_frequency = n())


# 제조 회사와 구동 방식 별로 고속도로 연비 평균 값
mpg %>% 
  group_by(manufacturer,drv) %>% 
  summarise(hwy_mean = mean(hwy))


# 중복제거 
mpg %>% 
  group_by(manufacturer,drv) %>% 
  summarise(hwy_mean = mean(hwy))

# 추가한거
mpg %>% 
  group_by(manufacturer,drv) %>% 
  mutate(hwy_mean = mean(hwy))


head(mpg)

결과

* 핵심

- 데이터 불러오기

- 파이프라인 활용법

- 조건식 사용

 

 

 

 

728x90
반응형
LIST