호쌤
호쌤 Just For Fun

[Python] Matplotlib 데이터 시각화 연습문제

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python] Matplotlib 데이터 시각화 연습문제≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Python] Matplotlib 데이터 시각화 연습문제

파이썬 기초 수업중 훈련생들에게 제시한 Matplotlib 활용 연습문제들 입니다.

#01. 코로나19 날짜별 확진자 수 데이터 시각화하기

2020년 04월 25일부터 05월 01일까지의 코로나19의 확진자 현황이 다음 표와 같다고 한다. 이 데이터를 토대로 아래의 요구사항을 충족하는 코드를 작성하시오.

날짜 누적 확진자 수 누적 격리해제 일별 확진자 수
04/25 10718 8635 10
04/26 10728 8717 10
04/27 10738 8764 10
04/28 10752 8854 14
04/29 10761 8922 9
04/30 10765 9059 4
05/01 10774 9072 4

1) 일별 확진자 수 시각화

일별 확진자 수를 다음과 같은 구조의 딕셔너리를 원소로 갖는 리스트로 표현하고 확진자 수의 변화를 시계열 그래프로 표현하시오.

1
2
3
4
5
6
7
covid19 = [
    {"date": "04/21", "people": 9}, 
    {"date": "04/22", "people": 11}, 
    {"date": "04/23", "people": 8}, 
    {"date": "04/24", "people": 6}
    ... 생략 ...
]
▶ 실행결과

png


패키지 참조 및 그래프 기본 속성 정의

1
2
3
4
5
from matplotlib import pyplot

pyplot.rcParams["font.family"] = 'NanumGothic'
pyplot.rcParams["font.size"] = 20
pyplot.rcParams["figure.figsize"] = (20, 10)

데이터 정의

1
2
3
4
5
6
7
8
9
covid19 = [
    {"date": "04/25", "people": 10}, 
    {"date": "04/26", "people": 10}, 
    {"date": "04/27", "people": 10}, 
    {"date": "04/28", "people": 14}, 
    {"date": "04/29", "people": 9},
    {"date": "04/30", "people": 4},
    {"date": "05/01", "people": 4},
]

날짜와 확진자 수를 각각 리스트로 분리

1
2
3
4
5
6
7
8
9
date = []
people = []

for i in covid19:
    date.append(i["date"])
    people.append(i["people"])

print(date)
print(people)
▶ 출력결과
1
2
['04/25', '04/26', '04/27', '04/28', '04/29', '04/30', '05/01']
[10, 10, 10, 14, 9, 4, 4]

x축 좌표에 대한 리스트 생성

1
2
xpos = list(range(0, len(people)))
print(xpos)
▶ 출력결과
1
[0, 1, 2, 3, 4, 5, 6]

데이터 시각화

1
2
3
4
5
6
7
8
9
10
pyplot.figure()
pyplot.plot(people, label='확진자 수', color='#ff00ff')
pyplot.legend()
pyplot.grid()
pyplot.title('코로나19 일별 확진자 수')
pyplot.xlabel('날짜')
pyplot.ylabel('확진자 수')
pyplot.xticks(xpos, date)
pyplot.show()
pyplot.close()

2) 누적 확진자 수와 누적 격리해제에 대한 시각화

누적 확진자 수와 누적 격리해제에 대한 데이터를 다음의 형식으로 정의하고 날짜별 변동 추이를 시각화 하시오.

1
2
3
4
5
covid19= {
    "04/25" : {"확진": 10718, "격리해제": 8635}, 
    "04/26" : {"확진": 10728, "격리해제": 8717},
    ... 생략 ...
}
▶ 실행결과

png


패키지 참조 및 그래프 기본 속성 정의

이 처리는 이미 앞에서 정의한 코드이므로 jupyter를 사용할 경우 중복 구현할 필요는 없다.

1
2
3
4
5
from matplotlib import pyplot

pyplot.rcParams["font.family"] = 'NanumGothic'
pyplot.rcParams["font.size"] = 20
pyplot.rcParams["figure.figsize"] = (20, 10)

데이터 정의

1
2
3
4
5
6
7
8
9
covid19= {
    "04/25" : {"확진": 10718, "격리해제": 8635}, 
    "04/26" : {"확진": 10728, "격리해제": 8717},
    "04/27" : {"확진": 10738, "격리해제": 8764},
    "04/28" : {"확진": 10752, "격리해제": 8854},
    "04/29" : {"확진": 10761, "격리해제": 8922},
    "04/40" : {"확진": 10765, "격리해제": 9059},
    "05/01" : {"확진": 10774, "격리해제": 9072}
}

날짜 리스트 만들기

딕셔너리의 키만 리스트로 추출한다.

1
2
date = list(covid19.keys())
date
▶ 출력결과
1
['04/25', '04/26', '04/27', '04/28', '04/29', '04/40', '05/01']

누적 확진자 수 및 누적 격리해제 수 데이터 분리하기

1
2
3
4
5
6
7
8
9
확진 = []
격리해제 = []

for i in date:
    확진.append(covid19[i]["확진"])
    격리해제.append(covid19[i]["격리해제"])
    
print(확진)
print(격리해제)
▶ 출력결과
1
2
[10718, 10728, 10738, 10752, 10761, 10765, 10774]
[8635, 8717, 8764, 8854, 8922, 9059, 9072]

x축 좌표에 대한 리스트 생성

1
2
xpos = list(range(0, len(date)))
xpos
▶ 출력결과
1
[0, 1, 2, 3, 4, 5, 6]

데이터 시각화

1
2
3
4
5
6
7
8
9
10
11
pyplot.figure()
pyplot.plot(확진, label='누적 확진자 수', color='#ff00ff')
pyplot.plot(격리해제, label='누적 격리해제', color='#ff6600')
pyplot.legend(title="범주", loc='center left')
pyplot.grid()
pyplot.title('코로나19 확진, 격리해제 추세')
pyplot.xlabel('날짜')
pyplot.ylabel('명')
pyplot.xticks(xpos, date)
pyplot.show()
pyplot.close()

#02. 연령대별 확진자 수 데이터 시각화 하기

2020년 05월 03일을 기준으로 한 연령대별 확진자/사망자 수는 다음의 표와 같다고 한다.

구분 확진자(명) 사망자(명)
80이상 488 120
70-79 710 75
60-69 1,351 35
50-59 1,956 15
40-49 1,432 3
30-39 1,163 2
20-29 2,962 0
10-19 591 0
0-9 140 0

이 데이터를 토대로 하여 다음의 요구사항에 맞는 코드를 구현하시오.

1) 연령대별 확진자 수 시각화

다음의 형식으로 데이터를 정의하고 연령대별 확진자 수를 가로형 막대 그래프로 표현하시오.

1
2
3
4
5
covid19= {
    "80이상" : 488, 
    "70-79" : 710,
    ... 생략 ...
}
▶ 실행결과

png


패키지 참조 및 그래프 기본 속성 정의

이 처리는 이미 앞에서 정의한 코드이므로 jupyter를 사용할 경우 중복 구현할 필요는 없다.

1
2
3
4
5
from matplotlib import pyplot

pyplot.rcParams["font.family"] = 'NanumGothic'
pyplot.rcParams["font.size"] = 16
pyplot.rcParams["figure.figsize"] = (20, 10)

데이터 정의

1
2
3
4
5
6
7
8
9
10
11
covid19= {
    "80이상" : 488, 
    "70-79" : 710,
    "60-69" : 1351,
    "50-59" : 1956,
    "40-49" : 1432,
    "30-39" : 1163,
    "20-29" : 2962,
    "10-19" : 591,
    "0-9" : 140
}

딕셔너리의 key 분리

1
2
연령대 = list(covid19.keys())
연령대
▶ 출력결과
1
['80이상', '70-79', '60-69', '50-59', '40-49', '30-39', '20-29', '10-19', '0-9']

딕셔너리의 value 분리

1
2
확진자 = list(covid19.values())
확진자
▶ 출력결과
1
[488, 710, 1351, 1956, 1432, 1163, 2962, 591, 140]

데이터 시각화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pyplot.figure()
pyplot.barh(keys, values, label='확진자 수')
pyplot.legend()
pyplot.grid()
pyplot.title('코로나19 연령대별 확진자 수')
pyplot.xlabel('연령대')
pyplot.ylabel('명')

for i, v in enumerate(확진자):
    str_val = "%d명" % v
    pyplot.text(v, 연령대[i], str_val, fontsize=14, color='#ff0000',
                horizontalalignment='left', verticalalignment='center')

pyplot.show()
pyplot.close()

2) 연령대별 확진/사망자 수 시각화

다음의 형식으로 데이터를 정의하고 확진자 수와 사망자 수를 비교하여 세로 막대 그래프로 시각화 하시오.

1
2
3
4
5
covid19= {
    "80이상" : {"확진": 488, "사망": 120}, 
    "70-79" : {"확진": 710, "사망": 75},
    ... 생략 ...
}
▶ 실행결과

png


패키지 참조 및 그래프 기본 속성 정의

numpy 패키지를 추가로 참조해야 한다.

1
2
3
4
5
6
from matplotlib import pyplot
import numpy

pyplot.rcParams["font.family"] = 'NanumGothic'
pyplot.rcParams["font.size"] = 16
pyplot.rcParams["figure.figsize"] = (20, 10)

데이터 정의

1
2
3
4
5
6
7
8
9
10
11
covid19= {
    "80이상" : {"확진": 488, "사망": 120}, 
    "70-79" : {"확진": 710, "사망": 75},
    "60-69" : {"확진": 1351, "사망": 35},
    "50-59" : {"확진": 1956, "사망": 15},
    "40-49" : {"확진": 1432, "사망": 3},
    "30-39" : {"확진": 1163, "사망": 2},
    "20-29" : {"확진": 2962, "사망": 0},
    "10-19" : {"확진": 591, "사망": 0},
    "0-9" : {"확진": 140, "사망": 0},
}

연령대 데이터 추출

1
2
연령대 = list(covid19.keys())
연령대
▶ 출력결과
1
['80이상', '70-79', '60-69', '50-59', '40-49', '30-39', '20-29', '10-19', '0-9']

확진자 수, 사망자 수 데이터 추출

1
2
3
4
5
6
7
8
9
확진 = []
사망 = []

for i in covid19:
    확진.append(covid19[i]["확진"])
    사망.append(covid19[i]["사망"])
    
print(확진)
print(사망)
▶ 출력결과
1
2
[488, 710, 1351, 1956, 1432, 1163, 2962, 591, 140]
[120, 75, 35, 15, 3, 2, 0, 0, 0]

그래프의 x축 좌표로 사용할 배열 생성

1
2
xpos = numpy.arange(len(확진))
xpos
▶ 출력결과
1
array([0, 1, 2, 3, 4, 5, 6, 7, 8])

데이터 시각화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pyplot.figure()
pyplot.bar(xpos-0.2, 확진, label='확진', width=0.4, color="#4955e3")
pyplot.bar(xpos+0.2, 사망, label='사망', width=0.4, color="#d93b5f")
pyplot.xticks(xpos, 연령대)
pyplot.legend()
pyplot.grid()
pyplot.ylabel('명')
pyplot.xlabel('연령대')
pyplot.title('연령대별 확진자/사망자 수')

for i, v in enumerate(확진):
    str_val = "%d명" % v
    pyplot.text(xpos[i]-0.2, v, str_val, fontsize=14, color='#0000ff',
                horizontalalignment='center', verticalalignment='bottom')
    
for i, v in enumerate(사망):
    str_val = "%d명" % v
    pyplot.text(xpos[i]+0.2, v, str_val, fontsize=14, color='#ff0000',
                horizontalalignment='center', verticalalignment='bottom')

pyplot.show()
pyplot.close()

3) 연령대별 확진 비율

앞 문제를 해결하는 과정에서 도출된 확진자 수 리스트와 연령대 리스트를 활용하여 연령대별 확진자 수 비율을 시각화 하시오.

▶ 실행결과

png


패키지 참조 및 그래프 기본 속성 정의

이 처리는 이미 앞에서 정의한 코드이므로 jupyter를 사용할 경우 중복 구현할 필요는 없다.

1
2
3
4
5
from matplotlib import pyplot

pyplot.rcParams["font.family"] = 'NanumGothic'
pyplot.rcParams["font.size"] = 16
pyplot.rcParams["figure.figsize"] = (20, 20)

데이터 시각화

1
2
3
4
5
pyplot.figure()
pyplot.title('연령대별 확진 비율')
pyplot.pie(확진, labels=연령대, autopct='%0.2f%%')
pyplot.show()
pyplot.close()

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python] Matplotlib 데이터 시각화 연습문제≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus