알고리즘

[Python algo] 중앙값 계산 | 중앙값 사용

LeeSeunghyuk 2021. 1. 20. 10:51
반응형

 

안녕하세요. 이승혁 입니다.

 

오늘은 데이터의 중앙값을 구현해 보도록 하겠습니다.

 

중앙값이 무엇이고 언제 사용해야 하는지는 공부를 마쳤습니다.

 

중앙값에 대한 정보가 필요하신 분들은 아래 포스팅을 참고하시면 될 것 같습니다.

 

2021/01/06 - [데이터 분석] - [데이터 분석] 대푯값 | 평균 , 중앙값 , 최빈값

 

[데이터 분석] 대푯값 | 평균 , 중앙값 , 최빈값

데이터를 분석하는 과정 중 데이터 탐색은 매우 중요한 과정입니다. 한 집단의 특성을 수치로 나타내는 대표값들을 사용해 데이터를 살펴보는 순서는 다음과 같습니다. 평균 ---> 중앙값 ---> 최

lsh-story.tistory.com

 

## 중앙값 ?

 

데이터를 순차적으로 나열 , 가장 가운데에 있는 값입니다.

 

이상치에 대한 영향이 적습니다.

하지만 모든 수치를 사용한 대표값이 아닙니다.

 

## 데이터 탐색 순서

 

                 평균값 -> 중앙값 -> 최빈값 ->    |  범위 -> 사분위수 범위 -> 분산값 -> 표준편차

데이터 중심 어디 ?                           데이터 분포 파악?    

 

## 중앙값 사용 예시

 

# 사용 데이터

 

seaborn 패키지의 내장 데이터셋인 titanic 데이터셋을 사용합니다.

 

import seaborn as sns
df=sns.load_dataset('titanic')
df

 

# 결측치 확인

 

타이타닉 데이터에서 생존 여부를 예측해야 합니다.

그 중 나이(age) 데이터는 큰 영향을 미칠 것으로 판단됩니다.

 

어린 아이는 도움을 더 많이 받지 않았을까 ?

나이가 많으면 우선 순위를 받지 않았을까 ? 

혹은 나이가 많으면 탈출 하기 힘들지 않았을까 ?

 

등 나이 변수는 영향력이 클 것이라고 생각합니다.

df['age'].isnull().value_counts()

714개의 데이터는 정상적으로 데이터가 있습니다.

하지만 177개의 데이터는 비워져(null)있는 것을 확인 했습니다.

 

# 평균 확인 -> 중앙값 확인 -> 최빈값 확인

 

평균 - mean

중앙값 - median

최빈값 - mode

 

각각 수치를 확인해 보았습니다.

 

# 이상치 확인 

 

이상치는 보통 다음 범위를 사용합니다.

 

1. data < Q1  - 1.5 * IRQ

2. Q3 + 1.5 * IRQ < data

 

다음 게시글의 Box plot 부분에 간단하게 설명을 해 두었습니다.

 

2021/01/11 - [프로그래밍/Pandas] - [Pandas] 데이터 시각화 | Matplotlib.pyplot 1

 

[Pandas] 데이터 시각화 | Matplotlib.pyplot 1

Oracle SQL 데이터 분석에서 다루는 데이터의 종류는 매우 다양합니다. 따라서 다양한 종류에 따라 알맞은 시각화 방법을 알아야 합니다. Matplotlib 모듈은 평면 그래프에 대한 다양한 포맷, 시각화

lsh-story.tistory.com

 

 

이상치가 존재 하는 것을 확인 했습니다.

약 65세 이상이 되면 이상치로 판단되는 것 같습니다.

 

그러면 아까 비어있던 데이터를 평균으로 채우는 것 보다는 중앙값 , 혹은 최빈값으로 채우는게 낫겠죠?

 

# 누락 데이터 채우기

 

m=float(df['age'].mode())
df['age'].fillna(m,inplace=True)
df['age'].isnull().value_counts()

 

최빈값으로 누락된 나이 데이터를 모두 채웠습니다.

 

이렇게 간단하게 데이터 누락치 확인 , 이상치 확인, 평균 중앙 최빈값 비교, 누락데이터 채우기의 과정을

진행해 보았습니다.

 

numpy , Pandas 등 쉽게 중앙값은 구할 수 있습니다.

하지만 직접 중앙값을 구하는 코드를 작성해 보면서 중앙값이 어떻게 계산되는지

조금더 잘 파악할 수 있도록 해보겠습니다.

 

### Python 중앙값 구현하기

 

중앙값은 오름차순 정렬을 했을 때 가장 가운데에 있는 값입니다.

따라서 알고리즘은 다음과 같습니다.

 

1. 데이터 정렬

2. 가운데 위치 인덱스 구함

3. 짝수일 때 / 홀수일 때

 

짝수인 경우에는 가운데 있는 값 간의 평균을 중앙값으로 반환합니다.

홀수인 경우에는 가운데 값을 그대로 중앙값으로 반환합니다.

 

datalist=[1,7,5,6,5,7,8,1,23,7,8,6,2,4]

def median(data):
    d=len(data)
    data=sorted(data)
    print('데이터 정렬 ',data)
    # 데이터가 짝수개
    if len(data)%2==0: 
        d=int(d/2)   
        m=(data[d]+data[d-1])/2
        return m
    # 데이터가 홀수개
    else: 
        d=int(d/2)+1
        m=data[d]
        return m
    
print(len(datalist))    
median(datalist)        

 

데이터는 14개로 6.0이라는 결과가 나왔습니다.

6이 아닌 6.0인 이유는 데이터 개수가 짝수이므로 나눗셈 연산을 진행했기 때문입니다.

int 형이 아닌 float 형으로 결과가 출력됩니다.

 

# 실제 데이터 적용해보기

 

위 예제에서 seaborn의 titanic 데이터의 age 칼럼의 중앙값은 24.0이었습니다.

직접 만든 함수로 확인을 해보도록 하겠습니다.

 

import seaborn as sns
df=sns.load_dataset('titanic')
datalist=df.age.dropna()

def median(data):
    d=len(data)
    data=sorted(data)
    print('데이터 정렬 ',data)
    # 데이터가 짝수개
    if len(data)%2==0: 
        d=int(d/2)   
        m=(data[d]+data[d-1])/2
        return m
    # 데이터가 홀수개
    else: 
        d=int(d/2)+1
        m=data[d]
        return m
    
print(len(datalist))    
median(datalist)        

null 값을 제외하고 중앙값을 계산하기 위해 null값을 없앤 후 적용했습니다.

 

마찬가지로 28이라는 결과가 나옵니다.

 

오늘은 중앙값을 사용해보고, 이럴때 사용하는거구나~ 알아보았습니다.

다음에는 더 유익한 내용을 공부하고 공유하도록 노력해보겠습니다.

읽어주셔서 감사합니다.

 

반응형