우선 고민점이었던 적은표본 데이터에 관련해서 문의드림.
명수를 적시하기보단 비율적으로 데이터 해석 풀어낼 것.
•
정확한 숫자(명수)를 언급하지 않고,
•
비율·비중·상대적 변화 위주
-목적 및 분류
궁극적 목표:
이탈률 낮추기, 착용률 높이기
< 운동 기준을 어떻게 바꿀까? >
1.
마니아층: 주 3회 이상 MVPA -> 얘네는 거의 착용함
다른 사람과의 챌린지 자극
2.
중간층: 모든 강도 활동량 기준 (걷기/요가/필라테스) -> 여기가 문제
어제의 나와 비교
3.
헤이터층: -> 얘네는 거의 착용 안 함
< New New 분류 기준 >
하드코어 유저 ( 격렬 + 중등 = MVPA )
매주 총 MVPA >= 300분 달성 주차가 전체 참여 주차의 100% 이상
일반유저 Insufficiently Active ( 격렬 + 중등 = MVPA )
•
관심 (할랑말랑) : MVPA 1-149분 사이의 활동이 주 2회 이상 달성 주차가 전체 참여 주차의 100% ( 미국 CDC 기준 )
•
무관심: 나머지
x축: 주당 MVPA 시간
아이디
중간의 갭을 시각화 하는 그래프 넣어보기
< New 분류 기준 >
하드코어 유저: ( 격렬 + 중등 = MVPA )
매주 총 MVPA >= 300분 달성 주차가 전체 참여 주차의 (50% / 60% / 70% / 80% / 90% / 100%) 이상
일반유저 ( 격렬 + 중등 + 가벼운 = 총활동시간 )
•
관심: [ 매주 고강도 75분 이상 and 주 2회 이상 ] or [ 매주 중간 강도 150분 이상 and 주 2회 이상 ]
◦
달성 주차가 전체 참여 주차의 (50% / 60% / 70% / 80% / 90% / 100%) 이상
•
무관심: 나머지
< 분류 기준 >
하드코어 유저: (격렬+중등 = MVPA)
주3회 MVPA >= 30분 달성 주차가 전체 참여 주차의 70% 이상
일반유저 ( 격렬 + 중등 + 가벼운 = 총활동시간 )
- 관심: 주3회 >= 60분 달성 주차가 전체 참여 주차의 70% 이상
- 무관심: 나머지
-코드 공유 및 결과 도출
조재민
김영호
김나희
산출 방법.
1.사용자 별 총 실험 일자
2.총 일수≥28일 이상 데이터 추출
3. 실험일자/7→실험 주 수 추출 (내림)
-마니아층 산출
4.VeryActiveMinutes+FairlyActiveMinutes 일 단위 ≥30분 이상 계산
4-1.주차 별 30분 이상 충족 횟수 계산 (조건)7일*70% 충족 = 3일 이상. →성공 주차 수
4-2.id별 총 성공주차수/실험주차수 ⇒70% 이상 충족 되는 집단.
-중간/하위층 산출
5.위에서 마니아층을 배제 시킨 후
6. Very + Fairly + Lightly Active Minutes 일단위≥60분 이상 계산
6-1.주차 별1시간 이상 충족 횟수 계산 (조건)3일 이상 충족 →성공 주차 수
6-2.id별 총 성공주차수/실험주차수⇒70% 이상 이라고 충족 되는 집단: 중간 운동 집단
그 外:하위 운동 집단
마니아층
import pandas as pd
0) df1 + df2 병합
df = pd.concat([df1, df2], ignore_index=True)
날짜변환
df['ActivityDate'] = pd.to_datetime(df['ActivityDate'])
1) 사용자별 시작일자~종료일자 및 총 사용일
user_period = (
df.groupby('Id')
.agg(
start_date=('ActivityDate', 'min'),
end_date=('ActivityDate', 'max')
)
.reset_index()
)
총일수 계산
user_period['total_days'] = (user_period['end_date'] - user_period['start_date']).dt.days + 1
2) 28일 이상 사용자만 추출 → df_valid 생성
valid_users = user_period[user_period['total_days'] >= 28]['Id']
df_valid = df[df['Id'].isin(valid_users)].copy()
사용자별 시작일 재계산
df_valid['start_date'] = df_valid.groupby('Id')['ActivityDate'].transform('min')
주차 계산
df_valid['day_offset'] = (df_valid['ActivityDate'] - df_valid['start_date']).dt.days
df_valid['week_no'] = (df_valid['day_offset'] // 7) + 1
3) 일단위 운동 30분 이상 여부 계산
df_valid['Active30'] = df_valid['VeryActiveMinutes'] + df_valid['FairlyActiveMinutes']
df_valid['is_active30'] = df_valid['Active30'] >= 30
3-1) 주단위 총 성공일(≥30분)
weekly_summary = (
df_valid
.groupby(['Id', 'week_no'])
.agg(active_days_30=('is_active30', 'sum'))
.reset_index()
)
성공주 기준 = "3일 이상 충족"
weekly_summary['week_success'] = weekly_summary['active_days_30'] >= 3
4) 사용자별 총 주차/성공 주차
user_weeks = (
weekly_summary
.groupby('Id')
.agg(
total_weeks=('week_no', 'max'),
success_weeks=('week_success', 'sum')
)
.reset_index()
)
성공률 계산
user_weeks['success_rate'] = user_weeks['success_weeks'] / user_weeks['total_weeks']
최종 마니아 집단 분류
user_weeks['segment'] = user_weeks['success_rate'].apply(
lambda x: '마니아 집단' if x >= 0.7 else '일반 집단'
)
user_weeks
중간집단 / 하위집단
1) 사용자별 기간 계산
user_period = (
df.groupby('Id')
.agg(start_date=('ActivityDate', 'min'),
end_date=('ActivityDate', 'max'))
.reset_index()
)
user_period['total_days'] = (user_period['end_date'] - user_period['start_date']).dt.days + 1
28일 이상 사용자만
valid_users = user_period[user_period['total_days'] >= 28]['Id']
df_valid = df[df['Id'].isin(valid_users)].copy()
df_valid['start_date'] = df_valid.groupby('Id')['ActivityDate'].transform('min')
주차 계산
df_valid['day_offset'] = (df_valid['ActivityDate'] - df_valid['start_date']).dt.days
df_valid['week_no'] = (df_valid['day_offset'] // 7) + 1
2) (마니아/일반 분류 기준) 일 단위 ≥30분
----------------------------------------------------------
df_valid['Active30'] = df_valid['VeryActiveMinutes'] + df_valid['FairlyActiveMinutes']
df_valid['is_active30'] = df_valid['Active30'] >= 30
weekly30 = (
df_valid.groupby(['Id', 'week_no'])
.agg(active_days_30=('is_active30', 'sum'))
.reset_index()
)
weekly30['week_success'] = weekly30['active_days_30'] >= 3
user_weeks = (
weekly30.groupby('Id')
.agg(total_weeks=('week_no', 'max'),
success_weeks=('week_success', 'sum'))
.reset_index()
)
user_weeks['success_rate'] = user_weeks['success_weeks'] / user_weeks['total_weeks']
user_weeks['segment'] = user_weeks['success_rate'].apply(
lambda x: '마니아 집단' if x >= 0.7 else '일반 집단'
)
----------------------------------------------------------
3) 일반 집단만 추출 → 중간/하위 집단 분석
----------------------------------------------------------
general_ids = user_weeks[user_weeks['segment'] == '일반 집단']['Id']
df_general = df_valid[df_valid['Id'].isin(general_ids)].copy()
----------------------------------------------------------
4) 일 단위 Active60 (60분 이상)
----------------------------------------------------------
df_general['Active60'] = (
df_general['VeryActiveMinutes'] +
df_general['FairlyActiveMinutes'] +
df_general['LightlyActiveMinutes']
)
df_general['is_active60'] = df_general['Active60'] >= 60
----------------------------------------------------------
5) 주차별 60분 이상 활동일수(성공일)
----------------------------------------------------------
weekly60 = (
df_general.groupby(['Id', 'week_no'])
.agg(success_days_60=('is_active60', 'sum'))
.reset_index()
)
주차 성공 기준 = 3일 이상
weekly60['week_success'] = weekly60['success_days_60'] >= 3
----------------------------------------------------------
6) 사용자별 성공주차 계산
----------------------------------------------------------
mid_summary = (
weekly60.groupby('Id')
.agg(
total_weeks=('week_no', 'max'),
success_weeks=('week_success', 'sum')
)
.reset_index()
)
mid_summary['success_rate'] = mid_summary['success_weeks'] / mid_summary['total_weeks']
----------------------------------------------------------
7) 최종 중간/하위 운동 집단 분류
----------------------------------------------------------
mid_summary['mid_segment'] = mid_summary['success_rate'].apply(
lambda x: '중간 운동 집단' if x >= 0.7 else '하위 운동 집단'
)
mid_summary
