Search

데이터분석-월요일

상태
완료
담당자
날짜
주제
0
우선 고민점이었던 적은표본 데이터에 관련해서 문의드림.
명수를 적시하기보단 비율적으로 데이터 해석 풀어낼 것.
정확한 숫자(명수)를 언급하지 않고,
비율·비중·상대적 변화 위주
-목적 및 분류
궁극적 목표: 이탈률 낮추기, 착용률 높이기
< 운동 기준을 어떻게 바꿀까? >
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