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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2079閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/01/23 04:57

日本のイベントをまとめたデータフレーム【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社|

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

イベント名 都道府県名 開催 協賛会社 企画会社 運営会社 〇〇祭り 北海道 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 の場合のコマンド

bash

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

コード

python

1from io import StringIO 2from itertools import combinations 3 4import networkx as nx 5import pandas as pd 6from IPython.display import Image, display 7 8data = StringIO( 9 """ 10イベント名,都道府県名,開催,協賛会社,企画会社,運営会社 11〇〇祭り,北海道,1989,F社,A社、D社,G社 12□□大会,北海道,1975,A社、H社,B社,H社 13△△パーティー,東京都,2013,A社,C社、D社,B社、F社 14●●祭,神奈川県,1982,B社,E社、F社、A社,G社 15✖︎✖︎生誕祭,大阪府,1969,F社,G社、B社,A社 16■■ディナーショー,大阪府,2004,A社、G社,C社,A社、C社、H社 17▲▲イベント,沖縄,1997,B社,D社、E社、F社,H社 18""" 19) 20 21 22def splitter(text): 23 """句読点区切りの値をリストにする。 24 例: "A社、D社" -> ["A社", "D社"] 25 """ 26 return [x.strip() for x in text.split("、")] 27 28 29df = pd.read_csv( 30 data, converters={"協賛会社": splitter, "企画会社": splitter, "運営会社": splitter} 31) 32display(df) 33 34# 会社は全部ひとまとめにする。 35df["会社"] = df["協賛会社"] + df["企画会社"] + df["運営会社"] 36# 重複は消す。 37df["会社"] = df["会社"].apply(lambda x: set(x)) 38 39# 会社の関係をグラフにする。 40G = nx.Graph(fontname="IPAGothic") # 日本語フォントを設定する 41# 環境に応じて、ここは変えてください。Windows なら例えば「メイリオ」とか 42 43for row in df.itertuples(): 44 # 各イベントごとに、関係している会社の組み合わせを辺として追加する。 45 for u, v in combinations(getattr(row, "会社"), 2): 46 if G.has_edge(u, v): 47 # すでに辺が存在する場合は penwidth の値を +1 する。 48 G.edges[u, v]["penwidth"] += 1 49 else: 50 # 辺がまだ存在しない場合は辺を追加する。 51 G.add_edge(u, v, penwidth=1) 52 53 54def show_graph(G): 55 D = nx.nx_pydot.to_pydot(G) 56 D.write_png("temp.png", prog="dot") 57 display(Image("temp.png")) 58 59 60show_graph(G)

イメージ説明

投稿2020/01/23 05:52

編集2020/01/23 05:54
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/01/23 06:51

ご回答ありがとうありがとうございます! 実際のデータで書き換えたところ、下記のエラーが発生いたしました。。 この場合はどのような原因が考えられますでしょうか...? can only concatenate list (not "str") to list
tiitoi

2020/01/23 07:01

例えば、converters={"協賛会社": splitter, "企画会社": splitter, "運営会社": splitter} のところの列名が質問の例と違うとかでしょうか? 列名が違う場合は適宜変更してください
退会済みユーザー

退会済みユーザー

2020/01/23 07:14

再度確認しましたが正しいようです。。
tiitoi

2020/01/23 07:21 編集

質問に記載された以下の形式の CSV で動作することは確認しているので、実際の CSV に差し替えたら動作しないのであれば、その差異が原因です。 実際のデータがこちらにはないので、すみませんが、原因については回答のしようがありません。 イベント名,都道府県名,開催,協賛会社,企画会社,運営会社 〇〇祭り,北海道,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社
退会済みユーザー

退会済みユーザー

2020/01/23 07:23

df = pd.read_csv(data, converters={"協賛会社": splitter, "企画会社": splitter, "運営会社": splitter}) df["会社"] = df["協賛会社"] + df["企画会社"] + df["運営会社"] の部分をご回答と同じように3つにしたところ、通ったようなのですが、次に下記のエラーが発生してしまいました。。 AttributeError: 'tuple' object has no attribute '会社'
tiitoi

2020/01/23 07:30

df["会社"] = df["協賛会社"] + df["企画会社"] + df["運営会社"] df["会社"] = df["会社"].apply(lambda x: set(x)) の直後に df["会社"] を print() するとどうなっていますか? 1行目は ["B社","D社"], ["A社"] のように3つの列のリストの値を結合して "会社" という列を作成しています。 2行目は ["A社", "A社", "B社"] のように重複する会社名が出てきた場合に重複を除いています。
退会済みユーザー

退会済みユーザー

2020/01/23 07:37

0 {A社,B社,C社... 1 {D社,E社,F社} 2 {G社,H社,I社...... ・ ・ というように返ってきます!
tiitoi

2020/01/23 07:42

だとしたら、そこまでは意図通りのような気がします。 AttributeError: 'tuple' object has no attribute '会社' は getattr(row, "会社") で発生しているのでしょうか? "会社" という名前の列があれば、エラーが起こらないはずなのですが。。。
退会済みユーザー

退会済みユーザー

2020/01/23 07:44

そのようです。。 ちなみにご回答いただいたコードをそのまま打ち込むと下記エラーが発生するので、これは根本的に自分のnotebookに問題があるということですかね。。 FileNotFoundError: [Errno 2] "dot" not found in path.
tiitoi

2020/01/23 07:54 編集

グラフの可視化には Graphviz というグラフ可視化のソフトウェアを使用するので、インストール及び環境変数 PATH への登録 (PATHを通す) が必要です。 そのエラーはそれができていないので起こっています。 Windows であれば、以下からインストールできます。 http://www.graphviz.org/download/ すると、Program Files (x86) 以下 (環境によって違う可能性もある) にインストールされるので、以下のパスを環境変数 PATH に通しておく必要があります。 C:\Program Files (x86)\Graphviz2.38\bin 設定後、Notebook は再起動しないと環境変数の変更が反映されないかもしれません。 設定がうまくいっていれば、少なくとも回答のコードは動くはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問