https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=257831838&start=slayer

 

난생처음 R 코딩 & 데이터 분석

168개의 코드 예제를 기반으로 프로그래밍 기초부터 데이터 분석까지 다루며, R에서 사용하는 문법을 최대한 쉽게 설명하고 있다. 또한 4단계 반복 학습 시스템을 통해 프로그래밍 감각을 제대로

www.aladin.co.kr

 

01 데이터 분석 단계에서 수집된 데이터를 분석이 가능한 형태로 정돈하는 과정을 무엇이라고 하는가?

        데이터 전처리(정제) 과정

02 다음은 어떤 나무의 나뭇잎 길이를 측정한 데이터이다. 이 데이터를 분석하기 위한 가장 적당한 도구를 고르시오.

        ② 히스토그램

03 다음은 구내식당 업체 교체에 대한 찬반 여부를 조사한 데이터의 일부이다. 이 데이터를 분석하기 위한 가장 적당한 도구를 고르시오.

        ① 도수분포표

04 Ecdat 패키지에 포함된 Hdma 데이터셋에 대해 다음의 문제를 해결하기 위한 R 코드를 작성하시오.

# Ecdat 패키지 설치 및 로드
install.packages('Ecdat')
library(Ecdat)

# Hdma 데이터셋 로드
data('Hdma')

 

(1) 대출 신청자의 직업이 자영업자인 경우와 아닌 경우의 빈도를 막대그래프로 나타내시오. 직업이 자영업자인지 여부는 self 열에 저장되어 있다.

# self 도수분포
freq_self <- table(Hdma$self)

# 막대그래프
barplot(freq_self,
        main='자영업자 여부',
        col=c('red', 'blue')
        )

 

(2) 대출 신청자가 미혼인 경우와 아닌 경우의 비율을 원그래프로 나타내시오. 미혼 여부는 single 열에 저장되어 있다.

# single 도수분포
freq_single <- table(Hdma$single)
freq_single

# 원 그래프
pie(freq_single,
    main='혼인 여부',
    col=c('red', 'blue')
    )

 

(3) 대출 신청자가 속한 직업군의 실업률(uria) 데이터에 대해 다음 물음에 답하시오.

# ① 실업률의 분포를 상자그림으로 작성하시오.
boxplot(Hdma$uria,
        main='실업률 분포'
        )

# ② 데이터의 분포에서 정상 범위는 어디부터 어디까지인지를 보이시오.
stats <- boxplot.stats(Hdma$uria)$stats

cat("Min:", stats[1], "\n")
cat("Q1:", stats[2], "\n")
cat("Median:", stats[3], "\n")
cat("Q3:", stats[4], "\n")
cat("Max:", stats[5], "\n")

# ③ 데이터의 분포에서 정상 범위를 벗어나는 값들은 몇 개인지를 보이시오.
out <- boxplot.stats(Hdma$uria)$out
cat("Number of outlier :", length(out),'\n')

 

(4) 대출 승인과 거절에 대한 케이스(deny)별로 수입대비 주택유지비용 비율(hir)의 평균을 구하시오.

# 인덱스 
no <- which(Hdma$deny == 'no')
yes <- which(Hdma$deny == 'yes')

# 평균
avg_no <- mean(Hdma[no, 'hir'])
avg_yes <- mean(Hdma[yes, 'hir'])

 

(5) (4)번의 결과를 볼 때 수입대비 주택유지비용 비율이 높으면 대출에 유리한지 불리한지를 판단하시오.

  1. 대출 승인의 hist 평균은 0.2902124, 거절의 hist 평균은 0.2506052이다. 
  2. 대출 승인이 된 경우의 hist 평균이 더 높았는데, 이는 hist 비율이 높은 사람들이 대출을 받기더 유리한 조건임을 나타낸다(수입 대비 주택유지비용 비율이 높다면, 대출 상환 능력이 낮다고 판단되기에, no 쪽이 평균 비율이 더 높을 것이라 예상했는데, 결과가 예상 밖이라... 정확한 해석이 맞는지 고민이되네요).

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=257831838&start=slayer

 

난생처음 R 코딩 & 데이터 분석

168개의 코드 예제를 기반으로 프로그래밍 기초부터 데이터 분석까지 다루며, R에서 사용하는 문법을 최대한 쉽게 설명하고 있다. 또한 4단계 반복 학습 시스템을 통해 프로그래밍 감각을 제대로

www.aladin.co.kr

01 carData 패키지의 MplsStops 데이터셋은 차량이나 사람의 수상한 멈춤 행동에 대한 미니애폴리스 경찰의 보고 데이터를 저장하고 있다. 다음의 물음에 답하기 위한 R코드를 작성하시오.

# 패키지 설치
install.packages("carData")

# carData 패키지 로드
library(carData)

# MplsStops 데이터셋 로드
data("MplsStops")

 

(1) 수상한 행동을 한 행인의 인종 비율(race)을 원그래프로 나타내시오.

# race 열 벡터
race <- MplsStops$race

# race 도수분포
freq_race <- table(race)

# 원 그래프
pie(freq_race,
    main='수상한 행동을 한 행인의 인종 비율',
    )

 

(2) 수상한 멈춤인지 교통신호에 의한 멈춤인지(problem)의 비율을 원그래프로 나타내시오. 단, 수상한 멈춤(suspicious)은 빨간색으로, 교통신호에 의한 멈춤(traffic)은 파란색으로 나타낸다.

# problem 열 벡터
problem <- MplsStops$problem

# problem 도수분포
freq_problem <- table(problem)

# 원 그래프
pie(freq_problem,
    main='멈춤 비율',
    col=c('red', 'blue')
    )

 

(3) 수상한 멈춤을 한 사람에 대한 수색여부(personSearch) 비율을 원그래프로 나타내시오.

# personSearch 열 벡터
ps <- MplsStops$personSearch

# personSearch 도수분포
freq_ps <- table(ps)

# 원 그래프
pie(freq_ps,
    main='수색여부 비율'
    )

 

(4) 수상한 멈춤을 한 사람의 성별(gender) 비율을 3차원 원그래프로 나타내시오. 단, 파이의 색을 남성은 오렌지색, 여성은 초록색, 기타는 노란색으로 지정한다.

# plotrix 패키지 설치
install.packages('plotrix')

# plotrix 패키지 로드
library(plotrix)

# gender 열 벡터
gender <- MplsStops$gender

# gender 도수분포
freq_gender <- table(gender)

# 3D 원 그래프
pie3D(freq_gender,
      main='성별 비율',
      labels=c('Female', 'Male', 'Unknown'), # 파이별 레이블 명
      labelcex=1.0, # 레이블 폰트 크기
      col=c('green', 'orange', 'yellow')
      )

02 DAAG 패키지의 greatLakes 데이터셋은 1918~2009년 사시의 4개 호수에 대한 수위 측정 데이터를 저장하고 있다. 다음과 같이 ds를 생성한 뒤 다음 물음에 답하기 위한 R 코드를 작성하시오.

# 패키지 로드
library(DAAG)

# greatLakes 데이터셋 로드
data("greatLakes")

ds <- data.frame(year=1918:2009, greatLakes)

 

(1) Erie호의 연도별 수위 변화를 선그래프로 나타내시오.

# year 열 벡터
year <- ds$year

# Erie 호수 열 벡터
erie <- ds$Erie

# 선 그래프
plot(year, # x data
     erie, # y data
     main='Erie 호수의 연도별 수위 변화',
     type='l', # 선 그래프 종류
     xlab='연도',
     ylab='수위'
     )

 

(2) michHuron호의 수위 변화를 다음과 같은 모양의 그래프로 작성하시오.

# year 열 벡터
year <- ds$year

# michHuron 호수 열 벡터
mh <- ds$michHuron

# 선 그래프
plot(year, # x data
     mh, # y data
     main='michHuron 호 수위',
     type='b', # 선 그래프 종류
     lty=5, # 선의 종류
     col='red',
     xlab='연도',
     ylab='수위'
     )

 

(3) Erie, michHuron, StClair 호수의 연도별 수위 변화를 하나의 그래프로 작성하되 호수별로 선의 색을 다르게 하시오(y축 값의 범위는 173~177.5, 선의 종류(type)는 'b'로 설정).

# year 열 벡터
year <- ds$year

# 각 호수의 열 벡터
erie <- ds$Erie
mh <- ds$michHuron
sc <- ds$StClair

plot(year, # x data
     erie, # y data
     main='연도별 수위 변화',
     type='b', 
     col='red',
     xlab='연도',
     ylab='수위',
     ylim=c(173, 177.5) # y값 범위
     )

lines(year, # x data
      mh, # y data
      type='b',
      col='green')

lines(year, # x data
      sc, # y data
      type='b',
      col='blue')

03 DAAG 패키지의 cfseal 데이터셋은 상업적 포획에 의해 죽은 물개에 대한 데이터를 저장하고 있다. 다음 물음에 답하기 위한 R 코드를 작성하시오.

# DAAG 패키지 설치
install.packages('DAAG')

# DAAG 패키지 로드
library(DAAG)

# cfseal 데이터셋 로드
data("cfseal")

 

(1) 물개의 체중(weight) 분포를 상자그림으로 나타내시오.

# weight 열 벡터
weight <- cfseal$weight

# 상자 그림
boxplot(weight,
        main='물개 체중'
        )

 

(2) 물개의 심장무게(heart) 분포에서 특이값을 찾아 출력하시오.

# heart 열 벡터
heart <- cfseal$heart

# 특이값 
print(boxplot.stats(heart)$out)

 

(3) 물개를 두 그룹으로 나누되 나이가 평균보다 적은 경우는 'young'으로, 평균 이상인 경우는 'old'로 지정한다. 그룹에 따라 무개의 몸무게(weight) 분포를 상자그림으로 나타내시오. 단, 상자의 색은 'old' 인 경우 오렌지색, 'young' 인 경우 초록색으로 한다.

  • case 1
# age, weight 열 벡터
age <- cfseal$age
weight <- cfseal$weight

# 물개 평균 나이
mean_age <- mean(age, na.rm = TRUE)

# 두 그룹
group <- cfseal$group <- ifelse(age < mean_age, 'young', 'old')

boxplot(weight~group,
        main='물개 몸무게 분포',
        col=c('orange', 'green')
        )
  • case 2
# 물개 평균 나이
mean_age <- mean(cfseal$age, na.rm = TRUE)

# 두 그룹
cfseal$group <- ifelse(cfseal$age < mean_age, 'young', 'old')

boxplot(weight~group,
        data=cfseal,
        main='물개 몸무게 분포',
        col=c('orange', 'green')
        )

 

(4) 물개를 세 그룹으로 나누되 몸무게가 Q1 미만인 경우는 'Low', Q1~Q3 사이인 경우는 'middle', Q3를 초과하는 경우는 'high'로 한다. 그룹에 따라 물개의 위(stomach) 무게 분포를 상자 그림으로 나타내시오.

# 몸무게 4분위수
q_weight <- quantile(cfseal$weight, na.rm = TRUE)

# 분위수 그룹
cfseal$group <- ifelse(cfseal$weight < q_weight[2], 'Low',
                       ifelse(cfseal$weight <= q_weight[4], 'middle', 'high'))

boxplot(stomach~group,
        data=cfseal,
        main='위 무게 분포',
        col=c('red', 'green', 'blue')
        )

04 DAAG 패키지의 greatLakes 데이터셋은 4개 호수의 수위 측정 데이터를 저장하고 있다. 다음과 같이 ds를 생성한 뒤 다음 물음에 답하기 위한 R 코드를 작성하시오.

# DAAG 패키지 설치 및 로드
install.packages('DAAG')
library(DAAG)

# greatLakes 데이터셋 로드
data("greatLakes")

ds <- data.frame(greatLakes)

 

(1) Erie호와 michHuron호의 수위 분포를 산점도로 나타내시오.

# 산점도
plot(ds$Erie, # x축
     ds$michHuron, # y축
     main='수위 분포')

 

(2) 4개 호수의 수위를 다중 산점도로 나타내시오.

# 다중 산점도
plot(ds,
     main='수위 분포')

05 DAAG 패키지의 grog 데이터셋은 호주와 뉴질랜드의 주류 소비에 대한 데이터를 저장하고 있다. 다음과 같이 데이터셋을 불러온 뒤, 다음 물음에 답하기 위한 R 코드를 작성하시오.

# DAAG 패키지 설치 및 로드
install.packages('DAAG')
library(DAAG)

# grog 데이터셋 로드
data("grog")

 

(1) 맥주(Beer)와 와인(Wine)에 대한 산점도를 작성하시오.

plot(grog$Beer,
     grog$Wine,
     main='Beer & Wine',
     xlab='Beer',
     ylab='Wine')

 

(2) 맥주(Beer), 와인(Wine), 스피릿(Spirit)에 대한 다중 산점도를 작성하되 점의 색을 호주는 빨간색, 뉴질랜드는 파란색으로 지정하시오. 그리고 나라에 따라 점의 모양도 다르게 하시오.

# 대상 데이터
ds <- grog[, 1:3]

# 그룹 확인
levels(grog$Country)

# 그룹 수치화
group <- as.numeric(grog$Country)

# 그룹 별 색상 및 점 모양
color <- c('red', 'blue')

# 다중 산점도
plot(ds,
     main='Beer & Wine & Spirit',
     pch=c(group), # 점 모양
     col=color[group] # 1: red, 2: blue
     )

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=257831838&start=slayer

 

난생처음 R 코딩 & 데이터 분석

168개의 코드 예제를 기반으로 프로그래밍 기초부터 데이터 분석까지 다루며, R에서 사용하는 문법을 최대한 쉽게 설명하고 있다. 또한 4단계 반복 학습 시스템을 통해 프로그래밍 감각을 제대로

www.aladin.co.kr

01 다음을 읽고, (A)와 (B)에 맞는 용어를 적으시오.

        (A) 막대그래프 (B) 히스토그램

02 어떤 사안에 대한 찬반 의견을 수집하였다. 결과를 막대그래프 또는 히스토그램으로 만드는 코드를 작성하려고 한다. 단, x축의 값을 T는 Yes로, F는 No로 변경하고 각각 다른 색으로 나타내시오. 또한 색은 colors() 함수의 실행 결과에서 사용가능한 색 이름을 선택해 사용하시오.

survey <- c(T, F, T, T, F, T, F, F, F, F)

# 사용가능한 색을 확인
colors() 

# 도수분포 계산
freq <- table(survey)

# 사용할 색 선택
selected_colors <- c('red', 'blue') 

# x축의 값(이름) 변경
changed_names <- c('No','Yes')

# 막대 그래프
barplot(freq, col=selected_colors, names=changed_names)

# 이진형 데이터의 경우 히스토그램은 시각화에 부적절
numeric.survey <- as.numeric(survey)
hist(numeric.survey, col=selected_colors)

03 R의 기본 데이터셋인 mtcars에서 실린더의 종류별 빈도를 그래프로 출력하는 코드를 작성하려고 한다(cyl 열 참고). 다음과 같은 그래프를 작성하기 위한 R 코드를 작성하시오(단, 막대의 색은 자유롭게 선택 가능함.)

# mtcars 데이터셋 로드
data(mtcars)

# cyl열 벡터
cars_cyl <- mtcars$cyl

# cyl열 도수분포
freq_cyl <- table(cars_cyl)

barplot(freq_cyl, 
        main='실린더 종류별 분포', # 그래프 제목
        ylab='실린더의 수', # y축 설명
        col=c('blue','skyblue','cyan'),
        horiz=T # 막대 그래프 수평 방향 출력
        )

04 주어진 데이터셋을 사용하여 히스토그램을 출력하는 코드를 작성하시오(제목은 'Histogram of sleep', x축의 설명은 'Increase in hours of sleep', 막대의 개수는 4개).

# sleep 데이터셋 로드
data(sleep)

# extra열 벡터
ds <- sleep$extra

hist(ds,
     main='Histogram of sleep', # 제목
     xlab='Increase in hours of sleep', # x축 설명
     breaks=4 # 막대 개수 조절
     )

05 주어진 데이터셋과 색을 사용하여 다음 그래프를 출력하는 코드를 작성하시오.

  • 교차 데이터 시각화에는 막대그래프가 적절하다.
  • 범례가 그래프 내부에 표시됨 → par() 사용하지 않음.
# mtcars 데이터셋 로드
data(mtcars)

# row: cyl, col: gear
ds <- table(mtcars$cyl, mtcars$gear)

color <- c('tomato', 'salmon', 'peachpuff')

# 범례 설정
legend.config <- list(
  x='topright', # 범례 기본 위치 지정
  bty='n', # 범례 테두리 표시하지 않음
  inset=c(0.02, 0.2) # 범례 이동 (x축, y축)
)

barplot(ds,
        main='Distribution of carburetors',
        xlab='Numer of gear',
        ylab='frequency',
        col=color,
        legend.text=c('cyl 4', 'cyl 6', 'cyl 8'), # 범례 내용 변경
        args.legend=legend.config,
        beside=T # 각각의 막대로 표현
)

06 주어진 데이터셋과 색을 사용하여 다음 그래프를 출력하는 코드를 작성하시오.

# trees 데이터셋 로드
data(trees)

# Height열 벡터
ds <- trees$Height

# "#f1faee" "#f1faee" "#f1faee" "#f1faee" "#f1faee" "#f1faee"
color.6 <- rep('#f1faee', 6)

# "#f1faee" "#f1faee" "#e63946" "#e63946" "#e63946" "#f1faee"
color.6[3:5] <- '#e63946'

hist(ds,
     main='Histogram of Black Cherry Trees',
     xlab='Height(ft)',
     ylab='Frequency',
     col=color.6
     )

07 여러 개의 그래프를 출력하기 위해 다음과 같이 화면을 6개로 분할하려고 한다. 화면의 여백은 아래 5, 왼쪽 4, 위 4, 오른쪽 3으로 한다. 화면을 분할하는 명령문과 원래대로 초기화하는 명령문을 작성하시오.

  • 초기화를 할 때에는 R의 기본 그래픽 매개변수 값으로 재설정하면 된다.
  • mfrow: c(행, 열)
  • mar: c(아래쪽, 왼쪽 , 위쪽 , 오른쪽 )
# 그래픽 설정
par(mfrow=c(2, 3), mar=c(5, 4, 4, 3))

# 설정 초기화
par(mfrow=c(1, 1), mar=c(5, 4, 4, 2) + 0.1)
# 기본 그래픽 매개변수 확인
default_par <- par(no.readonly = TRUE)

# multi-figure row-wise
print(default_par$mfrow) 

# margin
print(default_par$mar)

08 다음은 한 중국 기관 보고서에 포함된 성별에 따른 브랜드 선호도에 대한 그래프이다. 주어진 데이터를 사용해 동일하게 출력하시오(막대그래프 색상 코드: '#ffe66d', '#00afb9')

male <- c(6.9, 30.4, 80.4)
female <- c(4.9, 38.2, 82.7)
ds <- rbind(male, female)
colnames(ds) <- c('samsung', 'apple', 'huawei')

# 범례 설정
legend_config <- list(
  x='topright',
  bty='n',
  inset=c(-0.09,0.34)
)

# 그래픽 설정
par(mfrow=c(1, 1), mar=c(5, 5, 5, 7))

barplot(ds,
        main='성별에 따른 브랜드 선호도',
        col=c('#ffe66d','#00afb9'),
        beside=T, 
        horiz=T,
        las=1, # x축 그룹 이름 수평 방향으로 출력
        legend.text=c('남자','여자'),
        args.legend=legend_config
        )

# 그래픽 설정 초기화
par(mfrow=c(1, 1), mar=c(5, 4, 4, 2) + 0.1)

09 다음 그래프는 한 연구 기관 보고서에 포함된 주요 국가별 공휴일 현황이다. 주어진 데이터를 사용해 다음 그래프를 출력하는 R 코드를 작성하시오(막대그래프 색상명: 'grey', 'skyblue').

holyday <- c(14, 15, 15, 16, 14, 11, 12)
holyday.actual <- c(15, 35, 38, 36, 34, 32, 32)
ds <- rbind(holyday, holyday.actual)
colnames(ds) <- c('한국', '일본', '독일', '러시아', '미국', '프랑스', '호주')

legend_config <- list(
  x='topleft',
  bty='n',
  inset=c(-0.1,-0.15)
)

par(mfrow=c(1, 1), mar=c(4.8, 4, 3, 0))

barplot(ds,
        main='주요 국가별 공휴일 현황',
        xlab='국가',
        beside=T,
        col=c('grey','skyblue'),
        legend.text=c('공휴일 수', '실제 쉬는 날'),
        args.legend=legend_config,
        las=1 # y축 레이블 수평으로 설정
        )

par(mfrow=c(1, 1), mar=c(5, 4, 4, 2) + 0.1)

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=257831838&start=slayer

 

난생처음 R 코딩 & 데이터 분석

168개의 코드 예제를 기반으로 프로그래밍 기초부터 데이터 분석까지 다루며, R에서 사용하는 문법을 최대한 쉽게 설명하고 있다. 또한 4단계 반복 학습 시스템을 통해 프로그래밍 감각을 제대로

www.aladin.co.kr

 

01. 다음 순서도를 R 코드로 작성하시오.

n <- 12
if (n %% 2 == 1) {
  type <- 'odd'
} else {
  type <- 'even'
}
print(type)

02. 다음 조건물을 ifelse문으로 작성하시오.

# ifelse(조건, if true, if false)
ifelse(n < 0, res <- -n, res <- n)

03. 스위치가 켜졌을 때는 입력값을 모두 곱하고, 꺼졌을 때는 입력값을 합하여 결과를 출력하려고 한다. 다음 코드가 정상적으로 실행되도록 2곳을 수정하시오.

input <- 1:10
n <- length(input)
switch <- TRUE

if(switch == T){
  result <- input[1]
  for(i in 1:n){
    result <- result * i
  }
} else {
  result <- sum(input)
}

print(result)

04. 1부터 20 사이의 모든 홀수의 곱을 구하는 코드를 작성하고 결과를 구하시오(단 for문 사용).

result <- 1
for (i in 1:20) {
  if (i %% 2 != 0) {
    result <- result * i
  }
}
print(result)

05. 1부터 20 사이의 모든 홀수의 곱을 구하는 코드를 작성하고 결과를 구하시오(단 while문 사용).

n <- 1
result <- 1
while(n <= 20){
  if(n %% 2 != 0){
    result <- result * n
  }
  n <- n + 1
}
print(result)

06. mtcars 데이터셋에서 mpg, hp, wt 세 개의 열에 대한 각각의 평균을 구하려 한다. apply() 함수를 사용하여 코드를 작성하시오.

apply(mtcars[,c('mpg','hp','wt')], 2, mean) # apply(mtcars[c('mpg','hp','wt')], 2, mean)

07. 삼각형의 밑변(base)과 높이(height)를 입력받아 넓이를 반환하는 triangle.area() 함수를 정의하시오. 그리고 이 함수를 사용해 밑변이 5.2, 높이가 4.6인 삼각형의 넓이를 구하시오.

triangle.area <- function(base, height){
  result <- base * height / 2
  return(result)
}

triangle.area(5.2, 4.6)

08. 숫자 벡터를 입력받아 최솟값, 최댓값, 평균값을 구하는 함수를 작성하려고 한다. [보기 2]의 스크립트를 실행하였을 때 'min: 1, max: 9, avg: 5'가 출력되도록 [보기 1]의 빈 칸을 채워 함수를 완성하시오.

multiple.answer <- function(data){
  res.min <- min(data)
  res.max <- max(data)
  res.avg <- mean(data)
  result <- list(min=res.min, max=res.max, avg=res.avg)
  return(result)
}

# test
data <- c(1,3,5,7,9)
result <- multiple.answer(data)
cat('min:', result$min, ', max:', result$max, ', avg:', result$avg, '\n')

09. mtcars 데이터셋에서 마력(mpg)이 가장 높은 자동차와 가장 낮은 모델명을 구하는 코드를 작성하고 결과를 구하시오.

rownames(mtcars[which.max(mtcars$mpg),])
rownames(mtcars[which.min(mtcars$mpg),])

10. 다음은 한 가전 회사의 A/S 홈페이지에 게시된 내용으로 드럼세탁기가 냉온수 급수가 안 될 때, 조치 사항을 안내하고 있다. 이 조치 사항을 순서도로 작성하시오.

11. 피보나치 수열은 [보기]와 같이 첫 번째 항은 0, 두 번째 항은 1, 세 번째 항부터는 바로 직전 두 항의 합으로 만들어진다. 예를 들면 세 번째 항은 1(=1 + 0), 네 번째 항은 2(=1 + 1)이다. 피보나치 수열을 20번째 항까지 구하는 코드를 for문을 사용하여 작성하고 결과를 출력하시오.

fibonacci <- function(num){
  for(i in 1:num){
    if(i == 1){
      result <- c(0)
    } else if(i == 2){
      result <- append(result, 1)
    } else if(i >= 3){
      result <- append(result, (result[i-1] + result[i-2]))
    }
  }
  return(result)
}
fibonacci(20)

12. R에 기본으로 내장된 USArrests 데이터셋은 1973년 미국 50개 주에서 발생한 강력 범죄에 대한 기록이다. 구체적으로 각 주를 관측값으로 하여 각 열에 인구 10만명 당 살인(Murder), 폭행(Assault), 강간(Rape)에 대한 체포건수를 저장하고 있다.

# (1) 살인, 폭행, 강간 범죄에 대한 체포건수의 합을 각각 구하시오.
apply(USArrests[,c('Murder','Assault','Rape')], 2, sum)

# (2) 살인, 폭행, 강간 범죄에 대한 체포건수의 평균을 각각 구하시오.
apply(USArrests[,c('Murder','Assault','Rape')], 2, mean)

# (3) 살인 범죄 체포가 가장 많이 발생한 주는 어디인지 구하시오.
rownames(USArrests)[which.max(USArrests$Murder)]

# (4) 폭행 범죄 체포가 가장 적게 발생한 주의 살인 범죄 체포건수를 구하시오.
USArrests[which.min(USArrests$Assault),'Murder']

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=257831838&start=slayer

 

난생처음 R 코딩 & 데이터 분석

168개의 코드 예제를 기반으로 프로그래밍 기초부터 데이터 분석까지 다루며, R에서 사용하는 문법을 최대한 쉽게 설명하고 있다. 또한 4단계 반복 학습 시스템을 통해 프로그래밍 감각을 제대로

www.aladin.co.kr

 

01. 다음 그림과 같이 팝업창을 띄워 값을 입력받기 위한 명령문을 완성하시오.

        A: svDialogs   B: dlgInput

02. print() 함수의 경우 자동으로 줄바꿈을 하지만 cat() 함수는 줄바꿈을 하지 않는다. cat() 함수에서 줄바꿈을 위해 어떤 문자열을 추가해야 하는지 적으시오.

        cat('출력 대상', '\n')

03. A란 현재 내가 읽거나 쓰고자 하는 파일이 위치하는 폴더를 말한다. 현재 A를 알아내기 위한 함수는 B, 작업 폴더를 변경하기 위한 함수는 C이다.

        A: 작업 폴더   B: getwd()   C: setwd()

04. 다음과 같이 콤마로 각각의 값을 구분하는 파일의 형식은 무엇인지 적으시오.

        .csv

05. 엑셀 파일을 불러오고 저장하기 위한 명령문을 완성하시오.

        A: xlsx   B: read.xlsx   C: write.xlsx

06. cat() 함수의 실행 결과를 'result.txt' 파일에 출력하기 위한 명령문을 완성하시오.

        A: sink   B: 'result.txt'   C: sink

07. 삼각형의 밑변과 높이를 팝업창에서 입력받아 넓이를 출력하는 프로그램을 작성하시오.

library(svDialogs)

base <- as.numeric(dlgInput('Base of a triangle')$res)
height <- as.numeric(dlgInput('Height of a triangle')$res)
square <- base * height / 2
print(square)

 08. 다음은 ds_tab.txt 파일에 저장된 데이터의 일부이다. 각 열은 탭으로 구분되어 있고, 헤더는 포함되어 있지 않다고 했을 때, 이 파일을 불러오기 위한 명령문을 작성하시오.

# setwd()
temp <- read.table('ds_tab.txt', header=F, sep='\t')

09. 다음과 같이 ds.txt를 ds.csv로 변경하여 저장하기 위한 명령문을 작성하시오.

data <- read.table('ds.txt', header=F, sep=" ")
write.csv(data, 'ds.csv', row.names=F) # 행번호 제외

10. 엑셀을 이용해 R에 내장되어 있는 iris 데이터셋을 분석하려고 한다. iris 데이터셋을 iris.xlsx 파일로 변환한 뒤 iris.xlsx 파일을 불러와 파일이 잘 생성되었는지 확인하시오.

#getwd()
#setwd()
install.packages('xlsx')
library(xlsx)
write.xlsx(iris, 'iris.xlsx', row.names=F)
iris.xlsx <- read.xlsx('iris.xlsx', header=T, sheetIndex=1)
iris.xlsx

11. 다음은 작업 결과를 log.txt에 저장하는 프로그램이다. 원하는 결과는 오른쪽 log.txt였지만 주어진 코드를 실행하니 다른 결과가 나왔다. 한 줄의 명령문만 수정하여 원하는 결과를 얻게 하시오.

#getwd()
#setwd()
library(svDialogs)
sink('log.txt')
cat('----- x * y ----- \n')
sink()
x <- as.numeric(dlgInput('Input')$res)
y <- as.numeric(dlgInput('Input')$res)
sink('log.txt', append=T)
cat('x =', x, 'y =', y, 'result =', x*y)
sink()

 

 

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=257831838&start=slayer

 

난생처음 R 코딩 & 데이터 분석

168개의 코드 예제를 기반으로 프로그래밍 기초부터 데이터 분석까지 다루며, R에서 사용하는 문법을 최대한 쉽게 설명하고 있다. 또한 4단계 반복 학습 시스템을 통해 프로그래밍 감각을 제대로

www.aladin.co.kr

 

01. 다음 중 2차원 형태의 자료구조 중 서로 다른 종류의 데이터를 함께 저장할 수 있는 것을 고르시오.

        데이터프레임

02. 다음을 읽고 (A)와 (B)에 맞는 단어를 적으시오.

        A: 관측값(observation)   B: 변수(variable)

03. 매트릭스 m과 동일한 매트릭스를 만들기 위해 A ~ D에 알맞은 값을 넣으시오.

#x <- c(2,4,6,8)
#y <- c(10,12,14,16)
#z <- c(18,20,22,24)
#m <- cbind(x, y, z)
matrix(c(2, 10, 18, 4, 12, 20, 6, 14, 22, 8, 16, 24), nrow = 4, byrow = T)
matrix(c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24), ncol = 3, byrow = F)

04. 매트릭스 m을 출력해보니 '보기 1'과 같다. 매트릭스 m을 출력했을 때 '보기 2'와 같이 만들기 위해 필요한 명령문을 작성하시오.

m <- matrix(c(9,7,5,3,8,11,2,9), nrow=2, byrow=T)
colnames(m) <- c('a','b','c','d')
rownames(m) <- c('x','y')
print(m)

05. 다음 문제를 해결하기 위한 코드를 작성하시오

# (1) 실수로 매트릭스 m의 행과 열을 바꿔서 입력하였다. 다시 매트릭스의 행과 열을 바꿔 m에 저장하시오.
m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, ncol = 3)
m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2)

# (2) 매트릭스 m을 데이터프레임으로 변경하여 df에 저장하시오.
m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2)
df <- data.frame(m)

# (3) df에 벡터 info를 마지막 열 뒤에 추가하여 새로운 데이터프레임 df.new에 저장하시오.
m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2)
df <- data.frame(m)
info <- c(7, 8, 9)
df.new <- cbind(df, info) # df.new <- data.frame(m, info)

# (4) df.new의 자료구조를 출력하시오.
m <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 3, ncol = 2)
df <- data.frame(m)
info <- c(7, 8, 9)
df.new <- data.frame(m, info)
print(class(df.new))

06. 다음과 같은 벡터가 있을 때, 다음 문제를 해결하기 위한 코드를 작성하시오.

# (1) 세 벡터를 하나로 묶어 데이터프레임 df에 저장하시오.
blood <- c('A', 'O', 'AB', 'B', 'B')
rh <- c('+', '+', '-', '+', '+')
age <- c(21, 30, 43, 17, 26)
df <- data.frame(blood, rh, age)

# (2) df의 열 이름을 출력하시오.
blood <- c('A', 'O', 'AB', 'B', 'B')
rh <- c('+', '+', '-', '+', '+')
age <- c(21, 30, 43, 17, 26)
df <- data.frame(blood, rh, age)
print(colnames(df))

# (3) blood 열 이름 값이 'B'가 아닌 행들을 추출해 df.nb에 저장하시오.
blood <- c('A', 'O', 'AB', 'B', 'B')
rh <- c('+', '+', '-', '+', '+')
age <- c(21, 30, 43, 17, 26)
df <- data.frame(blood, rh, age)
df.nb <- subset(df, df['blood'] != 'B') # df.nb <- subset(df, df$blood != 'B')
df.nb

07. str(cars) 명령문을 실행한 결과가 다음과 같을 때, 물음에 답하시오.

        (1) 50 / 2   (2) 변수:  speed, dist / 자료형: num, num

08. 다음 명령문 중 연산이 가능하다면 T, 불가하면 F를 기입하시오.

        (1) T   (2) T   (3) F   (4) T   (5) F

09. 다음은 한 음원 사이트에 있는 가수 이적의 4집 앨범 수록곡 정보이다. 물음에 답하시오.

# (1) 이 정보를 R의 2차원 자료구조를 이용하여 저장하시오. 저장할 변수명은 love, 각 열의 이름은 표의 헤어(번호, 제목, 좋아요)를 이용하시오.
number <- c(1,2,3,4,5,6,7)
title <- c('그대랑','대툼','빨래','두통','보조개','매듭','이상해')
like <- c(16075,8218,12119,738,3200,16144,5110)
love <- data.frame(number, title, like)
colnames(love) <- c('번호','제목','좋아요')

# (2) '좋아요'가 가장 많은 수록곡만 추출하여 변수 best에 저장하시오.
best <- subset(love, love['좋아요'] == max(like)) # best = subset(love, 좋아요 == max(좋아요))

10. 다음은 어느 반의 중간고사와 기말고사 시험 성적이다. 각 시험 성적은 데이터프레임 mid와 final에 저장되어 있다. 두 시험 성적의 평균(데이터프레임 형태 유지)을 구하는 명령문을 작성하시오.

mid_korean <- c(97,88,100)
mid_history <- c(100,82,96)
mid_math <- c(83,90,76)
mid_science <- c(95,91,89)
mid_english <- c(92,87,95)
mid <- data.frame(mid_korean, mid_history, mid_math, mid_science, mid_english)
colnames(mid) <- c('국어','역사','수학','과학','영어')
rownames(mid) <- c('스티브','엔더맨','크리퍼')

final_korean <- c(94,92,100)
final_history <- c(95,95,100)
final_math <- c(90,87,85)
final_science <- c(92,95,84)
final_english <- c(89,94,96)
final <- data.frame(final_korean, final_history, final_math, final_science, final_english)
colnames(final) <- c('국어','역사','수학','과학','영어')
rownames(final) <- c('스티브','엔더맨','크리퍼')

(rowMeans(mid) + rowMeans(final)) / 2

11. R에서 제공하는 cars 데이터셋은 자동차의 속도와 제동거리에 대한 자료이다. 이 데이터셋에 대해 다음 문제를 해결하기 위한 코드를 작성하시오.

# (1) 이 데이터셋의 자료구조는 무엇인가?
class(cars)

# (2) 이 데이터셋의 관측값과 컬럼의 개수를 구하시오.
print(cars)
dim(cars)[2] # <-> ncol(cars)

# (3) 이 데이터셋의 앞쪽 일부분의 내용을 보이시오.
head(cars)

# (4) 이 데이터셋의 요약 정보를 보이시오.
str(cars)

# (5) 이 데이터셋의 컬럼별 평균을 구하시오.
colMeans(cars)

# (6) 가장 긴 제동거리(dist)를 구하시오.
max(cars$dist)

# (7) 제동거리가 가장 길 때의 속력(speed)과 제동거리(dist)를 구하시오.
subset(cars, dist == max(dist))

12. R에서 제공하는 InsectSprays 데이터셋은 살충제의 효과를 실험한 자료이다. 이 데이터셋에 대해 다음 문제를 해결하기 위한 코드를 작성하시오.

# (1) 이 데이터셋의 자료구조가 매트릭스인지 확인하시오.
is.matrix(InsectSprays)

# (2) 이 데이터셋의 요약 정보를 보이시오.
str(InsectSprays)

# (3) 이 데이터셋의 뒤쪽 10개 내용을 보이시오.
tail(InsectSprays, 10)

# (4) 실험에 사용한 살충제(spray)의 종류를 구하시오.
levels(InsectSprays[,'spray'])

# (5) 살충제 종류별 데이터의 빈도를 구하시오.
table(InsectSprays[,'spray'])

# (6) 살충제 E의 자료만 추출하여 InsectSprays.e에 저장하시오
InsectSprays.e <- subset(InsectSprays, spray == 'E')

# (7) 살충제 E가 박멸한 해충 수(count)의 평균을 구하시오.
colMeans(subset(InsectSprays, select = 'count'))

+ Recent posts