아이티윌_데이터 분석 55기/문제풀이_Python

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

ecosso 2026. 5. 14. 18:13

# 1. delivery.csv 파일을 읽고
deli = pd.read_csv('delivery.csv', encoding='cp949')
deli.head()

deli.head()
Out[352]: 
         일자  시간대           업종     시도  시군구   읍면동  통화건수
0  20180201    0  음식점-족발/보쌈전문  서울특별시  강남구   논현동     5
1  20180201    0  음식점-족발/보쌈전문  서울특별시  강남구   역삼동     5
2  20180201    0  음식점-족발/보쌈전문  서울특별시  강서구  내발산동     5
3  20180201    0  음식점-족발/보쌈전문  서울특별시  강서구   화곡동     5
4  20180201    0  음식점-족발/보쌈전문  서울특별시  동작구  신대방동     5


# 1) 일자별 통화건수 총 합 

 

더보기

[ 내 답변 ]

deli.groupby('일자')['통화건수'].sum()

deli.groupby('일자')['통화건수'].sum()
Out[353]: 
일자
20180201    39653
20180202    46081
20180203    54124
20180204    50323
20180205    35023
20180206    38628
20180207    39371
20180208    40153
20180209    49116
20180210    54101
20180211    50795
20180212    36734
20180213    43097
20180214    45282
20180215    28201
20180216    16570
20180217    34789
20180218    43692
20180219    34259
20180220    38036
20180221    39381
20180222    42309
20180223    50270
20180224    53415
20180225    51286
20180226    36141
20180227    38783
20180228    52323
Name: 통화건수, dtype: int64

 

 

[ 문제풀이 ] 

deli.groupby('일자', as_index = False)['통화건수'].sum()

deli.groupby('일자', as_index = False)['통화건수'].sum()
Out[11]: 
          일자   통화건수
0   20180201  39653
1   20180202  46081
2   20180203  54124
3   20180204  50323
4   20180205  35023
5   20180206  38628
6   20180207  39371
7   20180208  40153
8   20180209  49116
9   20180210  54101
10  20180211  50795
11  20180212  36734
12  20180213  43097
13  20180214  45282
14  20180215  28201
15  20180216  16570
16  20180217  34789
17  20180218  43692
18  20180219  34259
19  20180220  38036
20  20180221  39381
21  20180222  42309
22  20180223  50270
23  20180224  53415
24  20180225  51286
25  20180226  36141
26  20180227  38783
27  20180228  52323


# 2) 시도별 시군구별 통화건수 총합

 

더보기

[ 내 답변 ]

deli.groupby('시군구')['통화건수'].sum()

deli.groupby('시군구')['통화건수'].sum()
Out[354]: 
시군구
강남구      94598
강동구      50951
강북구      59290
강서구     102926
관악구      14713
광진구      14784
구로구      31730
금천구      19702
노원구      51615
도봉구       9497
동대문구     44931
동작구      76491
마포구      40206
서대문구     63240
서초구      65928
성동구      52677
성북구      45446
송파구      59997
양천구      15846
영등포구     61204
용산구      46040
은평구      38425
종로구      23010
중구       59952
중랑구      38737

 

 

[ 문제풀이 ] 

deli.groupby(['시도','시군구'], as_index = False)['통화건수'].sum()

deli.groupby(['시도','시군구'], as_index = False)['통화건수'].sum()
Out[15]: 
       시도   시군구    통화건수
0   서울특별시   강남구   94598
1   서울특별시   강동구   50951
2   서울특별시   강북구   59290
3   서울특별시   강서구  102926
4   서울특별시   관악구   14713
5   서울특별시   광진구   14784
6   서울특별시   구로구   31730
7   서울특별시   금천구   19702
8   서울특별시   노원구   51615
9   서울특별시   도봉구    9497
10  서울특별시  동대문구   44931
11  서울특별시   동작구   76491
12  서울특별시   마포구   40206
13  서울특별시  서대문구   63240
14  서울특별시   서초구   65928
15  서울특별시   성동구   52677
16  서울특별시   성북구   45446
17  서울특별시   송파구   59997
18  서울특별시   양천구   15846
19  서울특별시  영등포구   61204
20  서울특별시   용산구   46040
21  서울특별시   은평구   38425
22  서울특별시   종로구   23010
23  서울특별시    중구   59952
24  서울특별시   중랑구   38737


# 3) 시간대별 통화건수가 가장 많은 음식업종

 

더보기

[ 내 답변 ]

max_call = deli.groupby('시간대')['통화건수'].transform('max')
deli.loc[deli['통화건수'] == max_call, ['시간대', '업종', '통화건수']]

deli.loc[deli['통화건수'] == max_call, ['시간대', '업종', '통화건수']]
Out[380]: 
        시간대           업종  통화건수
425       9     음식점-중국음식    14
515      10     음식점-중국음식    41
9010      1           치킨    14
10148    13     음식점-중국음식   148
10456    14     음식점-중국음식   102
10751    15     음식점-중국음식    64
13835     1           치킨    14
16253    17           치킨   175
22619    10     음식점-중국음식    41
39253    22           치킨   200
39892     4     음식점-중국음식    15
39921     5     음식점-중국음식    11
43751    21           치킨   189
46594    16           치킨   101
46960    17           치킨   175
47327    18           치킨   229
53666    11     음식점-중국음식   118
62290     7     음식점-중국음식     9
62296     7     음식점-중국음식     9
62312     8     음식점-중국음식    10
79738     6  음식점-족발/보쌈전문    10
97066     2     음식점-중국음식    12
97115     3     음식점-중국음식    13
97834    12     음식점-중국음식   168
100243   19           치킨   229
101687    0           치킨    44
118195   20           치킨   227
119044   23           치킨   106

 

[ 문제풀이 ] 

# 문제풀이
1) 기초데이터 생성
deli2 = deli.groupby(['시간대','업종'], as_index = False)['통화건수'].sum()

2) groupby + merge
deli_max = deli2.groupby('시간대', as_index = False)['통화건수'].max()
pd.merge(deli2, deli_max)

3) transform
deli2['최대통화건수'] = deli2.groupby('시간대')['통화건수'].transform('max')
deli2.loc[deli2['통화건수'] == deli2['최대통화건수'], :]

pd.merge(deli2, deli_max)
Out[18]: 
    시간대        업종   통화건수
0     0        치킨  10750
1     1        치킨   4859
2     2  음식점-중국음식   2908
3     3  음식점-중국음식   2490
4     4  음식점-중국음식   2175
5     5  음식점-중국음식   1766
6     6  음식점-중국음식   1540
7     7  음식점-중국음식   1621
8     8  음식점-중국음식   2412
9     9  음식점-중국음식   5791
10   10  음식점-중국음식  15791
11   11  음식점-중국음식  46551
12   12  음식점-중국음식  61238
13   13  음식점-중국음식  46899
14   14  음식점-중국음식  31485
15   15  음식점-중국음식  24585
16   16  음식점-중국음식  24072
17   17        치킨  39604
18   18        치킨  68044
19   19        치킨  71904
20   20        치킨  60824
21   21        치킨  55213
22   22        치킨  47807
23   23        치킨  28257


# 2. 'test3.txt' 파일을 읽고 
df1 = pd.read_csv('test3.txt', sep='\t', header=None)

# 1) 다음과 같은 데이터 프레임 형태로 변경
#       20대 30대 40대 50대 60세이상
# 2000년   7.5 3.6  3.5  3.3 1.5
# 2001년   7.4 3.2  3.0  2.8 1.2
# 2002년   6.6 2.9  2.0  2.0   1.1
# ....................................
# 2011년   7.4 3.4  2.1  2.1 2.7
# 2012년   7.5 3.0  2.1  2.1 2.5
# 2013년   7.9 3.0  2.0  1.9 1.9

 

더보기

[ 내 답변 ]

df1.columns  = ['20대','30대','40대','50대','60대 이상']

year = [str(i) + '년' for i in range(2000, 2014)]
df1.index = year

df1
Out[391]: 
       20대  30대  40대  50대  60대 이상
2000년  7.5  3.6  3.5  3.3     1.5
2001년  7.4  3.2  3.0  2.8     1.2
2002년  6.6  2.9  2.0  2.0     1.1
2003년  7.7  3.0  2.2  2.2     1.0
2004년  7.9  3.1  2.3  2.3     1.2
2005년  7.7  3.3  2.6  2.5     1.3
2006년  7.7  3.0  2.3  2.2     1.4
2007년  7.1  3.2  2.0  2.1     1.4
2008년  7.0  3.1  2.1  2.0     1.2
2009년  7.9  3.6  2.5  2.5     1.6
2010년  7.8  3.5  2.5  2.4     3.0
2011년  7.4  3.4  2.1  2.1     2.7
2012년  7.5  3.0  2.1  2.1     2.5
2013년  7.9  3.0  2.0  1.9     1.9

 

[ 문제풀이 ]

from pandas import Series, DataFrame

 

# 컬럼 이름 변경)
# 문자열 결합의 경우 에러가 발생한다.
a1 = Series(range(20,61,10)) + '대'

# 따라서 .astype(str)을 통해 문자열로 변환을 진행한다.
a1 = Series(range(20,61,10)).astype(str) + '대'
a1.iloc[-1] = '60세 이상'
df1.columns = a1

 

# 컬럼 이름 변경)
# 문자열 결합의 경우 에러가 발생한다.
a1 = Series(range(20,61,10)) + '대'

# 따라서 .astype(str)을 통해 문자열로 변환을 진행한다.
a1 = Series(range(20,61,10)).astype(str) + '대'
a1.iloc[-1] = '60세 이상'
df1.columns = a1

# index 변경)
a2 = Series(range(2000,2014)).astype(str) + '년'

# 또는
s1 = Series(range(2000,2014))

# 원소별 fetch이기 때문에 오류가 발생한다. (astype은 Series에 적용된다.)
s1.map(lambda x : x.astype(str))

# 따라서 다음과 같이 작성한다.
df1.index = s1.map(lambda x : str(x) + '년')

df1
Out[54]: 
       20대  30대  40대  50대  60세 이상
2000년  7.5  3.6  3.5  3.3     1.5
2001년  7.4  3.2  3.0  2.8     1.2
2002년  6.6  2.9  2.0  2.0     1.1
2003년  7.7  3.0  2.2  2.2     1.0
2004년  7.9  3.1  2.3  2.3     1.2
2005년  7.7  3.3  2.6  2.5     1.3
2006년  7.7  3.0  2.3  2.2     1.4
2007년  7.1  3.2  2.0  2.1     1.4
2008년  7.0  3.1  2.1  2.0     1.2
2009년  7.9  3.6  2.5  2.5     1.6
2010년  7.8  3.5  2.5  2.4     3.0
2011년  7.4  3.4  2.1  2.1     2.7
2012년  7.5  3.0  2.1  2.1     2.5
2013년  7.9  3.0  2.0  1.9     1.9


# 2) 2010년부터의 20~40대 실업률력만 추출하여 df2에 저장 

 

더보기

[ 내 답안 ]

df2 = df1.loc[list(df1.index)[10:15], ['20대','30대','40대']]

df2
Out[422]: 
       20대  30대  40대
2010년  7.8  3.5  2.5
2011년  7.4  3.4  2.1
2012년  7.5  3.0  2.1
2013년  7.9  3.0  2.0

 

[ 문제풀이 ]

df2 = df1.loc['2010년':, '20대':'40대']

df2
Out[56]: 
       20대  30대  40대
2010년  7.8  3.5  2.5
2011년  7.4  3.4  2.1
2012년  7.5  3.0  2.1
2013년  7.9  3.0  2.0


# 3) 30대 실업률을 추출하되, 소수점 둘째자리의 표현식으로 출력(기존 데이터에 수정X)

 

더보기

[ 내 답안 ]

df1['30대']
f1 = lambda x : '%.2f' % x
df1['30대'].map(f1)

df1['30대'].map(f1)
Out[399]: 
2000년    3.60
2001년    3.20
2002년    2.90
2003년    3.00
2004년    3.10
2005년    3.30
2006년    3.00
2007년    3.20
2008년    3.10
2009년    3.60
2010년    3.50
2011년    3.40
2012년    3.00
2013년    3.00
Name: 30대, dtype: object

 

[ 문제풀이 ]

'%.2f' % df1['30대']     # 불가
'%.2f' % df1['30대'][0]  # 불가

'%.2f' % df1.loc['2010년', '30대']

'%.2f' % df1.loc['2010년', '30대']
Out[63]: '3.50'


df1['30대'].map(lambda x : '%.2f' % x)

df1['30대'].map(lambda x : '%.2f' % x)
Out[64]: 
2000년    3.60
2001년    3.20
2002년    2.90
2003년    3.00
2004년    3.10
2005년    3.30
2006년    3.00
2007년    3.20
2008년    3.10
2009년    3.60
2010년    3.50
2011년    3.40
2012년    3.00
2013년    3.00
Name: 30대, dtype: object


# 4) 연도별/연령대별 각각 실업률 평균 

 

더보기

[ 내 답안 ]

df1.iloc[:, 1:].mean(axis=1)

df1.iloc[:, 1:].mean(axis=1)
Out[442]: 
2000년    2.975
2001년    2.550
2002년    2.000
2003년    2.100
2004년    2.225
2005년    2.425
2006년    2.225
2007년    2.175
2008년    2.100
2009년    2.550
2010년    2.850
2011년    2.575
2012년    2.425
2013년    2.200
dtype: float64

 

df1.iloc[:, 1:].mean(axis=0)

df1.iloc[:, 1:].mean(axis=0)
Out[443]: 
30대       3.207143
40대       2.371429
50대       2.314286
60대 이상    1.642857
dtype: float64

  

[ 문제풀이 ]

df1.mean(axis=0)
df1.mean(axis=1)

df1.mean(axis=0)
Out[65]: 
20대       7.507143
30대       3.207143
40대       2.371429
50대       2.314286
60세 이상    1.642857
dtype: float64

df1.mean(axis=1)
Out[66]: 
2000년    3.88
2001년    3.52
2002년    2.92
2003년    3.22
2004년    3.36
2005년    3.48
2006년    3.32
2007년    3.16
2008년    3.08
2009년    3.62
2010년    3.84
2011년    3.54
2012년    3.44
2013년    3.34
dtype: float64


df1.apply('mean', axis = 0)
df1.apply('mean', axis = 1)

df1.apply('mean', axis = 0)
Out[67]: 
20대       7.507143
30대       3.207143
40대       2.371429
50대       2.314286
60세 이상    1.642857
dtype: float64

df1.apply('mean', axis = 1)
Out[68]: 
2000년    3.88
2001년    3.52
2002년    2.92
2003년    3.22
2004년    3.36
2005년    3.48
2006년    3.32
2007년    3.16
2008년    3.08
2009년    3.62
2010년    3.84
2011년    3.54
2012년    3.44
2013년    3.34
dtype: float64