드디어 데이터 분석 공부했던 것을 실무에 써먹을 때가 왔다!
영상 시청 앱의 인당 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
데이터 분석 방법 관련 참고한 글
'서비스 기획 > ☁️ 데이터 분석 공부' 카테고리의 다른 글
[췻쉿] DataFrame으로 모든 데이터 모으는 방법 (0) | 2022.12.24 |
---|---|
주니어 PM의 데이터 분석 학습기 (0) | 2022.08.31 |
영등위 API에서 등급정보 자동으로 불러오기 (0) | 2022.07.30 |
[코드잇] 데이터 사이언스 입문 수강 완료! (0) | 2022.07.18 |
[코드잇] 2. 데이터 분석과 시각화: 타이타닉 EDA 퀴즈 (0) | 2022.07.14 |
댓글