본문 바로가기
서비스 기획/☁️ 데이터 분석 공부

인당 1일 평균 영상 시청 시간 구하기 (Python)

by 림뽀 2022. 8. 26.
반응형

드디어 데이터 분석 공부했던 것을 실무에 써먹을 때가 왔다!

영상 시청 앱의 인당 1일 평균 체류시간을 구하기 위한 Python 코드를 정리했다.

평균 체류 시간은 일일 콘텐츠 시청 duration의 합으로 구했다.

 

1) 메인 코드

For문으로 DataFrame 채우기

- 각 날짜의 콘텐츠 시청 duration의 평균을 구할 수 있다.

- .mean()과 .median()으로 평균값과 중간값을 구했다.

 

import pandas as pd

#데이터
df = pd.DataFrame({'date':[20220801, 20220801, 20220801,20220802,20220802,20220802],
                             'duration':[10,20,30,40,50,60]})

#df3: 새로운 DF 만들기
df3 = pd.DataFrame()

#각 날짜별 평균 duration 구하기
for dt in df['date'].unique():
    df2 = df[df['date']==dt] #df2: 날짜별 df 따로 만들기
    df3 = df3.append(pd.DataFrame([[dt, df2['duration'].mean()]], #df3에 계산한 데이터 채워넣기
                                columns=['date', 'duration']))
    
df3

 

<결과>

 

 

Outlier를 제외한 데이터만 가져오기

- outlier가 많으면 평균값이 전체 데이터를 대표한다고 보기 어렵다.

- outlier를 제거하고 평균을 구했다.

 

import pandas as pd

#데이터
df = pd.DataFrame({'date':[20220801, 20220801, 20220801,20220801,20220801,
                           20220802,20220802,20220802,20220802,20220802],
                    'duration':[10,20,30,40,500,50,60,70,80,500]})

#df_result: 새로운 df 만들기
df_result = pd.DataFrame()

#각 날짜별 평균 duration 구하기
for dt in df['date'].unique():
    
    #df2: 날짜별 df 따로 만들기
    df2 = df[df['date']==dt] 
    
    #outlier가 없는 조건 만들기
    q1 = df2['duration'].quantile(0.25)
    q3 = df2['duration'].quantile(0.75)
    iqr = q3-q1
    no_outlier_cond = (df2['duration'] > q1-1.5*iqr) & (df2['duration'] < q3 + 1.5*iqr)
    
    #df3 = outlier 제거한 df 생성
    df3 = df2[no_outlier_cond]
    
    #df_result에 계산한 데이터 채워넣기
    df_result = df_result.append(pd.DataFrame([[dt, df3['duration'].mean()]], 
                                columns=['date', 'duration']))
    
    
df_result

 

<결과> 500이 outlier로 분류되어, 500을 제외한 값들의 평균이 구해졌다.

 

 

pd.qcut으로 데이터를 10분할하기

- 각 날짜별로 하위 10%, 20%, ... , 90%의 사용자는 몇 초까지 시청했을까?

- 각 날짜의 사용자별 시청 duration 합계를 qcut으로 10분할 하고 모든 날짜의 평균을 구하자.

 

import pandas as pd

#데이터
df = pd.DataFrame({'date':[20220801, 20220801, 20220801,20220801,20220801,
                           20220802,20220802,20220802,20220802,20220802],
                    'duration':[10,20,30,40,500,50,60,70,80,500]})

#df_result: 새로운 df 만들기
df_result = pd.DataFrame()

#각 날짜별 평균 duration 구하기
for dt in df['date'].unique():
    
    #df2: 날짜별 df 따로 만들기
    df2 = df[df['date']==dt] 
    
    #outlier가 없는 조건 만들기
    q1 = df2['duration'].quantile(0.25)
    q3 = df2['duration'].quantile(0.75)
    iqr = q3-q1
    no_outlier_cond = (df2['duration'] > q1-1.5*iqr) & (df2['duration'] < q3 + 1.5*iqr)
    
    #df3 = outlier 제거한 df 생성
    df3 = df2[no_outlier_cond]
    
    #qcut이 각 구간에 속한 데이터의 개수를 최대한 맞춰서 분할해준다. 
    #분할하고 싶은 구간의 수를 qcut 두 번째 조건에 쓰기.
    print(dt,"\n",pd.qcut(df3['duration'],3).value_counts().sort_index())
 
    #각 날짜의 두 번째 구간의 마지막 숫자를 알고 싶을때 아래와 같이 쓰면 된다.
    print(dt,"\n",pd.qcut(df3['duration'],3).value_counts().sort_index().index.tolist()[1].right)

 

<결과>

 

모든 날짜의 평균을 구하는 코드를 추가했다.

 

import pandas as pd

#데이터
df = pd.DataFrame({'date':[20220801, 20220801, 20220801,20220801,20220801,
                           20220802,20220802,20220802,20220802,20220802],
                    'duration':[10,20,30,40,500,50,60,70,80,500]})

#df_result: 새로운 df 만들기
df_result = pd.DataFrame()

#각 날짜별 평균 duration 구하기
for dt in df['date'].unique():
    
    #df2: 날짜별 df 따로 만들기
    df2 = df[df['date']==dt] 
    
    #outlier가 없는 조건 만들기
    q1 = df2['duration'].quantile(0.25)
    q3 = df2['duration'].quantile(0.75)
    iqr = q3-q1
    no_outlier_cond = (df2['duration'] > q1-1.5*iqr) & (df2['duration'] < q3 + 1.5*iqr)
    
    #df3 = outlier 제거한 df 생성
    df3 = df2[no_outlier_cond]
    
    
    #모든 날짜의 각 df의 두 번째 구간의 마지막 숫자의 평균 구하기
    df_result = df_result.append(pd.DataFrame([[dt, 
                                               pd.qcut(df3['duration'],3).value_counts().sort_index().index.tolist()[1].right]], 
                                columns=['date', 'duration']))

print(round(df_result['duration'].mean()))

 

<결과> 50

 

2) 그 외 도움을 준 코드 조각들

interval의 오른쪽 숫자만 가져오기

iv = pd.Interval(left=0, right=5)
print(iv)
print(iv.right)

<결과>

 

value_counts를 리스트로 만들기 (index 혹은 values)

df[column].value_counts()

# get indexes
df[column].value_counts().index.tolist()

# get values of occurrences
df[column].value_counts().values.tolist()

 

초를 시간으로 계산하기 (hh:mm:ss)

import datetime

def seconds_to_time(seconds):
   # hh:mm:ss으로 형태 변경
   return str(datetime.timedelta(seconds=round(seconds)))

 


Python 코드 출처

- 초를 시간으로 계산하기 (hh:mm:ss): https://nomalcy.tistory.com/278

- For문으로 DataFrame 채우기: https://shydev.tistory.com/29

- pd.quct 설명: https://kimdingko-world.tistory.com/209

- pd.quct ValueError 해결 방법: https://medium.datadriveninvestor.com/valueerror-bin-edges-must-be-unique-71512ff2257d

 

 

데이터 분석 방법 관련 참고한 글

 

초기 스타트업의 모바일앱 지표 분석 방법론

문돌이 PM의 마케터 따라하기 시리즈 | 지난번 초보 PM이 알아야 하는 초기 모바일앱 분석 101글에서 앱을 런칭한지 얼마 안된 극초기 단계의 스타트업에서 어떤 앱 운영 지표들이 필요한지에 대

brunch.co.kr

 

 

마케팅 KPI 완전 정복: 데이터의 바다에서 살아남기

10년차 마케터가 알려주는, 실패하지 않는 KPI란? / KPI만 세우면 만사 OK? 서비스를 망치는 '가짜 KPI'도 있다

publy.co

 

오늘의 글 썸네일

반응형

댓글