質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

データフレームのデータをnetworkxでグラフ化したい。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 575
退会済みユーザー

退会済みユーザー

日本のイベントをまとめたデータフレーム【df_event】があります。
・df_event["協賛会社"]
・df_event["企画会社"]
・df_event["運営会社"]
のデータを一つのイベントで2つや3つある会社をnetworkxでグラフ化したいと思っています。
(【イメージ画像】のようにどの会社同士の繋がりが強いかを可視化したいです。)
networkxに初めて挑戦するのでヒントだけでもいただけたらと思います。
どなたかお力添えをよろしくお願いいたします。。

【df_event】

イベント名 都道府県名 開催 協賛会社 企画会社 運営会社
〇〇祭り 北海道 1989 F社 A社、D社 G社
□□大会 北海道 1975 A社、H社 B社 H社
△△パーティー 東京都 2013 A社 C社、D社 B社、F社
●●祭 神奈川県 1982 B社 E社、F社、A社 G社
✖︎✖︎生誕祭 大阪府 1969 F社 G社、B社 A社
■■ディナーショー 大阪府 2004 A社、G社 C社 A社、C社、H社
▲▲イベント 沖縄 1997 B社 D社、E社、F社 H社

【イメージ画像】
イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

イベント名    都道府県名    開催    協賛会社    企画会社    運営会社
〇〇祭り    北海道    1989    F社    A社、D社    G社

となっていた場合、F社、A社、D社、G社 が関係があるとし、その中の2つの組み合わせに対して辺を追加する形でグラフを作成しました。(itertools.combinations を使用)

G社 A社
G社 F社
G社 D社
A社 F社
A社 D社
F社 D社

関係の強さを表すために penwidth 属性に回数を記録し、すでに辺が存在する場合は +1 するようにしました。(penwidth 属性は Graphviz で辺を描画する際の太さに利用されます)

必要なライブラリについて

netoworkx 自体はグラフの可視化機能は提供しておらず、matplotlib または Graphviz を使って行うので、今回は Graphviz を使いました。

可視化には別途、pydot という Python のライブラリと graphviz というソフトウェアが必要になります。

Linux では apt でインストールできますが、それ以外の環境の場合は OS にあったバージョンのバイナリを公式サイトからダウンロードしてください。

Download

pydot は pip install pydot でインストールできます。

Linux の場合のコマンド

pip install pydot networkx
# Graphviz と日本語フォントをインストール
apt install -y graphviz fonts-ipafont
fc-cache -fv

コード

from io import StringIO
from itertools import combinations

import networkx as nx
import pandas as pd
from IPython.display import Image, display

data = StringIO(
    """
イベント名,都道府県名,開催,協賛会社,企画会社,運営会社
〇〇祭り,北海道,1989,F社,A社、D社,G社
□□大会,北海道,1975,A社、H社,B社,H社
△△パーティー,東京都,2013,A社,C社、D社,B社、F社
●●祭,神奈川県,1982,B社,E社、F社、A社,G社
✖︎✖︎生誕祭,大阪府,1969,F社,G社、B社,A社
■■ディナーショー,大阪府,2004,A社、G社,C社,A社、C社、H社
▲▲イベント,沖縄,1997,B社,D社、E社、F社,H社
"""
)


def splitter(text):
    """句読点区切りの値をリストにする。
       例: "A社、D社" -> ["A社", "D社"]
    """
    return [x.strip() for x in text.split("、")]


df = pd.read_csv(
    data, converters={"協賛会社": splitter, "企画会社": splitter, "運営会社": splitter}
)
display(df)

# 会社は全部ひとまとめにする。
df["会社"] = df["協賛会社"] + df["企画会社"] + df["運営会社"]
# 重複は消す。
df["会社"] = df["会社"].apply(lambda x: set(x))

# 会社の関係をグラフにする。
G = nx.Graph(fontname="IPAGothic")  # 日本語フォントを設定する
# 環境に応じて、ここは変えてください。Windows なら例えば「メイリオ」とか

for row in df.itertuples():
    # 各イベントごとに、関係している会社の組み合わせを辺として追加する。
    for u, v in combinations(getattr(row, "会社"), 2):
        if G.has_edge(u, v):
            # すでに辺が存在する場合は penwidth の値を +1 する。
            G.edges[u, v]["penwidth"] += 1
        else:
            # 辺がまだ存在しない場合は辺を追加する。
            G.add_edge(u, v, penwidth=1)


def show_graph(G):
    D = nx.nx_pydot.to_pydot(G)
    D.write_png("temp.png", prog="dot")
    display(Image("temp.png"))


show_graph(G)

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/23 16:42

    だとしたら、そこまでは意図通りのような気がします。
    AttributeError: 'tuple' object has no attribute '会社'

    getattr(row, "会社")
    で発生しているのでしょうか?
    "会社" という名前の列があれば、エラーが起こらないはずなのですが。。。

    キャンセル

  • 2020/01/23 16:44

    そのようです。。
    ちなみにご回答いただいたコードをそのまま打ち込むと下記エラーが発生するので、これは根本的に自分のnotebookに問題があるということですかね。。

    FileNotFoundError: [Errno 2] "dot" not found in path.

    キャンセル

  • 2020/01/23 16:49 編集

    グラフの可視化には Graphviz というグラフ可視化のソフトウェアを使用するので、インストール及び環境変数 PATH への登録 (PATHを通す) が必要です。
    そのエラーはそれができていないので起こっています。

    Windows であれば、以下からインストールできます。
    http://www.graphviz.org/download/
    すると、Program Files (x86) 以下 (環境によって違う可能性もある) にインストールされるので、以下のパスを環境変数 PATH に通しておく必要があります。
    C:\Program Files (x86)\Graphviz2.38\bin
    設定後、Notebook は再起動しないと環境変数の変更が反映されないかもしれません。

    設定がうまくいっていれば、少なくとも回答のコードは動くはずです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る