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

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

ecosso 2026. 5. 26. 17:33

# 1. kimchi_test.csv 파일을 읽고
# 제품별, 판매처별 총 판매량(수량) 을 교차표 형식으로 출력하고, 각 제품별로 판매량이 가장 높은 판매처를 확인하시오.
# 각 제품별 판매량이 가장 높은 판매처들의 총 판매량 합계를 출력하시오.
df1 = pd.read_csv('kimchi_test.csv', encoding = 'cp949')

 

더보기

[ 내 답안 ]

# 불러오기

df1 = pd.read_csv('kimchi_test.csv', encoding = 'cp949')
df1.head()

df1.head()
Out[58]: 
   판매년도  판매월    제품   판매처     수량       판매금액
0  2013    1  총각김치  대형마트  27916  233968900
1  2013    1  총각김치   백화점  11971   99796735
2  2013    1  총각김치   편의점   1603    2264200
3  2013    2  총각김치  대형마트  23057  194593960
4  2013    2  총각김치   백화점  11678  103106940

 

# 제품별 가장 판매량이 높은 판매처 확인
df1.pivot_table('수량','판매처','제품').idxmax()

df1.pivot_table('수량','판매처','제품').idxmax()
Out[64]: 
제품
무김치     대형마트
열무김치    대형마트
총각김치    대형마트
dtype: object

 

# 각 제품별 판매량이 가장 높은 판매처들의 총 판매량 합계 
df1.pivot_table('수량','판매처','제품').max().sum()

df1.pivot_table('수량','판매처','제품').max().sum()
Out[68]: np.float64(97737.02083333334)

 

[ 문제풀이 ]

 

 


# 2. 병원현황.csv 파일을 이용하여 다음을 구하시오.
# 항목, 단위 컬럼을 제외하고 데이터를 정리하시오.
df2 = pd.read_csv('병원현황.csv', encoding = 'cp949', skiprows = 1)

df2.head()
Out[72]: 
  시군구명칭     표시과목   항목  단위  2013. 4/4  2013. 3/4  2013. 2/4  2013. 1/4  \
0   강남구        계  기관수  개소       1343       1344       1349       1322   
1   강남구       내과  기관수  개소         79         78         78         78   
2   강남구      신경과  기관수  개소          6          6          6          6   
3   강남구  정신건강의학과  기관수  개소         40         41         41         40   
4   강남구       외과  기관수  개소         25         25         24         26   

   2012. 4/4  2012. 3/4  2012. 2/4  2012. 1/4  2011. 4/4  2011. 3/4  \
0     1301.0     1299.0     1295.0     1277.0     1271.0     1253.0   
1       77.0       74.0       74.0       74.0       73.0       73.0   
2        6.0        6.0        7.0        5.0        5.0        5.0   
3       39.0       40.0       39.0       37.0       37.0       37.0   
4       26.0       26.0       24.0       24.0       25.0       27.0   

   2011. 2/4  2011. 1/4  2010. 4/4  2010. 3/4  2010. 2/4  2010. 1/4  \
0     1303.0     1286.0     1247.0     1233.0     1214.0     1176.0   
1       76.0       77.0       74.0       74.0       73.0       72.0   
2        5.0        5.0        5.0        5.0        5.0        5.0   
3       39.0       39.0       38.0       38.0       39.0       41.0   
4       25.0       25.0       24.0       25.0       22.0       21.0   

   2009. 4/4  2009. 3/4  2009. 2/4  2009. 1/4  
0     1155.0     1135.0     1121.0     1097.0  
1       71.0       71.0       72.0       71.0  
2        5.0        5.0        6.0        6.0  
3       40.0       42.0       42.0       40.0  
4       20.0       19.0       18.0       18.0


# 1. 연도별, 표시과목별 병원수(기관수)의 총 합을 구하시오.
# 2. 연도 컬럼은 2009. 1/4 형태이므로 연도(앞 4자리) 기준으로 그룹핑할 것
# 3. 각 연도별로 병원수 합계가 가장 많은 표시과목을 구하시오.
# 4. 3번에서 구한 표시과목들 중 가장 많이 등장한 표시과목을 출력하시오.

 

더보기

[ 내 답안 ]

# 연도만 추출
df2.columns = df2.columns.str.replace('.\s\d/\d','',regex=True)

df2.columns.str.replace('.\s\d/\d','',regex=True)
Out[74]: 
Index(['시군구명칭', '표시과목', '항목', '단위', '2013', '2013', '2013', '2013', '2012',
       '2012', '2012', '2012', '2011', '2011', '2011', '2011', '2010', '2010',
       '2010', '2010', '2009', '2009', '2009', '2009'],

 

# 1. 연도별, 표시과목별 병원수(기관수)의 총 합을 구하시오.

# 2. 연도 컬럼은 2009. 1/4 형태이므로 연도(앞 4자리) 기준으로 그룹핑할 것

# melt
df3 = df2.melt(id_vars=['시군구명칭', '표시과목', '항목', '단위'], var_name='연도', value_name='값')

# 연도만 뽑아내기
df3['연도'] = df3['연도'].str.extract(r'(^\d{4})')

# 연도별 기관수
df4 = df3.groupby(['표시과목','연도'])['값'].sum()

df3.groupby(['표시과목','연도'])['값'].sum()
Out[84]: 
표시과목   연도  
가정의학과  2009    752.0
       2010    758.0
       2011    725.0
       2012    704.0
       2013    731.0
 
흉부외과   2009     26.0
       2010     26.0
       2011     30.0
       2012     26.0
       2013     28.0
Name: 값, Length: 130, dtype: float64

 

# 3. 각 연도별로 병원수 합계가 가장 많은 표시과목을 구하시오.
df4.groupby(level=0).idxmax()

df4.groupby(level=0).idxmax()
Out[89]: 
표시과목
가정의학과              (가정의학과, 2010)
결핵과                  (결핵과, 2009)
계                      (계, 2013)
내과                    (내과, 2013)
마취통증의학과          (마취통증의학과, 2013)
병리과                  (병리과, 2012)
비뇨기과                (비뇨기과, 2011)
산부인과                (산부인과, 2009)
성형외과                (성형외과, 2013)
소아청소년과            (소아청소년과, 2010)
신경과                  (신경과, 2013)
신경외과                (신경외과, 2011)
안과                    (안과, 2013)
영상의학과              (영상의학과, 2009)
예방의학과              (예방의학과, 2013)
외과                    (외과, 2011)
이비인후과              (이비인후과, 2013)
일반의                  (일반의, 2013)
재활의학과              (재활의학과, 2012)
전문과목미표시전문의    (전문과목미표시전문의, 2013)
정신건강의학과          (정신건강의학과, 2013)
정형외과                (정형외과, 2013)
진단검사의학과          (진단검사의학과, 2009)
피부과                  (피부과, 2012)
핵의학과                (핵의학과, 2009)
흉부외과                (흉부외과, 2011)
Name: 값, dtype: object


# 4. 3번에서 구한 표시과목들 중 가장 많이 등장한 표시과목을 출력하시오.

result = df4.groupby(level=0).idxmax()
result.value_counts().idxmax()

result.value_counts().idxmax()
Out[106]: ('가정의학과', '2010')

 

[ 문제풀이 ]