아이티윌_데이터 분석 55기/문제풀이_통계 및 분석

#5-2. 5일차 퀴즈에 대한 문제풀이

ecosso 2026. 4. 3. 17:39

# 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)