2018年7月20日金曜日

Coursera machine learning コースを始めました。edX UCバークレーFoundations of Data Scienceとの違いなど(オンライン学習、機械学習、mooc)

edX UCバークレー データサイエンス基礎(Foundations of Data Science)コースに続き、有名なCoursera machine learningコースを始めました。現在、week2が終わったところです。

Coursera machine learningコース
https://www.coursera.org/learn/machine-learning

スタンフォード大学のAndrew Ng教授の人気講座で、ブログ記事などで評判を見かけ、やってみることにしました。すでにいろんな方が講座の内容などを紹介されていますので、ここでは主にedX UCバークレーコース(以下、edX Data8)との違いを書いてみたいと思います。

受講は基本的には無料、終了証の発行には8680円(日本円)が必要になります。これはedX Data8と同じで、Courseraの方が少し安いです。

edX Data8の方は、開講期間が決まっていて一斉にスタートするのに対し、Courseraコースはいつでも開始可能です。ただし、受講のペースは決まっていて、1週間の課題を○○日までに送信するようにというアナウンスが出ます。



オンライン学習では一定のペースで続けることが難しくなってくるので、こういう締め切りがあるのはいいことだと思います。(すでに締め切りに追われていますが。。。)

edX Data8ではdiscussionを見ると自分が疑問に思ったことについて誰かが質問していて、それに対する回答も多く寄せられており、一緒に勉強している感がありましたが、Courseraは一斉にスタートするわけではないためか、discussionはあまり活発に動いていないようです(そもそも、コードをdiscussionに載せることが禁止されている)。

代わりに、ブログ等での解説記事はたくさんあるので、こちらを参考にできます。

edX Data8コースとの最大の違いは、日本語字幕があることでしょうか。



講義動画に日本語字幕を出せます。ダウンロードも可能。これは機械翻訳ではなく、ボランティアの有志で付けられているそうです。各単元で翻訳者が違っていて、時々分かりにくかったり、字幕がずれていたりすることもありますが、専門用語も日本語で書かれているので後で調べる際にもとても役に立ちます。

edX Data8の方は英語のみなので、やはりハードルは高いですね。

講義は、Andrew教授がスライドに書き込みを入れるスタイルで進んでいきます。



評判どおり、平易な言葉で解説されていて大変分かりやすいです(理解できているかはまた別問題)。week1では、行列の足し算などの計算から復習がありました。難しいと思うところもありますが、その都度、ここは覚えなくていい、難しいから理解できなくてもいいという言葉もあり、励みにしながらとりあえず進めています。

edX Data8では、講義もjupyter notebookのpythonを動かしながら進むので、動画を見ながら一緒に手を動かすことができるのですが、Courseraの方は通常の学校などの授業と同様、講義を聴く感じになっています。



講義動画の途中に、ところどころで動画が止まり上記のようなクイズが出題されます。動画を見ているだけでは何となく聞き流してしまうので、このクイズは理解度を深める上でとてもよい仕組みだと思います。

プログラミング課題では、OctaveまたはMatlabを使います。Octaveはフリーソフト、Matlabは有料ですがオンライン版でコース受講中に使える無料パスがあるようです。私はOctaveをインストールしました。edX Data8ではpython、jupyter notebook等の環境構築が必要なかったので、この点ではedX Data8の方が楽です。

GNU Octave
https://www.gnu.org/software/octave/

上記からGNU Octaveをインストールしました。バージョンは最新版で4.40です。コースの注意書きで4.0はインストールするなとありましたが、いまのところ普通に動いているようです。



Octaveの画面。Octaveは行列計算に特化した感じで、とてもシンプルな言語になっているようです。week2の講義資料にOctaveのチュートリアルがあり、このチュートリアルを見ながら練習しました。pythonでやったらいいのにとも思いましたが、Andrew Ng教授によると、pythonなどを使うよりもOctaveの方がスムーズに操作・理解できるとのことです。

edX Data8でもpythonのpandas等の普段使うモジュールではなく、より簡易化した独自モジュールを使って演習をしているので、同じような考え方なのだと思います(edX Data8では特定のプログラミング言語を学ぶのではなく、データサイエンスの基礎を学ぶのだとの記載あり)。

このCourseraコースでは1週間で動画講義と項目ごとのテスト、最後にプログラミング課題という構成になっています。プログラミング課題は全て英語で、ほとんど図もないpdfで記載されていて、ちょっと戸惑いました。課題のpdfではヒントも少なく、1週間分の講義内容を課題にしているため忘れている部分もあったので、動画講義の進行に合わせて、プログラミング課題も少しずつ進めたほうがいいかもしれません。

課題についてはgithubなどに回答例がたくさんあります。他の人のコードを写すのは禁止とされていますが、分からなければ参考にするのもいいと思います。コードを見ると、そういうことかと理解できるところがありました。(ただし、間違っている例もあるので要注意)

以上、長くなりましたが、全体としてこのコースは機械学習の理論を学ぶのに大変よいと思いますが、数学的な話が主で手を動かしながらという感じでもなく、モチベーションが高くないと続けるのが少し難しい気がします。

まだweek2が終わったところなので、どこまでできるか分かりませんが、出来るところまでやってみようと思います。


参考:
Coursera machine learningコース
https://www.coursera.org/learn/machine-learning
edX UCバークレー データサイエンス基礎講座

https://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science
プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
プログラミング学習:edx UCバークレー データサイエンス基礎講座、第2弾受講中(python)
https://eneprog.blogspot.com/2018/06/edx-uc-2python.html

追伸:edX UCバークレー データサイエンス基礎コース 第3弾、機械学習コースが2018年7月24日に始まります。こちらも受講申し込み済みです。

Foundations of Data Science: Prediction and Machine Learning
https://www.edx.org/course/foundations-data-science-prediction-uc-berkeleyx-data8-3x

2018年7月13日金曜日

ハローワークの求人情報を見てみる。賃金分布、地域、業種(python,pandas,matplotlib)

前回、ハローワークインターネットサービスから求人一覧を取得しました。

ハローワークインターネットサービスから求人情報を取得する
http://eneprog.blogspot.com/2018/07/pythonpandas.html

今回はこのデータの中身を見てみます。

・インポートとデータ読み込み
import pandas as pd
from time import sleep

import matplotlib
import matplotlib.pyplot as plt

tables=pd.read_csv("ehime_job.csv",encoding="CP932")
tables.head()
Unnamed: 0NO求人番号職種雇用形態/賃金(税込)就業時間/休日/週休二日産業沿線/就業場所受理日
0NEW!◎113040- 82018581ルームアドバイザー職/新居浜駅前店正社員/182,000円~182,000円変形 1年単位1)10:00~19:00/他/その他不動産業,物品賃貸業のうち不動産代理業・仲介業愛媛県新居浜市平成30年7月9日
1NEW!◎213170- 30358781施工管理/松山市(要普免) 【急募】正社員/230,000円~400,000円1)08:00~17:00/土日/毎週不動産業,物品賃貸業のうち建物売買業,土地売買業愛媛県松山市平成30年7月9日
2NEW!◎321010- 26058881メディカルスタッフ(たんぽぽ薬局今治喜田村店)正社員/167,800円~200,000円変形 1ヶ月単位1)08:30~17:302)08:30~13:303)09:00~18:0...卸売業・小売業のうち医薬品・化粧品小売業愛媛県今治市平成30年7月9日
3NEW!◎427020- 46421181フィールドサービス(松山市)**急募**正社員/150,000円~225,000円変形 1年単位1)08:35~18:30/他/毎週卸売業・小売業のうち各種商品卸売業愛媛県松山市平成30年7月9日
4NEW!◎527020- 46422081営業職(プレゼン型)松山市★東証一部上場★メーカー正社員/150,000円~225,000円変形 1年単位1)08:35~18:30/土日祝他/毎週卸売業・小売業のうち各種商品卸売業愛媛県松山市平成30年7月9日

愛媛県のフルタイム正社員の求人情報、7575件です。

「雇用形態/賃金(税込)」と「就業時間/休日/週休二日」は複数の情報が一つのカラムに入っているので分割し、データを整理します。

・「雇用形態/賃金(税込)」の整理
table2=(tables["雇用形態/賃金(税込)"]
        .str.replace("円~","/")
        .str.replace("円","")
        .str.replace(",","")
        .str.split("/",expand=True)
       )

able2.columns=["雇用形態","賃金(最低)","賃金(最大)"]
table2=table2[["賃金(最低)","賃金(最大)"]].astype(int)
table2.head() 
賃金(最低)賃金(最大)
0182000182000
1230000400000
2167800200000
3150000225000
4150000225000


「雇用形態/賃金(税込)」列には「正社員/182,000円~182,000円」というように"雇用形態","賃金(最低)","賃金(最大)"の3つの情報が入っています。区切り文字を"/"に統一し、不要な文字("円",コンマ)を削除して、splitで列を分割します。

その後、列名をつけ、「賃金(最低)」「賃金(最大)」を数値に変換しました。

・「就業時間/休日/週休二日」の分割
table3=tables["就業時間/休日/週休二日"].str.split("/",expand=True)
table3.columns=["就業時間","休日","週休二日"]
table3.head()
就業時間休日週休二日
0変形 1年単位1)10:00~19:00他その他
11)08:00~17:00土日毎週
2変形 1ヶ月単位1)08:30~17:302)08:30~13:303)09:00~18:00日祝他毎週
3変形 1年単位1)08:35~18:30他毎週
4変形 1年単位1)08:35~18:30土日祝他毎週

同様に「就業時間/休日/週休二日」も3つに分割します。

・データ結合
job_table=(pd.concat([tables,table2,table3],axis=1)
           .drop(["雇用形態/賃金(税込)","就業時間/休日/週休二日"],axis=1)
          )
job_table.head()
Unnamed: 0NO求人番号職種産業沿線/就業場所受理日雇用形態賃金(最低)賃金(最大)就業時間休日週休二日
0NEW!◎113040- 82018581ルームアドバイザー職/新居浜駅前店不動産業,物品賃貸業のうち不動産代理業・仲介業愛媛県新居浜市平成30年7月9日正社員182000182000変形 1年単位1)10:00~19:00他その他
1NEW!◎213170- 30358781施工管理/松山市(要普免) 【急募】不動産業,物品賃貸業のうち建物売買業,土地売買業愛媛県松山市平成30年7月9日正社員2300004000001)08:00~17:00土日毎週
2NEW!◎321010- 26058881メディカルスタッフ(たんぽぽ薬局今治喜田村店)卸売業・小売業のうち医薬品・化粧品小売業愛媛県今治市平成30年7月9日正社員167800200000変形 1ヶ月単位1)08:30~17:302)08:30~13:303)09:00~18:00日祝他毎週
3NEW!◎427020- 46421181フィールドサービス(松山市)**急募**卸売業・小売業のうち各種商品卸売業愛媛県松山市平成30年7月9日正社員150000225000変形 1年単位1)08:35~18:30他毎週
4NEW!◎527020- 46422081営業職(プレゼン型)松山市★東証一部上場★メーカー卸売業・小売業のうち各種商品卸売業愛媛県松山市平成30年7月9日正社員150000225000変形 1年単位1)08:35~18:30土日祝他毎週

データ結合し、表の完成です。

ここから中身を見てみます。

・求人の多い地域
job_area=job_table.groupby("沿線/就業場所")[["沿線/就業場所"]].count().sort_values(by="沿線/就業場所", ascending=False)
job_area[:10] 
沿線/就業場所
沿線/就業場所
愛媛県松山市2853
愛媛県今治市894
愛媛県新居浜市734
愛媛県西条市620
愛媛県四国中央市612
愛媛県宇和島市321
愛媛県大洲市240
愛媛県八幡浜市198
愛媛県伊予郡松前町150
愛媛県東温市150

groupbyで「沿線/就業場所」をグループ化し、データ数を数えました。

松山市の求人数がダントツで多いです。続いて今治市、西条市、新居浜市となっています。

・求人の多い業種
job_table.groupby("産業")[["産業"]].count().sort_values(by="産業", ascending=False)[:10]
産業
産業
医療,福祉のうち老人福祉・介護事業1025
医療,福祉のうち病院478
運輸業,郵便業のうち一般貨物自動車運送業319
建設業のうち一般土木建築工事業246
製造業のうち船舶製造・修理業,舶用機関製造業229
医療,福祉のうち一般診療所207
建設業のうち土木工事業(舗装工事業を除く)143
卸売業・小売業のうち自動車小売業108
卸売業・小売業のうち医薬品・化粧品小売業108
医療,福祉のうち歯科診療所107

産業別では、医療、介護系が最も多く、運輸、建設・製造と続いています。

・賃金の統計量
table2[["賃金(最低)","賃金(最大)"]].describe()
賃金(最低)賃金(最大)
count7575.0000007575.000000
mean167828.605545224215.472871
std35528.51465972106.315667
min45000.00000050000.000000
25%147000.000000173000.000000
50%162500.000000210000.000000
75%184817.000000260000.000000
max416667.000000791666.000000

.describe()で賃金情報の統計量を見てみます。

賃金(最低)の平均は167,828円、中央値162,500円で、賃金(最大)では平均224,215円、中央値210000と平均値と中央値の差は小さくなっています。

・賃金の分布
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams["font.size"] = 16

table2.plot(y=["賃金(最低)","賃金(最大)"],bins=20,alpha=0.5,range=(0,600000),kind="hist",figsize=(10,5))


matplotlibで日本語を表示させると文字化けするので、plt.rcParams['font.family']でフォントを指定しています。alpha=0.5は色の透過度の指定です。

赤色、賃金(最低)では16万円に大きな山となり分布範囲は小さくなっています。このくらいの求人が多いということですね。青色、賃金(最高)の方は最頻値が20万円程度で最低よりも分布が広く、やや右に裾の長いグラフになりました。

参考:
ハローワークインターネットサービス
https://www.hellowork.go.jp/index.html

プログラミング学習:pandasでweb上の表を取得する。
https://eneprog.blogspot.com/2018/04/pandaswebpython.html
ハローワークインターネットサービスから求人情報を取得する
http://eneprog.blogspot.com/2018/07/pythonpandas.html

2018年7月11日水曜日

ハローワークインターネットサービスから求人情報を取得する(python,pandas,スクレイピング)

私は現在、求職中です。どんな求人があるのか気になるので、ハローワークインターネットサービスから求人情報を取得してみることにしました。

ハローワークインターネットサービス 求人情報基本条件入力
https://www.hellowork.go.jp/servicef/130020.do?action=initDisp&screenId=130020


上記から検索条件を指定して検索すると、職種、雇用形態、賃金などが記載された「求人情報一覧」という表がでてきます。



この表を取得することを目指します。

・インポート
import pandas as pd
from time import sleep

pandasのほか、timesのsleepをインポート。sleepは一時的に処理を止めるときに使います。

・URLを作る
pageno=1

url=("https://www.hellowork.go.jp/servicef/130050.do?"
     "fwListNaviBtn1=1&"
     "fwListNowPage=1&"
     "fwListLeftPage=" + str(pageno) +"&" #ページ番号
     "fwListNaviCount=1&"
     "kyujinShuruiHidden=1&" #フルタイム
     "koyoKeitaiHidden=1&" #正社員
     "todofukenHidden=38&" #愛媛県
     "screenId=130050&"
     "xab_vrbs=detailJokenDispButton,commonNextScreen,detailJokenChangeButton,commonDetailInfo")

情報を取得するURLを作成します。普通に検索しただけではURLが出てこないので、ソースと下記ページを参考に作りました。

ハローワークの一覧を簡易クロールして求人ページのURLを抽出する

今回は「フルタイム」「正社員」「愛媛県」の求人を指定しました。それぞれの数値はソースなどで確認してください。また、URLの前半部分の「13050」とscreenIdは変更することがあるようです。

・表の取得
df_tmp=pd.read_html(url,match="求人番号",header=0)
df=df_tmp[0]

作成したURLからread_htmlで表を取得します。read_htmlの使い方は以前書きました。

プログラミング学習:pandasでweb上の表を取得する。(python)

read_htmlでは、webページ上の表を一つずつリストとして取得します。上記記事ではリスト番号から目的の表を探しましたが、今回は match="求人番号"で"求人番号"という言葉が含まれている表だけを取得しています。header=0で1行目を列名として使います。

df=df_tmp[0]で目的の表を取り出し。match指定していしているので目的の表1つだけがdf_tmpに取得されているはずです(要確認)

・複数ページ取得
tables=pd.DataFrame()

for pageno in range(1,4):
    print(pageno)
    url=("https://www.hellowork.go.jp/servicef/130050.do?"
       "fwListNaviBtn1=1&"
       "fwListNowPage=1&"
       "fwListLeftPage=" + str(pageno) +"&"
       "fwListNaviCount=1&"
       "kyujinShuruiHidden=1&" #フルタイム
       "koyoKeitaiHidden=1&" #正社員
       "todofukenHidden=38&" #愛媛県
       "screenId=130050&"
       "xab_vrbs=detailJokenDispButton,commonNextScreen,detailJokenChangeButton,commonDetailInfo")
    
    df_tmp=pd.read_html(url,match="求人番号",header=0)
    tables=tables.append(df_tmp[0]).reset_index(drop=True)
    
    sleep(1)


1~3ページ目まで取得する例です。各ページの表をtablesにappendで結合します。ページ移行時にsleepで1秒待機しています。

出力(一部)
Unnamed: 0NO求人番号職種雇用形態/賃金(税込)就業時間/休日/週休二日産業沿線/就業場所受理日
0NEW!◎2138010- 23863381一般作業正社員/206,100円~274,800円変形 1ヶ月単位1)08:15~17:00/日他/その他建設業のうち一般土木建築工事業愛媛県伊予郡松前町平成30年7月10日
1NEW!◎2238010- 23866581運転手(大型)正社員/250,000円~400,000円変形 1ヶ月単位1)08:00~17:00/他/その他運輸業,郵便業のうち特定貨物自動車運送業愛媛県松山市平成30年7月10日
2NEW!◎2338010- 23868781介護支援専門員(施設)正社員/165,000円~220,000円変形 1ヶ月単位1)08:30~17:30/他/その他医療,福祉のうち老人福祉・介護事業愛媛県東温市平成30年7月10日
3NEW!◎2438010- 23886881大型車両整備士正社員/287,086円~337,098円1)08:30~17:30/日祝他/その他運輸業,郵便業のうち一般貨物自動車運送業愛媛県東温市平成30年7月10日
4NEW!◎2538010- 23893781看護師・准看護師正社員/190,000円~240,000円変形 1ヶ月単位1)08:45~18:152)08:45~18:303)08:45~12:4...医療,福祉のうち一般診療所愛媛県松山市平成30年7月10日


無事、一覧表の取得が出来ました。これを整理して、ざっくりどんな業種・地域に求人が多いかや賃金の傾向などを見てみたいと思います。


参考:

2018年7月6日金曜日

エネルギー基本計画(案)と閣議決定後の正式版の単語出現頻度を比較する。(python,自然言語処理,janome)

エネルギー基本計画(案)の特徴を見てみる。としてブログを書いてきましたが、2018年7月3日に第5次エネルギー基本計画が閣議決定されました。

経済産業省:新しいエネルギー基本計画が閣議決定されました

今回はエネルギー基本計画(案)と閣議決定されたエネルギー基本計画で、単語の出現頻度の差を見てみます。

単語出現頻度の数え方の詳細はこちらを参照ください。

使用データ(pdf)

エネルギー基本計画(案)
第5次エネルギー基本計画


・インポート
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import *
import pandas as pd
・単語(複合名詞を考慮)の出現回数カウント関数
def words_count(text):
    
    token_filters = [
        CompoundNounFilter(),
        POSKeepFilter('名詞'),
        POSStopFilter(["名詞,代名詞","名詞,非自立","名詞,数"]),
        TokenCountFilter()]


    a = Analyzer(token_filters=token_filters)
    counts=pd.DataFrame()

    for count in a.analyze(text):
        counts=counts.append([list(count)],ignore_index=True)
    
    counts.columns=["単語","回数"]
    counts=counts.sort_values(by="回数", ascending=False).reset_index(drop=True)
    return counts

janome Analyzer CompoundNounFilterで複合名詞を考慮して形態素解析、TokenCountFilterで数え上げを行います。名詞(代名詞、非自立名詞、数は除外)のみをフィルタで抽出しています。

・案、正式版それぞれに単語数え上げ、結合、差を計算
draft_words=words_count(draft).columns=["単語","回数_案"]
official_words=words_count(official).columns=["単語","回数_正"]

words_count=pd.merge(draft_words,official_words, on='単語',how="outer").fillna(0)
words_count=words_count.sort_values(by="差", ascending=False).reset_index(drop=True)

draftにエネルギー基本計画(案)、officialに正式版エネルギー基本計画のpdfから抽出したテキストがそれぞれ入っています。これにwords_countの関数を適応して2つの表を作ります。

この2つの表をmergeで"単語"列をキーに結合。このとき how="outer"を指定して、どちらか一方のみに出てくる単語も組み込みます。このどちらか一方のみに出てくる単語は欠測値(NaN)となるので、fillna(0)で0に置換しています。

その後、"回数_案"と"回数_正"の出現回数の差を絶対値で計算し、"差"列を作って、差が大きい順に並べ替えしました。

・出力
単語回数_案回数_正差
0炭素化108.0118.010.0
1我が国147.0156.09.0
2世界58.066.08.0
3相手国4.011.07.0
4パリ協定13.019.06.0
5観点40.046.06.0
6地域73.079.06.0
7取組178.0183.05.0
8平和利用5.00.05.0
9炭素3.08.05.0
10ニーズ6.010.04.0
11選択肢40.044.04.0
12積極的36.040.04.0
13強化84.088.04.0
14支援17.021.04.0
15提案8.012.04.0
16日本27.031.04.0
17再生可能エネルギー122.0126.04.0
18平和的利用0.04.04.0
19両立8.05.03.0
20共生9.012.03.0
21CO2削減5.02.03.0
22災害時7.010.03.0
23エネルギー転換45.048.03.0
24CO2削減目標0.03.03.0
25水素等0.03.03.0
26炭素型インフラ輸出0.03.03.0
27効率火力発電4.01.03.0
28排出削減6.09.03.0
29達成10.013.03.0
30水準11.014.03.0
31可能56.059.03.0
32炭素技術1.04.03.0
33必要149.0152.03.0
34大幅12.015.03.0
35導入76.079.03.0
36活用115.0118.03.0
37関係省庁間3.01.02.0
38効率石炭火力発電1.03.02.0
39野心的11.09.02.0
40SDGs1.03.02.0
41確認11.09.02.0
42変動20.022.02.0
43すべて2.00.02.0
44評価19.021.02.0
45牽引3.05.02.0
46形20.018.02.0
47分散型エネルギーシステム21.023.02.0
48確実18.020.02.0
49規制基準3.05.02.0
50関係自治体4.06.02.0
51リード7.09.02.0
52新陳代謝1.03.02.0
53国民23.025.02.0
54整合的4.06.02.0
55普及24.026.02.0
56石炭18.016.02.0
57火力依存2.00.02.0
58揚水等2.04.02.0
59従来13.015.02.0
60水電解システム1.03.02.0
61全て9.011.02.0
62目標13.015.02.0
63臨界以下1.03.02.0
64整合0.02.02.0
65アンモニア0.02.02.0
66発展シナリオ0.02.02.0
67課題解決4.06.02.0
68調整12.014.02.0
69エネルギーシステム6.08.02.0
70地球温暖化対策14.012.02.0
71コージェネレーション14.016.02.0
72追求15.017.02.0
73選択15.017.02.0
74表明1.03.02.0
75臨界圧以下2.00.02.0
76国際展開16.014.02.0
772度シナリオ2.00.02.0
78依存17.015.02.0
79関係府省庁間0.02.02.0
80現状18.020.02.0
81着実34.036.02.0
82整備54.056.02.0
83原則6.08.02.0
84海外35.033.02.0
85向上47.049.02.0
86化石燃料28.026.02.0
87原子力規制委員会6.08.02.0
88効率的36.034.02.0
89省エネルギー技術5.03.02.0
90対応73.075.02.0
91連携37.039.02.0
92安全性31.029.02.0
93課題84.086.02.0
94実施31.033.02.0
95施策6.08.02.0
96国際競争力4.06.02.0
97持続可能6.08.02.0
98SS6.08.02.0
99実現121.0123.02.0

前回も書きましたが、janome AnalyzerのCompoundNounFilterでは、名詞+名詞=名詞として、複合名詞を作ります。このため、脱、低、第などの接頭詞がつくと名詞と見なされずに途中で途切れてしまいます。また、過剰に名詞化されているものもあります。

上の表で、案と正式版で最も差が大きいのは「炭素化」ですが、これは「低炭素化」「脱炭素化」の「低」「脱」が名詞ではないため抜けているようです。

「炭素型インフラ輸出」は「低炭素型インフラ輸出」で、案では出ていなかった言葉です。「CO2削減目標」も案にはなかった言葉。逆に「火力依存」「2度シナリオ」は案にはあったものの、正式版にはなくなりました。

「平和利用」は「平和的利用」に言い換えられています。

複合語をちゃんと考慮できていないので参考程度ですが、なかなか面白い結果になりました。次回以降、もう少し複合語の抽出方法を検討してみます。


参考:
資源エネルギー庁:エネルギー基本計画(案)
第5次エネルギー基本計画(PDF形式:951KB)

janome ドキュメント
け日記:Python janomeのanalyzerが便利

Janomeで形態素解析をやってみる。
エネルギー基本計画(案)の特徴を見てみる。その1 wordcloud
エネルギー基本計画(案)の特徴を見てみる。その2 名詞でwordcloud
janomeの形態素情報を保存する。
エネルギー基本計画(案)の特徴を見てみる。その3 単語の出現回数を数える
janome Analayzerで複合語(複合名詞)を考慮して形態素解析を行う。
//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語