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

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

ecosso 2026. 4. 1. 17:56

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)