1. 교습현황.csv 파일을 읽고
df1 <- read.csv('교습현황.csv', fileEncoding = 'cp949')
head(df1)
[문제풀이] - 전처리
# step1) wide -> long
library(reshape2)
df2 <- melt(df1, id.vars = names(df1)[1:5], variable.name = '날짜', value.name = '매출액')
# step2) 매출액 컬럼 타입 변환
library(stringr)
df2$매출액 <- as.numeric(str_remove_all(df2$매출액, ',')) # 파이프를 사용한 표현 : df2$매출액 |> str_remove_all(',') |> as.numeric()
1) 교습과정별 연도별 매출 총액 확인
[내 답변]
df1$교습과정
head(df1)
# 열명 수정
df2 <- df1[,-c(1:4)]
names(df2) <- str_remove_all(names(df2), 'X|\\.\\d+\\.')
# melt 사용
df3 <- melt(df2, id.vars = '교습과정', variable.name = '연도', value.name = '매출')
head(df3)
# '매출' 열 숫자 변환
df3$매출 <- as.numeric(str_remove_all(df3$매출, ','))
# 교습과정별 연도별 매출 총액 확인
df4 <- aggregate(매출 ~ 교습과정 + 연도, df3, sum)
df5 <- arrange(df4, 교습과정, 연도)
print(df5)
> print(df5)
교습과정 연도 매출
1 기타(소) 2016 26336000
2 기타(소) 2017 23648000
3 기타(소) 2018 16685000
4 로봇 2016 5487000
5 로봇 2017 5862000
6 로봇 2018 1743000
7 무용 2016 6371000
8 무용 2017 4776000
9 무용 2018 4714000
10 미술 2016 1283631000
11 미술 2017 1213222000
12 미술 2018 1198716000
13 바둑 2016 35090000
14 바둑 2017 36477000
15 바둑 2018 31829000
16 보습 2016 3011669000
17 보습 2017 2989834000
18 보습 2018 2972707000
19 보습·논술 2016 59172000
20 보습·논술 2017 59437000
21 보습·논술 2018 44798000
22 서예 2016 15599000
23 서예 2017 25762000
24 서예 2018 27243000
25 실용외국어(유아/초·중·고) 2016 109725000
26 실용외국어(유아/초·중·고) 2017 92375000
27 실용외국어(유아/초·중·고) 2018 99750000
28 웅변 2016 7654000
29 웅변 2017 11048000
30 웅변 2018 8841000
31 음악 2016 2573142000
32 음악 2017 2477924000
33 음악 2018 2590811000
34 주산 2016 20780000
35 주산 2017 19250000
36 주산 2018 12263000
37 컴퓨터(소) 2016 25829000
38 컴퓨터(소) 2017 18202000
39 컴퓨터(소) 2018 11911000
[문제풀이]
## 1) 교습과정별 연도별 매출 총액 확인
# step1) 연도추출
df2$연도 <- str_sub(df2$날짜, 2, 5)
# step2) 교습과정별 연도별 매출
library(plyr)
ddply(df2, .(교습과정, 연도), summarise, 총매출 = sum(매출액))
2) 교습과정별 월별(연도 상관없이) 매출 총액 확인 -> 1월에서 12월 12개 그룹 리턴
[내 답변]
head(df1)
# 열명 수정
df2_1 <- df1
df2_1 <- df2_1[,-c(1:4)]
head(df2_1)
# melt 사용
df2_2 <- melt(df2_1, id.vars = '교습과정', variable.name = '월', value.name = '매출')
head(df2_2)
# '매출' 열 숫자 변환
df2_2$매출 <- as.numeric(str_remove_all(df2_2$매출, ','))
# '연도' 열 정리
df2_2$월 <- str_remove_all(df2_2$월, 'X\\d+|\\.')
# 교습과정별 월별 매출 총액 확인
df2_3 <- aggregate(매출 ~ 교습과정 + 월, df2_2, sum)
df2_4 <- arrange(df2_3, 월)
print(df2_4)
> print(df2_4)
교습과정 월 매출
1 기타(소) 1 66669000
2 로봇 1 13092000
3 무용 1 15861000
4 미술 1 3695569000
5 바둑 1 103396000
6 보습 1 8974210000
7 보습·논술 1 163407000
8 서예 1 68604000
9 실용외국어(유아/초·중·고) 1 301850000
10 웅변 1 27543000
11 음악 1 7641877000
12 주산 1 52293000
13 컴퓨터(소) 1 55942000
14 기타(소) 10 62049000
15 로봇 10 14877000
16 무용 10 25755000
17 미술 10 3564395000
18 바둑 10 101395000
19 보습 10 8913592000
20 보습·논술 10 166320000
21 서예 10 73625000
22 실용외국어(유아/초·중·고) 10 304821000
23 웅변 10 16637000
24 음악 10 7629482000
25 주산 10 40514000
26 컴퓨터(소) 10 62957000
27 기타(소) 11 61349000
28 로봇 11 15069000
29 무용 11 20546000
30 미술 11 3502578000
31 바둑 11 96482000
32 보습 11 9001847000
33 보습·논술 11 147196000
34 서예 11 59020000
35 실용외국어(유아/초·중·고) 11 274844000
36 웅변 11 21598000
37 음악 11 7651690000
38 주산 11 41568000
39 컴퓨터(소) 11 65971000
40 기타(소) 12 59228000
41 로봇 12 11197000
42 무용 12 20870000
43 미술 12 3546002000
44 바둑 12 117737000
45 보습 12 8746499000
46 보습·논술 12 164316000
47 서예 12 69039000
48 실용외국어(유아/초·중·고) 12 278408000
49 웅변 12 17396000
50 음악 12 7565204000
51 주산 12 41067000
52 컴퓨터(소) 12 66341000
53 기타(소) 2 74638000
54 로봇 2 15711000
55 무용 2 19981000
56 미술 2 3698135000
57 바둑 2 108116000
58 보습 2 8891642000
59 보습·논술 2 179181000
60 서예 2 55881000
61 실용외국어(유아/초·중·고) 2 322322000
62 웅변 2 18647000
63 음악 2 7706489000
64 주산 2 45710000
65 컴퓨터(소) 2 56717000
66 기타(소) 3 63776000
67 로봇 3 8391000
68 무용 3 19971000
69 미술 3 3697139000
70 바둑 3 94824000
71 보습 3 8886213000
72 보습·논술 3 165177000
73 서예 3 73068000
74 실용외국어(유아/초·중·고) 3 278249000
75 웅변 3 24204000
76 음악 3 7749105000
77 주산 3 34985000
78 컴퓨터(소) 3 60558000
79 기타(소) 4 72298000
80 로봇 4 13330000
81 무용 4 19698000
82 미술 4 3689735000
83 바둑 4 87218000
84 보습 4 9005969000
85 보습·논술 4 138896000
86 서예 4 51439000
87 실용외국어(유아/초·중·고) 4 295300000
88 웅변 4 16539000
89 음악 4 7555699000
90 주산 4 51880000
91 컴퓨터(소) 4 61945000
92 기타(소) 5 66897000
93 로봇 5 9087000
94 무용 5 17165000
95 미술 5 3646725000
96 바둑 5 116043000
97 보습 5 8797502000
98 보습·논술 5 188238000
99 서예 5 56435000
100 실용외국어(유아/초·중·고) 5 291423000
101 웅변 5 27442000
102 음악 5 7656362000
103 주산 5 48784000
104 컴퓨터(소) 5 76641000
105 기타(소) 6 66228000
106 로봇 6 4474000
107 무용 6 20298000
108 미술 6 3681026000
109 바둑 6 112147000
110 보습 6 9033730000
111 보습·논술 6 178293000
112 서예 6 65403000
113 실용외국어(유아/초·중·고) 6 331448000
114 웅변 6 20010000
115 음악 6 7592508000
116 주산 6 35531000
117 컴퓨터(소) 6 51976000
118 기타(소) 7 63159000
119 로봇 7 11017000
120 무용 7 23145000
121 미술 7 3636613000
122 바둑 7 119337000
123 보습 7 8908786000
124 보습·논술 7 157299000
125 서예 7 67577000
126 실용외국어(유아/초·중·고) 7 276231000
127 웅변 7 20244000
128 음악 7 7577937000
129 주산 7 42663000
130 컴퓨터(소) 7 58611000
131 기타(소) 8 57903000
132 로봇 8 12274000
133 무용 8 13946000
134 미술 8 3586408000
135 바둑 8 99412000
136 보습 8 8938809000
137 보습·논술 8 197759000
138 서예 8 56236000
139 실용외국어(유아/초·중·고) 8 298437000
140 웅변 8 23201000
141 음악 8 7844362000
142 주산 8 43567000
143 컴퓨터(소) 8 42421000
144 기타(소) 9 57543000
145 로봇 9 14286000
146 무용 9 25489000
147 미술 9 3619268000
148 바둑 9 95948000
149 보습 9 8929083000
150 보습·논술 9 172736000
151 서예 9 62065000
152 실용외국어(유아/초·중·고) 9 348541000
153 웅변 9 20529000
154 음악 9 7698549000
155 주산 9 35589000
156 컴퓨터(소) 9 54827000
[문제풀이]
# step1) 월 추출
df2$월 <- str_extract(df2$날짜, 'x\\d{4}\\.(\\d{1,2})\\.', 1) |> as.numeric()
unique(df2$월)
# step2) 교습과정별 월별 매출
ddply(df2, .(교습과정, 월), summarise, 총매출 = sum(매출액))
3) 교습과정별로 매출이 가장 높은 월 확인
[내 답변]
df3_1 <- df2_4
head(df3_2)
# 교습과정별로 매출이 가장 높은 월 확인
df3_2 <- ddply(df3_1, .(교습과정), transform, 최대매출 = max(매출))
df3_3 <- df3_2[df3_2$매출 == df3_2$최대매출,]
print(df3_3)
> print(df3_3)
교습과정 월 매출 최대매출
5 기타(소) 2 74638000 74638000
17 로봇 2 15711000 15711000
26 무용 10 25755000 25755000
41 미술 2 3698135000 3698135000
58 바둑 7 119337000 119337000
69 보습 6 9033730000 9033730000
83 보습·논술 8 197759000 197759000
86 서예 10 73625000 73625000
108 실용외국어(유아/초·중·고) 9 348541000 348541000
109 웅변 1 27543000 27543000
131 음악 8 7844362000 7844362000
133 주산 1 52293000 52293000
152 컴퓨터(소) 5 76641000 76641000
[문제풀이]
ddply(df3, .(교습과정), subset, 총매출 == max(총매출))
4) 교습과정별 구별 2016~2018 매출 총 합 기준 가장 매출이 높은 교습소명 출력
[내 답변]
head(df1)
# 구 추출
df4_1 <- df1
df4_1$구 <- str_match(df1$교습소주소, '(\\w+\\s)(\\w+)(.*)')[,3]
df4_1 <- df4_1[,-c(2:4)]
# 열명 수정
names(df4_1) <- str_remove_all(names(df4_1), 'X|\\.\\d+\\.')
# melt 사용
df4_2 <- melt(df4_1, id.vars = c('교습과정','구','교습소명'), variable.name = '연도', value.name = '매출')
# '매출' 열 숫자 변환
df4_2$매출 <- as.numeric(str_remove_all(df4_2$매출, ','))
# 교습과정별 구별 2016~2018 매출 총 합 기준 가장 매출이 높은 교습소명 출력
df4_2$연도 <- as.numeric(as.character(df4_2$연도))
df4_3 <- df4_2 %>% filter(between(연도, 2016,2018))
df4_4 <- ddply(df4_3, .(교습과정, 구), transform, 최대매출 = max(매출))
df4_5 <- df4_4[df4_4$매출 == df4_4$최대매출,]
df4_6 <- df4_5[,c('교습과정','구','교습소명', '매출')]
print(df4_6)
> print(df4_6)
교습과정 구 교습소명 매출
1 기타(소) 관악구 청도한자교습소 3364000
10 기타(소) 동작구 예랑한자교습소 6788000
20 로봇 관악구 카이로봇 로봇과학교습소 5862000
22 무용 관악구 예은무용교습소 5826000
287 미술 관악구 주연미술교습소 6999000
797 미술 동작구 아트나인미술교습소 6975000
1037 바둑 관악구 대일바둑교습소 6505000
1058 바둑 동작구 새싹바둑교습소 5843000
1849 보습 관악구 공감영어교습소 6997000
2635 보습 동작구 와이제이영어교습소 7000000
3590 보습·논술 관악구 은천한우리독서토론논술교습소 6825000
3621 보습·논술 동작구 동작솔루니논술교습소 6448000
3640 서예 관악구 하전서예교습소 6484000
3644 서예 동작구 동암서예교습소 6438000
3655 실용외국어(유아/초·중·고) 관악구 삼성청크영어교습소 6711000
3702 실용외국어(유아/초·중·고) 동작구 보라매해법중국어교습소 6789000
3730 웅변 동작구 플래이엔웅변스피치교습소 6837000
4099 음악 관악구 현대피아노교습소 6997000
5569 음악 동작구 현음피아노교습소 7000000
5895 주산 동작구 셈더하기주산교습소 6141000
5907 컴퓨터(소) 동작구 창조컴퓨터교습소 6408000
[문제풀이]
# step1) 구 추출
df2$구 <- str_extract(df2$교습소주소, '서울특별시 ([가-힣]+구)', 1)
# step2) 구별, 교습과정별, 교습소별 매출총액
df4 <- ddply(df2, .(구, 교습과정, 교습소명), summarise, 총매출액 = sum(매출액))
ddply(df4, .(구, 교습과정), subset, 총매출액 == max(총매출액))
5) 교습과정별로 2016~2018 매출 총 합 기준 가장 매출이 높은 동이름 출력
[내 답변]
head(df1)
df5_1 <- df1
df5_1
head(df5_1)
# 동 이름 구하기
df5_1$동 <- str_match(df1$교습소주소, '.*\\((\\w+).*\\)')[,2]
df5_1 <- df5_1[,-c(1:4)]
# 열명 수정
names(df5_1) <- str_remove_all(names(df5_1), 'X|\\.\\d+\\.')
# melt 사용
df5_2 <- melt(df5_1, id.vars = c('교습과정','동'), variable.name = '연도', value.name = '매출')
# '매출' 열 숫자 변환
df5_2$매출 <- as.numeric(str_remove_all(df5_2$매출, ','))
# 교습과정별 동별 2016~2018 매출 총 합 기준 가장 매출이 높은 교습소명 출력
df5_2$연도 <- as.numeric(as.character(df5_2$연도))
df5_3 <- df5_2 %>% filter(between(연도, 2016,2018))
df5_4 <- aggregate(매출 ~ 교습과정 + 동, df5_3, max)
print(df5_4)
> print(df5_4)
교습과정 동 매출
1 무용 남현동 6928000
2 보습 남현동 6952000
3 보습·논술 남현동 7000000
4 음악 남현동 6997000
5 미술 노량진동 6821000
6 보습 노량진동 6991000
7 음악 노량진동 6995000
8 미술 대방동 6987000
9 바둑 대방동 6968000
10 보습 대방동 7000000
11 실용외국어(유아/초·중·고) 대방동 6995000
12 웅변 대방동 6837000
13 음악 대방동 6998000
14 주산 대방동 6987000
15 보습 동작동 6966000
16 음악 동작동 6998000
17 보습 본동 6999000
18 서예 본동 6438000
19 음악 본동 7000000
20 로봇 봉천동 6997000
21 미술 봉천동 6997000
22 보습 봉천동 6995000
23 보습·논술 봉천동 6989000
24 실용외국어(유아/초·중·고) 봉천동 6964000
25 음악 봉천동 6998000
26 기타(소) 사당동 6947000
27 미술 사당동 6990000
28 보습 사당동 6999000
29 실용외국어(유아/초·중·고) 사당동 6977000
30 음악 사당동 6999000
31 미술 상도1동 6950000
32 보습 상도1동 6994000
33 음악 상도1동 6872000
34 미술 상도동 6991000
35 보습 상도동 6996000
36 실용외국어(유아/초·중·고) 상도동 6936000
37 음악 상도동 6999000
38 미술 신대방동 6979000
39 보습 신대방동 6984000
40 보습·논술 신대방동 6980000
41 실용외국어(유아/초·중·고) 신대방동 6984000
42 음악 신대방동 6999000
43 컴퓨터(소) 신대방동 6997000
44 기타(소) 신림동 6049000
45 미술 신림동 6999000
46 바둑 신림동 6827000
47 보습 신림동 7000000
48 서예 신림동 6774000
49 음악 신림동 6997000
50 미술 흑석동 6990000
51 보습 흑석동 6997000
52 음악 흑석동 6981000
[문제풀이]
# step1) 동 추출
df2$교습소주소[674]
v1 <- str_extract(df2$교습소주소, '\\(([가-힣]+)[,)]', 1)
df2$교습소주소[is.na(v1)] # NA로 나온 결과 확인 -> 동이름에 숫자 포함
df2$동 <- str_extract(df2$교습소주소, '\\(([가-힣0-9]+)[,)]',1)
unique(df2$동) # 결과 확인 -> 4단지, 벽산블루밍, 2층, 우성쇼핑 등 출력됨
df2$동 %in% c('4단지', '벽산블루밍', '2층', '우성쇼핑')
df2$동 <- str_extract(df2$교습소주소, '.+\\(([가-힣0-9]+)[,)]',1)
# step2) 교습과정별 동별 총매출
ddply(df2, .(교습과정, 동), summarise, 총매출액 = sum(매출액))
# +) 교습과정별 최고매출액
ddply(df5, .(교습과정), subset, 총매출액 == max(총매출액))
'아이티윌_데이터 분석 55기 > 문제풀이_통계 및 분석' 카테고리의 다른 글
| #9-2. 9일차 퀴즈에 대한 문제풀이 (0) | 2026.04.10 |
|---|---|
| #8-2. 8일차 퀴즈에 대한 문제풀이 (0) | 2026.04.09 |
| #6-2. 6일차 퀴즈에 대한 문제풀이 (0) | 2026.04.07 |
| #5-2. 5일차 퀴즈에 대한 문제풀이 (0) | 2026.04.03 |
| #4-2. 4일차 퀴즈에 대한 문제풀이 (0) | 2026.04.02 |