ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

機械学習・クラスタリングを理解するまで4日目

スポンサードリンク

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

機械学習の本。P44のことをしたかった。

本はRで書いてあったが、Rわかんないので(試してみてもよかったが)Pythonでやることにした。

csv読み込み -> グラフを作成。なんてことをしたかったが、そもそも数値になっていないのでグラフ化できなかった。

DB使わないといけんかなーと。思いながら調べて見るとpandasってのが便利っぽい。

pandasとは?

Pandasは、プログラミング言語Pythonにおいて、データ解析を支援する機能を提供するライブラリである。 特に、数表および時系列データを操作するためのデータ構造と演算を提供する。

wikiより

さらに

web-analytics-or-die.org

PythonでRっぽいことができるpandas

おっ。ばっちおkじゃないですかね。

試してみる

http://gihyo.jp/book/2015/978-4-7741-7631-4/support

このページからclick_data_sample.csvをダウンロード

# ライブラリをimport
>>> import pandas as pd

# csvを読み込み
>>> csv = pd.read_csv('./click_data_sample.csv', header=False) # Falseにすると最初の一行目を列名として読み込み

# 最初の2行目まで
>>> csv.head(2)
              click.at  user.id  campaign.id
0  2015-04-27 20:40:40   144012  Campaign077
1  2015-04-27 00:27:55    24485  Campaign063


# 最後から2行目
>>> csv.tail(2)
                   click.at  user.id  campaign.id
327428  2015-05-03 10:51:37   104666  Campaign108
327429  2015-05-03 22:26:20   154544  Campaign041

# カラムを指定して降順ソート
>>> csv.sort(columns='user.id').head(5)
                   click.at  user.id  campaign.id
159801  2015-04-30 13:53:51        4  Campaign063
159802  2015-04-30 17:52:55        4  Campaign038
67663   2015-04-28 17:57:35        4  Campaign074
114562  2015-04-29 02:39:32        4  Campaign063
67662   2015-04-28 12:58:00        4  Campaign074

この辺はLinuxのコマンドみたいだね

要約統計量

>>> csv.describe()
             user.id
count  327430.000000
mean    83915.918853
std     48937.088017
min         4.000000
25%     40712.000000
50%     84169.000000
75%    126177.000000
max    169570.000000

・・・・・・・・・・・・・・・・・?(´・ω・)

なんだこれは?

調べてみるとどうやらあらかたの情報を集計とか平均をとったサマリらしい

>>> csv.describe()
             user.id
count  327430.000000 # 合計
mean    83915.918853 # 平均(averageじゃないのか)
std     48937.088017 # ?
min         4.000000 # 最小値
25%     40712.000000 # ?
50%     84169.000000 # ?
75%    126177.000000 # ?
max    169570.000000 # 最大値

?マークの箇所はよくわからない。

グルーピング

>>> csv.groupby([ 'user.id']).sum()
                                                  click.at  \
user.id                                                      
4        2015-04-27 20:48:042015-04-28 12:58:002015-04-...   
9                   2015-04-28 22:24:552015-04-29 14:13:11   
10       2015-04-28 22:25:512015-04-28 22:27:212015-04-...   
12       2015-04-28 07:10:152015-05-02 06:51:182015-05-...   
13       2015-04-27 21:02:342015-05-02 21:41:192015-05-...   
16       2015-04-27 10:57:072015-04-29 11:50:472015-05-...   
19                                     2015-04-28 14:09:11   
...
169547                   Campaign025Campaign072Campaign025  
169548                   Campaign128Campaign050Campaign128  
169553                                         Campaign045  
169557                                         Campaign067  
169560                                         Campaign108  
169561                                         Campaign061  
169562                                         Campaign003  
169564                              Campaign062Campaign062  
169570                   Campaign082Campaign082Campaign082  

[75545 rows x 2 columns]

なんか汚ねぇ。。。。なんだこれはどう読むんだい?

あ、そういうことか

どうやら、sum()はカラムの値を合計するみたいだ。俺はカウントしたいんだった。試しにcount()って関数を呼んでみると呼ぶことができた!

>>> csv.groupby('user.id').count()
         click.at  campaign.id
user.id                       
4               7            7
9               2            2
10              4            4
12              3            3
13              4            4
16              3            3
19              1            1
20              2            2
...

なんか列がじゃまだね。

>>> csv.groupby('user.id')['user.id'].count()
user.id
4           7
9           2
10          4
12          3
13          4
16          3
19          1
20          2
23          1
29          2
33          1
34         11
36          1
37          1
38          1

正しい使い方かどうか知らないが、これで見やすくなった

よし、これで数値化できたのでグラフが作れそうです。

参考URL

sinhrks.hatenablog.com web-analytics-or-die.org