안녕하세요. 이승혁 입니다.
오늘은 데이터의 중앙값을 구현해 보도록 하겠습니다.
중앙값이 무엇이고 언제 사용해야 하는지는 공부를 마쳤습니다.
중앙값에 대한 정보가 필요하신 분들은 아래 포스팅을 참고하시면 될 것 같습니다.
2021/01/06 - [데이터 분석] - [데이터 분석] 대푯값 | 평균 , 중앙값 , 최빈값
## 중앙값 ?
데이터를 순차적으로 나열 , 가장 가운데에 있는 값입니다.
이상치에 대한 영향이 적습니다.
하지만 모든 수치를 사용한 대표값이 아닙니다.
## 데이터 탐색 순서
평균값 -> 중앙값 -> 최빈값 -> | 범위 -> 사분위수 범위 -> 분산값 -> 표준편차
데이터 중심 어디 ? 데이터 분포 파악?
## 중앙값 사용 예시
# 사용 데이터
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
이상치가 존재 하는 것을 확인 했습니다.
약 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이라는 결과가 나옵니다.
오늘은 중앙값을 사용해보고, 이럴때 사용하는거구나~ 알아보았습니다.
다음에는 더 유익한 내용을 공부하고 공유하도록 노력해보겠습니다.
읽어주셔서 감사합니다.
'알고리즘' 카테고리의 다른 글
[VScode] C++ 환경 설정 (0) | 2023.11.25 |
---|---|
[Python algo] 연속 확률 밀도 함수 데이터 생성 및 시각화 (0) | 2021.02.17 |
[Python algo] 분산 구하기 | 표준편차 구하기 (2) | 2021.01.21 |
[Python algo] 탐욕 알고리즘 | Greedy algorithm (7) | 2021.01.19 |
[Python&SQL] 치환문자를 통해 피타고라스 정리 구현 (1) | 2021.01.18 |
[Python&SQL] 각 자리수 합 더하기 (2) | 2021.01.15 |
[Python&SQL] 적어도 불량품 1개일 확률 ? (7) | 2021.01.14 |
[Python & SQL] 몬테 카를로 | 원주율 구하기 (1) | 2021.01.09 |