본문 바로가기
Python/통계분석

[누구나 파이썬 통계분석]_Ch02.1차원 데이터 정리_도수분포표

by ssolLEE 2024. 1. 11.
반응형

파이썬으로 간단하게 통계 내용을 공부해보아요. 오늘부터 열심히 달려보겠습니다.

 

포스팅은 타니아이 히로키님의 '누구나 파이썬 통계 분석' 책의 내용을 실습한 것입니다. 

감사합니다.

소스코드와 데이터는 아래의 웹페이지에 공개되어 있습니다. 

- 한빛출판네트워크(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

 

오늘 한 것을 바탕으로 다음 포스팅에서는 히스토그램과 상자그림 그래프를 그려보겠습니다.

오늘도 감사합니다.