pandasでグラフを描くときのTips

pandasでDataFrameとしてデータをインポートしてから、とりあえずグラフ化して分布を確認したいことがよくあります。
そのときに個人的によく使うコードをメモ。


細かい設定とかでビジュアル整えようと思ったら、いくらでも設定あるらしいのですが、実際にpythonでどこまで労力をかけて可視化を努力するかが問題なんですよね。

個人的には、pythonでの可視化は、ちゃんとしたデータの可視化というよりは、自分で分析の方針を立てるための事前調査とかのレベルで使ってます。つまり、細かいところにはあまりこだわらず、自分でデータの傾向が読み取れればそれでよいというレベル。
他人に共有したり、レポーティングしたりする場合は、pythonでのグラフも使いますが、必要に応じてtableauなどの別ルーツを使ったりもします。

大体、SQLでアクセスしたデータをDataFrameとしてpythonで読み込み、いろいろ可視化してみる(データの分布自体の可視化)→統計モデリング機械学習→結果をまた可視化(パラメータの分布を可視化)という感じです。


pd.DataFrame.plot()メソッド

まずは準備としてライブラリをインポートします。
※jupyter notebookで書くのを前提にしています。一応。
データは適当にDataFrameを作成。

In [1]: import matplotlib.pyplot as plt
        import pandas as pd
        import seaborn as sns
        sns.set_style('whitegrid')
        %matplotlib inline
        #ライブラリのインポートとか

In [2]: df_sample = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])
        df_sample.columns = ['a','b','c']
        df_sample
        #適当なデータフレームを作成
out [2]: 
   a b c
ーーーーー
0| 1 2 3
1| 4 5 6
2| 7 8 9

 
DataFrameの一番簡単な可視化は、.plotメソッド。
デフォルトでは線グラフで描画されます。

df_sample.plot()

f:id:spitta8823:20170614015741p:plain
これだけで最低限の可視化は出来ます。

棒グラフ

何も考えずに棒グラフにしたい場合。

df_sample.plot(kind='bar')

f:id:spitta8823:20170614015755p:plain

ヒストグラム

値の度数分布を可視化したい場合。

df_sample.plot(kind='hist',bins=10)

引数binsに、分布をいくつに分解したいかを入力します。

 
また、ヒストグラムに関しては、matplotlib.pyplotを使って下記のような書き方もよくします。データによりますが、主にいくつかの系列別に分布を可視化したい場合に使います。
多少複雑になるので、DataFrameのメソッドを使うよりも小回りが効く感じです。

In [3]: df_sample = pd.DataFrame([[1,1,1,1,1,1,2,2,2,3,3,4,5,6,7,8,9,10,11,12],[1,1,1,1,1,2,2,2,3,3,3,4,5,6,7,8,9,10,11,12]])
        df_sample = df_sample.T
        df_sample.columns = ['a','b']
        df_sample
        #ヒストグラム的な適当なサンプルデータ
out[3]: 
   a b
ーーー
0| 1 1
1| 1 1
2| 1 1
3| 1 1
4| 1 1
5| 1 2
6| 2 2
7| 2 2
8| 2 3
9| 3 3
10| 3 3
...

In [4]: plt.hist(df_sample['a'], bins=12, alpha=0.2, histtype='stepfilled', color='r', range = (0, 12))
        plt.hist(df_sample['b'], bins=12, alpha=0.2, histtype='stepfilled', color='b', range = (0, 12))
        plt.xlabel('x_label')
        plt.ylabel('y_label')
        plt.title('Title')
        plt.legend(['a','b'])
        #matplotlib.pyplotで描画

plt.hitsでヒストグラムを描画して、引数として、alphaはグラフの透過度です。
plt.legend()では、系列と色の関係の説明を付けてます。

情報収集用ニュースサイト

最近、会社のチャットのスレッドに流す用のニュース情報を探すことが多いので、情報収集できるサイトをいくつか探してブックマークしているのですが、その紹介を。
データサイエンス系、物理系、科学系、ハードウェア系など色々スレッドはあって、実務と直接関係ない情報でも興味あればとりあえず流している感じです。ただ、特に最近は基礎科学の情報でも比較的すぐに実用化されることが多い(ような気がする)。技術の進歩が早いので、常に先端のトピックをキャッチアップしていることは結構必要だったりする(ような気がする)。
 
英語のサイトが多いのは、日本語のサイトに載る情報は大体誰かに先に情報提供されてしまうので、先に情報をキャッチアップしようとすると、必然的に英語ソースになってしまうからです。面白くてインパクトのある情報の提供合戦になっている感があります。
 

  • 物理学系

www.symmetrymagazine.org
 
 
http://physicstoday.scitation.org/journal/ptophysicstoday.scitation.org
 
 
www.quantamagazine.org
 
 
physicsworld.com
 
 

  • 科学全般系

www.sciencedaily.com
 
 

これらのニュースサイト以外に、主要な論文の要約速報的な情報が得られるサイトが欲しいのですが、専門性が高まるにつれて情報ソースが論文そのものになってしまうので、なかなか難しいですね。ジャーナル読めってことになるんでしょうが、ジャーナル、学会、大学を横断して最新の情報をサマってくれているようなサイトないもんでしょうかねぇ。
あとは、twitterで中の人を情報発信している人をフォローするのが一番近道かも。
情報収集の効率化は、常に課題です。

やりたいこと、連休のお勉強

最近あまり更新できていませんでした。。。
平日は実務のデータ分析のための勉強で忙しく、休日は奥さんと一緒にいろいろ出かけていました。という言い訳です ^^;
 
 
忙しいという言い訳をしてたら一生何もできないということを肝に命じて、時間を作ってコツコツ勉強していかないと。。。
普段の仕事が以前よりもかなりやりたいことに近づいたので、逆に、この仕事をこなしていればいいや的な気持ちになりがちな状況なのですが、本当は今の恵まれた環境をもっと活かして、もっと進んだことをやりたいです。
 
自分の今までの人生の中で、大学〜院生の時期がひたすら自分のやりたいこと(物理)に時間を使えた一番幸せだった時期なのですが、最近もかなり良くなってきました。お給料をもらいながら、統計学機械学習、実務としての分析、プログラミング、関連する学術界の調査などに携わる環境に身を置くことができています。まだまだペーペーなので、一刻も早く今の組織に自分のバリューを出していかないといけないのですが。
 
 
このような環境になってから1ヶ月ほどたったので、最初の緊張感を忘れて時間を浪費していかないように、個人的に今後やっていきたいことを書き出してみました。
実務の中で必要になってくるもの、必ずしもそうでないかもしれないけど長期的に必要になってくると思われるもの、完全に趣味のものがあります。
趣味のやつの最初の2つは、もっと違う観点から、統計学、統計モデリング機械学習を理解したいという意図があります。
あと2、3ヶ月間のうちにもう少し具体的に研究者として携われる領域を見つけて、そこにフォーカスしていきたいです。
 
 
 
<趣味として取り組む>
・情報幾何学の勉強
・物理と機械学習の橋渡し的な何かの勉強
・社会物理学、ネットワーク理論の勉強
量子コンピュータアルゴリズムの研究
 
<実務の中で取り組む>
・実務で論文のネタ探し、論文執筆
pythonでスクラッチ機械学習の実装
・サーバサイドのエンジニアリングの基礎の勉強(実装までいかなくても問題なく会話ができるレベル)
 
 
上記の各々のトピックで、ブログ書くネタができたら随時更新していこうと思います。
とりあえず、GWの連休を利用して上記を調べたいです。