现在看,在统计学或(理论/应用)计量经济学领域,python 能完美地代替 R 和 stata 吗? 举报 理由 举报 取消 2017年5月16日 10 条回复 1563 次浏览 Python,stata,分析,数据,经济学,编程语言,计量
回复 ( 10 )
更新:谢谢大家的赞同、感谢和评论。我再贴一个之前用Python做的数据处理,定义了一个比较复杂的新变量,算是简单的feature engineering吧。这个任务如果用Stata来做就会比较头疼。另外,这个例子也可以用来体验一下IPython Notebook (要用网页版看,手机版效果不佳)。
GitHub链接:Machine-Learning-Mini-Project/Feature Engineering.ipynb
一般来说,计算机专业的毕业生会远比统计系的毕业生多,但并不代表python比r的用户多。其实除了计算机、数学、工程等少量专业,绝大多数专业的学生编程能力都不强,一般都用stata/spss/sas等更简单实用的语言,要想让他们从这些语言直接到python,其实是有点跳跃,或许过渡到r是更现实的选择,因此很容易找到很多社会科学、经济、政治、生物的人用R写了各种各样的package,而python还是那几个pandas,numpy等基础包。
我倾向于认为社会的发展方向是分工越来越细,而不是要求人的技术水平越来越全面。懂一些编程对日常工作有没有帮助?肯定有!但为了这点帮助需不需要学习python?99%是不需要,或许R,甚至excel vba就足够了。社会不需要把所有人变成程序员。
至于在纯数据分析领域的R vs python问题,python在大规模数据处理上会有优势,直接点说就是“数据量大于内存”的时候会有优势。现在的内存都是8G、16G的水平,说实话,除了互联网有更大的数据量,很多领域都没有。运算速度大家一样的,Rcpp vs cython,半斤八两;你能并行我也能并行,这些都是一样的。
统计系的人在统计素养的训练上会强一些,但这属于soft skill,计算机专业的人一般认为自己coding这些hard skill强,也顺便推理到自己soft skill也强,这是最大的误区。计算机的人做数据分析,往往偏重于降低误差,比如cross validation之类的,会用比较暴力的方法,对t-stat, p-value, r^2其实概念其实是不懂的,Andrew Ng也没教…或许一个纯计算机背景的team,苦做1年,死劲把误差降低,但一个做统计的人路过一看,你这里犯了个小错误哦,这个东西不是平稳的喔,这个样本不能这么切,等等。。。或许一年的工作就是garbage in garbage out了。。。
你是统计学家不是程序员你是统计学家不是程序员你是统计学家不是程序员
计算机语言是一种用来实现你想法的工具,但支撑你想法的不是python 或者R ,是概率和统计,是数学。
我以前也有过类似的困惑所以特地找教授聊过,以上就是我得到的答案。
当然我并不是在为年年喊着我要学python 到现在还没动手找借口,以及R 大法好。
谢谢邀请.这个方面,我只接触过皮毛的生物信息.强行答一下.
认识的一些做生物信息方面的还有专门做数据分析的,用python的还算可以,毕竟数据挖掘方便一些.
python,各方面都可以,但是各方面都不是最好(必然是没有最好,只有更好).
代替应该不会,毕竟R之类的专业做这个的,
不能。numpy操作数组的方式比R麻烦。
我觉得学术界和业界的情况会不太一样。
学术界就像现在最高票答主说的, R 或者PYTHON 只是工具,更重要的是思想。 所以Python的出现只是给研究人员提供了一些新的工具。 之前搞运筹学的老板好像就是用Python比较多(另外一位运筹学教授用C…) 。 可能这个很大程度决定于教授本身的风格和研究方向吧。所以在python没有出现足够碾压其他语言的优势的时候,R应该还是不会被取代的。
业界就不一样了。 python因为容易上手,可读性强等总总原因,取代R还是有机会的。
R的一个优势是它是统计学家写的,R的劣势也是它是由统计学家写的。
在我的定义里,R/python/matlab,是基本可以相互替代的,越难选择越是说明都可以。我修ML的时候曾问过老师哪个最适合,老师回答皆可。不管统计计量还是时间序列,我一直用的是R,相当满意,毕竟玩统计的写给自己用的,知道自己需要什么,足够专业。
至于stata,我是与spss/eviews归为一类,称为计量软件,与R这种统计语言还是有本质区别的。
在經濟學學術界根本不存在替不替代的問題,因為python不能用。原因很簡單,python不是統計學軟件,用他做任何統計分析,因為沒有預設的代碼,完全無法保證算法的正確性。因而得出的結果是不被學術界認可的。經濟學學術界目前只認可Stata, SAS, SPSS, R
厚着逼脸答一下。着重说一下统计/大数据/数据科学领域啊。stata没有什么可比性。别说stata。。sas都逐渐没有了可比性。python和r各有各的好。简单讲,这俩工具是cs和统计两个流派气息很重的工具。相较之下python更能体现cs的思维,而r对于统计的人来说基本是承载着从理论到实现的一个应用。当然这也跟这两个语言的历史有深远关系。python本身就是和c联系紧密,而r是基于s语言。虽然现在他们都有各自可以call其他底层语言的能力,但是这些历史原因也造就了他们的特质。python更像是一个全能型工具,拿来写ui什么的也是完全没问题(这不是说r 不可以做ui只是难用)。另外在大数据背景下,python的兼容性明显要强很多。python那些nlp的东西也是很大的优势。而r的明显优势也是跟他的统计思维有关系。就像有答案说的,这统计的人写给自己使用的,因此关于分析的那一套东西,r的各种包太多了太丰富了,一旦统计上有一丁点的突破,就会有developer写出一个包把理论转化为易操作的函数也就是做了理论的算法实现。当然其他领域有一点能用的,r也会有人给写个包。。。这一点如果不长期关注统计,不深入的使用python和r可能无法体会。python其实也有这个特质但是跟r还不能比。这也跟python的传统用户多为cs背景而不是统计分析背景有关系。python跟底层语言的交互带来的方便也是一大特点,所以你看很多做量化交易的不会选r而自然选python(当然底层语言的大牛在这个领域有着不可动摇的话语权)。直接对比,个人觉得r比较适合用来做策略,模型开发。python比较适合拿来整体实现你的模型。总的来说这两种语言是不断的在相互学习。未来的话,这两种语言很有可能会长期存在,不断吃掉其他分析语言比如sas, matlab的市场份额。曾经让很多分析语言商业化进而得以大规模推广的策略,已经逐渐的不适应这个新的大数据时代了。开源成为了很大的一个优势,知识共享成果共享很重要。闭门造车的速度毕竟太慢。再一个是老的语言,特别是像sas这种,夸张一点讲,还存在的一个很大的原因就是有一大帮传统用户,企业用户。然而这些传统用户在今天已经很难创造大的价值了。特别是以coperate america,500 强很多公司为代表的那些企业。不过说两句题外话,1数据科学除了分析之外也会有很多底层开发的需求,所以能懂一两种底层语言是很大的优势。2另外未来也很看好scala。
求轻拍。
谢友人邀,先说说我自己的看法:
1、在学术领域,python目前替代不了R。
2、在工作领域,当开始考虑程序运行速度时,R会被python秒杀。
下面举例:
题主在本科期间,有幸总结了许多R的代码,下面以最简单的一元回归分析为例,谈谈R和python
为了节约大家时间,代码附在最后,我着重摘录我在python中没找到的部分,如果有哪位大神指导python中怎么做,欢迎补充:
#模型诊断
library(car)#正态性
qqPlot(fit,labels=row.names(states),
id.method=’identify’,simulate=TRUE,main=’QQ plot’)
#独立性
library(car)
durbinWatsonTest(fit)
#同方差性
library(car)
ncvTest(fit)
spreadLevelPlot(fit)#次幂接近1
这三个检验,称为线性回归模型的三大基本假设,如上文所说,我在python中没找到。这其实说明了一个问题,python更多的是从实际出发,你在工作中做项目时,基本不会用到这三个假设检验,甚至连p值都只是瞄一眼,你只是希望找到beta0_hat,beta1_hat,然后直接拿测试集的数据去跑跑试试,看看符不符合。当然,多数情况都不会很理想,所以你就会直接换模型了。这说明,在需要不断尝试的工作环境中,R的许多检验根本就没有什么用处,反而是python简单的函数体系更加有效:
reg=np.polyfit(x,f(x),deg=1);#回归的系数,beta1,beta0
ry=np.polyval(reg,x);#回归的预测
上面两行代码是回归的python代码中最简单的,可以说两行就完成了一个模型的试验,我个人感觉,这就是python在工作中受欢迎的原因。
再来看这一行python代码:
model = pd.ols(y=pd.Series(y),x=pd.Series(x))#注意转化数据类型
这是我一开始从R转python最不能忍的地方,大哥,我就是想做个回归,干嘛数据类型这种最细致末节的东西我都需要考虑ORZ。。。。。。后来想想,这或许就是python运行速度比R快的原因吧——好多东西都会细化到计算机编程最基本的一些东西诸如数据类型,数据结构,当然比R的只有一个dataframe要快。
以上
下面都是代码,下面都是代码,下面都是代码
#以下为R code:
#简单线性回归
fit <- lm(weight ~ height,data=women)
summary(fit)
confint(fit,level=0.05)#回归系数的置信区间
plot(women$height,women$weight,xlab = ‘Height (in inches)’,
ylab=’Weight (in pounds)’)#可视化
abline(fit)
#求预测值(pre_fit)、置信区间(con_int)、预测区间(pre_int),并绘图
pre_fit<-predict(fit)
attach(women)
con_int<-predict(fit,as.data.frame(height),interval = ‘confidence’,level=0.05)
pre_int<-predict(fit,as.data.frame(height),interval = ‘prediction’,level=0.05)
pre<- data.frame(y=weight,pre_fit,lci=con_int[,2],uci=con_int[,3],
lpi=pre_int[,2],upi=pre_int[,3])
pre
x0<-seq(min(height),max(height))#绘制置信区间和预测区间图
con_int2<-predict(fit,as.data.frame(x0),interval = ‘confidence’,level=0.05)
pre_int2<-predict(fit,as.data.frame(x0),interval = ‘prediction’,level=0.05)
par(cex=0.7)
plot(height,weight,xlab=’height’,ylab = ‘weight’)
abline(fit,lwd=2)
lines(x0,con_int2[,2],lty=2,lwd=2,col=’blue’)
lines(x0,con_int2[,3],lty=2,lwd=2,col=’blue’)
lines(x0,pre_int2[,2],lty=3,lwd=2,col=’red’)
lines(x0,pre_int2[,3],lty=3,lwd=2,col=’red’)
legend(x=’topleft’,legend=c(‘回归线’,’置信区间’,’预测区间’),lty=1:3,lwd=2,
cex=0.7)
#多元线性回归
states<- as.data.frame(state.x77[,c(‘Murder’,’Population’,
‘Illiteracy’,’Income’,’Frost’)])
#相关性可视化
cor(states)
library(car)
scatterplotMatrix(states,spread=F,lty.smooth=2,main=’Scatter Plot Matrix’)#
library(corrgram)
corrgram(states,order=T,lower.panel=panel.shade,
upper.panel=panel.pie,text.panel=panel.txt)
fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)
summary(fit)
#模型诊断
library(car)#正态性
qqPlot(fit,labels=row.names(states),
id.method=’identify’,simulate=TRUE,main=’QQ plot’)
#独立性
library(car)
durbinWatsonTest(fit)
#同方差性
library(car)
ncvTest(fit)
spreadLevelPlot(fit)#次幂接近1
###############以下为python code:
import numpy as np
import numpy.random as npr
import pandas as pd
import matplotlib.pyplot as plt
epsilon = npr.normal(0,1,300)
x = npr.uniform(0,100,300)
y = x + epsilon
model = pd.ols(y=pd.Series(y),x=pd.Series(x))#注意转化数据类型
#help(model)
#系数和截距
model.beta
#自由度
model.df
model.df_model#未知
model.df_resid
#统计量的值
model.f_stat
model.nobs
model.nw_lags
#P值
model.p_value
#R方
model.r2
#调整的R方
model.r2_adj
#模型的epsilon
model.resid
#均方根误差
model.rmse
#标准误差
model.std_err
model.summary
model.summary_as_matrix
model.t_stat
model.var_beta
model.y_fitted
model.y_predict
plt.plot(x,y,’r.’)
ax = plt.axis()
x1 = np.linspace(ax[0],ax[1] + 0.01)
plt.plot(x1,model.beta[1] + model.beta[0] * x1,’b’,lw=2)
plt.grid(True)
plt.axis(‘tight’)