통계의 핵심: 평균, 중앙값, 최빈값
평균, 중앙값, 최빈값은 통계 분석의 기초를 이루는 중요한 개념입니다. 파이썬은 외부 라이브러리의 도움 없이도 이러한 값들을 쉽게 계산할 수 있는 강력한 도구를 제공합니다.
이 세 가지 값은 중심 경향을 나타내는 주요 지표입니다. 중심 경향은 데이터 세트 내에서 “일반적인” 또는 “대표적인” 값을 파악하는 데 도움을 줍니다. 만약 데이터 과학에 첫발을 내딛고 있다면, 이 튜토리얼이 훌륭한 출발점이 될 것입니다.
이 튜토리얼을 마치면 여러분은 다음을 할 수 있게 됩니다.
- 평균, 중앙값, 최빈값의 개념을 명확히 이해합니다.
- 파이썬을 사용하여 자신만의 평균, 중앙값, 최빈값 계산 함수를 만들 수 있습니다.
- 파이썬의 통계 모듈을 활용하여 이러한 측정값을 빠르게 계산할 수 있습니다.
연습 자료는 다음 GitHub 저장소에서 다운로드할 수 있습니다.
이제 평균, 중앙값, 최빈값을 계산하는 다양한 방법에 대해 자세히 알아보겠습니다.
파이썬에서 평균 계산하기
평균(또는 산술 평균)은 중심 경향을 나타내는 가장 널리 사용되는 지표 중 하나입니다.
다시 한번 강조하지만, 중심 경향은 데이터 세트의 대표적인 값을 의미합니다.
데이터 세트는 단순히 데이터의 모음이며, 파이썬에서는 다음과 같은 내장 데이터 구조를 사용하여 표현할 수 있습니다.
- 리스트, 튜플, 세트: 객체의 모음
- 문자열: 문자의 모음
- 사전: 키-값 쌍의 모음
참고: 파이썬에는 큐나 스택과 같은 다른 데이터 구조도 있지만, 이 튜토리얼에서는 내장된 데이터 구조에만 초점을 맞춥니다.
평균은 데이터 세트의 모든 값을 더한 다음, 그 결과를 값의 총 개수로 나누어 계산합니다. 예를 들어 다음과 같은 숫자 리스트가 있다고 가정해 봅시다:
[1, 2, 3, 4, 5, 6]
이 리스트의 합은 21이고, 리스트의 길이는 6이므로 평균은 3.5입니다. (21 / 6 = 3.5) 이 계산은 다음과 같이 표현할 수 있습니다.
(1 + 2 + 3 + 4 + 5 + 6) / 6 = 3.5
이 튜토리얼에서는 농구팀 선수들의 나이를 샘플 데이터로 사용합니다.
사용자 정의 평균 함수 만들기
먼저, “Pythonic Machines”라는 농구팀 선수들의 평균 나이를 계산하는 것부터 시작해 보겠습니다.
pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24] def mean(dataset): return sum(dataset) / len(dataset) print(mean(pythonic_machine_ages))
위 코드를 분석해 보면 다음과 같습니다.
pythonic_machine_ages
는 농구 선수들의 나이를 담은 리스트입니다.- 주어진 데이터 세트의 합을 길이로 나누어 평균값을 반환하는
mean()
함수를 정의합니다.sum()
함수는 iterable(여기서는 리스트) 내 모든 값의 합을 반환합니다. 데이터 세트를 인수로 전달하면 211을 반환합니다.len()
함수는 iterable의 길이를 반환합니다. 데이터 세트를 전달하면 8을 얻게 됩니다.
- 농구팀 선수들의 나이를
mean()
함수에 전달하고, 그 결과를 출력합니다.
위 코드를 실행하면 다음과 같은 결과를 얻습니다.
26.375 # 211 / 8 = 26.375
이 값은 농구팀 선수들의 평균 나이를 나타냅니다. 데이터 세트에 나타나지 않는 값이지만, 대부분의 선수들의 나이를 대표하는 값으로 사용될 수 있습니다.
파이썬 통계 모듈의 mean()
함수 사용하기
중심 경향 측정을 계산하는 것은 많은 개발자들에게 일반적인 작업입니다. 파이썬의 통계 모듈은 이를 포함한 다양한 통계 계산 기능을 제공합니다.
파이썬 표준 라이브러리의 일부이므로, 외부 패키지를 PIP로 설치할 필요가 없습니다.
이 모듈을 사용하는 방법은 다음과 같습니다.
from statistics import mean pythonic_machine_ages = [19, 22, 34, 26, 32, 30, 24, 24] print(mean(pythonic_machine_ages))
위 코드에서는 통계 모듈에서 mean()
함수를 가져와서 데이터 세트를 인수로 전달하기만 하면 됩니다. 이전 섹션에서 직접 정의한 함수와 같은 결과를 얻을 수 있습니다.
26.375
이제 평균의 개념이 명확해졌으므로, 다음으로 중앙값에 대해 알아보겠습니다.
파이썬에서 중앙값 찾기
중앙값은 정렬된 데이터 세트의 중간값을 의미합니다. 중앙값은 모집단의 “전형적인” 값을 파악하는 데 사용됩니다.
프로그래밍에서 중앙값은 시퀀스를 하위 절반과 상위 절반으로 나누는 값으로 정의할 수 있습니다.
중앙값을 계산하려면 먼저 데이터 세트를 정렬해야 합니다. 이는 정렬 알고리즘이나 내장 함수인 sorted()
를 사용하여 수행할 수 있습니다. 두 번째 단계는 데이터 세트의 길이가 홀수인지 짝수인지 확인하는 것입니다. 이에 따라 다음 프로세스 중 하나가 수행됩니다.
- 홀수: 중앙값은 데이터 세트의 정확히 중간에 있는 값입니다.
- 짝수: 중앙값은 가운데 두 값의 합을 2로 나눈 값입니다.
계속해서 농구팀 데이터를 사용하여 선수들의 키를 센티미터 단위로 나타내고, 그 중앙값을 계산해 보겠습니다.
[181, 187, 196, 196, 198, 203, 207, 211, 215] # 데이터 세트의 길이가 홀수이므로, 중간값을 선택합니다. median = 198
보시다시피 데이터 세트의 길이가 홀수이므로 중간값을 중앙값으로 사용할 수 있습니다. 만약 한 선수가 은퇴한다면 어떻게 될까요?
이제 중앙값을 계산하기 위해 데이터 세트의 두 중간값을 사용해야 합니다.
[181, 187, 196, 198, 203, 207, 211, 215] # 중간에 있는 두 값을 선택하고, 2로 나눕니다. median = (198 + 203) / 2 median = 200.5
사용자 정의 중앙값 함수 만들기
이제 위의 개념을 파이썬 함수로 구현해 보겠습니다.
데이터 세트의 중앙값을 얻기 위해 따라야 하는 세 단계를 기억하십시오.
- 데이터 세트 정렬:
sorted()
함수를 사용하여 정렬할 수 있습니다. - 홀수인지 짝수인지 확인: 데이터 세트의 길이를 구하고, 모듈로 연산자(
%
)를 사용하여 이를 확인할 수 있습니다. - 각 경우에 따라 중앙값을 반환합니다.
- 홀수: 중간값 반환
- 짝수: 두 중간값의 평균 반환
이를 통해 다음과 같은 함수를 만들 수 있습니다.
pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215] after_retirement = [181, 187, 196, 198, 203, 207, 211, 215] def median(dataset): data = sorted(dataset) index = len(data) // 2 # 데이터 세트의 길이가 홀수인 경우 if len(dataset) % 2 != 0: return data[index] # 데이터 세트의 길이가 짝수인 경우 return (data[index - 1] + data[index]) / 2
데이터 세트의 결과를 출력해 보겠습니다.
print(median(pythonic_machines_heights)) print(median(after_retirement))
결과:
198 200.5
함수 시작 부분에서 정렬된 데이터베이스를 가리키는 데이터 변수를 만드는 방법에 주목하십시오. 위 리스트는 이미 정렬되어 있지만, 재사용 가능한 함수를 만들려고 하므로 함수가 호출될 때마다 데이터 세트를 정렬하는 것이 좋습니다.
index
는 정수 나누기 연산자를 사용하여 데이터 세트의 중간값 또는 중간값들을 저장합니다. 예를 들어 pythonic_machine_heights
리스트를 전달하면 값은 4가 됩니다.
파이썬 시퀀스 인덱스는 0부터 시작한다는 점을 기억하십시오. 이 때문에 정수 나누기를 통해 리스트의 중간 인덱스를 반환할 수 있습니다.
다음으로, 모듈로 연산 결과가 0이 아닌 값과 비교하여 데이터 세트의 길이가 홀수인지 확인합니다. 조건이 참이면 예를 들어 pythonic_machine_heights
리스트의 중간 요소, 즉 198을 반환합니다.
>>> pythonic_machine_heights[4] # 198
반면, 데이터 세트가 짝수이면 중간 값들의 합을 2로 나눈 값을 반환합니다. 참고로 data[index - 1]
은 데이터 세트의 낮은 중간점을 제공하고, data[index]
는 높은 중간점을 제공합니다.
파이썬 통계 모듈의 median()
함수 사용하기
이 방법은 통계 모듈에 이미 존재하는 함수를 사용하기 때문에 훨씬 간단합니다.
개인적으로는 이미 정의된 것이 있다면 DRY(Don’t Repeat Yourself) 원칙(이 경우에는 다른 사람의 코드를 반복하지 않는 것)을 따릅니다.
다음 코드를 사용하여 이전 데이터 세트의 중앙값을 계산할 수 있습니다.
from statistics import median pythonic_machines_heights = [181, 187, 196, 196, 198, 203, 207, 211, 215] after_retirement = [181, 187, 196, 198, 203, 207, 211, 215] print(median(pythonic_machines_heights)) print(median(after_retirement))
결과:
198 200.5
파이썬에서 최빈값 계산하기
최빈값은 데이터 세트에서 가장 자주 나타나는 값입니다. 이를 모든 학생을 대표할 수 있는 학교의 “인기 있는” 그룹으로 생각할 수 있습니다.
최빈값의 예로 기술 상점의 일일 판매 데이터를 들 수 있습니다. 이 데이터 세트의 최빈값은 특정 날짜에 가장 많이 판매된 제품일 것입니다.
['laptop', 'desktop', 'smartphone', 'laptop', 'laptop', 'headphones']
위 데이터 세트에서 최빈값은 “laptop”입니다. 왜냐하면 이 값이 리스트에서 가장 자주 나타나기 때문입니다.
최빈값의 흥미로운 점은 데이터 세트가 숫자일 필요가 없다는 것입니다. 예를 들어 문자열로도 작업할 수 있습니다.
다른 날의 판매 데이터를 분석해 보겠습니다.
['mouse', 'camera', 'headphones', 'usb', 'headphones', 'mouse']
위 데이터 세트에는 “mouse”와 “headphones” 두 개의 최빈값이 있습니다. 둘 다 빈도가 2이기 때문입니다. 이를 복수 최빈값 데이터 세트라고 합니다.
만약 다음과 같이 데이터 세트에서 최빈값을 찾을 수 없다면 어떻게 될까요?
['usb', 'camera', 'smartphone', 'laptop', 'TV']
이것은 균등 분포입니다. 기본적으로 데이터 세트에 최빈값이 없다는 것을 의미합니다.
이제 최빈값의 개념을 빠르게 이해했으므로, 파이썬에서 계산해 보겠습니다.
사용자 정의 최빈값 함수 만들기
값의 빈도를 키-값 쌍, 즉 파이썬 사전으로 생각할 수 있습니다.
농구 예시를 계속해서 두 가지 데이터 세트로 작업해 보겠습니다. 게임당 점수와 일부 선수의 운동화 스폰서십입니다.
최빈값을 찾기 위해서는 먼저 데이터 세트의 각 값에 대한 빈도 사전을 만들어야 합니다. 그런 다음, 최대 빈도를 구하고, 해당 빈도를 가진 모든 요소를 반환해야 합니다.
이를 코드로 옮겨 보겠습니다.
points_per_game = [3, 15, 23, 42, 30, 10, 10, 12] sponsorship = ['nike', 'adidas', 'nike', 'jordan', 'jordan', 'rebook', 'under-armour', 'adidas'] def mode(dataset): frequency = {} for value in dataset: frequency[value] = frequency.get(value, 0) + 1 most_frequent = max(frequency.values()) modes = [key for key, value in frequency.items() if value == most_frequent] return modes
두 리스트를 인수로 전달한 결과를 확인해 보겠습니다.
print(mode(points_per_game)) print(mode(sponsorship))
결과:
[10] ['nike', 'adidas', 'jordan']
보시다시피 첫 번째 print
문은 단일 최빈값을 제공했지만, 두 번째는 여러 최빈값을 반환했습니다.
위 코드에 대한 자세한 설명은 다음과 같습니다.
- 빈도 사전
frequency
를 선언합니다. - 데이터 세트를 반복하여 히스토그램(카운터 집합에 대한 통계 용어)을 생성합니다.
- 키가 사전에서 발견되면 값에 1을 더합니다.
- 키를 찾을 수 없으면 값이 1인 키-값 쌍을 만듭니다.
most_frequent
변수는 빈도 사전의 가장 큰 값(키가 아님)을 저장합니다.modes
변수는 빈도 사전에서 가장 높은 빈도를 가진 모든 키로 구성된 리스트를 반환합니다.
변수 이름 지정이 읽기 쉬운 코드를 작성하는 데 얼마나 중요한지 알 수 있습니다.
파이썬 통계 모듈의 mode()
및 multimode()
함수 사용하기
다시 한번, 통계 모듈은 기본적인 통계 작업을 수행하는 빠른 방법을 제공합니다.
다음과 같은 두 가지 함수를 사용할 수 있습니다. mode()
와 multimode()
.
from statistics import mode, multimode points_per_game = [3, 15, 23, 42, 30, 10, 10, 12] sponsorship = ['nike', 'adidas', 'nike', 'jordan', 'jordan', 'rebook', 'under-armour', 'adidas']
위 코드는 두 함수를 모두 가져오고 작업할 데이터 세트를 정의합니다.
여기서 약간의 차이점이 있습니다. mode()
함수는 발견되는 첫 번째 최빈값을 반환하는 반면, multimode()
함수는 데이터 세트에서 가장 빈번한 값을 담은 리스트를 반환합니다.
결과적으로, 이전에 정의한 사용자 정의 함수는 실제로 multimode()
함수와 같다고 할 수 있습니다.
print(mode(points_per_game)) print(mode(sponsorship))
결과:
10 nike
참고: 파이썬 3.8 이상에서 mode()
함수는 찾은 첫 번째 최빈값을 반환합니다. 이전 버전에서는 StatisticsError
가 발생할 수 있습니다.
multimode()
함수를 사용해 보겠습니다.
print(multimode(points_per_game)) print(multimode(sponsorship))
결과:
[10] ['nike', 'adidas', 'jordan']
결론
축하합니다! 여기까지 잘 따라오셨다면, 중심 경향 측정의 핵심인 평균, 중앙값, 최빈값을 계산하는 방법을 익히셨을 겁니다.
평균, 중앙값, 최빈값을 찾기 위해 사용자 정의 함수를 만들 수도 있지만, 통계 모듈을 사용하는 것이 좋습니다. 표준 라이브러리의 일부이기 때문에 추가 설치 없이도 바로 사용할 수 있다는 장점이 있기 때문입니다.
다음으로는 파이썬을 사용한 데이터 분석에 대한 친절한 소개 자료를 읽어보시기 바랍니다.