이번 글에서는 텍스트 파일 형태의 사용자 접속 로그를 활용하여 MAU(Monthly Active Users) 를 계산하는 방법을 소개합니다.
MAU는 한 달 동안 한 번이라도 활동한 고유 사용자 수를 의미하며, 서비스 이용 현황을 파악하는 데 중요한 지표입니다.
1. 데이터 확인
저는 다음과 같이 user
, ip
, event_time
세 컬럼을 가진 로그 파일을 준비했습니다.
IP는 보안상 위험이 있을 수 있으므로, 아래 예시에서는 임의의 비공개 대역 IP(192.168.x.x
)로 대체하였습니다.
user | ip | event_time |
---|---|---|
admin | 192.168.0.10 | 2023-11-08 01:02:17.883 |
guest | 192.168.0.10 | 2023-11-08 01:04:47.914 |
admin | 192.168.0.11 | 2023-11-08 05:27:19.146 |
... | ... | ... |
event_time
은 사용자 활동 시각을 나타내며, 이를 기반으로 월별 고유 사용자 수를 계산할 수 있습니다.
2. MAU 계산 로직
MAU 계산은 다음 단계로 진행합니다.
- 데이터 불러오기
텍스트 파일(.txt
)을 pandas로 읽어옵니다. 구분자는|
입니다. - 컬럼 및 데이터 전처리
- 컬럼 이름과 데이터 값에서 불필요한 공백 제거
event_time
컬럼의 결측값(NaN
) 제거- 날짜 형식 변환 시 잘못된 값은
NaT
로 변환 후 제거
- 고유 사용자 식별자 생성
- 동일한
user
라도ip
가 다르면 별도의 사용자로 간주할 수 있습니다. - 이를 위해
user + ip
를 합친 새로운 식별자를 생성합니다.
- 동일한
- 월 단위 추출
event_time
에서 연-월(YYYY-MM
) 형태로 추출하여 그룹화에 활용합니다.
- 월별 고유 사용자 수 집계
- 월별로
user_ip
의 고유 개수를 세어 MAU를 구합니다.
- 월별로
3. Python 코드 예시
import pandas as pd
# 1. 데이터 읽기
df = pd.read_csv("mad_query_result.txt", sep="|")
df.columns = [col.strip() for col in df.columns]
# 2. 공백 제거
df['user'] = df['user'].str.strip()
df['ip'] = df['ip'].str.strip()
df['event_time'] = df['event_time'].str.strip()
# 3. 결측값 제거
df = df.dropna(subset=['user', 'ip', 'event_time'])
# 4. 날짜 형식 변환
df['event_time'] = pd.to_datetime(df['event_time'], errors='coerce')
df = df.dropna(subset=['event_time'])
# 5. 고유 사용자 식별자 생성
df['user_ip'] = df['user'] + "_" + df['ip']
# 6. 월 단위 추출
df['month'] = df['event_time'].dt.to_period('M')
# 7. 월별 MAU 계산
mau = df.groupby('month')['user_ip'].nunique().reset_index()
mau.columns = ['month', 'MAU']
print(mau)
4. 실행 결과 예시
month | MAU |
---|---|
2023-11 | 3 |
위 예시에서는 2023년 11월 한 달 동안 총 3명의 고유 사용자가 활동했음을 알 수 있습니다.
5. 정리
- MAU는 월간 서비스 활성도를 직관적으로 보여주는 지표입니다.
user
와ip
조합으로 고유 사용자를 판별하면 보다 정확한 통계가 가능합니다.- 결측값과 잘못된 날짜 데이터는 반드시 제거해야 신뢰할 수 있는 결과를 얻을 수 있습니다.
- pandas를 활용하면 텍스트 로그 파일에서도 손쉽게 MAU를 계산할 수 있습니다.
반응형
'개발 (Development) > Python' 카테고리의 다른 글
[Python/Docker] Python Docker 이미지에서 취약점 제거하기 (python:3.9.12-slim 기반) (0) | 2025.08.03 |
---|---|
[Python] 문자열 각 단어의 첫 글자를 대문자로 만드는 방법 (0) | 2025.08.03 |
[Python] 폴더 내 CSV 형식 로그 파일 시각화하기 (3) | 2025.07.28 |
[Python] requests 요청 후 기다리는 로직과 타임아웃 설정 (0) | 2025.07.28 |
[Python] 문자열 2줄 이상인지 확인하는 방법 (0) | 2025.07.28 |