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

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

ecosso 2026. 4. 8. 17:37

 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(총매출액))