기본 콘텐츠로 건너뛰기

[data analysis]로그-노말 분포(Log-normal distribution)

[data analysis] 중심척도: 최빈값(Mode)

중심척도

관련내용

최빈값(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

댓글

이 블로그의 인기 게시물

유사변환과 대각화

내용 유사변환 유사행렬의 특성 대각화(Diagonalization) 유사변환(Similarity transformation) 유사변환 n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사하다고 하며 이 변환을 유사 변환 (similarity transformation)이라고 합니다. $$\begin{equation}\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B \end{equation}$$ 식 1의 유사 변환은 다음과 같이 고유값을 적용하여 특성 방정식 형태로 정리할 수 있습니다. $$\begin{align} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align}$$ 위 식의 행렬식은 다음과 같이 정리됩니다. $$\begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \t

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b