본문 바로가기

데이터 분석/Python - 정리하자

건강관리 현업 데이터로 전처리

반응형

**해당 데이터는 제가 학원 강의를 수료하며 받은 데이터이며 원본 데이터는 기업으로부터 제공받은 데이터라서 공유할 수 없습니다.
**본문은 공부를 하며 과정을 이해하며 생각하기 위함이니 참고 해주시면 감사드리겠습니다.

## Environment : Anaconda-navigator
## Programming Language : Python 3
## Import Pandas as pd
## import Numpy as np

## import seaborn as sns
## import matplotlib as mpl
## import matplotlib pyplot as plt
## Data provided by DS school & Origin data from Noom.
## Noom is a company that mentioned as below.

눔(Noom Inc.)은 모바일 플랫폼을 통해 건강관리 서비스를 제공하는 회사로서 2008년, 정세주 대표와 구글 수석 엔지니어 출신이자 공동창업자인 아텀 페타코브(Artem Petakov)에 의해 설립되었습니다. 눔(Noom)은 미국, 일본, 독일, 한국 등 14개국에서 4,600만명이 가입한 글로벌 서비스로 성장하였고, 2009년과 2010년 연이어 구글(Google) 이 선정한 가장 혁신적인 개발 스타트업 중 하나로 선정되었습니다.

Target

  1. 데이터를 불러오기 및 전반적인 정보 확인
  2. 불러온 데이터들을 전처리
  3. 데이터 분석

이번에는 성별 데이터를 다뤄보겠습니다.

# 성별 컬럼의 종류를 확인합니다 (nan은 Not a Number, 즉 값이 없다는 의미입니다)
clean_data['Gender'].unique()

총 3 종류의 값이 있으며, 가독성을 높이기 위해 FEMALE -> female로 MALE -> male로 변경해보겠습니다.

# Gender(clean) 이라는 컬럼에 변경된 내용 적용
clean_data['Gender(clean)'] = clean_data['Gender']\
                             .str.replace('FEMALE', 'female').str.replace('MALE', 'male')

clean_data[['Name','Gender','Gender(clean)']].head(3)  # 명시된 컬럼의 상단 3줄만 확인합니다

내용이 잘 변경되었습니다.

이번엔 가입 유저분들의 비율을 확인해보겠습니다.

clean_data['Gender(clean)'].value_counts()

상대적으로 여성분들의 비율이 높은걸 확인하실 수 있습니다.

이번에는 Height 컬럼을 정리해보겠습니다. 데이터에 대한 describe에서 보셨겠지만 키 값이 -1이 들어간 분들이 있었습니다.

# Height 컬럼에서 가장 작은(min) 값을 찾아와서 출력합니다
clean_data["Height"].min()

모두가 아시겠지만 키가 -1 cm인 사람은 존재하지 않습니다. 추측컨데, 데이터를 저장하는 담당자가 편의를 위해 키를 입력하지 않은 사용자를 NaN이 아닌 -1.0으로 기입한 것 같습니다. 이 경우 데이터를 저장하는데는 편리하지만, 데이터를 분석할 경우 통계치가 잘못 나올 가능성이 있습니다. (가령 평균 키를 계산하면 실제 평균보다 -1.0씩 밀리겠죠)

그러므로 원활한 분석을 위해서는 키 컬럼을 정리해줄 필요가 있습니다. 키가 -1 cm인 사람은 NaN으로 데이터를 넣어주겠습니다.

import numpy as np  # numpy 패키지를 불러옵니다

# -1 값을 nan값으로 대체해줍니다
clean_data["Height(clean)"] = clean_data["Height"].replace(-1, np.nan)

# 해당 컬럼의 최소값을 확인합니다
print(clean_data["Height(clean)"].min())

# 해당 데이터에서 명시된 컬럼들만 확인하고, Height컬럼의 최소값 확인을 위해 오름차순으로 정리해서 봅니다
clean_data[['Name', 'Height', 'Height(clean)']].sort_values('Height', ascending=True)

이번에는 해당 컬럼의 최소값, 최대값 그리고 pivot_table을 활용해 남녀 평균을 구해보도록 하겠습니다.

print(clean_data['Height(clean)'].min()) # 해당 컬럼의 최소값
print(clean_data['Height(clean)'].max()) # 해당 컬럼의 최소값

# 위치마다 값들이 왜 저렇게 들어가야할지에 대해서는 링크 참고해주세요
pd.pivot_table(clean_data, index = 'Gender(clean)',\
               values='Height(clean)', aggfunc='mean')

(pivot_table 설명 link : https://pbpython.com/pandas-pivot-table-explained.html )

원하는 결과가 확인되었습니다.

이번에는 나이(age) 컬럼을 정리해보겠습니다.

우선 최소 나이와 최대 나이부터 확인해보겠습니다.

# 가장 나이가 어린 고객을 찾습니다
# 결과는 0세라고 나오지만, 0세 사용자가 이 서비스를 사용할 가능성은 없습니다
# 즉, 이 데이터는 잘못 기입된 데이터라고 판단할 수 있습니다
print('최소 나이는 = ', clean_data["Age"].min())

# 가장 나이가 많은 고객을 찾습니다
# 결과는 173세라고 나오는데, 이 데이터도 잘못 기입되었다고 판단할 수 있습니다
print('최대 나이는 = ', clean_data["Age"].max())

이번에는 나이 컬럼을 아래 규칙에 맞춰서 나이 컬럼을 정리하겠습니다.
1. 나이가 0인 데이터는 NaN으로 변경
2. 나이가 60세 이상인 데이터는 NaN으로 변경

# Age(clean) 컬럼 생성
clean_data['Age(clean)'] = clean_data['Age']

# 'Age'컬럼에서 나이가 0 혹은 60 이상인 사람은 np.nan으로 변경
clean_data.loc[clean_data['Age'] == 0, 'Age(clean)'] = np.nan
clean_data.loc[clean_data['Age'] >= 60, 'Age(clean)'] = np.nan

# 'Age'컬럼에서 나이가 0이거나 60이상인 사람을 가져오고 새로 생성된 'Age(clean)'컬럼에 잘 반영되었는지 확인
clean_data.loc[(clean_data["Age"] == 0) | (clean_data["Age"] >= 60),\
              ["Name", "Age", "Age(clean)"]].head()

해당 항목이 잘 변경되었습니다.

이번에는 해당 컬럼의 최소값, 최대값 그리고 pivot_table을 활용해 남녀 나이 평균을 구해보도록 하겠습니다.

print(clean_data['Age(clean)'].min())  # 해당 컬럼의 최소값
print(clean_data['Age(clean)'].max())  # 해당 컬럼의 최대값

pd.pivot_table(clean_data, index = 'Gender(clean)',\
               values='Age(clean)', aggfunc='mean')

결과가 확인되었습니다.

 

다음 페이지에서는 본 환경을 이어서 동일한 데이터를 가지고 병합을 진행하도록 하겠습니다.

*** 본 페이지는 본인의 공부를 위해 작성되었으며, 협찬이나 문의를 받고 기재한 내용이 아닙니다. 혹시 문의사항이 있으시거나 문제가 될 경우 연락 주시기 바랍니다.***

 

반응형