일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- django
- Google Excel
- Java
- PostgreSQL
- Mac
- GIT
- numpy
- Excel
- Google Spreadsheet
- Tkinter
- Github
- google apps script
- c#
- math
- dataframe
- array
- matplotlib
- hive
- PANDAS
- list
- Redshift
- Apache
- SQL
- Kotlin
- Python
- PySpark
- string
- gas
- 파이썬
- Today
- Total
달나라 노트
Python matplotlib : hist (histogram, 히스토그램, 개수분포) 본문
Python matplotlib : hist (histogram, 히스토그램, 개수분포)
CosmosProject 2022. 1. 23. 00:39
히스토그램(Histogram)이란 x축을 값, y축은 x축의 값들이 나온 횟수(또는 개수)를 나타낸 그래프입니다.
여기서 x축을 계급, 횟수나 개수를 나타내는 y축을 도수라고 하는데 크게 중요하진 않습니다.
matplotlibe의 hist method는 이러한 histogram을 그릴 수 있도록 해줍니다.
import matplotlib.pyplot as plt
value_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
plt.hist(value_list)
plt.xlabel('number')
plt.ylabel('count')
plt.show()
위 예시는 아주 간단한 histogram을 표시해본 것입니다.
hist method는 어떤 값들이 담긴 list 또는 array를 받습니다.
그리고 이 list에 있는 unique한 값들을 x축으로 하고, 그 값들이 list에 포함된 개수를 y축으로 하여 막대그래프를 나타내줍니다.
이것이 histogram입니다.
hist method의 bins옵션은 historgram에서 x축을 몇개의 그룹으로 묶어서 나타낼지를 정해줍니다.
import matplotlib.pyplot as plt
value_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
plt.hist(value_list, bins=3)
plt.xlabel('number')
plt.ylabel('count')
plt.show()
위 예시는 bins 옵션을 3으로 지정했습니다.
처음에 봤던 예시에서는 value_list에 1부터 10까지 총 10가지의 unique한 값이 있었고, 이 각각의 값이 몇개씩 나오는지 표시되었었죠.
근데 위 예시에서는 bins=3으로 지정했기 때문에 1부터 10까지의 구간을 총 3개의 그룹으로 나눕니다.
예를들어 1~3까지, 4~6까지, 7~10까지 인것이죠.
그러면 가장 왼쪽 기둥에는 1~3의 값이 몇개인지를 나타내고
중간 기둥은 4~6까지의 값이 몇개인지를 나타내며
가장 오른쪽 기둥은 7~10까지의 값이 몇개인지를 나타낸다고 보시면 됩니다.
import matplotlib.pyplot as plt
value_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
plt.hist(value_list, bins=10)
plt.xlabel('number')
plt.ylabel('count')
plt.show()
bins=10으로 지정하니 처음에 봤던 예시와 같아졌죠.
import matplotlib.pyplot as plt
value_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
plt.hist(value_list, bins=100)
plt.xlabel('number')
plt.ylabel('count')
plt.show()
bins를 100으로 지정하면 위처럼 나옵니다.
value_list에 있는 값은 기껏해야 1~10 사이의 값인데
이 사이를 100개로 나눈다면 2.5, 3.5등의 숫자도 x축 구간에 나타내질겁니다.
그러나 실제 value_list에 2.5, 3.5등의 값은 없으니 그 비어있는 공간이 보이게 되는 것이죠.
hist method의 cumulative 옵션을 True로 설정하면 누적 histogram을 그려줍니다.
import matplotlib.pyplot as plt
value_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
plt.hist(value_list, cumulative=True)
plt.xlabel('number')
plt.ylabel('count')
plt.show()
누적은 간단합니다.
오른쪽으로 갈수록 점점 그래프가 커지는데 마치 아래와 같습니다.
x = 1 막대그래프 --> value_list에서 1인 값의 개수
x = 2 막대그래프 --> value_list에서 1~2인 값의 개수
x = 3 막대그래프 --> value_list에서 1~3인 값의 개수
x = 4 막대그래프 --> value_list에서 1~4인 값의 개수
x = 5 막대그래프 --> value_list에서 1~5인 값의 개수
x = 6 막대그래프 --> value_list에서 1~6인 값의 개수
x = 7 막대그래프 --> value_list에서 1~7인 값의 개수
x = 8 막대그래프 --> value_list에서 1~8인 값의 개수
...
이런 방식입니다.
그래서 오른쪽으로 갈수록 점점 막대그래프가 커지는 것이죠.
이런 것을 누적 히스토그램이라고 합니다.
histtype 옵션은 histogram의 타입을 지정해줍니다.
import matplotlib.pyplot as plt
value_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
plt.hist(value_list, histtype='bar')
plt.xlabel('number')
plt.ylabel('count')
plt.show()
import matplotlib.pyplot as plt
value_list = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
plt.hist(value_list, histtype='step')
plt.xlabel('number')
plt.ylabel('count')
plt.show()
위처럼 결과물은 같지만 테두리만 그려준다던지 등의 타입을 정해주죠.
hist method에서 2개의 list나 array를 tuple에 담아 전달하면 아래 예시처럼 2개의 array에 대한 개수 분포를 나타내주는 그래프를 동시에 그려줍니다.
import matplotlib.pyplot as plt
value_list_1 = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
value_list_2 = [1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 3, 2, 6, 3, 7, 10, 10, 2, 6, 2, 8, 9, 2, 10, 1, 3, 5, 7, 2, 8, 2, 2, 9, 3, 7]
plt.hist((value_list_1, value_list_2), histtype='bar')
plt.xlabel('number')
plt.ylabel('count')
plt.title('histtype = bar')
plt.show()
파란색 막대는 value_list_1의 histogram이고, 주황색 막대는 value_list_2의 histogram입니다.
이제 위 그래프에서 histtype 옵션을 변경해봅시다.
import matplotlib.pyplot as plt
value_list_1 = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
value_list_2 = [1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 3, 2, 6, 3, 7, 10, 10, 2, 6, 2, 8, 9, 2, 10, 1, 3, 5, 7, 2, 8, 2, 2, 9, 3, 7]
plt.hist((value_list_1, value_list_2), histtype='barstacked')
plt.xlabel('number')
plt.ylabel('count')
plt.title('histtype = barstacked')
plt.show()
import matplotlib.pyplot as plt
value_list_1 = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
value_list_2 = [1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 3, 2, 6, 3, 7, 10, 10, 2, 6, 2, 8, 9, 2, 10, 1, 3, 5, 7, 2, 8, 2, 2, 9, 3, 7]
plt.hist((value_list_1, value_list_2), histtype='step')
plt.xlabel('number')
plt.ylabel('count')
plt.title('histtype = step')
plt.show()
import matplotlib.pyplot as plt
value_list_1 = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10]
value_list_2 = [1, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 3, 2, 6, 3, 7, 10, 10, 2, 6, 2, 8, 9, 2, 10, 1, 3, 5, 7, 2, 8, 2, 2, 9, 3, 7]
plt.hist((value_list_1, value_list_2), histtype='stepfilled')
plt.xlabel('number')
plt.ylabel('count')
plt.title('histtype = stepfilled')
plt.show()
위 예시들을 보면 각각의 histtype이 어떠한 모양을 의미하는지 짐작할 수 있습니다.