WICの中から

機構設計者が株式投資や育児に奮闘するblog

Kindle蔵書一覧をWord Cloudで可視化して、自分の嗜好を客観視してみる

f:id:temcee:20200906121826p:plain

からあげ (id:karaage) さんがKindleの蔵書一覧をデータ分析していて面白かったので、自分も試してみることにしました。

karaage.hatenadiary.jp

データをグラフ化して諸々の項目を観察するのは色々と発見がありそうだと思う一方、自分の嗜好を、どんなタイトルに惹かれやすいのかパッと見で掴みたいなぁという思いもあり。購入タイトルをWord Cloudで可視化してみました。

Word Cloudは、出現頻度の高い単語を大きさで図示する手法です。今回はPython使って作りました。Word Cloudのライブラリがありますし、文章から単語を抜き出す形態素解析もネットに情報が沢山ありますからね。

Kindle蔵書一覧の取得とCSVの整理

qiita.com

こちらを参照に蔵書一覧を入手したら、著者や購入日など、タイトル以外要素を削除します。
ついでに、シリーズものも1巻だけにして間引きしておきます。じゃないと連載長い漫画タイトルがでかでか表示されるだけですからね。

自分のレベルだとpythonで生データ処理するよりエクセルでゴリゴリcsvいじったほうが早いので、ここはマニュアルで泥臭く処理します。気の利いた方法(特にシリーズものの間引き方法)あれば教えて下さい。

各種ライブラリのインストール

pip install janome
pip install wordcloud

コード

# coding:utf-8
import csv
import codecs
from janome.tokenizer import Tokenizer
from wordcloud import WordCloud
from collections import Counter, defaultdict

# 名詞だけ抽出、単語をカウント
def counter(texts):
    t = Tokenizer()
    words_count = defaultdict(int)
    words = []
    for text in texts:
        tokens = t.tokenize(text)
        for token in tokens:
            # 品詞から名詞だけ抽出
            pos = token.part_of_speech.split(',')[0]
            if pos in ['名詞']:
                # 実際の結果から思惑に沿わない単語を削除
                if token.base_form not in ["コミックス", "文庫", "無料", "新書", "限定", "シリーズ", "ため", "たち", "期間", "試し"]:
                    words_count[token.base_form] += 1
                    words.append(token.base_form)
    return words_count, words

# 文字コードUTF-8だと化けたのでShift-JISで読み込み、それでも読めないものはignoreで無視
with codecs.open('./Kindle_croud.csv', 'r', "Shift-JIS", "ignore") as f:
    reader = csv.reader(f, delimiter='\t')
    texts = []

    for row in reader:
        if(len(row) > 0):
            text = row[0]
            # きちんと読み込めてるか確認
            print(text)
            texts.append(text)

words_count, words = counter(texts)
text = ' '.join(words)

# fontに注意
wordcloud = WordCloud(background_color="white",
                      font_path='C:\Windows\Fonts\meiryo.ttc', width=900, height=500).generate(text)

wordcloud.to_file("./wordcloud_sample.png")

コードは基本ネットに転がっているものの継ぎ接ぎでなんとかなったのですが、csv読み込み文字コードで詰まったのでご注意を。   UTF-8だと文字化けし、Shift-JISでもエラーが発生。ignoreを追加して、読めないものを無視することでようやく回避できました。

with codecs.open('./Kindle_croud.csv', 'r', "Shift-JIS", "ignore") as f:

あと、Kindleは蔵書タイトル以外のものもタイトルにひっついてきます。タイトル以外の要素は極力削除したかったので、いくつかの単語は読み込まないよう設定しています。

 if token.base_form not in ["コミックス", "文庫", "無料", "新書", "限定", "シリーズ", "ため", "たち", "期間", "試し"]:

データ読み込み時にreplacestripで出版社とか括弧内の文字は削除したかったのですが、上手く行かなかったので妥協と力技で解決です。

出来上がり、ドン引き

こうして出力されたのが記事頭に出したこれなのですが...

f:id:temcee:20200906121826p:plain

仕事...世界...経済...投資...うわぁ…って感じですね。絶対楽しい人生歩めてないだろ、的な。

コミックス各種をタイトルから排除できなかったので、どこの漫画をよく買ってるのかも赤裸々です。HARTA COMIXが頭1抜けていますね。意識してなかったですが、下記らへんがHARTA COMIXです。

ダンジョン飯 1巻 (HARTA COMIX)

ダンジョン飯 1巻 (HARTA COMIX)


ヒナまつり 1 (HARTA COMIX)

ヒナまつり 1 (HARTA COMIX)


ハクメイとミコチ 1巻 (HARTA COMIX)

ハクメイとミコチ 1巻 (HARTA COMIX)

小さい文字にもフィーチャーしていくと、時間とかシンプルとかって単語が見られます。これも基本仕事関係ですが、効率よく仕事をこなしたいという思いが透けて見えますね。なお、実務に役に立っているかは不明です。役立っていることにしておきましょう。

蔵書数と毎年の購入数

ここらへんのやり方がからあげさんの記事を参照です。(ぶん投げ)

蔵書数は528で、購入数は下記の通り。

f:id:temcee:20200906135156p:plain

2013年から2016年にかけてガクッと低下して、そこからちょっとずつ盛り返しつつある感じですね。
2013-2014あたりは漫画もそこそこ買っていたのが蔵書数に寄与していたんだと思います。ここらへんで結婚して子供産まれたり転職したりと、人生の転換期的なものが立て続けに起こり、その結果がドラスティックに現れている感じです。

まとめ

Kindleの蔵書タイトルから、自分がどんなタイトルに惹かれる傾向にあるのか見てみました。

思ってた以上に仕事に毒されているなー、って感想です。もうちょっと昔は漫画も結構読んでいたし、さらに前になると小説に手を出してたりしたんですが、、おとなになるって怖いですね。 人生を豊かにするためにも、もっと趣味的な本を消化していくべきだなって気づきが得られました。いやほんと、人間しらないうちに頭がガッチガチになるものですね、コワイ!

参考リンク

Kindle蔵書一覧を取得する方法 - Qiita

Kindleの蔵書リストをGoogle Colaboratoryでデータ分析してみた - karaage. [からあげ]

Word Cloudでツイートを可視化してみた(python) - Qiita

【Python】ブログの特徴をワードクラウドで可視化しよう!【WordPress】 | みんな栄養に頼りすぎてる

Word Cloudで文章の単語出現頻度を可視化する。[Python] - Qiita

もう怖くない!!Pandasデータ読み込みにおける文字コードの指定 – GeoSpatial Computing LAB Note