[Python] MAU(Monthly Active Users) 계산 방법

2025. 8. 10. 20:14·개발 (Development)/Python

이번 글에서는 텍스트 파일 형태의 사용자 접속 로그를 활용하여 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 계산은 다음 단계로 진행합니다.

  1. 데이터 불러오기
    텍스트 파일(.txt)을 pandas로 읽어옵니다. 구분자는 |입니다.
  2. 컬럼 및 데이터 전처리
    • 컬럼 이름과 데이터 값에서 불필요한 공백 제거
    • event_time 컬럼의 결측값(NaN) 제거
    • 날짜 형식 변환 시 잘못된 값은 NaT로 변환 후 제거
  3. 고유 사용자 식별자 생성
    • 동일한 user라도 ip가 다르면 별도의 사용자로 간주할 수 있습니다.
    • 이를 위해 user + ip를 합친 새로운 식별자를 생성합니다.
  4. 월 단위 추출
    • event_time에서 연-월(YYYY-MM) 형태로 추출하여 그룹화에 활용합니다.
  5. 월별 고유 사용자 수 집계
    • 월별로 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
'개발 (Development)/Python' 카테고리의 다른 글
  • [Python/Docker] Python Docker 이미지에서 취약점 제거하기 (python:3.9.12-slim 기반)
  • [Python] 문자열 각 단어의 첫 글자를 대문자로 만드는 방법
  • [Python] 폴더 내 CSV 형식 로그 파일 시각화하기
  • [Python] requests 요청 후 기다리는 로직과 타임아웃 설정
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (216) N
      • 개발 (Development) (151) N
        • Algorithm (1)
        • Angular (1)
        • AWS (4)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (30)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (6)
        • PostgreSQL (37) N
        • Python (26)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (10)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (10)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DevOps
    PostgreSQL
    springboot
    timescaledb
    백준알고리즘
    javascript
    Linux master
    백준온라인저지
    typescript
    JPA
    pandas
    Kafka
    오답노트
    Linux
    리눅스 마스터 2급 2차
    JSON
    리눅스 마스터 2급
    ADsP
    AWS
    백준자바
    MyBatis
    java
    Vue.js
    Kubernetes
    docker
    데이터분석
    python
    deepseek
    자바
    백준
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Python] MAU(Monthly Active Users) 계산 방법
상단으로

티스토리툴바