ラベル 可視化 の投稿を表示しています。 すべての投稿を表示
ラベル 可視化 の投稿を表示しています。 すべての投稿を表示

2018年6月22日金曜日

エネルギー基本計画(案)の特徴を見てみる。その2 名詞でwordcloud(python,janome,wordcloud,自然言語処理)

2018/9/5 更新。janomeの初期化を書き忘れていました。修正していますm(__)m
---
エネルギー基本計画(案)の特徴を見てみるの続きです。前回はエネルギー基本計画(案)のpdfから抽出したテキストを使って、janomeで形態素解析しwordcloudを作りました。


(collocations=True、連語を考慮した例)

出現頻度が多い「する」「なる」などの動詞、「について」「による」などの助詞が大きく表示されています。これらはエネルギー基本計画(案)の特徴とは言いがたいので、名詞だけを取り出してみます。

・形態素情報取り出し
from janome.tokenizer import Tokenizer

word='寄り添い'

t = Tokenizer()
tokens = t.tokenize(word)

for token in tokens:
    print("表層形:",token.surface,"\n"
          "品詞:",token.part_of_speech.split(',')[0],"\n"
          "品詞細分類1:",token.part_of_speech.split(',')[1],"\n"
          "品詞細分類2:",token.part_of_speech.split(',')[2],"\n"
          "品詞細分類3:",token.part_of_speech.split(',')[3],"\n"
          "活用型:",token.infl_type,"\n"
          "活用形:",token.infl_form,"\n"
          "原形:",token.base_form,"\n"
          "読み:",token.reading,"\n"
          "発音:",token.phonetic)
表層形: 寄り添い 
品詞: 動詞 
品詞細分類1: 自立 
品詞細分類2: * 
品詞細分類3: * 
活用型: 五段・ワ行促音便 
活用形: 連用形 
原形: 寄り添う 
読み: ヨリソイ 
発音: ヨリソイ

Janomeで形態素解析をやってみる。の記事でjanomeの使い方を書きましたが、janomeで形態素解析を行うと上の例のように形態素情報を返してくれます。名詞、動詞などの品詞は.part_of_speech.split(',')[0]で取り出せます。

・インポートとファイル読み込み
from janome.tokenizer import Tokenizer
from wordcloud import WordCloud
import matplotlib.pyplot as plt 

text_file = open("enegy_plan.txt")
full_text = text_file.read()

・名詞のみを取り出し
word_list=[]
tokens = t.tokenize(full_text) 

for token in tokens:
    word = token.surface
    partOfSpeech = token.part_of_speech.split(',')[0]
    if partOfSpeech == "名詞":
        word_list.append(word)

token.part_of_speech.split(',')[0]で品詞を取り出し、名詞のみをリストに保存しています。

・半角スペース区切りの分かち書きに
words_noun=" ".join(word_list)
words_noun
出力(一部)
はじめ 2 0 1 1 年 3月 東日本 大震災 東京電力 福島 一 原子力 発電 所 事故 政府 2 0 1 4 年 4月 2 0 3 0 年 念頭 4 次 エネルギー 基本 計画 策定 原発 依存 度 低減 化石 資源 依存 度 低減 再生 可能 エネルギー 拡大 4 次 エネルギー 基本 計画 策定 4 年 2 0 3 0 年 計画 見直し 2 0 5 0 年 パリ 協定 対応 長期 化石 資源 枯渇 長期 対応 変化 エネルギー 情勢 対応 今 一 度 我が国 エネルギー 選択 構想 時期 ため 今回 エネルギー 基本 計画 見直し 2 0 3 0 年 長期 エネルギー 需給 見通し 2 0 1 5 年 7月 経済 産業 省 決定 以下 エネルギー ミックス 実現 2 0 5 0 年 シナリオ 設計 構成

・wordcloudの設定・描画
stop_words = []
fpath = "C:\Windows\Fonts\msgothic.ttc"

wordcloud2 = WordCloud(
    font_path=fpath,
    width=900, height=500,
    background_color="white",
    stopwords=set(stop_words),
    max_words=500,
    max_font_size=150
    ).generate(words_noun)

#グラフ表示する処理
plt.figure(figsize=(15,12))
plt.imshow(wordcloud2)
plt.axis("off")
plt.show()


名詞だけにしてwordcloudを描いてみましたが、「こと」「ため」という言葉が大きく出ました。これほど大きくはないですが、「これ」「よう」というのも見えます。

元の文書をみてみると、「このようなこと」「実現するため」「これに加え」「このように」などとして多く使われているようです。

・例文を形態素解析
t = Tokenizer()
text="これに加え、このようなことを実現するため"
    
tokens = t.tokenize(text)
 
for token in tokens:
    print(token)
これ 名詞,代名詞,一般,*,*,*,これ,コレ,コレ
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
加え 動詞,自立,*,*,一段,連用形,加える,クワエ,クワエ
、 記号,読点,*,*,*,*,、,、,、
この 連体詞,*,*,*,*,*,この,コノ,コノ
よう 名詞,非自立,助動詞語幹,*,*,*,よう,ヨウ,ヨー
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
こと 名詞,非自立,一般,*,*,*,こと,コト,コト
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
実現 名詞,サ変接続,*,*,*,*,実現,ジツゲン,ジツゲン
する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
ため 名詞,非自立,副詞可能,*,*,*,ため,タメ,タメ

「これに加え、このようなことを実現するため」という例文を作って、形態素解析してみました。「これ」は名詞-代名詞、「よう」「こと」「ため」は名詞-非自立になっています。これらを除外するため、品詞細分類1の「代名詞」「非自立」をのぞいた名詞を取り出してみます。

・名詞(代名詞、非自立名詞は除外)を取り出し
word_list2=[]
tokens = t.tokenize(full_text) 

for token in tokens:
    word = token.surface
    partOfSpeech = token.part_of_speech.split(',')[0]
    partOfSpeech2 = token.part_of_speech.split(',')[1]
    
    if partOfSpeech == "名詞":
        if (partOfSpeech2 != "非自立") and (partOfSpeech2 != "代名詞"):
            word_list2.append(word)

words_noun2=" ".join(word_list2)
words_noun2


token.part_of_speech.split(',')[1]で品詞細分類1を取り出し、"非自立"と"代名詞"は除外した上で名詞のみをリストに保存しています。

出力(一部)
はじめ 2 0 1 1 年 3月 東日本 大震災 東京電力 福島 一 原子力 発電 所 事故 政府 2 0 1 4 年 4月 2 0 3 0 年 念頭 4 次 エネルギー 基本 計画 策定 原発 依存 度 低減 化石 資源 依存 度 低減 再生 可能 エネルギー 拡大 4 次 エネルギー 基本 計画 策定 4 年 2 0 3 0 年 計画 見直し 2 0 5 0 年 パリ 協定 対応 長期 化石 資源 枯渇 長期 対応 変化 エネルギー 情勢 対応 今 一 度 我が国 エネルギー 選択 構想 時期 今回 エネルギー 基本 計画 見直し 2 0 3 0 年 長期 エネルギー 需給 見通し 2 0 1 5 年 7月 経済 産業 省 決定 エネルギー ミックス 実現 2 0 5 0 年 シナリオ 設計 構成

あまり変わっていませんが、「ため」という言葉がなくなっています。

・wordcloud設定・描画
stop_words = []
fpath = "C:\Windows\Fonts\msgothic.ttc"

wordcloud2 = WordCloud(
    font_path=fpath,
    width=900, height=500,
    background_color="white",
    stopwords=set(stop_words),
    max_words=500,
#    max_font_size=150
    ).generate(words_noun2)

#グラフ表示する処理
plt.figure(figsize=(15,12))
plt.imshow(wordcloud2)
plt.axis("off")
plt.show()


名詞(代名詞、非自立名詞を除く)のみ、連語を考慮(デフォルトでcollocation=True)でのwordcloudです。今回は最大フォントサイズの指定をしていません。

技術とエネルギーが2大単語となりました。「再生 可能」と「可能 エネルギー」も大きくありますが、wordcloudの連語考慮では2語のつながり(bigram)のみなので、再生可能エネルギーが「再生 可能」と「可能 エネルギー」に分かれてしまっているようです。「炭素」「地域」「水素」なども比較的大きく見えています。



こちらは連語を考慮せず、単語のみで作ったwordcloud。最大フォントは指定していません。「エネルギー」が中央に大きくありますが、あまりフォントの大きさが変わらず、混沌とした感じになりました。「必要」「利用」「活用」などの普通によく使われそうな言葉も見えます。

名詞のみにすることで前回よりは文章の特徴が見えてきましたが、一般的によく使われる語句の除外と3語以上の連語・複合語を考慮した方がよさそうです。

つづく

参考:
wordcloudライブラリ
https://amueller.github.io/word_cloud/index.html
先端技術研究所:AnacondaとWordCloudを用いたテキストマイニング
http://cadenza-lab.com/2018/02/04/textmining/
見習いデータサイエンティストの隠れ家:Pythonでトピックモデル Word Cloud と LDA
http://www.dskomei.com/entry/2018/04/11/001944
wordcloudのほかに、トピックモデルによる分類あり。

資源エネルギー庁:エネルギー基本計画(案)
http://www.enecho.meti.go.jp/committee/council/basic_policy_subcommittee/pdf/basic_policy_subcommittee_002.pdf

修正:PDFMinerでpdfからtxtを抽出する。
http://eneprog.blogspot.com/2018/05/pdfminerpdftxtpythonpdfminersix.html
正規表現を使って、エネルギー基本計画のテキストを整形する。
http://eneprog.blogspot.com/2018/06/pythonresplit.html
Janomeで形態素解析をやってみる。
http://eneprog.blogspot.com/2018/06/janomepython.html
エネルギー基本計画(案)の特徴を見てみる。その1 wordcloud
https://eneprog.blogspot.com/2018/06/wordcloudpythonjanome.html

2018年5月26日土曜日

サンフランシスコのレンタサイクルのデータを見てみる その4。地図上に線を引く(python、folium、Map)

edX UCバークレー データサイエンス基礎講座(Foundation of Data Science)の演習、前回の続きです。

サンフランシスコ ベイエリアのレンタサイクル "Ford Go Bike"の利用状況を把握する。

今回は、借りたステーション(開始ステーション)と返却したステーション(返却ステーション)の組み合わせを地図上に線で表示します。下記のサイトが大変参考になりました。
folium quickstart
Deparks:Plot Lines In Folium
hibomaの日記:Python + folium で Strava の "全"記録を地図で可視化 🚲

元データ
サンフランシスコ ベイエリア レンタサイクル Ford Go Bike
https://www.fordgobike.com/
システムデータ
https://s3.amazonaws.com/fordgobike-data/index.html
2017年のトリップデータ(このデータを使います)
https://s3.amazonaws.com/fordgobike-data/2017-fordgobike-tripdata.csv

・使用するデータフレームの確認
stations_startcount.head()
stationlatlongstart_count
100San Francisco Ferry Building (Harry Bridges Pl...37.795392-122.39420313338
5San Francisco Caltrain (Townsend St at 4th St)37.776598-122.39528212320
8San Francisco Caltrain Station 2 (Townsend St...37.776639-122.39552611890
15The Embarcadero at Sansome St37.804770-122.40323411861
31Market St at 10th St37.776619-122.41738511577

common2.head()
Start StationEnd Stationcount
0San Francisco Ferry Building (Harry Bridges Pl...The Embarcadero at Sansome St2842
1The Embarcadero at Sansome StSteuart St at Market St1764
2Berry St at 4th StSan Francisco Ferry Building (Harry Bridges Pl...1671
3The Embarcadero at Sansome StSan Francisco Ferry Building (Harry Bridges Pl...1639
42nd St at S Park StMontgomery St BART Station (Market St at 2nd St)1504

前回までに作ったデータフレームを使います。start_stationcountにステーション名と座標が、common2に開始ステーションと返却ステーションの組み合わせと利用回数が入っており、利用回数の多い順に並べ替えています。

・地図上に描画
map_osm = folium.Map(location=[37.795392,-122.394203],zoom_start=13)

for i, r in common2[0:200].iterrows():
    
    start_station=stations_startcount[stations_startcount["station"]==r["Start Station"]]
    end_station=stations_startcount[stations_startcount["station"]==r["End Station"]]
                                      
    s_lat=start_station["lat"].iloc[0]
    s_long=start_station["long"].iloc[0]
    e_lat=end_station["lat"].iloc[0]
    e_long=end_station["long"].iloc[0]
    
    location=[[s_lat,s_long],[e_lat,e_long]]

    k=1
    for each in location:
        if k==1:
            station=r["Start Station"]
        else:
            station=r["End Station"]
            
        folium.Circle(
            location=each,
            popup=station,
            radius=2.5,
        ).add_to(map_osm)
        
        k=k+1
        
        
    folium.PolyLine(
        locations=location,
        weight= r["count"] / 300,
    ).add_to(map_osm)
               
map_osm


一気に描きます。開始ステーションと返却ステーションの組み合わせで、利用回数が多い順に200件を描画します。

Mapで中心座標とズームを指定してオブジェクトを作成。common2の開始、返却ステーション名をstations_startcountと比較して座標を取り出し。locationにリストとして開始ステーション、返却ステーションのそれぞれの座標を保存します。

for each in location以下では、まず、ポップアップで表示されるステーション名をstationに取得、Circleで各ステーションに小さな円とポップアップを設定します。

線を描くのはfolium.Polylineで、locationで2点の座標を指定、weightで太さを設定しています。太さは利用回数/300として、利用回数が大きいほど太く表示するようにしました。

・出力

利用経路の線が描かれました。ちょっと選択しずらいですが、線の端をクリックするとステーション名が表示されます。

東海岸沿いの太い線が最も利用が多いフェリービルディングと Embarcadero at Sansome Stの線です。数ヶ所の利用が多いステーションがあり、それらのステーション間を結んで利用されているようです。オークランドの方は中心にMacArthur BART Stationがあり、星型に4ヶ所を結ぶ形になっています。

開始ステーションと返却ステーションの方向を矢印で表示したかったのですが、やり方がわかりませんでした。これは今後の課題ということで。

参考:
folium quickstart
https://python-visualization.github.io/folium/quickstart.html
Deparks:Plot Lines In Folium https://deparkes.co.uk/2016/06/03/plot-lines-in-folium/
hibomaの日記:Python + folium で Strava の "全"記録を地図で可視化 🚲 http://hiboma.hatenadiary.jp/entry/2017/09/13/094056

edx UC Berkeley Foundations of Data Science(UCバークレー データサイエンス基礎講座)
ttps://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science
Computational Thinking with Python(pythonによるプログラミング的思考)
https://www.edx.org/course/foundations-data-science-computational-uc-berkeleyx-data8-1x

サンフランシスコ ベイエリア レンタサイクル Ford Go Bike
https://www.fordgobike.com/
システムデータ
https://s3.amazonaws.com/fordgobike-data/index.html

プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
サンフランシスコのレンタサイクルのデータを見てみる(基本統計量、python、pandas、ヒストグラム)
https://eneprog.blogspot.com/2018/05/pythonpandas_17.html
サンフランシスコのレンタサイクルのデータを見てみる その2。よく使われているステーションを調べる(python、pandas、groupby、pivot_table)
https://eneprog.blogspot.com/2018/05/pythonpandasgroupbypivottable.html
サンフランシスコのレンタサイクルのデータを見てみる その3。地図上に可視化(python、pandas、folium、Map)
https://eneprog.blogspot.com/2018/05/3pythonpandasfoliummap.html
//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語