注目の投稿

【kepler.gl】コロナ対策による人流の変化も地図上に可視化(各種メディアで報道)

kepler.glのサイト画面 kepler.glを使ってコロナ対策の効果を分析したところ、テレビ、新聞、ネットのメディアから問い合わせや報道依頼が殺到。今も、土日返上で都内や全国の人流変化を分析しています。この記事では人流変化の可視化に便利なkepler.glにつ...

ラベル k-means の投稿を表示しています。 すべての投稿を表示
ラベル k-means の投稿を表示しています。 すべての投稿を表示

2017年3月15日水曜日

【R:自分用】クロス集計、ロジスティック、決定木、コレスポンデンス

#ライブラリを読み込む
library(dplyr)
library(data.table)
library(tidyr)
#
library(rpart) #決定木用
library(rpart.plot) #決定木用
library(partykit) #決定木作図用
#
library(MASS) #コレスポンデンス分析用
library(factoextra) #作図用

#cross集計
dt.cross <- dt.log %>%
  group_by(user_id,name) %>%
  summarise(n=max(value)) %>%
  spread(name,n)
dt.cross[is.na(dt.cross)] <- 0 #NAを0にする

#上記クロス集計に目的変数をjoin
dt.buy_next <- dt.log_next %>%
  group_by(user_id) %>%
  summarise(count = length(user_id))
dt.for_model <- left_join(dt.cross, dt.buy_next, by = "user_id")
dt.for_model$user_id <- NULL
dt.for_model[is.na(dt.for_logit)] <- 0 #NAを0にする

#ロジスティック分析
result <- glm(count ~ .,data = dt.for_model)
summary(result)

#出力
write.csv(summary(result)$coefficients[,"Estimate"],
          "C:/logit_Estimate.csv")
write.csv(summary(result)$coefficients[,"Pr(>|t|)"],
          "C:/logit_Pvalue.csv")

#---
#決定木
#method = "class" yが質的変数 cpは破線と交わる値が理想だが目的に合わせて適時設定
result.tree <- rpart(count ~., data = dt.cross_model, method = "class",cp = 0.002)
print(result.tree)
#検証
printcp(result.tree)
plotcp(result.tree)
#
#作図
plot(as.party(result.tree))


#---
#コレスポンデンス分析
#nfは軸を意味する
result.1 <- corresp(tmp, nf=3)
#
#write results:任意の場所に書き出す
write.csv(result.1$rs,
          "C:/result_1_rs.csv")
write.csv(result.1$cs,
          "C:/result_1_cs.csv")
#
#作図
#一般的な図
#biplot(result.1, xlim = c(-0.8, 0.8), ylim = c(-0.6, 0.6))
#少し見栄えの良い図
fviz_ca_biplot(result.1) + theme_minimal(base_size = 12)
#
#寄与率
result.1.koyuti <- result.1$cor^2
sum(result.1.koyuti)
kiyoritu <- 100*result.1.koyuti / sum(result.1.koyuti)
kiyoritu

2016年10月27日木曜日

【トレジャーデータ】記事別DAU階級推移(SQL:case文を使う)

 閲覧記事のDAUの構造的変化を把握したいときは、各記事をDAU階級*に分けてその変化を見る方法があります。

*DAU階級例
階級UU数(dau)
A10001~
B5001~10000
C1001~5000
D101~1000
E1~100


階級分けはkmeans等を使う場合が多いですが、複数のPJやメディア等を横串で評価する場合は定性評価で統一基準を設けても良いです(と思っています)。

実際には、下記のような集計をおこない階級別の推移を見て、施策の効果や現状の課題等を把握します。

date_timeA_dauB_dauC_dauD_dauE_dau
2016-10-20?????
2016-10-21?????
2016-10-22?????
2016-10-23?????
2016-10-24?????
2016-10-25?????
2016-10-26?????

具体的なSQLの例は下記となります。

データ名:data(すでに各記事のdauを集計済)
データ構造:date_time(yyyy-MM-dd), page_name(記事の名前), dau
補足:集計は度数分布表やヒストグラム作成に用いるcase文を利用

SELECT
date_time,
SUM(CASE
    WHEN dau >= 10001 THEN dau END) AS A_dau,
SUM(CASE
    WHEN dau >= 5001 AND dau < 10000 THEN dau END) AS B_dau,
SUM(CASE
    WHEN dau >= 1001 AND dau < 5000 THEN dau END) AS C_dau,
SUM(CASE
    WHEN dau >= 101 AND dau < 1000 THEN dau END) AS D_dau,
SUM(CASE
    WHEN dau >= 1 AND dau < 100 THEN dau END) AS E_dau
FROM
data
WHERE
--自動集計するためのコード
TD_TIME_RANGE(TD_TIME_PARSE(date_time),
              TD_TIME_ADD(TD_SCHEDULED_TIME(),
                          '-7d'), --7日分のデータを集計
              TD_SCHEDULED_TIME(),
              'jst')
GROUP BY
date_time
ORDER BY
date_time

今回は各記事のDAUを集計していますが、
THEN dau END → THEN 1 else 0 END
とすることで階級別の記事数を集計できます。

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