# 1. gogak.csv, gift.csv 파일을 읽고
# 1) 하나의 고객번호를 입력하면 고객이 가져갈 수 있는 상품하나(가장 좋은)를 출력하는 함수 생성
[내 답안]
library(sqldf)
# 조인
sql1 <- 'select g1.GNO, g2.GNAME
from gogak g1, gift g2
where g1.POINT between g2.G_START and g2.G_END'
df1 <- sqldf(sql1)
df1

# 함수생성
bestproduct <- function(x) {
df1$GNAME[df1$GNO == x]
}
# 함수실행
bestproduct('20010001')

[문제풀이]
f_gift <- function(x) {
gift[(x >= gift$G_START) & (x <= gift$G_END), 'GNAME']
}
f_gift(980000)
# 2) 모든 고객에 함수를 적용하여 상품 정보 출력
[내 답안]
sapply(df1$GNO, bestproduct)

[문제풀이]
f_gift(gogak$POINT)
sapply(gogak$POINT, f_gift)
# 2. student.csv 파일을 읽고
# 각 학생의 비만여부 출력(20개의 비만여부)
# 표준몸무게보다 큰 경우 과체중, 작은경우 저체중, 같은경우 표준
# 표준몸무게 = (키 - 100) * 0.9
[내 답안]
std <- read.csv('student.csv', fileEncoding = 'cp949')
std
# 표준몸무게
stwe <- (std$HEIGHT - 100) * 0.9
std$stwe <- (std$HEIGHT - 100) * 0.9
# 비만여부 구하기
std$bodytype <- ifelse(std$WEIGHT > std$stwe, '과체중',
ifelse(std$WEIGHT == std$stwe, '표준', '저체중'))
std

[문제풀이]
std$표준몸무게 <- (std$HEIGHT - 100) * 0.9
# 풀이 1)
ifelse(std$WEIGHT > std$표준몸무게, '과체중', ifelse(std$WEIGHT < std$표준몸무게, '저체중', '표준'))
# 풀이 2)
f_biman <- function(x,y) {
if (x > y) {
return('과체중')
} else if (x < y) {
return('저체중')
} else {
return('표준')
}
}
f_biman(std$WEIGHT, std$표준몸무게) # error
mapply(f_biman, std$WEIGHT, std$표준몸무게)
# 3. employment.csv 파일을 읽고
df1 <- read.csv('employment.csv', fileEncoding = 'cp949')
# 1) 총근로일수의 연도별 평균
[내 답안]
# 1) 총근로일수의 연도별 평균
df1
str(df1)
nrow(df1)
names(df1)
# 열 이름 정리
names(df1) <- str_remove_all(names(df1), 'X')
df1
# 총근로일수 열만 선택
df2 <- df1[, nchar(names(df1)) == 4]
df2
# 2번째 행 제거하기
df3 <- df2[df2$고용형태 != '고용형태',]
df3
# '-' 삭제하기
for (i in 2:ncol(df3)) {
df3[, i] <- as.numeric(str_replace_all(df3[, i], '-', '0'))
}
df3
# 총근로일수의 연도별 평균 구하기
round(apply(df3[,-1],2,mean), 2)

[문제풀이]
df2 <- df1[-1,df1[1,] == '총근로일수 (일)']
df2[df2 == '-'] <- NA
# 원본의 형식 유지가 좋음
# matrix의 경우 key indexing이 x
df2 <- as.data.frame(apply(df2,2,as.numeric))
# dataframe 변환도 방법이지만 [,]로 데이터 선택을 해서 덮어씌우는 방법도 있음
df2[,] <- apply(df2,2,as.numeric) # 주의 : apply 결과가 matrix로 출력되므로 전체적용 결과를 원래 객체에 덮어쓰면 객체가 matrix가 됨
# 따라서 객체의 전체 데이터를 선택(df[,])한 후 덮어쓰는 방식으로 수정
# df[] 도 가능은 하나 python에서는 x
str(df2)
apply(df2, 2, mean, na.rm=T)

# 2) 고용형태별 월급여액 평균
# (전체근로자와 전체근로자(특수형태포함) / 비정규근로자와 비정규근로자(특수형태포함)가 각각 다른 그룹이 되도록)
[내 답안]
df1 <- read.csv('employment.csv', fileEncoding = 'cp949')
df3
str(df3)
apply(df3[,-1], 1, mean)
df1
# 열 이름 정리
names(df1) <- str_remove_all(names(df1), 'X')
df1
# 총근로일수 열만 선택
df2 <- df1[,str_detect(names(df1), '고용형태|\\d{4}.4')]
df2
# 열 이름 재정리(.4 제외)
names(df2) <- str_remove_all(names(df2), '.4')
df2
# 2번째 행 제거하기
df3 <- df2[df2$고용형태 != '고용형태',]
df3
str(df3)
# ',' 제거 및 숫자 변환
for (i in 2:ncol(df3)) {
df3[, i] <- as.numeric(str_remove_all(df3[, i], ','))
}
str(df3)
df3$mean_total <- round(apply(df3[,-1], 1, mean), 2)
df3

[문제풀이]
df3<- df1[-1, df1[1,] == '월급여액 (천원)']
f1 <- function(x) {
as.numeric(str_remove_all(x,','))
}
df3[,] <- apply(df3, 2, f1)
v1 <- apply(df3, 1, mean)
names(v1) <- df1[-1,1]
# ** 참고 : 행별, 열별 총합 및 평균 함수
rowSums(df3)
colSums(df3)
rowMeans(df3)
colMeans(df3)
'아이티윌_데이터 분석 55기 > 문제풀이_통계 및 분석' 카테고리의 다른 글
| #7-2. 7일차 퀴즈에 대한 문제풀이 (0) | 2026.04.08 |
|---|---|
| #6-2. 6일차 퀴즈에 대한 문제풀이 (0) | 2026.04.07 |
| #4-2. 4일차 퀴즈에 대한 문제풀이 (0) | 2026.04.02 |
| #3-2. 3일차 퀴즈에 대한 문제풀이 (0) | 2026.04.01 |
| #2-2. 2일차 퀴즈에 대한 문제풀이 (0) | 2026.03.31 |