sqlite3 + matplotlib pythonでデータベースを可視化する。

意味のないことをひらすらやってます。

必要となる知識

  • pythonの基礎文法
  • 簡単なsqlの文法
  • matplotlibの日本語化
  • matplotlibのラベルを縦文字にする
  • csvやsqlite等

matplotlibの日本語化

ごちゃごちゃ書いている ブログ 及び Qiitaの記事 があったが2ページ目に超楽勝な方法があった。Anacondaプロンプトで以下。

pip install japanize-matplotlib

pythonの構文の冒頭で

impoort japanize_matplotlib

参考: 「【超簡単】たったの2ステップで matplotlib の日本語表記を対応させる方法 | YOLO – 人工知能の導入録

matplotlibラベルを縦文字にする

こうしろとのこと。ちなみにxが横軸、yが縦軸になるのでxとyを間違えないように。

plt.xticks(rotation=90)

集計の2つの方法

2つある。sqliteのcountをつかうかpythonで普通に集計するか。正直sqliteは構文もあまり使いこなせないし、pythonでやったほうが楽だし、というだけの理由でpythonを使うことに。

sqliteから集計しmatplotlibで可視化

たとえば以下のように 「人と都道府県」 のデータベースがあったとする。ちなみにランダムに人と名前のデータが入ったcsvを生成するコードも作ったのでよろしければ → pythonのリストからランダムに要素を取得
database_pepole_place

それで今回やりたいのは、ある県に住んでいる人が何人なのかを可視化したいというもの。

サンプルコード

import sqlite3
import matplotlib.pyplot as plt
import japanize_matplotlib

# カウント
def count_place(address):
    select = "select * from users where address like ?"
    count = 0
    for row in c.execute(select, ('%'+address+'%',)):
            count += 1
    return count

# 普通に表示
def print_count_place():
    for p in place:
        print(p + ": " + str(count_place(p)))

# matplotlibで表示
def mpl():
    y = []
    for p in place:
        y.append(count_place(p))
    x = range(0, len(y))
    plt.bar(x, y, tick_label = place)
    plt.xticks(rotation=90)
    plt.show()


# 県のリスト
place = [
"北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨木県","栃木県","群馬県",
"埼玉県","千葉県","東京都","神奈川県","新潟県","富山県","石川県","福井県","山梨県",
"長野県","岐阜県","静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県","奈良県",
"和歌山県","鳥取県","島根県","岡山県","広島県","山口県","徳島県","香川県","愛媛県","高知県",
"福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"
]

# データベースに接続
conn = sqlite3.connect("database.sqlite")

# カーソルオブジェクトの作成
c = conn.cursor()

print_count_place()
mpl()

input("exit?: ")

# データベースの切断
conn.close()

このコードで一番ややこしいのは 6~11行目に書いているcount_place()関数だ。sql文にlikeをつかっていてこれを落とし込むのに苦労した。9行目に書いているexecute()の部分は決まり文句と思っていいだろう。

参考 → 「Python+SQLiteのlike句で%を使う場合のプレースホルダの書き方 – Aimless Blog

matplotlib

今回は数十件なので微妙だが。
matplotlib_place

まとめ及び雑感

今回は県だったが、like演算子を使っているため、いろいろなことに対応できるはず。

こういうのをやるときにたびたび思うが、データを扱うなら、扱うデータを用意する手間がかかる。そのあたりもpythonを使いまくってできるだけ負担を減らしたいところ。エクセルでいいだろって感じがしなくもない。


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78