データ分析試験のヒント「グラフデータ処理」

こんにちは、Pythonエンジニア育成推進協会 顧問理事の寺田です。私は試験の問題策定とコミュニティ連携を行う立場です。

Python3エンジニア認定データ分析実践試験(2024年9月公開)では、時系列データ、テキストデータ、画像データ、グラフデータ、地理空間データの5つのデータの形の取り扱いに関する問題も出題されます。どのデータも、データ分析の世界に身を置いていても関わりがない人にとっては難しいものではありますが、どれも重要なものです。様々なデータの特徴を知り、扱えるようになっていれば、より実践的で、より良いデータ分析を行えるようになりますので、ぜひ身に着けて頂きたい項目です。

解説4回目となる今回は、9章の「グラフデータ」について取り上げます。

※Python 3 エンジニア認定データ分析実践試験

https://www.pythonic-exam.com/cpda

※前回までの解説コラムは以下よりご覧いただけます。

データ分析実践試験のヒント「時系列データ処理」(6章)

データ分析実践試験のヒント「テキストデータ処理」(7章)

データ分析実践試験のヒント「画像データ処理」(8章)

■グラフデータとは何か

さて、データ分析の世界でよく利用されるデータ分析構造には、2次元で表す表形式や、3次元4次元で扱われるものがほとんどです。それ以外には、jsonやxmlでよく利用されるツリー構造があります。

今回取り上げるグラフデータはと言うと、可視化するためのグラフ(円グラフや棒グラフ)などを頭に思い浮かべる人が多いかと思いますが、ここで言うグラフデータとは、モノとモノのつながりを表現する時に利用するデータ構造で、二次元の表形式のデータとは一線を越えたものになります。使ったことが無い、わかりにくいといった声はよく聞かれるものです。

このグラフデータの例としては、飛行機・電車などの経路図や、ソーシャルネットワークサービスなどで利用される友人関係などを、相関的に表したものです。

グラフデータは、データ分析をやっている人であっても、範疇外にしている人が多いと思います。私自身も正直に言えばあまり得意な分野ではありません。とはいえ、グラフデータの形で表現できるようになっていれば、より良いデータ分析ができるようになります。

■Python3エンジニア認定データ分析試験でのグラフデータ出題範囲

グラフデータに関する問題自体は7.5%となっており、出題範囲全体からの比重で考えればそう重くはありませんが、画像データよりは比重が高くなっています。

グラフデータの章では、グラフデータがどういったものなのかを理解することが必要です。

9.1節で解説に使われているグラフ描画ツールはpyvisとNetworkXです。pyvisは試験範囲から除外しており、ここではNetworkXの簡単な使い方を理解しておいて欲しいと考えています。9.2節では、実践的なグラフデータの解析方法が説明されていますが、ここは試験範囲からは除かれています。

■グラフデータの基本

グラフ構造の基本として、ノード(node/別名:頂点vertex、節点)とエッジ(edge/別名:辺、弧arc、リンクlink、枝branch)という言葉があります。

例えば、ソーシャルネットワークサービスにおける友人のつながりで言えば、「人」がノードで、「人と人とのつながりを表す線」がエッジです。線路図で言えば、「駅」がノードで、「線路」がエッジです。

そして、それぞれのノード(人や駅など)がエッジによってつながっている状態を連結している、つながっていない状態を連結ではないと表現されます。

モノとモノのつながりを構造として考えたときに、素直にグラフィカルに表現できるのがグラフ構造です。グラフ構造にすることで、モノとモノがどのようにつながっているのか、交わらないのはどこか、それぞれの距離感はどうか、どれくらいの数のノードがつながっているのか、などの情報を簡単に表すことができます。

■Pythonライブラリ「NetworkX」によるグラフデータ化

こういったグラフ構造を表す際、Pythonではデファクトスタンダードなツールである「NetworkX」を利用します。最初にNetworkXを使ってグラフ構造を作る際、特にエッジの部分がちょっと面倒に感じると思いますが、エッジを示すことによってどのような経路が存在しているのかをコードを書いて作ることができます。

さらに、この時、エッジに対して、重み(weight)という重みをつけることもできます。

例えば、飛行機で、羽田から福岡まで移動したい場合、羽田―伊丹―福岡という経路と、羽田―福岡という経路があります。羽田―伊丹―福岡で移動した場合、各経路では1時間ずつかかりますので計2時間になり、羽田―福岡は1.5時間です。これをグラフ構造で表したときに、エッジに対して重み(weight)という形で重みをつけることが可能です。同様にコストの値も付与することができますので、経路を使う際の距離やコストを計算できるようになります。

■さいごに

グラフネットワークは、やったことがない人にとっては、考え方が相当難しいと思いますので、初歩のネットワークグラフの概念と、NetworkXの簡単な使い方を押さえて、試験に臨んで頂ければと思います。実際に主教材にあるコードを手元で動かしていただいて、可能なら可視化にもチャレンジしてみてください。可視化自体は試験範囲ではありませんが、自分の気に入ったデータをグラフデータ化することで、そのネットワークをどのように扱っているのかを自分自身でいろいろ考えてやってみると、理解が進むと思います。

そうすることで、例えば先ほどのコストの計算や、つながっている道があるかどうかを確認する [has_path] や、全体を連結かどうかを確認する[is_connected]などのメソッドの使い方を覚えられます。

ちなみに今回紹介したのはグラフデータですが、それ以外のデータの形に関しても、コストを無視すれば実のところ、別のデータの形で表現することは可能だったりします。例えば、友人関係のつながりをグラフデータではなく、2次元の表形式で表すといったことです。ただ、データを確認するのは大変になりますので、適切なデータの形を利用したほうが、そのデータの理解が早くなります。もしくは、自分の得意なデータ構造に持ち込んでしまうことでメリットが生まれることもあります。

ぜひいろいろなデータの処理方法を学び、身に着け、活用を広げていってもらえればと思います。

更新情報

PAGE TOP