意味のないことをひらすらやってます。
必要となる知識
- 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を使いまくってできるだけ負担を減らしたいところ。エクセルでいいだろって感じがしなくもない。

コメント