1. 1. delivery.csv 파일을 읽고
deli <- read.csv('delivery.csv', fileEncoding = 'cp949')
1) 요일별, 업종별 총 통화건수를 출력(단, 일월화수목금토 순서대로, 업종 오름차순 정렬하여 출력)
[내 답안]
str(deli)
head(deli)
# 요일 및 요일 순서 계산
str(deli$일자)
as.character(deli$일자)
as.Date(as.character(deli$일자), '%Y%m%d')
deli$요일 <- strftime((as.Date(as.character(deli$일자), '%Y%m%d')), '%A')
deli$요일순서 <- strftime((as.Date(as.character(deli$일자), '%Y%m%d')), '%w')
# 그룹핑
df1 <- ddply(deli, .(요일, 요일순서, 업종), summarise, sum_call = sum(통화건수))
df1
# 정렬
arrange(df1, 요일순서, 업종)[, c('요일', '업종', 'sum_call')]

[문제풀이]
head(deli)
str(deli)
as.Date(20180201) # 파싱불가
as.Date('20180201') # 에러(기본날짜포맷과 일치하지 않기 때문 <- 구분기호의 생략)
as.Date('2018/02/01') # 정상
as.Date('20180201', '%Y%m%d') # 정상
strptime(20210201, '%Y%m%d')
# step1) 요일 출력
deli$일자 <- as.Date(as.character(deli$일자), '%Y%m%d')
deli$요일 <- strftime(deli$일자, '%A') # 문자출력
deli$요일2 <- strftime(deli$일자, '%w') # 숫자출력
# step2) 그룹핑
deli2 <- ddply(deli, .(요일, 요일2, 업종), summarise, 총통화건수 = sum(통화건수))
# step3) 정렬
arrange(deli2, 요일2, 업종)[, -2]
2) 시간대별 가장 인기있는 음식업종을 시간대와 함께 출력
[내 답안]
head(deli)
df2 <- ddply(deli, .(시간대, 업종), summarise, sum_call = sum(통화건수))
df3 <- ddply(df2, .(시간대), transform, max_call=max(sum_call))
df3[df3$sum_call == df3$max_call,]

[문제풀이]
# step1) 시간대별, 업종별 총통화건수 합
deli3 <- ddply(deli, .(시간대,업종), summarise, 총통화건수 = sum(통화건수))
# step2) 가장 인기있는 음식업종 찾기
ddply(deli3, .(시간대), subset, 총통화건수 == max(총통화건수))
2. subway2.csv 파일을 읽고 하차 데이터에 대해 아래와 같이 출력
sub <- read.csv('subway2.csv', fileEncoding = 'cp949', skip = 1)
# 전체 5 6 7 8 ...
# 서울역(1) 7829 48553 110250 233852
# 시청(1) 4142 19730 67995 175458
# ...
[내 답안]
str(sub)
head(sub)
# 열 이름 정리
names(sub) <- str_remove_all(names(sub), '^0|X|\\.\\d+')
names(sub) <- str_remove_all(names(sub), '^0')
sub
# 홀수행만 세기
sub[seq(1,nrow(sub) ,2),][,1]
# 짝수행만 세기
sub[seq(2,nrow(sub),2),][,1]
# 짝수행을 홀수행에
sub[seq(2,nrow(sub),2),][,1] <- sub[seq(1,nrow(sub) ,2),][,1]
sub
# 구분 - 하차만 골라내기
sub[sub$구분 == '하차',]

[문제풀이]
# step1) 승/하차 데이터분리
sub1 <- sub[sub$구분 == '승차', -2]
sub2 <- sub[sub$구분 == '하차', -2]
sub2$전체 <- sub1$전체
# step2) 컴럼이름 변경
as.numeric(str_sub(names(sub2)[-1],2,3))
as.numeric(str_remove_all(names(sub2)[-1], 'X|\\.\\d{2}'))
3. read_test.csv 파일을 읽고
test1 <- read.csv('read_test.csv')
1) a 컬럼의 총 합을 구하여라
[내 답안]
str(test1)
head(test1)
test1$a <- str_remove_all(test1$a, '\\D')
test1$a <- as.numeric(test1$a)
sum(test1$a, na.rm=T)

[문제풀이]
2) a 컬럼의 값 중 180이 초과한 데이터는 잘못 들어온 것이라 가정,
이 값들을 이들을 제외한 a컬럼의 평균값으로 대치한 후
a 컬럼의 총 합을 소수점 둘째자리까지 표현
[내 답안]
# 180 이하 행의 평균값
ddply(test1, .(a), subset, a <= 180)
mean_under <- round(mean(test1$a[test1$a<=180], na.rm=T),2)
mean_under
# 180 초과 행 구하고 값 치환하기
test1$a[test1$a > 180] <- mean_under
# 전체합
sum(test1$a, na.rm=T)

[문제풀이]
# step1) 정상치들의 평균 계산
vmean <- mean(test1[test1$a <= 180 , 'a'], na.rm=T)
# step2) 이상치 대치
test1[(test1$a > 180) & (!is.na(test1$a)), 'a'] <- vmean
# step3) 전체 평균
result2 <- round(mean(test1$a, na.rm=T), 2)
print(result2)
+) 전체합
# step3) 전체 평균
result2 <- round(sum(test1$a, na.rm=T), 2)
print(result2)
'아이티윌_데이터 분석 55기 > 문제풀이_통계 및 분석' 카테고리의 다른 글
| #6-2. 6일차 퀴즈에 대한 문제풀이 (0) | 2026.04.07 |
|---|---|
| #5-2. 5일차 퀴즈에 대한 문제풀이 (0) | 2026.04.03 |
| #4-2. 4일차 퀴즈에 대한 문제풀이 (0) | 2026.04.02 |
| #2-2. 2일차 퀴즈에 대한 문제풀이 (0) | 2026.03.31 |
| #1-2. 1일차 퀴즈에 대한 문제풀이 (0) | 2026.03.30 |