意味のないことをひらすらやってます。
必要となる知識
- 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のリストからランダムに要素を取得
それで今回やりたいのは、ある県に住んでいる人が何人なのかを可視化したいというもの。
サンプルコード
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
今回は数十件なので微妙だが。
まとめ及び雑感
今回は県だったが、like演算子を使っているため、いろいろなことに対応できるはず。
こういうのをやるときにたびたび思うが、データを扱うなら、扱うデータを用意する手間がかかる。そのあたりもpythonを使いまくってできるだけ負担を減らしたいところ。エクセルでいいだろって感じがしなくもない。
コメント