상세 컨텐츠

본문 제목

[Python] 통계 대표값 (Mean, Median, Mode) 구하기 - 패키지 사용 vs. 패키지 미사용

개발 이야기/Python

by 리치윈드 - windFlex 2022. 5. 7. 17:01

본문

반응형

숫자를 다루는 Python 관련 개발 중에 필수적으로 등장하는 통계값 : mean, median, mode 구하기. 코딩 테스트의 Easy 문제에서도 자주 등장한다.

 

2022.05.24 - [개발 이야기/Python] - [코딩 테스트] 파이썬 코딩테스트 핵심 요약 (CheatSheet) - 코테 1시간전에 꼭 보자.

2022.05.08 - [개발 이야기/Python] - [음성인식 - 6라인] 가장 쉬운 음성인식 (STT) 해 보기

2022.04.30 - [개발 이야기] - [코테] 코딩 테스트 플랫폼 4종 - 백준, 리트코드, 프로그래머스, 코드시그널

2021.12.16 - [개발 이야기/Python] - 파이썬 오디오 라이브러리 Top 5종 (Python Audio Library )

2020.12.16 - [분류 전체보기] - [개발] 피보나치(Fibonacci) 수열 구현 7가지 방법 - 파이썬 실습/확인 바로하기

2020.05.09 - [개발 이야기] - [개발] 파이썬 문법 5분만에 읽히기 - 파이썬 기본 문법 요약/정리 8 가지

2018.03.03 - [개발 이야기/Python] - 피보나치(Fibonacci) 수열을 구현하는 7가지 방법 - 파이썬(Python) 피보나치 구현 7선

 

기본 개념 점검 : mean, median, mode 

 

몇몇 코딩 테스트 문제를 풀다 보면 Easy 문제로 대표값을 출력하는 문제들이 몇몇 볼 수 있다. 

대표적인 통계값으로 평균(Mean or average), 중위값 (median), 최빈값 (Mode)들이 자주 제시되곤 한다. 

  • 숫자배열이 `array`로 주어질 때, 
  • 평균 (mean): Average와 같은 의미로 사용되기 때문이 매우 익숙 할 것이다. 평균을 구해주면 된다. sum( array) / len(array)
  • 중위값 (median) : array에 있는 값중에서 정렬 후 순서상 중위점에 있는 숫자이다.  따라서 정렬된 array를 필요로 한다.
    그런데, Array의 아이템수가 짝수라면, 중위값이 2개가 된다. 이 때는 2개의 중위값의 평균이 median이다. (<-- 이것을 모르는 경우가 종종 있다.)
    • n이 array의 길이이고, array는 정렬되었다 가정,
    • n이 홀수인 경우 :  median = array[ n//2 번째 ]
    • n이 짝수인 경우 : median =  ( array[ n//2 번째  ] + array[ n//2 -1 번째  ] ) / 2
  • 최빈값 (Mode) : 발생 빈도가 가장 높은 값
    • frequency가 array의 숫자들의 빈도이고, max of frequency 의 array value

 

mean, median, mode 쉽게 구하기 (라이브러리/패키지 사용)

 

 

예제를 위해서, 주어진 numerical array `list_nums`가 다음과 같다고 하자. 

list_nums = [16, 12, 28,  8, 18, 17, 28, 24,  5,  4, 12, 16, 8, 4,4,4]
더보기

list_nums를 정렬하면 다음과 같다.

 

sorted(list_nums)
# [4, 4, 4, 4, 5, 8, 8, 12, 12, 16, 16, 17, 18, 24, 28, 28]

 

[ Numpy 등 패키지 사용 ]

특별히 제약 사항이 주어지지 않는다면, 굳이 순수 Python으로 구할 필요가 있을까 싶다. 생산성을 위해서, 제약사항이 없다면, `Numpy`, `Pandas`, `Scipy`, `collections` 등을 사용해 주자 

Python은 수치를 주로 다루기 때문에, `Numpy` 또는 `scipy`등의 패키지를 사용한다면 다음과 같이 쉽게 구할 수 있다. 

 

평균 (mean)

import numpy as np
mean = np.mean(list_nums)
print(f'mean: {mean}')  # mean: 13.0
numpy.mean() 으로 구할 수 있다. pandas의 경우도 유사하다.

중위값 (median)

import numpy as np
median = np.median(list_nums)
print(f'median: {median}') # median: 12.0
numpy.median() 으로 구할 수 있다. 

최빈값 (mode)

from scipy import stats
mode = stats.mode(list_nums)[0]
print(f' mode : {mode[0]}') # mode : 4
scipy.stats.mode()로 구할 수 있다. 

 

mean, median, mode : 라이브러리/패키지 없이 구하기 

경우에 따라서는 알고리즘 구현 역량을 보기 위해서, Numpy 등의 패키지 사용이 제한 되는 경우가 있다. `pip` 자체가 실행이 되지 않는 경우도 존재 한다. Numpy, Scipy, Pandas 등 수치관련 패키지 없이 순수 Python만을 사용하여 구하는 경우 아래와 같이 코딩할 수 있다. ( dictionary 관련 collections 도 제외한 순수 Python이다.)

 

평균 (mean)

list_nums = [16, 12, 28,  8, 18, 17, 28, 24,  5,  4, 12, 16, 8, 4,4,4]
mean = sum(list_nums)/len(list_nums)
n = len(list_nums)
print(f' 1. mean : {mean}')
기본제공 함수인 sum()과 len()을 활용하여 "전체합/길이"로 구할 수 있다. 

 

중위값 (median)

list_nums = [16, 12, 28,  8, 18, 17, 28, 24,  5,  4, 12, 16, 8, 4,4,4]
n = len(list_nums)
list_sorted = sorted(list_nums)
median = (list_sorted[n//2] + list_sorted[n//2-1])/2 if n%2==0 else list_sorted[n//2]
print(f' median : {median}')
정렬 후 순서상 중간에 있는 값을 구한다. 
짝수인 경우 중간에 있는 값 앞뒤 숫자의 평균을 구한다.

최빈값 (mode)

list_nums = [16, 12, 28,  8, 18, 17, 28, 24,  5,  4, 12, 16, 8, 4,4,4]
freq = {}
for v in list_nums:
  freq.setdefault(v,0)
  freq[v] +=1
mode_value, mode_freq = max(freq.items(), key=lambda x: x[1])
print(f' mode : {mode_value}' )
우선 값들이 가지고 있는 빈도수를 구한다. --> freq
빈도수 freq에서 가장 많은 count를 가진 숫자 `mode_value`를 구한다.
`collections` 사용이 가능한 경우는 Counter()를 통해서 조금 편하게 구할 수 있다. 
반응형

관련글 더보기

댓글 영역