- 공유 링크 만들기
- 이메일
- 기타 앱
중심척도
관련내용
최빈값(Mode)
통계에서는 종종 데이터의 많은 부분이 집중되는 지점의 정보가 중요하게 사용됩니다. 그 점은 전체 데이터에 대한 중심의 척도로 사용됩니다. 예를 들어 여러가지 메뉴를 가지는 레스토랑에서 새로운 단장 이후에 경영자는 1가지 메뉴로 집중하고자 합니다. 이 경우 가장 많은 매출이 있는 메뉴를 선택하는 것은 합리적인 결정이 됩니다. 이와 같이 데이터 전체 중에서 가장 많이 관찰된 값을 최빈값(mode)이라 합니다.
[최빈값(mode)]
- 데이터 셋의 각 변수가 등장하는 빈도수에서 가장 높은 빈도수를 가진 값을 최빈값이 라고 합니다.
- 데이터 셋에서 최빈값은 1개 이상이 될 수 있습니다.
최빈값은 가장 높은 빈도수인 정상점(peak)을 나타내기 위해 사용하는 것으로서 파이썬의 여러 패키지로부터의 함수나 메소드를 사용하여 계산할 수 있습니다.
- np.unique(x, return_index=False, return_counts=False, axis=None)
- 객체 x에서 고유한 요소들과 각각의 빈도를 반환
- return_index: 반환된 요소들의 인덱스 (첫 번째로 감지되는 인덱스)
- return_counts: 각 고유값(unique)의 빈도수
- axis=None: 함수가 실행되는 기준 축, None는 객체를 1차원으로 전환
- scipy.stats.mode(x, axis=0, keepdims=True)
- 객체 x의 지정한 축(axis)에 따라 최빈값(들)을 결정합니다.
- x는 수치형으로 구성된 객체이어야 합니다.
- DataFrame.mode(axis=0, numeric_only=False, dropna=True)
- 지정한 축을 따라 최빈값을 반환
- pd객체.value_counts(normalize=False, sort=True, ascending=False, dropna=True)
- 고유한 값의 빈도수를 포함하는 Series를 반환합니다.
- normalize: 빈도수를 상대 빈도로 변환
- sort: 빈도수에 따라 결과를 정렬
ascending=True 올림차순, False 내림차순 - dropna=True, 결측치를 제거
다음 특정 구간에서 지정한 크기의 임의의 정수를 발생하는 numpy.random 모듈 함수인 randint(start, end, size)
를 사용하여 생성한 자료에서 최빈값을 결정해봅니다.
랜덤수 생성은 numpy 패키지의 random 하위모듈의 여러함수를 사용합니다. 다음 코드 randint()는 인수 start와 end 사이의 구간을 지정하여 지정한 크기의 랜덤 정수를 생성합니다. 이 함수는 코드를 실행할 때마다 새로운 수들이 생성됩니다. 같은 수들이 생성할 수 있게 하기 위해 random.seed(정수)
를 입력한 후 생성합니다.
import numpy as np import pandas as pd from scipy import stats
np.random.seed(1) data=np.random.randint(1, 10, 50) print(data)
[6 9 6 1 1 2 8 7 3 5 6 3 5 3 5 8 8 2 8 1 7 8 7 2 1 2 9 9 4 9 8 4 7 6 2 4 5 9 2 5 1 4 3 1 5 3 8 8 9 7]
new, cnt=np.unique(data, return_counts=True) print(new)
[1 2 3 4 5 6 7 8 9]
print(cnt)
[6 6 5 4 6 4 5 8 6]
da1=pd.DataFrame(data) da1.T
0 | 1 | 2 | ... | 47 | 48 | 49 |
0 | 6 | 9 | ... | 8 | 9 | 7 |
1 rows × 50 columns |
da1.value_counts()
8 8 1 6 2 6 5 6 9 6 3 5 7 5 4 4 6 4 dtype: int64
da1.mode()
0 0 8
unique()
함수는 최빈값만이 아니라 데이터 전체의 빈도수를 계산하는 것으로서 최종적으로 사용자가 최빈값을 결정해야 합니다. 대신에 pd객체.mode()
메소드나 stats.mode()
함수는 최빈값만을 반환합니다.
stats.mode(data, keepdims=True)
ModeResult(mode=array([8]), count=array([8]))
예)
색들로 구성된 데이터에서 최빈값을 결정해 봅니다.
green | blue | red | green | green |
red | blue | black | white | yellow |
green | yellow | green | green | green |
np.random.seed(2) col=["red","blue", "green", "black" ] col2=np.random.choice(col, 20, replace=True) print(col2)
['red' 'black' 'blue' 'red' 'green' 'black' 'green' 'black' 'red' 'black' 'green' 'blue' 'black' 'black' 'blue' 'black' 'black' 'black' 'green' 'red']
pd.Series(col2).mode()
0 black dtype: object
pd.Series(col2).value_counts()
black 9 red 4 green 4 blue 3 Name: count, dtype: int64
객체 col2의 요소의 자료형은 비수치형으로 stats.mode() 적용시 경고메시지를 반환합니다.
stats.mode(col2, keepdims=True)
Argument `a` is not recognized as numeric.~
[자료형]
프로그래밍 과정에서 입력되는 자료의 종류에 따라 메모리의 크기를 할당하는 것으로 메모리를 관리합니다. 파이썬은 기본적으로 숫자형(number), 문자형(string), 리스트형(list), 튜플형(tuple), 사전형(dictionary) 등 5종류의 자료 유형을 암묵적으로 구별합니다. 또한 이 기본 자료형을 기준으로 특정한 목적으로 사용하기 위한 새로운 자료 유형을 생성할 수 있습니다.
위에서 사용한 numpy, pandas, scipy 등의 패키지는 각각의 자료형을 사용하고 있지만 리스트를 기반으로 생성한 자료형입니다. 리스트는 대괄호를 사용하여 여러 값들을 하나로 그룹화한 것으로 ['a','list','리스트', 2, 3]과 같은 형태입니다.
pd-객체.mode()
는 위와 같은 명목변수에 대해서 최빈값을 계산할 수 있지만 stats.mode()
는 양적변수에만 적용됩니다. 또한 최빈값 뿐만 아니라 다양한 통계량을 계산하기 위해서는 목록변수(질적변수)를 수치형인 양적변수로 전환할 필요가 있습니다. 파이썬의 sklearn.preprocessing 모듈은 질적변수를 양적변수로 전환하기 위한 많은 클래스를 제공합니다. 다음 코드는 그 클래스들중에 LabelEncoder()의 적용을 보입니다.
from sklearn.preprocessing import LabelEncoder color=LabelEncoder() color.fit(col2)
LabelEncoder LabelEncoder()
print(color.classes_)
['black' 'blue' 'green' 'red']
col3=color.transform(col2) print(col3)
[3 0 1 3 2 0 2 0 3 0 2 1 0 0 1 0 0 0 2 3]
print(color.inverse_transform(col3))
['red' 'black' 'blue' 'red' 'green' 'black' 'green' 'black' 'red' 'black' 'green' 'blue' 'black' 'black' 'blue' 'black' 'black' 'black' 'green' 'red']
일반적으로 최빈값은 명목변수나 이산형 양적변수에 적용합니다. 이것은 연속변수일 경우 각각의 값들에 대한 빈도수를 결정하기가 어렵기 때문입니다. 그러나 연속변수의 최빈값은 이산변수로 전환하여 나타낼 수 있습니다. 즉, 연속변수로 이루어진 전체 데이터를 여러개의 범주로 구분한뒤 각각의 범주에 포함된 값들의 빈도수를 계산하는 것으로 이산변수화 할 수 있습니다.
이러한 연속변수의 이산화는 np.digtize()
함수에 의해 실행할 수 있습니다.
- np.digitize(x, bin)
- 연속형 자료에 대한 그룹화 결과를 반환
- x: numpy 객체
- bin: 그룹의 상한과 하한의 되는 기준 객체입니다.
bin=[0, 1, 2] 일 경우 그 그룹화 범위는 0 < x ≤ 1, 1 < x ≤ 2이 됩니다.
bin = 6 → 6개의 소그룹이 생성
예)
20개의 임의의 수를 4개의 그룹으로 구분하여 각 값의 소속된 그룹을 표시해 봅니다.
np.random.seed(3) data=np.around(np.random.randn(20), 3) print(data)
[ 1.789 0.437 0.096 -1.863 -0.277 -0.355 -0.083 -0.627 -0.044 -0.477 -1.314 0.885 0.881 1.71 0.05 -0.405 -0.545 -1.546 0.982 -1.101]
bin=np.linspace(np.min(data)-0.1, np.max(data)+0.1, 5) print(bin)
[-1.963 -1. -0.037 0.926 1.889]
위 결과의 bin은 식 1과 같이 나타낼 수 있습니다.
-1.963 | ≤ | x | < | -1 | → 1 | (식 1) |
-1 | ≤ | x | < | -0.037 | → 2 | |
-0.037 | ≤ | x | < | 0.926 | → 3 | |
0.926 | ≤ | x | < | 1.889 | → 4 |
print(np.digitize(data, bin))
[4 3 3 1 2 2 2 2 2 2 1 3 3 4 3 2 2 1 4 1]
예)
다음 데이터의 최빈값을 결정합니다.
8, 8, 2, 3,1, 5, 0
x=np.array([8,8,2,3,1,5,0]) stats.mode(x, keepdims=True)
ModeResult(mode=array([8]), count=array([2], dtype=int64))
pd.Series(x).mode()
0 8 dtype: int32
예)
다음 데이터의 최빈값과 고유값들의 빈도수를 결정합니다.
5, 5, 3, 6, 2, 4, 5, 9, 5, 5, 2, 5
x=pd.Series([5, 5, 3, 6, 2, 4, 5, 9, 5, 5, 2, 5]) x.value_counts()
5 6 2 2 3 1 6 1 4 1 9 1 dtype: int64
x.mode()
0 5 dtype: int64
댓글
댓글 쓰기