중학교 수학시간에 배운 도수분포표!
도수분포표는 단변수 데이터의 데이터 분포상태를 도표로 확인할 수 있는 표이다.
예를 들어 영어성적 분포를 도수분포표로 나타낸다고 하면 다음과 같이 나타낼 수 있다.
구간 | 명 |
0~20점 | 2 |
21~40점 | 3 |
41~60점 | 7 |
61~80점 | 8 |
81~100점 | 5 |
용어
도수분포표에서 사용되는 용어는 다음과 같다.
각 구간(0~20, 21~40...) : class (계급)
각 계급에 속한 학생 수 : frequency (도수)
구간의 폭(20점) : class interval
구간의 개수 : 계급수
구간의 중위값, 계급을 값으로 표현 : class mark (계급값)
전체데이터에 대해서 해당 클래스의 도수의 비율 : relative frequency (상대도수)
해당 클래스까지 누적시킨 상대도수 : cumulative relative frequency (누적상대도수)
중학교 때 기억이 되살아나고 있다 ㅇㅅㅇ
데이터를 가지고 파이썬으로 도수분포표를 만들 수 있다.
여러방법이 있겠지만 numpy의 histogram 함수를 이용하면 편리하다.
numpy.histogram(a, bins=10, range=None, normed=None, weights=None, density=None)
- a : 데이터
- bins : 구간의 개수
구간이 5개이면 구간값을 나누는 경계값은 6개가 필요하다. - range : 구간의 범위
구간을 나눌 범위를 튜플로 지정할 수 있다.
설정하지 않으면 데이터의 최대, 최소값으로 설정된다.
위의 세 옵션이 필요하다.
이외의 옵션은 공식문서를 통해 확인할 수 있다.
numpy.histogram — NumPy v1.22 Manual
If bins is an int, it defines the number of equal-width bins in the given range (10, by default). If bins is a sequence, it defines a monotonically increasing array of bin edges, including the rightmost edge, allowing for non-uniform bin widths. If bins is
numpy.org
histogram은 두 ndarray를 리턴하는데
첫 번째는 구간별로 개수를 센 도수, frequency
두 번째는 구간(bins)을 나눈 경계값이다.
50명의 영어 점수 데이터가 있다.
freq, divider = np.histogram(eng_score, bins=5, range=(0,100))
divider = divider.astype(np.int32)
print(freq)
print(divider)
> 출력
[ 0 2 24 24 0]
[ 0 20 40 60 80 100]
divider, 구간경계값이 float로 설정되어 int type으로 바꾸어주었다.
divider는 경계값이므로 이를 이용한 도수분포표의 행인덱스를 만들어 주어야 한다.
idx = [str(divider[i] if i == 0 else divider[i]+1)+"~"+str(divider[i+1]) for i in range(len(divider)-1)]
print(idx)
> 출력
['0~20', '21~40', '41~60', '61~80', '81~100']
만들어준 행인덱스와 도수를 이용해서 pandas DataFrame을 만들어줄 수 있다.
freq_table = pd.DataFrame({'Frequency':freq},
index=idx)
display(freq_table)
> 출력
도수분포표가 완성되었다!
다른 속성들을 도수분포표에 추가해줄 수 있다.
- class mark, 계급값
class_mark = [round((divider[i]+divider[i+1])/2) for i in range(len(divider)-1)]
print(class_mark)
> 출력
[10, 30, 50, 70, 90]
freq_table['class mark'] = class_mark
display(freq_table)
> 출력
- relative frequency, 상대 도수
rel_freq = freq / freq.sum()
print(rel_freq)
> 출력
[0. 0.04 0.48 0.48 0. ]
freq_table['relative frequency'] = rel_freq
display(freq_table)
> 출력
- cumulative relative frequency, 누적 상대도수
numpy의 cumsum() 이용
cum_rel_freq = np.cumsum(rel_freq)
print(cum_rel_freq)
> 출력
[0. 0.04 0.52 1. 1. ]
freq_table['cum_rel_freq'] = cum_rel_freq
display(freq_table)
> 출력
'Programming > Numpy' 카테고리의 다른 글
[numpy] ndarray의 indexing과 slicing (0) | 2022.03.15 |
---|---|
[numpy] ndarray의 shape과 관련된 함수들 (0) | 2022.03.15 |
[numpy] ndarray를 생성하는 여러가지 방법 2 - random (0) | 2022.03.15 |
[numpy] ndarray를 생성하는 여러가지 방법 1 (0) | 2022.03.15 |
[numpy] 데이터 핸들링을 위한 넘파이 (0) | 2022.03.15 |