PythonのpandasでTRAIのモバイル回線速度データを分析・可視化する方法
このチュートリアルでは、Pythonのpandasパッケージを使って、インド電気通信規制庁(TRAI)が公開しているモバイル回線速度データを分析します。まずはTRAI公式サイトからデータファイルをダウンロードしましょう。
データ取得の手順
1. TRAIの公式サイト(https://myspeed.trai.gov.in/)にアクセスする。 2. ページの一番下までスクロールする。 3. 月別のモバイル速度データが公開されていることを確認する。 4. 9月分のモバイル速度データ(CSV)をダウンロードする。
CSVファイルに含まれる主なカラム
ネットワーク名(通信事業者)
ネットワーク技術(3G / 4Gなど)
テスト種別(ダウンロード / アップロード)
速度
信号強度
州名
本チュートリアルではpandas、numpy、matplotlibの3つのライブラリを使用します。それでは、実際にコードを書いてデータを分析していきましょう。
ステップ1:データの読み込みと概要確認
# 必要なライブラリをインポート 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つの通信事業者が含まれていることが確認できます。
ステップ2:特定の事業者の州別平均速度を集計
# 対象の通信事業者に関するデータのみを抽出
# 事業者名はすでに定数として宣言済み
# ここでデータをフィルタリング
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, upload_speed = 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} 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ではダウンロード平均速度が30,000 Kbpsを超えている一方、Jammu & Kashmirでは約1,665 Kbpsと地域差が非常に大きいことがわかります。
ステップ3:matplotlibで棒グラフを作成
# グラフを描画
fix, axes = plot.subplots()
# 棒の幅を設定
bar_width = 0.25
# 州の位置を並べ替え
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()出力結果(グラフ)
上記のコードを実行すると、州ごとのダウンロード・アップロード平均速度を比較できる棒グラフが生成されます。

まとめ
pandasのフィルタリング機能とgroupby的な集計処理、そしてmatplotlibによる可視化を組み合わせることで、TRAIのオープンデータから通信事業者別・地域別の回線品質を簡単に把握できました。NETWORK_NAMEやSTATEの定数を変更すれば、他の事業者(AIRTEL、VODAFONEなど)や他の月のデータについても同じ流れで分析できます。
ぜひさまざまな切り口でグラフを作成して、データ分析に慣れていきましょう。チュートリアルについて不明な点があれば、コメント欄でお気軽に質問してください。
-
Python・Pandasのquery()メソッドでデータを効率的にフィルタリングする方法
Pandasは、データクレンジングやデータ分析などに幅広く利用されているPythonのライブラリです。本記事では、query()メソッドを使用して、指定したデータセットから条件に合致するデータを抽出する方法を解説します。query()メソッドでは、単一の条件だけでなく、複数の条件を組み合わせた絞り込みも可能です。データの読み込みまず、Pandasライブラリを使ってCSVファイルのデータをDataFrameとして読み込みます。以下のプログラムがその基本的なコードです。サンプルコードimport pandas as pd # CSVファイルからDataFrameを読み込む data = pd.r
-
Pythonによるデータ分析と可視化入門|pandasの基本を徹底解説
Pythonによるデータ分析と可視化の概要 Pythonには、データ分析と可視化のための強力なライブラリが数多く用意されています。代表的なものとしては、NumPy、pandas、matplotlib、seabornなどが挙げられます。本記事では、その中でも中心的な役割を果たすpandasについて詳しく解説します。pandasはNumPyをベースに構築されたオープンソースライブラリで、高速なデータ分析やデータのクリーニング・前処理を効率的に行えます。さらに、pandas自体にも便利な可視化機能が組み込まれています。 pandasのインストール方法 pandasをインストールするには、ターミナル