2016年8月31日水曜日

【R】k-meansで統計的に適切なクラスタ数を選択する(Gap統計量:clusGap)

目的:統計的に適切なクラス多数を指定してk-meansをおこないたい
方法:clusGap(data, kmeans, k.max = 10, B = 10, verbose = interactive())
補足:library(cluster)が必要

dataはデータ、kmeansはk-means、K.maxはクラスタ数の最大値、Bはブートストラップ回数*

*ブートストラップ回数とは
https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%88%E3%82%B9%E3%83%88%E3%83%A9%E3%83%83%E3%83%97%E6%B3%95

> result_gap <- clusGap(df.sample_data, kmeans, K.max = 80, B = 1000, verbose = interactive())
Clustering k = 1,2,..., K.max (= 80): .. done
Bootstrapping, b = 1,2,..., B (= 1000)  [one "." per sample]:
.................................................. 50 
.................................................. 100 
.................................................. 150 
.................................................. 200 
.................................................. 250 
.................................................. 300 
.................................................. 350 
.................................................. 400 
.................................................. 450 
.................................................. 500 
.................................................. 550 
.................................................. 600 
.................................................. 650 
.................................................. 700 
.................................................. 750 
.................................................. 800 
.................................................. 850 
.................................................. 900 
.................................................. 950 
.................................................. 1000 
> plot(result_gap)

下記はサンプルデータの結果

上の結果だと、20付近まで数値が右肩上がりに上昇しているが、それ以降は比較的停滞傾向にある。そのため、クラスタ数は20で良いと考えられる。


◆参考サイト
R K-means法のクラスタ数を機械的に決定する方法
http://www.trifields.jp/how-to-decide-number-of-clusters-in-r-1677

2016年8月24日水曜日

【トレジャーデータ】アクセスログから毎月月初に自動で前月分の各ユーザのログイン日数を集計する(TD_TIME_TRUNC)

クエリは以下の通り(毎月自動実行は「Schedule」で別途設定)

SELECT
  user_id,
  COUNT(1) AS login_days
FROM (
    SELECT
      date_time,
      user_id
    FROM
      logdata
    WHERE
      TD_TIME_RANGE(TD_TIME_PARSE(date_time),
        TD_DATE_TRUNC('MONTH',TD_TIME_ADD(TD_SCHEDULED_TIME(),
          '-1d')),
        TD_SCHEDULED_TIME(),
        'jst')
    GROUP BY
      date_time,
      user_id
  )
GROUP BY
  user_id
ORDER BY
  login_days DESC

もし、過去1ヶ月分ではなくて30日分であれば、
TD_DATE_TRUNC('MONTH',TD_TIME_ADD(TD_SCHEDULED_TIME(), '-1d')),

TD_TIME_ADD(TD_SCHEDULED_TIME(), '-30d'),
にするとできる。

◇参照URL

TD_DATE_TRUNCの詳細については下記参照
http://qiita.com/KamekoKameKame/items/11b9b16806754cb44ddf

その他の定義関数については下記参照
http://mototeds.blogspot.jp/2016/06/udfsuser-defined-functions.html

2016年8月23日火曜日

R 高速に大規模データのクロス集計をおこなう(tally, spread)

【目的】 Rで高速に大規模データのクロス集計をしたい
【方法】 tallyとspredを使う
【補足】 library(dplyr)とlibrary(tidyr)が必要

df.cross <- df.data %>%
  group_by(x, y) %>%
  tally %>%
  spread(y, n)

#データが無い場合はNAとなるため必要に応じて0にする
df.cross[is.na(df.cross)] <- 0

◇参照URL
クロス集計~公式:dplyr + tidyr = (xtabs|(f)table)
http://d.hatena.ne.jp/teramonagi/20150312/1426109245

2016年8月10日水曜日

【文献紹介】分析手法一覧、『これからデータ分析を始めたい人のための本』

分析手法一覧

『これからデータ分析を始めたい人のための本』, p93参照

分かりやすい!

対象データ概念分析手法事例
数理統計学1変量(1つ)記述統計学(データのばらつきや傾向を見る)分布と代表値要約統計量品質管理 RFM分析
ロングテール分析
度数集計
ヒストグラム
推測統計学(確率論を用いてデータを推測する)頻度論パラメトリック検定実験計画法 臨床試験
副作用の特定
ノンパラメトリック検定
点推定
区間推定
主観論ベイズ確率迷惑メールフィルタリング
多変量(2つ以上)探索的データ解析・機械学習 (過去から現在までのデータについて意味ある傾向や外れ値等を探し出す)教師無(データをある基準に基づくことなく分類・解析する)主成分分析価格最適化 行列・渋滞回避分析
マーケットバスケット分析
顧客セグメンテーション
レコメンデーション
クロスセルアップセル分析
系統樹(生命科学)
アンケート分析
因子分析
相関分析
アソシエーション分析
コレスポンデンス分析
数量化理論Ⅲ類
多次元尺度構成法
階層型クラスタリング
K-means法
自己組織化マップ
教師有 (データをある基準に基づいて分類・解析する)強調フィルタリング顧客離脱予測モデル クレジットカードの不正検知
キャンペーンの効果測定
店舗別売上総量予測
選挙速報
セイバーメトリクス
物流最適化
ソーシャルメディアアナリティクス
画像解析(年齢推定)
画像診断
予防医療
遺伝子発見
犯罪プロファイリング
ニューラルネットワーク
決定木分析
K-近傍法
一般線形モデル (正規分布を前提とした線形モデル)単回帰分析
分散分析
数量化理論Ⅰ類
重回帰分析
正準相関分析
共分散構造分析
一般化線形モデル (正規分布以外の分布を扱えるように、一般線形モデルを拡張したモデル)ロジスティック回帰分析
対数線形モデル
数量化理論Ⅱ類
判別分析
生存時間分析
サポートベクターマシン

2016年8月3日水曜日

【R】回帰分析などの結果を個別に出力したい

#下記のような回帰分析をおこなったとき
result <- lm(目的変数カラム ~ 説明変数カラム,data = df.sample)

#下記のような出力を得られる
> summary(result)

Call:
lm(formula = session_num ~ search_num + compe_search_num + publish_period, 
    data = df.kiji_select)

Residuals:
   Min     1Q Median     3Q    Max 
-12574  -1323   -772   -345 365681 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)      495.223086  26.609894   18.61   <2e-16 ***
search_num        -0.037315   0.003511  -10.63   <2e-16 ***
compe_search_num   0.089878   0.004548   19.76   <2e-16 ***
publish_period     2.527575   0.058255   43.39   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4595 on 90724 degrees of freedom
Multiple R-squared:  0.02604, Adjusted R-squared:  0.02601 
F-statistic: 808.6 on 3 and 90724 DF,  p-value: < 2.2e-16

#Estimateのみがほしいとき
> summary(result)$coefficients[,"Estimate"]
                 summary.result..coefficients....Estimate..
(Intercept)                                    495.22308639
search_num                                      -0.03731478
compe_search_num                                 0.08987823
publish_period                                   2.52757539

#Pr(>|t|)のみがほしいとき
> summary(result)$coefficients[,"Pr(>|t|)"]
                 summary.result..coefficients....Pr...t....
(Intercept)                                    3.680971e-77
search_num                                     2.289391e-26
compe_search_num                               9.528811e-87
publish_period                                 0.000000e+00


◇参考サイト:Rから回帰分析のいろいろな情報を取得する方法
http://am-yu.net/2013/12/03/r-linear-regression/