이 튜토리얼에서는 파이썬의 pandas 패키지를 활용해 모바일 데이터 속도를 분석하는 방법을 단계별로 살펴봅니다. 분석에 사용할 데이터는 인도 통신 규제 기관인 TRAI(Telecom Regulatory Authority of India) 공식 웹사이트에서 무료로 내려받을 수 있습니다.
1. 데이터 준비
TRAI 웹사이트에서 모바일 속도 데이터를 내려받는 절차는 다음과 같습니다.
- TRAI MySpeed 웹사이트에 접속합니다.
- 페이지 맨 아래까지 스크롤합니다.
- 월별로 제공되는 모바일 속도 데이터 목록을 확인할 수 있습니다.
- 9월(september) 모바일 데이터 속도 파일(CSV)을 내려받습니다.
CSV 파일의 주요 컬럼
- Network Name – 이동통신 사업자 이름
- Network Technology – 네트워크 기술(3G/4G 등)
- Type Of Test – 테스트 유형(다운로드/업로드)
- Speed – 측정된 속도(Kbps)
- Signal Strength – 신호 강도
- State – 측정 지역(주)
이번 분석에는 pandas, numpy, matplotlib 세 가지 라이브러리가 필요합니다. 이제 본격적으로 코드를 작성해 보겠습니다.
2. 데이터셋 불러오기 및 탐색
# 필요한 라이브러리 임포트
import pandas as pd
import numpy as np
import matplotlib.pyplot as plot
# 상수 정의
DATASET = 'sept19_publish.csv'
NETWORK_NAME = 'JIO'
STATE = 'Andhra Pradesh'
# 값을 저장할 리스트 초기화
download_speeds = []
upload_speeds = []
states = []
operators = []
# pandas로 데이터셋 불러오기
data_frame = pd.read_csv(DATASET)
# 컬럼 이름을 지정해 접근성 향상
data_frame.columns = ['Network', 'Technology', 'Type Of Test',
'Speed', 'Signal Strength', 'State']
# 고유한 주와 사업자 목록 추출
unique_states = data_frame['State'].unique()
unique_operators = data_frame['Network'].unique()
print(unique_states)
print()
print(unique_operators)
실행 결과
['Kolkata' 'Punjab' 'Delhi' 'UP West' 'Haryana' nan 'West Bengal' 'Tamil Nadu' 'Kerala' 'Rajasthan' 'Gujarat' 'Maharashtra' 'Chennai' 'Madhya Pradesh' 'UP East' 'Karnataka' 'Orissa' 'Andhra Pradesh' 'Bihar' 'Mumbai' 'North East' 'Himachal Pradesh' 'Assam' 'Jammu & Kashmir'] ['JIO' 'AIRTEL' 'VODAFONE' 'IDEA' 'CELLONE' 'DOLPHIN']
데이터셋에는 24개 지역과 6개 사업자(JIO, AIRTEL, VODAFONE, IDEA, CELLONE, DOLPHIN)의 데이터가 포함되어 있으며, 일부 행은 지역 정보가 누락된 것(nan)을 확인할 수 있습니다.
3. 특정 사업자의 주별 평균 속도 계산
이제 앞서 선언한 NETWORK_NAME(JIO)에 해당하는 데이터만 필터링한 뒤, 각 주별로 다운로드·업로드 평균 속도를 계산합니다.
# 분석 대상 네트워크(JIO) 데이터만 필터링
JIO = data_frame[data_frame['Network'] == NETWORK_NAME]
# 모든 주를 순회하며 처리
for state in unique_states:
# 현재 주의 전체 데이터 추출
current_state = JIO[JIO['State'] == state]
# 다운로드 테스트 결과만 추출
download_speed = current_state[current_state['Type Of Test'] == 'download']
# 다운로드 평균 계산
download_speed_avg = download_speed['Speed'].mean()
# 업로드 테스트 결과만 추출
upload_speed = current_state[current_state['Type Of Test'] == 'upload']
# 업로드 평균 계산
upload_speed_avg = upload_speed['Speed'].mean()
# 평균값이 NaN인지 확인
if pd.isnull(download_speed_avg) or pd.isnull(upload_speed_avg):
# NaN이면 두 평균을 0으로 설정
download_speed_avg, upload_speed_avg = 0, 0
else:
# 값이 유효할 때만 그래프용 리스트에 주 추가
states.append(state)
download_speeds.append(download_speed_avg)
upload_speeds.append(upload_speed_avg)
# 주별 다운로드·업로드 평균 출력
print(f'{state}: Download Avg. {download_speed_avg:.3f} '
f'Upload Avg. {upload_speed_avg:.3f}')
실행 결과
Kolkata: Download Avg. 31179.157 Upload Avg. 5597.086 Punjab: Download Avg. 29289.594 Upload Avg. 5848.015 Delhi: Download Avg. 28956.174 Upload Avg. 5340.927 UP West: Download Avg. 21666.673 Upload Avg. 4118.200 Haryana: Download Avg. 6226.855 Upload Avg. 2372.987 West Bengal: Download Avg. 20457.976 Upload Avg. 4219.467 Tamil Nadu: Download Avg. 24029.364 Upload Avg. 4269.765 Kerala: Download Avg. 10735.611 Upload Avg. 2088.881 Rajasthan: Download Avg. 26718.066 Upload Avg. 5800.989 Gujarat: Download Avg. 16483.987 Upload Avg. 3414.485 Maharashtra: Download Avg. 20615.311 Upload Avg. 4033.843 Chennai: Download Avg. 6244.756 Upload Avg. 2271.318 Madhya Pradesh: Download Avg. 15757.381 Upload Avg. 3859.596 UP East: Download Avg. 28827.914 Upload Avg. 5363.082 Karnataka: Download Avg. 10257.426 Upload Avg. 2584.806 Orissa: Download Avg. 32820.872 Upload Avg. 5258.215 Andhra Pradesh: Download Avg. 8260.547 Upload Avg. 2390.845 Bihar: Download Avg. 9657.874 Upload Avg. 3197.166 Mumbai: Download Avg. 9984.954 Upload Avg. 3484.052 North East: Download Avg. 4472.731 Upload Avg. 2356.284 Himachal Pradesh: Download Avg. 6985.774 Upload Avg. 3970.431 Assam: Download Avg. 4343.987 Upload Avg. 2237.143 Jammu & Kashmir: Download Avg. 1665.425 Upload Avg. 802.925
결과를 보면 오디샤(Orissa)와 콜카타(Kolkata)의 다운로드 평균 속도가 약 31,000~32,800Kbps로 가장 빠른 반면, 잠무&카슈미르(Jammu & Kashmir)는 약 1,665Kbps로 가장 느린 것을 확인할 수 있습니다.
4. 막대그래프로 시각화하기
# 그래프 생성
fig, axes = plot.subplots()
# 막대 너비 설정
bar_width = 0.25
# x축 위치 배열 생성
re_states = np.arange(len(states))
# 그래프 크기 설정
plot.figure(num=None, figsize=(12, 5))
# 다운로드 평균 속도 막대그래프
plot.bar(re_states, download_speeds, bar_width,
color='g', label='Avg. Download Speed')
# 업로드 평균 속도 막대그래프
plot.bar(re_states + bar_width, upload_speeds, bar_width,
color='b', label='Avg. Upload Speed')
# 그래프 제목
plot.title('Avg. Download|Upload Speed for ' + NETWORK_NAME)
# x축 라벨
plot.xlabel('States')
# y축 라벨
plot.ylabel('Average Speeds in Kbps')
# 각 막대 아래에 해당 주 이름 표시
plot.xticks(re_states + bar_width, states, rotation=90)
# 범례 표시
plot.legend()
# 레이아웃을 타이트하게 조정
plot.tight_layout()
# 그래프 출력
plot.show()
실행 결과
위 코드를 실행하면 JIO의 주별 평균 다운로드·업로드 속도를 한눈에 비교할 수 있는 막대그래프가 출력됩니다.

마무리
지금까지 TRAI의 공개 데이터를 활용해 특정 사업자(JIO)의 주별 모바일 데이터 속도를 분석하고 시각화하는 과정을 살펴보았습니다. 같은 방법으로 다른 사업자나 다른 월의 데이터를 비교하거나, 네트워크 기술(3G/4G)별로 구분해 분석하는 등 다양한 그래프를 그려볼 수 있습니다. 데이터셋을 자유롭게 다루면서 여러분만의 인사이트를 찾아보세요. 튜토리얼 진행 중 궁금한 점이 있다면 댓글로 남겨주세요.