前言我们通过OLTP(OnlineTransactionProcessing)系统对用户数据进行实时处理,同时也需要在OLAP(OnlineAnalyticalProcessing)系统中进行分析。今天我们就来看看如何使用SQL分析数据。使用SQL进行数据分析的几种方式在DBMS(数据库管理系统)中,一些数据库很好地集成了BI工具,可以方便的对收集到的数据进行业务分析。例如,SQLServer中提供了BI分析工具,我们可以使用SQLServer中的AnalysisServices完成数据挖掘任务。SQLServer内置了多种数据挖掘算法,如常用的EM、K-Means聚类算法、决策树、朴素贝叶斯和逻辑回归等分类算法,以及神经网络等模型。我们还可以将这些算法模型可视化,帮助我们优化和评估算法模型的好坏。此外,PostgreSQL是一个免费开源的关系数据库(ORDBMS),非常稳定和强大,在OLTP和OLAP系统上表现非常好。同时,在机器学习方面,与Madlib项目的合作可以让PostgreSQL如虎添翼。Madlib包括多种机器学习算法,如分类、聚类、文本分析、回归分析、关联规则挖掘和验证分析。这样我们就可以通过SQL来使用PostgreSQL中的各种机器学习算法模型来帮助我们进行数据挖掘和分析。2018年,谷歌将机器学习(MachineLearning)工具集成到BigQuery中,发布了BigQueryML,让开发者可以在大型结构化或半结构化数据集上构建和使用机器学习模型。通过BigQuery控制台,开发者可以使用SQL语句完成机器学习模型的训练和预测。SQLFlow是蚂蚁金服2019年开源的机器学习工具,我们可以通过SQL来调用机器学习算法。您可以将SQLFlow理解为机器学习翻译器。我们可以通过在SELECT语句后添加TRAIN子句来完成机器学习模型的训练,在SELECT语句后添加PREDICT可以将模型用于预测。这些算法模型既包括传统的机器学习模型,也包括基于Tensorflow、PyTorch等框架的深度学习模型。从上图中可以看出使用SQLFlow的过程。首先,我们可以使用Jupyternotebook来完成SQL语句的交互。SQLFlow支持多种SQL引擎,包括MySQL、Oracle、Hive、SparkSQL、Flink,这样我们就可以通过SQL语句从这些DBMS数据库中提取数据,然后选择需要的机器学习算法(包括传统机器学习和深度学习)模型)进行训练和预测。不过这个工具刚刚上线,在工具、文档、社区等方面还有很多需要完善的地方。最后一种也是最常用的方法就是SQL+Python,这也是我们今天要重点介绍的。上面介绍的这些工具可以说不仅仅是SQL查询数据的入口,更是数据分析和机器学习的入口。但是,这些模块是高度耦合的,使用起来可能会出现问题。一方面,工具将非常庞大。比如安装SQLFlow时,使用Docker安装,整体下载的文件会超过2G。同时,在进行算法调优时也存在灵活性较差的情况。因此,最直接的方式就是将SQL从数据分析模块中分离出来,使用SQL读取数据,然后使用Python处理数据分析。案例:挖掘购物数据中的频繁项集和关联规则下面用一个案例来详细说明。我们要分析的是购物问题,用到的技术是关联分析。它可以帮助我们在大量的数据集中找到商品之间的关系,从而挖掘出人们经常购买的商品组合。一个经典的例子就是“啤酒和尿布”的例子。今天我们的数据集来自一个购物样本数据。字段包括trans_id(交易ID)和product(产品名称)。具体的数据集可以参考下面的初始化sql:DROPTABLEIFEXISTStest_data;CREATETABLEtest_data(trans_idINT,productTEXT);INSERTINTOtest_dataVALUES(1,'beer');INSERTINTOtest_dataVALUES(1,'diapers');INSERTINTOtest_dataVALUES(1,'chips');INSERTINTTOtest_dataVALUES(2,'啤酒');INSERTINTOtest_dataVALUES(2,'尿布');INSERTINTOtest_dataVALUES(3,'啤酒');插入测试数据值(3,“尿布”);插入测试数据值(4,“啤酒”);插入测试数据值(4,“筹码”);插入测试数据值(5,“啤酒”);插入测试数据值(6,“啤酒”);插入测试数据值(6,'尿布');INSERTINTOtest_dataVALUES(6,'薯片');INSERTINTOtest_dataVALUES(7,'啤酒');INSERTINTOtest_dataVALUES(7,'尿布');这里我们使用的关联分析算法是Ap??riori算法,它可以帮助我们找到频繁项集,首先我们要了解什么是频繁项集。频繁项集是支持度大于或等于最小支持度阈值的项集,支持度小于该最小值的项集为不频繁项集,支持度大于或等于最小支持度的项集为频繁项集。支持度是一个百分比,指的是产品组合出现的次数与总次数的比值。支持度越高,这种组合出现的频率就越大。让我们看一下Apriori算法的基本原理。Apriori算法其实就是寻找频繁项集的过程:0.设置一个最小支持度,1.从K=1开始,过滤频繁项集。2、在结果中,组合K+1个项目集,重新筛选3、循环1、2步骤。直到没有找到结果,K-1项集的结果就是最终的结果。我们看数据就明白了,下面都是订单,每个订单购买的商品:本例中“啤酒”出现了7次,那么这7次订单中“牛奶”的支持度为7/7=1.同样,“啤酒+纸尿裤”出现了5次,则这7个订单中的支持度为5/7=0.71。同时,我们还需要了解一个概念,叫做“置信度”,它表示当你购买产品A时,你购买产品B的可能性有多大。本例中,置信度(啤酒→纸尿裤)=5/7=0.71,这意味着如果你买啤酒,你有71%的概率会买尿布;Confidence(beer→chips)=3/7=0.43,也就是说如果你买啤酒,你有43%的概率会买chipsstrip。所以置信度是一个条件概念,指的是当A发生时B发生的概率。我们在计算关联关系时,往往需要指定最小支持度和最小置信度,这样才能找到大于或等于最小支持度的频繁项集,并在频繁项集的基础上,关联规则大于或等于最低置信度。使用MADlib+PostgreSQL完成购物数据的关联分析对于上面购物数据关联分析的案例,我们可以使用工具自带的关联规则进行分析。下面我们演示使用PostgreSQL数据库在Madlib工具中可以找到对应的关联规则。关联规则的调用分析可以通过编写SQL来完成。开发环境Windows/MacOSNavicatPremium11.2.7及以上服务器环境Centos7.6DockerPostgreSQL9.6MADlib1.4及以上使用Docker安装MADlib+PostgreSQL拉取docker镜像(本镜像提供所需的postgres等环境,madlib为未安装):dockerpullmadlib/postgres_9.6:latest下载MADlibgithub源代码。假设下载的源码位置是/home/git-repo/github/madlib:cd/home/git-repo/github&&gitclonegit@github.com:apache/madlib.git启动容器,并建立本地目录之间的路径映射和容器中的系统,共享目录在容器和本机之间读写共享。dockerrun-d-it--namemadlib-v/home/git-repo/github/madlib:/incubator-madlib/madlib/postgres_9.6启动容器后,连接容器编译MADlib组件,编译大约需要30分钟:dockerexec-itmadlibbashmkdir/incubator-madlib/build-dockercd/incubator-madlib/build-dockercmake..makemakedocmakeinstall在容器中安装MADlib:src/bin/madpack-ppostgres-cpostgres/postgres@localhost:5432/postgresinstall运行MADlib测试:#Runinstallcheck,onallmodules:src/bin/madpack-ppostgres-cpostgres/postgres@localhost:5432/postgresinstall-check#Runinstallcheck,onaspecificmodule,saysvm:src/bin/madpack-ppostgres-cpostgres/postgres@localhost:5432/postgresinstall-check-tsvm#Rundevcheck,在所有模块上(比安装检查更全面):src/bin/madpack-ppostgres-cpostgres/postgres@localhost:5432/postgresdev-check#Rundevcheck,onaspecificmodule,saysvm:src/bin/madpack-ppostgres-cpostgres/postgres@localhost:5432/postgresdev-check-tsvm#如有必要,重新安装ReinstallMADlib:src/bin/madpack-ppostgres-cpostgres/postgres@localhost:5432/postgresreinstall需要的话关闭删除删除容器,然后重启新容器重新安装:dockerkillmadlibdockerrmmadlib用配置好的容器创建新镜像,先查看容器ID,创建新镜像容器ID:dockerps-adockercommit
