Weitere ähnliche Inhalte
Ähnlich wie ビジネス活用事例で学ぶデータサイエンス入門 #6
Ähnlich wie ビジネス活用事例で学ぶデータサイエンス入門 #6 (20)
ビジネス活用事例で学ぶデータサイエンス入門 #6
- 2. 自己紹介
しまじろう よう
SIer で SE(金融・情報系)
個人事業主
ソーシャルゲームベンチャーでデータ解析者・PM を担当
3月末まで不動産仲介プラットフォーム企業で解析基盤周り
のお仕事をしていました
C#/Ruby/R/Rails/DB
数学/統計・機械学習/経営/マーケティング
※中小企業診断士を取得したい
Twitter: you_s1025
2
- 5. 前処理
# 課金データの結合
dau2 <- merge(dau, dpu[, c("log_date", "user_id", "payment"), ], by = c("log_date", "user_id"), all.x = T)
# 課金フラグの付加 ※1円以上の課金があれば 1
dau2$is_payment <- ifelse(is.na(dau2$payment), 0, 1)
# 課金額のクレンジング(NA 0) ※NA を 0 に変換
dau2$payment <- ifelse(is.na(dau2$payment), 0, dau2$payment)
# yyyy-mm カラムの付加 ※日付項目の 1∼7 文字目を切り出し
dau2$log_month <- substr(dau2$log_date, 1, 7)
# 月次集計 ※年月xユーザID の単位で課金額の合計とアクセス回数を算出
mau <- ddply(dau2, .(log_month, user_id), summarize, payment=sum(payment), access_days=length(log_date))
mau
log_month user_id payment access_days
2013-05 65 0 1
2013-05 115 0 1
⋮ ⋮ ⋮ ⋮
2013-05 5332 2666 31
5
- 6. ランキング上位ユーザの抽出
# kmeans を用いたランキングによるクラスタリングの実行
user.action2 <- ykmeans(user.action, "A47", "A47", 3)
# 描画
ggplot(arrange(user.action2, desc(A47)),
aes(x = 1:length(user_id), y = A47, col = as.factor(cluster), shape = as.factor(cluster))) +
geom_line() +
xlab("user") +
ylab("Ranking point") +
scale_y_continuous(label = comma) +
ggtitle("Ranking Point") +
theme(legend.position = "none")
# ランキング上∼中位者を抽出
user.action.h <- user.action2[user.action2$cluster >= 2, names(user.action)]
6
> table(user.action2$cluster)
1 2 3
2096 479 78
上位
中位
下位
クラスタ毎のユーザ数を表示
- 7. データクレンジング
# 必要なカラムに絞る
user.action.f <- user.action.h[, -c(1:4)]
row.names(user.action.f) <- user.action.h$user_id
# 情報量がゼロに近い変数の除去
nzv <- nearZeroVar(user.action.f)
user.action.f.filtered <- user.action.f[, -nzv]
# 相関の高い変数の除去 ※相関が 0.7 以上の変数を対象
user.action.cor <- cor(user.action.f.filtered)
highly.cor.f <- findCorrelation(user.action.cor, cutoff=.7)
user.action.f.filtered <- user.action.f.filtered[, -highly.cor.f]
7
user.action.f.filtered
A2 A5 A6 A8 A11 A12 A13 A14 …
425530
77
0 10 1 58 19 2 19 13 …
776120 0 9 0 0 38 8 19 10 …
276197 0 7 0 7.25 15 3 11 5 …
- 8. 主成分分析の実行
# 主成分分析の実行
user.action.pca.base <- prcomp(user.action.f.filtered, scale=T)
user.action.pca <- data.frame(user.action.pca.base$x)
# 結果の概要を表示 ※下記の表を参照
summary(user.action.pca.base)
8
PC1 PC2 PC3 PC4 PC5 ・・・ PC19
Standard deviation 2.280 1.511 1.287 1.167 1.075 ・・・ 0.361
Proportion of Variance 0.274 0.120 0.087 0.072 0.061 ・・・ 0.007
Cumulative Proportion 0.274 0.394 0.481 0.552 0.613 ・・・ 1.000
第1・2主成分
累積寄与率(第2行の積み上げ)
特定の主成分までを用いて元の情報量をどの程度説明できているのかを提示
※第1・2主成分だと約40%
※第19主成分までを用いると100% (当たり前)
- 9. クラスタリングの実施
# k-means の実施
keys <- names(user.action.pca)
user.action.km <- ykmeans(user.action.pca, keys, "PC1", 3:6)
# 描画
ggplot(user.action.km, aes(x=PC1,y=PC2,col=as.factor(cluster), shape=as.factor(cluster))) +
geom_point()
9
第1・2主成分でデータ全体をプロット
※累積寄与率が40%程度だがそれなりに分類されている
- 10. レーダーチャートの描画(1)
# クラスタ別に項目ごとの平均値を算出
user.action.f.filtered$cluster <- user.action.km$cluster
clusters <- sort(unique(user.action.f.filtered$cluster))
user.action.f.center <- ldply(lapply(clusters, function(i) {
x <- user.action.f.filtered[user.action.f.filtered$cluster == i, -ncol(user.action.f.filtered)]
apply(x, 2, mean)
}))
# 相関の高い変数を除外 ※理由は不明
df <- user.action.f.center[, -(ncol(user.action.f.center)-1)]
df.cor <- cor(df)
# テキストと異なる結果になったので手動で無理やり合わせる
#df.highly.cor <- findCorrelation(df.cor, cutoff=0.91)
#df.filtered <- df[, -df.highly.cor]
df.highly.cor <- c("A2", "A11", "A13", "A43", "A44", "A51")
df.filtered <- df[, df.highly.cor]
# チャート作成
df.filtered <- createRadarChartDataFrame(scale(df.filtered))
names(df.filtered) <- c("レベル", "救援回数", "被救援回数", "ボス討伐数", "バトル回数", "プレイ回数")
par(family= Ricty") # フォントの指定
radarchart(df.filtered, seg=5, plty=1:5, plwd=4, pcol=rainbow(5))
legend("topright", legend=1:5, col=rainbow(5), lty=1:5)
10