查看原文
其他

为了辅导作业,这位家长竟然…

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张馨月

文字编辑:王碧琪

技术总编:李朋冲


重磅!!!为了大家能够更好地学习Python技术,以及应广大粉丝和往期学员的要求,2019年11月29日-12月1日,武汉字符串数据科技有限公司将在湖北武汉举办《第四期Python编程技术培训》。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python的编程技术,特别是网络数据抓取技术。目前正在火热招生中~

如果有兴趣,具体培训内容详见《2019年Python第四期培训招生》,报名请点击:阅读原文哦~


最近小编在网上冲浪时看到这样一个词:
打开微博,画风果然是这样:
有些家长表示:“陪娃写作业这件事上,就别跟我说孩子是亲生的了”
也有宝爸宝妈吐槽:
“初中家长辅导作业情绪会缓和很多,因为他们大多不会;
高中家长已经完全放手,因为他们看不懂题目”
那么有没有什么方法可以帮助宝爸宝妈们缓解辅导焦虑综合症呢?比如说在辅导数学时,除了搞定答案,还能画出直观的图像以便更好地理解数学知识呢?这就要派出今天的主角——Stata了。因为Stata不仅可以很便捷地求解数学问题,它的绘图功能还很强大。今天小编就先向宝爸宝妈分享几条简单易学的秘籍哦~


我们以这道中考题为例。题目非常简单,在下面的讲解中主要涉及两大块:画出函数图像;求解各点坐标。
下面我们就来具体看看Stata是如何放大招的吧~
 
秘籍1.twoway function画出函数图像
首先,我们用twoway function画出函数的大致图像,便于后续的观察计算。具体命令如下:
twoway function y=-0.25*(x^2)+0.5*x+2,range(-3 5) ///画出函数在-3至5范围内的图像yscale(noline) xscale(noline) xtitle("") ytitle("") ///不显示x、y轴的线及标题xline(0,lstyle(foreground)) yline(0,lstyle(foreground)) ///在x=0与y=0处画线  text( 2 4 "y=-0.25*(x^2)+0.5*x+2", place(n) box margin(l+0.5 t+1 b+1) width(35))  //在点(2,4)上方标明函数
在stata的命令框中输入help twoway function,可以看到该命令的语法结构如下:
twoway function [[y]=] f(x) [if] [in] [, options]
其中“[]”中的内容都可以省略,最关键的部分就是f(x),即我们需要绘制的函数。
不过,通常为了让图像更为美观,我们会进行一些设定,这里做简单介绍:
 [if]是条件语句,[in]表示范围,[, options]表示选项,其中包括非常丰富的内容。本文用到的options主要包括:

range()用来设置函数x值变动的范围;

yscale( ) xscale() xtitle() ytitle()用来对坐标轴的线条和标题进行设定;

xline()yline()用来在特定的xy值处画线;

text()用来在图形上进行标注。


 
除了二次函数外,这个命令还可以帮我们画出各种图形。
比如三角函数:
twoway function y=sin(x),range(0 6.28) //0-2π
再比如更高次幂的函数 y=x*(x^2-1):
twoway function y=x*(x^2-1),range(-2 2) ylabel(-4(2)4) xlabel(-2(1)2) ///yscale(noline) xscale(noline) ///  xline(0,lstyle(foreground)) yline(0,lstyle(foreground))
这里顺便插入一个小彩蛋:Stata的画图功能非常强大,如果可以熟练运用,画个爱你的形状也不在话下哦~


【秘籍2polyroots求解方程组
polyroots是mata环境下的一个命令,可以用来求解高阶方程组。对方程组:
输入
就可以轻松求解了。
下面我来具体看看在这道题目中如何应用~
首先,求与x轴的交点,即求-0.25*(x^2)+0.5*x+2=0的解,也就是输入:
polyroots((2,0.5,-0.25))

我们可以看到对于一个二次函数,需要输入三项。因为常数项为2,可以看作x^0的系数;x^1的系数为0.5x^2的系数为-0.25

其次,对于C的坐标,命令如下:
dis -0.25*(0^2)+0.5*0+2

这里的“dis”可以看作一个计算器,求得坐标为(0,2)


最后,求D的坐标,就是对-0.25*(x^2)+0.5*x+2=2求解,即-0.25*(x^2)+0.5*x=0,输入polyroots((0,0.5,-0.25))就OK啦。
另外,在这部分的最开始,我们也提到polyroots要在mata环境中运行,因此我们要先进入mata环境。
完整程序如下:
dis -0.25*(0^2)+0.5*0+2 //计算得到x=0时y的取值为2mata //进入mata环境mata clear //清空mata内存polyroots((2,0.5,-0.25)) //求解y=0时x的取值polyroots((0,0.5,-0.25)) //求解y=2时x的取值end
运行结果如图所示,由此可以得到A、B、C、D的坐标分别为(-2,0),(4,0),(0,2),(2,2)。
到这里大家或许会说,这么简单的题目,口算就可以得到答案。
但如果要计算1234*4321的答案,或者对方程x^5-4*x^3+x=0求解,我们是否还能打败计算机呢?
 
【秘籍3reg得到回归直线
reg是stata中经常使用到的一条命令,可以对两个或两个以上变量的线性关系进行拟合分析。数学中经常面对的“两点回归一条直线”就是一个基础的一元线性回归问题,在stata中也很容易求解,三步就可以搞定:
1.input输入数据
2.reg进行回归
3.adjust求x取特定值时y的取值
具体程序如下:
clearinput x y -2 0 2 2 end //输入两点坐标(-2,0)(2,2)reg y x //两点回归,相当于数学中经常用到的“两点式”
所以过该两点的直线方程为y=0.5x+1。
adjust x=0 //求x=0时y的取值
从上面的结果我们可以看到y的取值为1,即E的纵坐标。同上一部分一样,求P、Q的坐标即-0.25*(x^2)+0.5*x+2=1的解,我们可以继续使用polyroots解决:
matamata clearpolyroots((1,0.5,-0.25))end
因此,E、P、Q的坐标分别为(0,1)(-1.23606798,1)(3.23606798,1)
我们再次使用dis命令,就可以得到PQ的距离约为4.47,也就是
dis 3.23606798-(-1.23606798)
 
 
【秘籍4twoway scatter画散点图
到这里,这道题就基本完成啦。细心的宝爸宝妈可能会注意到我们在最开始画出的图形并不完善。这里就要用到今天的最后一个命令——twoway scatter
twoway scatter的语法如下:
[twoway] scatter varlist [if] [in] [weight] [, options]
其中varlist是将要绘制的散点图的变量,[weight]表示权重,这里用到的options主要包括:

legend()用来设置图例,关于该选项更为详细的用法可以参考推文《修改图形图例》;

mlabel()对散点加标签;

mlabposition()设置散点标签的位置;

mlabcolor()设置散点标签的颜色。

下面我们来具体应用一下~
首先,输入各点的坐标,命令如下:
clearinput x1 y1 str4 name1 //创建3个变量:x1 y1 name1,name1是一个字符型变量,所以要在变量名称前声明“str",并将长度定义为4-2 0 "A"0 2 "C"3.23606798 1 "Q"0 0 "O"4 0 "B"2 2 "D"-1.23606798 1 "P"0 1 "E"end


若直接输入散点图的命令,只能显示出各点的位置:
twoway scatter y1 x1, /// legend(off) ///不显示图例 mlabel("name1") ///将name1作为各点的值标签 mlabposition(12) ///值标签的位置在12点钟方向 mlabcolor(purple) //颜色设为紫色


所以我们要把散点和抛物线结合到一张图,方法也很简单,用twoway(function…)(scatter…)即可:
twoway (function y=-0.25*(x^2)+0.5*x+2,range(-3 5) ///yscale(noline) xscale(noline) xtitle("") ytitle("") ///xline(0,lstyle(foreground)) yline(0,lstyle(foreground)) ///text( 2 4 "y=-0.25*(x^2)+0.5*x+2", /// place(n) box margin(l+0.5 t+1 b+1) width(35))) /// (function y=1,range(-1.236 3.236)) /// (function y=2,range(0 2)) /// (function y=0.5*x+1,range(-2 2)) ///  (scatter y1 x1,legend(off) mlabel("name1") mlabposition(12) mlabcolor(purple)) //
 
最后,附上完整程序:
*twoway function————画出函数图像twoway function y=-0.25*(x^2)+0.5*x+2,range(-3 5) ///画出函数在-3至5范围内的图像yscale(noline) xscale(noline) xtitle("") ytitle("") ///不显示x、y轴的线及标题xline(0,lstyle(foreground)) yline(0,lstyle(foreground)) ///在x=0与y=0处画线text( 2 4 "y=-0.25*(x^2)+0.5*x+2", place(n) box margin(l+0.5 t+1 b+1) width(35)) //在点(2,4)上方标明函数

*求解各点坐标*dis————简单计算*polyroots————求解方程*reg————线性回归dis -0.25*(0^2)+0.5*0+2 //计算得到x=0时y的取值为2 mata //进入mata环境mata clear //清空mata内存polyroots((2,0.5,-0.25)) //求解y=0时x的取值polyroots((0,0.5,-0.25)) //求解y=2时x的取值end
clearinput x y-2 0 2 2 end //输入两点坐标(-2,0)(2,2)reg y x //两点回归adjust x=0 //求x=0时y的取值
matamata clearpolyroots((1,0.5,-0.25))end
dis 3.23606798-(-1.23606798)
matamata clearpolyroots((0,1,0,-4,0,1))end
*输入各点坐标clearinput x1 y1 str4 name1 //创建3个变量:x1 y1 name1,其中name1是字符型变量-2 0 "A" 0 2 "C" 3.23606798 1 "Q"0 0 "O" 4 0 "B" 2 2 "D" -1.23606798 1 "P" 0 1 "E" end
*画出完整图形twoway (function y=-0.25*(x^2)+0.5*x+2,range(-3 5) /// yscale(noline) xscale(noline) xtitle("") ytitle("") /// xline(0,lstyle(foreground)) yline(0,lstyle(foreground)) /// text( 2 4 "y=-0.25*(x^2)+0.5*x+2", /// place(n) box margin(l+0.5 t+1 b+1) width(35))) /// (function y=1,range(-1.236 3.236)) /// (function y=2,range(0 2)) /// (function y=0.5*x+1,range(-2 2)) ///  (scatter y1 x1,legend(off) mlabel("name1") mlabposition(12) mlabcolor(purple)) //


到这儿,大家有没有感受到Stata强大的功能呢?
现如今市场上有许多与少儿编程有关的课程,但质量却良莠不齐,大家对于这一话题的看法也褒贬不一。宝爸宝妈不如就从今天这些简单的命令和题目开始,同孩子一起试着去探索这个接触前沿、把握未来的方式吧。
今天的秘籍传授就到这了,有了这些,宝爸宝妈们就可以轻松解决孩子的很多数学题啦~
 

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐  

如何保留第n个变量

      走进列表的世界——列表方法(二)

走进列表的世界——列表方法(一)

朝花夕拾|长宽数据转换——reshape命令

Stata有音乐包啦!

对《陈情令》的数据可视化分析

stata绘制热力图详解

实战演练-明星微博热搜次数的数据可视化

《少年的你》影评

集合常用方法小结

实战演练-爬取深交所年报

重建“通天塔” —— Unicode编码与解码

输出分组描述性统计表的利器——report

字典常用操作小结

XPath Helper助XPath爬虫一臂之力

查找变量?用“codebook”!

distinct命令用法一览

Stata数据分析技术应用培训

玩转Python之“手把手”教你爬数据(一)

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存