반응형
파이썬으로 간단하게 통계 내용을 공부해보아요. 오늘부터 열심히 달려보겠습니다.
포스팅은 타니아이 히로키님의 '누구나 파이썬 통계 분석' 책의 내용을 실습한 것입니다.
감사합니다.
소스코드와 데이터는 아래의 웹페이지에 공개되어 있습니다.
- 한빛출판네트워크(https://www.hanbit.co.kr/support/supplement_list.html)
- 깃허브(https://github.com/ghmagazine/python_stat_sample)
오늘은 데이터의 특징을 표나 그림을 통해 시각적으로 파악할 수 있는 방법 중 도수분포표에 대해 배워보겠습니다.
오늘 것을 하고 나면, 그 다음 포스팅 내용은 자연스레 따라올 것입니다!
2.4.1 도수분포표(frequency distribution)
- 데이터의 분포 상태를 세부적으로 알고 싶을 때 우리는 도수분포표를 사용합니다.
- 도수분포표에는 데이터 값을 몇 개의 구간으로 나누고, 데이터의 갯수를 표현합니다.
- 아마 슬슬 기억나실 것 같네요!
- 구간을 계급(class), 계급에 속한 데이터 수를 도수(frequency)라고 합니다.
- 코드로도 도수분포표를 구현할 수 있습니다.
english_scores = np.array(df['english'])
freq, _ = np.histogram(english_scores, bins=10, range=(0, 100))
- 계급수는 10, range로 최솟값과 최댓값을 나눕니다. enlish_scores는 제가 사용할 데이터입니다.
- 이제 DataFrame으로 정리하면 도수분포표가 완성됩니다.
# 0~10, 10~20, ... 이라는 문자열 리스트 작성
freq_class = [f'{i}~{i+10}' for i in range(0, 100, 10)]
# freq_class을 인덱스로 DataFrame 작성
freq_dist_df = pd.DataFrame({'frequency': freq},
index = pd.Index(freq_class,
name='class'))
freq_dist_df
- 도수분포표를 보니 50~70점에 학생들이 많이 몰려 있고, 전반적으로 점수 차이가 크지 않은 시험임을 알 수 있네요.
- 도수분포표에 많이 사용되는 또 다른 개념들에 대해 살펴 볼까요?
- 계급값은 각 계급을 대표하는 값으로 계급의 중앙값이 이용됩니다.
class_value = [(i+(i+10))//2 for i in range(0, 100, 10)]
class_value
>>> [5, 15, 25, 35, 45, 55, 65, 75, 85, 95]
- 상대도수는 전체 데이터에 대해서 해당 계급의 데이터가 어느 정도의 비율을 차지하고 있는지를 나타냅니다.
rel_freq = freq / freq.sum()
rel_freq
>>> array([0. , 0. , 0. , 0.04, 0.16, 0.32, 0.36, 0.12, 0. , 0. ])
- 누적상대도수는 해당 계급까지의 상대도수의 합을 나타냅니다.
cum_rel_freq = np.cumsum(rel_freq)
cum_rel_freq
>>> array([0. , 0. , 0. , 0.04, 0.2 , 0.52, 0.88, 1. , 1. , 1. ])
- 원래 만든 도수분포표에 내용을 추가하겠습니다.
freq_dist_df['class value'] = class_value
freq_dist_df['relative frequency'] = rel_freq
freq_dist_df['cumulative relative frequency'] = cum_rel_freq
freq_dist_df = freq_dist_df[['class value', 'frequency', 'relative frequency', 'cumulative relative frequency']]
freq_dist_df
- 전체의 68%의 학생이 50~70점의 점수를 얻었네요.
- 학생 중 절반 정도가 60점 이하의 점수를 얻었네요.
- 도수분포표의 필요성, 점점 잘 느껴지시나요? 이제 필요한 때에 데이터에 맞는 정리를 하실 수 있을 겁니다.
- 이번에는 최빈값을 구해보겠습니다.
- 도수분포표를 사용한 최빈값은 최대가 되는 계급의 계급값입니다.
- 따라서 이 데이터의 최빈값은 65인 것을 우리는 표로 알 수 있습니다.
- 이러한 정의로 볼 때, 최빈값은 계급폭에 따라 값이 달라집니다.
freq_dist_df.loc[freq_dist_df['frequency'].idxmax(), 'class value']
>>> 65
오늘 한 것을 바탕으로 다음 포스팅에서는 히스토그램과 상자그림 그래프를 그려보겠습니다.
오늘도 감사합니다.
'Python > 통계분석' 카테고리의 다른 글
[누구나 파이썬 통계분석]_Ch03. 2차원 데이터 정리_상관성 (1) | 2024.02.11 |
---|---|
[누구나 파이썬 통계분석]_Ch02.1차원 데이터 정리_시각화 (1) | 2024.01.13 |
[누구나 파이썬 통계분석]_Ch02.1차원 데이터 정리_정규화 (1) | 2024.01.08 |
[누구나 파이썬 통계분석]_Ch02.1차원 데이터 정리_산포도 지표 (1) | 2024.01.08 |
[누구나 파이썬 통계분석]_Ch02. 1차원 데이터 정리_대푯값 (1) | 2024.01.05 |