Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python) Pandas로 TRAI 모바일 데이터 속도 분석하기

이 튜토리얼에서는 파이썬의 pandas 패키지를 활용해 모바일 데이터 속도를 분석하는 방법을 단계별로 살펴봅니다. 분석에 사용할 데이터는 인도 통신 규제 기관인 TRAI(Telecom Regulatory Authority of India) 공식 웹사이트에서 무료로 내려받을 수 있습니다.

1. 데이터 준비

TRAI 웹사이트에서 모바일 속도 데이터를 내려받는 절차는 다음과 같습니다.

  1. TRAI MySpeed 웹사이트에 접속합니다.
  2. 페이지 맨 아래까지 스크롤합니다.
  3. 월별로 제공되는 모바일 속도 데이터 목록을 확인할 수 있습니다.
  4. 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의 주별 평균 다운로드·업로드 속도를 한눈에 비교할 수 있는 막대그래프가 출력됩니다.

파이썬(Python) Pandas로 TRAI 모바일 데이터 속도 분석하기

마무리

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