注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

零售创新,创新那些事儿,SPSS,VBA

零售创新

 
 
 

日志

 
 
关于我

新浪微博,零售创新 研究经理,数据分析师 希望和市场研究和零售业的同事共同进步! 本博客发表的都是免费或试用的资料,如果有版权问题请发邮件wangli12a@163.com联系删除。 spss excel vba blog

网易考拉推荐

spss syntax 文件操作之旅  

2012-03-20 16:29:18|  分类: spss学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 首先,新建一个syntax文件。从数据编辑窗口,打开"File"菜单, 然后依次选择"New", "Syntax."
SPSS syntax的命令都是以"."结尾的。如果要加注释的话,有两种方式可以选择,以"*"或"comment"命令开始。需要注意的是,如果没有以"."结束注释,SPSS会将"*"或"comment"与下一个"."之间的语句都作为注释。要是这样的话,你的好多语句就偷工了,呵呵。
如何在命令中打开一个数据文件?
SPSS syntax中实现打开数据功能的命令是"get file 'file path and file name'",当然了,文件的扩展名是必不可少的,格式为".sav"。例如:get file 'd:\data.sav'.
如同学习其他的程序语言一样,下一节我们首先要学习如何在SPSS syntax中创建变量。

 

SAS也好,SPSS也好,都只是数据分析的工具,统计分析方法的原理懂了,各类问题也就迎难而解。熟话说的好,杀鸡焉用牛刀,平时整理汇总少量的数据时,并不需要用SPSS、SAS等数据分析软件,EXCEL足以解决问题。而作为一个SPSS用户,不会Syntax编写程序解决问题    SAS也好,SPSS也好,都只是数据分析的工具,统计分析方法的原理懂了,各类问题也就迎难而解。熟话说的好,杀鸡焉用牛刀,平时整理汇总少量的数据时,并不需要用SPSS、SAS等数据分析软件,EXCEL足以解决问题。而作为一个SPSS用户,不会Syntax编写程序解决问题是怎么也说不过去的,从数据的输入到结果的产生都可以用syntax解决,特别是多次重复操作情况下syntax更能发挥事半功倍的效果。

   SPSS 16.0以后的版本在Syntax方面大大增强,关键字自动完成、颜色编码、断点等在其他程序开发工具的元素也都引用了过来,并且很多的基础函数是和VB通用的,说白了就是英语简单的变化一下。

 

一、Syntax语法规则知多少

? 每条命令必须从新行开始(在新行中任一列开始都没关系),但你是否知道END DATA语句必须在数据结尾之后第一行的第一列中开始呢?

? 每个命令应该以句点(.)为命令终止符,但你是否又知道BEGIN DATA语句及没有句点作为命令终止符,则将空行默认为命令终止符的特殊情况呢?(注:命令语法的每行不能超过 256 个字节)

? 大多数子命令由斜杠 (/) 分隔。但你是否又知道第一条子命令前面的斜杠是可要可不要的呢?如:

data list free /var1 var2.

? 单引号或双引号内包含的文本必须包含在单独一行上。

? 区域设置或语言环境设置,必须使用句点 (.) 指示小数。

? 命令语法不区分大小写,三个字母或四个字母的缩写并无区别。例如,

FREQUENCIES VARIABLES=JOBCAT GENDER  /PERCENTILES=25 50 75 /BARCHART. 和 freq var=jobcat gender /percent=25 50 75 /bar. 它们生成的结果并无差别。

? 你是否知道Include等语句引用的syntax文件中的所有命令必须从第一列开始?而要缩进指定的命令以提高命令文件的可读性,则可以在第一列中使用加号 (+) 或减号 (–)。

? 你是否知道,当引用syntax文件中的语法一行不能超过 256 个字节;超过的部分将被截断作为额外的字符。

 

PS:在数据处理前要注意对原数据文件的保护,特别是DATABASE、TXT、EXCEL等非SPSS格式文件,通常保护这些文件可以将其备份或是设为只读文件。


生活中,我们常常因为这样或那样的事情而需要从一个城市到另外一个城市。旅途前,我们需要考虑旅途中的各个环节,比如说确定旅行方式(水、陆、空的选择),交通工具的选择及出行站点、出行车次(航班)等等。而把各种形式的数据按照自己的要求转换为SPSS格    生活中,我们常常因为这样或那样的事情而需要从一个城市到另外一个城市。旅途前,我们需要考虑旅途中的各个环节,比如说确定旅行方式(水、陆、空的选择),交通工具的选择及出行站点、出行车次(航班)等等。而把各种形式的数据按照自己的要求转换为SPSS格式数据,就好比我们从一个城市到另一个城市,而SPSS格式的数据就是我们的目的地。

    和现实生活一样,利用Syntax将各种形式的数据转换为我们所需的SPSS格式数据也需要我们像旅途一样考虑一些细节问题。例如:我们从一个数据库文档中读取我们所需的数据,首先确定SPSS与数据库间采用何种连接方式(ODBC或JDBC),然后确定采集的数据来自何种数据库(Oracle,DB2,SQL SERVER,ACCESS等),接下来就是确定类似出发站点、车次等一系列细节问题。这样说来好像有点玄乎,下面将结合实例,看Syntax是如何一步一步的从数据库、EXCEL、TXT等格式文档中提取数据。

 

一、从数据库中读取数据

     由于从数据库中读取数据需要输入的代码比较繁琐,一般来说先利用菜单向导操作,在结束前利用Paste将操作大致代码导入Syntax编辑窗口中,然后再根据自己的需要对代码做适当的修改。例如:

GET DATA                  ***告诉SPSS你此行的目的,得到数据***.

/TYPE=ODBC                ***接下来就是选择海陆空了,omgd!是ODBC****.

/CONNECT=                 ***交通工具的选择及细节,利用交通工具将两地连起来就有了CONNECT***.
'DSN=Microsoft Access;DBQ=c:\mydocuments\dm_demo.mdb;'+       (通常这些细节都利用向导直接生成)
' DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;'
/SQL = 'SELECT * FROM CombinedTable'.

***上面安置完毕,到达目的地了,/SQL就好比你到目的地后所做之事***.
EXECUTE.

    上面Syntax的作用是将ACCESS数据库中CombinedTable表中所有数据导入SPSS,上面Syntax语句中红色标注的可以说是此语句的核心部分,①、/connect子语句说明从何种数据库从提取数据及提取相关细节,此过程通常由向导生成,一般需要用时复制-粘贴即可;②、/SQL子语句相比/CONNECT语句则是重中之重,也是此次旅途的终极目的。如果从2个不同的表中选取变量,则是

/SQL =
'SELECT * FROM [table1],[table2]'
' WHERE [conditions]'.
还有select与group by,order by,having 等语句联合运用的情况,更多SQL语法知识则需参考数据库相关书籍(这也是目前许多公司要求做数据分析的懂数据库的原因之一)。

   注:单纯从数据库中提取数据并不需要太多数据库知识,单纯了解SQL查询语言就可以了,个人建议读读《SQL循序渐进》。

 

二、从EXCEL格式文件中读取数据

   利用Syntax语句从EXCEL中读取数据并没有太多的技巧,数据读取过程可以简单的分为2类,一类是读取单表数据,另一类则是读取多表数据(与从数据库中读取数据语法类似,只是/CONNECT语句稍有不同)。首先简单的说说第一类从单表中读取数据,例如:从我的文档中读取名叫data的EXCEL工作薄中表salary的[A3:H160]的数据,且将读取数据的第一行作为变量名,其Syntax代码如下:

get data                           ***①告诉SPSS,你的目的—得到数据(get data)***.

/type=xls                          ***②读的数据是什么类型(XLS OR XLSM<EXCEL2007>)***.

/file="C:/mydocuments/data.xls".   ***③告诉SPSS文档的位置***.

/sheet=name 'salary'               ***④告诉SPSS你要读取那个表(缺失时自动读取第一个表)***.

/cellrange=range 'A3:H160'         ***⑤告诉SPSS你要读取表中那些数据***.

/readnames=on.                     ***⑥将读取数据的第一行设置为变量名***.

上面语法明确的表达你的意图,再联系我们在旅途中的种种行为,这个语句就轻而易举的被攻克了。值得一提的是,上面语句中的④⑤⑥三个子语句都可省略,省略后SPSS将从工作薄中第一个表读取所有数据,并将第一行默认为变量名,如果第一行为空,变量名则默认为VAR1,VAR2……,这一过程和利用菜单向导操作效果一样,下面说说怎样从多个表中读取数据,例如:

 GET DATA
/TYPE=ODBC
/CONNECT=
'DSN=Excel Files;DBQ=c:\examples\data\sales.xls;' +
'DriverId=790;MaxBufferSize=2048;PageTimeout=5;'
/SQL =
'SELECT Location$.[Store Number], State, Region, City,'
' Power, Hand, Accessories,'
' Tires, Batteries, Gizmos, Dohickeys'
' FROM [Location$], [Tools$], [Auto$]'
' WHERE [Tools$].[Store Number]=[Location$].[Store Number]'
' AND [Auto$].[Store Number]=[Location$].[Store Number]'. 

上面的代码和从数据库中读取表数据完全一样,只是在/CONNECT语句上做了些许变化,其他的并无区别,当然重点还是后面的提取数据变量语句/SQL,这里要说明的是如果提取变量字符中含有空格的话就需要用[ ]给框起来了,正如上面示例代码所示。 另外,不得不提的是从多表中读取数据较从单表中读取数据的一些局限性,比如不能像单表一样随意选择数据读取范围;读取表中的第一行非空字符都将强制读取为SPSS中的变量;变量类型较单一,只提供了数字和字符两种数据类型等等。

 

三、从TXT格式文件中读取数据

   利用向导从TXT格式文件从读取数据有时候会因数据格式整洁而很方便,有时又会因为格式混乱而使你后面的分析工作变的麻烦,而利用代码则可以一次解决这种问题。通常读取文本格式数据语句分为get data和data list两种,采用何种语句完全凭个人喜好,当然两种方式各有所长,比如CSV文件或是很大的容量的文本数据用get data较data list就方便的多,而在处理程序内数据(begin data……end data)或结构相对较复杂的数据时用data list语句则较get data语句更方便些。根据文本数据格式,data list语句又有data list free/list/fixed之分,这里不便一一道来,通常一般的TXT格式的数据我们很少遇到,这里主要说说从网站数据库中导出的CSV格式的数据转换情况,例如,我们从网站中导出如下CSV格式的数据dara.csv:

ID,Name,Gender,Date Hired,Department
1,"Foster, Chantal",f,10/29/1998,1
2,"Healy, Jonathan",m,3/1/1992,3
3,"Walter, Wendy",f,1/23/1995,2
4,"Oliver, Kendall",f,10/28/2003,2

下面我们将像旅途一样将此csv格式的数据转换为我们所需的.sav格式,

get data                          ***①告诉SPSS,你的目的***.

/type=txt                         ***②告诉SPSS你要乘车还是坐船***.

/file='c:/mydocuments/data.csv'   ***③找到车站码头***.

/delimiters= ","                  ***④司机强调路上安全(数据用","分隔)***.

/qualifier='" '         ***⑤司机介绍如何处理突发事故(比如数据中包含空格,逗号等特殊情况)***.
/arrangement=delimited            ***⑥其他注意情况(限制情况)***.     

/firstcase=2                      ***⑦找到自己的座位(从第2行开始读取数据)***.
/variables= ID F3 Name A15 Gender A1
Date_Hired ADATE10 Department F1. ***⑧到了目的地确定适宜(设定变量名及格式)***.

     此次Syntax旅途暂告一段落,当然还有许多其他格式的数据,这里不一一列举,但通常都可以像旅途一样实行转换目的。

  
SPSS 14.0以后,各数据集就进入了群雄纷争的时代,一时出现众数据集争奇斗艳的情形,但最闪亮的却只有一个,为了调和众数据集的矛盾,DATASET五壮士粉墨登场,他们有时充当户籍管理员的工作,有时一马当先,有时因救死扶伤而进行数据克隆,有时为了调停矛盾    SPSS 14.0以后,各数据集就进入了群雄纷争的时代,一时出现众数据集争奇斗艳的情形,但最闪亮的却只有一个,为了调和众数据集的矛盾,DATASET五壮士粉墨登场,他们有时充当户籍管理员的工作,有时一马当先,有时因救死扶伤而进行数据克隆,有时为了调停矛盾,当机立断斩乱麻,总之他们为了数据集的和谐费解心思,用尽手段。

  

   人物介绍

1、DATASET NAME,主要充当户籍管理员的角色,常常作用于当前数据集

2、DATASET ACTIVATE,主要起数据集激活作用,例如:dataset activate products,则表示激活数据集products,

3、DATASET COPY,看见COPY大家就知道他有复制功能,除了复制整个数据集外,其还可以按相关条件选择性的复制相关观测值进新表。

4、DATASET DECLARE和DATASET DISPLAY,数据集申明及数据集显示,日常操作中并没有太多的意义,两者都是立即执行命令,并不局限于当前数据集和EXECUTE语句。

5、DATASET close, 关闭数据集。

 

   英雄事迹

DATA LIST FREE /Var1.         
 *创建含变量file1Var的数据集.
BEGIN DATA                          
111 112 113
END DATA.                                      
*利用syntax录入数据,和SAS中的data步类似.
DATASET NAME file1.                 
*给数据集命名为file1.
COMPUTE Var1=MOD(Var1,5).  
*利用compute语句进行变量计算,类似于GUI中的data--compute.

execute.
DATA LIST FREE /Var2.           
*创建含变量file2var的数据集 .
BEGIN DATA
21 22 23
END DATA.
DATASET NAME file2.                
 *给数据集命名为file2.
FREQUENCIES VARIABLES=Var1.     
*对变量file1var进行频数分析.
DATASET ACTIVATE file1.            
 *激活数据集file1.
FREQUENCIES VARIABLES=Var1.

 
    根据上面的syntax运行情况,有几点需要注意:

1、execute的即时运算功能,例如视频中的compute语句后面没有跟execute语句时,compute运算的结果并未显示;

2、当前数据集问题,最初,上述语句当前数据集为file2,导致运行FREQUENCIES语句时出现错误,output窗口和syntax窗口都有警告信息提示;

3、dataset name命名与save/save as命名的差别。

 

4、变量名,数据集名等细节问题,例如上述视频中最初由于数据集名后面多了一个点,而导致程序运行错误,出现未知数据文件 file1.,该命令尚未执行的警告。

    上面的dataset语句提到了dataset name和dataset activate语句,下面的事例将提到其他dataset语句,以下语句接着上面的dataset语句运行,有兴趣的可以贴下面的语句在syntax窗口试运行。

DATASET CLOSE ALL.                

*关闭当前所有数据集(当然SPSS数据窗口还是有数据存在的,只是以系统默认形式存在,而相关数据集则没有名称).
DATA LIST FREE /gender.
BEGIN DATA
0 0 1 1 0 1 1 1 0 0
END DATA.
DATASET NAME original.
DATASET COPY males.               *复制数据集original,并命名为males.
DATASET ACTIVATE males.
SELECT IF gender=0.               *选择gender=0的数据,相当于GUI中data-select cases的操作.
DATASET ACTIVATE original.
DATASET COPY females.
DATASET ACTIVATE females.
SELECT IF gender=1.
EXECUTE.
?

     PS:dataset系列语句主要用于多数据集操作,对于单个数据集并没有太多的意义,对于数据库中的数据,此类语句和SQL的相关功能类似,只是实现平台不同罢了。


  评论这张
 
阅读(1484)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017