├── code ├── CorrelationFunction.R ├── chaapter 13 │ ├── myapp │ │ ├── server.R │ │ ├── ui.R │ │ └── www │ │ │ └── bigorb.png │ ├── myshinydashboard │ │ ├── server.R │ │ └── ui.R │ ├── 数据可视化原型 │ │ ├── server.R │ │ └── ui.R │ ├── 渠道用户打分平台 │ │ ├── global.R │ │ ├── rawdata.RData │ │ ├── server.R │ │ └── ui.R │ └── 细分用户平台 │ │ ├── server.R │ │ ├── ui.R │ │ └── userdata.RData ├── chapter10.R ├── chapter11.R ├── chapter2.R ├── chapter3.R ├── chapter4.R ├── chapter5.R ├── chapter6.R ├── chapter7.R ├── chapter8.R └── chapter9.R └── data ├── 第10章 ├── 7日留存率明细.csv ├── data_10.1.csv ├── rawdata.RData ├── 渠道H新增第7日留存用户统计.csv ├── 渠道日概况.csv └── 渠道用户LTV统计.csv ├── 第11章 ├── RFM_data.csv ├── tank_pay.csv ├── 付费总况.csv ├── 日付费转化率.csv └── 经济系统数据.csv ├── 第2章 ├── iris.csv ├── iris.txt ├── sample.xlsx └── unstructuredText.txt ├── 第4章 ├── LTV.csv └── revenue.csv ├── 第5章 ├── 数据转换数据.csv ├── 每日付费及留存数据.csv ├── 活跃用户是否付费数据.csv ├── 玩家玩牌数据.csv ├── 玩家玩牌数据样本.csv └── 问卷调研数据.csv ├── 第6章 ├── logindata.csv ├── 可视化数据.csv ├── 收入数据.csv └── 玩家喜好分析数据.csv ├── 第7章 ├── data_click.csv └── 新手教程路径留存人数统计.csv ├── 第8章 ├── .RData ├── T值.csv ├── car.data ├── 实际留存数据.csv └── 用户流失预测数据.csv └── 第9章 ├── Links.csv ├── Nodes.csv ├── 玩家购物数据.csv └── 道具分类.csv /code/CorrelationFunction.R: -------------------------------------------------------------------------------- 1 | # 自定义相关性函数 2 | ## Correlation matrix with p-values. See http://goo.gl/nahmV for documentation of this function 3 | cor.prob <- function (X, dfr = nrow(X) - 2) { 4 | R <- cor(X, use="pairwise.complete.obs") 5 | above <- row(R) < col(R) 6 | r2 <- R[above]^2 7 | Fstat <- r2 * dfr/(1 - r2) 8 | R[above] <- 1 - pf(Fstat, 1, dfr) 9 | R[row(R) == col(R)] <- NA 10 | R 11 | } 12 | 13 | ## Use this to dump the cor.prob output to a 4 column matrix 14 | ## with row/column indices, correlation, and p-value. 15 | ## See StackOverflow question: http://goo.gl/fCUcQ 16 | flattenSquareMatrix <- function(m) { 17 | if( (class(m) != "matrix") | (nrow(m) != ncol(m))) stop("Must be a square matrix.") 18 | if(!identical(rownames(m), colnames(m))) stop("Row and column names must be equal.") 19 | ut <- upper.tri(m) 20 | data.frame(i = rownames(m)[row(m)[ut]], 21 | j = rownames(m)[col(m)[ut]], 22 | cor=t(m)[ut], 23 | p=m[ut]) 24 | } -------------------------------------------------------------------------------- /code/chaapter 13/myapp/server.R: -------------------------------------------------------------------------------- 1 | shinyServer(function(input,output){ 2 | # 向用户界面输出iris数据表,根据input$n输出行数 3 | output$mytable <- renderTable({ 4 | head(iris,input$n) 5 | }) 6 | # 用用户界面输出箱线图,并根据input$outliers是否输出异常点 7 | output$myplot <- renderPlot({ 8 | boxplot(Sepal.Length~Species,data=iris, 9 | col=rainbow(3),outline = input$outliers) 10 | }) 11 | }) -------------------------------------------------------------------------------- /code/chaapter 13/myapp/ui.R: -------------------------------------------------------------------------------- 1 | library(shiny) 2 | library(shinythemes) 3 | 4 | shinyUI(fluidPage(theme=shinytheme("cerulean"), 5 | titlePanel("My First App"), 6 | sidebarLayout( 7 | sidebarPanel( 8 | numericInput("n","请选择要查看的数据行",value = 6), 9 | checkboxInput("outliers","显示异常点",FALSE), 10 | a(img(src="bigorb.png",height=60,width=60), 11 | href="https://www.rstudio.com/",target="black")), 12 | mainPanel( 13 | strong(h3("这是我的第一个app应用",style="color:violetred")), 14 | h4("如果想学习更多的shiny知识", 15 | span(a("请点击此处",href="http://shiny.rstudio.com/tutorial/"))), 16 | br(), 17 | p("我们将利用鸢尾花数据集进行案例演示"), 18 | tableOutput("mytable"), 19 | column(8,plotOutput("myplot")) 20 | )) 21 | )) 22 | -------------------------------------------------------------------------------- /code/chaapter 13/myapp/www/bigorb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiabiao1602/Game_DataMining_With_R/fc3586dd9032adc364d9c8851521995c1a4d3072/code/chaapter 13/myapp/www/bigorb.png -------------------------------------------------------------------------------- /code/chaapter 13/myshinydashboard/server.R: -------------------------------------------------------------------------------- 1 | shinyServer(function(input,output){ 2 | # 向用户界面输出iris数据表,根据input$n输出行数 3 | output$mytable <- renderTable({ 4 | head(iris,input$n) 5 | }) 6 | # 向用户界面输出箱线图,并根据input$outliers是否输出异常点 7 | output$myplot <- renderPlot({ 8 | boxplot(Sepal.Length~Species,data=iris, 9 | col=rainbow(3),outline = input$outliers) 10 | }) 11 | }) -------------------------------------------------------------------------------- /code/chaapter 13/myshinydashboard/ui.R: -------------------------------------------------------------------------------- 1 | library(shiny) 2 | library(shinydashboard) 3 | 4 | dashboardPage( 5 | dashboardHeader(title = "My First App"), 6 | dashboardSidebar( 7 | sidebarMenu( 8 | menuItem("Data", tabName = "data", icon = icon("table")), 9 | menuItem("Chart", tabName = "chart", icon = icon("line-chart")) 10 | )), 11 | dashboardBody( 12 | tabItems( 13 | # 第一个标签内容 14 | tabItem(tabName = "data", 15 | fluidRow( 16 | box(title="iris数据集",status="success", 17 | solidHeader = TRUE,collapsible=TRUE, 18 | tableOutput("mytable")), 19 | box(title="滑动条",status="primary",solidHeader = TRUE, 20 | collapsible=TRUE,background="purple", 21 | numericInput("n","请选择要查看的数据行",value = 6)) 22 | )), 23 | # 第二个标签内容 24 | tabItem(tabName = "chart", 25 | column(8,plotOutput("myplot"), 26 | checkboxInput("outliers","显示异常点",FALSE)))) 27 | 28 | ) 29 | ) 30 | -------------------------------------------------------------------------------- /code/chaapter 13/数据可视化原型/server.R: -------------------------------------------------------------------------------- 1 | 2 | data(MisLinks) 3 | data(MisNodes) 4 | 5 | function(input, output) { 6 | # 利用lattice包中的绘图函数 7 | output$splom <- renderPlot({ 8 | splom(mtcars[c(1, 3:7)], groups = mtcars$cyl, 9 | pscales = 0,pch=1:3,col=1:3, 10 | varnames = c("Miles\nper\ngallon", "Displacement\n(cu. in.)", 11 | "Gross\nhorsepower", "Rear\naxle\nratio", 12 | "Weight", "1/4 mile\ntime"), 13 | key = list(columns = 3, title = "Number of Cylinders", 14 | text=list(levels(factor(mtcars$cyl))), 15 | points=list(pch=1:3,col=1:3))) 16 | }) 17 | 18 | # 利用ggplot2包中的绘图函数 19 | output$myggplot <- renderPlot(({ 20 | data(singer,package = "lattice") 21 | p <- ggplot(data=singer,aes(x=height,fill=voice.part))+ 22 | geom_density()+ 23 | facet_grid(voice.part~.) 24 | })) 25 | 26 | # 利用rCharts包中的绘图函数 27 | # nPlot函数 28 | output$mychart1 <- renderChart({ 29 | hair_eye_male <- subset(as.data.frame(HairEyeColor), Sex == "Male") 30 | hair_eye_male[,1] <- paste0("Hair",hair_eye_male[,1]) 31 | hair_eye_male[,2] <- paste0("Eye",hair_eye_male[,2]) 32 | p1 <- nPlot(Freq ~ Hair, group = "Eye", data = hair_eye_male, type = "multiBarChart") 33 | p1$chart(color = c('brown', 'blue', '#594c26', 'green')) 34 | p1$addParams(dom="mychart1") 35 | return(p1) 36 | }) 37 | # hPlot函数 38 | output$mychart2 <- renderChart({ 39 | a <- hPlot(Pulse ~ Height, data = MASS::survey, type = "bubble", title = "Zoom demo", subtitle = "bubble chart", size = "Age", group = "Exer") 40 | a$colors('rgba(223, 83, 83, .5)', 'rgba(119, 152, 191, .5)', 'rgba(60, 179, 113, .5)') 41 | a$chart(zoomType = "xy") 42 | a$exporting(enabled = T) 43 | a$addParams(dom="mychart2") 44 | return(a) 45 | }) 46 | 47 | # 社会网路图 48 | plotGraph <- function(){ 49 | g <- make_graph( ~ A-B-C-D-A, E-A:B:C:D, 50 | F-G-H-I-F, J-F:G:H:I, 51 | K-L-M-N-K, O-K:L:M:N, 52 | P-Q-R-S-P, T-P:Q:R:S, 53 | B-F, E-J, C-I, L-T, O-T, M-S, 54 | C-P, C-L, I-L, I-P) 55 | plotlayout <- switch(input$PlotLayout, 56 | "Auto"=layout.auto(g), 57 | "Random"=layout.random(g), 58 | "Circle"=layout.circle(g), 59 | "Sphere"=layout.sphere(g), 60 | "Fruchterman Reingold"=layout.fruchterman.reingold(g), 61 | "Kamada Kawai"=layout.kamada.kawai(g), 62 | "Drl"=layout.drl(g), 63 | "Spring"=layout.spring(g), 64 | "Reingold Tilford"=layout.reingold.tilford(g), 65 | "Fruchterma Reingold Grid"=layout.fruchterman.reingold.grid(g), 66 | "Lgl"=layout.lgl(g), 67 | "Graphopt"=layout.graphopt(g), 68 | "SVD"=layout.svd(g) 69 | ) 70 | if(!input$showNodeName){ 71 | V(g)$label = "" 72 | } 73 | V(g)$size = input$vertexSize 74 | plot(g, layout=plotlayout) 75 | } 76 | output$graphPlot <- renderPlot({ 77 | plotGraph() 78 | }) 79 | # 下载社会网路图 80 | output$downloadPlot <- downloadHandler( 81 | filename = function() { 82 | paste('NetworkGraph',format(Sys.time(),"%Y%m%d_%H%M%S"),'.pdf', sep='') 83 | }, 84 | content = function(file) { 85 | pdf(file) 86 | print(suppressWarnings(plotGraph())) 87 | dev.off() 88 | } 89 | ) 90 | 91 | #关联规则可视化 92 | output$groceryrules <- renderPlot({ 93 | data(Groceries) 94 | groceryrules <- apriori(Groceries,parameter = 95 | list(support=0.006,confidence=0.25,minlen=2)) 96 | plot(subset(groceryrules,lift > 3),method=input$method) 97 | }) 98 | # 聚类结果可视化 99 | clusters <- reactive({ 100 | kmeans(iris[,1:4],input$clusters) 101 | }) 102 | output$kmeans <- renderPlot({ 103 | plot(iris[,c('Sepal.Length','Sepal.Width')], 104 | col = clusters()$cluster, 105 | pch = 20, cex = 2) 106 | points(clusters()$centers, pch = 4, cex = 2, lwd = 4) 107 | }) 108 | # 评价线性模型拟合情况可视化 109 | output$lm.fit <- renderPlot({ 110 | fit <- lm(Sepal.Length~Sepal.Width,data=iris[,1:4]) 111 | par(mfrow=c(2,2),pch="*") 112 | plot(fit) 113 | }) 114 | 115 | } -------------------------------------------------------------------------------- /code/chaapter 13/数据可视化原型/ui.R: -------------------------------------------------------------------------------- 1 | library(shiny) 2 | library(shinydashboard) 3 | library(lattice) 4 | library(ggplot2) 5 | library(recharts) 6 | library(rCharts) 7 | library(igraph) 8 | library(arules) 9 | library(arulesViz) 10 | 11 | dashboardPage( 12 | dashboardHeader(title="数据可视化平台demo"), 13 | dashboardSidebar( 14 | sidebarMenu( 15 | menuItem("基础绘图展示",tabName = "basedemo"), 16 | menuItem("rCharts绘图展示",tabName = "rChartsdemo"), 17 | menuItem("社会网络图展示",tabName = "SNdemo"), 18 | menuItem("模型结果可视化展示",tabName = "viz") 19 | )), 20 | dashboardBody( 21 | tabItems( 22 | tabItem(tabName = "basedemo", 23 | box(title = "lattice包绘制散点图矩阵", 24 | width = 6,solidHeader = TRUE, 25 | background = "light-blue", plotOutput("splom")), 26 | box(title = "ggplot2包绘制的密度图", 27 | width = 6,solidHeader = TRUE, 28 | background = "light-blue", plotOutput("myggplot"))), 29 | tabItem(tabName = "rChartsdemo", 30 | box(title = "nPlot函数demo演示", 31 | bsolidHeader = TRUE,collapsible = TRUE,width="100%", 32 | showOutput("mychart1","nvd3")), 33 | box(title = "hPlot函数demo演示", 34 | bsolidHeader = TRUE,collapsible = TRUE,width="100%", 35 | showOutput("mychart2","highcharts"))), 36 | tabItem(tabName = "SNdemo", 37 | fluidRow( 38 | column(12, wellPanel( 39 | plotOutput("graphPlot") 40 | )), 41 | column(4, wellPanel( 42 | radioButtons(inputId="PlotLayout", label="Plot Layout", 43 | choices=c("Auto","Random","Circle","Sphere","Fruchterman Reingold", 44 | "Kamada Kawai","Drl","Spring","Reingold Tilford", 45 | "Fruchterma Reingold Grid", 46 | "Lgl","Graphout","SVD"), selected="Auto") 47 | )), 48 | column(4, wellPanel( 49 | checkboxInput(inputId = "showNodeName", 50 | label = "Show Vertex Label", value = TRUE), 51 | sliderInput(inputId = "vertexSize", 52 | label = "Vertex Size", value = 15, min=1, max=100) 53 | )), 54 | column(4, wellPanel( 55 | downloadButton('downloadPlot', 'Download Plot in pdf') 56 | )))), 57 | tabItem(tabName = "viz", 58 | box(title = "关联规则可视化", 59 | width = 6,solidHeader = TRUE,collapsible = T, 60 | background = "red",plotOutput("groceryrules")), 61 | box(title = "kmeans结果可视化", 62 | width = 6,solidHeader = TRUE,collapsible = T, 63 | background = "red",plotOutput("kmeans")), 64 | column(6,selectInput(inputId="method",label="请选择关联规则可视化的method", 65 | choices=c("graph","scatterplot","two-key plot", "matrix", 66 | "matrix3D","paracoord"))), 67 | column(6,numericInput('clusters', '请选择k值', 3, 68 | min = 1, max = 9)), 69 | column(12,box(title = "评价线性模型拟合情况可视化",status="primary", 70 | solidHeader = TRUE,collapsible = T,width="100%", 71 | plotOutput("lm.fit")))) 72 | ))) 73 | -------------------------------------------------------------------------------- /code/chaapter 13/渠道用户打分平台/global.R: -------------------------------------------------------------------------------- 1 | # 自定义score_function( )实现指标打分模型 2 | # 渠道得分函数 3 | channel_score <- function(data,amount=T){ 4 | 5 | # 进行指标的波动性打分 6 | library(reshape) 7 | data <- cast(data,渠道名称~自然周) 8 | # 利用apply函数分渠道求出当前周与上周的差值 9 | x <- t(apply(data[,-1],1,diff)) 10 | # 利用as.data.frame函将x转换成数据框形式 11 | x <- as.data.frame(x,row.names = as.character(data[,1])) 12 | # 利用colnames函数对x列名重新赋值 13 | colnames(x) <- colnames(data[3:ncol(data)]) 14 | # 找出最近四周的最大值 15 | # 自定义函数mystat求最近四周的最大值 16 | mystat <- function(x){ 17 | m <- rep(0,(ncol(data)-1)) 18 | for(i in 1:(ncol(data)-1)){ 19 | if(i <=3){ 20 | m[i] <- max(x[1:i]) 21 | } else { 22 | m[i] <- max(x[(i-4):i]) 23 | } 24 | } 25 | return(m) 26 | } 27 | # 利用apply函按分渠道求最近四周最大值 28 | y <- t(apply(data[,-1],1,mystat)) 29 | # 利用as.data.frame函数将y转换成数据框形式 30 | y <- as.data.frame(y,row.names = as.character(data[,1])) 31 | # 利用colnames函数对y列名重新赋值 32 | colnames(y) <- colnames(data[2:ncol(data)]) 33 | # 计算波动变化得分 34 | reliability_score <- 5*round(x/y[,-1],3) 35 | reliability_score 36 | if(amount) { 37 | # 进行指标的量级打分 38 | # 利用colSums函数进行按列求和 39 | x <- colSums(data[,-1]) 40 | x <- as.data.frame(matrix(rep(x,nrow(data)),nrow = nrow(data),byrow = T)) 41 | amount_score <- 5*round(data[,-1]/x,3) 42 | rownames(amount_score) <- rownames(reliability_score) 43 | amount_score 44 | 45 | # 计算指标得分 46 | # 利用cumsum函数进行对波动变化值进行累积求和 47 | rs_cumsum <- apply(reliability_score,1,cumsum) 48 | rs_cumsum <- as.data.frame(t(rs_cumsum)) 49 | score <- 10+rs_cumsum+amount_score[,-1] #起始分+波动变化得分+量级得分 50 | score[,colnames(data)[2]] <- 10 51 | score <- score[,c(ncol(score),1:ncol(score)-1)] # 改变列的顺序 52 | } else { 53 | # 计算指标的指标得分 54 | # 利用cumsum函数进行对波动变化值进行累积求和 55 | rs_cumsum <- apply(reliability_score,1,cumsum) 56 | rs_cumsum <- as.data.frame(t(rs_cumsum)) 57 | score <- 10+rs_cumsum #起始分+波动变化得分 58 | score[,colnames(data)[2]] <- 10 59 | score <- score[,c(ncol(score),1:ncol(score)-1)] # 改变列的顺序 60 | } 61 | return(round(score,2)) 62 | } 63 | -------------------------------------------------------------------------------- /code/chaapter 13/渠道用户打分平台/rawdata.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiabiao1602/Game_DataMining_With_R/fc3586dd9032adc364d9c8851521995c1a4d3072/code/chaapter 13/渠道用户打分平台/rawdata.RData -------------------------------------------------------------------------------- /code/chaapter 13/渠道用户打分平台/server.R: -------------------------------------------------------------------------------- 1 | library(shiny) 2 | library(shinydashboard) 3 | library(DT) 4 | 5 | # 导入数据源 6 | load("rawdata.RData") 7 | # 对字段自然周转化成有序因子变量 8 | levels <- c(paste0("第",1:length(unique(rawdata$自然周)),"周")) 9 | rawdata$自然周 <- factor(rawdata$自然周, 10 | levels = levels, 11 | ordered = T) 12 | 13 | server <- function(input,output){ 14 | # 原始数据展示 15 | output$rawdata <- DT::renderDataTable({ 16 | datatable(rawdata) 17 | }) 18 | # 原始数据下载 19 | output$downloadCsv <- downloadHandler( 20 | filename = "rawdata.csv", 21 | content = function(file) { 22 | write.csv(rawdata, file) 23 | }, 24 | contentType = "text/csv" 25 | ) 26 | 27 | # # 同一款游戏在不同渠道的打分模型 28 | selectdata <- reactive({ 29 | rawdata[rawdata$自然周 >= input$firstweek & 30 | rawdata$游戏名称==input$game,] 31 | }) 32 | # 计算周收入的得分模型 33 | channel_revenue <- reactive({ 34 | channel_score(selectdata()[,c('渠道名称','自然周','周收入')]) 35 | }) 36 | 37 | # 计算周活跃用户的得分模型 38 | channel_active <- reactive({ 39 | channel_score(selectdata()[,c('渠道名称','自然周','周活跃用户数')]) 40 | }) 41 | 42 | # 计算第7日留存率的得分模型 43 | channel_newretation <- reactive({ 44 | channel_score(selectdata()[,c('渠道名称','自然周','第7日留存率')]) 45 | }) 46 | 47 | # 计算周付费率的得分模型 48 | channel_payrate <- reactive({ 49 | channel_score(selectdata()[,c('渠道名称','自然周','周付费率')]) 50 | }) 51 | 52 | # 计算周ARPU的得分模型 53 | channel_arppu <- reactive({ 54 | channel_score(selectdata()[,c('渠道名称','自然周','周ARPPU')]) 55 | }) 56 | 57 | # 计算综合得分 58 | channel_total <- reactive({ 59 | input$w1*channel_revenue()+input$w2*channel_active()+ 60 | input$w3*channel_newretation()+input$w4*channel_payrate()+ 61 | input$w5*channel_arppu() 62 | }) 63 | 64 | output$channel_data <- DT::renderDataTable({ 65 | channel_data <- switch(input$data, 66 | '1'=channel_total(), 67 | '2'=channel_revenue(), 68 | '3'=channel_active(), 69 | '4'=channel_newretation(), 70 | '5'=channel_payrate(), 71 | '6'=channel_arppu()) 72 | datatable(round(channel_data,2)) 73 | }) 74 | # 绘制生存曲线 75 | output$plot1 <- renderPlot({ 76 | channel_total <- channel_total() 77 | channel_total$渠道名称 <- rownames(channel_total) # 增加渠道名称变量 78 | library(reshape) 79 | md <- melt(channel_total,id="渠道名称") #对数据进行重塑 80 | md$week <- ifelse(nchar(as.character(md$variable))==4, 81 | substr(md$variable,2,3),substr(md$variable,2,2)) #增加周数变量 82 | md$week <- as.numeric(md$week) 83 | library(lattice) 84 | xyplot(value~week|渠道名称,data=md,type=c("l","g"), 85 | lwd=2,layout=c(6,2)) #绘制面板曲线图 86 | }) 87 | # 提取最新的指标打分 88 | new_score <- reactive({ 89 | data.frame("渠道"=rownames(channel_total()), 90 | "周收入指标得分"=channel_revenue()[,ncol(channel_revenue())], 91 | '周活跃指标得分'=channel_active()[,ncol(channel_active())], 92 | '第7日留存率指标得分'= channel_newretation()[, ncol(channel_newretation())], 93 | '周付费率指标得分'=channel_payrate()[,ncol(channel_payrate())], 94 | '周ARPPU指标得分'=channel_arppu()[,ncol(channel_arppu())], 95 | '指标综合得分'=channel_total()[,ncol(channel_total())]) 96 | }) 97 | output$new_score <- DT::renderDataTable({ 98 | datatable(new_score()) 99 | }) 100 | } -------------------------------------------------------------------------------- /code/chaapter 13/渠道用户打分平台/ui.R: -------------------------------------------------------------------------------- 1 | library(shiny) 2 | library(shinydashboard) 3 | library(DT) 4 | 5 | # 导入数据源 6 | load("rawdata.RData") 7 | # 提取游戏名称和渠道名称 8 | levels <- c(paste0("第",1:length(unique(rawdata$自然周)),"周")) 9 | game <- levels(rawdata$游戏名称) 10 | channel <- levels(rawdata$渠道名称) 11 | 12 | dashboardPage( 13 | dashboardHeader(disable = TRUE), 14 | dashboardSidebar(disable = TRUE), 15 | dashboardBody( 16 | tabItem(tabName = "Data", 17 | tabBox(width = 12, 18 | tabPanel("原始数据查询", 19 | DT::dataTableOutput("rawdata"), 20 | downloadButton("downloadCsv", "Download as CSV") 21 | ), 22 | tabPanel("同一款游戏在不同渠道的打分模型", 23 | box( 24 | title = "参数选择", status = "primary", solidHeader = TRUE, width = 16, collapsible = T, 25 | column(4,selectInput("firstweek","请选择起始周", 26 | levels,selected="第18周")), 27 | column(4,selectInput("game","请选择需要查看的游戏",game)), 28 | column(4,selectInput("data","请选择需要查看的指标得分", 29 | c("指标综合得分"=1, 30 | "周收入指标得分"=2, 31 | "周活跃用户指标得分"=3, 32 | "第7日留存率指标得分"=4, 33 | "周付费率指标得分"=5, 34 | "周ARPPU指标得分"=6)))), 35 | box( 36 | title = "权重设置", status = "primary", solidHeader = TRUE, width = 16, collapsible = T, 37 | column(2,numericInput("w1","周收入权重",value=0.3,min=0,max=1,step=0.1)), 38 | column(2,numericInput("w2","周活跃用户数权重",value=0.2,min=0,max=1,step=0.1)), 39 | column(2,numericInput("w3","第7日留存率权重",value=0.2,min=0,max=1,step=0.1)), 40 | column(2,numericInput("w4","周付费率权重",value=0.15,min=0,max=1,step=0.1)), 41 | column(2,numericInput("w5","周ARPPU权重",value=0.15,min=0,max=1,step=0.1)) 42 | ), 43 | box( 44 | title = "指标得分", status = "primary", solidHeader = TRUE, width = 16, collapsible = T, 45 | DT::dataTableOutput("channel_data")), 46 | box( 47 | title = "渠道生存曲线", status = "primary", solidHeader = TRUE, width = 16, collapsible = T, 48 | plotOutput("plot1")), 49 | box( 50 | title = "最近一周得分统计", status = "primary", solidHeader = TRUE, width = 16, collapsible = T, 51 | DT::dataTableOutput("new_score")) 52 | ), 53 | tabPanel('帮助文档', 54 | h4("打分目的:们需要利用渠道运营数据中的关键指标数据,构建通用的渠道用户质量评价体系,对渠道质量进行综合打分评级。", 55 | style = "font-family: 'times'; font-si16pt;color:green"), 56 | code("指标说明:以自然周为研究周期,选取周收入、周活跃、周ARPPU、周付费渗透率、7日留存率作为五大基础指标,通过计算各个指标的信度和效度,对渠道用户的基础指标进行打分"), 57 | h4("打分规则如下:",style = "color:green"), 58 | p("1) 指标初始分都是10分;"), 59 | p("2) 波动性得分=5*(本周实际值-上周实际值)/最近四周的最大值"), 60 | p("3) 量级得分=5*渠道本周值/所有渠道本周总值(只有周收入、周活跃有量级指标)"), 61 | p("4)指标得分=上周得分+波动性得分+量级得分"), 62 | p("5)综合得分=0.3*周收入指标得分+0.2*周活跃指标得分+0.2*第7日留存率指标得分+0.15*周付费率指标得分+0.15*周ARPPU指标得分") 63 | ) 64 | )))) -------------------------------------------------------------------------------- /code/chaapter 13/细分用户平台/server.R: -------------------------------------------------------------------------------- 1 | load("userdata.RData") 2 | actionuser<-actionuser[,c("用户id", "最后一周登陆天数", "最后一周登陆次数", "最后一周0.8点登陆次数", 3 | "最后一周8.18点登陆次数", "最后一周18.24点登陆次数", 4 | "注册至今距离天数", "是否付费")] 5 | n <- dim(actionuser)[1] # 计算活跃用户数 6 | # 数据抽样 7 | # 对数据进行分区,90%的数据作为测试集用来建模,10%的数据作为验证集用来验证模型 8 | library(caret) 9 | set.seed(1234) 10 | ind<-createDataPartition(actionuser$是否付费,times=1,p=.9,list=FALSE) 11 | traindata<-actionuser[ind,] 12 | testdata<-actionuser[-ind,] 13 | # 对类失衡数据进行重新抽样,达到数据平衡。 14 | # 对付费用户(1)进行重复抽样,将付费人数增加一倍 15 | ind1<-sample(which(traindata$是否付费==1),2*length(which(traindata$是否付费==1)),replace=TRUE) 16 | # 对非付费用户(0)进行不放回抽样,将非付费人数减少一半 17 | ind2<-sample(which(traindata$是否付费==0),0.5*length(which(traindata$是否付费==0)),replace=FALSE) 18 | # 组合成新数据集newdata 19 | newdata<-traindata[c(ind1,ind2),] 20 | # 利用条件推理决策树算法建立分类树模型 21 | # 首先将树的最大深度设置为3 22 | newdata$是否付费<-as.factor(newdata$是否付费) 23 | library(party) 24 | ctree.sol<-ctree(是否付费~.,data=newdata[,-1],control=ctree_control(mincriterion=0.99,maxdepth=2)) 25 | 26 | 27 | function(input,output){ 28 | ###### 用户分群研究 ####### 29 | # 计算不同的用户群人数 30 | small <- reactive({user_pay[user_pay$amount <= input$small,]}) 31 | middle <- reactive( {user_pay[user_pay$amount > input$small & 32 | user_pay$amount <= input$middle,]}) 33 | big <- reactive( {user_pay[user_pay$amount > input$middle & 34 | user_pay$amount <= input$big,]}) 35 | super <- reactive( {user_pay[user_pay$amount > input$big,]}) 36 | # 统计不同用户群的占比 37 | output$vbox0 <- renderValueBox({ 38 | valueBox( 39 | h4(strong("85.89%",style="color:white;")), 40 | subtitle = h5(em(paste("非R人数共计",n,"人"))), 41 | icon = icon("user-md"), 42 | color="aqua", 43 | width=2 44 | ) 45 | }) 46 | output$small <- renderValueBox({ 47 | valueBox( 48 | h4(strong(paste(round(nrow(small())/n*100,2),"%",sep=""), 49 | style="color:white;")), 50 | subtitle = h5(em(paste("小R人数共计",nrow(small()),"人"))), 51 | icon = icon("user-md"), 52 | color="aqua", 53 | width=2 54 | ) 55 | }) 56 | output$middle <- renderValueBox({ 57 | valueBox( 58 | h4(strong(paste(round(nrow(middle())/n*100,2),"%",sep=""), 59 | style="color:white;")), 60 | subtitle = h5(em(paste("中R人数共计",nrow(middle()),"人"))), 61 | icon = icon("user-md"), 62 | color="aqua", 63 | width=2 64 | ) 65 | }) 66 | output$big <- renderValueBox({ 67 | valueBox( 68 | h4(strong(paste(round(nrow(big())/n*100,2),"%",sep=""), 69 | style="color:white;")), 70 | subtitle = h5(em(paste("大R人数共计",nrow(big()),"人"))), 71 | icon = icon("user-md"), 72 | color="aqua", 73 | width=2 74 | ) 75 | }) 76 | output$super <- renderValueBox({ 77 | valueBox( 78 | h4(strong(paste(round(nrow(super())/n*100,2),"%",sep=""), 79 | style="color:white;")), 80 | subtitle = h5(em(paste("超R人数共计",nrow(super()),"人"))), 81 | icon = icon("user-md"), 82 | color="aqua", 83 | width=2 84 | ) 85 | }) 86 | # 绘制金字塔图 87 | output$barplot <- renderPlot({ 88 | x<-c(0.8589, 89 | round(nrow(small())/n,4), 90 | round(nrow(middle())/n,4), 91 | round(nrow(big())/n,4), 92 | round(nrow(super())/n,4) 93 | ) 94 | y<--x 95 | barplot(x,horiz=T,space=0,xlim=c(-1,1),axes=F,col="green") 96 | axis(2,c(0.5,1.5,2.5,3.5,5),labels=c("非R","小R","中R","大R","超R"), 97 | tick=FALSE,cex.axis=0.8) 98 | axis(4,c(0.5,1.5,2.5,3.5,5),labels=round(x,3), 99 | tick=FALSE,cex.axis=0.75) 100 | barplot(y,horiz=T,space=0,add=T,col="green",axes=F) 101 | }) 102 | 103 | output$barplot1 <- renderPlot({ 104 | x<-c(round(nrow(small())/n,4), 105 | round(nrow(middle())/n,4), 106 | round(nrow(big())/n,4), 107 | round(nrow(super())/n,4) 108 | ) 109 | y<--x 110 | barplot(x,horiz=T,space=0,xlim=c(-0.15,0.15),axes=F,col="green") 111 | axis(2,c(0.5,1.5,2.5,3.5),labels=c("小R","中R","大R","超R"),tick=FALSE,cex.axis=0.8) 112 | axis(4,c(0.5,1.5,2.5,3.5),labels=round(x,3),tick=FALSE,cex.axis=0.75) 113 | barplot(y,horiz=T,space=0,add=T,col="green",axes=F) 114 | }) 115 | 116 | # 查看不同的用户群号码包 117 | output$table <- DT::renderDataTable( 118 | switch(input$dataset, 119 | "1"=small(), 120 | "2"=middle(), 121 | "3"=big(), 122 | "4"=super()), 123 | options=list(pageLength=10) 124 | ) 125 | # 下载号码包 126 | output$downloadCsv <- downloadHandler( 127 | filename = "userid.csv", 128 | content = function(file) { 129 | write.csv(switch(input$dataset, 130 | "1"=small(), 131 | "2"=middle(), 132 | "3"=big(), 133 | "4"=super() 134 | ), file,row.names=F) 135 | }, 136 | contentType = "text/csv" 137 | ) 138 | 139 | ###### 潜在付费用户挖掘 ####### 140 | # 导出明细数据 141 | output$actionuer <- DT::renderDataTable({ 142 | DT::datatable(actionuser) 143 | }) 144 | # 画出箱线图 145 | output$boxplot1 <- renderPlot({ 146 | par(mfrow=c(2,3)) 147 | for(i in 2:7) 148 | boxplot(actionuser[,i]~actionuser$是否付费,col=c(1,2)*i,outline=FALSE, 149 | main=paste(colnames(actionuser)[i],"箱线图")) 150 | par(mfrow=c(1,1)) 151 | }) 152 | 153 | # 画决策树图 154 | output$treeplot <- renderPlot({ 155 | plot(ctree.sol) 156 | }) 157 | } -------------------------------------------------------------------------------- /code/chaapter 13/细分用户平台/ui.R: -------------------------------------------------------------------------------- 1 | library(shiny) 2 | library(shinydashboard) 3 | library(DT) 4 | 5 | sidebar <- dashboardSidebar( 6 | sidebarMenu( 7 | menuItem("用户分群研究",icon = icon("user-md"),tabName="dashboard", 8 | menuSubItem("金字塔模型",tabName="pyramid",icon=icon("apple")), 9 | menuSubItem("用户号码包查询",tabName="userid",icon=icon("table")) 10 | ), 11 | menuItem("潜在付费用户挖掘",icon = icon("heart"),tabName="payuser", 12 | menuSubItem("用户活跃度数据",tabName="actionuer",icon=icon("table")), 13 | menuSubItem("箱线图",tabName="boxplot",icon = icon("area-chart")), 14 | menuSubItem("决策树建模",tabName="treemodel",icon= icon("male")) 15 | ) 16 | ) 17 | ) 18 | 19 | body <- dashboardBody( 20 | tabItems( 21 | tabItem(tabName = "pyramid", 22 | fluidRow( 23 | column(4,sliderInput("small","小R划分值",min=10,max=50,value=30, 24 | step=10,animate=animationOptions(loop=T))), 25 | column(4,sliderInput("middle","中R划分值",min=100,max=150,value=100, 26 | step=10,animate=animationOptions(loop=T))), 27 | column(4,sliderInput("big","大R划分值",min=500,max=600,value=100, 28 | step=20,animate=animationOptions(loop=T))), 29 | valueBoxOutput("vbox0"), 30 | valueBoxOutput("small"), 31 | valueBoxOutput("middle"), 32 | valueBoxOutput("big"), 33 | valueBoxOutput("super") 34 | ), 35 | fluidRow( 36 | box(title = "用户分群金子塔图", 37 | width = 6, solidHeader = TRUE, 38 | background="maroon", 39 | plotOutput("barplot", width = "100%", height = 300) 40 | ), 41 | box(title = "用户分群金子塔图(针对付费用户)", 42 | width = 6, solidHeader = TRUE, 43 | background="aqua", 44 | plotOutput("barplot1", width = "100%", height = 300) 45 | ) 46 | ) 47 | ), 48 | 49 | tabItem(tabName = "userid", 50 | selectInput("dataset", "选择需要查看的用户群:", 51 | choices = c("小R"=1, "中R"=2, "大R"=3,"超R"=4)), 52 | box( 53 | title = "RaW Data", status = "primary", solidHeader = TRUE, width = 12, collapsible = T, 54 | DT::dataTableOutput("table") 55 | ), 56 | downloadButton("downloadCsv", "Download as CSV") 57 | ), 58 | 59 | tabItem(tabName="actionuer", 60 | DT::dataTableOutput("actionuer")), 61 | 62 | tabItem(tabName = "boxplot", 63 | plotOutput("boxplot1"), 64 | strong(em("从箱线图可以看出,非付费用户和付费用户的登陆次数存在明显的不同,说明利用登陆次数来研究用户是否付费是可行的。")) 65 | ), 66 | 67 | tabItem(tabName="treemodel", 68 | p("付费用户只占到所有活跃用户的14%,该份数据属于类失衡数据,在进行下一步建模之前需要进行数据抽样处理,达到类平衡!", 69 | style="color:green;"), 70 | code(em("1) 对数据进行分区,90%的数据作为测试集用来建模,10%的数据作为验证集用来验证模型。")), 71 | br(), 72 | code(em("2) 对测试集进行重新抽样,使得非付费:付费=6:4,达到类平衡。")), 73 | box(title="决策树形图",status = "primary", solidHeader = TRUE, width = 8,height=500,collapsible = T, 74 | plotOutput("treeplot") 75 | ), 76 | box(title="决策树规则解读",status = "info", solidHeader = TRUE, width = 4,height=500,collapsible = T, 77 | p("规则1:最后一周登陆天数 = 1 and 最后一周登陆次数 <= 3:",style="color:maroon;"), 78 | p("符合规则的玩家有35683个,其中有2316位付费玩家,付费率是6.5%。"), 79 | br(), 80 | p("最后一周登陆天数 =1 and 最后一周登陆次数 > 3:",style="color:maroon;"), 81 | p("符合规则的玩家有4430个,其中付费玩家有2548个,付费率是57.5%,故可以认为该规则是付费玩家节点。"), 82 | br(), 83 | p("最后一周登陆天数 >=1 and 最后一周登陆次数 > 6:",style="color:maroon"), 84 | p("符合规则的玩家有28747个,其中付费玩家有22322个,付费率是77.6%,故可以认为该规则是付费玩家节点。") 85 | ), 86 | p(strong(em("总结:最后一周登陆天数 =1 and 最后一周登陆次数 > 3 or 最后一周登陆天数大于1天,且最后一周的登陆次数大于5次的玩家可以认为是高潜在付费用户,运营可以针对这批用户进行活动推送,促使玩家转化!"))) 87 | ) 88 | ) 89 | ) 90 | 91 | # Put them together into a dashboardPage 92 | dashboardPage( 93 | dashboardHeader(title="用户细分平台"), 94 | sidebar, 95 | body, 96 | skin="blue" 97 | ) -------------------------------------------------------------------------------- /code/chaapter 13/细分用户平台/userdata.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiabiao1602/Game_DataMining_With_R/fc3586dd9032adc364d9c8851521995c1a4d3072/code/chaapter 13/细分用户平台/userdata.RData -------------------------------------------------------------------------------- /code/chapter10.R: -------------------------------------------------------------------------------- 1 | ##### 10.1 #### 2 | # 绘制气泡图 3 | channeldata <- read.csv("data_10.1.csv",T) 4 | # 选取新增用户、ARPPU、次日留存率这三列数据 5 | channeldata1 <- channeldata[,c(1,3,5,6)] 6 | # 设置不同渠道的颜色 7 | library(RColorBrewer) 8 | col <- brewer.pal(11,"Spectral")[2:11] 9 | # 设置气泡的最大值和最小值 10 | cex.max <- 10; 11 | cex.min <- 1 12 | # 设置散点大小 13 | a <- (cex.max-cex.min)/(max(channeldata1$ARPPU)-min(channeldata1$ARPPU)) 14 | b <- cex.min-a*min(channeldata1$ARPPU) 15 | cex <- a*channeldata1$ARPPU+b 16 | # 绘制气泡图 17 | attach(channeldata1) 18 | plot(新增用户,次日留存率,cex=cex,col=col,pch=20, 19 | main="各渠道新增用户-次日留存率-ARPPU", 20 | xlab="日均新增用户", 21 | ylab="新增用户次日留存率") 22 | text(新增用户,次日留存率,渠道名称,col="black") 23 | detach(channeldata1) 24 | 25 | 26 | #### 10.2 #### 27 | # 渠道LTV监控 28 | # 导入渠道日运营数据 29 | channel <- read.csv("渠道日概况.csv",header=TRUE,fill=TRUE) 30 | # 对新增用户、活跃用户、付费用户分渠道绘制箱线图 31 | par(mfrow=c(3,1)) 32 | boxplot(新增用户~渠道名称,data=channel,ylab="新增用户", 33 | col=colorspace::rainbow_hcl(10),varwidth=TRUE) 34 | boxplot(活跃用户~渠道名称,data=channel,ylab="活跃用户", 35 | col=colorspace::heat_hcl(10),varwidth=TRUE) 36 | boxplot(付费用户~渠道名称,data=channel,ylab="付费用户", 37 | col=colorspace::terrain_hcl(10),varwidth=TRUE) 38 | par(mfrow=c(1,1)) 39 | # 分渠道绘制一月收入曲线图 40 | # 将日期变量转换为日期格式 41 | channel$日期 <- as.Date(channel$日期) 42 | # 绘制分面板曲线图 43 | library(lattice) 44 | xyplot(收入~日期|渠道名称,data=channel,type="l", 45 | lwd=2,layout=c(5,2), 46 | xlim=c(min(channel$日期)-1,max(channel$日期)+1), 47 | main="渠道收入一月曲线图") 48 | # 利用Median-IQR方法分析ARPPU、ARPU、新增次日留存率和新增七日留存率 49 | # 自定义求中位数和四分位距函数 50 | mystats <- function(x) c(Median=median(x,na.rm=T),IQR=IQR(x,na.rm=T)) 51 | # 求出各指标的统计值 52 | library(doBy) 53 | result <- summaryBy(ARPPU+ARPU+新增次日留存率+新增7日后留存率~渠道名称, 54 | data=channel,FUN = mystats) 55 | result 56 | # 对各指标绘制四象限图,查看渠道分布情况 57 | # 将需要绘制四象限图的指标赋予name对象 58 | name <- c("ARPPU","ARPU","新增次日留存率","新增7日留存率") 59 | # 利用for循环绘制四个四象限分布图 60 | par(mfrow = c(2,2)) 61 | for(i in 1:4){ 62 | plot(result[,2*i],result[,2*i+1],type = "n", 63 | xlim=c(0.95*min(result[,2*i]),1.05*max(result[,2*i])), # 设置横轴坐标轴范围 64 | ylim=c(0.95*min(result[,2*i+1]),1.05*max(result[,2*i+1])), #设置纵轴坐标轴范围 65 | main = paste0(name[i],"四象限图"), 66 | xlab = "中位数值",ylab = "四分位距值") #绘制散点图 67 | abline(v = mean(result[,2*i]),lty = 2,col = "green") # 添加垂直直线 68 | abline(h = mean(result[,2*i+1]),lty = 2,col = "blue") # 添加水平直线 69 | text(result[,2*i],result[,2*i+1],result[,1], 70 | col = "black",cex = 0.8,font=2) # 在图中打印出渠道名称 71 | } 72 | par(mfrow=c(1,1)) 73 | 74 | # 建立LTV监控体系 75 | # 导入渠道用户LTV统计数据 76 | LTV <- read.csv("渠道用户LTV统计.csv",header = T) 77 | head(LTV) 78 | # 对31日的渠道A LTV数据绘制条形图 79 | data1 <- LTV[LTV$日期=='2016/1/31' & LTV$渠道名称=="渠道A",4:12] # 提取数据 80 | # 绘制渠道A用户在不同时期的LTV柱状图 81 | barplot(as.matrix(data1),col = "grey",border = F, 82 | main="渠道A用户生命周期价值",xlab="不同生命周期价值") 83 | # 添加LTV值 84 | text(seq(0.6,10.4,length.out = 9),as.matrix(data1)/2, 85 | labels = as.matrix(data1), 86 | col="black",font = 2) 87 | # 绘制点图 88 | x <- LTV[LTV$日期=='2016/1/31',c(4,6,10:12)] 89 | rownames(x) <- LTV[LTV$日期=='2016/1/1',2] 90 | x <- as.matrix(x) 91 | library(lattice) 92 | dotplot(x,groups = FALSE,layout = c(1,5), 93 | aspect=0.5,origin=0,type=c("p","h"), 94 | main="不同渠道的LTV对比", 95 | xlab="LTV") 96 | 97 | # 渠道新增用户留存监控 98 | # 导入7日留存率明细数据 99 | retention <- read.csv("7日留存率明细.csv",header = T) 100 | head(retention) 101 | # 对渠道A做7日留存率的正态性检验 102 | shapiro.test(retention[retention$渠道名称=="渠道A","第7日留存率"]) 103 | # 对渠道H做7日留存率的正态性检验 104 | shapiro.test(retention[retention$渠道名称=="渠道H","第7日留存率"]) 105 | 106 | # 绘制QQ图 107 | par(mfrow=c(1,2)) 108 | # 绘制渠道A的QQ图 109 | qqnorm(retention[retention$渠道名称=="渠道A","第7日留存率"], 110 | pch=7, 111 | main="Channel A Normal Q-Q plot") 112 | qqline(retention[retention$渠道名称=="渠道A","第7日留存率"], 113 | col="red",lty=2) 114 | # 绘制渠道H的QQ图 115 | qqnorm(retention[retention$渠道名称=="渠道H","第7日留存率"], 116 | pch=7, 117 | main="Channel H Normal Q-Q plot") 118 | qqline(retention[retention$渠道名称=="渠道H","第7日留存率"], 119 | col="red",lty=2) 120 | par(mfrow=c(1,1)) 121 | 122 | # 绘制P质量监控图 123 | # 导入渠道H新增用户在第7日的留存统计数据 124 | residentuser <- read.csv("渠道H新增第7日留存用户统计.csv",header=T) 125 | # 绘制渠道A的7日留存率质量监控图 126 | library(qcc) 127 | residentuser$date <- as.Date(residentuser$date) 128 | attach(residentuser) 129 | sol <- qcc(actionuser,newuser,labels=date, 130 | type="p",nsigmas = 3, 131 | title="渠道H新增第7日留存率质量监控图", 132 | xlab="date",ylab="7日留存率") 133 | detach(residentuser) 134 | 135 | #### 8.3 #### 136 | # 渠道用户质量打分模型 137 | # 自定义channel_score( )实现指标打分模型 138 | # 渠道得分函数 139 | channel_score <- function(data,amount=T){ 140 | 141 | # 进行指标的波动性打分 142 | library(reshape) 143 | data <- cast(data,渠道名称~自然周) 144 | # 利用apply函数分渠道求出当前周与上周的差值 145 | x <- t(apply(data[,-1],1,diff)) 146 | # 利用as.data.frame函将x转换成数据框形式 147 | x <- as.data.frame(x,row.names = as.character(data[,1])) 148 | # 利用colnames函数对x列名重新赋值 149 | colnames(x) <- colnames(data[3:ncol(data)]) 150 | # 找出最近四周的最大值 151 | # 自定义函数mystat求最近四周的最大值 152 | mystat <- function(x){ 153 | m <- rep(0,(ncol(data)-1)) 154 | for(i in 1:(ncol(data)-1)){ 155 | if(i <=3){ 156 | m[i] <- max(x[1:i]) 157 | } else { 158 | m[i] <- max(x[(i-3):i]) 159 | } 160 | } 161 | return(m) 162 | } 163 | # 利用apply函按分渠道求最近四周最大值 164 | y <- t(apply(data[,-1],1,mystat)) 165 | # 利用as.data.frame函数将y转换成数据框形式 166 | y <- as.data.frame(y,row.names = as.character(data[,1])) 167 | # 利用colnames函数对y列名重新赋值 168 | colnames(y) <- colnames(data[2:ncol(data)]) 169 | # 计算波动变化得分 170 | reliability_score <- 5*round(x/y[,-1],3) 171 | reliability_score 172 | if(amount) { 173 | # 进行指标的量级打分 174 | # 利用colSums函数进行按列求和 175 | x <- colSums(data[,-1]) 176 | x <- as.data.frame(matrix(rep(x,nrow(data)),nrow = nrow(data),byrow = T)) 177 | amount_score <- 5*round(data[,-1]/x,3) 178 | rownames(amount_score) <- rownames(reliability_score) 179 | amount_score 180 | 181 | # 计算指标得分 182 | # 利用cumsum函数进行对波动变化值进行累积求和 183 | rs_cumsum <- apply(reliability_score,1,cumsum) 184 | rs_cumsum <- as.data.frame(t(rs_cumsum)) 185 | score <- 10+rs_cumsum+amount_score[,-1] #起始分+波动变化得分+量级得分 186 | score[,colnames(data)[2]] <- 10 187 | score <- score[,c(ncol(score),1:ncol(score)-1)] # 改变列的顺序 188 | } else { 189 | # 利用cumsum函数进行对波动变化值进行累积求和 190 | rs_cumsum <- apply(reliability_score,1,cumsum) 191 | rs_cumsum <- as.data.frame(t(rs_cumsum)) 192 | score <- 10+rs_cumsum #起始分+波动变化得分 193 | score[,colnames(data)[2]] <- 10 194 | score <- score[,c(ncol(score),1:ncol(score)-1)] # 改变列的顺序 195 | } 196 | return(score) 197 | } 198 | # 导入周渠道概况数据 199 | load("rawdata.RData") 200 | str(rawdata) 201 | # 对字段自然周转化成有序因子变量 202 | levels <- c(paste0("第",1:length(unique(rawdata$自然周)),"周")) 203 | rawdata$自然周 <- factor(rawdata$自然周, 204 | levels = levels, 205 | ordered = T) 206 | str(rawdata) 207 | # 对游戏A的渠道得分进行计算 208 | # 计算周收入得分 209 | channel_revenue <- channel_score(rawdata[rawdata$游戏名称=="游戏A", 210 | c("渠道名称","自然周","周收入")]) 211 | # 计算周活跃用户得分 212 | channel_active <- channel_score(rawdata[rawdata$游戏名称=="游戏A", 213 | c("渠道名称","自然周","周活跃用户数")]) 214 | # 计算第7日留存率得分 215 | channel_newretation <- channel_score(rawdata[rawdata$游戏名称=="游戏A", 216 | c("渠道名称","自然周","第7日留存率")],amount = F) 217 | # 计算周付费率得分 218 | channel_payrate <- channel_score(rawdata[rawdata$游戏名称=="游戏A", 219 | c("渠道名称","自然周","周付费率")],amount = F) 220 | # # 计算ARPU得分 221 | channel_arppu <- channel_score(rawdata[rawdata$游戏名称=="游戏A", 222 | c("渠道名称","自然周","周ARPPU")],amount = F) 223 | # 计算综合得分 224 | channel_total <- round(0.3*channel_revenue+0.2*channel_active+0.2*channel_payrate+ 225 | 0.15*channel_arppu+0.15*channel_newretation,2) 226 | # 查看综合得分结果 227 | channel_total 228 | # 绘制游戏A在各渠道的生存曲线 229 | channel_total$渠道名称 <- rownames(channel_total) # 增加渠道名称变量 230 | library(reshape) 231 | md <- melt(channel_total,id="渠道名称") #对数据进行重塑 232 | md$week <- ifelse(nchar(as.character(md$variable))==4, 233 | substr(md$variable,2,3),substr(md$variable,2,2)) #增加周数变量 234 | md$week <- as.numeric(md$week) 235 | library(lattice) 236 | xyplot(value~week|渠道名称,data=md,type=c("l","g"), 237 | lwd=2,layout=c(6,2)) #绘制面板曲线图 -------------------------------------------------------------------------------- /code/chapter11.R: -------------------------------------------------------------------------------- 1 | #### 11.1.1 宏观收入分析 2 | # 收入指标日总况 3 | revenue <- read.csv("付费总况.csv") 4 | head(revenue) 5 | library(reshape) 6 | md <- melt(revenue,id='日期') 7 | head(md) 8 | library(recharts) 9 | echartr(md,日期,value,variable,type=c(rep('vbar',2),rep('line',4))) %>% 10 | setY1Axis(series=3:6) %>% # 设置Y轴副坐标轴 11 | setSymbols('emptycircle') %>% 12 | setToolbox(show=FALSE) 13 | # 终端品牌的付费人数统计 14 | brand <- data.frame( 15 | '品牌'= c("OPPO","HUAWEI","vivo", "Xiaomi", "samsung", "HONOR", 16 | "Meizu","GIONEE","LeEco","Coolpad"), 17 | '付费人数'=c(711, 519, 486, 477, 388, 260, 156, 18 | 57, 53, 46)) 19 | echartr(brand,品牌,付费人数,type = "vbar") %>% 20 | setToolbox(show=FALSE) 21 | 22 | ##### 11.2.2 数据探索分析 23 | w <- read.csv("经济系统数据.csv",T) # 导入数据 24 | # 1. 相关性分析 25 | # 研究货币量与活跃用户、新增用户间的关系 26 | w <- w[,-1] # 删除日期 27 | w1 <- w[,c(1:10,16:17)] #选择货币量类与活跃用户类、新增用户类等字段的数据 28 | (r1 <- round(cor(w1[,1:6],w1[,7:12]),2)) # 计算相关系数 29 | library(corrplot) 30 | corrplot(r1,method = "ellipse") # 绘制相关系数图 31 | # 研究货币量与付费用户间的关系 32 | w2 <- w[,c(1:6,11:15)] # 选择货币量与付费用户的字段数据 33 | (r2 <- round(cor(w2[,1:6],w2[,7:11]),2)) # 计算相关系数 34 | corrplot(r2,method = "ellipse") # 绘制相关系数图 35 | # 货币量与用户玩牌数据间的关系研究 36 | w3 <- w[,c(1:6,18:26)] # 选择货币量与用户玩牌数据户的字段数据 37 | (r3 <- round(cor(w3[,1:6],w3[,7:11]),2)) # 计算相关系数 38 | corrplot(r3,method = "ellipse") # 绘制相关系数图 39 | # 2. 降维及聚类分析 40 | w.sc<-scale(w) # 将数据标准化 41 | w.pr<-princomp(w.sc) # 建立主成分分析模型 42 | summary(w.pr) # 提取主成分信息 43 | screeplot(w.pr,type="line") # 绘制主成分的碎石图 44 | abline(h=1) 45 | x<-data.frame(w.pr$loadings[,1:5]) 46 | dist.e=dist(x,method="euclidean") #计算其欧氏距离矩阵 47 | model1=hclust(dist.e,method="complete") #建立系统聚类模型 48 | plot(model1,main='聚类树图') #画聚类树图 49 | 50 | ##### 11.2.3 模型构建 51 | # 构建衍生指标 52 | cadr <- round(w$纯消耗/w$游戏币发放,2) 53 | smpc <- (w$沉睡保险箱结余+w$沉睡身上携带)/(w$累增用户-w$月活跃用户数) 54 | afam <- (w$活跃保险箱余额+w$活跃身上携带)/w$月活跃用户数 55 | slac <- round(smpc/afam,2) 56 | unusual <- ifelse(w$日活跃.月活跃>0.2,"正常","异常") 57 | u <- data.frame(cbind(cadr,slac,unusual)) 58 | u$cadr <- as.numeric(u$cadr) 59 | u$slac <- as.numeric(u$slac) 60 | # 建立决策树模型 61 | library(rpart) 62 | r<-rpart(unusual ~ .,data=u,method="class",parms=list(split="information")) 63 | r 64 | rattle::fancyRpartPlot(r) 65 | 66 | #### 11.3.2 案例:付费用户RFM模型研究 67 | # 导入RFM数据 68 | rfm_data <- read.csv("RFM_data.csv") 69 | # 将最后付费日期转换成日期格式 70 | rfm_data$last_date <- paste(substr(rfm_data$last_date,1,4),substr(rfm_data$last_date,5,6), 71 | substr(rfm_data$last_date,7,8),sep="/") 72 | rfm_data$last_date <- as.Date(rfm_data$last_date,"%Y/%m/%d") 73 | # 增加距离统计日的相隔天数 74 | rfm_data$time_internal <- max(rfm_data$last_date)-rfm_data$last_date 75 | # 查看数据的前六行 76 | head(rfm_data) 77 | # 查看不同指标的10%数据情况 78 | quantile(rfm_data$time_internal,probs = seq(0,1,0.1)) 79 | quantile(rfm_data$pay_mnt,probs = seq(0,1,0.1)) 80 | quantile(rfm_data$pay_cnt,probs = seq(0,1,0.1)) 81 | # 建立新的衍生指标 82 | rfm_data$tagR <- ifelse(rfm_data$time_internal <= 0,1,0) 83 | rfm_data$tagF <- ifelse(rfm_data$pay_cnt <= 1,0,1 ) 84 | rfm_data$tagM <- ifelse(rfm_data$pay_mnt <= 6,0,1) 85 | head(rfm_data) 86 | # 给用户打上类型标签 87 | rfm_data$type <- "一般挽留用户" 88 | rfm_data[rfm_data$tagR==1 & rfm_data$tagF==1 & rfm_data$tagM==1,'type'] <- "重要保持客户" 89 | rfm_data[rfm_data$tagR==1 & rfm_data$tagF==0 & rfm_data$tagM==1,'type'] <- "重要发展客户" 90 | rfm_data[rfm_data$tagR==1 & rfm_data$tagF==1 & rfm_data$tagM==0,'type'] <- "一般保持客户" 91 | rfm_data[rfm_data$tagR==1 & rfm_data$tagF==0 & rfm_data$tagM==0,'type'] <- "一般客户" 92 | rfm_data[rfm_data$tagR==0 & rfm_data$tagF==1 & rfm_data$tagM==1,'type'] <- "重要挽留客户" 93 | rfm_data[rfm_data$tagR==0 & rfm_data$tagF==1 & rfm_data$tagM==0,'type'] <- "一般客户" 94 | rfm_data[rfm_data$tagR==0 & rfm_data$tagF==0 & rfm_data$tagM==0,'type'] <- "低价值客户" 95 | head(rfm_data) 96 | # 统计不同用户群的人数 97 | library(sqldf) 98 | rfm_data_sum <- sqldf("select type,count(distinct player_id) as usr_cnt, 99 | sum(pay_mnt) as pay_mnt_sum from rfm_data group by type") 100 | # 按照付费金额进行降序排列 101 | rfm_data_sum <- rfm_data_sum[order(rfm_data_sum$pay_mnt_sum,decreasing = T),] 102 | rfm_data_sum$usr_cnt_rate <- paste0(round(rfm_data_sum$usr_cnt*100/ 103 | sum(rfm_data_sum$usr_cnt),2),"%") 104 | rfm_data_sum$pay_mnt_sum_rate <- paste0(round(rfm_data_sum$pay_mnt_sum*100/ 105 | sum(rfm_data_sum$pay_mnt_sum),2),"%") 106 | knitr::kable(rfm_data_sum) 107 | # 绘制柱状图 108 | library(RColorBrewer) 109 | par(mfrow=c(2,1)) 110 | barplot(rfm_data_sum$pay_mnt_sum,col=brewer.pal(12,"Set3")[1:8], 111 | border = F,main="付费金额统计") 112 | barplot(rfm_data_sum$usr_cnt,col = brewer.pal(9,"Set1")[1:8], 113 | border = F,names.arg = rfm_data_sum$type, 114 | main="付费人数统计") 115 | par(mfrow=c(1,1)) -------------------------------------------------------------------------------- /code/chapter2.R: -------------------------------------------------------------------------------- 1 | ### 2.1.4 R快速入门 ### 2 | a <- 1:10 3 | a 4 | A 5 | cor(iris[,1:4]) 6 | Cor(iris[,1:4]) 7 | 8 | # 获取帮助 9 | ?median # 等价于help("median"),查看中位数函数的帮助文档 10 | ??median # 等价于help.serach("median") 搜索包含median的帮助信息 11 | help("runExample") 12 | help("runExample",package = "shiny") 13 | help("runExample",try.all.packages = TRUE) 14 | apropos("plot") 15 | example("median") 16 | data() 17 | data(package = .packages(all.available = TRUE)) 18 | 19 | # 工作空间 20 | # 创建数据对象a,b 21 | a <- 1:10 22 | b <- 10:1 23 | # 创建模型对象fit 24 | fit <- lm(Sepal.Length~Sepal.Width,data=iris) 25 | # 创建图形对象q、p 26 | library(ggplot2) 27 | q <- qplot(mpg, wt, data = mtcars) 28 | p <- rPlot(Sepal.Length ~ Sepal.Width | Species, data = iris, 29 | type = 'point', color = 'Species') 30 | # 移除对象fit 31 | rm(list="fit") 32 | ls() 33 | # 移除剩下的所有对象 34 | rm(list=ls()) 35 | ls() 36 | 37 | 38 | ### 2.2 数据对象 ### 39 | # 2.2.1 向量 40 | # 在大多数情况下,使用长度大于1的向量。可以在R中使用c( )函数和相应的参数来创建一个向量: 41 | (w<-c(1,3,4,5,6,7)) #创建数值型向量 42 | length(w) #查看向量的长度 43 | mode(w) #查看向量的数据类型 44 | (w1<-c("张三","李四","王五")) #创建字符型向量 45 | length(w1) #查看向量的长度 46 | mode(w1) #查看向量的数据类型 47 | (w2<-c(T,F,T)) #创建逻辑型向量 48 | length(w2) #查看向量的长度 49 | mode(w2) #查看向量的数据类型 50 | # 一个向量的所有元素都必须属于相同的模式。如果不是,R将强制执行类型转换。 51 | w3 <- c(w,w2) # 数值型+逻辑型=数值型 52 | w3 53 | mode(w3) 54 | w4<-c(w,w1) # 数值型+字符型=字符型 55 | w4 56 | mode(w4) 57 | w5<-c(w1,w2) # 字符型+逻辑型=字符型 58 | w5 59 | mode(w5) 60 | ####### 向量化 ####### 61 | rm(list=ls()) 62 | (w<-seq(1:10)) 63 | (x<-round(sqrt(w),3)) 64 | # 也可以利用R的这个特性进行向量的算术运算 65 | rm(list=ls()) 66 | (w1<-c(2,3,4)) 67 | (w2<-c(3.1,4.2,5.3)) 68 | (w<-w1+w2) 69 | # 如果两个向量的长度不同,R将利用循环规则,该规则重复较短的向量元素,直到得到的向量长度与较长的向量的长度相同。 70 | # 例一 71 | rm(list=ls()) 72 | (w1<-c(2,4,6,8)) 73 | (w2<-c(10,12)) 74 | (w<-w1+w2) 75 | # 例二 76 | rm(list=ls()) 77 | (w1<-c(2,4,6,8)) 78 | (w2<-c(10,12,14)) 79 | (w<-w1+w2) 80 | # 等差序列的创建 81 | 1:10 82 | 10:1 83 | # 只给出首项和尾项数据,by自动匹配为1或-1 84 | seq(1,9) 85 | seq(1,-9) 86 | #给出首项和尾项数据以及长度,自动计算等差 87 | seq(1,-9,length.out=5) 88 | #给出首项和尾项数据以及等差,自动计算长度 89 | seq(1,-9,by=-2) 90 | #给出首项和等差以及长度数据,自动计算尾 91 | seq(1,by=2,length.out=10) 92 | # 重复序列的创建 93 | rep(1:4,times=2) 94 | rep(1:4,each=2) 95 | rep(1:4, c(2,1,2,1)) 96 | rep(1:4, times = 2, length.out = 6) 97 | rep(1:4, times = 2, length.out = 10) 98 | letters 99 | LETTERS 100 | # 索引向量 101 | # 以下三种方法返回相同的值: 102 | set.seed(1234) 103 | x <- rnorm(5) 104 | x[c(1,3,5)] 105 | x[c(-2,-4)] 106 | x[c(TRUE,FALSE,TRUE,FALSE,TRUE)] 107 | # 混合使用正负值是不允许的,会抛出一个错误: 108 | x[c(1,-2)] 109 | # 利用表达式提取元素 110 | x>0 111 | x[x>0] 112 | # which 函数将返回逻辑向量中为TRUE 的位置。如果要将逻辑索引切换到整数索引中,这个函数很有用: 113 | set.seed(123) 114 | v <- sample(1:10,5) 115 | v 116 | which(v>5) 117 | which.min(v) 118 | which.max(v) 119 | 120 | # 2.2.2 矩阵和数组 121 | # 矩阵创建 122 | (w<-seq(1:10)) 123 | (a<-matrix(w,nrow=5,ncol=2)) 124 | (a<-matrix(w,nrow=5,ncol=2,byrow=T)) #按行填充 125 | (a<-matrix(w,nrow=5,ncol=2,byrow=T, 126 | dimnames=list(paste0("r",1:5),paste0("l",1:2)))) #给行列设置名称 127 | # 矩阵的合并 128 | (x1<-rbind(c(1,2),c(3,4))) 129 | (x2<-10+x1) 130 | (x3<-cbind(x1,x2)) 131 | (x4<-rbind(x1,x2)) 132 | cbind(1,x1) 133 | # 矩阵的拉直 134 | (A<-matrix(1:6,nrow=2)) 135 | as.vector(A) 136 | # 矩阵的行或列计算的函数 137 | (A <- matrix(1:16,4,4)) 138 | colSums(A) # 等价于 apply(A,2,sum) 139 | colMeans(A) # 等价于 apply(A,2,mean) 140 | rowSums(A) # 等价于 apply(A,1,sum) 141 | rowMeans(A) # 等价于 apply(A,1,mean) 142 | 143 | # 数组创建 144 | rm(list=ls()) 145 | (w<-array(1:30,dim=c(3,5,2))) 146 | 147 | #2.2.3 列表和数据框 148 | # 列表创建 149 | user.list<-list(user.id=34453, 150 | user.name="张三", 151 | user.games=c('地铁跑酷','神庙逃亡2','水果忍者','苍穹变')) 152 | user.list 153 | length(user.list) #检查列表成分个数 154 | unlist(user.list) #转换成向量元素 155 | # 数据框创建 156 | my.dataset<-data.frame(userid=c("S001","S002","S003","S004","S005"), 157 | gamename=c('地铁跑酷','神庙逃亡2','水果忍者','水果忍者','机战王'), 158 | iamount=c(100,50,30,60,70)) 159 | my.dataset 160 | # 利用names函数查看变量名称 161 | names(my.dataset) 162 | # 我们也可以通过colnames函数查看变量名称,rownames函数查看行名称。 163 | head(mtcars) #查看前六行数据 164 | colnames(mtcars) # 查看变量名称 165 | rownames(mtcars) # 查看记录名称 166 | # 利用names函数修改变量名称 167 | names(my.dataset) 168 | names(my.dataset)[1] <- "vopenid" 169 | names(my.dataset) 170 | # 利用reshape包中rename函数对变量名进行批量修改 171 | library(reshape) 172 | newdata <- rename(my.dataset,c("vopenid" = "用户ID", 173 | "gamename" = "游戏名称","iamount" = "付费金额")) 174 | names(newdata) 175 | # 数据框索引 176 | my.dataset$gamename 177 | my.dataset[["gamename"]] 178 | my.dataset[[2]] 179 | my.dataset[,2] 180 | # 如果我们想提取前三行,前两列的数据 181 | my.dataset[1:3,1:2] 182 | my.dataset[1:3,c("vopenid","gamename")] 183 | 184 | 185 | ### 2.3 数据的导入 ### 186 | # 2.3.2 文本文件的导入 187 | import.txt <- read.table("iris.txt",header = TRUE) # 读入iris.txt文件 188 | head(import.txt) 189 | import.csv <- read.table("iris.csv",sep = ",") #读入iris.csv文件 190 | head(import.csv) 191 | import.csv1 <- read.csv("iris.csv") # 利用read.csv将iris.csv文件读入 192 | head(import.csv1) 193 | # 读取非结构化文本文件 194 | unstructuredText <- readLines("unstructuredText.txt") 195 | unstructuredText 196 | # 2.3.3 Excel文件的导入 197 | # 利用RODBC包读入 198 | library(RODBC) 199 | channel <- odbcConnectExcel2007("sample.xlsx") # 建立连接 200 | odbcdf <- sqlFetch(channel,'data') # 读取工作表data的数据 201 | odbcClose(channel) # 关闭连接 202 | odbcdf 203 | # 利用xlsx包读取EXcel数据 204 | library(xlsx) 205 | res <- read.xlsx('sample.xlsx',1,encoding="UTF-8") # 利用read.xlsx函数读取Excel文件 206 | res 207 | detach(package:xlsx) 208 | # 利用XLConnect包读取Excel数据 209 | library(XLConnect) 210 | wb <- loadWorkbook("sample.xlsx") # 加工作薄加载到R中 211 | xldf<-readWorksheet(wb,sheet=getSheets(wb)[1]) #读取第一个工作表的数据 212 | xldf 213 | # 利用readxl包读取Excel数据 214 | library(readxl) 215 | readexcel <- read_excel("sample.xlsx",1,col_names = T) 216 | readexcel 217 | 218 | # 2.3.5 访问网络数据 219 | # 方法一 利用readLines函数和正则表达式提取网页数据 220 | # 爬取全部网页 221 | web <- NULL 222 | for(i in 1:8){ 223 | url <- paste0("https://edu.hellobi.com/course/explore?page=",i) 224 | web1 <- readLines(url,encoding = 'UTF-8') 225 | web <- c(web1,web) 226 | } 227 | # 提取课程名称所在的行 228 | class <- web[grep("class=\"caption\"",web)+3] 229 | # 删除多余的空格 230 | class <- gsub(" ","",class) 231 | # 提取课时所在的行 232 | length <- web[grep("class=\"length\"",web)] 233 | # 利用正则表达式提取课时数 234 | length <- substr(length,regexpr("i>",length)+2,regexpr("课",length)-1) 235 | # 提取学生人数 236 | people <- web[grep("class=\"pull-right people\"",web)] 237 | people <- substr(people,regexpr(">",people)+1,regexpr("人",people)-1) 238 | # 提取授课老师 239 | teacher <- web[grep("class=\"teacher\"",web)] 240 | for(i in 1:length(teacher)){ 241 | teacher[i] <- substr(teacher[i],gregexpr(">",teacher[i])[[1]][2]+1,gregexpr("<",teacher[i])[[1]][3]-1) 242 | } 243 | # 提取课程价格 244 | price <- web[grep("class=\"teacher\"",web)+1] 245 | price <- substr(price,regexpr(">",price)+1,regexpr("/",price)-2) 246 | # 将结果整理成data.frame形式 247 | result <- data.frame(课程=class,课时数=length,学生人数=people,授课老师=teacher,课程价格=price) 248 | head(result) 249 | 250 | #### 利用rvest包爬取网页数据 251 | library(rvest) 252 | library(magrittr) 253 | result <- data.frame(课程=1,课时数=1,学生人数=1,授课老师=1,课程价格=1) 254 | result <- result[-1,] 255 | for(i in 1:7){ 256 | url <- paste0("https://edu.hellobi.com/course/explore?page=",i) 257 | web <- read_html(url,encoding = 'UTF-8') 258 | class <- web %>% html_nodes("div.course-box") %>% 259 | html_nodes("img") # 提取课程名称 260 | class <- substr(class,regexpr("alt=",class)+5,regexpr(">",class)-3) 261 | length <- web %>% html_nodes("div.meta") %>% html_nodes("span.length") %>% 262 | html_text() # 提取课时数 263 | people <- web %>% html_nodes("div.meta") %>% html_nodes("span.people") %>% 264 | html_text() # 提取学习人数 265 | teacher <- web %>% html_nodes("div.meta") %>% html_nodes("span.teacher") %>% 266 | html_text() # 提取老师 267 | price <- web %>% html_nodes("div.meta") %>% html_nodes("span.price") %>% 268 | html_text() # 提取价格 269 | result1 <- data.frame(课程=class,课时数=length,学生人数=people, 270 | 授课老师=teacher,课程价格=price) 271 | result <- data.frame(rbind(result,result1)) 272 | } 273 | head(result) 274 | -------------------------------------------------------------------------------- /code/chapter3.R: -------------------------------------------------------------------------------- 1 | ## 3.1 常用图形参数 2 | # 3.1.1 颜色 3 | # 对women数据集绘制散点图,并用红色表示散点。 4 | plot(women,col="red") # 通过颜色名称 5 | plot(women,col=554) # 通过颜色下标 6 | plot(women,col="#FF0000") #通过十六进制的颜色值 7 | mycolor <- rgb(red=255,green=0,blue=0,max=255) 8 | plot(women,col=mycolor) # 通过RGB值 9 | # 对其他图形参数颜色进行设置 10 | plot(women,main="身高 VS 体重 散点图",sub="数据来源:women数据集", 11 | col="red",col.main="green",col.sub="blue", 12 | col.axis="grey",col.lab="yellow") 13 | colors() 14 | # 主题颜色 15 | par(mfrow=c(3,2)) 16 | barplot(rep(1,7),col=rainbow(7),main="barplot(rep(1,7),col=rainbow(7))") 17 | barplot(rep(1,7),col=heat.colors(7),main="barplot(rep(1,7),col=heat.colors(7))") 18 | barplot(rep(1,7),col=terrain.colors(7),main="barplot(rep(1,7),col=terrain.colors(7))") 19 | barplot(rep(1,7),col=topo.colors(7),main="barplot(rep(1,7),col=topo.colors(7))") 20 | barplot(rep(1,7),col=cm.colors(7),main="barplot(rep(1,7),col=cm.colors(7))") 21 | par(mfrow=c(1,1)) 22 | 23 | # 3.1.2 文字元素 24 | # 字体 25 | plot(0:4,type="n",axes = F,xlab = NA,ylab = NA) 26 | type <- c("正常字体(默认)","粗体字体","斜体字体","粗斜体字体") 27 | for(i in 1:4){ 28 | text(2,5-i,labels = paste0("font=",i,":",type[i]),font = i) 29 | } 30 | # 大小 31 | plot(0:5,type="n",axes = F,xlab = NA,ylab = NA) 32 | text(2,5,labels="cex=0.5:放大0.5倍",cex=0.5) 33 | text(2,4,labels="cex=0.8:放大0.8倍",cex=0.8) 34 | text(2,3,labels="cex=1(默认):正常大小",cex=1) 35 | text(2,2,labels="cex=1.5:放大1.5倍",cex=1.5) 36 | text(2,1,labels="cex=2:放大2倍",cex=2) 37 | 38 | # 3.1.3 点元素 39 | plot(1,col="white",xlim=c(1,7),ylim=c(1,5), 40 | main = "点样式 pch=",xlab=NA,ylab=NA) 41 | for(i in c(0:25)){ 42 | x<-(i %/% 5)*1+1 43 | y<-6-(i%%5)-1 44 | if(length(which(c(21:25)==i)>=1)){ 45 | points(x,y,pch=i,col="blue",bg="yellow",cex=2) 46 | } else { 47 | points(x,y,pch=i,cex=2) 48 | } 49 | text(x+0.2,y,labels = i) 50 | } 51 | # pch取值可以为"*,?,a,A,0,.,+,-,|" 52 | points(6,4,pch="*",cex=2);text(6+0.2,4,labels="\"*\"") 53 | points(6,3,pch="?",cex=2);text(6+0.2,3,labels="\"?\"") 54 | points(6,2,pch="a",cex=2);text(6+0.2,2,labels="\"a\"") 55 | points(6,1,pch="A",cex=2);text(6+0.2,1,labels="\"A\"") 56 | points(7,5,pch="0",cex=2);text(7+0.2,5,labels="\"0\"") 57 | points(7,4,pch=".",cex=2);text(7+0.2,4,labels="\".\"") 58 | points(7,3,pch="+",cex=2);text(7+0.2,3,labels="\"+\"") 59 | points(7,2,pch="-",cex=2);text(7+0.2,2,labels="\"-\"") 60 | points(7,1,pch="|",cex=2);text(7+0.2,1,labels="\"|\"") 61 | 62 | # 3.1.4 线元素 63 | plot(x=1:10,y=rep(1,10),type="l",lty=0,ylim=c(1,8),xlim=c(-1,10), 64 | axes=F,xlab=NA,ylab=NA) 65 | text(0,1,labels="lty=0") 66 | for(i in 2:7){ 67 | lines(x=1:10,y=rep(i,10),lty=i-1,xlab=NA,ylab=NA) 68 | text(0,i,labels=paste0("lty=",i-1)) 69 | } 70 | 71 | 72 | ## 3.2 低级绘图函数 73 | # 3.2.1 标题 74 | attach(iris) 75 | boxplot(Sepal.Length~Species,col=heat.colors(3), 76 | main=list("Sepal.Length按照Species分类的箱线图", 77 | font=4,col="red",cex=1.5), 78 | sub=list("数据来源:iris数据集",font=3, 79 | col="green",cex=0.8), 80 | xlab="Species",ylab="Sepal.Length") 81 | # title函数 82 | boxplot(Sepal.Length~Species,col=heat.colors(3)) 83 | title(main=list("Sepal.Length按照Species分类的箱线图", 84 | font=4,col="red",cex=1.5), 85 | sub=list("数据来源:iris数据集",font=3, 86 | col="green",cex=0.8), 87 | xlab="Species",ylab="Sepal.Length") 88 | # title另一种方式 89 | boxplot(Sepal.Length~Species,col=heat.colors(3)) 90 | title(main="Sepal.Length按照Species分类的箱线图", 91 | font.main=4,col.main="red",cex.main=1.5, 92 | sub="数据来源:iris数据集",font.sub=3, 93 | col.sub="green",cex.sub=0.8, 94 | xlab="Species",ylab="Sepal.Length") 95 | 96 | # 3.2.2 坐标轴 97 | #加载iris数据到内存 98 | attach(iris) 99 | #绘制箱线图 100 | boxplot(Sepal.Length~Species,col=heat.colors(3), 101 | axes=FALSE,xlab="Species",ylab="Sepal.Length") 102 | #设置X轴样式 103 | axis(side=1,at=1:3,labels=unique(Species),col.axis="red",tick=FALSE) 104 | #设置Y轴样式 105 | axis(side=2,col.ticks = "gold",font = 3,col = "blue") 106 | 107 | # 3.2.3 图例 108 | #绘制分组柱状图 109 | barplot(VADeaths,beside = TRUE,col=cm.colors(5)) 110 | # 添加图例 111 | legend("top",legend=rownames(VADeaths), 112 | ncol=5,fill=cm.colors(5),bty="n") 113 | 114 | # 3.2.4 网格线 115 | op <- par(mfcol=1:2) 116 | barplot(VADeaths,beside = TRUE,col=cm.colors(5), 117 | main="plot VADeaths with grid()") 118 | grid() 119 | barplot(VADeaths,beside = TRUE,col=cm.colors(5), 120 | main="plot VADeaths with grid(NA,7,lty=2,lwd=1.5,col='green')") 121 | grid(NA,7,lty=2,lwd=1.5,col="green") 122 | par(op) 123 | 124 | # 3.2.5 点 125 | set.seed(1234) 126 | data <- c(rnorm(100,mean=0,sd=1),rnorm(3,mean=4,sd=1)) 127 | boxplot(data,col="violet",ylim=c(-4,5),outline=F) 128 | points(rep(1,3),data[101:103],pch=21,bg="yellow",cex=1.2) 129 | 130 | # 3.2.6 文字 131 | text(rep(1,3),data[101:103],pos=4,label=paste0("异常值",round(data[101:103],3))) 132 | 133 | # 3.2.7 线 134 | # lines函数 135 | data(economics, package = "ggplot2") 136 | attach(economics) #将economics加载到内存 137 | plot(date,psavert,type="l",ylab="",ylim=c(0,26)) #绘制psavert随时间变化的时序图 138 | lines(date,uempmed,type="l",col="blue") #绘制uempmed曲线,并设置为蓝色 139 | detach(economics) #将economics从内存中移除 140 | # abline函数 141 | # 通常会调用abline画一条线 142 | attach(iris) 143 | # 绘制一幅简单的散点图 144 | plot(Petal.Length~Petal.Width) 145 | # 绘制Petal.Length变量均值的水平线 146 | abline(h=mean(Petal.Length),col="gray60") 147 | # 绘制Petal.Width变量均值的竖直线 148 | abline(v=mean(Petal.Width),col="gray60") 149 | # 绘制拟合直线 150 | abline(lm(Petal.Length~Petal.Width), 151 | col="red",lwd=2,lty=3) 152 | detach(iris) 153 | 154 | 155 | ## 3.3 高级绘图函数 156 | # 3.3.1 散点图 157 | # 1.普通散点图 158 | par(mfrow=c(1,2)) 159 | # 绘制一维数据 160 | plot(x=rnorm(10)) 161 | # 绘制二维数据 162 | plot(women) 163 | par(mfrow=c(1,1)) 164 | # 2.散点图矩阵 165 | # 利用plot函数 166 | plot(iris[,1:4],main="利用plot函数绘制散点图矩阵") 167 | # 利用pairs函数 168 | # 方法一 169 | pairs(iris[,1:4],main="利用pairs函数绘制散点图矩阵") 170 | # 方法二 171 | pairs(~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, 172 | data=iris,main="利用pairs函数绘制散点图矩阵") 173 | # 3.高密度散点图 174 | # 创建一个大数据集 175 | n <- 10000 176 | x1 <- matrix(rnorm(n), ncol = 2) 177 | x2 <- matrix(rnorm(n, mean = 3, sd = 1.5), ncol = 2) 178 | x <- rbind(x1, x2) 179 | # 利用plot与smoothScatter函数绘制散点图 180 | par(mfrow=c(1,2)) 181 | plot(x,main="利用plot函数绘制普通散点图") 182 | smoothScatter(x,main="利用smoothScatter函数绘制高密度散点图") 183 | par(mfrow=c(1,1)) 184 | 185 | # 3.3.2 气泡图 186 | data("diamonds",package = "ggplot2") 187 | # 随机抽取500个样本 188 | diamonds1 <- diamonds[sample(1:nrow(diamonds),500),] 189 | attach(diamonds1) 190 | # 计算钻石体积 191 | volumn <- x*y*z 192 | # 把钻石体积进行归一化处理,并赋予对象size 193 | size <- (volumn-min(volumn))/(max(volumn)-min(volumn)) 194 | # 利用plot函数绘制气泡图 195 | plot(carat,price,cex=size*2) 196 | # 利用symbols函数绘制气泡图 197 | x<-rnorm(10) 198 | y<-rnorm(10) 199 | r<-abs(rnorm(10)) 200 | symbols(x,y,circle = r, 201 | bg=rainbow(10)) 202 | 203 | # 3.3.3 线图 204 | type <- c('l','b','c','o','s','S') 205 | par(mfrow=c(2,3)) 206 | for(i in 1:6){ 207 | plot(1:10,type=type[i],main=paste0("type=",type[i])) 208 | } 209 | par(mfrow=c(1,1)) 210 | 211 | # 3.3.4 柱状图 212 | par(mfrow=c(1,2)) 213 | for(i in c(FALSE,TRUE)){ 214 | barplot(VADeaths,horiz = i,beside = T,col = rainbow(5)) 215 | } 216 | par(mfrow=c(1,1)) 217 | # 增加图例 218 | barplot(VADeaths,beside = T,col = rainbow(5), 219 | legend.text = rownames(VADeaths)) 220 | 221 | # 3.3.5 饼图 222 | pie(table(mtcars$cyl)) 223 | 224 | # 3.3.6 直方图和密度图 225 | # 绘制直方图 226 | data(economics, package = "ggplot2") 227 | attach(economics) #将economics加载到内存 228 | par(mfrow=c(2,2)) 229 | hist(psavert,8,xlab="个人储蓄率",ylab="频数",col="blue", 230 | main="个人储蓄率直方图(较少区间)") 231 | hist(psavert,30,xlab="个人储蓄率",ylab="频数",col="blue", 232 | main="个人储蓄率直方图(较多区间)") 233 | hist(uempmed,8,xlab="一周内平均失业持续时间",ylab="频数",col="green", 234 | main="一周内平均失业持续时间(较少区间)") 235 | hist(uempmed,30,xlab="一周内平均失业持续时间",ylab="频数",col="green", 236 | main="一周内平均失业持续时间(较多区间)") 237 | par(mfrow=c(1,1)) 238 | detach(economics) #将economics从内存中释放 239 | # 绘制核密度图 240 | plot(density(economics$psavert)) 241 | rug(economics$psavert) 242 | 243 | # 3.3.7 Q-Q图 244 | qqnorm(economics$psavert) 245 | 246 | # 3.3.8 箱线图 247 | boxplot(iris$Sepal.Length~iris$Species,col=rainbow(3)) 248 | 249 | # 3.3.9 茎叶图 250 | stem(mtcars$wt) 251 | 252 | # 3.3.10 点图 253 | dotchart(mtcars$mpg,labels = rownames(mtcars)) 254 | 255 | # 3.3.11 马赛克图 256 | ftable(Titanic) 257 | mosaicplot(Titanic) 258 | library(vcd) 259 | mosaic(Titanic,shade = T,legend = T) -------------------------------------------------------------------------------- /code/chapter4.R: -------------------------------------------------------------------------------- 1 | ##### 4.1 lattice包绘图工具 2 | # 4.1.1 绘图特色 3 | # 构建简单数据集 4 | d <- data.frame(x=seq(0,14),y=seq(1,15),z=rep(c("a","b","c"),times=5)) 5 | # 绘制简单散点图 6 | if(!require(lattice)) install.packages("lattice") 7 | xyplot(y~x,data=d) 8 | # 图形参数 9 | op <- trellis.par.get() 10 | trellis.par.get("axis.text") 11 | trellis.par.set(list(axis.text=list(cex=1.5,col="blue"))) 12 | xyplot(y~x,data=d) 13 | trellis.par.set(op) 14 | show.settings() 15 | xyplot(y~x,groups=z,data=d) 16 | mysettings <- trellis.par.get() 17 | mysettings$superpose.symbol$col 18 | mysettings$superpose.symbol$pch 19 | mysettings$superpose.symbol$pch <- 1:10 20 | mysettings$superpose.symbol$col <- "black" 21 | trellis.par.set(mysettings) 22 | xyplot(y~x,groups=z,data=d) 23 | trellis.par.set(op) 24 | # 条件变量 25 | # 绘制带有条件变量的散点图 26 | library(lattice) 27 | xyplot(y~x|z,data=d,layout=c(3,1)) 28 | # 面板函数 29 | mypanel <- function(...){ 30 | panel.abline(a=1,b=1) 31 | panel.xyplot(...) 32 | } 33 | xyplot(y~x|z,data=d,layout=c(3,1), 34 | panel=mypanel) 35 | # 分组变量 36 | densityplot(~mpg,data=mtcars,lty=1:2,col=1:2,lwd=2, 37 | groups=factor(am), 38 | main=list("MPG Distrubution by Tranamission Type",cex=1.5), 39 | xlab="Miles per Gallon", 40 | key=list(column=2, 41 | space="bottom", 42 | title="Transmission (0 = automatic, 1 = manual)", 43 | text=list(levels(factor(mtcars$am))), 44 | lines=list(lty=1:2,col=1:2,lwd=2))) 45 | # 页面摆放 46 | graph1 <- xyplot(mpg~wt,data=mtcars,xlab="Weight",ylab="Miles Per Gallon") 47 | displacement <- equal.count(mtcars$disp,number=3,overlap=0) 48 | graph2 <- xyplot(mpg~wt|displacement,data=mtcars,layout=c(3,1), 49 | xlab="Weight",ylab="Miles Per Gallon") 50 | plot(graph1,split=c(1,1,2,1)) 51 | plot(graph2,split=c(2,1,2,1),newpage = FALSE) 52 | plot(graph1,position = c(0,0,0.5,1)) 53 | plot(graph2,position=c(0.5,0,1,1),newpage = FALSE) 54 | 55 | # 高级lattice函数 56 | # 条形图 57 | library(lattice) 58 | str(Titanic) # 查看Titanic数据结构 59 | barchart(Titanic,layout=c(4,1),auto.key=TRUE) # 对table类型画出条形图,data参数不用设置 60 | barchart(Titanic,layout=c(4,1), 61 | auto.key=TRUE,scales=list(x="free")) #将x轴坐标设置为free 62 | # 将表格数据Tatanic转换成数据框,然后绘制条形图 63 | barchart(Class~Freq|Sex+Age,data=as.data.frame(Titanic), 64 | groups=Survived,stack=TRUE,layout=c(4,1), 65 | auto.key=TRUE,scales=list(x="free")) 66 | # 改变图例摆放形式 67 | barchart(Class~Freq|Sex+Age,data=as.data.frame(Titanic), 68 | groups=Survived,stack=TRUE,layout=c(4,1), 69 | auto.key=list(title="Survived",columns=2), 70 | scales=list(x="free")) 71 | # 将lattice的高级绘图函数创建的栅栏图存在mygraph对象中。 72 | mygraph <- barchart(Class~Freq|Sex+Age,data=as.data.frame(Titanic), 73 | groups=Survived,stack=TRUE,layout=c(4,1), 74 | auto.key=list(title="Survived",columns=2), 75 | scales=list(x="free")) 76 | # 通过update函数给mygraph图形增加垂直网格线,并将条形边框设置为透明色 77 | update(mygraph, 78 | panel=function(...){ 79 | panel.grid(h=0,v=-1) 80 | panel.barchart(...,border="transparent") 81 | }) 82 | 83 | # 点图 84 | library(lattice) 85 | # 绘制分组点图 86 | dotplot(VADeaths,pch=1:4,col=1:4, 87 | main = list("Death Rates in Virginia - 1940",cex=1.5), 88 | xlab = "Rate (per 1000)", 89 | key=list(column=4, 90 | text=list(colnames(VADeaths)), 91 | points=list(pch=1:4,col=1:4))) 92 | # 绘制面板点图 93 | dotplot(VADeaths, groups = FALSE, 94 | main = list("Death Rates in Virginia - 1940",cex=1.5), 95 | xlab = "Rate (per 1000)") 96 | # 调整type参数,美化点图 97 | dotplot(VADeaths, groups = FALSE, 98 | layout=c(1,4),aspect = 0.5, 99 | origin = 0, type = c("p", "h"), 100 | main = list("Death Rates in Virginia - 1940",cex=1.3), 101 | xlab = "Rate (per 1000)") 102 | 103 | # 直方图 104 | library(lattice) 105 | library(nutshell) 106 | data(births2006.smpl) 107 | histogram(~DBWT|DPLURAL,data=births2006.smpl, 108 | main="Births in the United States, 2006", 109 | xlab="Birth weight, in grams") 110 | # 调整layout参数 111 | histogram(~DBWT|DPLURAL,data=births2006.smpl,layout=c(1,5), 112 | main="Births in the United States, 2006", 113 | xlab="Birth weight, in grams") 114 | 115 | # 核密度图 116 | densityplot(~DBWT|DPLURAL,data=births2006.smpl, 117 | layout=c(1,5),plot.points=FALSE, 118 | main="Births in the United States, 2006", 119 | xlab="Birth weight, in grams") 120 | # 绘制叠加密度图 121 | densityplot(~DBWT,groups=DPLURAL,data=births2006.smpl, 122 | plot.points=FALSE,lty=1:5,col=1:5,lwd=1.5, 123 | main="Births in the United States, 2006", 124 | xlab="Birth weight, in grams", 125 | key=list(column=3, 126 | text=list(levels(births2006.smpl$DPLURAL)), 127 | lines=list(lty=1:5,col=1:5))) 128 | 129 | # 带状图 130 | stripplot(~DBWT,data=births2006.smpl, 131 | subset=(DPLURAL=="5 Quintuplet or highter" | 132 | DPLURAL=="4 Quadruplet"), 133 | jitter.data=TRUE, 134 | main="Births in the United States, 2006", 135 | xlab="Birth weight, in grams") 136 | 137 | # Q-Q图 138 | # 单变量Q-Q图 139 | library(lattice) 140 | qqmath(~ height | voice.part, aspect = "xy", data = singer, 141 | prepanel = prepanel.qqmathline, 142 | panel = function(x, ...) { 143 | panel.qqmathline(x, ...) 144 | panel.qqmath(x, ...) 145 | }) 146 | # 生成比较两个分布的Q-Q图 147 | qq(voice.part ~ height, aspect = 1, data = singer, 148 | subset = (voice.part == "Bass 2" | voice.part == "Tenor 1")) 149 | 150 | # 箱线图 151 | # 栅栏箱线图 152 | bwplot( ~ height|voice.part, data=singer, xlab="Height (inches)") 153 | # 分组箱线图 154 | bwplot(voice.part ~ height, data=singer, xlab="Height (inches)") 155 | 156 | # 散点图 157 | xyplot(Sepal.Length~Sepal.Width|Species,data=iris) 158 | # 对Petal.Length变量进行分组再画图 159 | xyplot(Sepal.Length~Sepal.Width|cut(Petal.Length,2),data=iris) 160 | 161 | # 散点图矩阵 162 | library(lattice) 163 | # 普通散点图矩阵 164 | splom(mtcars[c(1, 3:7)], groups = mtcars$cyl, 165 | auto.key=TRUE) 166 | # 修改变量名和图例的散点图矩阵 167 | splom(mtcars[c(1, 3:7)], groups = mtcars$cyl, 168 | pscales = 0,pch=1:3,col=1:3, 169 | varnames = c("Miles\nper\ngallon", "Displacement\n(cu. in.)", 170 | "Gross\nhorsepower", "Rear\naxle\nratio", 171 | "Weight", "1/4 mile\ntime"), 172 | key = list(columns = 3, title = "Number of Cylinders", 173 | text=list(levels(factor(mtcars$cyl))), 174 | points=list(pch=1:3,col=1:3))) 175 | 176 | # 三维水平图 177 | library(lattice) 178 | data(Cars93, package = "MASS") 179 | cor.Cars93 <-cor(Cars93[, !sapply(Cars93, is.factor)], use = "pair") 180 | levelplot(cor.Cars93,scales = list(x = list(rot = 90))) 181 | 182 | 183 | # 三维等高线图 184 | contourplot(volcano, cuts = 20, label = FALSE) 185 | 186 | # 三维散点图 187 | par.set <-list(axis.line = list(col = "transparent"), 188 | clip = list(panel = "off")) 189 | cloud(Sepal.Length ~ Petal.Length * Petal.Width,data = iris, 190 | cex = .8,pch=1:3,col=c("blue","red","green"), 191 | groups = Species,screen = list(z = 20, x = -70, y =0), 192 | par.settings = par.set, 193 | scales = list(col = "black"), 194 | key=list(title="Species", 195 | column=3, 196 | space="bottom", 197 | text=list(levels(iris$Species)), 198 | points=list(pch=1:3,col=c("blue","red","green")))) 199 | 200 | # 三维曲面图 201 | wireframe(volcano, shade = TRUE, 202 | aspect = c(61/87, 0.4), 203 | light.source = c(10,0,10)) 204 | 205 | 206 | ### 4.2 ggplot2包绘图工具 207 | library(ggplot2) 208 | # 利用qplot绘制箱线图 209 | qplot(Species,Sepal.Length,data=iris, 210 | geom="boxplot",fill=Species, 211 | main="依据种类分组的花萼长度箱线图") 212 | # 利用qplot绘制小提琴图 213 | qplot(Species,Sepal.Length,data=iris, 214 | geom=c("violin","jitter"),fill=Species, 215 | main="依据种类分组的花萼长度小提琴图") 216 | # 利用qplot绘制散点图 217 | qplot(Sepal.Length,Sepal.Width,data=iris, 218 | colour=Species,shape=Species, 219 | main="绘制花萼长度和花萼宽度的散点图") 220 | # 利用qplot绘制分面板散点图 221 | qplot(Sepal.Length,Sepal.Width,data=iris, 222 | geom=c("point","smooth"), 223 | facets=~Species,colour=Species, 224 | main="绘制分面板的散点图") 225 | # 利用ggplot函数绘制箱线图 226 | library(ggplot2) 227 | ggplot(iris,aes(x=Species,y=Sepal.Length,fill=Species))+ 228 | geom_boxplot()+ 229 | labs(title="依据种类分组的花萼长度箱线图") 230 | # 利用ggplot函数绘制小提琴图 231 | ggplot(iris,aes(x=Species,y=Sepal.Length,fill=Species))+ 232 | geom_violin()+ 233 | geom_jitter()+ 234 | labs(title="依据种类分组的花萼长度箱线图") 235 | # 利用ggplot的分面函数绘制分面板密度图 236 | data(singer,package = "lattice") 237 | ggplot(data=singer,aes(x=height,fill=voice.part))+ 238 | geom_density()+ 239 | facet_grid(voice.part~.) 240 | ggplot(data=singer,aes(x=height,fill=voice.part))+ 241 | geom_density()+ 242 | facet_wrap(~voice.part,ncol=4)+ 243 | theme(legend.position="none") 244 | # 调整图形填充颜色 245 | library(gridExtra) 246 | # 方式一:使用scale_color_manual函数 247 | g1 <- ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,colour=Species,shape=Species))+ 248 | scale_color_manual(values=c("orange", "olivedrab", "navy"))+ 249 | geom_point(size=3) 250 | # 方式而:使用scale_color_brewer函数 251 | g2 <- ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,colour=Species,shape=Species))+ 252 | scale_color_brewer(palette="Set1")+ 253 | geom_point(size=3) 254 | grid.arrange(g1,g2,ncol=2) 255 | # 保存ggplot的图形 256 | ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,colour=Species))+ 257 | geom_point(size=2) 258 | ggsave(file="mygraph.pdf",width=5,height=4) 259 | 260 | # ggthemes包 261 | library(ggplot2) 262 | library(ggthemes) 263 | library(gridExtra) 264 | p1 <- ggplot(mtcars, aes(x = wt, y = mpg)) + 265 | geom_point(size=3) 266 | # Economist themes 267 | p2 <- p1 + ggtitle("Economist theme") + 268 | theme_economist() + scale_colour_economist() 269 | # Solarized theme 270 | p3 <- p1 + ggtitle("Solarized theme") + 271 | theme_solarized() + scale_colour_solarized("blue") 272 | grid.arrange(p2,p3,ncol=2) 273 | 274 | # Stata theme 275 | p4 <- p1 + ggtitle("Stata them") + 276 | theme_stata() + scale_colour_stata() 277 | # Excel 2003 theme 278 | p5 <- p1 + ggtitle("Excel 2003 them") + 279 | theme_excel() + scale_colour_excel() 280 | grid.arrange(p4,p5,ncol = 2) 281 | 282 | 283 | # 4.3 交互式绘图工具 284 | # rCharts包 285 | # nPlot函数 286 | # 绘制交互柱状图 287 | library(rCharts) 288 | hair_eye_male <- subset(as.data.frame(HairEyeColor), Sex == "Male") 289 | hair_eye_male[,1] <- paste0("Hair",hair_eye_male[,1]) 290 | hair_eye_male[,2] <- paste0("Eye",hair_eye_male[,2]) 291 | nPlot(Freq ~ Hair, group = "Eye", data = hair_eye_male, type = "multiBarChart") 292 | # 绘制交互条形图 293 | n2 <- nPlot(Freq ~ Hair, group = "Eye", data = hair_eye_male, 294 | type="multiBarHorizontalChart") 295 | n2 296 | n2$chart(showControls=F) 297 | n2 298 | # hPlot函数 299 | a <- hPlot(Pulse ~ Height, data = MASS::survey, type = 'scatter', 300 | group = 'Sex', radius = 6, group.na = "Not Available") 301 | a$colors('rgba(223, 83, 83, .5)', 'rgba(119, 152, 191, .5)', 'rgba(60, 179, 113, .5)') 302 | a$legend(align = 'right', verticalAlign = 'top', layout = 'vertical') 303 | a$chart(zoomType = "xy") 304 | a$exporting(enabled = T) 305 | a 306 | # mPlot函数 307 | data(economics, package = 'ggplot2') 308 | dat <- transform(economics, date = as.character(date)) 309 | p1 <- mPlot(x = "date", y = "psavert", data = dat, type = 'Line', 310 | pointSize = 0, lineWidth = 1) 311 | p1 312 | p1$set(type="Area") 313 | p1 314 | 315 | # recharts包 316 | # 散点图 317 | library(recharts) 318 | echartr(iris, Sepal.Length, Sepal.Width) 319 | # 分组散点图 320 | g <- echartr(iris, Sepal.Width, Petal.Width, series =Species) 321 | g %>% setSeries(symbolSize=8) 322 | # 改变散点符号,不显示工具箱 323 | g <- echartr(iris, Sepal.Width, Petal.Width, series =Species) %>% 324 | setSeries(symbolSize=8) %>% 325 | setSymbols(c('heart', 'arrow','diamond')) %>% 326 | setToolbox(show=FALSE) 327 | g 328 | # 增加标记 329 | g %>% addMarkPoint(series=unique(iris$Species), 330 | data=data.frame(type="max",name="最大值")) 331 | # 添加标题 332 | g %>% setTitle("依据种类绘制的分组散点图") 333 | # 改变标题和图例摆放位置 334 | g %>% setTitle("依据种类绘制的分组散点图",pos=12) %>% 335 | setLegend(pos=3) 336 | # 主题美化 337 | g <- echartr(iris, Sepal.Length, Sepal.Width) %>% 338 | setSeries(symbolSize=8) 339 | g %>% setTheme('helianthus', calculable=TRUE) 340 | 341 | # 条形图 342 | revenue <- read.csv("revenue.csv") 343 | library(reshape2) 344 | revenue <- melt(revenue,id="游戏名称") 345 | colnames(revenue) <- c("游戏名称","时间段","收入") 346 | # 绘制条形图,默认hbar类型 347 | b <- echartr(revenue,"游戏名称","收入","时间段") %>% 348 | setTitle("游戏收入",pos=12) %>% 349 | setLegend(pos=6) 350 | b 351 | b %>% setGrid(x=150) 352 | 353 | # 增加权重变量 354 | revenue$权重 <- ifelse(revenue$时间段=='本周',2,1) 355 | # 绘制柱状图 356 | echartr(revenue,"游戏名称","收入","时间段",weight = "权重",type = "hbar") %>% 357 | setTitle("游戏收入",pos=12) %>% 358 | setLegend(pos=6) %>% 359 | setGrid(x=150) 360 | 361 | # 绘制龙卷风图 362 | revenue_tc <- revenue 363 | revenue_tc$收入[revenue_tc$时间段=="上周"] <- 364 | -revenue_tc$收入[revenue_tc$时间段=="上周"] 365 | g <- echartr(revenue_tc,"游戏名称","收入","时间段",type = "hbar") %>% 366 | setTitle("游戏收入",pos=12) %>% 367 | setLegend(pos=6) %>% 368 | setGrid(x=150) 369 | g 370 | # 金字塔图 371 | g <- echartr(revenue_tc,"游戏名称","收入","时间段",type = "hbar",subtype='stack') %>% 372 | setTitle("游戏收入",pos=12) %>% 373 | setLegend(pos=6) %>% 374 | setGrid(x=150) %>% 375 | setYAxis(axisLine=list(onZero=TRUE)) %>% 376 | setXAxis(axisLabel=list( 377 | formatter=JS('function (value) {return Math.abs(value);}') 378 | )) 379 | g 380 | 381 | # rbokeh包 382 | # 绘制散点图 383 | if(!require(rbokeh)) install.packages("rbokeh") 384 | z <- lm(dist ~ speed, data = cars) 385 | p <- figure(width = 600, height = 600) %>% 386 | ly_points(cars, hover = cars) %>% 387 | ly_lines(lowess(cars), legend = "lowess") %>% 388 | ly_abline(z, type = 2, legend = "lm") 389 | p 390 | # 绘制直方图 391 | h <- figure(width = 600, height = 400) %>% 392 | ly_hist(eruptions, data = faithful, breaks = 40, freq = FALSE) %>% 393 | ly_density(eruptions, data = faithful) 394 | h 395 | # 绘制箱线图 396 | figure(ylab = "Height (inches)", width = 600) %>% 397 | ly_boxplot(voice.part, height, data = lattice::singer) 398 | 399 | # plotly包 400 | revenue <- read.csv("revenue.csv") 401 | revenue 402 | # 绘制柱状图 403 | if(!require(plotly)) install.packages("plotly") 404 | p <- plot_ly(revenue,y = ~本周,x = ~游戏名称,type = "bar",name = "本周") 405 | p 406 | p %>% add_trace(y = ~上周,name = "上周") 407 | p %>% 408 | add_trace(y = ~上周,name = "上周") %>% 409 | layout(barmode = 'stack', 410 | xaxis = list(title = ""), 411 | yaxis = list(title = ""), 412 | title = "游戏收入数据") 413 | # 绘制箱线图 414 | plot_ly(midwest, x = percollege, color = state, type = "box") 415 | 416 | # googleVis包 417 | library(googleViz) 418 | M1 <- gvisMotionChart(Fruits, idvar="Fruit", timevar="Year") 419 | plot(M1) 420 | 421 | # leaflet包 422 | # 在地图上标记R语言的诞生地--新西兰奥克兰大学 423 | library(leaflet) 424 | leaflet() %>% 425 | addTiles() %>% 426 | addMarkers(lng=174.768,lat=-36.852,popup="ThebirthplaceofR") 427 | # 在地图上标记深圳市 428 | location <- REmap::get_city_coord("深圳") 429 | leaflet()%>% 430 | setView(lng=location[1],lat=location[2],zoom=9)%>% 431 | addTiles() %>% 432 | addMarkers(lng=location[1],lat=location[2],popup="这里是深圳市") 433 | 434 | # dygraphs包 435 | if(!require(dygraphs)) install.packages("dygraphs") 436 | # LTV预测曲线 437 | LTV <- read.csv("LTV.csv") 438 | LTV.ts <- ts(LTV) 439 | dygraph(LTV.ts,main="LTV forecast") %>% 440 | dySeries("V1",label="LTV",strokeWidth = 2) %>% 441 | dyOptions(colors = "black",fillGraph = FALSE,fillAlpha = 0.4) %>% 442 | dyHighlight(highlightCircleSize = 5, 443 | highlightSeriesBackgroundAlpha = 0.2, 444 | hideOnMouseOut = FALSE) %>% 445 | dyAxis("x", drawGrid = FALSE) %>% 446 | dyAxis("y", label = "LTV(Life Time Value)") %>% 447 | dyRangeSelector() 448 | 449 | # DT包 450 | library(DT) 451 | datatable(iris) 452 | datatable(iris,rownames = FALSE) # 不输出行号 453 | 454 | # networkD3包 455 | # 利用simpleNetwork函数绘制简单网络图 456 | library(networkD3) 457 | src <- c("A", "A", "A", "A", 458 | "B", "B", "C", "C", "D") 459 | target <- c("B", "C", "D", "J", 460 | "E", "F", "G", "H", "I") 461 | networkData <- data.frame(src, target) 462 | simpleNetwork(networkData,zoom=T) 463 | # 利用networkD3函数绘制力导向网络图 464 | # 加载数据 465 | data(MisLinks) 466 | data(MisNodes) 467 | # 画图 468 | forceNetwork(Links = MisLinks, Nodes = MisNodes, 469 | Source = "source", Target = "target", 470 | Value = "value", NodeID = "name", 471 | Group = "group", opacity = 0.8) 472 | 473 | # pairsD3包 474 | if(!require(pairsD3)) install.packages("pairsD3") 475 | pairsD3(iris[,1:4],group = iris[,5], 476 | labels = c("花萼长度","花萼宽度","花瓣长度","花瓣宽度","种类")) 477 | 478 | # scatterD3包 479 | if(!require(scatterD3)) install.packages("scatterD3") 480 | mtcars$names <- rownames(mtcars) 481 | scatterD3(data = mtcars, x = wt, y = mpg, lab = names, 482 | col_var = cyl, symbol_var = am, 483 | xlab = "Weight", ylab = "Mpg", col_lab = "Cylinders", 484 | symbol_lab = "Manual transmission") 485 | 486 | # wordcloud2包 487 | if(!require(wordcloud2)) devtools::install_github("lchiffon/wordcloud2") 488 | letterCloud(demoFreqC[1:200,], "R", fontFamily = "微软雅黑", 489 | color = "random-light") 490 | 491 | # timevis包 492 | if(!require(timevis)) install.packages("timevis") 493 | data <- data.frame( 494 | id = 1:4, 495 | content = c("事项一" , "事项二" ,"事项三", "事项四"), 496 | start = c("2016-11-10", "2016-11-11", "2016-11-20", "2016-12-14 15:00:00"), 497 | end = c(NA , NA, "2016-12-04", NA) 498 | ) 499 | timevis(data) 500 | 501 | # rpivotTable包 502 | # devtools::install_github(c("ramnathv/htmlwidgets", "smartinsightsfromdata/rpivotTable")) 503 | library(rpivotTable) 504 | mtcars$vs <- factor(ifelse(mtcars$vs==0,"自动","手动")) 505 | colnames(mtcars)[8] <- "传输" 506 | rpivotTable(mtcars) 507 | 508 | -------------------------------------------------------------------------------- /code/chapter5.R: -------------------------------------------------------------------------------- 1 | ## 5.1 数据抽样 2 | # 5.1.2 类失衡处理方法:SMOTE 3 | # 利用Thyroid Disease 数据来研究 4 | # 下载数据 5 | hyper <-read.csv('http://archive.ics.uci.edu/ml/machine-learning-databases/thyroid-disease/hypothyroid.data', 6 | header=F) 7 | names <- read.csv('http://archive.ics.uci.edu/ml/machine-learning-databases/thyroid-disease/hypothyroid.names', 8 | header=F, sep='\t')[[1]] 9 | # 对对象names删除冒号和句号 10 | names <- gsub(pattern =":|[.]", replacement="", x = names) 11 | # 对对象hyper的列进行重命名 12 | colnames(hyper)<-names 13 | colnames(hyper) 14 | # 我们将第一列的列名从 hypothyroid, negative改成target,并将该列中的因子negative变成0,其他值变成1 15 | colnames(hyper)[1]<-"target" 16 | colnames(hyper) 17 | hyper$target<-ifelse(hyper$target=="negative",0,1) 18 | # 检查下0、1的结果 19 | table(hyper$target) 20 | prop.table(table(hyper$target)) 21 | # 利用SMOTE对类失衡问题进行处理 22 | # 将变量target变成因子型 23 | hyper$target <- as.factor(hyper$target) 24 | # 加载DMwR包 25 | if(!require(DMwR)) install.packages("DMwR") 26 | # 进行类失衡处理 27 | # perc.over=100:表示少数样本数=151+151*100%=302 28 | # perc.under=200:表示多数样本数(新增少数样本数*200%=151*200%=302) 29 | hyper_new <- SMOTE(target~.,hyper,perc.over = 100,perc.under = 200) 30 | # 查看处理后变量target的0、1个数 31 | table(hyper_new$target) 32 | # perc.over=200:表示少数样本数=151+151*200%=453 33 | # perc.under=300:表示多数样本数(新增少数样本数*300%=151*200%*300%=906) 34 | hyper_new1 <- SMOTE(target~.,hyper,perc.over = 200,perc.under = 300) 35 | # 查看处理后变量target的0、1个数 36 | table(hyper_new1$target) 37 | 38 | 39 | # 对活跃用户是否付费数据进行研究 40 | # 导入数据 41 | user <- read.csv("活跃用户是否付费数据.csv",T) 42 | # 查看变量名 43 | colnames(user) 44 | # 查看是否付费的类别占比(0:非付费,1:付费) 45 | prop.table(table(user$是否付费)) 46 | # 将是否付费变量转换成因子型 47 | user$是否付费 <- as.factor(user$是否付费) 48 | library(DMwR) 49 | # 对类失衡数据进行处理 50 | user_new <- SMOTE(是否付费~.,data=user,perc.over=100,perc.under=200) 51 | # 查看处理后的结果 52 | table(user_new$是否付费) 53 | 54 | # 5.1.3 数据随机抽样 55 | # sample小例子 56 | set.seed(1234) 57 | # 创建对象x,有1~10组成 58 | x <- seq(1,10);x 59 | # 利用sample函数对x进行无放回抽样 60 | a <- sample(x,8,replace=FALSE);a 61 | # 利用sample函数对x进行有放回抽样 62 | b <- sample(x,8,replace=TRUE);b 63 | # 当size大于x的长度 64 | (c <- sample(x,15,replace = F)) 65 | (c <- sample(x,15,replace = T)) 66 | 67 | # 利用sample对活跃用户数据进行抽样 68 | # 导入数据 69 | user <- read.csv("活跃用户是否付费数据.csv",T) 70 | # 查看数据user的行数 71 | nrow(user) 72 | # 利用sample函数对user数据进行无放回抽样 73 | set.seed(1234) 74 | # 提取下标集 75 | index <- sample(nrow(user),10000,replace=TRUE) 76 | # 将抽样数据赋予对象user_sample 77 | user_sample <- user[index,] 78 | # 查看user_sample的行数 79 | nrow(user_sample) 80 | # 现在我们分别查看user与user_sample变量“是否付费”中0、1占比。 81 | round(prop.table(table(user$是否付费)),3) 82 | round(prop.table(table(user_sample$是否付费)),3) 83 | # 以下代码实现抽样后的“是否付费”的0、1占比不变 84 | # 计算出“是否付费”中0的占比 85 | rate <- sum(user$是否付费==0)/nrow(user) 86 | # 提取未付费用户的下标子集 87 | d <- 1:nrow(user) 88 | index1 <- sample(d[user$是否付费==0],10000*rate) 89 | # 提取付费用户的下标子集 90 | index2 <- sample(d[user$是否付费==1],10000*(1-rate)) 91 | # 将抽样数据赋予对象user_sample1 92 | user_sample1 <- user[c(index1,index2),] 93 | # 查看“是否付费”的0、1占比 94 | round(prop.table(table(user_sample1$是否付费)),3) 95 | 96 | # 利用createDataPartition函数对数据进行抽样 97 | # 对iris数据进行演示 98 | # 载入caret包,如果本地未安装就进行在线安装caret包 99 | if(!require(caret)) install.packages("caret") 100 | # 提取下标集 101 | splitindex <- createDataPartition(iris$Species,times=1,p=0.1,list=FALSE) 102 | splitindex 103 | # 提取符合子集 104 | sample <- iris[splitindex,] 105 | # 查看Species变量中各类别的个数和占比 106 | table(sample$Species); 107 | prop.table(table(sample$Species)) 108 | # 设置list为TRUE 109 | # 提取下标集 110 | splitindex1 <- createDataPartition(iris$Species,times=1,p=0.1,list=TRUE) 111 | # 查看下标集 112 | splitindex1 113 | # 提取子集 114 | iris[splitindex1$Resample1,] 115 | # 设置times=2 116 | splitindex2 <- createDataPartition(iris$Species,times=2,p=0.1,list=TRUE) 117 | splitindex2 118 | # 对12万本周活跃用户的数据按照“是否付费”的比例随机抽取1万的活跃用户进行探索性分析 119 | # 导入数据 120 | user <- read.csv("活跃用户是否付费数据.csv",T) 121 | # 将“是否付费”改为因子型变量 122 | user$是否付费 <- as.factor(user$是否付费) 123 | # 提取下标集 124 | ind <- createDataPartition(user$是否付费,p=10000/nrow(user), 125 | times=1,list=FALSE) 126 | # 查看子集中0、1占比 127 | prop.table(table(user[ind,'是否付费'])) 128 | 129 | # 利用sample函数对数据分区 130 | # 提取训练数据集的下标 131 | ind <- sample(nrow(user),0.7*nrow(user),replace=F) 132 | # 构建训练集数据 133 | traindata <- user[ind,] 134 | # 构建测试集数据 135 | testdata <- user[-ind,] 136 | # 查看“是否付费”的0、1占比 137 | prop.table(table(user$是否付费)) 138 | prop.table(table(traindata$是否付费)) 139 | prop.table(table(testdata$是否付费)) 140 | # 利用createDataPartition函数按照”是否付费“等比例对数据进行分区 141 | library(caret) 142 | # 将”是否付费“变量转换成因子型 143 | user$是否付费 <- as.factor(user$是否付费) 144 | # 构建训练数据下标集 145 | idx <- createDataPartition(user$是否付费,p=0.7,list=FALSE) 146 | # 构建训练数据集 147 | train <- user[idx,] 148 | # 构建测试数据集 149 | test <- user[-idx,] 150 | # 查看”是否付费“的0、1占比 151 | prop.table(table(user$是否付费)) 152 | prop.table(table(train$是否付费)) 153 | prop.table(table(test$是否付费)) 154 | 155 | # 利用sample函数构建五折交叉验证的训练集和测试集 156 | # zz1为所有观测值的下标 157 | n <- nrow(user);zz1 <- 1:n 158 | # zz2为1:5的随机排列 159 | set.seed(1234) 160 | zz2 <- rep(1:5,ceiling(n/5))[1:n] 161 | zz2 <- sample(zz2,n) 162 | # 构建训练集及测试集 163 | for(i in 1:5){ 164 | m <- zz1[zz2==i] 165 | train <- user[-m,] 166 | test <- user[m,] 167 | # 接下来就可以利用训练集建立模型,测试集验证模型,并计算5次MSE 168 | } 169 | 170 | # 利用createFoldsh函数构建五折交叉验证的训练集和测试集 171 | user$是否付费 <- as.factor(user$是否付费) 172 | index <- createFolds(user$是否付费,k=5,list=FALSE) 173 | prop.table(table(user[index==1,'是否付费'])) 174 | prop.table(table(user[index==2,'是否付费'])) 175 | prop.table(table(user[index==3,'是否付费'])) 176 | prop.table(table(user[index==4,'是否付费'])) 177 | prop.table(table(user[index==5,'是否付费'])) 178 | 179 | # 5.2 数据清洗 180 | # 5.2.1 缺失值处理 181 | # 导入玩家的玩牌游戏数据 182 | player <- read.csv("玩家玩牌数据.csv",T,na.strings = "NA") 183 | # 查看前六行 184 | head(player) 185 | # 利用is.na函数判断“玩牌局数”变量各值是否为缺失值 186 | is.na(player$玩牌局数) 187 | # 统计缺失值与非缺失值的个数 188 | table(is.na(player$玩牌局数)) 189 | # sum()和mean()函数来统计缺失值的个数和占比 190 | # 计算缺失值个数 191 | sum(is.na(player$玩牌局数)) 192 | # 计算缺失值占比 193 | mean(is.na(player$玩牌局数)) 194 | # 利用complete.cases函数查看完整实例 195 | sum(complete.cases(player)) 196 | 197 | # 用md.pattern函数查看player的缺失值模式 198 | if(!require(mice)) install.packages("mice") 199 | md.pattern(player) 200 | 201 | # 用aggr函数对player数据的缺失值模式进行可视化 202 | if(!require(VIM)) install.packages("VIM") 203 | aggr(player[,-1],prop=FALSE,numbers=TRUE) 204 | 205 | # 删除缺失样本 206 | player_full <- na.omit(player) 207 | # 计算有缺失值的样本个数 208 | sum(!complete.cases(player_full)) 209 | 210 | # 替换缺失值 211 | iris1 <- iris[,c(1,5)] 212 | # 将40、80、120号样本的Sepal.Length变量值设置为缺失值 213 | iris1[c(40,80,120),1] <- NA 214 | # 利用均值替换缺失值 215 | iris1[c(40,80,120),1] <- round(mean(iris1$Sepal.Length,na.rm = T),1) 216 | # 查看以前的值和现在的值 217 | iris[c(40,80,120),1];iris1[c(40,80,120),1] 218 | # 绘制箱线图 219 | plot(iris$Sepal.Length~iris$Species,col=heat.colors(3)) 220 | # 利用同类均值进行赋值的方式来填补缺失值 221 | # 将40、80、120号样本的Sepal.Length设置为缺失值 222 | iris1[c(40,80,120),1] <- NA 223 | iris1[40,1] <- round(mean(iris1[iris1$Species=='setosa','Sepal.Length'], 224 | na.rm = T),1) 225 | iris1[80,1] <- round(mean(iris1[iris1$Species=='versicolor','Sepal.Length'], 226 | na.rm = T),1) 227 | iris1[120,1] <- round(mean(iris1[iris1$Species=='virginica','Sepal.Length'], 228 | na.rm = T),1) 229 | # 查看以前的值和现在的值 230 | iris[c(40,80,120),1];iris1[c(40,80,120),1] 231 | 232 | # 对缺失值进行赋值 233 | # 利用决策树对性别变量的缺失值进行赋值 234 | # 导入玩家调研数据 235 | questionnaire <- read.csv("问卷调研数据.csv",T) 236 | # 查看问卷调研数据的行数和变量个数 237 | dim(questionnaire) 238 | # 对缺失值进行可视化展示 239 | library(VIM) 240 | aggr(questionnaire[,-1],prop=FALSE,numbers=TRUE) 241 | # 把变量转换成因子型 242 | str(questionnaire) 243 | for(i in 2:ncol(questionnaire)){ 244 | questionnaire[,i] <- as.factor(questionnaire[,i]) 245 | } 246 | str(questionnaire) 247 | # 对数据进行分区 248 | train <- na.omit(questionnaire[,c("性别","职业" ,"学历","玩家游戏情况","游戏进入","游戏偏好")]) 249 | test <- questionnaire[is.na(questionnaire$性别),c("职业" ,"学历","玩家游戏情况","游戏进入","游戏偏好")] 250 | # 建立logit回归模型 251 | fit <- glm(性别~.,train,family = "binomial") 252 | # 由于拟合结果是给每个观测值一个概率值,下面以0.5作为分类界限: 253 | result <- predict(fit,test,type = "response")<0.5 254 | # 把预测结果转换成原先的值(1或2) 255 | z=rep(1,nrow(test));z[!result]=2 256 | # 在test集中增加预测的性别变量值 257 | test_new <- cbind('性别'=z,test) 258 | # 查看前六行数据 259 | head(test_new) 260 | # 利用随机森林迭代弥补缺失值的方法进行赋值 261 | rm(list=ls()) 262 | # 导入数据 263 | questionnaire <- read.csv("问卷调研数据.csv",T) 264 | # 把变量转换成因子型 265 | str(questionnaire) 266 | for(i in 2:ncol(questionnaire)){ 267 | questionnaire[,i] <- as.factor(questionnaire[,i]) 268 | } 269 | # 取前10000行样本进行演示 270 | test <- questionnaire[1:10000,] 271 | library(mice) 272 | md.pattern(test) 273 | # 利用missForest进行缺失值赋值 274 | if(!require(missForest)) install.packages("missForest") 275 | z <- missForest(test) 276 | test.full <- z$ximp 277 | md.pattern(test.full) 278 | 279 | # 5.2.2 异常值判断处理 280 | # 3σ原则 281 | # 绘制质量控制图 282 | set.seed(1234) 283 | data <- rnorm(20) 284 | plot(data,type = "l",lwd=1.5,xlab = NA,ylab = NA, 285 | ylim = c(-4,4),xlim = c(0,23),main="质量控制图") 286 | lines(rep(mean(data),20),lwd=1.8);text(21,mean(data),"均值线") 287 | lines(rep(mean(data)-3*sd(data),20),lty=2,col="red",lwd=1.8) 288 | text(21,mean(data)-3*sd(data),labels = "控制下限",col="red") 289 | lines(rep(mean(data)+3*sd(data),20),lty=2,col="red",lwd=1.8) 290 | text(21,mean(data)+3*sd(data),labels = "控制上限",col="red") 291 | 292 | # P质量控制图 293 | # 导入数据 294 | dailydata <- read.csv("每日付费及留存数据.csv",T) 295 | # 查看前六行 296 | head(dailydata) 297 | # 绘制付费率的单值-均值质量控制图 298 | library(qcc) 299 | attach(dailydata) 300 | qcc(七日留存率,type="xbar.one",labels= 日期, 301 | title="新增用户第7日留存率的单值-均值质量监控图", 302 | xlab="date",ylab="第七日留存率") 303 | 304 | # 通过boxplot.stat()函数识别异常值 305 | boxplot.stats(七日留存率) 306 | # 查找异常值的下标 307 | idx <- which(七日留存率 %in% boxplot.stats(七日留存率)$out) 308 | # 查看异常值的下标集 309 | idx 310 | # 绘制箱线图 311 | boxplot(七日留存率,col='violet') 312 | # 通过text函数把异常值的日期和数值在图上显示 313 | text(1.1,boxplot.stats(七日留存率)$out, 314 | labels=paste(dailydata[idx,'日期'],dailydata[idx,'七日留存率']), 315 | col="darkgreen") 316 | 317 | # 通过聚类进行异常检测 318 | # 导入棋牌游戏玩家的样本数据 319 | w <- read.csv("玩家玩牌数据样本.csv",T) 320 | # 查看数据对象w的前六行 321 | head(w) 322 | # w各变量的量纲不是处于同一水平,接下来进行归一化处理 323 | u <- round(apply(w[,-1],2,function(x) (x-min(x))/(max(x)-min(x))),4) 324 | # 将u变成data.frame形式 325 | u <- data.frame(u) 326 | # 将用户ID赋予对象u的行号 327 | row.names(u) <- w$用户id 328 | # 查看u的前六行 329 | head(u) 330 | # 利用K-Means聚类对数据u进行分群,k选择为3 331 | kmeans.result <- kmeans(u,3) 332 | # 查看聚类结果 333 | kmeans.result 334 | # 找出距离最大的5个玩家 335 | centers <- kmeans.result$centers[kmeans.result$cluster,] 336 | distances <- sqrt(rowSums((u-centers)^2)) 337 | outliers <- order(distances,decreasing = T)[1:5] 338 | # 打印出距离最大的5个玩家的行号 339 | print(outliers) 340 | # 打印出异常玩家的用户ID 341 | rownames(u[outliers,]) 342 | # 对结果进行可视化展示 343 | 344 | # 绘制135位玩家的散点图 345 | plot(u$玩牌局数,u$正常牌局,pch=kmeans.result$cluster, 346 | axes=F,xlab="玩牌局数",ylab="正常牌局") 347 | axis(1,labels = F);axis(2,labels = F) 348 | # 绘制类中心点 349 | points(kmeans.result$centers[,c('玩牌局数','正常牌局')],pch=16,cex=1.5) 350 | # 绘制离群点 351 | points(u[outliers,c('玩牌局数','正常牌局')],pch="*",col=4,cex=1.5) 352 | # 把离群点的用户ID号打印出来 353 | text(u[outliers,c('玩牌局数','正常牌局')], 354 | labels=rownames(u[outliers,]), 355 | cex=1,col="black") 356 | 357 | ### 5.3 数据转换 358 | # 产生衍生变量 359 | # 5.3.1 导入数据 360 | rawdata <- read.csv("数据转换数据.csv",na.strings = NA) 361 | # 查看数据的前六行 362 | head(rawdata) 363 | # 将注册日期变量转换成日期格式 364 | rawdata$registration <- as.Date(paste(substr(rawdata$registration,1,4), 365 | substr(rawdata$registration,5,6), 366 | substr(rawdata$registration,7,8), 367 | sep="/"), 368 | "%Y/%m/%d") 369 | # 将首次付费日期转换成日期格式 370 | rawdata$firstpaydate <- as.Date(paste(substr(rawdata$firstpaydate,1,4), 371 | substr(rawdata$firstpaydate,5,6), 372 | substr(rawdata$firstpaydate,7,8), 373 | sep="/"), 374 | "%Y/%m/%d") 375 | # 查看数据的前六行 376 | head(rawdata) 377 | # 增加ispay变量:0表示非付费用户,1表示付费用户 378 | rawdata$ispay <- ifelse(!is.na(rawdata$firstpaydate),1,0) 379 | # 增加isnewpay变量:0表示非新增首日付费用户,1表示新增首日付费用户 380 | rawdata$isnewpay <- ifelse(rawdata$registration==rawdata$firstpaydate, 381 | 1,0) 382 | rawdata[is.na(rawdata$isnewpay),'isnewpay'] <- 0 383 | # 查看数据前10行 384 | head(rawdata) 385 | 386 | # 5.3.2 数据分箱 387 | # 利用cut函数对数据进行分箱 388 | # 对days(活跃天数)进行分箱操作 389 | rawdata$days_interval <- cut(rawdata$days, 390 | breaks=c(0,30,60,90,Inf), 391 | labels=c('一个月内','31~60天','61~90天','三个月以上')) 392 | # 对lifetime(生命周期)进行分箱操作 393 | rawdata$lifetime_interval <- cut(rawdata$lifetime, 394 | breaks=c(0,7,21,30,90,Inf), 395 | labels=c('小于一周','小于两周','小于一个月', 396 | '小于三个月','三个月以上')) 397 | # 查看前六行 398 | head(rawdata) 399 | 400 | # 5.3.3 数据标准化变换 401 | #采用(x-mu)/std的标准化方法,与scale()函数效果一样 402 | standard <- preProcess(iris) 403 | head(predict(standard,iris)) 404 | head(scale(iris[,1:4])) 405 | #采用(x-min(x))/(max(x)-min(x))的标准化方法 406 | standard <- preProcess(iris, method = 'range') 407 | head(predict(standard,iris)) 408 | fun <- function(x) (x-min(x))/(max(x)-min(x)) 409 | head(sapply(iris[,1:4],fun)) 410 | 411 | 412 | # 5.4 数据哑变量处理 413 | # 构建customers数据集 414 | customers<-data.frame(id=c(10,20,30,40,50), 415 | gender=c("male","female","female","male","female"), 416 | mood=c("happy","sad","happy","sad","happy"), 417 | outcome=c(1,1,0,0,0)) 418 | customers 419 | # 对因子型变量进行哑变量处理 420 | # 创建新数据框customers.new 421 | customers.new <- customers[,c('id','outcome')] 422 | # 对gender变量进行哑变量处理 423 | customers.new$gender.male <- ifelse(customers$gender=='male',1,0) 424 | customers.new$gender.female <- ifelse(customers$gender=='female',1,0) 425 | # 对mood变量进行哑变量处理 426 | customers.new$mood.happy <- ifelse(customers$mood=='happy',1,0) 427 | customers.new$mood.sad <- ifelse(customers$mood=='sad',1,0) 428 | customers.new 429 | 430 | # 加载caret包到内存 431 | library(caret) 432 | # 查看customers的数据结构 433 | str(customers) 434 | # 利用dummyVars函数对customers数据进行哑变量处理 435 | dmy<-dummyVars(~.,data=customers) 436 | # 对自身变量进行预测,并转换成data.frame格式 437 | trsf<-data.frame(predict(dmy,newdata=customers)) 438 | # 查看转换结果 439 | trsf 440 | # 将outcome变量转换成因子型变量 441 | customers$outcome <- as.factor(customers$outcome) 442 | # 利用dummyVars函数对customers数据进行哑变量处理 443 | dmy<-dummyVars(~.,data=customers) 444 | # 对自身变量进行预测,并转换成data.frame格式 445 | trsf<-data.frame(predict(dmy,newdata=customers)) 446 | # 查看转换结果 447 | trsf 448 | # 只对gender变量进行哑变量转换 449 | dmy.gender <- dummyVars(~gender,data=customers) 450 | trsf.gender <- data.frame(predict(dmy.gender,newdata=customers)) 451 | trsf.gender 452 | # 将levelsOnly和fullRank设置为TRUE 453 | customers<-data.frame(id=c(10,20,30,40,50), 454 | gender=c("male","female","female","male","female"), 455 | mood=c("happy","sad","happy","sad","happy"), 456 | outcome=c(1,1,0,0,0)) 457 | dmy<-dummyVars(~.,data=customers,levelsOnly=TRUE,fullRank=TRUE) 458 | trsf<-data.frame(predict(dmy,newdata=customers)) 459 | trsf 460 | 461 | # 导入用户活跃时间段数据 462 | load("loginhour.RData") 463 | dim(loginhour) 464 | # 查看列名 465 | colnames(loginhour) 466 | # 利用dummyVars函数loginhour数据进行哑变量处理 467 | library(caret) 468 | dmy<-dummyVars(~.,data=loginhour) 469 | # 对自身变量进行预测,并转换成data.frame格式 470 | trsf<-data.frame(predict(dmy,newdata=loginhour)) 471 | # 查看转换后的维度 472 | dim(trsf) 473 | # 查看转换后的列名 474 | colnames(trsf) -------------------------------------------------------------------------------- /code/chapter6.R: -------------------------------------------------------------------------------- 1 | # 6.1.2 双指标数据可视化 2 | # 绘制散点图 3 | w <- read.csv("可视化数据.csv",T) 4 | plot(w$活跃用户~w$新增用户,col="violetred2",pch=16, 5 | main="活跃用户 vs 新增用户散点图") 6 | # 添加线性拟合直线 7 | abline(lm(w$活跃用户~w$新增用户),col="blue",lwd=2,lty=2) 8 | 9 | # 6.1.3 三指标数据可视化 10 | # 绘制气泡图 11 | plot(w$活跃用户~w$新增用户,col="violetred2",pch=16, 12 | cex=w$付费率, 13 | main="活跃用户 vs 新增用户气泡图") 14 | 15 | # 6.2.3 时间序列数据预测 16 | revenue <- read.csv("收入数据.csv",T) #导入数据 17 | head(revenue) #查看前六行 18 | revenue.ts <- ts(revenue[,2],frequency = 12,start = c(2014,1)) # 转换成时间序列对象 19 | is.ts(revenue.ts) #判断是否为时间序列对象 20 | start(revenue.ts) #查看开始日期 21 | end(revenue.ts) #查看结束日期 22 | frequency(revenue.ts) #查看一个周期的频数 23 | # 绘制时序图 24 | plot.ts(revenue.ts,xlab="时间",ylab="收入") 25 | abline(lm(revenue.ts~time(revenue.ts)),col="red",lty=2,lwd=2) 26 | # 使用单位根检验方法验证其平稳性 27 | library(fUnitRoots) 28 | unitrootTest(revenue.ts) 29 | # 进行一阶差分运算 30 | revenue.ts.dif <- diff(revenue.ts) 31 | # 验证其平稳性 32 | unitrootTest(revenue.ts.dif) 33 | # 对时间序列对象进行拆解 34 | revenue.ts.decompose <- decompose(revenue.ts) 35 | plot(revenue.ts.decompose) 36 | revenue.ts.decompose$seasonal 37 | # 利用HoltWinters函数对数据进行建模 38 | HoltWintersModel <- HoltWinters(revenue.ts,alpha=TRUE,beta=TRUE,gamma=TRUE) 39 | HoltWintersModel 40 | plot(HoltWintersModel,lty= 1,lty.predicted = 2) 41 | # 利用forecast.HoltWinters函数对未来6个月进行预测 42 | library(forecast) 43 | HoltWintersForecast <- forecast.HoltWinters(HoltWintersModel,h=6,level=c(80,95)) 44 | HoltWintersForecast 45 | # 对残差进行检验 46 | acf(HoltWintersForecast$residuals,lag.max = 20) 47 | # 绘制模拟预测图 48 | plot(HoltWintersForecast) 49 | 50 | # 利用auto.arima函数建立预测模型 51 | library(forecast) 52 | fit <- auto.arima(revenue.ts) 53 | fit 54 | fit.forecast <- forecast(fit,h=6) 55 | fit.forecast 56 | plot(fit.forecast) 57 | 58 | ## 6.3 游戏数据相关分析 59 | # 6.3.1 相关分析基本原理 60 | # 计算相关系数 61 | data(sleep,package = "VIM") 62 | round(cor(sleep,use="complete.obs"),3) 63 | # 对BodyWgt与BrainWgt的相关显著性进行检验 64 | sleepClean <- na.omit(sleep) 65 | attach(sleepClean) 66 | cor.test(BodyWgt,BrainWgt) 67 | # 利用corr.test函数计算相关矩阵和显著性检验 68 | library(psych) 69 | corr.test(sleepClean) 70 | 71 | # 6.3.2 相关系数可视化 72 | # 利用corrgram函数绘制相关系数图 73 | library(corrgram) 74 | corrgram(sleepClean,order=T,lower.panel=panel.shade, 75 | upper.panel=panel.pie,text.panel=panel.txt, 76 | main="利用corrgram函数绘制相关系数图") 77 | corrgram(sleepClean,order=T,lower.panel=panel.cor, 78 | upper.panel=panel.pie,text.panel=panel.txt, 79 | main="利用corrgram函数绘制相关系数图") 80 | # 利用corrplot包绘制相关系数图 81 | library(corrplot) 82 | M <- cor(sleepClean) 83 | corrplot(M,main="利用corrplot函数绘制相关系数图") 84 | corrplot.mixed(M, lower = "ellipse", upper = "number", 85 | tl.pos="lt",diag="u") 86 | 87 | # 6.3.3 活跃时间段相关分析 88 | # 导入登陆数据 89 | logindata <- read.csv("data\\logindata.csv") 90 | str(logindata) 91 | dim(logindata) 92 | library(caret) 93 | dmy<-dummyVars(~.,data=logindata) 94 | dmyTsrf<-data.frame(predict(dmy,newdata=logindata)) 95 | dim(dmyTsrf) 96 | str(dmyTsrf) 97 | # 导入自定义的求相关系数函数 98 | source("code//CorrelationFunction.R") 99 | corMasterList<-flattenSquareMatrix(cor.prob(dmyTsrf)) 100 | # 按照相关系数的绝对值进行降序排序 101 | corList<-corMasterList[order(-abs(corMasterList$cor)),] 102 | print(head(corList,10)) 103 | # 提取与 "是否付费.是"的相关系数大于0.04的记录 104 | selectedSub <- subset(corList,(abs(cor)>0.04 & i %in% c('是否付费.是'))) 105 | bestsub <- as.character(selectedSub$j) 106 | # 绘制相关系数图 107 | library(corrplot) 108 | corrplot.mixed(cor(dmyTsrf[,c('是否付费.是',bestsub)]), 109 | lower = "ellipse", upper = "number", 110 | tl.pos="lt",diag="u") 111 | 112 | # 6.4.3 玩家偏好对应分析 113 | w <- read.csv("玩家喜好分析数据.csv",T) # 导入不同类别玩家的购物数据 114 | rownames(w) <- w[,1] #将道具名称赋予行名称 115 | library(ca) 116 | w.ca <- ca(w[,-1]) # 建立简单对应分析 117 | w.ca # 查看结果 118 | names(w.ca) # 查看因子分析输出的对象列表 119 | w.ca$colnames # 查看列名称 120 | w.ca$colcoord # 查看列的标准坐标 121 | # 绘制对应分析的散点图 122 | plot(w.ca$rowcoord[,1],w.ca$rowcoord[,2],pch = 16,col = rgb(0.6,0.3,0.2), 123 | xlim = c(min(w.ca$rowcoord[,1]),max(w.ca$rowcoord[,1])+0.3), 124 | main = "玩家购买物品偏好分析") 125 | text(w.ca$rowcoord[,1],w.ca$rowcoord[,2],labels = w.ca$rownames, 126 | cex = 0.8,pos = 4,col = rgb(0.6,0.3,0.2)) 127 | points(w.ca$colcoord[,1],w.ca$colcoord[,2],pch = 17,col = "#007e7e") 128 | text(w.ca$colcoord[,1],w.ca$colcoord[,2],labels = w.ca$colnames, 129 | cex = 0.8,pos = 4,col = "#007e7e") 130 | -------------------------------------------------------------------------------- /code/chapter7.R: -------------------------------------------------------------------------------- 1 | ### 7.2 漏斗模型 2 | # 7.2.2 分析案例—新手教程漏斗模型 3 | # 导入新手教程关键路径用户数 4 | funnel <- read.csv("新手教程路径留存人数统计.csv",T) 5 | # 查看funnel数据集 6 | funnel 7 | # 绘制漏斗图 8 | # 对数据进行降序排序 9 | funnel_order <- funnel[order(funnel$用户数),] 10 | # 绘制漏斗图 11 | barplot(funnel_order$用户数,horiz = T,axes=F,border=F,space=0.5, 12 | col="steelblue1",xlim=c(-700,700), 13 | main="新手教程关键路径漏斗图") 14 | barplot(-funnel_order$用户数,horiz=T,add=T,border=F,space=0.5, 15 | axes=F,col="steelblue1") 16 | # 增加步骤名称 17 | text(x=rep(-600,6),y=seq(1,8.5,length.out = 6), 18 | labels=funnel_order$事件行为,cex=0.8,font=3,col="black") 19 | # 增加总体的转化率 20 | text(x=rep(0,6),y=seq(1,8.5,length.out = 6), 21 | labels=paste0(round(funnel_order$用户数*100/max(funnel_order$用户数),2),"%"), 22 | cex=0.8,font=3,col="violetred3") 23 | # 增加上一步的转化率 24 | text(x=rep(max(funnel$用户数),6),y=seq(2,7.5,length.out = 5), 25 | labels=paste0(round((1-(-diff(funnel$用户数)/funnel$用户数[1:5]))*100,2),"%"), 26 | cex=0.8,font=4,col="red3") 27 | 28 | # 7.3.2 路径分析的主要算法 29 | # sunburst事件路径图 30 | # 加载sunburstR包 31 | if(!require(sunburstR)) devtools::install_github("timelyportfolio/sunburstR") 32 | # 导入sequences数据 33 | sequences <- read.csv( 34 | system.file("examples/visit-sequences.csv",package="sunburstR") 35 | ,header = FALSE 36 | ,stringsAsFactors = FALSE 37 | ) 38 | # 查看前六行 39 | head(sequences) 40 | # 绘制sunburst事件路径图 41 | sunburst(sequences) 42 | # 计算某一路径的占比 43 | # 查看选中路径的点击次数 44 | (targetclick <- sequences[sequences$V1=="home-search-product-end","V2"]) 45 | # 统计所有路径的点击次数 46 | (allclick <- sum(sequences$V2)) 47 | # 计算目标路径的占比 48 | paste0(round(targetclick/allclick,4)*100,"%") 49 | 50 | # 7.3.3 分析案例—游戏点击事件路径分析 51 | data_click <- read.csv("data_click.csv",header=F) # 导入点击事件数据 52 | head(data_click) # 查看前六行 53 | # 提取有过11034点击行为的用户数据 54 | targetuserid <- unique(data_click[data_click$V3=="11034","V1"]) 55 | data_click_new <- data_click[data_click$V1 %in% targetuserid,] 56 | # 将数据转化成事务型 57 | library(arulesSequences) 58 | tmp_data <- data.frame(click=data_click_new$V3) 59 | tmp_data$click <- as.factor(tmp_data$click) 60 | data_click_tran <- as(tmp_data,'transactions') 61 | transactionInfo(data_click_tran)$sequenceID <- data_click_new$V1 62 | transactionInfo(data_click_tran)$eventID<-data_click_new$V2 63 | data_click_tran 64 | summary(data_click_tran) 65 | # 查看事务型数据的前六行 66 | inspect(data_click_tran[1:6]) 67 | head(as(data_click_tran,"data.frame")) 68 | # 绘制商品的频率图 69 | itemFrequencyPlot(data_click_tran, topN=20) 70 | # 利用arulesSquences包中的cspade函数实现cSPADE算法 71 | myrules <- cspade(data_click_tran,parameter=list(support=0,maxlen=2), 72 | control=list(verbose=TRUE)) 73 | myrules <- sort(myrules,by="support") # 按照support进行排序 74 | targetclick <- paste0(".*click=11034","[^\\}]*\\}>") # 设置规则表达式 75 | finalrules <-myrules[grep(targetclick ,as(myrules,"data.frame")$sequence)] 76 | inspect(finalrules[1:3]); # 查看序列的前三条 77 | nrow(finalrules) # 计算序列个数 78 | #转换成数据框 79 | finalrules.data.frame <- as(finalrules[-1],"data.frame") 80 | # 查看前三行数据 81 | head(finalrules.data.frame) 82 | # 计算支持度的占比 83 | finalrules.data.frame$percentage <- finalrules.data.frame$support/ 84 | sum(finalrules.data.frame$support) 85 | # 计算支持度的累计百分比 86 | finalrules.data.frame$sum.percentage <- cumsum(finalrules.data.frame$percentage) 87 | # 筛选累计百分比小于75%的序列数据 88 | finalrules.data.frame <- finalrules.data.frame[ 89 | finalrules.data.frame$sum.percentage <=0.75,] 90 | # 查看符合结果的序列个数 91 | nrow(finalrules.data.frame) 92 | # 查看前六行数据 93 | head(finalrules.data.frame) 94 | # 提取关键点击按钮的事件id 95 | clickid <- substr(finalrules.data.frame$sequence,9,13) 96 | # 查看关键事件id 97 | clickid 98 | # 计算关键点击按钮i的引导能力conf 99 | conf <- rep(1,length(clickid)) 100 | for(i in 1:length(clickid)) { 101 | n <- myrules@info$nsequences 102 | nclickid_support <- finalrules.data.frame[i,"support"] 103 | conf[i] <- nclickid_support*n/ 104 | nrow(data_click[data_click$V3==clickid[i],]) 105 | } 106 | 107 | # 将关键事件id和支持度占比组成新数据框result 108 | result <- data.frame(click=clickid, 109 | percentage=round(finalrules.data.frame$percentage,3), 110 | conf=conf) 111 | # 查看前六行 112 | head(result) 113 | 114 | # 绘制支持度占比的垂直金子塔图 115 | library(reshape) 116 | md <- melt(result,id="click") # 对result数据进行重组 117 | md$value[md$variable == "conf"] <- -md$value[md$variable == "conf"] 118 | md <- md[order(md$variable,decreasing=T),] # 按照variable变量进行降序排序 119 | # 绘制垂直金字塔图 120 | library(recharts) 121 | echartr(md,click,value,variable,type="vbar",subtype="stack") %>% 122 | setTitle("引导用户进入开始打牌11034的重点事件id分析") %>% 123 | setXAxis(axisLine=list(onZero=TRUE)) %>% 124 | setYAxis(axisLabel=list( 125 | formatter=JS('function (value) {return Math.abs(value);}'))) 126 | 127 | -------------------------------------------------------------------------------- /code/chapter8.R: -------------------------------------------------------------------------------- 1 | # 8.2.2 留存率预测曲线 2 | # 前期实际留存率数据 3 | (day <- seq(1:7)) # 天数 4 | (ratio <- c(0.392,0.278,0.196,0.166,0.106,0.096,0.046)) # 留存率值 5 | # 利用nls函数求出幂指数函数y=a*x^b的系数a、b 6 | fit <- nls(ratio~a*day^b,start = list(a=1,b=1)) 7 | # 查看模型结果 8 | summary(fit) 9 | # 对新增用户在接下来365日每天的留存率进行预测 10 | predicted <- predict(fit,data.frame(day=seq(1,365))) 11 | # 查看预测结果 12 | predicted 13 | # 绘制留存率预测曲线 14 | library(dygraphs) 15 | data <- as.data.frame(predicted) 16 | data <- ts(data) 17 | dygraph(data,main="留存了预测曲线") %>% 18 | dySeries("predicted",label="留存率",strokeWidth = 2) %>% 19 | dyOptions(colors = "green",fillGraph = TRUE,fillAlpha = 0.4) %>% 20 | dyHighlight(highlightCircleSize = 5, 21 | highlightSeriesBackgroundAlpha = 0.2, 22 | hideOnMouseOut = FALSE) %>% 23 | dyAxis("x", label = "日期",drawGrid = FALSE) %>% 24 | dyAxis("y", label = "留存率") %>% 25 | dyRangeSelector() 26 | 27 | # 8.2.3 优化预测曲线 28 | # 导入实际留存率数据 29 | actual <- read.csv("实际留存数据.csv") 30 | # 对类型1的游戏进行留存率预测 31 | type1 <- actual[1:7,2] 32 | day <- seq(1:7) 33 | fit1 <- nls(type1~a*day^b,start = list(a=1,b=1)) 34 | fit1 35 | predicted1 <- round(predict(fit1,data.frame(day=seq(1,365))),3) 36 | # 对类型2的游戏进行留存率预测 37 | type2 <- actual[1:7,3] 38 | day <- seq(1:7) 39 | fit2 <- nls(type2~a*day^b,start = list(a=1,b=1)) 40 | fit2 41 | predicted2 <- round(predict(fit2,data.frame(day=seq(1,365))),3) 42 | # 将预测值与原始值合并在一起 43 | result <- data.frame(actual,predicted1,predicted2) 44 | head(result) 45 | # 导入T值 46 | tvalue <- read.csv("T值.csv") 47 | # 对type1类型的游戏计算调整预测值 48 | result$adjust.predicted1 <- tvalue$T1*result$predicted1 49 | # 对type2类型的游戏计算调整预测值 50 | result$adjust.predicted2 <- tvalue$T2*result$predicted2 51 | # 查看数据前六行 52 | head(result) 53 | # 绘制留存率曲线 54 | # 绘制type1的预测曲线 55 | # 绘制实际留存率曲线 56 | plot(Type1~day,data=result,col="slateblue2",main="类型1的留存率曲线", 57 | type="l",xaxt="n",lty=1,lwd=2) 58 | # 绘制留存率预测曲线 59 | lines(predicted1~day,dat=result,col="violetred3",type="l",lty=2,lwd=2) 60 | # 绘制留存率调整预测曲线 61 | lines(adjust.predicted1~day,data=result,col="yellowgreen",type="l",lty=3,lwd=2) 62 | # 增加图例 63 | legend("top",legend=colnames(result)[c(2,4,6)],lty = 1:3,ncol=3, 64 | col=c("slateblue2","violetred3","yellowgreen"),bty = "n") 65 | # 绘制type2的预测曲线 66 | # 绘制实际留存率曲线 67 | plot(Type2~day,data=result,col="slateblue2",main="类型2的留存率曲线", 68 | type="l",xaxt="n",lty=1,lwd=2) 69 | # 绘制留存率预测曲线 70 | lines(predicted2~day,dat=result,col="violetred3",type="l",lty=2,lwd=2) 71 | # 绘制留存率调整预测曲线 72 | lines(adjust.predicted2~day,data=result,col="yellowgreen",type="l",lty=3,lwd=2) 73 | # 增加图例 74 | legend("top",legend=colnames(result)[c(3,5,7)],lty = 1:3,ncol = 3, 75 | col=c("slateblue2","violetred3","yellowgreen"),bty = "n") 76 | 77 | # 8.3 用户流失预测 78 | # 8.3.1 分类及模型评估 79 | # KNN近邻分类 80 | # 随机抽取1/2的样本作为训练集,另外一半的样本作为测试集来验证模型的效果 81 | iris1<-iris 82 | set.seed(1234) 83 | # 利用caret包的createDataPartition函数按不同类别等比例抽取50% 84 | library(caret) 85 | ind <- createDataPartition(iris1$Species,times=1,p=0.5,list=F) 86 | traindata <-iris1[ind,] #构建训练集 87 | testdata <- iris1[-ind,] #构建测试集 88 | # 利用class包中的knn函数对测试集的分类进行预测。 89 | library(class) 90 | a=knn(traindata[,1:4],testdata[,1:4],traindata[,5],k=3) #指定k值为3 91 | a[1];a[75] # 查看第一条和最后一条测试数据的预测结果 92 | # KNN算法流程验证: 93 | ceshi <- function(n=1,k=3){ 94 | # 计算第n个测试集样本与训练集样本的距离 95 | x <- (traindata[,1:4]-testdata[rep(n,75),1:4])^2 96 | traindata$dist1 <- apply(x,1,function(x) sqrt(sum(x))) 97 | # 对距离进行升序排序,选择最近的K个邻居 98 | mydata <- traindata[order(traindata$dist1)[1:k],5:6] 99 | # 统计不同类别的频数 100 | result <- data.frame(sort(table(mydata$Species),decreasing = T)) 101 | # 给出最后的预测结果 102 | return(result[1,1]) 103 | } 104 | ceshi() # 第一个样本的预测结果 105 | ceshi(n=75) # 最后一个样本的预测结果 106 | 107 | # 朴素贝叶斯分类 108 | # 导入car数据集 109 | car <- read.table("car.data",sep = ",") 110 | # 对变量重命名 111 | colnames(car) <- c("buy","main","doors","capacity", 112 | "lug_boot","safety","accept") 113 | # 随机选取75%的数据作为训练集建立模型,25%的数据作为测试集用来验证模型 114 | library(caret) 115 | # 构建训练集的下标集 116 | ind <- createDataPartition(car$accept,times=1,p=0.75,list=FALSE) 117 | # 构建测试集数据好训练集数据 118 | carTR <- car[ind,] 119 | carTE <- car[-ind,] 120 | 121 | # 使用naiveBayes函数建立朴素贝叶斯分类器 122 | library(e1071) 123 | naiveBayes.model <- naiveBayes(accept~.,data=carTR) 124 | # 预测结果 125 | carTR_predict <- predict(naiveBayes.model,newdata=carTR) # 训练集数据 126 | carTE_predict <- predict(naiveBayes.model,newdata=carTE) # 测试集数据 127 | # 构建混淆矩阵 128 | tableTR <- table(actual=carTR$accept,predict=carTR_predict) 129 | tableTE <- table(actual=carTE$accept,predict=carTE_predict) 130 | # 计算误差率 131 | errTR <- paste0(round((sum(tableTR)-sum(diag(tableTR)))*100/sum(tableTR), 132 | 2),"%") 133 | errTE <- paste0(round((sum(tableTE)-sum(diag(tableTE)))*100/sum(tableTE), 134 | 2),"%") 135 | errTR;errTE 136 | 137 | # 使用决策树算法建立分类树 138 | # 使用C50函数实现C5.0算法 139 | library(C50) 140 | C5.0.model <- C5.0(accept~.,data=carTR) 141 | # 使用rpart函数实现CART算法 142 | library(rpart) 143 | rpart.model <- rpart(accept~.,data=carTR) 144 | # 使用ctree函数实现条件推理决策树算法 145 | library(party) 146 | ctree.model <- ctree(accept~.,data=carTR) 147 | 148 | # 预测结果,并构建混淆矩阵,查看准确率 149 | # 构建result,存放预测结果 150 | result <- data.frame(arithmetic=c("C5.0","CART","ctree"), 151 | errTR=rep(0,3),errTE=rep(0,3)) 152 | for(i in 1:3){ 153 | # 预测结果 154 | carTR_predict <- predict(switch(i,C5.0.model,rpart.model,ctree.model), 155 | newdata=carTR, 156 | type=switch(i,"class","class","response")) # 训练集数据 157 | carTE_predict <- predict(switch(i,C5.0.model,rpart.model,ctree.model), 158 | newdata=carTE, 159 | type=switch(i,"class","class","response")) # 测试集数据 160 | # 构建混淆矩阵 161 | tableTR <- table(actual=carTR$accept,predict=carTR_predict) 162 | tableTE <- table(actual=carTE$accept,predict=carTE_predict) 163 | # 计算误差率 164 | result[i,2] <- paste0(round((sum(tableTR)-sum(diag(tableTR)))*100/sum(tableTR), 165 | 2),"%") 166 | result[i,3] <- paste0(round((sum(tableTE)-sum(diag(tableTE)))*100/sum(tableTE), 167 | 2),"%") 168 | } 169 | # 查看结果 170 | result 171 | 172 | # 集成学习及随机森林 173 | # 使用adabag包中的bagging函数实现bagging算法 174 | library(adabag) 175 | bagging.model <- bagging(accept~.,data=carTR) 176 | # 使用adabag包中的boosting函数实现boosting算法 177 | boosting.model <- boosting(accept~.,data=carTR) 178 | # 使用randomForest包中的randomForest函数实现随机森林算法 179 | library(randomForest) 180 | randomForest.model <- randomForest(accept~.,data=carTR) 181 | 182 | # 预测结果,并构建混淆矩阵,查看准确率 183 | # 构建result,存放预测结果 184 | result <- data.frame(arithmetic=c("bagging","boosting","随机森林"), 185 | errTR=rep(0,3),errTE=rep(0,3)) 186 | for(i in 1:3){ 187 | # 预测结果 188 | carTR_predict <- predict(switch(i,bagging.model,boosting.model,randomForest.model), 189 | newdata=carTR) # 训练集数据 190 | carTE_predict <- predict(switch(i,bagging.model,boosting.model,randomForest.model), 191 | newdata=carTE) # 测试集数据 192 | # 构建混淆矩阵 193 | tableTR <- table(actual=carTR$accept, 194 | predict=switch(i,carTR_predict$class,carTR_predict$class,carTR_predict)) 195 | tableTE <- table(actual=carTE$accept, 196 | predict=switch(i,carTE_predict$class,carTE_predict$class,carTE_predict)) 197 | # 计算误差率 198 | result[i,2] <- paste0(round((sum(tableTR)-sum(diag(tableTR)))*100/sum(tableTR), 199 | 2),"%") 200 | result[i,3] <- paste0(round((sum(tableTE)-sum(diag(tableTE)))*100/sum(tableTE), 201 | 2),"%") 202 | } 203 | # 查看结果 204 | result 205 | 206 | # 人工神经网络与支持向量机 207 | # 使用nnet包中的nnet函数建立人工神经网络模型 208 | library(nnet) 209 | # 隐藏层有3个节点,初始随机权值在[-0.1,0.1],权值是逐渐衰减的,最大迭代数是200 210 | nnet.model <- nnet(accept~.,data=carTR,size=3,rang=0.1,decay=5e-4,maxit=200) 211 | # 使用kernlab包中的ksvm函数建立支持向量机模型 212 | library(kernlab) 213 | # 使用rbfdot选项制定径向基核函数 214 | svm.model <- ksvm(accept~.,data=carTR,kernel="rbfdot") 215 | 216 | # 利用模型对结果进行预测 217 | # 构建混淆矩阵 218 | nnet.t0 <- table(carTR$accept,predict(nnet.model,carTR,type="class")) 219 | nnet.t <- table(carTE$accept,predict(nnet.model,carTE,type="class")) 220 | svm.t0 <- table(carTR$accept,predict(svm.model,carTR,type="response")) 221 | svm.t <- table(carTE$accept,predict(svm.model,carTE,type="response")) 222 | # 查看各自错误率 223 | nnet.err0 <- paste0(round((sum(nnet.t0)-sum(diag(nnet.t0)))*100/sum(nnet.t0), 224 | 2),"%") 225 | nnet.err <- paste0(round((sum(nnet.t)-sum(diag(nnet.t)))*100/sum(nnet.t), 226 | 2),"%") 227 | svm.err0 <- paste0(round((sum(svm.t0)-sum(diag(svm.t0)))*100/sum(svm.t0), 228 | 2),"%") 229 | svm.err <- paste0(round((sum(svm.t)-sum(diag(svm.t)))*100/sum(svm.t), 230 | 2),"%") 231 | nnet.err0;nnet.err;svm.err0;svm.err 232 | 233 | # 模型评估 234 | # k折交叉验证 235 | # 构建10折交叉验证 236 | #下面构造10折下标集 237 | library(caret) 238 | ind<-createFolds(car$accept,k=10,list=FALSE,returnTrain=FALSE) 239 | # 下面再做10折交叉验证,这里仅给出训练集和测试集的分类平均误判率。 240 | E0=rep(0,10);E1=E0 241 | library(C50) 242 | for(i in 1:10){ 243 | n0=nrow(car)-nrow(car[ind==i,]);n1=nrow(car[ind==i,]) 244 | a=C5.0(accept~.,car[!ind==i,]) 245 | E0[i]=sum(car[!ind==i,'accept']!=predict(a,car[!ind==i,]))/n0 246 | E1[i]=sum(car[ind==i,'accept']!=predict(a,car[ind==i,]))/n1 247 | } 248 | (1-mean(E0));(1-mean(E1)) 249 | 250 | # 利用caret包中的train函数完成交叉验证 251 | library(caret) 252 | control <- trainControl(method="repeatedcv",number=10,repeats=3) 253 | model <- train(accept~.,data=car,method="rpart", 254 | trControl=control) 255 | model 256 | plot(model) 257 | 258 | 259 | ## 8.3.2 活跃用户流失预测 260 | # 数据准备 261 | w <- read.csv("用户流失预测数据.csv") # 导入数据 262 | w <- w[,-1] # 剔除用户ID 263 | w$活跃度 <- round(w$登录总次数/7,3) #增加活跃度字段 264 | w$玩牌胜率 <- round(w$赢牌局数/w$玩牌局数,3) # 增加玩牌胜率字段 265 | # 对数据进行哑变量处理,进行相关性分析 266 | library(caret) 267 | dmy <- dummyVars(~.,data=w) # 构建哑变量对象 268 | trsf <- data.frame(predict(dmy,newdata=w)) # 对数据进行虚拟化处理 269 | M <- round(cor(trsf[,1:2],trsf[,c(-1,-2)]),3) # 进行相关性分析 270 | M 271 | library(corrplot) 272 | corrplot(M,method="ellipse",col = c("green","black")) # 对相关系数进行可视化 273 | # 利用随机森林模型中查看每个属性的重要性 274 | library(randomForest) 275 | model <- randomForest(是否流失~.,data=w,importance=TRUE) # 建立随机森林模型 276 | varImpPlot(model,main="Variable Importance Random Forest") # 查看变量重要性 277 | # 随机选取75%的数据作为训练集建立模型,25%的数据作为测试集用来验证模型 278 | library(caret) 279 | # 构建训练集的下标集 280 | ind <- createDataPartition(w$是否流失,times=1,p=0.75,list=FALSE) 281 | # 构建测试集数据好训练集数据 282 | traindata <- w[ind,] 283 | testdata <- w[-ind,] 284 | 285 | # 数据建模 286 | # 利用10折交叉验证来选择最优参数 287 | control <- trainControl(method="repeatedcv",number=10,repeats=3) 288 | rpart.model <- train(是否流失~.,data=w,method="rpart", 289 | trControl=control) 290 | rf.model <- train(是否流失~.,data=w,method="rf", 291 | trControl=control) 292 | nnet.model <- train(是否流失~.,data=w,method="nnet", 293 | trControl=control) 294 | # 查看模型结果 295 | rpart.model 296 | rf.model 297 | nnet.model 298 | 299 | # 利用决策树、随机森林、人工神经网络构建分类器,并对查看预测错误率 300 | # 利用rpart函数建立分类树 301 | rpart.model <- rpart::rpart(是否流失~.,data=traindata,control=(cp=0.0137457)) 302 | # 利用randomForest函数建立随机森林 303 | rf.model <- randomForest::randomForest(是否流失~.,data=traindata,mtry=2) 304 | # 利用nnet函数建立人工神经网络 305 | nnet.model <- nnet::nnet(是否流失~.,data=traindata,size = 1,decay = 0.1) 306 | 307 | # 构建result,存放预测结果 308 | result <- data.frame(arithmetic=c("决策树","随机森林","人工神经网络"), 309 | errTR=rep(0,3),errTE=rep(0,3)) 310 | for(i in 1:3){ 311 | # 预测结果 312 | traindata_predict <- predict(switch(i,rpart.model,rf.model,nnet.model), 313 | newdata=traindata,type="class") # 对训练集数据预测 314 | testdata_predict <- predict(switch(i,rpart.model,rf.model,nnet.model), 315 | newdata=testdata,type="class") # 对测试集数据预测 316 | # 构建混淆矩阵 317 | tableTR <- table(actual=traindata$是否流失,traindata_predict) 318 | tableTE <- table(actual=testdata$是否流失,testdata_predict) 319 | # 计算误差率 320 | result[i,2] <- paste0(round((sum(tableTR)-sum(diag(tableTR)))*100/sum(tableTR), 321 | 2),"%") 322 | result[i,3] <- paste0(round((sum(tableTE)-sum(diag(tableTE)))*100/sum(tableTE), 323 | 2),"%") 324 | } 325 | # 查看结果 326 | result 327 | # 下面用不同数目(1~500棵)树训练随机森林 328 | n = 500 329 | NMSE = NMSE0 <- rep(0,n) 330 | for(i in 1:n){ 331 | a <- randomForest(是否流失~.,data=traindata,ntree=i) 332 | y0 <- predict(a,traindata) 333 | y1 <- predict(a,testdata) 334 | NMSE0[i] <- sum(traindata[,'是否流失']!=y0)/nrow(traindata) 335 | NMSE[i] <- sum(testdata[,'是否流失']!=y1)/nrow(testdata) 336 | } 337 | plot(1:n,NMSE,type="l",ylim=c(min(NMSE,NMSE0),max(NMSE,NMSE0)), 338 | xlab="树的数目",ylab="误差率",lty=2) 339 | lines(1:n,NMSE0) 340 | legend("topright",lty=1:2,c("训练集","测试集")) 341 | -------------------------------------------------------------------------------- /code/chapter9.R: -------------------------------------------------------------------------------- 1 | ## 9.3 玩家物品购买关联分析 2 | # 9.3.3 案例:对玩家物品购买关联分析 3 | data <- read.csv("玩家购物数据.csv",T) 4 | # 利用cast函数对数据进行重组 5 | library(reshape) 6 | data_matrix <- cast(data,player_id~product_name,value = "qty") 7 | # 查看前三行五列数据 8 | data_matrix[1:3,1:5] 9 | # 进行替换,将NA转化为0,其他数字为1 10 | data_matrix_new <- apply(data_matrix[,-1],2,function(x) {ifelse(is.na(x),0,1)}) 11 | # 对矩阵行名称、列名称进行赋值 12 | data_matrix_new <- matrix(data_matrix_new,nrow=dim(data_matrix_new)[1], 13 | ncol=dim(data_matrix_new)[2], 14 | dimnames = list(data_matrix[,1],colnames(data_matrix)[-1])) 15 | # 查看前三行五列数据 16 | data_matrix_new[1:3,1:5] 17 | # 利用as函数将矩阵转换成事物型 18 | library(arules) 19 | data_class <- as(data_matrix_new,"transactions") 20 | inspect(data_class[1:6]) # 查看前六条交易记录 21 | summary(data_class) # 查看汇总信息 22 | # itemFrequency函数计算各个项集的出现频率(支持度) 23 | itemFrequency(data_class[,1:3]) # 查看前三件道具的支持度 24 | itemFrequency(data_class[,c('8条钥匙','15000金币','0.1元大礼包')]) # 查看指定道具的支持度 25 | # 使用itemFrequencyPlot函数绘制支持度频率图 26 | par(mfrow=c(2,1)) 27 | # 输出支持度support大于0.05的项集的支持度频率图 28 | itemFrequencyPlot(data_class,support=0.05,main="support大于0.05的项集支持度频率图") 29 | # 输出支持度support最大的前20个项集的支持度频率图 30 | itemFrequencyPlot(data_class,topN=20,main="support最大的前20个项集的支持度频率图") 31 | par(mfrow=c(1,1)) 32 | # 建立关联规则rules 33 | rules <- apriori(data_class, 34 | parameter=list(support=0.005,confidence=0.1,target="rules",minlen=2)) 35 | summary(rules) # 查看规则汇总信息 36 | inspect(rules[1:6]) # 查看前六条规则 37 | quality(rules[1:6]) # 提取前六条规则信息 38 | # 对规则按照提升度排序,并输出提升度最大的前六条规则 39 | inspect(sort(rules,by="lift")[1:6]) 40 | # 提取规则 41 | # 提取前项包含"超值大礼包"或"新手礼包"的规则 42 | inspect(subset(rules,subset=lhs %in% c("超值大礼包","新手礼包"))) 43 | # 提取lhs包含"超值大礼包"或"新手礼包"的规则且lift大于1的规则 44 | inspect(subset(rules,subset=lhs %in% c("超值大礼包","新手礼包") & lift>1)) 45 | # 对关联规则进行可视化 46 | rules_lift <- subset(rules,subset=lift>2) 47 | library(arulesViz) 48 | #绘制关联图形 49 | plot(rules_lift,method="graph", 50 | control = list(nodeCol = grey.colors(10), 51 | edgeCol = grey(.7), alpha = 1)) 52 | #绘制分组矩阵 53 | plot(rules_lift,method = "grouped", 54 | control = list(col = grey.colors(10))) 55 | # 将规则导出到本地 56 | write(rules,"rules.txt",sep="|",row.names=F) 57 | 58 | ## 9.4 基于玩家物品的智能推荐 59 | # 9.4.2 案例:对玩家物品购买进行智能推荐 60 | library(recommenderlab) 61 | # 将矩阵转化为binaryRatingMatrix对象 62 | data_class <- as(data_matrix_new,"binaryRatingMatrix") 63 | as(data_class,"matrix")[1:3,1:5] #显示部分物品购买情况 64 | # 建立三种模型,并对模型进行评价 65 | # 创建一个评分方案 (十折交叉验证) 66 | scheme <- evaluationScheme(data_class, method="cross-validation", 67 | k=10, given=-1) 68 | ## 创建用于评估模型的算法列表 69 | algorithms <- list( 70 | POPULAR = list(name = "POPULAR", param = NULL), 71 | UBCF=list(name="UBCF",param=NULL), 72 | IBCF=list(name="IBCF",param=NULL) 73 | ) 74 | # 对模型进行评价 75 | result <- evaluate(scheme,algorithms,n=1:5) 76 | # 输出ROC曲线和precision-recall曲线 77 | par(mfrow=c(1,2)) 78 | plot(result,lty=1:3,annotate=1:3,legend="topleft") # ROC 79 | plot(result,"prec/rec",lty=1:3,annotate=1:3) #precision-recall 80 | par(mfrow=c(1,1)) 81 | 82 | # 按照评价方案建立推荐模型 83 | model.popular <- Recommender(getData(scheme,"train"),method="POPULAR") 84 | model.ubcf <- Recommender(getData(scheme,"train"),method="UBCF") 85 | model.ibcf <- Recommender(getData(scheme,"train"),method="IBCF") 86 | # 对推荐模型进行预测 87 | predict.popular <- predict(model.popular,getData(scheme,"known"),type="topNList") 88 | predict.ubcf <- predict(model.ubcf,getData(scheme,"known"),type="topNList") 89 | predict.ibcf <- predict(model.ibcf,getData(scheme,"known"),type="topNList") 90 | # calcPredictionAccuracy()的参数"know"和"unknow"表示对测试集的进一步划分: 91 | # "know"表示用户已经评分的,要用来预测的items; 92 | # "unknow"表示用户已经评分,要被预测以便于进行模型评价的item 93 | predict.err <- rbind(calcPredictionAccuracy(predict.popular,getData(scheme,"unknow"),given=3), 94 | calcPredictionAccuracy(predict.ubcf,getData(scheme,"unknow"),given=3), 95 | calcPredictionAccuracy(predict.ibcf,getData(scheme,"unknow"),given=3)) 96 | rownames(predict.err) <- c("POPULAR",'UBCF','IBCF') 97 | round(predict.err,3) 98 | 99 | #选择IBCF作为最优模型 100 | model.best <- Recommender(data_class,method="IBCF") 101 | # 使用precict函数,对玩家进行Top3推荐 102 | data.predict <- predict(model.best,newdata=data_class,n=5) 103 | recom3 <- bestN(data.predict,3) 104 | as(recom3,"list")[1:5] #查看前五个玩家的top3推荐 105 | 106 | 107 | ## 9.5 社会网络分析 108 | ## 9.5.1 网络图的基本概念及R语言实现 109 | par(mfrow=c(1,3)) 110 | library(igraph) 111 | g1 <- graph(c(2,1,3,1,4,1,5,1,6,1,7,1,8,7),directed = F) 112 | plot(g1,vertex.size=30,vertex.label.cex=2);title(xlab=list("无向图g1",cex=3)) 113 | g2 <- graph(c(1,2,3,1,2,4,3,5,4,6,5,4,5,6,8,9,9,10),directed = F) 114 | plot(g2,vertex.size=30,vertex.label.cex=2);title(xlab=list("无向图g2",cex=3)) 115 | g3 <- graph(c(2,1,3,1,4,1,5,1,6,1,7,1,1,7,8,7)) 116 | plot(g3,vertex.size=30,vertex.label.cex=2,edge.arrow.size=0.5);title(xlab=list("有向图g3",cex=3)) 117 | par(mfrow=c(1,1)) 118 | str(g1) 119 | vcount(g1) 120 | V(g1) 121 | ecount(g1) 122 | E(g1) 123 | E(g3) 124 | degree(g1,v=1) 125 | degree(g3,v=1,mode="in") 126 | degree(g3,v=1,mode="out") 127 | get.shortest.paths(g2,from = 4,to = 5)[[1]] 128 | 129 | # 9.5.2 网络图的R语言实现 130 | library(igraph) 131 | g <- graph(c(2,1,3,1,4,1,5,1,6,1,7,1),directed = F) #创建无向图g 132 | par(mfrow=c(2,3)) 133 | plot(g,vertex.size=40,layout=layout_on_grid,main="简单的网格布局") # 简单的网格布局 134 | plot(g,vertex.size=40,layout=layout.auto,main="自动布局") #自动布局 135 | plot(g,vertex.size=40,layout=layout_as_star,main="星形布局") #星形布局 136 | plot(g,vertex.size=40,layout=layout.circle,main="环形布局") # 环形布局 137 | plot(g,vertex.size=40,layout=layout_randomly,main="随机布局") # 随机布局 138 | plot(g,vertex.size=40,layout=layout_as_tree(g),main="树状布局") # 树状布局 139 | par(mfrow=c(1,1)) 140 | # 对网络图g进行美化 141 | library(RColorBrewer) 142 | weight <- seq(1,3,length.out=ecount(g)) #生成边的权重 143 | # 方法一 144 | V(g)$color <- brewer.pal(9,"Set1")[1:vcount(g)] # 设置点填充颜色 145 | V(g)$frame.color <- NA # 不显示点边框 146 | V(g)$label.color <-"white" # 设置点标签颜色为白色 147 | V(g)$label.font <- 2 # 设置点标签的字体为粗体 148 | V(g)$label.cex <- 2 # 设置点标签字体大小 149 | E(g)$width <- weight # 根据边的权重设置边的粗细 150 | E(g)$color <- "steelblue4" # 设置边的颜色 151 | E(g)$lty <- 2 # 设置边为虚线 152 | plot(g,main="对网络图g进行美化") 153 | # 方法二 154 | plot(g,vertex.color=brewer.pal(9,"Set1")[1:vcount(g)], 155 | vertex.frame.color=NA,vertex.label.color="white", 156 | vertex.label.font=2,vertex.label.cex=2, 157 | edge.width=weight,edge.color="steelblue4",edge.lty=2, 158 | main="对网络图g进行美化") 159 | # 利用tkplot函数制作交互图 160 | tkplot(g) 161 | # 利用rglplot函数制作3D图 162 | rglplot(g) 163 | 164 | # 对网络数据进行社群发现 165 | library(igraphdata) 166 | data(karate) 167 | fc1 <- multilevel.community(karate) # 多层次聚类 168 | fc2 <- edge.betweenness.community(karate) # 边中间性聚类 169 | fc3 <- walktrap.community(karate) #随机游走聚类 170 | fc4 <- infomap.community(karate) #infomap算法聚类 171 | fc5 <- fastgreedy.community(karate) # 快速贪婪聚类 172 | fc6 <- label.propagation.community(karate) # 标签传播 173 | fc_list <- list(fc1,fc2,fc3,fc4,fc5,fc6) 174 | algorithm_list <- c("multilevel","edge.betweenness","walktrap", 175 | "infomap","fastgreedy","label.propagation") 176 | par(mfrow=c(2,3),mar=c(1,1,2,1)) 177 | for(i in 1:6){ 178 | plot(fc_list[[i]],karate,main=algorithm_list[[i]]) 179 | } 180 | par(mfrow=c(1,1)) 181 | 182 | ## 9.5.3 R与Gephi的结合 183 | # 导入社交数据 184 | Links <- read.csv("Links.csv") 185 | Nodes <- read.csv("Nodes.csv") 186 | # 转换成graph.object对象 187 | library(igraph) 188 | g <- graph.data.frame(Links,directed = T,vertices = Nodes) 189 | g 190 | # 绘制网络图 191 | # 对顶点进行美化 192 | V(g)$size <- 10 193 | V(g)$color <- Nodes$Group 194 | V(g)$label <- as.character(Nodes$Label) 195 | V(g)$label.cex <- 0.7 196 | # 对边进行美化 197 | E(g)$width <- (Links$Weight-min(Links$Weight))*5/(max(Links$Weight)-min(Links$Weight)) 198 | E(g)$arrow.size <- 0.5 199 | plot(g,main="用户社会网络图") 200 | # 移除某个玩家后的网络图 201 | remove.u <- "user12" 202 | remove.v <- which(V(g)$Label!=remove.u) 203 | g.new <- induced.subgraph(g,remove.v) 204 | plot(g.new,vertex.size=10, 205 | vertex.color=Nodes[-which(Nodes$Label==remove.u),"Group"], 206 | vertex.label=as.character(setdiff(Nodes$Label,remove.u)), 207 | vertex.label.cex=0.7, 208 | main=paste0("移除",remove.u,"用户后的网络图")) 209 | 210 | ## 9.5.4 案例:玩家物品购买分类分析 211 | # 将data_matrix_new数据转换成from、to的形式 212 | data_new <- c() 213 | for(i in 1:nrow(data_matrix_new)){ 214 | item.i <- colnames(data_matrix_new)[which(data_matrix_new[i,]==1)] 215 | item.i.num <- length(item.i) 216 | from <- c();to <- c() 217 | for(m in 1:(item.i.num-1)){ 218 | from <- c(from,item.i[-c((item.i.num-m+1):item.i.num)]) 219 | to <- c(to,item.i[-c(1:m)]) 220 | } 221 | data_new <- rbind(data_new,matrix(c(from,to),ncol = 2)) 222 | } 223 | data_new <- as.data.frame(data_new) 224 | head(data_new) 225 | # 对转换后的数据进行汇总,并按照频数进行降序排序 226 | library(sqldf) 227 | data_count <- sqldf("select V1,V2,count(*) from data_new group by V1,V2") 228 | colnames(data_count) <- c("from","to","qty") 229 | 230 | data_count <- data_count[order(data_count$qty,decreasing = T),] 231 | head(data_count) 232 | # 将数据转换为graph.object,并利用多种聚类算法发现社群结构 233 | library(igraph) 234 | G <- graph.data.frame(data_count[1:100,],directed = F) 235 | E(G)$weight <- data_count[1:100,"qty"] 236 | fc1 <- multilevel.community(G) # 多层次聚类 237 | fc2 <- edge.betweenness.community(G) # 边中间性聚类 238 | fc3 <- walktrap.community(G) #随机游走聚类 239 | fc4 <- infomap.community(G) #infomap算法聚类 240 | fc5 <- spinglass.community(G) # 自旋玻璃社群聚类 241 | fc6 <- label.propagation.community(G) # 标签传播 242 | fc_list <- list(fc1,fc2,fc3,fc4,fc5,fc6) 243 | algorithm_list <- c("多层次聚类","边中间性聚类","随机游走聚类", 244 | "infomap算法聚类","自旋玻璃社群聚类","标签传播") 245 | par(mfrow=c(2,3)) 246 | for(i in 1:6){ 247 | plot(fc_list[[i]],G,main=algorithm_list[[i]]) 248 | } 249 | par(mfrow=c(1,1)) 250 | 251 | -------------------------------------------------------------------------------- /data/第10章/7日留存率明细.csv: -------------------------------------------------------------------------------- 1 | 日期,渠道名称,第7日留存率 2 | 2016/1/1,渠道A,0.08 3 | 2016/1/1,渠道H,0.037 4 | 2016/1/2,渠道A,0.107 5 | 2016/1/2,渠道H,0.059 6 | 2016/1/3,渠道A,0.116 7 | 2016/1/3,渠道H,0.052 8 | 2016/1/4,渠道A,0.108 9 | 2016/1/4,渠道H,0.059 10 | 2016/1/5,渠道A,0.115 11 | 2016/1/5,渠道H,0.055 12 | 2016/1/6,渠道A,0.116 13 | 2016/1/6,渠道H,0.05 14 | 2016/1/7,渠道A,0.115 15 | 2016/1/7,渠道H,0.054 16 | 2016/1/8,渠道A,0.115 17 | 2016/1/8,渠道H,0.058 18 | 2016/1/9,渠道A,0.126 19 | 2016/1/9,渠道H,0.067 20 | 2016/1/10,渠道A,0.125 21 | 2016/1/10,渠道H,0.057 22 | 2016/1/11,渠道A,0.116 23 | 2016/1/11,渠道H,0.051 24 | 2016/1/12,渠道A,0.115 25 | 2016/1/12,渠道H,0.062 26 | 2016/1/13,渠道A,0.121 27 | 2016/1/13,渠道H,0.052 28 | 2016/1/14,渠道A,0.123 29 | 2016/1/14,渠道H,0.066 30 | 2016/1/15,渠道A,0.124 31 | 2016/1/15,渠道H,0.054 32 | 2016/1/16,渠道A,0.118 33 | 2016/1/16,渠道H,0.046 34 | 2016/1/17,渠道A,0.116 35 | 2016/1/17,渠道H,0.058 36 | 2016/1/18,渠道A,0.118 37 | 2016/1/18,渠道H,0.054 38 | 2016/1/19,渠道A,0.115 39 | 2016/1/19,渠道H,0.056 40 | 2016/1/20,渠道A,0.111 41 | 2016/1/20,渠道H,0.057 42 | 2016/1/21,渠道A,0.106 43 | 2016/1/21,渠道H,0.041 44 | 2016/1/22,渠道A,0.099 45 | 2016/1/22,渠道H,0.046 46 | 2016/1/23,渠道A,0.094 47 | 2016/1/23,渠道H,0.047 48 | 2016/1/24,渠道A,0.084 49 | 2016/1/24,渠道H,0.05 50 | 2016/1/25,渠道A,0.083 51 | 2016/1/25,渠道H,0.052 52 | 2016/1/26,渠道A,0.081 53 | 2016/1/26,渠道H,0.05 54 | 2016/1/27,渠道A,0.079 55 | 2016/1/27,渠道H,0.045 56 | 2016/1/28,渠道A,0.081 57 | 2016/1/28,渠道H,0.037 58 | 2016/1/29,渠道A,0.077 59 | 2016/1/29,渠道H,0.043 60 | 2016/1/30,渠道A,0.079 61 | 2016/1/30,渠道H,0.037 62 | 2016/1/31,渠道A,0.083 63 | 2016/1/31,渠道H,0.045 64 | -------------------------------------------------------------------------------- /data/第10章/data_10.1.csv: -------------------------------------------------------------------------------- 1 | 渠道名称,活跃用户,新增用户,日新增/日活跃,ARPPU,次日留存率 2 | 渠道1,386421,53712,0.14 ,18.1,0.33 3 | 渠道2,342286,80033,0.23 ,19.12,0.31 4 | 渠道3,300085,66267,0.22 ,18.7,0.32 5 | 渠道4,213464,49684,0.23 ,18.39,0.30 6 | 渠道5,191074,65930,0.35 ,19.66,0.28 7 | 渠道6,164305,20282,0.12 ,18.93,0.32 8 | 渠道7,160536,24361,0.15 ,16.59,0.36 9 | 渠道8,157983,33623,0.21 ,21.09,0.32 10 | 渠道9,144279,47191,0.33 ,19.87,0.30 11 | 渠道10,8907,1048,0.12 ,19.59,0.40 12 | -------------------------------------------------------------------------------- /data/第10章/rawdata.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiabiao1602/Game_DataMining_With_R/fc3586dd9032adc364d9c8851521995c1a4d3072/data/第10章/rawdata.RData -------------------------------------------------------------------------------- /data/第10章/渠道H新增第7日留存用户统计.csv: -------------------------------------------------------------------------------- 1 | date,channel_name,newuser,actionuser,retention_rate 2 | 2016/1/1,渠道H,3491,130,0.037 3 | 2016/1/2,渠道H,3136,184,0.059 4 | 2016/1/3,渠道H,2481,128,0.052 5 | 2016/1/4,渠道H,1369,81,0.059 6 | 2016/1/5,渠道H,1417,78,0.055 7 | 2016/1/6,渠道H,1348,67,0.05 8 | 2016/1/7,渠道H,1394,75,0.054 9 | 2016/1/8,渠道H,1789,104,0.058 10 | 2016/1/9,渠道H,2741,185,0.067 11 | 2016/1/10,渠道H,2496,143,0.057 12 | 2016/1/11,渠道H,1539,79,0.051 13 | 2016/1/12,渠道H,1528,95,0.062 14 | 2016/1/13,渠道H,1510,79,0.052 15 | 2016/1/14,渠道H,1657,109,0.066 16 | 2016/1/15,渠道H,1933,105,0.054 17 | 2016/1/16,渠道H,2800,129,0.046 18 | 2016/1/17,渠道H,2711,156,0.058 19 | 2016/1/18,渠道H,1887,102,0.054 20 | 2016/1/19,渠道H,2028,114,0.056 21 | 2016/1/20,渠道H,2352,134,0.057 22 | 2016/1/21,渠道H,2586,107,0.041 23 | 2016/1/22,渠道H,2993,139,0.046 24 | 2016/1/23,渠道H,3173,149,0.047 25 | 2016/1/24,渠道H,3078,155,0.05 26 | 2016/1/25,渠道H,2673,138,0.052 27 | 2016/1/26,渠道H,2948,146,0.05 28 | 2016/1/27,渠道H,3151,141,0.045 29 | 2016/1/28,渠道H,3691,137,0.037 30 | 2016/1/29,渠道H,4275,184,0.043 31 | 2016/1/30,渠道H,4846,180,0.037 32 | 2016/1/31,渠道H,4881,218,0.045 33 | -------------------------------------------------------------------------------- /data/第10章/渠道日概况.csv: -------------------------------------------------------------------------------- 1 | 日期,渠道名称,新增用户,活跃用户,付费用户,新增付费用户,收入,新增用户收入,渠道收入占比,付费率,ARPPU,ARPU,新增次日留存率,新增7日后留存率 2 | 2016/1/1,渠道D,39861,214859,6135,4277,108079,24758,0.250 ,0.029 ,17.620 ,0.500 ,0.301 ,0.078 3 | 2016/1/1,渠道E,44578,193292,4788,3458,82938,22267,0.192 ,0.025 ,17.320 ,0.430 ,0.294 ,0.081 4 | 2016/1/1,渠道B,69525,170573,2477,2011,44455,18261,0.103 ,0.015 ,17.950 ,0.260 ,0.217 ,0.042 5 | 2016/1/1,渠道J,74646,170497,2928,2408,57087,27298,0.132 ,0.017 ,19.500 ,0.330 ,0.246 ,0.047 6 | 2016/1/1,渠道A,42694,149968,3264,2473,60599,15280,0.140 ,0.022 ,18.570 ,0.400 ,0.304 ,0.080 7 | 2016/1/1,渠道C,29349,121022,2810,2039,49376,14902,0.114 ,0.023 ,17.570 ,0.410 ,0.308 ,0.077 8 | 2016/1/1,渠道G,30431,50167,346,293,8323,4212,0.019 ,0.007 ,24.060 ,0.170 ,0.186 ,0.031 9 | 2016/1/1,渠道F,9588,27850,359,185,10249,2287,0.024 ,0.013 ,28.550 ,0.370 ,0.322 ,0.060 10 | 2016/1/1,渠道H,3491,13999,641,374,7168,2623,0.017 ,0.046 ,11.180 ,0.510 ,0.169 ,0.037 11 | 2016/1/1,渠道I,1535,7940,228,168,3968,956,0.009 ,0.029 ,17.400 ,0.500 ,0.306 ,0.065 12 | 2016/1/2,渠道D,36968,199509,5531,3696,96265,20792,0.241 ,0.028 ,17.400 ,0.480 ,0.286 ,0.107 13 | 2016/1/2,渠道E,41902,181541,4291,2989,74468,18420,0.186 ,0.024 ,17.350 ,0.410 ,0.281 ,0.104 14 | 2016/1/2,渠道J,61856,158488,2763,2144,54161,20498,0.136 ,0.017 ,19.600 ,0.340 ,0.237 ,0.075 15 | 2016/1/2,渠道B,58070,153990,2260,1796,40911,15993,0.102 ,0.015 ,18.100 ,0.270 ,0.214 ,0.066 16 | 2016/1/2,渠道A,37444,140874,3078,2233,59892,15600,0.150 ,0.022 ,19.460 ,0.430 ,0.295 ,0.107 17 | 2016/1/2,渠道C,25989,113124,2510,1794,44111,12231,0.110 ,0.022 ,17.570 ,0.390 ,0.297 ,0.113 18 | 2016/1/2,渠道G,23481,43747,357,286,8244,3009,0.021 ,0.008 ,23.090 ,0.190 ,0.179 ,0.048 19 | 2016/1/2,渠道F,8952,26677,448,250,10931,2656,0.027 ,0.017 ,24.400 ,0.410 ,0.296 ,0.089 20 | 2016/1/2,渠道H,3136,12926,634,380,7338,2401,0.018 ,0.049 ,11.570 ,0.570 ,0.172 ,0.059 21 | 2016/1/2,渠道I,1377,7296,176,119,3013,773,0.008 ,0.024 ,17.120 ,0.410 ,0.300 ,0.105 22 | 2016/1/3,渠道D,29294,175890,4609,3042,78114,16788,0.254 ,0.026 ,16.950 ,0.440 ,0.223 ,0.109 23 | 2016/1/3,渠道E,32304,161064,3722,2597,60017,13330,0.195 ,0.023 ,16.120 ,0.370 ,0.226 ,0.107 24 | 2016/1/3,渠道J,46071,133921,2169,1626,38961,12763,0.126 ,0.016 ,17.960 ,0.290 ,0.171 ,0.073 25 | 2016/1/3,渠道B,44912,131645,1907,1464,32049,12634,0.104 ,0.015 ,16.810 ,0.240 ,0.164 ,0.066 26 | 2016/1/3,渠道A,29701,125489,2600,1758,46488,10107,0.151 ,0.021 ,17.880 ,0.370 ,0.241 ,0.116 27 | 2016/1/3,渠道C,20318,100111,1901,1281,30171,7050,0.098 ,0.019 ,15.870 ,0.300 ,0.226 ,0.109 28 | 2016/1/3,渠道G,17788,36408,276,199,5988,2137,0.019 ,0.008 ,21.700 ,0.160 ,0.130 ,0.048 29 | 2016/1/3,渠道F,7051,23151,386,202,7203,1819,0.023 ,0.017 ,18.660 ,0.310 ,0.202 ,0.078 30 | 2016/1/3,渠道H,2481,11104,537,293,6366,1350,0.021 ,0.048 ,11.860 ,0.570 ,0.128 ,0.052 31 | 2016/1/3,渠道I,1155,6463,166,113,2754,766,0.009 ,0.026 ,16.590 ,0.430 ,0.222 ,0.096 32 | 2016/1/4,渠道D,14707,115752,2579,1603,39521,7325,0.240 ,0.022 ,15.320 ,0.340 ,0.314 ,0.098 33 | 2016/1/4,渠道E,17624,109976,2201,1463,32091,6547,0.195 ,0.020 ,14.580 ,0.290 ,0.316 ,0.103 34 | 2016/1/4,渠道A,17116,86486,1675,1108,27386,5394,0.167 ,0.019 ,16.350 ,0.320 ,0.332 ,0.108 35 | 2016/1/4,渠道B,23040,82496,1107,815,17173,6159,0.104 ,0.013 ,15.510 ,0.210 ,0.242 ,0.059 36 | 2016/1/4,渠道J,20804,77696,1265,889,21617,5754,0.132 ,0.016 ,17.090 ,0.280 ,0.271 ,0.062 37 | 2016/1/4,渠道C,11321,65792,1025,684,14443,2897,0.088 ,0.016 ,14.090 ,0.220 ,0.329 ,0.096 38 | 2016/1/4,渠道G,7717,19502,160,114,3322,832,0.020 ,0.008 ,20.760 ,0.170 ,0.205 ,0.043 39 | 2016/1/4,渠道F,2815,13430,231,114,3826,849,0.023 ,0.017 ,16.560 ,0.280 ,0.317 ,0.070 40 | 2016/1/4,渠道H,1369,7049,329,163,3543,1416,0.022 ,0.047 ,10.770 ,0.500 ,0.206 ,0.059 41 | 2016/1/4,渠道I,622,4150,86,52,1445,334,0.009 ,0.021 ,16.800 ,0.350 ,0.312 ,0.080 42 | 2016/1/5,渠道D,14525,114103,2183,1338,36351,7016,0.228 ,0.019 ,16.650 ,0.320 ,0.326 ,0.101 43 | 2016/1/5,渠道E,17664,110220,1896,1267,29434,5741,0.185 ,0.017 ,15.520 ,0.270 ,0.326 ,0.116 44 | 2016/1/5,渠道A,17261,86886,1532,1003,26392,5137,0.166 ,0.018 ,17.230 ,0.300 ,0.345 ,0.115 45 | 2016/1/5,渠道B,22767,81292,1029,766,19232,6484,0.121 ,0.013 ,18.690 ,0.240 ,0.262 ,0.064 46 | 2016/1/5,渠道J,22926,79071,1141,851,21047,7187,0.132 ,0.014 ,18.450 ,0.270 ,0.284 ,0.066 47 | 2016/1/5,渠道C,12260,66825,964,633,14710,2886,0.092 ,0.014 ,15.260 ,0.220 ,0.330 ,0.107 48 | 2016/1/5,渠道G,6577,17774,114,80,2619,669,0.016 ,0.006 ,22.970 ,0.150 ,0.206 ,0.044 49 | 2016/1/5,渠道F,2883,13164,256,115,4413,823,0.028 ,0.019 ,17.240 ,0.340 ,0.331 ,0.080 50 | 2016/1/5,渠道H,1417,7197,354,180,3789,950,0.024 ,0.049 ,10.700 ,0.530 ,0.200 ,0.055 51 | 2016/1/5,渠道I,672,4172,75,50,1432,342,0.009 ,0.018 ,19.090 ,0.340 ,0.323 ,0.080 52 | 2016/1/6,渠道D,14776,112781,1985,1227,33893,5888,0.223 ,0.018 ,17.070 ,0.300 ,0.330 ,0.109 53 | 2016/1/6,渠道E,17741,109928,1963,1308,30860,6664,0.203 ,0.018 ,15.720 ,0.280 ,0.327 ,0.110 54 | 2016/1/6,渠道A,17893,88418,1429,988,24223,5041,0.159 ,0.016 ,16.950 ,0.270 ,0.355 ,0.116 55 | 2016/1/6,渠道B,22614,80833,992,737,18240,6666,0.120 ,0.012 ,18.390 ,0.230 ,0.266 ,0.068 56 | 2016/1/6,渠道J,20768,77146,1115,822,21155,7272,0.139 ,0.015 ,18.970 ,0.270 ,0.285 ,0.064 57 | 2016/1/6,渠道C,12332,67268,907,616,13817,3211,0.091 ,0.014 ,15.230 ,0.210 ,0.339 ,0.100 58 | 2016/1/6,渠道G,6809,17797,90,65,1858,456,0.012 ,0.005 ,20.640 ,0.100 ,0.217 ,0.040 59 | 2016/1/6,渠道F,2888,13157,238,121,3839,739,0.025 ,0.018 ,16.130 ,0.290 ,0.335 ,0.066 60 | 2016/1/6,渠道H,1348,7041,309,168,3408,1015,0.022 ,0.044 ,11.030 ,0.480 ,0.188 ,0.050 61 | 2016/1/6,渠道I,748,4143,68,50,999,180,0.007 ,0.016 ,14.690 ,0.240 ,0.337 ,0.099 62 | 2016/1/7,渠道D,15091,113124,1857,1190,29538,5829,0.202 ,0.016 ,15.910 ,0.260 ,0.337 ,0.112 63 | 2016/1/7,渠道E,18378,111549,1936,1308,31378,7603,0.215 ,0.017 ,16.210 ,0.280 ,0.339 ,0.113 64 | 2016/1/7,渠道A,18893,91266,1422,987,24047,4940,0.165 ,0.016 ,16.910 ,0.260 ,0.360 ,0.115 65 | 2016/1/7,渠道B,24623,83805,981,754,18183,6397,0.124 ,0.012 ,18.540 ,0.220 ,0.273 ,0.064 66 | 2016/1/7,渠道J,22862,79669,1096,815,19395,7089,0.133 ,0.014 ,17.700 ,0.240 ,0.297 ,0.067 67 | 2016/1/7,渠道C,12507,67616,1014,682,14972,3584,0.102 ,0.015 ,14.770 ,0.220 ,0.358 ,0.118 68 | 2016/1/7,渠道G,7843,18993,57,41,1566,914,0.011 ,0.003 ,27.470 ,0.080 ,0.224 ,0.046 69 | 2016/1/7,渠道F,3084,13345,204,89,2642,443,0.018 ,0.015 ,12.950 ,0.200 ,0.337 ,0.072 70 | 2016/1/7,渠道H,1394,7179,331,185,3352,1351,0.023 ,0.046 ,10.130 ,0.470 ,0.197 ,0.054 71 | 2016/1/7,渠道I,906,4290,68,49,1105,256,0.008 ,0.016 ,16.250 ,0.260 ,0.331 ,0.092 72 | 2016/1/8,渠道D,18690,132071,2075,1337,29642,5636,0.187 ,0.016 ,14.290 ,0.220 ,0.355 ,0.118 73 | 2016/1/8,渠道E,23647,130850,2228,1569,33865,8570,0.213 ,0.017 ,15.200 ,0.260 ,0.348 ,0.115 74 | 2016/1/8,渠道A,24102,107691,1663,1206,25797,6527,0.162 ,0.015 ,15.510 ,0.240 ,0.365 ,0.115 75 | 2016/1/8,渠道J,36919,105523,1407,1086,24294,10494,0.153 ,0.013 ,17.270 ,0.230 ,0.302 ,0.068 76 | 2016/1/8,渠道B,33638,102926,1195,933,20320,7653,0.128 ,0.012 ,17.000 ,0.200 ,0.276 ,0.064 77 | 2016/1/8,渠道C,15474,79409,1074,752,14939,3404,0.094 ,0.014 ,13.910 ,0.190 ,0.357 ,0.111 78 | 2016/1/8,渠道G,9432,23074,80,59,1362,501,0.009 ,0.004 ,17.020 ,0.060 ,0.233 ,0.047 79 | 2016/1/8,渠道F,4237,16484,225,115,3250,770,0.020 ,0.014 ,14.440 ,0.200 ,0.357 ,0.083 80 | 2016/1/8,渠道H,1789,8706,400,217,4193,1390,0.026 ,0.046 ,10.480 ,0.480 ,0.220 ,0.058 81 | 2016/1/8,渠道I,997,4892,91,57,1203,342,0.008 ,0.019 ,13.220 ,0.250 ,0.352 ,0.091 82 | 2016/1/9,渠道D,28523,166982,2921,1939,46230,10519,0.187 ,0.018 ,15.830 ,0.280 ,0.310 ,0.128 83 | 2016/1/9,渠道E,32718,160871,3046,2212,50183,13929,0.203 ,0.019 ,16.480 ,0.310 ,0.311 ,0.122 84 | 2016/1/9,渠道J,51602,141615,1995,1556,37318,14065,0.151 ,0.014 ,18.710 ,0.260 ,0.254 ,0.080 85 | 2016/1/9,渠道B,54829,141374,1807,1484,33548,13536,0.135 ,0.013 ,18.570 ,0.240 ,0.234 ,0.075 86 | 2016/1/9,渠道A,35971,137976,2265,1663,38273,11167,0.155 ,0.016 ,16.900 ,0.280 ,0.322 ,0.126 87 | 2016/1/9,渠道C,23331,103062,1721,1239,26241,7643,0.106 ,0.017 ,15.250 ,0.250 ,0.320 ,0.129 88 | 2016/1/9,渠道G,15624,32869,108,88,2344,860,0.009 ,0.003 ,21.700 ,0.070 ,0.191 ,0.058 89 | 2016/1/9,渠道F,7282,22719,344,169,5803,1468,0.023 ,0.015 ,16.870 ,0.260 ,0.298 ,0.104 90 | 2016/1/9,渠道H,2741,11411,536,307,5949,1982,0.024 ,0.047 ,11.100 ,0.520 ,0.179 ,0.067 91 | 2016/1/9,渠道I,1191,6237,122,88,1832,597,0.007 ,0.020 ,15.020 ,0.290 ,0.312 ,0.118 92 | 2016/1/10,渠道D,25727,159095,2821,1844,46323,9834,0.205 ,0.018 ,16.420 ,0.290 ,0.252 ,0.118 93 | 2016/1/10,渠道E,30182,156010,2966,2124,47562,12891,0.211 ,0.019 ,16.040 ,0.300 ,0.257 ,0.120 94 | 2016/1/10,渠道A,30557,131911,2025,1476,34410,9294,0.152 ,0.015 ,16.990 ,0.260 ,0.271 ,0.125 95 | 2016/1/10,渠道B,46504,131705,1552,1194,27841,11135,0.123 ,0.012 ,17.940 ,0.210 ,0.185 ,0.069 96 | 2016/1/10,渠道J,44790,131662,1845,1424,33162,12792,0.147 ,0.014 ,17.970 ,0.250 ,0.192 ,0.078 97 | 2016/1/10,渠道C,20752,99244,1510,1068,22462,5938,0.100 ,0.015 ,14.880 ,0.230 ,0.255 ,0.123 98 | 2016/1/10,渠道G,13567,30162,74,55,1341,444,0.006 ,0.003 ,18.120 ,0.040 ,0.144 ,0.054 99 | 2016/1/10,渠道F,6163,20983,342,174,5321,985,0.024 ,0.016 ,15.560 ,0.250 ,0.223 ,0.095 100 | 2016/1/10,渠道H,2496,11088,508,287,5364,1868,0.024 ,0.046 ,10.560 ,0.480 ,0.156 ,0.057 101 | 2016/1/10,渠道I,1074,5879,110,71,1901,675,0.008 ,0.019 ,17.280 ,0.320 ,0.237 ,0.119 102 | 2016/1/11,渠道E,18541,116964,1908,1302,30560,7247,0.205 ,0.016 ,16.020 ,0.260 ,0.335 ,0.111 103 | 2016/1/11,渠道D,15926,115886,1810,1149,30587,6458,0.205 ,0.016 ,16.900 ,0.260 ,0.326 ,0.100 104 | 2016/1/11,渠道A,19195,98383,1431,1004,23812,5710,0.159 ,0.015 ,16.640 ,0.240 ,0.349 ,0.116 105 | 2016/1/11,渠道B,27472,91883,1087,846,20845,7928,0.140 ,0.012 ,19.180 ,0.230 ,0.256 ,0.063 106 | 2016/1/11,渠道J,23897,85323,1137,847,21216,7784,0.142 ,0.013 ,18.660 ,0.250 ,0.280 ,0.065 107 | 2016/1/11,渠道C,12234,70764,856,584,12695,2798,0.085 ,0.012 ,14.830 ,0.180 ,0.339 ,0.111 108 | 2016/1/11,渠道G,6919,18375,68,51,1181,450,0.008 ,0.004 ,17.370 ,0.060 ,0.204 ,0.046 109 | 2016/1/11,渠道F,3093,13672,221,114,2786,542,0.019 ,0.016 ,12.610 ,0.200 ,0.301 ,0.063 110 | 2016/1/11,渠道H,1539,7831,375,207,4295,1614,0.029 ,0.048 ,11.450 ,0.550 ,0.190 ,0.051 111 | 2016/1/11,渠道I,609,3975,71,53,1334,498,0.009 ,0.018 ,18.790 ,0.340 ,0.289 ,0.097 112 | 2016/1/12,渠道E,17631,115432,1826,1248,27433,7175,0.190 ,0.016 ,15.020 ,0.240 ,0.332 ,0.114 113 | 2016/1/12,渠道D,16018,114803,1724,1075,28609,5295,0.199 ,0.015 ,16.590 ,0.250 ,0.330 ,0.106 114 | 2016/1/12,渠道A,18667,97972,1362,961,23883,6452,0.166 ,0.014 ,17.540 ,0.240 ,0.350 ,0.115 115 | 2016/1/12,渠道B,24538,88104,1005,763,18546,6334,0.129 ,0.011 ,18.450 ,0.210 ,0.265 ,0.068 116 | 2016/1/12,渠道J,26614,87684,1163,869,21097,7949,0.146 ,0.013 ,18.140 ,0.240 ,0.279 ,0.068 117 | 2016/1/12,渠道C,12027,70223,909,624,13891,3413,0.096 ,0.013 ,15.280 ,0.200 ,0.334 ,0.114 118 | 2016/1/12,渠道G,8201,19602,76,58,1637,682,0.011 ,0.004 ,21.540 ,0.080 ,0.203 ,0.044 119 | 2016/1/12,渠道F,3309,13743,230,117,3156,631,0.022 ,0.017 ,13.720 ,0.230 ,0.338 ,0.075 120 | 2016/1/12,渠道H,1528,7627,382,216,4747,1430,0.033 ,0.050 ,12.430 ,0.620 ,0.187 ,0.062 121 | 2016/1/12,渠道I,551,3751,61,42,1053,184,0.007 ,0.016 ,17.260 ,0.280 ,0.312 ,0.089 122 | 2016/1/13,渠道D,15382,117163,1656,1092,26522,4226,0.197 ,0.014 ,16.020 ,0.230 ,0.330 ,0.106 123 | 2016/1/13,渠道E,16699,114032,1774,1203,27616,6101,0.205 ,0.016 ,15.570 ,0.240 ,0.334 ,0.124 124 | 2016/1/13,渠道A,17313,96904,1279,880,20721,4745,0.154 ,0.013 ,16.200 ,0.210 ,0.353 ,0.121 125 | 2016/1/13,渠道J,25433,87719,1094,843,19583,7100,0.145 ,0.013 ,17.900 ,0.220 ,0.288 ,0.070 126 | 2016/1/13,渠道B,22428,85757,900,680,17532,6297,0.130 ,0.011 ,19.480 ,0.200 ,0.272 ,0.072 127 | 2016/1/13,渠道C,11627,69827,855,595,12248,2736,0.091 ,0.012 ,14.330 ,0.180 ,0.350 ,0.123 128 | 2016/1/13,渠道G,10580,22398,88,73,1840,729,0.014 ,0.004 ,20.910 ,0.080 ,0.209 ,0.047 129 | 2016/1/13,渠道F,3545,14105,243,115,3854,929,0.029 ,0.017 ,15.860 ,0.270 ,0.333 ,0.079 130 | 2016/1/13,渠道H,1510,7728,371,214,4138,1496,0.031 ,0.048 ,11.150 ,0.540 ,0.191 ,0.052 131 | 2016/1/13,渠道I,788,4052,58,43,852,237,0.006 ,0.014 ,14.690 ,0.210 ,0.301 ,0.088 132 | 2016/1/14,渠道D,16445,127683,1915,1264,31112,6314,0.214 ,0.015 ,16.250 ,0.240 ,0.334 ,0.107 133 | 2016/1/14,渠道E,20535,120265,1853,1321,28725,7324,0.197 ,0.015 ,15.500 ,0.240 ,0.311 ,0.112 134 | 2016/1/14,渠道A,18686,100242,1410,1008,23561,5892,0.162 ,0.014 ,16.710 ,0.240 ,0.356 ,0.123 135 | 2016/1/14,渠道J,28299,92803,1197,909,19749,7426,0.136 ,0.013 ,16.500 ,0.210 ,0.293 ,0.073 136 | 2016/1/14,渠道B,23294,87956,968,738,18031,7000,0.124 ,0.011 ,18.630 ,0.210 ,0.282 ,0.071 137 | 2016/1/14,渠道C,12172,72323,921,651,13946,3960,0.096 ,0.013 ,15.140 ,0.190 ,0.342 ,0.114 138 | 2016/1/14,渠道G,10167,22886,86,71,1425,562,0.010 ,0.004 ,16.570 ,0.060 ,0.222 ,0.047 139 | 2016/1/14,渠道F,3658,14486,249,107,4324,1036,0.030 ,0.017 ,17.370 ,0.300 ,0.347 ,0.089 140 | 2016/1/14,渠道H,1657,7937,367,209,4043,1410,0.028 ,0.046 ,11.020 ,0.510 ,0.194 ,0.066 141 | 2016/1/14,渠道I,842,4250,57,40,782,186,0.005 ,0.013 ,13.720 ,0.180 ,0.298 ,0.105 142 | 2016/1/15,渠道D,19266,146673,2210,1453,35067,7684,0.204 ,0.015 ,15.870 ,0.240 ,0.346 ,0.107 143 | 2016/1/15,渠道E,23831,136070,2197,1543,35456,8082,0.206 ,0.016 ,16.140 ,0.260 ,0.330 ,0.102 144 | 2016/1/15,渠道J,39107,114947,1493,1168,26878,11002,0.156 ,0.013 ,18.000 ,0.230 ,0.295 ,0.065 145 | 2016/1/15,渠道A,22303,113612,1517,1067,25532,5929,0.149 ,0.013 ,16.830 ,0.220 ,0.351 ,0.124 146 | 2016/1/15,渠道B,28348,101720,1129,880,19928,8468,0.116 ,0.011 ,17.650 ,0.200 ,0.288 ,0.074 147 | 2016/1/15,渠道C,15752,84596,1082,745,15978,4593,0.093 ,0.013 ,14.770 ,0.190 ,0.357 ,0.123 148 | 2016/1/15,渠道G,13190,28499,106,86,2357,1092,0.014 ,0.004 ,22.240 ,0.080 ,0.239 ,0.048 149 | 2016/1/15,渠道F,6265,19578,308,154,5018,1482,0.029 ,0.016 ,16.290 ,0.260 ,0.344 ,0.086 150 | 2016/1/15,渠道H,1933,9170,435,267,4313,1569,0.025 ,0.047 ,9.920 ,0.470 ,0.197 ,0.054 151 | 2016/1/15,渠道I,990,4865,85,63,1369,358,0.008 ,0.018 ,16.110 ,0.280 ,0.320 ,0.093 152 | 2016/1/16,渠道D,28424,178219,3061,2088,51990,11865,0.206 ,0.017 ,16.980 ,0.290 ,0.309 ,0.079 153 | 2016/1/16,渠道E,30373,161165,3063,2155,50786,12839,0.201 ,0.019 ,16.580 ,0.320 ,0.313 ,0.071 154 | 2016/1/16,渠道J,51704,145827,1986,1537,37502,14671,0.148 ,0.014 ,18.880 ,0.260 ,0.258 ,0.062 155 | 2016/1/16,渠道A,31336,138319,2229,1625,39192,10848,0.155 ,0.016 ,17.580 ,0.280 ,0.324 ,0.118 156 | 2016/1/16,渠道B,42155,129334,1652,1318,29458,11738,0.117 ,0.013 ,17.830 ,0.230 ,0.249 ,0.067 157 | 2016/1/16,渠道C,22157,105480,1588,1117,25660,7217,0.101 ,0.015 ,16.160 ,0.240 ,0.328 ,0.118 158 | 2016/1/16,渠道G,19556,38800,177,143,3545,1597,0.014 ,0.005 ,20.030 ,0.090 ,0.195 ,0.058 159 | 2016/1/16,渠道F,12463,29626,407,236,7498,2829,0.030 ,0.014 ,18.420 ,0.250 ,0.293 ,0.075 160 | 2016/1/16,渠道H,2800,11719,520,316,5416,2175,0.021 ,0.044 ,10.420 ,0.460 ,0.185 ,0.046 161 | 2016/1/16,渠道I,1285,6043,108,79,1811,562,0.007 ,0.018 ,16.770 ,0.300 ,0.307 ,0.087 162 | 2016/1/17,渠道D,26306,168748,2986,2005,50644,12077,0.213 ,0.018 ,16.960 ,0.300 ,0.263 ,0.064 163 | 2016/1/17,渠道E,27466,154614,2800,1983,44639,11503,0.188 ,0.018 ,15.940 ,0.290 ,0.273 ,0.060 164 | 2016/1/17,渠道J,46058,137672,1966,1520,35663,14214,0.150 ,0.014 ,18.140 ,0.260 ,0.211 ,0.055 165 | 2016/1/17,渠道A,29225,135193,2145,1513,37668,9927,0.158 ,0.016 ,17.560 ,0.280 ,0.281 ,0.116 166 | 2016/1/17,渠道B,37394,121123,1535,1240,26189,10628,0.110 ,0.013 ,17.060 ,0.220 ,0.208 ,0.065 167 | 2016/1/17,渠道C,19614,101932,1488,1066,23820,5672,0.100 ,0.015 ,16.010 ,0.230 ,0.278 ,0.122 168 | 2016/1/17,渠道G,16849,35386,166,142,3577,1579,0.015 ,0.005 ,21.550 ,0.100 ,0.167 ,0.053 169 | 2016/1/17,渠道F,12274,30272,386,196,7800,2134,0.033 ,0.013 ,20.210 ,0.260 ,0.230 ,0.065 170 | 2016/1/17,渠道H,2711,11461,521,294,6071,1795,0.026 ,0.046 ,11.650 ,0.530 ,0.168 ,0.058 171 | 2016/1/17,渠道I,1141,5853,101,66,1732,440,0.007 ,0.017 ,17.150 ,0.300 ,0.252 ,0.082 172 | 2016/1/18,渠道D,17752,130203,1913,1253,31750,5995,0.211 ,0.015 ,16.600 ,0.240 ,0.338 ,0.056 173 | 2016/1/18,渠道E,19288,124565,1936,1331,32039,8346,0.213 ,0.016 ,16.550 ,0.260 ,0.344 ,0.056 174 | 2016/1/18,渠道A,20331,108014,1437,972,24297,5251,0.161 ,0.013 ,16.910 ,0.220 ,0.365 ,0.118 175 | 2016/1/18,渠道J,28351,99288,1228,900,22051,8171,0.146 ,0.012 ,17.960 ,0.220 ,0.291 ,0.054 176 | 2016/1/18,渠道B,25277,92940,985,763,16558,6333,0.110 ,0.011 ,16.810 ,0.180 ,0.288 ,0.067 177 | 2016/1/18,渠道C,12527,78134,871,579,13058,2700,0.087 ,0.011 ,14.990 ,0.170 ,0.363 ,0.118 178 | 2016/1/18,渠道G,11119,25910,116,96,2003,721,0.013 ,0.005 ,17.270 ,0.080 ,0.214 ,0.054 179 | 2016/1/18,渠道F,7265,21933,238,100,4039,911,0.027 ,0.011 ,16.970 ,0.180 ,0.310 ,0.071 180 | 2016/1/18,渠道H,1887,8868,424,234,3709,1237,0.025 ,0.048 ,8.750 ,0.420 ,0.193 ,0.054 181 | 2016/1/18,渠道I,870,4464,76,48,1068,219,0.007 ,0.017 ,14.050 ,0.240 ,0.333 ,0.098 182 | 2016/1/19,渠道D,19596,135897,1921,1228,31626,6764,0.204 ,0.014 ,16.460 ,0.230 ,0.348 ,0.048 183 | 2016/1/19,渠道E,20734,129679,1931,1325,31016,7106,0.200 ,0.015 ,16.060 ,0.240 ,0.350 ,0.050 184 | 2016/1/19,渠道A,23139,114982,1520,1035,25163,6622,0.162 ,0.013 ,16.550 ,0.220 ,0.363 ,0.115 185 | 2016/1/19,渠道J,38740,113741,1339,1034,23322,10132,0.150 ,0.012 ,17.420 ,0.210 ,0.303 ,0.051 186 | 2016/1/19,渠道B,27059,97430,1027,805,18483,6639,0.119 ,0.011 ,18.000 ,0.190 ,0.290 ,0.065 187 | 2016/1/19,渠道C,13940,82225,887,596,13467,3448,0.087 ,0.011 ,15.180 ,0.160 ,0.367 ,0.113 188 | 2016/1/19,渠道G,11942,27286,119,91,2421,899,0.016 ,0.004 ,20.340 ,0.090 ,0.227 ,0.058 189 | 2016/1/19,渠道F,7564,23093,255,128,3862,1040,0.025 ,0.011 ,15.140 ,0.170 ,0.320 ,0.068 190 | 2016/1/19,渠道H,2028,9206,419,227,4649,1535,0.030 ,0.046 ,11.100 ,0.510 ,0.216 ,0.056 191 | 2016/1/19,渠道I,922,4573,78,54,1069,281,0.007 ,0.017 ,13.710 ,0.230 ,0.322 ,0.081 192 | 2016/1/20,渠道D,23164,149276,2212,1391,37694,8543,0.200 ,0.015 ,17.040 ,0.250 ,0.348 ,0.043 193 | 2016/1/20,渠道E,22953,140776,2031,1358,36034,8951,0.191 ,0.014 ,17.740 ,0.260 ,0.361 ,0.046 194 | 2016/1/20,渠道J,42642,127627,1493,1145,28233,12196,0.150 ,0.012 ,18.910 ,0.220 ,0.298 ,0.050 195 | 2016/1/20,渠道A,25895,125506,1684,1167,30205,7283,0.160 ,0.013 ,17.940 ,0.240 ,0.368 ,0.111 196 | 2016/1/20,渠道B,32108,108350,1246,952,23594,9525,0.125 ,0.012 ,18.940 ,0.220 ,0.293 ,0.063 197 | 2016/1/20,渠道C,16949,90901,1103,776,18668,5260,0.099 ,0.012 ,16.920 ,0.210 ,0.368 ,0.121 198 | 2016/1/20,渠道G,13425,30354,138,112,2946,1277,0.016 ,0.005 ,21.350 ,0.100 ,0.232 ,0.054 199 | 2016/1/20,渠道F,9269,26981,324,162,5622,1401,0.030 ,0.012 ,17.350 ,0.210 ,0.322 ,0.063 200 | 2016/1/20,渠道H,2352,10432,503,278,4606,1533,0.024 ,0.048 ,9.160 ,0.440 ,0.203 ,0.057 201 | 2016/1/20,渠道I,974,4973,74,46,1011,117,0.005 ,0.015 ,13.660 ,0.200 ,0.316 ,0.090 202 | 2016/1/21,渠道D,26741,160974,2401,1599,42242,9910,0.193 ,0.015 ,17.590 ,0.260 ,0.338 ,0.040 203 | 2016/1/21,渠道E,25518,151653,2256,1587,41108,10259,0.188 ,0.015 ,18.220 ,0.270 ,0.319 ,0.040 204 | 2016/1/21,渠道A,31484,139920,1929,1405,36695,10199,0.168 ,0.014 ,19.020 ,0.260 ,0.364 ,0.106 205 | 2016/1/21,渠道J,44811,137371,1691,1323,33128,12113,0.152 ,0.012 ,19.590 ,0.240 ,0.253 ,0.044 206 | 2016/1/21,渠道B,35958,118389,1293,998,25650,9278,0.117 ,0.011 ,19.840 ,0.220 ,0.283 ,0.063 207 | 2016/1/21,渠道C,23204,103695,1285,920,22644,7218,0.104 ,0.012 ,17.620 ,0.220 ,0.373 ,0.117 208 | 2016/1/21,渠道G,15078,33942,162,117,3285,1411,0.015 ,0.005 ,20.280 ,0.100 ,0.230 ,0.055 209 | 2016/1/21,渠道F,11110,31100,315,148,5994,1796,0.027 ,0.010 ,19.030 ,0.190 ,0.309 ,0.068 210 | 2016/1/21,渠道H,2586,11182,580,329,6643,2313,0.030 ,0.052 ,11.450 ,0.590 ,0.186 ,0.041 211 | 2016/1/21,渠道I,1107,5356,84,64,1197,382,0.005 ,0.016 ,14.250 ,0.220 ,0.312 ,0.075 212 | 2016/1/22,渠道A,39369,159199,2319,1683,40484,11551,0.212 ,0.015 ,17.460 ,0.250 ,0.333 ,0.099 213 | 2016/1/22,渠道D,18626,156672,2201,1443,34952,6920,0.183 ,0.014 ,15.880 ,0.220 ,0.204 ,0.037 214 | 2016/1/22,渠道B,42125,130665,1482,1184,25223,10272,0.132 ,0.011 ,17.020 ,0.190 ,0.272 ,0.069 215 | 2016/1/22,渠道E,8472,126667,1691,1119,28453,5296,0.149 ,0.013 ,16.830 ,0.220 ,0.195 ,0.051 216 | 2016/1/22,渠道C,30979,123823,1703,1231,28089,9419,0.147 ,0.014 ,16.490 ,0.230 ,0.349 ,0.119 217 | 2016/1/22,渠道J,8292,96456,1112,791,19085,3710,0.100 ,0.012 ,17.160 ,0.200 ,0.251 ,0.064 218 | 2016/1/22,渠道G,18295,39095,133,104,2583,1369,0.014 ,0.003 ,19.420 ,0.070 ,0.259 ,0.061 219 | 2016/1/22,渠道F,12277,34242,332,177,5150,1511,0.027 ,0.010 ,15.510 ,0.150 ,0.324 ,0.067 220 | 2016/1/22,渠道H,2993,12474,588,338,5315,1874,0.028 ,0.047 ,9.040 ,0.430 ,0.191 ,0.046 221 | 2016/1/22,渠道I,1993,6637,79,51,1636,571,0.009 ,0.012 ,20.710 ,0.250 ,0.323 ,0.081 222 | 2016/1/23,渠道A,49382,176672,2794,2086,52328,16424,0.279 ,0.016 ,18.730 ,0.300 ,0.300 ,0.094 223 | 2016/1/23,渠道C,37779,141069,1921,1393,33836,12141,0.180 ,0.014 ,17.610 ,0.240 ,0.320 ,0.114 224 | 2016/1/23,渠道B,45399,136547,1660,1298,29543,12130,0.158 ,0.012 ,17.800 ,0.220 ,0.298 ,0.076 225 | 2016/1/23,渠道D,3194,104752,1385,815,20860,2167,0.111 ,0.013 ,15.060 ,0.200 ,0.211 ,0.070 226 | 2016/1/23,渠道E,3118,85657,1208,783,18884,2511,0.101 ,0.014 ,15.630 ,0.220 ,0.253 ,0.081 227 | 2016/1/23,渠道J,6729,80997,924,598,15518,2824,0.083 ,0.011 ,16.790 ,0.190 ,0.249 ,0.061 228 | 2016/1/23,渠道G,21570,45418,206,160,3993,1991,0.021 ,0.005 ,19.380 ,0.090 ,0.267 ,0.061 229 | 2016/1/23,渠道F,13168,36583,381,201,5576,2047,0.030 ,0.010 ,14.640 ,0.150 ,0.320 ,0.075 230 | 2016/1/23,渠道H,3173,12980,596,342,4988,1884,0.027 ,0.046 ,8.370 ,0.380 ,0.193 ,0.047 231 | 2016/1/23,渠道I,2316,7385,109,72,1964,889,0.010 ,0.015 ,18.020 ,0.270 ,0.339 ,0.077 232 | 2016/1/24,渠道A,45112,170421,2999,2228,52007,14376,0.285 ,0.018 ,17.340 ,0.310 ,0.268 ,0.084 233 | 2016/1/24,渠道B,42927,133916,1784,1432,30985,12815,0.170 ,0.013 ,17.370 ,0.230 ,0.270 ,0.070 234 | 2016/1/24,渠道C,28846,131464,2034,1520,33701,9767,0.185 ,0.016 ,16.570 ,0.260 ,0.295 ,0.111 235 | 2016/1/24,渠道D,2431,80855,1127,664,17270,1677,0.095 ,0.014 ,15.320 ,0.210 ,0.210 ,0.083 236 | 2016/1/24,渠道J,6404,70281,867,593,14792,3274,0.081 ,0.012 ,17.060 ,0.210 ,0.242 ,0.060 237 | 2016/1/24,渠道E,2578,69003,1059,677,15868,2444,0.087 ,0.015 ,14.980 ,0.230 ,0.269 ,0.100 238 | 2016/1/24,渠道G,21211,46530,213,182,3989,1792,0.022 ,0.005 ,18.730 ,0.090 ,0.250 ,0.060 239 | 2016/1/24,渠道F,12530,35601,404,226,6554,2245,0.036 ,0.011 ,16.220 ,0.180 ,0.314 ,0.078 240 | 2016/1/24,渠道H,3078,12907,611,361,5380,1998,0.030 ,0.047 ,8.810 ,0.420 ,0.191 ,0.050 241 | 2016/1/24,渠道I,2241,7319,122,94,1717,728,0.009 ,0.017 ,14.070 ,0.230 ,0.314 ,0.068 242 | 2016/1/25,渠道A,41615,161641,2975,2165,55586,16017,0.294 ,0.018 ,18.680 ,0.340 ,0.280 ,0.083 243 | 2016/1/25,渠道B,45040,135356,1953,1574,35001,14225,0.185 ,0.014 ,17.920 ,0.260 ,0.268 ,0.061 244 | 2016/1/25,渠道C,25654,121155,1978,1472,32377,9359,0.171 ,0.016 ,16.370 ,0.270 ,0.313 ,0.105 245 | 2016/1/25,渠道D,1800,65391,973,552,15650,2383,0.083 ,0.015 ,16.080 ,0.240 ,0.233 ,0.084 246 | 2016/1/25,渠道J,5607,61427,794,519,13478,2900,0.071 ,0.013 ,16.980 ,0.220 ,0.263 ,0.058 247 | 2016/1/25,渠道E,2443,59421,930,583,15694,2902,0.083 ,0.016 ,16.880 ,0.260 ,0.287 ,0.082 248 | 2016/1/25,渠道G,19755,45215,238,196,5150,2342,0.027 ,0.005 ,21.640 ,0.110 ,0.265 ,0.058 249 | 2016/1/25,渠道F,10604,33424,388,225,7541,2076,0.040 ,0.012 ,19.440 ,0.230 ,0.326 ,0.075 250 | 2016/1/25,渠道H,2673,11775,571,313,6827,2843,0.036 ,0.049 ,11.960 ,0.580 ,0.185 ,0.052 251 | 2016/1/25,渠道I,2052,6898,97,80,1758,787,0.009 ,0.014 ,18.120 ,0.250 ,0.301 ,0.063 252 | 2016/1/26,渠道A,42179,162425,3121,2287,64180,17929,0.296 ,0.019 ,20.560 ,0.400 ,0.283 , 253 | 2016/1/26,渠道B,45734,138422,1971,1548,40683,15710,0.188 ,0.014 ,20.640 ,0.290 ,0.260 , 254 | 2016/1/26,渠道C,25703,121441,1999,1483,38078,11967,0.176 ,0.017 ,19.050 ,0.310 ,0.315 , 255 | 2016/1/26,渠道D,1493,58599,841,470,15550,2246,0.072 ,0.014 ,18.490 ,0.270 ,0.232 , 256 | 2016/1/26,渠道J,5314,57904,776,515,14325,3693,0.066 ,0.013 ,18.460 ,0.250 ,0.257 , 257 | 2016/1/26,渠道E,2023,54524,894,549,15212,2825,0.070 ,0.016 ,17.020 ,0.280 ,0.289 , 258 | 2016/1/26,渠道G,22440,49360,227,189,6670,3299,0.031 ,0.005 ,29.380 ,0.140 ,0.270 , 259 | 2016/1/26,渠道F,10937,33903,457,239,11897,3043,0.055 ,0.014 ,26.030 ,0.350 ,0.329 , 260 | 2016/1/26,渠道H,2948,12118,633,374,8056,2763,0.037 ,0.052 ,12.730 ,0.660 ,0.192 , 261 | 2016/1/26,渠道I,2274,7245,115,90,2159,680,0.010 ,0.016 ,18.770 ,0.300 ,0.328 , 262 | 2016/1/27,渠道A,44970,169151,3057,2258,63473,18486,0.292 ,0.018 ,20.760 ,0.380 ,0.279 , 263 | 2016/1/27,渠道B,48151,144355,2120,1700,42610,17699,0.196 ,0.015 ,20.100 ,0.300 ,0.270 , 264 | 2016/1/27,渠道C,27226,125994,2015,1448,36386,11336,0.167 ,0.016 ,18.060 ,0.290 ,0.316 , 265 | 2016/1/27,渠道D,1529,56127,846,484,15349,2109,0.071 ,0.015 ,18.140 ,0.270 ,0.224 , 266 | 2016/1/27,渠道J,5751,56099,814,558,15505,3727,0.071 ,0.015 ,19.050 ,0.280 ,0.256 , 267 | 2016/1/27,渠道G,23918,52717,243,202,6279,3727,0.029 ,0.005 ,25.840 ,0.120 ,0.270 , 268 | 2016/1/27,渠道E,2127,52057,894,562,16352,2844,0.075 ,0.017 ,18.290 ,0.310 ,0.281 , 269 | 2016/1/27,渠道F,11901,35824,446,234,10423,3167,0.048 ,0.012 ,23.370 ,0.290 ,0.323 , 270 | 2016/1/27,渠道H,3151,12518,656,383,8962,4157,0.041 ,0.052 ,13.660 ,0.720 ,0.195 , 271 | 2016/1/27,渠道I,2737,8021,111,83,2184,881,0.010 ,0.014 ,19.680 ,0.270 ,0.328 , 272 | 2016/1/28,渠道A,46469,174425,3243,2379,67454,18732,0.281 ,0.019 ,20.800 ,0.390 ,0.276 , 273 | 2016/1/28,渠道B,53344,154545,2330,1880,47073,21979,0.196 ,0.015 ,20.200 ,0.300 ,0.272 , 274 | 2016/1/28,渠道C,30939,134360,2255,1645,42213,13234,0.176 ,0.017 ,18.720 ,0.310 ,0.316 , 275 | 2016/1/28,渠道D,1537,55881,1023,594,20688,3343,0.086 ,0.018 ,20.220 ,0.370 ,0.232 , 276 | 2016/1/28,渠道J,6343,55766,940,629,16041,3606,0.067 ,0.017 ,17.070 ,0.290 ,0.260 , 277 | 2016/1/28,渠道G,22232,52939,269,227,7490,3684,0.031 ,0.005 ,27.840 ,0.140 ,0.263 , 278 | 2016/1/28,渠道E,2141,49927,957,580,16284,2793,0.068 ,0.019 ,17.020 ,0.330 ,0.291 , 279 | 2016/1/28,渠道F,12652,37763,472,273,10804,3503,0.045 ,0.013 ,22.890 ,0.290 ,0.323 , 280 | 2016/1/28,渠道H,3691,13574,652,388,8795,3672,0.037 ,0.048 ,13.490 ,0.650 ,0.184 , 281 | 2016/1/28,渠道I,3591,9173,161,131,3253,1977,0.014 ,0.018 ,20.200 ,0.350 ,0.341 , 282 | 2016/1/29,渠道A,51694,185782,3379,2490,59773,18839,0.304 ,0.018 ,17.690 ,0.320 ,0.268 , 283 | 2016/1/29,渠道B,57711,163513,2341,1876,40878,18016,0.208 ,0.014 ,17.460 ,0.250 ,0.279 , 284 | 2016/1/29,渠道C,31010,137419,2073,1509,33178,9739,0.168 ,0.015 ,16.000 ,0.240 ,0.320 , 285 | 2016/1/29,渠道J,6677,54824,851,558,12830,2907,0.065 ,0.016 ,15.080 ,0.230 ,0.270 , 286 | 2016/1/29,渠道D,1420,54452,945,538,14304,1890,0.073 ,0.017 ,15.140 ,0.260 ,0.242 , 287 | 2016/1/29,渠道G,22470,54149,220,175,4418,1874,0.022 ,0.004 ,20.080 ,0.080 ,0.271 , 288 | 2016/1/29,渠道E,2013,49355,895,547,12795,2335,0.065 ,0.018 ,14.300 ,0.260 ,0.286 , 289 | 2016/1/29,渠道F,12422,38215,469,269,8298,2219,0.042 ,0.012 ,17.690 ,0.220 ,0.327 , 290 | 2016/1/29,渠道H,4275,14509,736,441,7429,2782,0.038 ,0.051 ,10.090 ,0.510 ,0.193 , 291 | 2016/1/29,渠道I,3888,10156,173,147,3021,1628,0.015 ,0.017 ,17.460 ,0.300 ,0.338 , 292 | 2016/1/30,渠道A,49946,184474,4220,3180,86744,23966,0.293 ,0.023 ,20.560 ,0.470 ,0.268 , 293 | 2016/1/30,渠道B,56824,165318,2907,2377,59276,24445,0.200 ,0.018 ,20.390 ,0.360 ,0.273 , 294 | 2016/1/30,渠道C,33858,145662,2993,2291,53606,17887,0.181 ,0.021 ,17.910 ,0.370 ,0.310 , 295 | 2016/1/30,渠道G,22152,54520,611,557,14744,7375,0.050 ,0.011 ,24.130 ,0.270 ,0.264 , 296 | 2016/1/30,渠道J,6943,54250,1060,705,18596,4392,0.063 ,0.020 ,17.540 ,0.340 ,0.262 , 297 | 2016/1/30,渠道D,1484,52450,1100,630,18816,2532,0.064 ,0.021 ,17.110 ,0.360 ,0.249 , 298 | 2016/1/30,渠道E,1937,47162,964,557,16854,2886,0.057 ,0.020 ,17.480 ,0.360 ,0.290 , 299 | 2016/1/30,渠道F,12714,39367,534,307,11209,3125,0.038 ,0.014 ,20.990 ,0.280 ,0.323 , 300 | 2016/1/30,渠道H,4846,15633,872,517,9011,3665,0.030 ,0.056 ,10.330 ,0.580 ,0.190 , 301 | 2016/1/30,渠道I,4064,10823,337,291,7334,3117,0.025 ,0.031 ,21.760 ,0.680 ,0.331 , 302 | 2016/1/31,渠道A,49438,185460,4162,3111,86605,25475,0.287 ,0.022 ,20.810 ,0.470 ,0.263 , 303 | 2016/1/31,渠道B,57033,168643,2951,2374,58118,23407,0.193 ,0.018 ,19.690 ,0.340 ,0.268 , 304 | 2016/1/31,渠道C,35230,150052,3006,2277,54698,17355,0.182 ,0.020 ,18.200 ,0.360 ,0.304 , 305 | 2016/1/31,渠道G,23688,56643,756,657,17704,7336,0.059 ,0.013 ,23.420 ,0.310 ,0.256 , 306 | 2016/1/31,渠道J,5641,51851,1037,640,19529,3921,0.065 ,0.020 ,18.830 ,0.380 ,0.267 , 307 | 2016/1/31,渠道D,1462,50735,1113,608,18381,2852,0.061 ,0.022 ,16.520 ,0.360 ,0.230 , 308 | 2016/1/31,渠道E,2058,45875,962,585,17498,3751,0.058 ,0.021 ,18.190 ,0.380 ,0.287 , 309 | 2016/1/31,渠道F,13292,40680,539,306,11940,3079,0.040 ,0.013 ,22.150 ,0.290 ,0.322 , 310 | 2016/1/31,渠道H,4881,16316,908,522,10426,3788,0.035 ,0.056 ,11.480 ,0.640 ,0.194 , 311 | 2016/1/31,渠道I,4222,11518,346,274,6338,2392,0.021 ,0.030 ,18.320 ,0.550 ,0.296 , 312 | -------------------------------------------------------------------------------- /data/第10章/渠道用户LTV统计.csv: -------------------------------------------------------------------------------- 1 | 日期,渠道名称,新增用户,LTV-1,LTV-2,LTV-3,LTV-4,LTV-5,LTV-6,LTV-7,LTV-14,LTV-30 2 | 2016/1/1,渠道A,42694,0.36,0.49,0.56,0.59,0.62,0.64,0.65,0.76,0.96 3 | 2016/1/1,渠道B,69525,0.26,0.33,0.36,0.38,0.39,0.4,0.4,0.49,0.58 4 | 2016/1/1,渠道C,29349,0.51,0.65,0.7,0.72,0.74,0.76,0.76,0.85,1.01 5 | 2016/1/1,渠道D,39861,0.62,0.8,0.9,0.92,0.95,0.97,0.98,1.08,1.28 6 | 2016/1/1,渠道E,44578,0.5,0.67,0.73,0.76,0.78,0.8,0.81,0.93,1.15 7 | 2016/1/1,渠道F,9588,0.24,0.39,0.42,0.43,0.46,0.48,0.49,0.57,0.73 8 | 2016/1/1,渠道G,30431,0.14,0.18,0.21,0.21,0.22,0.22,0.23,0.24,0.27 9 | 2016/1/1,渠道H,3491,0.75,0.8,0.86,0.86,0.87,0.89,0.92,1.01,1.24 10 | 2016/1/1,渠道I,1535,0.62,0.71,0.73,0.75,0.8,0.82,0.87,0.91,1.09 11 | 2016/1/1,渠道J,74646,0.37,0.5,0.55,0.57,0.58,0.59,0.6,0.66,0.76 12 | 2016/1/2,渠道A,37444,0.42,0.53,0.57,0.6,0.62,0.65,0.67,0.78,0.97 13 | 2016/1/2,渠道B,58070,0.28,0.34,0.35,0.37,0.39,0.4,0.41,0.46,0.55 14 | 2016/1/2,渠道C,25989,0.47,0.59,0.62,0.64,0.66,0.67,0.69,0.78,0.94 15 | 2016/1/2,渠道D,36968,0.56,0.72,0.77,0.81,0.84,0.86,0.88,0.99,1.2 16 | 2016/1/2,渠道E,41902,0.44,0.58,0.61,0.65,0.68,0.7,0.72,0.84,1.06 17 | 2016/1/2,渠道F,8952,0.3,0.37,0.4,0.42,0.44,0.45,0.48,0.56,0.69 18 | 2016/1/2,渠道G,23481,0.13,0.17,0.19,0.19,0.2,0.2,0.2,0.22,0.27 19 | 2016/1/2,渠道H,3136,0.77,0.88,0.91,0.92,0.94,0.96,1,1.05,1.19 20 | 2016/1/2,渠道I,1377,0.56,0.74,0.77,0.79,0.8,0.8,0.81,0.91,1.15 21 | 2016/1/2,渠道J,61856,0.33,0.42,0.44,0.46,0.48,0.49,0.51,0.56,0.68 22 | 2016/1/3,渠道A,29701,0.34,0.41,0.47,0.51,0.55,0.58,0.62,0.72,0.98 23 | 2016/1/3,渠道B,44912,0.28,0.32,0.35,0.37,0.38,0.4,0.41,0.47,0.58 24 | 2016/1/3,渠道C,20318,0.35,0.4,0.43,0.46,0.48,0.5,0.54,0.64,0.79 25 | 2016/1/3,渠道D,29294,0.57,0.65,0.69,0.73,0.76,0.79,0.81,0.93,1.17 26 | 2016/1/3,渠道E,32304,0.41,0.49,0.54,0.57,0.6,0.63,0.67,0.79,1.05 27 | 2016/1/3,渠道F,7051,0.26,0.32,0.35,0.37,0.38,0.41,0.41,0.46,0.61 28 | 2016/1/3,渠道G,17788,0.12,0.16,0.18,0.19,0.2,0.2,0.21,0.22,0.28 29 | 2016/1/3,渠道H,2481,0.54,0.59,0.62,0.64,0.67,0.68,0.71,0.92,1.02 30 | 2016/1/3,渠道I,1155,0.66,0.66,0.67,0.69,0.74,0.75,0.78,0.86,1.05 31 | 2016/1/3,渠道J,46071,0.28,0.33,0.36,0.39,0.41,0.42,0.45,0.51,0.63 32 | 2016/1/4,渠道A,17116,0.32,0.45,0.51,0.54,0.56,0.61,0.64,0.79,1.07 33 | 2016/1/4,渠道B,23040,0.27,0.34,0.38,0.41,0.43,0.45,0.48,0.54,0.63 34 | 2016/1/4,渠道C,11321,0.26,0.34,0.38,0.42,0.44,0.47,0.49,0.59,0.79 35 | 2016/1/4,渠道D,14707,0.5,0.61,0.67,0.71,0.74,0.77,0.78,0.93,1.19 36 | 2016/1/4,渠道E,17624,0.37,0.46,0.54,0.6,0.64,0.67,0.7,0.86,1.16 37 | 2016/1/4,渠道F,2815,0.3,0.39,0.43,0.5,0.52,0.57,0.62,0.71,0.96 38 | 2016/1/4,渠道G,7717,0.11,0.15,0.16,0.17,0.17,0.17,0.17,0.21,0.28 39 | 2016/1/4,渠道H,1369,1.03,1.1,1.19,1.19,1.2,1.22,1.23,1.31,1.44 40 | 2016/1/4,渠道I,622,0.54,0.76,0.87,0.9,0.91,0.93,1.04,1.09,1.34 41 | 2016/1/4,渠道J,20804,0.28,0.37,0.42,0.46,0.47,0.5,0.53,0.62,0.82 42 | 2016/1/5,渠道A,17261,0.3,0.39,0.46,0.51,0.56,0.59,0.6,0.76,1.08 43 | 2016/1/5,渠道B,22767,0.28,0.35,0.38,0.41,0.43,0.45,0.46,0.52,0.67 44 | 2016/1/5,渠道C,12260,0.24,0.3,0.34,0.38,0.42,0.44,0.45,0.53,0.75 45 | 2016/1/5,渠道D,14525,0.48,0.58,0.64,0.68,0.71,0.73,0.77,0.88,1.13 46 | 2016/1/5,渠道E,17664,0.33,0.44,0.5,0.56,0.6,0.63,0.65,0.8,1.11 47 | 2016/1/5,渠道F,2883,0.29,0.4,0.46,0.47,0.48,0.52,0.53,0.65,0.87 48 | 2016/1/5,渠道G,6577,0.1,0.15,0.15,0.15,0.16,0.16,0.16,0.18,0.23 49 | 2016/1/5,渠道H,1417,0.67,0.93,0.94,0.94,0.96,0.98,0.99,1.06,1.37 50 | 2016/1/5,渠道I,672,0.51,0.65,0.72,0.77,0.77,0.81,0.81,1.01,1.26 51 | 2016/1/5,渠道J,22926,0.31,0.39,0.44,0.48,0.52,0.54,0.56,0.65,0.82 52 | 2016/1/6,渠道A,17893,0.28,0.38,0.44,0.48,0.52,0.54,0.56,0.66,0.99 53 | 2016/1/6,渠道B,22614,0.29,0.36,0.41,0.43,0.46,0.48,0.49,0.56,0.71 54 | 2016/1/6,渠道C,12332,0.26,0.35,0.41,0.46,0.49,0.5,0.52,0.62,0.85 55 | 2016/1/6,渠道D,14776,0.4,0.49,0.55,0.59,0.63,0.65,0.68,0.8,1.04 56 | 2016/1/6,渠道E,17741,0.38,0.46,0.51,0.55,0.59,0.6,0.62,0.72,1.01 57 | 2016/1/6,渠道F,2888,0.26,0.28,0.31,0.35,0.38,0.4,0.43,0.53,0.76 58 | 2016/1/6,渠道G,6809,0.07,0.08,0.09,0.1,0.11,0.11,0.11,0.16,0.19 59 | 2016/1/6,渠道H,1348,0.75,0.91,0.96,0.99,1.03,1.11,1.12,1.22,1.49 60 | 2016/1/6,渠道I,748,0.24,0.42,0.44,0.5,0.53,0.65,0.77,0.95,1.34 61 | 2016/1/6,渠道J,20768,0.35,0.43,0.49,0.53,0.56,0.58,0.6,0.67,0.83 62 | 2016/1/7,渠道A,18893,0.26,0.34,0.42,0.45,0.46,0.48,0.51,0.63,0.92 63 | 2016/1/7,渠道B,24623,0.26,0.32,0.36,0.4,0.42,0.43,0.44,0.5,0.66 64 | 2016/1/7,渠道C,12507,0.29,0.36,0.43,0.47,0.5,0.53,0.54,0.66,0.93 65 | 2016/1/7,渠道D,15091,0.39,0.46,0.53,0.6,0.63,0.64,0.67,0.8,1.06 66 | 2016/1/7,渠道E,18378,0.41,0.5,0.57,0.64,0.67,0.7,0.72,0.87,1.22 67 | 2016/1/7,渠道F,3084,0.14,0.21,0.24,0.25,0.26,0.27,0.28,0.35,0.52 68 | 2016/1/7,渠道G,7843,0.12,0.14,0.15,0.15,0.15,0.15,0.16,0.18,0.23 69 | 2016/1/7,渠道H,1394,0.97,1.09,1.19,1.23,1.27,1.3,1.31,1.43,1.83 70 | 2016/1/7,渠道I,906,0.28,0.33,0.36,0.39,0.41,0.43,0.45,0.6,0.77 71 | 2016/1/7,渠道J,22862,0.31,0.37,0.42,0.46,0.5,0.52,0.54,0.65,0.82 72 | 2016/1/8,渠道A,24102,0.27,0.37,0.43,0.46,0.48,0.5,0.52,0.63,0.91 73 | 2016/1/8,渠道B,33638,0.23,0.31,0.34,0.36,0.38,0.4,0.4,0.45,0.59 74 | 2016/1/8,渠道C,15474,0.22,0.33,0.38,0.42,0.44,0.46,0.48,0.59,0.87 75 | 2016/1/8,渠道D,18690,0.3,0.4,0.46,0.5,0.52,0.54,0.58,0.76,1.08 76 | 2016/1/8,渠道E,23647,0.36,0.49,0.56,0.58,0.6,0.62,0.63,0.74,1 77 | 2016/1/8,渠道F,4237,0.18,0.24,0.28,0.29,0.31,0.32,0.34,0.45,0.57 78 | 2016/1/8,渠道G,9432,0.05,0.07,0.08,0.09,0.09,0.09,0.09,0.11,0.13 79 | 2016/1/8,渠道H,1789,0.78,0.97,1.01,1.09,1.13,1.13,1.15,1.29,1.41 80 | 2016/1/8,渠道I,997,0.34,0.47,0.6,0.66,0.71,0.71,0.73,0.82,1.03 81 | 2016/1/8,渠道J,36919,0.28,0.37,0.42,0.44,0.46,0.47,0.48,0.55,0.71 82 | 2016/1/9,渠道A,35971,0.31,0.41,0.44,0.47,0.49,0.51,0.52,0.63,0.94 83 | 2016/1/9,渠道B,54829,0.25,0.3,0.33,0.34,0.35,0.36,0.37,0.43,0.58 84 | 2016/1/9,渠道C,23331,0.33,0.41,0.43,0.46,0.47,0.49,0.51,0.65,0.87 85 | 2016/1/9,渠道D,28523,0.37,0.49,0.53,0.57,0.6,0.62,0.65,0.76,1.04 86 | 2016/1/9,渠道E,32718,0.43,0.53,0.57,0.6,0.63,0.65,0.68,0.83,1.14 87 | 2016/1/9,渠道F,7282,0.2,0.27,0.31,0.35,0.36,0.37,0.4,0.52,0.65 88 | 2016/1/9,渠道G,15624,0.06,0.06,0.06,0.07,0.07,0.07,0.08,0.1,0.17 89 | 2016/1/9,渠道H,2741,0.72,0.77,0.79,0.82,0.87,0.95,0.97,1.12,1.25 90 | 2016/1/9,渠道I,1191,0.5,0.55,0.58,0.59,0.62,0.62,0.64,0.67,0.87 91 | 2016/1/9,渠道J,51602,0.27,0.34,0.36,0.38,0.39,0.4,0.42,0.48,0.63 92 | 2016/1/10,渠道A,30557,0.3,0.39,0.43,0.46,0.48,0.51,0.54,0.67,1.01 93 | 2016/1/10,渠道B,46504,0.24,0.28,0.3,0.32,0.34,0.35,0.37,0.44,0.57 94 | 2016/1/10,渠道C,20752,0.29,0.34,0.38,0.4,0.41,0.44,0.48,0.59,0.82 95 | 2016/1/10,渠道D,25727,0.38,0.45,0.5,0.53,0.56,0.57,0.61,0.73,1.06 96 | 2016/1/10,渠道E,30182,0.43,0.52,0.56,0.59,0.63,0.66,0.69,0.82,1.17 97 | 2016/1/10,渠道F,6163,0.16,0.22,0.25,0.27,0.3,0.33,0.38,0.51,0.72 98 | 2016/1/10,渠道G,13567,0.03,0.04,0.04,0.05,0.05,0.06,0.07,0.09,0.15 99 | 2016/1/10,渠道H,2496,0.75,0.83,0.86,0.89,0.91,0.93,0.97,1.1,1.33 100 | 2016/1/10,渠道I,1074,0.63,0.67,0.69,0.71,0.74,0.76,0.76,0.88,1.19 101 | 2016/1/10,渠道J,44790,0.29,0.34,0.37,0.4,0.42,0.44,0.46,0.54,0.71 102 | 2016/1/11,渠道A,19195,0.3,0.39,0.43,0.47,0.5,0.54,0.56,0.72,1.09 103 | 2016/1/11,渠道B,27472,0.29,0.36,0.39,0.42,0.43,0.45,0.47,0.53,0.7 104 | 2016/1/11,渠道C,12234,0.23,0.31,0.37,0.41,0.44,0.46,0.48,0.61,0.94 105 | 2016/1/11,渠道D,15926,0.41,0.49,0.55,0.58,0.63,0.65,0.68,0.83,1.18 106 | 2016/1/11,渠道E,18541,0.39,0.48,0.52,0.57,0.6,0.63,0.65,0.79,1.16 107 | 2016/1/11,渠道F,3093,0.18,0.24,0.28,0.31,0.38,0.39,0.41,0.48,0.6 108 | 2016/1/11,渠道G,6919,0.07,0.1,0.1,0.1,0.1,0.1,0.1,0.12,0.29 109 | 2016/1/11,渠道H,1539,1.05,1.18,1.3,1.44,1.47,1.48,1.53,1.78,2.07 110 | 2016/1/11,渠道I,609,0.82,1.13,1.2,1.37,1.41,1.5,1.6,1.9,2.36 111 | 2016/1/11,渠道J,23897,0.33,0.4,0.46,0.5,0.52,0.55,0.58,0.67,0.89 112 | 2016/1/12,渠道A,18667,0.35,0.43,0.49,0.53,0.58,0.61,0.64,0.81,1.2 113 | 2016/1/12,渠道B,24538,0.26,0.32,0.36,0.38,0.4,0.42,0.43,0.53,0.7 114 | 2016/1/12,渠道C,12027,0.28,0.36,0.41,0.44,0.47,0.51,0.54,0.65,0.92 115 | 2016/1/12,渠道D,16018,0.33,0.42,0.48,0.51,0.56,0.59,0.6,0.78,1.12 116 | 2016/1/12,渠道E,17631,0.41,0.5,0.55,0.58,0.63,0.67,0.69,0.88,1.27 117 | 2016/1/12,渠道F,3309,0.19,0.32,0.37,0.42,0.48,0.52,0.53,0.58,0.9 118 | 2016/1/12,渠道G,8201,0.08,0.1,0.11,0.11,0.12,0.13,0.14,0.16,0.23 119 | 2016/1/12,渠道H,1528,0.94,1.1,1.19,1.23,1.27,1.3,1.34,1.41,1.67 120 | 2016/1/12,渠道I,551,0.33,0.36,0.37,0.4,0.46,0.5,0.55,0.7,0.9 121 | 2016/1/12,渠道J,26614,0.3,0.37,0.41,0.45,0.48,0.5,0.51,0.6,0.81 122 | 2016/1/13,渠道A,17313,0.27,0.37,0.44,0.5,0.54,0.57,0.58,0.73,1.09 123 | 2016/1/13,渠道B,22428,0.28,0.32,0.36,0.39,0.42,0.43,0.44,0.54,0.76 124 | 2016/1/13,渠道C,11627,0.24,0.31,0.33,0.37,0.41,0.43,0.47,0.62,0.94 125 | 2016/1/13,渠道D,15382,0.27,0.39,0.43,0.47,0.52,0.55,0.57,0.7,1.11 126 | 2016/1/13,渠道E,16699,0.37,0.46,0.53,0.59,0.63,0.66,0.69,0.9,1.31 127 | 2016/1/13,渠道F,3545,0.26,0.36,0.45,0.5,0.56,0.59,0.62,0.81,1.09 128 | 2016/1/13,渠道G,10580,0.07,0.08,0.09,0.1,0.12,0.12,0.13,0.17,0.23 129 | 2016/1/13,渠道H,1510,0.99,1.05,1.11,1.13,1.26,1.28,1.33,1.45,1.61 130 | 2016/1/13,渠道I,788,0.3,0.32,0.4,0.4,0.41,0.51,0.56,0.7,0.91 131 | 2016/1/13,渠道J,25433,0.28,0.35,0.4,0.43,0.46,0.47,0.48,0.55,0.79 132 | 2016/1/14,渠道A,18686,0.32,0.42,0.49,0.54,0.57,0.59,0.61,0.81,1.15 133 | 2016/1/14,渠道B,23294,0.3,0.36,0.4,0.42,0.44,0.47,0.48,0.57,0.8 134 | 2016/1/14,渠道C,12172,0.33,0.4,0.45,0.49,0.52,0.54,0.56,0.75,1.06 135 | 2016/1/14,渠道D,16445,0.38,0.49,0.56,0.62,0.66,0.68,0.7,0.86,1.25 136 | 2016/1/14,渠道E,20535,0.36,0.47,0.54,0.59,0.61,0.63,0.65,0.83,1.24 137 | 2016/1/14,渠道F,3658,0.28,0.37,0.4,0.46,0.5,0.53,0.58,0.7,0.91 138 | 2016/1/14,渠道G,10167,0.06,0.07,0.09,0.11,0.12,0.13,0.13,0.18,0.27 139 | 2016/1/14,渠道H,1657,0.85,0.98,1.03,1.1,1.14,1.21,1.22,1.46,1.74 140 | 2016/1/14,渠道I,842,0.22,0.41,0.48,0.55,0.57,0.57,0.58,0.91,1.53 141 | 2016/1/14,渠道J,28299,0.26,0.36,0.42,0.45,0.47,0.49,0.5,0.62,0.83 142 | 2016/1/15,渠道A,22303,0.27,0.38,0.46,0.5,0.53,0.55,0.58,0.83,1.19 143 | 2016/1/15,渠道B,28348,0.3,0.38,0.42,0.44,0.45,0.47,0.49,0.58,0.75 144 | 2016/1/15,渠道C,15752,0.29,0.38,0.46,0.49,0.5,0.53,0.55,0.72,0.98 145 | 2016/1/15,渠道D,19266,0.4,0.51,0.58,0.62,0.64,0.66,0.69,0.86,1.26 146 | 2016/1/15,渠道E,23831,0.34,0.46,0.55,0.58,0.6,0.63,0.67,0.82,1.22 147 | 2016/1/15,渠道F,6265,0.24,0.32,0.38,0.4,0.42,0.44,0.48,0.65,0.85 148 | 2016/1/15,渠道G,13190,0.08,0.11,0.11,0.12,0.12,0.13,0.13,0.14,0.24 149 | 2016/1/15,渠道H,1933,0.81,0.89,1,1.08,1.08,1.12,1.14,1.39,1.75 150 | 2016/1/15,渠道I,990,0.36,0.54,0.6,0.62,0.63,0.65,0.67,0.79,1.08 151 | 2016/1/15,渠道J,39107,0.28,0.36,0.41,0.43,0.45,0.47,0.48,0.59,0.8 152 | 2016/1/16,渠道A,31336,0.35,0.44,0.48,0.51,0.53,0.56,0.58,0.77,1.09 153 | 2016/1/16,渠道B,42155,0.28,0.35,0.37,0.38,0.39,0.4,0.42,0.51,0.7 154 | 2016/1/16,渠道C,22157,0.33,0.43,0.45,0.48,0.5,0.51,0.53,0.69,0.99 155 | 2016/1/16,渠道D,28424,0.42,0.51,0.55,0.6,0.62,0.64,0.67,0.81,1.22 156 | 2016/1/16,渠道E,30373,0.42,0.51,0.55,0.58,0.63,0.67,0.7,0.87,1.31 157 | 2016/1/16,渠道F,12463,0.23,0.3,0.31,0.33,0.37,0.39,0.4,0.47,0.59 158 | 2016/1/16,渠道G,19556,0.08,0.1,0.11,0.11,0.12,0.12,0.12,0.15,0.24 159 | 2016/1/16,渠道H,2800,0.78,0.96,1,1.01,1.05,1.06,1.08,1.25,1.47 160 | 2016/1/16,渠道I,1285,0.44,0.52,0.53,0.55,0.57,0.58,0.6,0.73,1.29 161 | 2016/1/16,渠道J,51704,0.28,0.37,0.39,0.41,0.43,0.45,0.47,0.56,0.8 162 | 2016/1/17,渠道A,29225,0.34,0.42,0.46,0.49,0.53,0.57,0.6,0.81,1.2 163 | 2016/1/17,渠道B,37394,0.28,0.34,0.38,0.4,0.41,0.42,0.45,0.55,0.72 164 | 2016/1/17,渠道C,19614,0.29,0.35,0.38,0.42,0.46,0.5,0.52,0.69,1 165 | 2016/1/17,渠道D,26306,0.46,0.53,0.58,0.61,0.64,0.67,0.7,0.89,1.31 166 | 2016/1/17,渠道E,27466,0.42,0.49,0.54,0.6,0.64,0.67,0.7,0.9,1.34 167 | 2016/1/17,渠道F,12274,0.17,0.2,0.22,0.23,0.25,0.25,0.26,0.33,0.45 168 | 2016/1/17,渠道G,16849,0.09,0.1,0.11,0.12,0.12,0.13,0.13,0.16,0.25 169 | 2016/1/17,渠道H,2711,0.66,0.71,0.76,0.79,0.82,0.85,0.9,1.04,1.2 170 | 2016/1/17,渠道I,1141,0.39,0.53,0.57,0.61,0.61,0.64,0.69,0.83,1.43 171 | 2016/1/17,渠道J,46058,0.31,0.37,0.39,0.41,0.44,0.45,0.47,0.57,0.76 172 | 2016/1/18,渠道A,20331,0.26,0.35,0.42,0.49,0.52,0.56,0.59,0.83,1.24 173 | 2016/1/18,渠道B,25277,0.25,0.32,0.35,0.4,0.42,0.43,0.46,0.6,0.81 174 | 2016/1/18,渠道C,12527,0.22,0.27,0.33,0.37,0.4,0.44,0.47,0.62,0.97 175 | 2016/1/18,渠道D,17752,0.34,0.42,0.5,0.56,0.59,0.62,0.65,0.87,1.26 176 | 2016/1/18,渠道E,19288,0.43,0.51,0.57,0.64,0.68,0.72,0.75,0.96,1.37 177 | 2016/1/18,渠道F,7265,0.13,0.14,0.16,0.2,0.22,0.23,0.25,0.32,0.45 178 | 2016/1/18,渠道G,11119,0.06,0.09,0.1,0.11,0.12,0.13,0.13,0.17,0.3 179 | 2016/1/18,渠道H,1887,0.66,0.78,0.82,0.89,0.98,1.01,1.07,1.21,1.49 180 | 2016/1/18,渠道I,870,0.25,0.32,0.36,0.39,0.52,0.53,0.55,0.67,1.22 181 | 2016/1/18,渠道J,28351,0.29,0.34,0.38,0.41,0.42,0.44,0.46,0.62,0.83 182 | 2016/1/19,渠道A,23139,0.29,0.38,0.45,0.5,0.54,0.58,0.62,0.86,1.25 183 | 2016/1/19,渠道B,27059,0.25,0.32,0.37,0.41,0.44,0.45,0.47,0.6,0.82 184 | 2016/1/19,渠道C,13940,0.25,0.33,0.37,0.41,0.46,0.49,0.51,0.69,0.96 185 | 2016/1/19,渠道D,19596,0.35,0.46,0.52,0.56,0.6,0.65,0.67,0.88,1.28 186 | 2016/1/19,渠道E,20734,0.34,0.43,0.5,0.54,0.59,0.62,0.65,0.86,1.29 187 | 2016/1/19,渠道F,7564,0.14,0.21,0.25,0.27,0.31,0.32,0.33,0.48,0.64 188 | 2016/1/19,渠道G,11942,0.08,0.09,0.11,0.12,0.13,0.14,0.15,0.2,0.34 189 | 2016/1/19,渠道H,2028,0.76,0.86,0.93,0.97,0.99,1.01,1.08,1.4,1.58 190 | 2016/1/19,渠道I,922,0.3,0.42,0.48,0.49,0.51,0.57,0.57,0.8,1.08 191 | 2016/1/19,渠道J,38740,0.26,0.33,0.38,0.42,0.44,0.47,0.5,0.62,0.87 192 | 2016/1/20,渠道A,25895,0.28,0.4,0.47,0.54,0.59,0.64,0.67,0.9,1.23 193 | 2016/1/20,渠道B,32108,0.3,0.36,0.41,0.45,0.47,0.5,0.51,0.64,0.86 194 | 2016/1/20,渠道C,16949,0.31,0.41,0.47,0.51,0.54,0.57,0.6,0.79,1.07 195 | 2016/1/20,渠道D,23164,0.37,0.47,0.53,0.57,0.61,0.65,0.69,0.94,1.3 196 | 2016/1/20,渠道E,22953,0.39,0.51,0.58,0.64,0.69,0.73,0.76,0.97,1.37 197 | 2016/1/20,渠道F,9269,0.15,0.2,0.22,0.25,0.27,0.29,0.34,0.45,0.59 198 | 2016/1/20,渠道G,13425,0.1,0.12,0.13,0.15,0.15,0.16,0.18,0.25,0.35 199 | 2016/1/20,渠道H,2352,0.65,0.76,0.81,0.87,0.89,0.9,0.92,1.18,1.35 200 | 2016/1/20,渠道I,974,0.12,0.14,0.15,0.15,0.19,0.19,0.22,0.41,0.64 201 | 2016/1/20,渠道J,42642,0.29,0.4,0.44,0.48,0.51,0.54,0.56,0.71,0.97 202 | 2016/1/21,渠道A,31484,0.32,0.42,0.49,0.54,0.59,0.65,0.7,0.92,1.24 203 | 2016/1/21,渠道B,35958,0.26,0.33,0.37,0.41,0.44,0.46,0.49,0.62,0.81 204 | 2016/1/21,渠道C,23204,0.31,0.41,0.47,0.52,0.55,0.6,0.63,0.81,1.1 205 | 2016/1/21,渠道D,26741,0.37,0.48,0.56,0.62,0.67,0.7,0.73,0.96,1.29 206 | 2016/1/21,渠道E,25518,0.4,0.51,0.56,0.61,0.65,0.7,0.74,0.95,1.35 207 | 2016/1/21,渠道F,11110,0.16,0.21,0.23,0.26,0.27,0.28,0.3,0.36,0.47 208 | 2016/1/21,渠道G,15078,0.09,0.1,0.12,0.12,0.13,0.15,0.15,0.22,0.36 209 | 2016/1/21,渠道H,2586,0.89,0.97,1.04,1.08,1.13,1.18,1.2,1.41,1.69 210 | 2016/1/21,渠道I,1107,0.35,0.44,0.52,0.53,0.55,0.56,0.6,0.7,1.04 211 | 2016/1/21,渠道J,44811,0.27,0.33,0.37,0.4,0.42,0.44,0.47,0.58,0.76 212 | 2016/1/22,渠道A,39369,0.29,0.4,0.47,0.51,0.57,0.62,0.66,0.83,1.12 213 | 2016/1/22,渠道B,42125,0.24,0.32,0.36,0.4,0.43,0.47,0.49,0.61,0.82 214 | 2016/1/22,渠道C,30979,0.3,0.4,0.47,0.52,0.56,0.59,0.62,0.8,1.08 215 | 2016/1/22,渠道D,18626,0.37,0.47,0.53,0.59,0.63,0.68,0.71,0.95,1.32 216 | 2016/1/22,渠道E,8472,0.63,0.74,0.81,0.87,0.92,0.96,1.04,1.34,1.7 217 | 2016/1/22,渠道F,12277,0.12,0.15,0.2,0.22,0.29,0.32,0.34,0.42,0.55 218 | 2016/1/22,渠道G,18295,0.07,0.1,0.12,0.13,0.13,0.14,0.15,0.23,0.34 219 | 2016/1/22,渠道H,2993,0.63,0.73,0.75,0.79,0.82,0.87,0.9,0.98,1.1 220 | 2016/1/22,渠道I,1993,0.29,0.39,0.46,0.46,0.49,0.5,0.52,0.74,1.02 221 | 2016/1/22,渠道J,8292,0.45,0.51,0.55,0.56,0.59,0.61,0.63,0.79,1 222 | 2016/1/23,渠道A,49382,0.33,0.43,0.5,0.55,0.59,0.63,0.66,0.86,1.16 223 | 2016/1/23,渠道B,45399,0.27,0.37,0.42,0.45,0.48,0.5,0.52,0.65,0.82 224 | 2016/1/23,渠道C,37779,0.32,0.42,0.48,0.53,0.56,0.6,0.63,0.81,1.09 225 | 2016/1/23,渠道D,3194,0.68,0.81,0.87,1,1.11,1.21,1.26,1.55,2.08 226 | 2016/1/23,渠道E,3118,0.81,0.9,1.06,1.11,1.23,1.27,1.32,1.68,2.36 227 | 2016/1/23,渠道F,13168,0.16,0.21,0.24,0.29,0.34,0.38,0.4,0.55,0.73 228 | 2016/1/23,渠道G,21570,0.09,0.12,0.14,0.16,0.17,0.18,0.19,0.29,0.4 229 | 2016/1/23,渠道H,3173,0.59,0.65,0.67,0.7,0.74,0.75,0.77,0.85,1.03 230 | 2016/1/23,渠道I,2316,0.38,0.51,0.62,0.63,0.66,0.67,0.68,0.82,0.98 231 | 2016/1/23,渠道J,6729,0.42,0.51,0.56,0.6,0.63,0.65,0.67,0.81,1.06 232 | 2016/1/24,渠道A,45112,0.32,0.42,0.5,0.56,0.6,0.63,0.68,0.84,1.1 233 | 2016/1/24,渠道B,42927,0.3,0.37,0.44,0.49,0.52,0.54,0.57,0.69,0.86 234 | 2016/1/24,渠道C,28846,0.34,0.45,0.53,0.57,0.6,0.62,0.65,0.78,1.03 235 | 2016/1/24,渠道D,2431,0.69,0.94,1.08,1.11,1.17,1.24,1.31,1.8,2.28 236 | 2016/1/24,渠道E,2578,0.95,1.08,1.14,1.24,1.3,1.31,1.33,1.8,2.35 237 | 2016/1/24,渠道F,12530,0.18,0.27,0.34,0.36,0.4,0.42,0.45,0.59,0.78 238 | 2016/1/24,渠道G,21211,0.08,0.12,0.14,0.16,0.17,0.17,0.19,0.27,0.38 239 | 2016/1/24,渠道H,3078,0.65,0.76,0.78,0.8,0.86,0.87,0.91,1.16,1.35 240 | 2016/1/24,渠道I,2241,0.32,0.45,0.52,0.54,0.56,0.57,0.59,0.71,0.81 241 | 2016/1/24,渠道J,6404,0.51,0.56,0.66,0.69,0.7,0.73,0.77,0.97,1.3 242 | 2016/1/25,渠道A,41615,0.38,0.51,0.57,0.61,0.64,0.69,0.73,0.89,1.15 243 | 2016/1/25,渠道B,45040,0.32,0.42,0.47,0.51,0.53,0.55,0.58,0.68,0.85 244 | 2016/1/25,渠道C,25654,0.36,0.49,0.57,0.62,0.65,0.7,0.75,0.92,1.17 245 | 2016/1/25,渠道D,1800,1.32,1.49,1.64,1.76,1.79,1.89,1.97,2.38,2.96 246 | 2016/1/25,渠道E,2443,1.19,1.33,1.4,1.42,1.48,1.53,1.62,1.83,2.34 247 | 2016/1/25,渠道F,10604,0.2,0.31,0.39,0.43,0.47,0.5,0.53,0.63,0.81 248 | 2016/1/25,渠道G,19755,0.12,0.14,0.15,0.16,0.17,0.19,0.21,0.28,0.4 249 | 2016/1/25,渠道H,2673,1.06,1.25,1.42,1.45,1.48,1.52,1.53,1.7,2.08 250 | 2016/1/25,渠道I,2052,0.38,0.62,0.64,0.71,0.72,0.77,0.79,1,1.19 251 | 2016/1/25,渠道J,5607,0.52,0.59,0.63,0.68,0.7,0.71,0.75,0.84,1.14 252 | 2016/1/26,渠道A,42179,0.43,0.54,0.62,0.66,0.71,0.76,0.8,0.96,1.21 253 | 2016/1/26,渠道B,45734,0.34,0.42,0.48,0.51,0.53,0.56,0.58,0.7,0.84 254 | 2016/1/26,渠道C,25703,0.47,0.59,0.67,0.72,0.76,0.81,0.84,0.99,1.24 255 | 2016/1/26,渠道D,1493,1.5,1.57,1.64,1.71,1.79,1.94,2.01,2.31,2.96 256 | 2016/1/26,渠道E,2023,1.4,1.52,1.78,1.84,1.88,1.95,2,2.34,2.76 257 | 2016/1/26,渠道F,10937,0.28,0.34,0.38,0.4,0.42,0.47,0.49,0.63,0.8 258 | 2016/1/26,渠道G,22440,0.15,0.17,0.19,0.19,0.22,0.23,0.25,0.34,0.45 259 | 2016/1/26,渠道H,2948,0.94,1.08,1.18,1.24,1.32,1.39,1.43,1.62,1.91 260 | 2016/1/26,渠道I,2274,0.3,0.47,0.49,0.53,0.57,0.58,0.6,0.72,0.98 261 | 2016/1/26,渠道J,5314,0.69,0.77,0.82,0.84,0.9,0.93,0.96,1.13,1.42 262 | 2016/1/27,渠道A,44970,0.41,0.54,0.61,0.66,0.71,0.75,0.79,0.97,1.21 263 | 2016/1/27,渠道B,48151,0.37,0.47,0.51,0.55,0.57,0.6,0.62,0.74,0.88 264 | 2016/1/27,渠道C,27226,0.42,0.52,0.58,0.66,0.71,0.73,0.76,0.96,1.17 265 | 2016/1/27,渠道D,1529,1.38,1.63,1.78,1.87,1.92,2,2.12,2.63,3.14 266 | 2016/1/27,渠道E,2127,1.34,1.46,1.57,1.64,1.67,1.74,1.78,2.04,2.51 267 | 2016/1/27,渠道F,11901,0.27,0.38,0.43,0.47,0.5,0.53,0.56,0.66,0.84 268 | 2016/1/27,渠道G,23918,0.16,0.19,0.2,0.23,0.25,0.27,0.29,0.36,0.5 269 | 2016/1/27,渠道H,3151,1.32,1.46,1.55,1.58,1.64,1.68,1.73,1.91,2.04 270 | 2016/1/27,渠道I,2737,0.32,0.43,0.49,0.61,0.69,0.79,0.83,1.02,1.3 271 | 2016/1/27,渠道J,5751,0.65,0.74,0.79,0.82,0.87,0.91,0.93,1.06,1.26 272 | 2016/1/28,渠道A,46469,0.4,0.51,0.58,0.64,0.69,0.73,0.75,0.96,1.19 273 | 2016/1/28,渠道B,53344,0.41,0.5,0.57,0.61,0.65,0.68,0.7,0.84,0.97 274 | 2016/1/28,渠道C,30939,0.43,0.53,0.61,0.67,0.71,0.74,0.77,0.98,1.18 275 | 2016/1/28,渠道D,1537,2.18,2.33,2.41,2.48,2.58,2.68,2.74,3.04,3.61 276 | 2016/1/28,渠道E,2141,1.3,1.53,1.58,1.74,1.83,1.98,2.03,2.44,2.85 277 | 2016/1/28,渠道F,12652,0.28,0.36,0.41,0.44,0.47,0.5,0.53,0.67,0.82 278 | 2016/1/28,渠道G,22232,0.17,0.2,0.24,0.27,0.31,0.32,0.34,0.45,0.55 279 | 2016/1/28,渠道H,3691,0.99,1.13,1.23,1.3,1.35,1.38,1.41,1.55,1.74 280 | 2016/1/28,渠道I,3591,0.55,0.66,0.89,1.02,1.07,1.14,1.21,1.46,1.73 281 | 2016/1/28,渠道J,6343,0.57,0.68,0.73,0.75,0.77,0.79,0.8,0.96,1.14 282 | 2016/1/29,渠道A,51694,0.36,0.52,0.6,0.66,0.71,0.75,0.78,0.99,1.17 283 | 2016/1/29,渠道B,57711,0.31,0.44,0.51,0.56,0.59,0.62,0.65,0.79,0.91 284 | 2016/1/29,渠道C,31010,0.31,0.46,0.55,0.61,0.66,0.69,0.73,0.92,1.11 285 | 2016/1/29,渠道D,1420,1.33,1.55,1.68,1.73,1.84,1.95,2.01,2.47,2.92 286 | 2016/1/29,渠道E,2013,1.16,1.36,1.5,1.64,1.72,1.76,1.85,2.23,2.86 287 | 2016/1/29,渠道F,12422,0.18,0.28,0.33,0.4,0.43,0.45,0.49,0.69,0.87 288 | 2016/1/29,渠道G,22470,0.08,0.17,0.24,0.26,0.28,0.3,0.32,0.41,0.53 289 | 2016/1/29,渠道H,4275,0.65,0.77,0.9,0.94,1,1.05,1.12,1.22,1.48 290 | 2016/1/29,渠道I,3888,0.42,0.68,0.81,0.91,1.03,1.05,1.12,1.37,1.68 291 | 2016/1/29,渠道J,6677,0.44,0.58,0.69,0.74,0.8,0.87,0.92,1.14,1.34 292 | 2016/1/30,渠道A,49946,0.48,0.62,0.69,0.74,0.79,0.83,0.87,1.11,1.29 293 | 2016/1/30,渠道B,56824,0.43,0.55,0.61,0.65,0.69,0.73,0.74,0.89,1.02 294 | 2016/1/30,渠道C,33858,0.53,0.68,0.77,0.83,0.88,0.91,0.95,1.15,1.33 295 | 2016/1/30,渠道D,1484,1.71,1.8,1.86,1.96,2.02,2.1,2.13,2.6,3.31 296 | 2016/1/30,渠道E,1937,1.49,1.69,1.82,1.89,2.06,2.21,2.32,2.78,3.12 297 | 2016/1/30,渠道F,12714,0.25,0.34,0.41,0.46,0.5,0.52,0.55,0.72,0.91 298 | 2016/1/30,渠道G,22152,0.33,0.47,0.52,0.55,0.58,0.61,0.64,0.76,0.88 299 | 2016/1/30,渠道H,4846,0.76,0.84,0.9,0.95,0.99,1,1.01,1.15,1.33 300 | 2016/1/30,渠道I,4064,0.77,1.04,1.18,1.24,1.32,1.37,1.44,1.68,1.91 301 | 2016/1/30,渠道J,6943,0.63,0.76,0.83,0.93,0.99,1.06,1.08,1.27,1.5 302 | 2016/1/31,渠道A,49438,0.52,0.66,0.72,0.77,0.81,0.85,0.88,1.09,1.25 303 | 2016/1/31,渠道B,57033,0.41,0.51,0.56,0.61,0.64,0.66,0.69,0.82,0.91 304 | 2016/1/31,渠道C,35230,0.49,0.63,0.7,0.76,0.81,0.85,0.88,1.13,1.27 305 | 2016/1/31,渠道D,1462,1.95,2.24,2.33,2.49,2.52,2.58,2.59,3.07,3.35 306 | 2016/1/31,渠道E,2058,1.82,2.09,2.33,2.44,2.47,2.49,2.57,3.14,3.63 307 | 2016/1/31,渠道F,13292,0.23,0.32,0.38,0.43,0.48,0.53,0.55,0.71,0.86 308 | 2016/1/31,渠道G,23688,0.31,0.42,0.46,0.5,0.53,0.55,0.58,0.68,0.77 309 | 2016/1/31,渠道H,4881,0.78,0.93,1,1.05,1.1,1.15,1.16,1.29,1.41 310 | 2016/1/31,渠道I,4222,0.57,0.76,0.89,0.97,1.06,1.09,1.14,1.46,1.68 311 | 2016/1/31,渠道J,5641,0.7,0.84,0.94,0.99,1.02,1.05,1.08,1.27,1.38 312 | -------------------------------------------------------------------------------- /data/第11章/付费总况.csv: -------------------------------------------------------------------------------- 1 | 日期,应收,实收,ARPU(应收),ARPPU(应收),ARPU(实收),ARPPU(实收) 2 | 08/01,5137.5,2936.5,0.83,42.46,0.48,24.27 3 | 08/02,3196,1871.8,0.53,25.17,0.31,14.74 4 | 08/03,3068.3,1320.9,0.5,26.45,0.22,11.39 5 | 08/04,3111.9,1707.4,0.52,25.1,0.29,13.77 6 | 08/05,4334.4,2573.4,0.73,37.05,0.44,21.99 7 | 08/06,2330.9,190.2,0.4,21.78,0.03,1.78 8 | 08/07,3254.3,1614.8,0.56,29.06,0.28,14.42 9 | 08/08,1919.2,1198.7,0.35,21.32,0.22,13.32 10 | 08/09,3183.2,1329.1,0.59,32.82,0.25,13.7 11 | 08/10,2551.8,1143.4,0.46,23.63,0.21,10.59 12 | 08/11,2739.4,1749.6,0.49,22.83,0.31,14.58 13 | 08/12,2628.7,1709.6,0.47,24.34,0.3,15.83 14 | 08/13,2734.5,,0.47,24.2,, 15 | 08/14,4013.5,1935.9,0.71,28.26,0.34,13.63 16 | 08/15,3353.2,1434.3,0.6,31.34,0.25,13.4 17 | 08/16,2280,1473.3,0.41,25.62,0.26,16.55 18 | 08/17,3536.5,2262.6,0.62,32.44,0.4,20.76 19 | 08/18,3278.8,1528.4,0.57,27.55,0.27,12.84 20 | 08/19,3110.4,1260.6,0.55,32.74,0.22,13.27 21 | 08/20,2534.9,1493.5,0.44,23.47,0.26,13.83 22 | 08/21,3341.7,2050.7,0.57,27.39,0.35,16.81 23 | 08/22,2688.4,1911.3,0.48,23.58,0.34,16.77 24 | 08/23,2685.5,1845.1,0.49,24.41,0.34,16.77 25 | 08/24,3009.5,1893.9,0.56,24.87,0.35,15.65 26 | 08/25,3167.3,1960.2,0.57,29.6,0.35,18.32 27 | 08/26,3525.1,2078.4,0.65,32.64,0.38,19.24 28 | 08/27,2613.9,1362.7,0.47,20.91,0.24,10.9 29 | 08/28,2781,2006.5,0.5,22.07,0.36,15.92 30 | 08/29,2503.6,1650.7,0.48,27.51,0.32,18.14 31 | 08/30,2105.5,1641.9,0.4,20.85,0.31,16.26 32 | 08/31,2419.3,1731.8,0.5,21.04,0.36,15.06 33 | -------------------------------------------------------------------------------- /data/第11章/日付费转化率.csv: -------------------------------------------------------------------------------- 1 | 日期,日付费率(百分比) 2 | 2016/8/1,1.96 3 | 2016/8/2,2.09 4 | 2016/8/3,1.91 5 | 2016/8/4,2.08 6 | 2016/8/5,1.98 7 | 2016/8/6,1.85 8 | 2016/8/7,1.92 9 | 2016/8/8,1.63 10 | 2016/8/9,1.79 11 | 2016/8/10,1.95 12 | 2016/8/11,2.13 13 | 2016/8/12,1.92 14 | 2016/8/13,1.94 15 | 2016/8/14,2.51 16 | 2016/8/15,1.9 17 | 2016/8/16,1.59 18 | 2016/8/17,1.92 19 | 2016/8/18,2.08 20 | 2016/8/19,1.67 21 | 2016/8/20,1.87 22 | 2016/8/21,2.09 23 | 2016/8/22,2.04 24 | 2016/8/23,2.02 25 | 2016/8/24,2.25 26 | 2016/8/25,1.92 27 | 2016/8/26,2 28 | 2016/8/27,2.23 29 | 2016/8/28,2.27 30 | 2016/8/29,1.74 31 | 2016/8/30,1.93 32 | 2016/8/31,2.36 33 | -------------------------------------------------------------------------------- /data/第2章/iris.csv: -------------------------------------------------------------------------------- 1 | "Sepal.Length","Sepal.Width","Petal.Length","Petal.Width","Species" 2 | 5.1,3.5,1.4,0.2,"setosa" 3 | 4.9,3,1.4,0.2,"setosa" 4 | 4.7,3.2,1.3,0.2,"setosa" 5 | 4.6,3.1,1.5,0.2,"setosa" 6 | 5,3.6,1.4,0.2,"setosa" 7 | 5.4,3.9,1.7,0.4,"setosa" 8 | 4.6,3.4,1.4,0.3,"setosa" 9 | 5,3.4,1.5,0.2,"setosa" 10 | 4.4,2.9,1.4,0.2,"setosa" 11 | 4.9,3.1,1.5,0.1,"setosa" 12 | 5.4,3.7,1.5,0.2,"setosa" 13 | 4.8,3.4,1.6,0.2,"setosa" 14 | 4.8,3,1.4,0.1,"setosa" 15 | 4.3,3,1.1,0.1,"setosa" 16 | 5.8,4,1.2,0.2,"setosa" 17 | 5.7,4.4,1.5,0.4,"setosa" 18 | 5.4,3.9,1.3,0.4,"setosa" 19 | 5.1,3.5,1.4,0.3,"setosa" 20 | 5.7,3.8,1.7,0.3,"setosa" 21 | 5.1,3.8,1.5,0.3,"setosa" 22 | 5.4,3.4,1.7,0.2,"setosa" 23 | 5.1,3.7,1.5,0.4,"setosa" 24 | 4.6,3.6,1,0.2,"setosa" 25 | 5.1,3.3,1.7,0.5,"setosa" 26 | 4.8,3.4,1.9,0.2,"setosa" 27 | 5,3,1.6,0.2,"setosa" 28 | 5,3.4,1.6,0.4,"setosa" 29 | 5.2,3.5,1.5,0.2,"setosa" 30 | 5.2,3.4,1.4,0.2,"setosa" 31 | 4.7,3.2,1.6,0.2,"setosa" 32 | 4.8,3.1,1.6,0.2,"setosa" 33 | 5.4,3.4,1.5,0.4,"setosa" 34 | 5.2,4.1,1.5,0.1,"setosa" 35 | 5.5,4.2,1.4,0.2,"setosa" 36 | 4.9,3.1,1.5,0.2,"setosa" 37 | 5,3.2,1.2,0.2,"setosa" 38 | 5.5,3.5,1.3,0.2,"setosa" 39 | 4.9,3.6,1.4,0.1,"setosa" 40 | 4.4,3,1.3,0.2,"setosa" 41 | 5.1,3.4,1.5,0.2,"setosa" 42 | 5,3.5,1.3,0.3,"setosa" 43 | 4.5,2.3,1.3,0.3,"setosa" 44 | 4.4,3.2,1.3,0.2,"setosa" 45 | 5,3.5,1.6,0.6,"setosa" 46 | 5.1,3.8,1.9,0.4,"setosa" 47 | 4.8,3,1.4,0.3,"setosa" 48 | 5.1,3.8,1.6,0.2,"setosa" 49 | 4.6,3.2,1.4,0.2,"setosa" 50 | 5.3,3.7,1.5,0.2,"setosa" 51 | 5,3.3,1.4,0.2,"setosa" 52 | 7,3.2,4.7,1.4,"versicolor" 53 | 6.4,3.2,4.5,1.5,"versicolor" 54 | 6.9,3.1,4.9,1.5,"versicolor" 55 | 5.5,2.3,4,1.3,"versicolor" 56 | 6.5,2.8,4.6,1.5,"versicolor" 57 | 5.7,2.8,4.5,1.3,"versicolor" 58 | 6.3,3.3,4.7,1.6,"versicolor" 59 | 4.9,2.4,3.3,1,"versicolor" 60 | 6.6,2.9,4.6,1.3,"versicolor" 61 | 5.2,2.7,3.9,1.4,"versicolor" 62 | 5,2,3.5,1,"versicolor" 63 | 5.9,3,4.2,1.5,"versicolor" 64 | 6,2.2,4,1,"versicolor" 65 | 6.1,2.9,4.7,1.4,"versicolor" 66 | 5.6,2.9,3.6,1.3,"versicolor" 67 | 6.7,3.1,4.4,1.4,"versicolor" 68 | 5.6,3,4.5,1.5,"versicolor" 69 | 5.8,2.7,4.1,1,"versicolor" 70 | 6.2,2.2,4.5,1.5,"versicolor" 71 | 5.6,2.5,3.9,1.1,"versicolor" 72 | 5.9,3.2,4.8,1.8,"versicolor" 73 | 6.1,2.8,4,1.3,"versicolor" 74 | 6.3,2.5,4.9,1.5,"versicolor" 75 | 6.1,2.8,4.7,1.2,"versicolor" 76 | 6.4,2.9,4.3,1.3,"versicolor" 77 | 6.6,3,4.4,1.4,"versicolor" 78 | 6.8,2.8,4.8,1.4,"versicolor" 79 | 6.7,3,5,1.7,"versicolor" 80 | 6,2.9,4.5,1.5,"versicolor" 81 | 5.7,2.6,3.5,1,"versicolor" 82 | 5.5,2.4,3.8,1.1,"versicolor" 83 | 5.5,2.4,3.7,1,"versicolor" 84 | 5.8,2.7,3.9,1.2,"versicolor" 85 | 6,2.7,5.1,1.6,"versicolor" 86 | 5.4,3,4.5,1.5,"versicolor" 87 | 6,3.4,4.5,1.6,"versicolor" 88 | 6.7,3.1,4.7,1.5,"versicolor" 89 | 6.3,2.3,4.4,1.3,"versicolor" 90 | 5.6,3,4.1,1.3,"versicolor" 91 | 5.5,2.5,4,1.3,"versicolor" 92 | 5.5,2.6,4.4,1.2,"versicolor" 93 | 6.1,3,4.6,1.4,"versicolor" 94 | 5.8,2.6,4,1.2,"versicolor" 95 | 5,2.3,3.3,1,"versicolor" 96 | 5.6,2.7,4.2,1.3,"versicolor" 97 | 5.7,3,4.2,1.2,"versicolor" 98 | 5.7,2.9,4.2,1.3,"versicolor" 99 | 6.2,2.9,4.3,1.3,"versicolor" 100 | 5.1,2.5,3,1.1,"versicolor" 101 | 5.7,2.8,4.1,1.3,"versicolor" 102 | 6.3,3.3,6,2.5,"virginica" 103 | 5.8,2.7,5.1,1.9,"virginica" 104 | 7.1,3,5.9,2.1,"virginica" 105 | 6.3,2.9,5.6,1.8,"virginica" 106 | 6.5,3,5.8,2.2,"virginica" 107 | 7.6,3,6.6,2.1,"virginica" 108 | 4.9,2.5,4.5,1.7,"virginica" 109 | 7.3,2.9,6.3,1.8,"virginica" 110 | 6.7,2.5,5.8,1.8,"virginica" 111 | 7.2,3.6,6.1,2.5,"virginica" 112 | 6.5,3.2,5.1,2,"virginica" 113 | 6.4,2.7,5.3,1.9,"virginica" 114 | 6.8,3,5.5,2.1,"virginica" 115 | 5.7,2.5,5,2,"virginica" 116 | 5.8,2.8,5.1,2.4,"virginica" 117 | 6.4,3.2,5.3,2.3,"virginica" 118 | 6.5,3,5.5,1.8,"virginica" 119 | 7.7,3.8,6.7,2.2,"virginica" 120 | 7.7,2.6,6.9,2.3,"virginica" 121 | 6,2.2,5,1.5,"virginica" 122 | 6.9,3.2,5.7,2.3,"virginica" 123 | 5.6,2.8,4.9,2,"virginica" 124 | 7.7,2.8,6.7,2,"virginica" 125 | 6.3,2.7,4.9,1.8,"virginica" 126 | 6.7,3.3,5.7,2.1,"virginica" 127 | 7.2,3.2,6,1.8,"virginica" 128 | 6.2,2.8,4.8,1.8,"virginica" 129 | 6.1,3,4.9,1.8,"virginica" 130 | 6.4,2.8,5.6,2.1,"virginica" 131 | 7.2,3,5.8,1.6,"virginica" 132 | 7.4,2.8,6.1,1.9,"virginica" 133 | 7.9,3.8,6.4,2,"virginica" 134 | 6.4,2.8,5.6,2.2,"virginica" 135 | 6.3,2.8,5.1,1.5,"virginica" 136 | 6.1,2.6,5.6,1.4,"virginica" 137 | 7.7,3,6.1,2.3,"virginica" 138 | 6.3,3.4,5.6,2.4,"virginica" 139 | 6.4,3.1,5.5,1.8,"virginica" 140 | 6,3,4.8,1.8,"virginica" 141 | 6.9,3.1,5.4,2.1,"virginica" 142 | 6.7,3.1,5.6,2.4,"virginica" 143 | 6.9,3.1,5.1,2.3,"virginica" 144 | 5.8,2.7,5.1,1.9,"virginica" 145 | 6.8,3.2,5.9,2.3,"virginica" 146 | 6.7,3.3,5.7,2.5,"virginica" 147 | 6.7,3,5.2,2.3,"virginica" 148 | 6.3,2.5,5,1.9,"virginica" 149 | 6.5,3,5.2,2,"virginica" 150 | 6.2,3.4,5.4,2.3,"virginica" 151 | 5.9,3,5.1,1.8,"virginica" 152 | -------------------------------------------------------------------------------- /data/第2章/iris.txt: -------------------------------------------------------------------------------- 1 | "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species" 2 | 5.1 3.5 1.4 0.2 "setosa" 3 | 4.9 3 1.4 0.2 "setosa" 4 | 4.7 3.2 1.3 0.2 "setosa" 5 | 4.6 3.1 1.5 0.2 "setosa" 6 | 5 3.6 1.4 0.2 "setosa" 7 | 5.4 3.9 1.7 0.4 "setosa" 8 | 4.6 3.4 1.4 0.3 "setosa" 9 | 5 3.4 1.5 0.2 "setosa" 10 | 4.4 2.9 1.4 0.2 "setosa" 11 | 4.9 3.1 1.5 0.1 "setosa" 12 | 5.4 3.7 1.5 0.2 "setosa" 13 | 4.8 3.4 1.6 0.2 "setosa" 14 | 4.8 3 1.4 0.1 "setosa" 15 | 4.3 3 1.1 0.1 "setosa" 16 | 5.8 4 1.2 0.2 "setosa" 17 | 5.7 4.4 1.5 0.4 "setosa" 18 | 5.4 3.9 1.3 0.4 "setosa" 19 | 5.1 3.5 1.4 0.3 "setosa" 20 | 5.7 3.8 1.7 0.3 "setosa" 21 | 5.1 3.8 1.5 0.3 "setosa" 22 | 5.4 3.4 1.7 0.2 "setosa" 23 | 5.1 3.7 1.5 0.4 "setosa" 24 | 4.6 3.6 1 0.2 "setosa" 25 | 5.1 3.3 1.7 0.5 "setosa" 26 | 4.8 3.4 1.9 0.2 "setosa" 27 | 5 3 1.6 0.2 "setosa" 28 | 5 3.4 1.6 0.4 "setosa" 29 | 5.2 3.5 1.5 0.2 "setosa" 30 | 5.2 3.4 1.4 0.2 "setosa" 31 | 4.7 3.2 1.6 0.2 "setosa" 32 | 4.8 3.1 1.6 0.2 "setosa" 33 | 5.4 3.4 1.5 0.4 "setosa" 34 | 5.2 4.1 1.5 0.1 "setosa" 35 | 5.5 4.2 1.4 0.2 "setosa" 36 | 4.9 3.1 1.5 0.2 "setosa" 37 | 5 3.2 1.2 0.2 "setosa" 38 | 5.5 3.5 1.3 0.2 "setosa" 39 | 4.9 3.6 1.4 0.1 "setosa" 40 | 4.4 3 1.3 0.2 "setosa" 41 | 5.1 3.4 1.5 0.2 "setosa" 42 | 5 3.5 1.3 0.3 "setosa" 43 | 4.5 2.3 1.3 0.3 "setosa" 44 | 4.4 3.2 1.3 0.2 "setosa" 45 | 5 3.5 1.6 0.6 "setosa" 46 | 5.1 3.8 1.9 0.4 "setosa" 47 | 4.8 3 1.4 0.3 "setosa" 48 | 5.1 3.8 1.6 0.2 "setosa" 49 | 4.6 3.2 1.4 0.2 "setosa" 50 | 5.3 3.7 1.5 0.2 "setosa" 51 | 5 3.3 1.4 0.2 "setosa" 52 | 7 3.2 4.7 1.4 "versicolor" 53 | 6.4 3.2 4.5 1.5 "versicolor" 54 | 6.9 3.1 4.9 1.5 "versicolor" 55 | 5.5 2.3 4 1.3 "versicolor" 56 | 6.5 2.8 4.6 1.5 "versicolor" 57 | 5.7 2.8 4.5 1.3 "versicolor" 58 | 6.3 3.3 4.7 1.6 "versicolor" 59 | 4.9 2.4 3.3 1 "versicolor" 60 | 6.6 2.9 4.6 1.3 "versicolor" 61 | 5.2 2.7 3.9 1.4 "versicolor" 62 | 5 2 3.5 1 "versicolor" 63 | 5.9 3 4.2 1.5 "versicolor" 64 | 6 2.2 4 1 "versicolor" 65 | 6.1 2.9 4.7 1.4 "versicolor" 66 | 5.6 2.9 3.6 1.3 "versicolor" 67 | 6.7 3.1 4.4 1.4 "versicolor" 68 | 5.6 3 4.5 1.5 "versicolor" 69 | 5.8 2.7 4.1 1 "versicolor" 70 | 6.2 2.2 4.5 1.5 "versicolor" 71 | 5.6 2.5 3.9 1.1 "versicolor" 72 | 5.9 3.2 4.8 1.8 "versicolor" 73 | 6.1 2.8 4 1.3 "versicolor" 74 | 6.3 2.5 4.9 1.5 "versicolor" 75 | 6.1 2.8 4.7 1.2 "versicolor" 76 | 6.4 2.9 4.3 1.3 "versicolor" 77 | 6.6 3 4.4 1.4 "versicolor" 78 | 6.8 2.8 4.8 1.4 "versicolor" 79 | 6.7 3 5 1.7 "versicolor" 80 | 6 2.9 4.5 1.5 "versicolor" 81 | 5.7 2.6 3.5 1 "versicolor" 82 | 5.5 2.4 3.8 1.1 "versicolor" 83 | 5.5 2.4 3.7 1 "versicolor" 84 | 5.8 2.7 3.9 1.2 "versicolor" 85 | 6 2.7 5.1 1.6 "versicolor" 86 | 5.4 3 4.5 1.5 "versicolor" 87 | 6 3.4 4.5 1.6 "versicolor" 88 | 6.7 3.1 4.7 1.5 "versicolor" 89 | 6.3 2.3 4.4 1.3 "versicolor" 90 | 5.6 3 4.1 1.3 "versicolor" 91 | 5.5 2.5 4 1.3 "versicolor" 92 | 5.5 2.6 4.4 1.2 "versicolor" 93 | 6.1 3 4.6 1.4 "versicolor" 94 | 5.8 2.6 4 1.2 "versicolor" 95 | 5 2.3 3.3 1 "versicolor" 96 | 5.6 2.7 4.2 1.3 "versicolor" 97 | 5.7 3 4.2 1.2 "versicolor" 98 | 5.7 2.9 4.2 1.3 "versicolor" 99 | 6.2 2.9 4.3 1.3 "versicolor" 100 | 5.1 2.5 3 1.1 "versicolor" 101 | 5.7 2.8 4.1 1.3 "versicolor" 102 | 6.3 3.3 6 2.5 "virginica" 103 | 5.8 2.7 5.1 1.9 "virginica" 104 | 7.1 3 5.9 2.1 "virginica" 105 | 6.3 2.9 5.6 1.8 "virginica" 106 | 6.5 3 5.8 2.2 "virginica" 107 | 7.6 3 6.6 2.1 "virginica" 108 | 4.9 2.5 4.5 1.7 "virginica" 109 | 7.3 2.9 6.3 1.8 "virginica" 110 | 6.7 2.5 5.8 1.8 "virginica" 111 | 7.2 3.6 6.1 2.5 "virginica" 112 | 6.5 3.2 5.1 2 "virginica" 113 | 6.4 2.7 5.3 1.9 "virginica" 114 | 6.8 3 5.5 2.1 "virginica" 115 | 5.7 2.5 5 2 "virginica" 116 | 5.8 2.8 5.1 2.4 "virginica" 117 | 6.4 3.2 5.3 2.3 "virginica" 118 | 6.5 3 5.5 1.8 "virginica" 119 | 7.7 3.8 6.7 2.2 "virginica" 120 | 7.7 2.6 6.9 2.3 "virginica" 121 | 6 2.2 5 1.5 "virginica" 122 | 6.9 3.2 5.7 2.3 "virginica" 123 | 5.6 2.8 4.9 2 "virginica" 124 | 7.7 2.8 6.7 2 "virginica" 125 | 6.3 2.7 4.9 1.8 "virginica" 126 | 6.7 3.3 5.7 2.1 "virginica" 127 | 7.2 3.2 6 1.8 "virginica" 128 | 6.2 2.8 4.8 1.8 "virginica" 129 | 6.1 3 4.9 1.8 "virginica" 130 | 6.4 2.8 5.6 2.1 "virginica" 131 | 7.2 3 5.8 1.6 "virginica" 132 | 7.4 2.8 6.1 1.9 "virginica" 133 | 7.9 3.8 6.4 2 "virginica" 134 | 6.4 2.8 5.6 2.2 "virginica" 135 | 6.3 2.8 5.1 1.5 "virginica" 136 | 6.1 2.6 5.6 1.4 "virginica" 137 | 7.7 3 6.1 2.3 "virginica" 138 | 6.3 3.4 5.6 2.4 "virginica" 139 | 6.4 3.1 5.5 1.8 "virginica" 140 | 6 3 4.8 1.8 "virginica" 141 | 6.9 3.1 5.4 2.1 "virginica" 142 | 6.7 3.1 5.6 2.4 "virginica" 143 | 6.9 3.1 5.1 2.3 "virginica" 144 | 5.8 2.7 5.1 1.9 "virginica" 145 | 6.8 3.2 5.9 2.3 "virginica" 146 | 6.7 3.3 5.7 2.5 "virginica" 147 | 6.7 3 5.2 2.3 "virginica" 148 | 6.3 2.5 5 1.9 "virginica" 149 | 6.5 3 5.2 2 "virginica" 150 | 6.2 3.4 5.4 2.3 "virginica" 151 | 5.9 3 5.1 1.8 "virginica" 152 | -------------------------------------------------------------------------------- /data/第2章/sample.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiabiao1602/Game_DataMining_With_R/fc3586dd9032adc364d9c8851521995c1a4d3072/data/第2章/sample.xlsx -------------------------------------------------------------------------------- /data/第2章/unstructuredText.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiabiao1602/Game_DataMining_With_R/fc3586dd9032adc364d9c8851521995c1a4d3072/data/第2章/unstructuredText.txt -------------------------------------------------------------------------------- /data/第4章/LTV.csv: -------------------------------------------------------------------------------- 1 | V1 2 | 0.405993384 3 | 0.684362499 4 | 0.847197993 5 | 0.962731615 6 | 1.052346454 7 | 1.125567109 8 | 1.187474291 9 | 1.24110073 10 | 1.288402603 11 | 1.33071557 12 | 1.368992304 13 | 1.403936224 14 | 1.436081515 15 | 1.465843406 16 | 1.493551063 17 | 1.519469846 18 | 1.5438168 19 | 1.566771718 20 | 1.588485209 21 | 1.609084685 22 | 1.6286789 23 | 1.647361419 24 | 1.665213325 25 | 1.68230534 26 | 1.698699524 27 | 1.714450631 28 | 1.729607212 29 | 1.744212522 30 | 1.758305257 31 | 1.771920179 32 | 1.785088629 33 | 1.797838962 34 | 1.810196913 35 | 1.822185915 36 | 1.833827361 37 | 1.845140834 38 | 1.85614431 39 | 1.866854324 40 | 1.877286125 41 | 1.887453801 42 | 1.897370397 43 | 1.907048016 44 | 1.916497904 45 | 1.925730535 46 | 1.934755673 47 | 1.94358244 48 | 1.95221937 49 | 1.960674456 50 | 1.968955197 51 | 1.97706864 52 | 1.985021409 53 | 1.992819746 54 | 2.000469535 55 | 2.007976328 56 | 2.015345374 57 | 2.022581637 58 | 2.029689818 59 | 2.036674372 60 | 2.043539527 61 | 2.050289295 62 | 2.056927491 63 | 2.063457745 64 | 2.06988351 65 | 2.076208077 66 | 2.082434585 67 | 2.088566029 68 | 2.094605267 69 | 2.100555031 70 | 2.106417934 71 | 2.112196476 72 | 2.11789305 73 | 2.123509949 74 | 2.129049372 75 | 2.134513425 76 | 2.139904134 77 | 2.14522344 78 | 2.150473211 79 | 2.15565524 80 | 2.160771255 81 | 2.165822916 82 | 2.170811822 83 | 2.175739512 84 | 2.180607472 85 | 2.185417131 86 | 2.19016987 87 | 2.19486702 88 | 2.199509866 89 | 2.20409965 90 | 2.208637572 91 | 2.213124789 92 | 2.217562422 93 | 2.221951556 94 | 2.226293239 95 | 2.230588485 96 | 2.234838279 97 | 2.239043571 98 | 2.243205284 99 | 2.247324313 100 | 2.251401523 101 | 2.255437755 102 | 2.259433825 103 | 2.263390525 104 | 2.267308622 105 | 2.271188862 106 | 2.27503197 107 | 2.27883865 108 | 2.282609586 109 | 2.286345443 110 | 2.290046868 111 | 2.29371449 112 | 2.297348919 113 | 2.300950753 114 | 2.304520569 115 | 2.308058934 116 | 2.311566395 117 | 2.315043488 118 | 2.318490734 119 | 2.321908642 120 | 2.325297706 121 | 2.32865841 122 | 2.331991224 123 | 2.335296607 124 | 2.338575006 125 | 2.34182686 126 | 2.345052594 127 | 2.348252625 128 | 2.351427359 129 | 2.354577193 130 | 2.357702514 131 | 2.360803701 132 | 2.363881124 133 | 2.366935144 134 | 2.369966115 135 | 2.372974382 136 | 2.375960282 137 | 2.378924146 138 | 2.381866297 139 | 2.38478705 140 | 2.387686714 141 | 2.390565592 142 | 2.393423979 143 | 2.396262166 144 | 2.399080435 145 | 2.401879065 146 | 2.404658327 147 | 2.407418487 148 | 2.410159807 149 | 2.412882541 150 | 2.41558694 151 | 2.418273249 152 | 2.420941709 153 | 2.423592555 154 | 2.426226019 155 | 2.428842326 156 | 2.431441699 157 | 2.434024356 158 | 2.43659051 159 | 2.439140371 160 | 2.441674144 161 | 2.444192032 162 | 2.446694231 163 | 2.449180937 164 | 2.451652341 165 | 2.454108628 166 | 2.456549983 167 | 2.458976587 168 | 2.461388617 169 | 2.463786247 170 | 2.466169647 171 | 2.468538985 172 | 2.470894428 173 | 2.473236135 174 | 2.475564268 175 | 2.477878982 176 | 2.480180431 177 | 2.482468766 178 | 2.484744136 179 | 2.487006687 180 | 2.489256563 181 | 2.491493904 182 | 2.49371885 183 | 2.495931538 184 | 2.498132101 185 | 2.500320671 186 | 2.50249738 187 | 2.504662354 188 | 2.50681572 189 | 2.508957601 190 | 2.511088119 191 | 2.513207394 192 | 2.515315545 193 | 2.517412687 194 | 2.519498934 195 | 2.5215744 196 | 2.523639195 197 | 2.525693428 198 | 2.527737207 199 | 2.529770638 200 | 2.531793825 201 | 2.533806871 202 | 2.535809876 203 | 2.537802941 204 | 2.539786163 205 | 2.54175964 206 | 2.543723467 207 | 2.545677737 208 | 2.547622544 209 | 2.549557978 210 | 2.551484129 211 | 2.553401086 212 | 2.555308936 213 | 2.557207766 214 | 2.55909766 215 | 2.560978702 216 | 2.562850974 217 | 2.564714559 218 | 2.566569536 219 | 2.568415984 220 | 2.570253981 221 | 2.572083605 222 | 2.573904931 223 | 2.575718035 224 | 2.577522989 225 | 2.579319868 226 | 2.581108743 227 | 2.582889685 228 | 2.584662764 229 | 2.586428049 230 | 2.588185609 231 | 2.58993551 232 | 2.59167782 233 | 2.593412603 234 | 2.595139925 235 | 2.59685985 236 | 2.59857244 237 | 2.600277758 238 | 2.601975865 239 | 2.603666822 240 | 2.605350689 241 | 2.607027526 242 | 2.60869739 243 | 2.610360339 244 | 2.612016431 245 | 2.613665722 246 | 2.615308267 247 | 2.616944122 248 | 2.61857334 249 | 2.620195976 250 | 2.621812081 251 | 2.62342171 252 | 2.625024913 253 | 2.626621741 254 | 2.628212245 255 | 2.629796474 256 | 2.631374479 257 | 2.632946308 258 | 2.634512009 259 | 2.636071629 260 | 2.637625216 261 | 2.639172817 262 | 2.640714476 263 | 2.64225024 264 | 2.643780153 265 | 2.64530426 266 | 2.646822605 267 | 2.648335231 268 | 2.649842181 269 | 2.651343498 270 | 2.652839223 271 | 2.654329398 272 | 2.655814064 273 | 2.657293262 274 | 2.658767032 275 | 2.660235412 276 | 2.661698444 277 | 2.663156165 278 | 2.664608614 279 | 2.666055829 280 | 2.667497848 281 | 2.668934707 282 | 2.670366444 283 | 2.671793095 284 | 2.673214695 285 | 2.674631281 286 | 2.676042888 287 | 2.677449551 288 | 2.678851304 289 | 2.680248181 290 | 2.681640216 291 | 2.683027442 292 | 2.684409894 293 | 2.685787603 294 | 2.687160602 295 | 2.688528922 296 | 2.689892597 297 | 2.691251656 298 | 2.692606132 299 | 2.693956055 300 | 2.695301456 301 | 2.696642365 302 | 2.697978811 303 | 2.699310825 304 | 2.700638435 305 | 2.701961671 306 | 2.703280561 307 | 2.704595134 308 | 2.705905419 309 | 2.707211442 310 | 2.708513231 311 | 2.709810815 312 | 2.711104219 313 | 2.712393471 314 | 2.713678598 315 | 2.714959626 316 | 2.71623658 317 | 2.717509486 318 | 2.718778371 319 | 2.72004326 320 | 2.721304177 321 | 2.722561147 322 | 2.723814196 323 | 2.725063347 324 | 2.726308625 325 | 2.727550053 326 | 2.728787656 327 | 2.730021456 328 | 2.731251478 329 | 2.732477744 330 | 2.733700276 331 | 2.734919099 332 | 2.736134234 333 | 2.737345703 334 | 2.738553529 335 | 2.739757733 336 | 2.740958337 337 | 2.742155362 338 | 2.74334883 339 | 2.744538762 340 | 2.745725179 341 | 2.746908101 342 | 2.748087549 343 | 2.749263543 344 | 2.750436104 345 | 2.751605251 346 | 2.752771004 347 | 2.753933384 348 | 2.755092408 349 | 2.756248097 350 | 2.75740047 351 | 2.758549546 352 | 2.759695344 353 | 2.760837882 354 | 2.761977178 355 | 2.763113252 356 | 2.76424612 357 | 2.765375803 358 | 2.766502316 359 | 2.767625678 360 | 2.768745907 361 | 2.76986302 362 | 2.770977034 363 | 2.772087966 364 | 2.773195833 365 | 2.774300653 366 | 2.775402442 367 | -------------------------------------------------------------------------------- /data/第4章/revenue.csv: -------------------------------------------------------------------------------- 1 | 游戏名称,本周,上周 2 | 烈焰遮天,556,400 3 | 坦克大战OL(ios正版),1221,1855 4 | 美人记,1876,1287 5 | 坦克大战OL(安卓),2239,1870 6 | 三剑豪,4213,5649 7 | 苍穹变(安卓),7155,7084 8 | 苍穹变(iOS正版),7443,8786 9 | 圣斗士星矢-集结(安卓),13906,15849 10 | 圣斗士星矢-集结(ios正版),28489,25712 11 | -------------------------------------------------------------------------------- /data/第5章/每日付费及留存数据.csv: -------------------------------------------------------------------------------- 1 | 日期,新增用户,七日留存率 2 | 6月1日,95648,0.0753 3 | 6月2日,72093,0.0881 4 | 6月3日,84027,0.0892 5 | 6月4日,130968,0.0749 6 | 6月5日,129277,0.0579 7 | 6月6日,79603,0.0497 8 | 6月7日,80485,0.0696 9 | 6月8日,99812,0.0628 10 | 6月9日,176422,0.055 11 | 6月10日,157126,0.0691 12 | 6月11日,139884,0.0682 13 | 6月12日,104875,0.0755 14 | 6月13日,78400,0.079 15 | 6月14日,74043,0.0795 16 | 6月15日,82547,0.0788 17 | 6月16日,85521,0.0801 18 | 6月17日,102930,0.0824 19 | 6月18日,160954,0.0894 20 | 6月19日,154282,0.0876 21 | 6月20日,85595,0.0806 22 | 6月21日,80501,0.08 23 | 6月22日,82218,0.0821 24 | 6月23日,92630,0.0815 25 | 6月24日,108706,0.0809 26 | 6月25日,150854,0.0811 27 | 6月26日,144837,0.0816 28 | 6月27日,106361,0.0753 29 | 6月28日,116854,0.0756 30 | 6月29日,137116,0.0758 31 | 6月30日,146560,0.073 32 | -------------------------------------------------------------------------------- /data/第5章/玩家玩牌数据样本.csv: -------------------------------------------------------------------------------- 1 | 用户id,免费筹码,身上货币量,最高拥有,最大赢取,贡献台费,登录总次数,站内好友数,经验值,玩牌局数,赢牌局数,输牌局数,正常牌局,非正常牌局,最高牌类型 2 | 7793439,2100219025,403237,151268700,11264000,10321990,4,1,4023,1792,270,1522,2030,10,8 3 | 7793414,8000,20000,2774724,939132,1043120,4,0,1010,289,79,210,285,4,8 4 | 7793253,303023394,532722,131950000,10280000,11020155,5,3,2898,2334,379,1955,1548,5,9 5 | 7793114,50606,10605,7211504,2040000,1792750,5,1,2374,926,135,791,920,6,8 6 | 7793052,4000,54000,1529464150,248700000,194001720,5,1,4097,4710,1558,3151,4651,59,10 7 | 7793039,8043211,236456,392813,160528,36960,5,1,1467,651,113,538,408,59,9 8 | 7792916,3174485,16948,16390,5621,1860,5,0,1115,169,21,122,233,0,6 9 | 7792868,17581452,24864,32296,16722,1760,4,1,1641,363,103,260,223,2,9 10 | 7792852,4350,42350,8982778,2691000,2904565,5,0,1791,678,149,529,1322,34,9 11 | 7792789,34022340,47577,572931,189594,121470,4,1,2590,1396,312,1084,1392,6,9 12 | 7792668,2779856396,5749607,1360495107,219700000,26088000,4,1,1931,659,192,467,645,14,9 13 | 7792464,312717876,98138,106138,28020,890,5,5,1685,367,118,249,492,0,10 14 | 7792107,1000,50,107434,40100,7050,4,1,915,123,36,87,125,0,8 15 | 7792081,1582279236,160,21929664,5244000,2911900,5,5,2032,679,106,563,662,0,8 16 | 7791623,1492765718,1407490,4319570,998500,739285,6,8,3030,1063,240,797,956,4,10 17 | 7791602,2643473,9600,10651600,2303000,1954030,4,3,1440,494,119,375,492,2,8 18 | 7791500,4480,3620,45708,18950,2340,5,3,1465,267,67,200,312,2,8 19 | 7791470,92473540,160184,167984,46450,15210,5,0,1794,365,82,283,407,0,9 20 | 7791350,8000,3050,26330157,7266001,6100700,6,11,2318,1034,116,916,984,47,8 21 | 7790995,1284733,539100,2018915,557000,252340,6,5,2505,669,249,418,471,0,10 22 | 7790983,1800,1800,137799,32000,39770,4,3,1774,620,107,513,1236,2,9 23 | 7790940,515161,1465,470067,289500,50120,6,1,1084,239,93,141,151,2,7 24 | 7790910,2046775,33722,25921,1470,300,5,3,2742,364,78,217,274,0,8 25 | 7790848,2594863596,2065412,161220641,20160000,49544305,5,0,3697,3636,396,3240,2206,0,9 26 | 7790777,169064655,377469,380186,59816,63620,6,1,7003,5461,484,4883,1065,4,9 27 | 7790487,197099589,191,48016,13253,380,4,0,686,145,58,48,198,9,7 28 | 7790156,148265,30,45935,37738,2250,7,1,762,102,24,78,101,2,8 29 | 7790155,530,10,34380,10622,3885,6,9,2039,383,94,289,382,3,9 30 | 7790132,220463,29156,31696,1810,430,6,2,1848,500,120,361,698,0,7 31 | 7790078,39456,5441,14555,3670,1725,5,0,919,167,58,97,167,0,9 32 | 7790011,8578971,16398,650521,199700,48885,6,2,2435,590,120,470,804,25,9 33 | 7789828,1162078,1361,60551698,25024000,419265,7,1,2925,1549,232,1317,1490,16,9 34 | 7789630,537559,1421,20860,2107,1340,4,4,780,106,30,55,108,0,6 35 | 7789238,522252078,688439,99891,16010,7050,7,1,3440,890,197,558,736,2,8 36 | 7789115,4924191,7193,12723680,3187000,442980,5,0,1336,179,40,139,180,0,8 37 | 7788935,1975935207,2570648,1152415,186450,96580,7,0,4385,1629,264,1337,2733,105,10 38 | 7788851,106124,4445,20242,6000,830,7,3,1577,313,126,187,288,2,9 39 | 7788850,92237,2755,9935,4900,675,6,1,563,107,29,78,106,1,8 40 | 7788730,3058038,13367,43757,20440,4400,7,0,1559,450,100,335,434,0,8 41 | 7788701,13175623,44649,7333790,2382410,887820,5,4,2460,828,135,692,1827,2,8 42 | 7788345,2084193,3676,10156,3974,1210,4,0,866,160,51,109,140,0,10 43 | 7788205,3867579,13062,22167,9226,3520,5,0,2443,633,221,343,504,0,9 44 | 7788150,24079,60,16460,4360,2060,5,1,1074,218,70,148,218,0,8 45 | 7788135,101667,24705,1366534,380317,31450,7,1,1804,316,89,227,298,19,8 46 | 7788117,538841104,1064718,168223140,49216000,10457200,8,1,2652,642,136,506,700,2,9 47 | 7787809,20709144,30517,30112250,6034000,3019830,7,9,2603,835,227,584,777,7,8 48 | 7787637,322953,830,23673,8520,1830,4,4,1301,237,69,146,238,0,8 49 | 7787607,576,1810,411472,253136,23570,4,0,985,161,28,133,308,2,8 50 | 7787455,3269968,10000,3452633,856000,358840,6,0,2259,594,61,533,588,6,9 51 | 7787426,3103881667,5833814,18344278,8376000,2329410,8,0,1907,459,118,339,542,0,9 52 | 7787043,368256604,829140,658505760,86200000,86139040,7,0,7385,3262,1029,2233,4191,20,9 53 | 7786946,12046578,133923,135883,17530,1700,4,1,725,212,37,175,0,0,7 54 | 7786849,1276315299,4869946,5062046,228000,38090,6,5,1357,233,43,190,332,0,8 55 | 7786848,6602596082,7484446,23908003,3948000,9818050,8,1,5965,1997,210,1775,2970,17,11 56 | 7786693,267992,500,2472010,1154000,723690,5,1,1566,316,67,236,297,2,8 57 | 7786668,4000,4000,1184072,284000,210645,5,1,1180,420,105,315,420,1,8 58 | 7786559,4001,17000,47000098,17048000,2998200,7,0,2854,748,217,531,443,3,8 59 | 7786516,398082,990,90366,42052,5740,7,1,1108,183,59,124,184,0,8 60 | 7786317,907164,50,83211,18303,1870,7,1,3182,1121,662,459,1097,0,9 61 | 7785823,461616677,786185,986185,600000,311100,5,1,981,135,16,119,316,0,8 62 | 7785694,392645449,717288,751064,50800,43925,9,1,6368,3960,382,3554,3928,8,8 63 | 7785618,471631367,213868,2442049,744600,247580,7,1,3795,838,131,707,1258,20,10 64 | 7785324,125,150,29432,10060,2840,8,1,753,159,39,114,160,0,8 65 | 7785241,18789953,71525,90132,45841,3260,8,0,938,137,31,106,178,1,8 66 | 7785132,83116,134,300473,58026,13000,8,0,4956,1256,340,874,1075,2,9 67 | 7785129,1000,1500,862580,412400,16910,5,1,923,116,46,70,115,1,8 68 | 7785022,4250,4263,1065545,575800,58140,5,0,2173,1099,235,864,1561,284,8 69 | 7785012,1031,1996,11713,2402,3975,5,1,645,102,23,79,105,1,6 70 | 7784979,68479,451,14949,5304,2735,6,0,1520,326,134,192,325,3,8 71 | 7784401,53562234,25214,833784,381400,469190,8,1,3880,4607,2023,2584,4584,24,10 72 | 7784277,868425857,1627761,1673696,113480,108320,9,1,9617,7215,590,6568,174,0,9 73 | 7784272,202580,2660,112486,33409,2560,4,7,1365,279,72,207,270,0,9 74 | 7784240,1794,65,60953,18400,900,6,1,1315,259,84,175,260,1,11 75 | 7784015,3142061070,6044702,6371656,998500,33960,7,1,1695,348,96,246,276,1,9 76 | 7783648,20250267,27845,36445,18732,5850,5,0,651,118,16,74,118,1,9 77 | 7783392,25463135533,10000,78437412,10270000,17116320,10,0,13227,3677,328,3337,3313,8,9 78 | 7783382,7828235,25694,53736,9220,3510,10,0,4146,1361,350,1011,1382,3,9 79 | 7783181,20570,5390,51956,26128,8380,7,1,1181,181,40,141,176,6,9 80 | 7783122,14922517,33290,446163,92710,43720,9,1,7159,1877,457,1420,2752,4,9 81 | 7782622,270274842,92902,30960670,10164000,10239715,10,3,8251,3186,652,2482,2875,27,10 82 | 7782454,1523,2523,147430,32740,9890,7,1,1334,338,73,265,346,0,9 83 | 7782386,656754,935,262844,49950,42760,8,4,2745,941,249,692,1342,3,8 84 | 7781798,18686,1219,611720,217400,240790,8,5,4682,3402,541,2846,3711,5,8 85 | 7781797,1071519689,1148217,1408650,220600,99350,10,1,1925,360,49,311,420,0,7 86 | 7781599,13551564,87567,101852,10970,600,7,2,3609,1082,397,654,813,4,9 87 | 7781580,2010535532,4186491,142562491,24452000,15267040,5,2,1735,970,239,731,970,0,8 88 | 7781537,5024,300,162731,49468,5325,6,1,1011,201,64,130,193,0,8 89 | 7780962,200164,200,1955614,611000,304780,8,1,2362,951,167,784,913,2,9 90 | 7780876,1161359,3493,29486,5130,3005,6,3,2317,531,215,316,528,3,10 91 | 7780355,3150,3150,402965,132542,208035,5,1,1907,1129,226,903,2254,4,8 92 | 7780096,29693,200,3668634,1149000,2009905,9,12,7126,2935,882,2053,2913,27,10 93 | 7780095,127594,172,62832,10377,9050,8,1,1549,232,56,176,232,0,9 94 | 7779790,1,1,102918,38836,2640,8,1,1453,523,252,269,667,90,9 95 | 7779712,468756,1700,39650,20041,5115,4,0,1157,188,73,115,190,1,9 96 | 7779508,121350891,152742,311533,206753,32570,11,0,1327,270,45,225,368,2,8 97 | 7779280,250,250,11986211,4177000,1180775,4,1,1205,531,93,438,1062,0,9 98 | 7779165,2707,3207,84711,57074,6050,10,1,1726,186,42,144,247,0,9 99 | 7779132,31418,53,49911,11358,3935,6,1,1027,202,61,141,235,22,8 100 | 7779016,4000,4000,459679260,119430000,6142825,5,1,1136,203,62,141,237,0,8 101 | 7778900,1136717,2400,43444,14025,7410,10,0,1824,348,103,238,282,0,8 102 | 7794328,3102528,59941,53913,6916,0,2,0,875,207,58,126,214,0,8 103 | 7787666,1907889,27743,1750,200,620,2,1,1080,201,56,21,200,1,7 104 | 7780334,2407544,11864,11418,2540,45,4,0,624,115,32,76,115,0,8 105 | 7784012,4219140,36426,37876,9530,0,3,2,957,167,46,121,167,1,8 106 | 7784759,39168,2025,10554,6720,20,5,0,534,103,28,75,115,0,9 107 | 7791150,65269,490,15258,5308,3210,2,1,830,155,42,113,155,0,8 108 | 7779470,3555027,14941,19286,6142,0,3,3,957,155,42,113,158,0,8 109 | 7791828,265478,14592,12346,1778,0,3,0,1053,184,49,86,186,0,8 110 | 7786085,17626,80,665990,351820,115380,3,8,1296,278,70,208,234,0,10 111 | 7794708,16820,150,18855,1390,540,4,2,691,108,27,77,104,1,8 112 | 7783630,1762941,3791,4621,685,0,4,1,554,109,27,80,111,0,9 113 | 7786065,283088,4406,7871,2060,80,5,2,1312,287,70,209,288,0,8 114 | 7785023,166697,13669,8748,1690,20,3,2,777,119,29,65,119,0,8 115 | 7784754,1382971352,29654,4174130,998500,169660,2,0,616,141,34,14,138,3,3 116 | 7793765,38129,150,674162,202180,75030,4,2,902,129,31,91,130,0,7 117 | 7794916,19423,29,9006,2220,270,3,1,1145,249,59,154,249,1,8 118 | 7782731,3119814,241,29081,9641,880,3,5,940,138,32,80,137,1,8 119 | 7795859,13404659,30258,51540,9995,1200,3,1,479,109,25,50,108,0,7 120 | 7784033,57818,100,230167,79430,34850,2,0,1110,332,75,245,328,4,8 121 | 7794499,26340,1058,41685,20032,440,2,0,980,183,39,138,368,2,10 122 | 7790049,774926,15503,18070,5040,0,3,4,563,114,24,63,116,0,8 123 | 7795560,948918451,1713163,1799990,553500,93920,4,0,654,105,22,59,76,1,7 124 | 7785530,106449,5260,8210,1930,0,3,3,730,116,24,47,120,0,8 125 | 7785874,59637905,194408,131874128,34036000,3319000,3,1,875,204,42,108,204,0,9 126 | 7783034,24303,4409,3380,600,0,2,1,625,121,24,60,121,0,8 127 | 7785840,2581693418,6184,10298860,2880000,1453540,3,0,833,179,35,144,227,14,8 128 | 7790881,3264395,37449,32877,1420,0,5,3,2595,374,70,220,279,0,8 129 | 7794303,1249196,8356,26145,11877,1045,4,3,1143,452,83,342,412,1,9 130 | 7794234,1876073055,3112462,3390862,1582772,153600,3,0,683,109,19,63,219,0,8 131 | 7791025,827659,1450,4754,1906,165,3,1,532,122,21,91,123,0,8 132 | 7788078,358552,1426,7024,2750,220,2,0,875,187,32,155,187,1,8 133 | 7790831,1438473,23388,31904,2201,0,5,3,2468,376,57,239,282,0,8 134 | 7793545,13701687,17480,25960002,8376000,3886940,5,1,3067,1251,126,1117,853,24,8 135 | 7794275,63241669,106157,338462,49622,61530,4,2,3307,2772,271,2486,0,0,9 136 | 7783970,4000,4500,34511,15392,0,3,1,1040,669,55,614,669,8,8 137 | -------------------------------------------------------------------------------- /data/第6章/logindata.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiabiao1602/Game_DataMining_With_R/fc3586dd9032adc364d9c8851521995c1a4d3072/data/第6章/logindata.csv -------------------------------------------------------------------------------- /data/第6章/可视化数据.csv: -------------------------------------------------------------------------------- 1 | 日期,活跃用户,新增用户,付费率,付费用户,首次付费用户,ARPPU,ARPU 2 | 2016-06-01,1734249,213417,0.96 ,16665,11047,19.19,0.18 3 | 2016-06-02,1359380,138425,0.79 ,10801,6715,19.84,0.16 4 | 2016-06-03,1567893,173605,0.77 ,12065,7750,20.3,0.16 5 | 2016-06-04,2154769,320926,0.92 ,19729,13275,21.35,0.2 6 | 2016-06-05,2146692,316580,0.90 ,19315,12981,21.14,0.19 7 | 2016-06-06,1426261,155008,0.79 ,11249,7153,20.75,0.16 8 | 2016-06-07,1444230,162179,0.84 ,12083,7743,19.94,0.17 9 | 2016-06-08,1754834,213414,0.86 ,15164,9793,19.43,0.17 10 | 2016-06-09,2638497,448204,1.09 ,28869,19667,21.62,0.24 11 | 2016-06-10,2443312,391016,1.31 ,32115,22168,21.33,0.28 12 | 2016-06-11,2259999,321756,1.33 ,30119,20472,20.2,0.27 13 | 2016-06-12,1500552,162762,1.20 ,18049,11560,19.03,0.23 14 | 2016-06-13,1393854,141639,1.01 ,14046,8697,18.08,0.18 15 | 2016-06-14,1379197,142025,1.05 ,14433,9058,17.91,0.19 16 | 2016-06-15,1368469,146451,0.98 ,13452,8549,17.62,0.17 17 | 2016-06-16,1365734,145683,0.96 ,13054,8327,17.77,0.17 18 | 2016-06-17,1593464,194292,1.02 ,16248,10642,19.04,0.19 19 | 2016-06-18,2229427,365801,1.27 ,28388,19901,20.34,0.26 20 | 2016-06-19,2229602,344763,1.22 ,27164,18777,20.04,0.24 21 | 2016-06-20,1487080,174717,1.04 ,15477,10230,18.12,0.19 22 | 2016-06-21,1481944,166944,1.06 ,15782,10397,18.54,0.2 23 | 2016-06-22,1477449,160176,1.01 ,14853,9645,18.04,0.18 24 | 2016-06-23,1538792,184313,1.03 ,15847,10427,16.02,0.16 25 | 2016-06-24,1736293,224709,1.21 ,20958,14195,18.78,0.23 26 | 2016-06-25,2254574,367205,1.32 ,29679,20641,18.9,0.25 27 | 2016-06-26,2234136,344360,1.32 ,29392,20180,19.3,0.25 28 | 2016-06-27,1752225,238537,1.10 ,19231,12976,14.12,0.15 29 | 2016-06-28,1886960,268546,1.13 ,21387,14671,15.03,0.17 30 | 2016-06-29,1993725,290032,1.08 ,21585,14913,15.1,0.16 31 | 2016-06-30,2151874,339619,1.06 ,22881,15778,17.55,0.19 32 | -------------------------------------------------------------------------------- /data/第6章/收入数据.csv: -------------------------------------------------------------------------------- 1 | 日期,收入 2 | 2014年1月,69359 3 | 2014年2月,84741 4 | 2014年3月,58485 5 | 2014年4月,59013 6 | 2014年5月,66076 7 | 2014年6月,68972 8 | 2014年7月,81256 9 | 2014年8月,85223 10 | 2014年9月,69329 11 | 2014年10月,92855 12 | 2014年11月,69036 13 | 2014年12月,74693 14 | 2015年1月,152326 15 | 2015年2月,329667 16 | 2015年3月,239586 17 | 2015年4月,182701 18 | 2015年5月,163006 19 | 2015年6月,123454 20 | 2015年7月,205754 21 | 2015年8月,200076 22 | 2015年9月,110170 23 | 2015年10月,97827 24 | 2015年11月,62833 25 | 2015年12月,81280 26 | 2016年1月,125837 27 | 2016年2月,234364 28 | 2016年3月,106532 29 | 2016年4月,79553 30 | 2016年5月,63556 31 | 2016年6月,61305 32 | -------------------------------------------------------------------------------- /data/第6章/玩家喜好分析数据.csv: -------------------------------------------------------------------------------- 1 | 道具名称,A类玩家,B类玩家,C类玩家,D类玩家,E类玩家 2 | 8个钻,4,181,391,36,2270 3 | 感恩大礼包,2,124,314,200,285 4 | 快速复活,10,136,313,125,166 5 | 5个大师精灵球,3,15,257,89,247 6 | 圣诞驯鹿,3,101,125,800,229 7 | 双倍金币,3,38,218,247,260 8 | 8000个金币,8,4600,373,93,292 9 | 博尔特,6,26,4600,256,142 10 | 20000个金币,1,1350,139,38,201 11 | 美洲豹,4,28,359,960,150 12 | 50个钻,8,107,391,200,320 13 | 20个钻,5,0,290,31,400 14 | 50000个金币,0,350,175,183,298 15 | 李小龙,9,152,6000,152,290 16 | 一代宗师-叶问,10,49,7500,194,171 17 | 2个钻,5,60,379,147,1070 18 | 金焘年,6,184,244,133,246 19 | 春丽,10,111,2580,144,177 20 | 霸天虎,9,130,261,153,206 21 | 正版激活,400,164,230,87,290 22 | -------------------------------------------------------------------------------- /data/第7章/新手教程路径留存人数统计.csv: -------------------------------------------------------------------------------- 1 | 事件行为,用户数 2 | 点击比牌,567 3 | 比牌规则结束,473 4 | 去游戏规则教程,454 5 | 跟注,454 6 | 加注ALLIN,425 7 | 完成后点击返回大厅,408 8 | -------------------------------------------------------------------------------- /data/第8章/.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jiabiao1602/Game_DataMining_With_R/fc3586dd9032adc364d9c8851521995c1a4d3072/data/第8章/.RData -------------------------------------------------------------------------------- /data/第8章/T值.csv: -------------------------------------------------------------------------------- 1 | day,T1,T2 2 | 1,1,1 3 | 2,1,1 4 | 3,1,1 5 | 4,1,1 6 | 5,1,1 7 | 6,1,1 8 | 7,1,1 9 | 8,0.9,0.9 10 | 9,0.9,0.9 11 | 10,0.9,0.9 12 | 11,0.9,0.9 13 | 12,0.9,0.9 14 | 13,0.9,0.9 15 | 14,0.9,0.9 16 | 15,0.85,0.85 17 | 16,0.85,0.85 18 | 17,0.85,0.85 19 | 18,0.85,0.85 20 | 19,0.85,0.85 21 | 20,0.85,0.85 22 | 21,0.85,0.85 23 | 22,0.8,0.8 24 | 23,0.8,0.8 25 | 24,0.8,0.8 26 | 25,0.8,0.8 27 | 26,0.8,0.8 28 | 27,0.8,0.8 29 | 28,0.8,0.8 30 | 29,0.75,0.75 31 | 30,0.75,0.75 32 | 31,0.75,0.75 33 | 32,0.75,0.75 34 | 33,0.75,0.75 35 | 34,0.75,0.75 36 | 35,0.75,0.75 37 | 36,0.7,0.7 38 | 37,0.7,0.7 39 | 38,0.7,0.7 40 | 39,0.7,0.7 41 | 40,0.7,0.7 42 | 41,0.7,0.7 43 | 42,0.7,0.7 44 | 43,0.65,0.65 45 | 44,0.65,0.65 46 | 45,0.65,0.65 47 | 46,0.65,0.65 48 | 47,0.65,0.65 49 | 48,0.65,0.65 50 | 49,0.65,0.65 51 | 50,0.6,0.6 52 | 51,0.6,0.6 53 | 52,0.6,0.6 54 | 53,0.6,0.6 55 | 54,0.6,0.6 56 | 55,0.6,0.6 57 | 56,0.6,0.6 58 | 57,0.55,0.55 59 | 58,0.55,0.55 60 | 59,0.55,0.55 61 | 60,0.55,0.55 62 | 61,0.55,0.55 63 | 62,0.55,0.55 64 | 63,0.55,0.55 65 | 64,0.5,0.5 66 | 65,0.5,0.5 67 | 66,0.5,0.5 68 | 67,0.5,0.5 69 | 68,0.5,0.5 70 | 69,0.5,0.5 71 | 70,0.5,0.5 72 | 71,0.45,0.45 73 | 72,0.45,0.45 74 | 73,0.45,0.45 75 | 74,0.45,0.45 76 | 75,0.45,0.45 77 | 76,0.45,0.45 78 | 77,0.45,0.45 79 | 78,0.45,0.45 80 | 79,0.45,0.45 81 | 80,0.45,0.45 82 | 81,0.45,0.45 83 | 82,0.45,0.45 84 | 83,0.45,0.45 85 | 84,0.45,0.45 86 | 85,0.45,0.45 87 | 86,0.45,0.45 88 | 87,0.45,0.45 89 | 88,0.45,0.45 90 | 89,0.45,0.45 91 | 90,0.42,0.45 92 | 91,0.42,0.45 93 | 92,0.42,0.45 94 | 93,0.42,0.45 95 | 94,0.42,0.45 96 | 95,0.42,0.45 97 | 96,0.42,0.45 98 | 97,0.42,0.45 99 | 98,0.42,0.45 100 | 99,0.42,0.45 101 | 100,0.42,0.45 102 | 101,0.42,0.45 103 | 102,0.42,0.45 104 | 103,0.42,0.45 105 | 104,0.42,0.45 106 | 105,0.42,0.45 107 | 106,0.42,0.45 108 | 107,0.42,0.45 109 | 108,0.42,0.45 110 | 109,0.42,0.45 111 | 110,0.42,0.45 112 | 111,0.42,0.45 113 | 112,0.35,0.4 114 | 113,0.35,0.4 115 | 114,0.35,0.4 116 | 115,0.35,0.4 117 | 116,0.35,0.4 118 | 117,0.35,0.4 119 | 118,0.35,0.4 120 | 119,0.35,0.4 121 | 120,0.35,0.4 122 | 121,0.35,0.4 123 | 122,0.35,0.4 124 | 123,0.35,0.4 125 | 124,0.35,0.4 126 | 125,0.35,0.4 127 | 126,0.35,0.4 128 | 127,0.35,0.4 129 | 128,0.35,0.4 130 | 129,0.35,0.4 131 | 130,0.35,0.4 132 | 131,0.35,0.4 133 | 132,0.35,0.4 134 | 133,0.35,0.4 135 | 134,0.35,0.4 136 | 135,0.35,0.4 137 | 136,0.35,0.4 138 | 137,0.35,0.4 139 | 138,0.35,0.4 140 | 139,0.35,0.4 141 | 140,0.35,0.4 142 | 141,0.35,0.4 143 | 142,0.35,0.4 144 | 143,0.35,0.4 145 | 144,0.35,0.4 146 | 145,0.35,0.4 147 | 146,0.35,0.4 148 | 147,0.35,0.4 149 | 148,0.35,0.4 150 | 149,0.35,0.4 151 | 150,0.35,0.4 152 | 151,0.35,0.4 153 | 152,0.3,0.35 154 | 153,0.3,0.35 155 | 154,0.3,0.35 156 | 155,0.3,0.35 157 | 156,0.3,0.35 158 | 157,0.3,0.35 159 | 158,0.3,0.35 160 | 159,0.3,0.35 161 | 160,0.3,0.35 162 | 161,0.3,0.35 163 | 162,0.3,0.35 164 | 163,0.3,0.35 165 | 164,0.3,0.35 166 | 165,0.3,0.35 167 | 166,0.3,0.35 168 | 167,0.3,0.35 169 | 168,0.3,0.35 170 | 169,0.3,0.35 171 | 170,0.3,0.35 172 | 171,0.3,0.35 173 | 172,0.3,0.35 174 | 173,0.3,0.35 175 | 174,0.3,0.35 176 | 175,0.3,0.35 177 | 176,0.3,0.35 178 | 177,0.3,0.35 179 | 178,0.3,0.35 180 | 179,0.3,0.35 181 | 180,0.3,0.35 182 | 181,0.3,0.35 183 | 182,0.3,0.35 184 | 183,0.3,0.35 185 | 184,0.3,0.35 186 | 185,0.3,0.35 187 | 186,0.3,0.35 188 | 187,0.3,0.35 189 | 188,0.3,0.35 190 | 189,0.3,0.35 191 | 190,0.3,0.35 192 | 191,0.3,0.35 193 | 192,0.25,0.3 194 | 193,0.25,0.3 195 | 194,0.25,0.3 196 | 195,0.25,0.3 197 | 196,0.25,0.3 198 | 197,0.25,0.3 199 | 198,0.25,0.3 200 | 199,0.25,0.3 201 | 200,0.25,0.3 202 | 201,0.25,0.3 203 | 202,0.25,0.3 204 | 203,0.25,0.3 205 | 204,0.25,0.3 206 | 205,0.25,0.3 207 | 206,0.25,0.3 208 | 207,0.25,0.3 209 | 208,0.25,0.3 210 | 209,0.25,0.3 211 | 210,0.25,0.3 212 | 211,0.25,0.3 213 | 212,0.25,0.3 214 | 213,0.25,0.3 215 | 214,0.25,0.3 216 | 215,0.25,0.3 217 | 216,0.25,0.3 218 | 217,0.25,0.3 219 | 218,0.25,0.3 220 | 219,0.25,0.3 221 | 220,0.25,0.3 222 | 221,0.25,0.3 223 | 222,0.25,0.3 224 | 223,0.25,0.3 225 | 224,0.25,0.3 226 | 225,0.25,0.3 227 | 226,0.25,0.3 228 | 227,0.25,0.3 229 | 228,0.25,0.3 230 | 229,0.25,0.3 231 | 230,0.25,0.3 232 | 231,0.25,0.3 233 | 232,0.2,0.25 234 | 233,0.2,0.25 235 | 234,0.2,0.25 236 | 235,0.2,0.25 237 | 236,0.2,0.25 238 | 237,0.2,0.25 239 | 238,0.2,0.25 240 | 239,0.2,0.25 241 | 240,0.2,0.25 242 | 241,0.2,0.25 243 | 242,0.2,0.25 244 | 243,0.2,0.25 245 | 244,0.2,0.25 246 | 245,0.2,0.25 247 | 246,0.2,0.25 248 | 247,0.2,0.25 249 | 248,0.2,0.25 250 | 249,0.2,0.25 251 | 250,0.2,0.25 252 | 251,0.2,0.25 253 | 252,0.2,0.25 254 | 253,0.2,0.25 255 | 254,0.2,0.25 256 | 255,0.2,0.25 257 | 256,0.2,0.25 258 | 257,0.2,0.25 259 | 258,0.2,0.25 260 | 259,0.2,0.25 261 | 260,0.2,0.25 262 | 261,0.2,0.25 263 | 262,0.2,0.25 264 | 263,0.2,0.25 265 | 264,0.2,0.25 266 | 265,0.2,0.25 267 | 266,0.2,0.25 268 | 267,0.2,0.25 269 | 268,0.2,0.25 270 | 269,0.2,0.25 271 | 270,0.2,0.25 272 | 271,0.2,0.25 273 | 272,0.15,0.2 274 | 273,0.15,0.2 275 | 274,0.15,0.2 276 | 275,0.15,0.2 277 | 276,0.15,0.2 278 | 277,0.15,0.2 279 | 278,0.15,0.2 280 | 279,0.15,0.2 281 | 280,0.15,0.2 282 | 281,0.15,0.2 283 | 282,0.15,0.2 284 | 283,0.15,0.2 285 | 284,0.15,0.2 286 | 285,0.15,0.2 287 | 286,0.15,0.2 288 | 287,0.15,0.2 289 | 288,0.15,0.2 290 | 289,0.15,0.2 291 | 290,0.15,0.2 292 | 291,0.15,0.2 293 | 292,0.15,0.2 294 | 293,0.15,0.2 295 | 294,0.15,0.2 296 | 295,0.15,0.2 297 | 296,0.15,0.2 298 | 297,0.15,0.2 299 | 298,0.15,0.2 300 | 299,0.15,0.2 301 | 300,0.15,0.2 302 | 301,0.15,0.2 303 | 302,0.15,0.2 304 | 303,0.15,0.2 305 | 304,0.15,0.2 306 | 305,0.15,0.2 307 | 306,0.15,0.2 308 | 307,0.15,0.2 309 | 308,0.15,0.2 310 | 309,0.15,0.2 311 | 310,0.15,0.2 312 | 311,0.15,0.2 313 | 312,0.1,0.15 314 | 313,0.1,0.15 315 | 314,0.1,0.15 316 | 315,0.1,0.15 317 | 316,0.1,0.15 318 | 317,0.1,0.15 319 | 318,0.1,0.15 320 | 319,0.1,0.15 321 | 320,0.1,0.15 322 | 321,0.1,0.15 323 | 322,0.1,0.15 324 | 323,0.1,0.15 325 | 324,0.1,0.15 326 | 325,0.1,0.15 327 | 326,0.1,0.15 328 | 327,0.1,0.15 329 | 328,0.1,0.15 330 | 329,0.1,0.15 331 | 330,0.1,0.15 332 | 331,0.1,0.15 333 | 332,0.1,0.15 334 | 333,0.1,0.15 335 | 334,0.1,0.15 336 | 335,0.1,0.15 337 | 336,0.1,0.15 338 | 337,0.1,0.15 339 | 338,0.1,0.15 340 | 339,0.1,0.15 341 | 340,0.1,0.15 342 | 341,0.1,0.15 343 | 342,0.1,0.15 344 | 343,0.1,0.15 345 | 344,0.1,0.15 346 | 345,0.1,0.15 347 | 346,0.1,0.15 348 | 347,0.1,0.15 349 | 348,0.1,0.15 350 | 349,0.1,0.15 351 | 350,0.1,0.15 352 | 351,0.05,0.1 353 | 352,0.05,0.1 354 | 353,0.05,0.1 355 | 354,0.05,0.1 356 | 355,0.05,0.1 357 | 356,0.05,0.1 358 | 357,0.05,0.1 359 | 358,0.05,0.1 360 | 359,0.05,0.1 361 | 360,0.05,0.1 362 | 361,0.05,0.1 363 | 362,0.05,0.1 364 | 363,0.05,0.1 365 | 364,0.05,0.1 366 | 365,0.05,0.1 367 | -------------------------------------------------------------------------------- /data/第8章/实际留存数据.csv: -------------------------------------------------------------------------------- 1 | day,Type1,Type2 2 | 1,0.383,0.313 3 | 2,0.268,0.200 4 | 3,0.216,0.151 5 | 4,0.187,0.125 6 | 5,0.167,0.108 7 | 6,0.156,0.097 8 | 7,0.145,0.088 9 | 8,0.131,0.078 10 | 9,0.119,0.070 11 | 10,0.111,0.064 12 | 11,0.105,0.060 13 | 12,0.101,0.056 14 | 13,0.099,0.054 15 | 14,0.096,0.052 16 | 15,0.090,0.047 17 | 16,0.084,0.044 18 | 17,0.079,0.041 19 | 18,0.076,0.040 20 | 19,0.074,0.038 21 | 20,0.073,0.037 22 | 21,0.072,0.036 23 | 22,0.068,0.034 24 | 23,0.065,0.032 25 | 24,0.062,0.031 26 | 25,0.060,0.029 27 | 26,0.059,0.029 28 | 27,0.058,0.028 29 | 28,0.058,0.028 30 | 29,0.055,0.026 31 | 30,0.053,0.025 32 | 31,0.051,0.024 33 | 32,0.049,0.023 34 | 33,0.048,0.023 35 | 34,0.048,0.022 36 | 35,0.047,0.022 37 | 36,0.045,0.021 38 | 37,0.044,0.020 39 | 38,0.042,0.020 40 | 39,0.041,0.019 41 | 40,0.041,0.019 42 | 41,0.040,0.019 43 | 42,0.040,0.018 44 | 43,0.039,0.018 45 | 44,0.037,0.017 46 | 45,0.036,0.016 47 | 46,0.035,0.016 48 | 47,0.035,0.016 49 | 48,0.034,0.016 50 | 49,0.034,0.015 51 | 50,0.033,0.015 52 | 51,0.032,0.014 53 | 52,0.031,0.014 54 | 53,0.030,0.014 55 | 54,0.030,0.014 56 | 55,0.030,0.014 57 | 56,0.030,0.013 58 | 57,0.029,0.013 59 | 58,0.028,0.013 60 | 59,0.027,0.012 61 | 60,0.027,0.012 62 | 61,0.026,0.012 63 | 62,0.026,0.012 64 | 63,0.026,0.012 65 | 64,0.026,0.011 66 | 65,0.025,0.011 67 | 66,0.024,0.011 68 | 67,0.024,0.011 69 | 68,0.024,0.011 70 | 69,0.023,0.011 71 | 70,0.023,0.010 72 | 71,0.023,0.010 73 | 72,0.022,0.010 74 | 73,0.022,0.010 75 | 74,0.021,0.010 76 | 75,0.021,0.009 77 | 76,0.021,0.009 78 | 77,0.021,0.009 79 | 78,0.020,0.009 80 | 79,0.020,0.009 81 | 80,0.019,0.009 82 | 81,0.019,0.009 83 | 82,0.019,0.009 84 | 83,0.019,0.009 85 | 84,0.019,0.008 86 | 85,0.018,0.008 87 | 86,0.018,0.008 88 | 87,0.018,0.008 89 | 88,0.017,0.008 90 | 89,0.017,0.008 91 | 90,0.017,0.008 92 | 91,0.017,0.008 93 | 92,0.017,0.008 94 | 93,0.016,0.007 95 | 94,0.016,0.007 96 | 95,0.016,0.007 97 | 96,0.016,0.007 98 | 97,0.016,0.007 99 | 98,0.016,0.007 100 | 99,0.015,0.007 101 | 100,0.015,0.007 102 | 101,0.015,0.007 103 | 102,0.014,0.007 104 | 103,0.014,0.007 105 | 104,0.014,0.007 106 | 105,0.014,0.007 107 | 106,0.014,0.006 108 | 107,0.014,0.006 109 | 108,0.014,0.006 110 | 109,0.013,0.006 111 | 110,0.013,0.006 112 | 111,0.013,0.006 113 | 112,0.013,0.006 114 | 113,0.013,0.006 115 | 114,0.013,0.006 116 | 115,0.013,0.006 117 | 116,0.012,0.006 118 | 117,0.012,0.006 119 | 118,0.012,0.006 120 | 119,0.013,0.006 121 | 120,0.012,0.006 122 | 121,0.012,0.005 123 | 122,0.012,0.005 124 | 123,0.012,0.005 125 | 124,0.012,0.005 126 | 125,0.012,0.005 127 | 126,0.012,0.005 128 | 127,0.012,0.005 129 | 128,0.011,0.005 130 | 129,0.011,0.005 131 | 130,0.011,0.005 132 | 131,0.011,0.005 133 | 132,0.011,0.005 134 | 133,0.011,0.005 135 | 134,0.011,0.005 136 | 135,0.010,0.005 137 | 136,0.010,0.005 138 | 137,0.010,0.005 139 | 138,0.010,0.005 140 | 139,0.010,0.005 141 | 140,0.010,0.005 142 | 141,0.010,0.004 143 | 142,0.010,0.004 144 | 143,0.010,0.004 145 | 144,0.010,0.004 146 | 145,0.009,0.004 147 | 146,0.010,0.004 148 | 147,0.010,0.004 149 | 148,0.009,0.004 150 | 149,0.009,0.004 151 | 150,0.009,0.004 152 | 151,0.009,0.004 153 | 152,0.009,0.004 154 | 153,0.009,0.004 155 | 154,0.009,0.004 156 | 155,0.009,0.004 157 | 156,0.009,0.004 158 | 157,0.009,0.004 159 | 158,0.009,0.004 160 | 159,0.009,0.004 161 | 160,0.009,0.004 162 | 161,0.009,0.004 163 | 162,0.009,0.004 164 | 163,0.008,0.004 165 | 164,0.008,0.004 166 | 165,0.008,0.004 167 | 166,0.008,0.004 168 | 167,0.008,0.004 169 | 168,0.008,0.004 170 | 169,0.008,0.004 171 | 170,0.008,0.004 172 | 171,0.008,0.003 173 | 172,0.008,0.003 174 | 173,0.008,0.003 175 | 174,0.008,0.003 176 | 175,0.008,0.003 177 | 176,0.008,0.003 178 | 177,0.008,0.003 179 | 178,0.007,0.003 180 | 179,0.007,0.003 181 | 180,0.007,0.003 182 | 181,0.008,0.003 183 | 182,0.008,0.003 184 | 183,0.007,0.003 185 | 184,0.007,0.003 186 | 185,0.007,0.003 187 | 186,0.007,0.003 188 | 187,0.007,0.003 189 | 188,0.007,0.003 190 | 189,0.007,0.003 191 | 190,0.007,0.003 192 | 191,0.007,0.003 193 | 192,0.007,0.003 194 | 193,0.007,0.003 195 | 194,0.007,0.003 196 | 195,0.007,0.003 197 | 196,0.007,0.003 198 | 197,0.007,0.003 199 | 198,0.007,0.003 200 | 199,0.007,0.003 201 | 200,0.006,0.003 202 | 201,0.006,0.003 203 | 202,0.006,0.003 204 | 203,0.007,0.003 205 | 204,0.006,0.003 206 | 205,0.006,0.003 207 | 206,0.006,0.003 208 | 207,0.006,0.003 209 | 208,0.006,0.003 210 | 209,0.006,0.003 211 | 210,0.006,0.003 212 | 211,0.006,0.003 213 | 212,0.006,0.003 214 | 213,0.006,0.003 215 | 214,0.006,0.003 216 | 215,0.006,0.003 217 | 216,0.006,0.003 218 | 217,0.006,0.003 219 | 218,0.006,0.003 220 | 219,0.006,0.003 221 | 220,0.006,0.002 222 | 221,0.006,0.002 223 | 222,0.006,0.002 224 | 223,0.006,0.002 225 | 224,0.006,0.002 226 | 225,0.006,0.002 227 | 226,0.005,0.002 228 | 227,0.005,0.002 229 | 228,0.005,0.002 230 | 229,0.005,0.002 231 | 230,0.005,0.002 232 | 231,0.005,0.002 233 | 232,0.005,0.002 234 | 233,0.005,0.002 235 | 234,0.005,0.002 236 | 235,0.005,0.002 237 | 236,0.005,0.002 238 | 237,0.005,0.002 239 | 238,0.005,0.002 240 | 239,0.005,0.002 241 | 240,0.005,0.002 242 | 241,0.005,0.002 243 | 242,0.005,0.002 244 | 243,0.005,0.002 245 | 244,0.005,0.002 246 | 245,0.005,0.002 247 | 246,0.005,0.002 248 | 247,0.005,0.002 249 | 248,0.005,0.002 250 | 249,0.005,0.002 251 | 250,0.004,0.002 252 | 251,0.005,0.002 253 | 252,0.005,0.002 254 | 253,0.004,0.002 255 | 254,0.004,0.002 256 | 255,0.004,0.002 257 | 256,0.004,0.002 258 | 257,0.004,0.002 259 | 258,0.004,0.002 260 | 259,0.004,0.002 261 | 260,0.004,0.002 262 | 261,0.004,0.002 263 | 262,0.004,0.002 264 | 263,0.004,0.002 265 | 264,0.004,0.002 266 | 265,0.004,0.002 267 | 266,0.004,0.002 268 | 267,0.004,0.002 269 | 268,0.004,0.002 270 | 269,0.004,0.002 271 | 270,0.004,0.002 272 | 271,0.004,0.002 273 | 272,0.004,0.002 274 | 273,0.004,0.002 275 | 274,0.004,0.002 276 | 275,0.004,0.002 277 | 276,0.004,0.002 278 | 277,0.004,0.002 279 | 278,0.004,0.002 280 | 279,0.004,0.002 281 | 280,0.004,0.002 282 | 281,0.004,0.002 283 | 282,0.004,0.002 284 | 283,0.004,0.002 285 | 284,0.004,0.002 286 | 285,0.004,0.002 287 | 286,0.004,0.002 288 | 287,0.004,0.002 289 | 288,0.004,0.002 290 | 289,0.004,0.001 291 | 290,0.003,0.001 292 | 291,0.003,0.001 293 | 292,0.003,0.001 294 | 293,0.003,0.001 295 | 294,0.003,0.001 296 | 295,0.003,0.001 297 | 296,0.003,0.001 298 | 297,0.003,0.001 299 | 298,0.003,0.001 300 | 299,0.003,0.001 301 | 300,0.003,0.001 302 | 301,0.003,0.001 303 | 302,0.003,0.001 304 | 303,0.003,0.001 305 | 304,0.003,0.001 306 | 305,0.003,0.001 307 | 306,0.003,0.001 308 | 307,0.003,0.001 309 | 308,0.003,0.001 310 | 309,0.003,0.001 311 | 310,0.003,0.001 312 | 311,0.003,0.001 313 | 312,0.003,0.001 314 | 313,0.003,0.001 315 | 314,0.003,0.001 316 | 315,0.003,0.001 317 | 316,0.003,0.001 318 | 317,0.003,0.001 319 | 318,0.003,0.001 320 | 319,0.003,0.001 321 | 320,0.003,0.001 322 | 321,0.003,0.001 323 | 322,0.003,0.001 324 | 323,0.003,0.001 325 | 324,0.003,0.001 326 | 325,0.003,0.001 327 | 326,0.003,0.001 328 | 327,0.003,0.001 329 | 328,0.003,0.001 330 | 329,0.003,0.001 331 | 330,0.003,0.001 332 | 331,0.003,0.001 333 | 332,0.002,0.001 334 | 333,0.002,0.001 335 | 334,0.002,0.001 336 | 335,0.002,0.001 337 | 336,0.003,0.001 338 | 337,0.003,0.001 339 | 338,0.002,0.001 340 | 339,0.002,0.001 341 | 340,0.002,0.001 342 | 341,0.002,0.001 343 | 342,0.002,0.001 344 | 343,0.002,0.001 345 | 344,0.002,0.001 346 | 345,0.002,0.001 347 | 346,0.002,0.001 348 | 347,0.002,0.001 349 | 348,0.002,0.001 350 | 349,0.002,0.001 351 | 350,0.002,0.001 352 | 351,0.002,0.001 353 | 352,0.002,0.001 354 | 353,0.002,0.001 355 | 354,0.002,0.001 356 | 355,0.002,0.001 357 | 356,0.002,0.001 358 | 357,0.002,0.001 359 | 358,0.002,0.001 360 | 359,0.002,0.001 361 | 360,0.002,0.001 362 | 361,0.002,0.001 363 | 362,0.002,0.001 364 | 363,0.002,0.001 365 | 364,0.002,0.001 366 | 365,0.002,0.001 367 | -------------------------------------------------------------------------------- /data/第9章/Links.csv: -------------------------------------------------------------------------------- 1 | Source,Target,Weight 2 | 1,0,1 3 | 2,0,8 4 | 3,0,10 5 | 3,2,6 6 | 4,0,1 7 | 5,0,1 8 | 6,0,1 9 | 7,0,1 10 | 8,0,2 11 | 9,0,1 12 | 11,10,1 13 | 11,3,3 14 | 11,2,3 15 | 11,0,5 16 | 12,11,1 17 | 13,11,1 18 | 14,11,1 19 | 15,11,1 20 | 17,16,4 21 | 18,16,4 22 | 18,17,4 23 | 19,16,4 24 | 19,17,4 25 | 19,18,4 26 | 20,16,3 27 | 20,17,3 28 | 20,18,3 29 | 20,19,4 30 | 21,16,3 31 | 21,17,3 32 | 21,18,3 33 | 21,19,3 34 | 21,20,5 35 | 22,16,3 36 | 22,17,3 37 | 22,18,3 38 | 22,19,3 39 | 22,20,4 40 | 22,21,4 41 | 23,16,3 42 | 23,17,3 43 | 23,18,3 44 | 23,19,3 45 | 23,20,4 46 | 23,21,4 47 | 23,22,4 48 | 23,12,2 49 | 23,11,9 50 | 24,23,2 51 | 24,11,7 52 | 25,24,13 53 | 25,23,1 54 | 25,11,12 55 | 26,24,4 56 | 26,11,31 57 | 26,16,1 58 | 26,25,1 59 | 27,11,17 60 | 27,23,5 61 | 27,25,5 62 | 27,24,1 63 | 27,26,1 64 | 28,11,8 65 | 28,27,1 66 | 29,23,1 67 | 29,27,1 68 | 29,11,2 69 | 30,23,1 70 | 31,30,2 71 | 31,11,3 72 | 31,23,2 73 | 31,27,1 74 | 32,11,1 75 | 33,11,2 76 | 33,27,1 77 | 34,11,3 78 | 34,29,2 79 | 35,11,3 80 | 35,34,3 81 | 35,29,2 82 | 36,34,2 83 | 36,35,2 84 | 36,11,2 85 | 36,29,1 86 | 37,34,2 87 | 37,35,2 88 | 37,36,2 89 | 37,11,2 90 | 37,29,1 91 | 38,34,2 92 | 38,35,2 93 | 38,36,2 94 | 38,37,2 95 | 38,11,2 96 | 38,29,1 97 | 39,25,1 98 | 40,25,1 99 | 41,24,2 100 | 41,25,3 101 | 42,41,2 102 | 42,25,2 103 | 42,24,1 104 | 43,11,3 105 | 43,26,1 106 | 43,27,1 107 | 44,28,3 108 | 44,11,1 109 | 45,28,2 110 | 47,46,1 111 | 48,47,2 112 | 48,25,1 113 | 48,27,1 114 | 48,11,1 115 | 49,26,3 116 | 49,11,2 117 | 50,49,1 118 | 50,24,1 119 | 51,49,9 120 | 51,26,2 121 | 51,11,2 122 | 52,51,1 123 | 52,39,1 124 | 53,51,1 125 | 54,51,2 126 | 54,49,1 127 | 54,26,1 128 | 55,51,6 129 | 55,49,12 130 | 55,39,1 131 | 55,54,1 132 | 55,26,21 133 | 55,11,19 134 | 55,16,1 135 | 55,25,2 136 | 55,41,5 137 | 55,48,4 138 | 56,49,1 139 | 56,55,1 140 | 57,55,1 141 | 57,41,1 142 | 57,48,1 143 | 58,55,7 144 | 58,48,7 145 | 58,27,6 146 | 58,57,1 147 | 58,11,4 148 | 59,58,15 149 | 59,55,5 150 | 59,48,6 151 | 59,57,2 152 | 60,48,1 153 | 60,58,4 154 | 60,59,2 155 | 61,48,2 156 | 61,58,6 157 | 61,60,2 158 | 61,59,5 159 | 61,57,1 160 | 61,55,1 161 | 62,55,9 162 | 62,58,17 163 | 62,59,13 164 | 62,48,7 165 | 62,57,2 166 | 62,41,1 167 | 62,61,6 168 | 62,60,3 169 | 63,59,5 170 | 63,48,5 171 | 63,62,6 172 | 63,57,2 173 | 63,58,4 174 | 63,61,3 175 | 63,60,2 176 | 63,55,1 177 | 64,55,5 178 | 64,62,12 179 | 64,48,5 180 | 64,63,4 181 | 64,58,10 182 | 64,61,6 183 | 64,60,2 184 | 64,59,9 185 | 64,57,1 186 | 64,11,1 187 | 65,63,5 188 | 65,64,7 189 | 65,48,3 190 | 65,62,5 191 | 65,58,5 192 | 65,61,5 193 | 65,60,2 194 | 65,59,5 195 | 65,57,1 196 | 65,55,2 197 | 66,64,3 198 | 66,58,3 199 | 66,59,1 200 | 66,62,2 201 | 66,65,2 202 | 66,48,1 203 | 66,63,1 204 | 66,61,1 205 | 66,60,1 206 | 67,57,3 207 | 68,25,5 208 | 68,11,1 209 | 68,24,1 210 | 68,27,1 211 | 68,48,1 212 | 68,41,1 213 | 69,25,6 214 | 69,68,6 215 | 69,11,1 216 | 69,24,1 217 | 69,27,2 218 | 69,48,1 219 | 69,41,1 220 | 70,25,4 221 | 70,69,4 222 | 70,68,4 223 | 70,11,1 224 | 70,24,1 225 | 70,27,1 226 | 70,41,1 227 | 70,58,1 228 | 71,27,1 229 | 71,69,2 230 | 71,68,2 231 | 71,70,2 232 | 71,11,1 233 | 71,48,1 234 | 71,41,1 235 | 71,25,1 236 | 72,26,2 237 | 72,27,1 238 | 72,11,1 239 | 73,48,2 240 | 74,48,2 241 | 74,73,3 242 | 75,69,3 243 | 75,68,3 244 | 75,25,3 245 | 75,48,1 246 | 75,41,1 247 | 75,70,1 248 | 75,71,1 249 | 76,64,1 250 | 76,65,1 251 | 76,66,1 252 | 76,63,1 253 | 76,62,1 254 | 76,48,1 255 | 76,58,1 256 | -------------------------------------------------------------------------------- /data/第9章/Nodes.csv: -------------------------------------------------------------------------------- 1 | Id,Label,Group,Level 2 | 0,user1,1,15 3 | 1,user2,1,20 4 | 2,user3,1,23 5 | 3,user4,1,30 6 | 4,user5,1,11 7 | 5,user6,1,9 8 | 6,user7,1,11 9 | 7,user8,1,30 10 | 8,user9,1,8 11 | 9,user10,1,29 12 | 10,user11,2,29 13 | 11,user12,2,9 14 | 12,user13,3,18 15 | 13,user14,2,12 16 | 14,user15,2,16 17 | 15,user16,2,22 18 | 16,user17,3,21 19 | 17,user18,3,11 20 | 18,user19,3,19 21 | 19,user20,3,10 22 | 20,user21,3,8 23 | 21,user22,3,13 24 | 22,user23,3,25 25 | 23,user24,3,30 26 | 24,user25,4,23 27 | 25,user26,4,14 28 | 26,user27,5,12 29 | 27,user28,4,17 30 | 28,user29,0,29 31 | 29,user30,2,7 32 | 30,user31,3,12 33 | 31,user32,2,28 34 | 32,user33,2,19 35 | 33,user34,2,10 36 | 34,user35,2,12 37 | 35,user36,2,23 38 | 36,user37,2,30 39 | 37,user38,2,15 40 | 38,user39,2,18 41 | 39,user40,4,22 42 | 40,user41,6,28 43 | 41,user42,4,11 44 | 42,user43,4,8 45 | 43,user44,5,7 46 | 44,user45,0,23 47 | 45,user46,0,17 48 | 46,user47,7,30 49 | 47,user48,7,15 50 | 48,user49,8,21 51 | 49,user50,5,14 52 | 50,user51,5,26 53 | 51,user52,5,19 54 | 52,user53,5,8 55 | 53,user54,5,27 56 | 54,user55,5,29 57 | 55,user56,8,19 58 | 56,user57,5,9 59 | 57,user58,8,30 60 | 58,user59,8,28 61 | 59,user60,8,20 62 | 60,user61,8,7 63 | 61,user62,8,8 64 | 62,user63,8,8 65 | 63,user64,8,26 66 | 64,user65,8,25 67 | 65,user66,8,10 68 | 66,user67,8,29 69 | 67,user68,9,23 70 | 68,user69,4,8 71 | 69,user70,4,17 72 | 70,user71,4,23 73 | 71,user72,4,17 74 | 72,user73,5,13 75 | 73,user74,10,29 76 | 74,user75,10,25 77 | 75,user76,4,16 78 | 76,user77,8,6 79 | -------------------------------------------------------------------------------- /data/第9章/道具分类.csv: -------------------------------------------------------------------------------- 1 | 道具,分类 2 | 0.1元大礼包,礼包 3 | 10块滑板,滑板 4 | 15000金币,金币 5 | 15元大礼包,礼包 6 | 1条钥匙,钥匙 7 | 20条钥匙,钥匙 8 | 3000金币,金币 9 | 38000金币,金币 10 | 50条钥匙,钥匙 11 | 60块滑板,滑板 12 | 70000金币,金币 13 | 8条钥匙,钥匙 14 | 8元大礼包,礼包 15 | 超级大礼包,礼包 16 | 超值大礼包,礼包 17 | 感恩大礼包,礼包 18 | 解锁滑板,滑板 19 | 快速复活,其他 20 | 首次复活0.1元,其他 21 | 数据备份,其他 22 | 双倍金币,金币 23 | 特级大礼包,礼包 24 | 特殊滑板,滑板 25 | 限量版角色,其他 26 | 新手礼包,礼包 27 | 正版激活,其他 28 | , 29 | --------------------------------------------------------------------------------