**해당 데이터는 제가 학원 강의를 수료하며 받은 데이터이며 원본 데이터는 기업으로부터 제공받은 데이터라서 공유할 수 없습니다.
**본문은 공부를 하며 과정을 이해하며 생각하기 위함이니 참고 해주시면 감사드리겠습니다.
## 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
- 데이터를 불러오기 및 전반적인 정보 확인
- 불러온 데이터들을 전처리
- 데이터 분석
VIP 구하기
이제 본격적으로 데이터 분석(Data Analysis)을 해보겠습니다.
먼저 운영팀의 요청부터 살펴보겠습니다. 운영팀은 눔 코치를 이용하는 고객 중, 크게 다음의 조건에 해당하는 사람을 찾고 싶습니다.
1. 유료 사용자 중, 사용자 정보를 잘못 기입한 사람
2. 유료 사용자 중, 눔 코치의 VIP 사용자라고 간주할 수 있는 사람
1번 사용자의 경우, 유료 결제를 했으나 사용자 정보(나이, 키, 몸무게 등)가 잘못 기입되어있다면 담당 코치가 정확한 코칭을 제공해 줄 수 없는 문제가 있습니다. 그러므로 운영팀은 가능한 빠르게 정보를 잘못 기입한 고객을 찾아서 다시 기입해달라고 요청할 필요가 있습니다.
2번 사용자의 경우, 눔의 VIP 사용자로서 추가 혜택(ex: 서비스 무료 이용)을 제공해주는 것을 조건으로,
눔 코치를 대표하는 홍보 모델로서 활동해줄 것을 요청할 수 있습니다.
특히나 다이어트 관련 서비스는 VIP 사용자의 Before / After를 보여주는 것 만큼 좋은 홍보 수단은 없습니다.
그러므로 데이터 분석 팀에서 특정 조건(ex: 10kg 이상 감량 성공)에 만족하는 코어 사용자를 찾아내는 것을 중요합니다.
그러므로 눔의 데이터를 활용해, 1) 잘못된 정보를 기입한 사용자(invalid user)와,
눔 코치를 사용하여 큰 성과(ex: 몸무게 감량)를 본 사용자(VIP user)를 찾아보도록 하겠습니다.
분석의 효율성을 높이기 위해 필요한 컬럼만 정리 후 데이터 분석을 진행하도록 하겠습니다.
print(clean_data.columns) # clean_data의 컬럼들 확인
cols = ['Name', 'Age(clean)', 'Height(clean)', 'Initial Weight',
'Lowest Weight', 'Target Weight', 'Status'] # 집어넣을 컬럼들 선택
for_vip = clean_data[cols] # for_vip 변수로 컬럼들 업데이트
for_vip.head(3) # 상단 3개 행 확인
이번에는 잘못된 정보를 기입한 사용자와 VIP 사용자를 구분하기 위한 컬럼을 아래 조건을 가지고 새로 추가하겠습니다.
1. Weight Loss(goal) - 목표 감량치. Initial Weight 컬럼과 Target Weight의 차이를 나타냅니다. (마이너스가 나올 수 있습니다)
2. Weight Loss(current) - 최대 감량치. Initial Weight 컬럼과 Lowest Weight의 차이를 나타냅니다. (마이너스가 나올 수 있습니다)
3. 체질량지수(BMI) - 키(Height(clean))와 체중(Initial Weight)으로 체지방의 양을 추정하는 공식입니다. 구체적인 공식은 다음과 같습니다. 𝐵𝑀𝐼=체중(𝑘𝑔) / 키(𝑚)×키(𝑚)
# cm로 기록된 키를 미터(m)로 변환해서 'Height(m)(clean)'라는 이름의 새로운 컬럼에 저장합니다
for_vip["Height(m)(clean)"] = for_vip["Height(clean)"] / 100
# Initial Weight와 Target Weight를 뺀 뒤, 이를 Weight Loss(goal)라는 이름의 새로운 컬럼에 저장합니다
for_vip["Weight Loss(goal)"] = for_vip["Initial Weight"] - for_vip["Target Weight"]
# 비슷하게 Initial Weight와 Lowest Weight를 뺀 뒤, 이를 Weight Loss(current)라는 이름의 새로운 컬럼에 저장합니다
for_vip["Weight Loss(current)"] = for_vip["Initial Weight"] - for_vip["Lowest Weight"]
# BMI수치를 계산합니다. 미터(m)로 기록된 키를 제곱한 뒤 이 값으로 Initial Weight를 나눕니다
for_vip["BMI"] = for_vip["Initial Weight"] / (for_vip["Height(m)(clean)"] ** 2)
# for_vip 변수에 할당된 데이터의 행렬(row, column) 사이즈를 출력합니다
print(for_vip.shape)
# Weight Loss(goal), Weight Loss(current), BMI 컬럼의 상위 5개를 띄웁니다
for_vip[["Name", "Weight Loss(goal)", "Weight Loss(current)", "BMI"]].head()
컬럼들이 잘 생성 되었습니다.
이번에는 for_vip를 사용하여 잘못된 정보를 기입한 사용자(invalid user)를 아래 조건에 따라 찾아보겠습니다.
다음의 정보를 기입한 사용자는 잘못된 정보를 기입한 사용자라고 간주하며, Invalid라는 새로운 컬럼에 True 값을 집어넣습니다. (정 반대의 경우에는 False로 집어넣습니다)
- 필수 (다음의 조건을 만족하지 않으면 Invalid값에는 언제나 False가 들어갑니다)
1. 눔의 프로그램을 결제한 구매자. (Status == "completed")
- 옵션 (다음의 조건 중 하나라도 만족할 경우 Invalid값에 True가 들어가야 합니다)
1. 나이(Age(clean)), 키(Height(clean))와 몸무게(Initial Weight, Lowest Weight, Target Weight) 중 어느 하나라도 NaN이 들어가 있는 경우.
2. 키를 너무 작게 기입했거나(140cm 미만)나, 정 반대로 너무 크게(200cm 초과) 기입한 사용자.
3. BMI수치가 너무 낮거나(18.5 미만) 너무 높은 사용자. (30.0 초과)
4. 목표 감량치(Weight Loss(goal))가 마이너스인 경우. (보통 현재 체중보다 목표 체중을 낮게 설정합니다)
여기서 눔의 프로그램을 결제한 구매자에 한해서만 invalid 여부를 구한다는 사실에 주의해주세요.
def find_invalid_user(for_vips):
status = for_vips["Status"] # Status 컬럼 변수화
age = for_vips["Age(clean)"] # Age(clean) 컬럼 변수화
height = for_vips["Height(clean)"] # Height(clean) 컬럼 변수화
initial_weight = for_vips["Initial Weight"] # Initial Weight 컬럼 변수화
lowest_weight = for_vips["Lowest Weight"] # Lowest Weight 컬럼 변수화
target_weight = for_vips["Target Weight"] # Target Weight 컬럼 변수화
bmi = for_vips["BMI"] # BMI 컬럼 변수화
weight_loss = for_vips["Weight Loss(goal)"] # Weight Loss(goal) 컬럼 변수화
if status != "completed": # 만약 사용자의 상태가 completed 가 아니라면
return False # False를 반환
if pd.isnull(age) or pd.isnull(height): # 만약 age와 height에 Nan이 들어가 있으면
return True # True 반환
if pd.isnull(initial_weight) or pd.isnull(lowest_weight)\
or pd.isnull(target_weight):
# 만약 이들중에 Nan이 들어가 있으면
return True # True를 반환
if height < 140 or height > 200: # 만약 키가 140 미만이거나 200 초과라면
return True # True 반환
if bmi < 18.5 or bmi > 30: # 만약 BMI수치가 18.5 미만 혹은 30.0 초과라면
return True # True 반환
if weight_loss < 0: # 목표 감량치가 0 미만이라면
return True # True 반환
return False # 이 모든 조건에 해당이 안될경우 False 반환
# 위 조건식을 바탕으로 find_invalid_user 함수를 Invalid컬럼에 적용
for_vip["Invalid"] = for_vip.apply(find_invalid_user, axis=1)
# Invalid 컬럼의 True값만 invalid_user변수에 할당
invalid_user = for_vip[for_vip["Invalid"]]
# invalid_user 변수에 할당된 데이터의 행렬 사이즈를 출력
print(invalid_user.shape)
# invalid_user 상위 5개 데이터 출력
invalid_user.head()
결과가 잘 출력 되었습니다.
이번에는 VIP 사용자를 찾아보겠습니다. 다음의 조건에 해당하는 사람은 눔 코치의 VIP 고객으로 간주하며, VIP라는 이름의 새로운 컬럼에 True 값을 집어넣습니다. (정 반대의 경우 False로 집어넣습니다) 다음의 조건을 모두 만족할 경우 VIP고객이라고 간주할 수 있습니다.
1.눔의 프로그램을 결제한 구매자. (Status == "completed")
2.목표 감량치(Weight Loss(goal)), 최종 감량치(Weight Loss(current)), BMI 수치 모두 NaN이 아닌 값이 들어가 있는 사용자.
3.최종 감량치(Weight Loss(current))가 10kg 이상.
4.BMI 수치가 높은 사용자. (30.0 이상)
5.최종 감량치(Weight Loss(current))가 목표 감량치(Weight Loss(goal))보다 큰 경우. (다이어트에 성공한 사람)
def find_vip_users(for_vips):
status = for_vips["Status"] # Status 컬럼 변수화
weight_loss_goal = for_vips["Weight Loss(goal)"] # Height(clean) 컬럼 변수화
weight_loss_current = for_vips["Weight Loss(current)"] # Initial Weight 컬럼 변수화
bmi = for_vips["BMI"] # BMI 컬럼 변수화
if status != "completed": # 만약 사용자의 상태가 completed가 아니라면
return False # False 반환
if pd.isnull(bmi) or pd.isnull(weight_loss_current)\
or pd.isnull(weight_loss_goal): # 만약 이들중에 Nan이 들어가 있지 않으면
return False # False 반환
if weight_loss_current < 10: # 만약 최종 감량치가 10kg 미만이면
return False # False 반환
elif bmi < 30: # 만약 BMI수치가 30.0 미만이면
return False # False 반환
elif weight_loss_current < weight_loss_goal: # 최종 감량치가 목표 감량치보다 작으면
return False # False 반환
return True # 이 모든 조건에 해당이 안될경우 True 반환
# 위 조건식을 바탕으로 find_vip_users 함수를 VIP컬럼에 적용
for_vip["VIP"] = for_vip.apply(find_vip_users, axis=1)
# VIP 컬럼의 True값만 vip_users변수에 할당
vip_users = for_vip[for_vip["VIP"]]
# vip_users 변수에 할당된 데이터의 행렬 사이즈를 출력
print(vip_users.shape)
# vip_users 상위 5개 데이터 출력
vip_users.head()
결과가 잘 나왔습니다.
다음 페이지에서는 본 환경을 이어서 분석을 진행하도록 하겠습니다.
*** 본 페이지는 본인의 공부를 위해 작성되었으며, 협찬이나 문의를 받고 기재한 내용이 아닙니다. 혹시 문의사항이 있으시거나 문제가 될 경우 연락 주시기 바랍니다.***
'데이터 분석 > Python - 정리하자' 카테고리의 다른 글
전환율(conversion) 구해보기 (+시각화) (0) | 2024.07.08 |
---|---|
결제 / 캔슬 / 환불의 총 인원 수와 비율 구해보기 (2) | 2024.07.07 |
건강관리 현업 데이터로 전처리 (0) | 2024.07.06 |
건강관리 현업 데이터로 인덱싱 (0) | 2024.07.06 |
정리된 데이터 병합해보기 (0) | 2024.07.05 |