重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
regstats(y1,x1,'linear','tstat');
创新互联是专业的孝义网站建设公司,孝义接单;提供网站建设、成都网站设计,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行孝义网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
c1=ans.tstat.beta(1,1);
beta1=ans.tstat.beta(2,1);
t1=ans.tstat.t(2,1);
c1是常数项,beta1是回归系数,t1就是beta1的t值,这里是单变量线性回归
Plotly Express 是一个新的高级 Python 可视化库:它是 Plotly.py 的高级封装,它为复杂的图表提供了一个简单的语法。
受 Seaborn 和 ggplot2 的启发,它专门设计为具有简洁,一致且易于学习的 API :只需一次导入,您就可以在一个函数调用中创建丰富的交互式绘图,包括分面绘图(faceting)、地图、动画和趋势线。 它带有数据集、颜色面板和主题,就像 Plotly.py 一样。
Plotly Express 完全免费:凭借其宽松的开源 MIT 许可证,您可以随意使用它(是的,甚至在商业产品中!)。
最重要的是,Plotly Express 与 Plotly 生态系统的其他部分完全兼容:在您的 Dash 应用程序中使用它,使用 Orca 将您的数据导出为几乎任何文件格式,或使用JupyterLab 图表编辑器在 GUI 中编辑它们!
用 pip install plotly_express 命令可以安装 Plotly Express。
一旦导入Plotly Express(通常是 px ),大多数绘图只需要一个函数调用,接受一个整洁的Pandas dataframe,并简单描述你想要制作的图。 如果你想要一个基本的散点图,它只是 px.scatter(data,x =“column_name”,y =“column_name”)。
以下是内置的 Gapminder 数据集的示例,显示2007年按国家/地区的人均预期寿命和人均GDP 之间的趋势:
如果你想通过大陆区分它们,你可以使用 color 参数为你的点着色,由 px 负责设置默认颜色,设置图例等:
这里的每一点都是一个国家,所以也许我们想要按国家人口来衡量这些点...... 没问题:这里也有一个参数来设置,它被称为 size:
如果你好奇哪个国家对应哪个点? 可以添加一个 hover_name ,您可以轻松识别任何一点:只需将鼠标放在您感兴趣的点上即可! 事实上,即使没有 hover_name ,整个图表也是互动的:
也可以通过 facet_col =”continent“ 来轻松划分各大洲,就像着色点一样容易,并且让我们使用 x轴 对数(log_x)以便在我们在图表中看的更清晰:
也许你不仅仅对 2007年 感兴趣,而且你想看看这张图表是如何随着时间的推移而演变的。 可以通过设置 animation_frame=“year” (以及 animation_group =“country” 来标识哪些圆与控制条中的年份匹配)来设置动画。
在这个最终版本中,让我们在这里调整一些显示,因为像“gdpPercap” 这样的文本有点难看,即使它是我们的数据框列的名称。 我们可以提供更漂亮的“标签” (labels),可以在整个图表、图例、标题轴和悬停(hovers)中应用。 我们还可以手动设置边界,以便动画在整个过程中看起来更棒:
因为这是地理数据,我们也可以将其表示为动画地图,因此这清楚地表明 Plotly Express 不仅仅可以绘制散点图(不过这个数据集缺少前苏联的数据)。
事实上,Plotly Express 支持三维散点图、三维线形图、极坐标和地图上三元坐标以及二维坐标。 条形图(Bar)有二维笛卡尔和极坐标风格。
进行可视化时,您可以使用单变量设置中的直方图(histograms)和箱形图(box)或小提琴图(violin plots),或双变量分布的密度等高线图(density contours)。 大多数二维笛卡尔图接受连续或分类数据,并自动处理日期/时间数据。 可以查看我们的图库 (ref-3) 来了解每个图表的例子。
数据 探索 的主要部分是理解数据集中值的分布,以及这些分布如何相互关联。 Plotly Express 有许多功能来处理这些任务。
使用直方图(histograms),箱形图(box)或小提琴图(violin plots)可视化单变量分布:
直方图:
箱形图:
小提琴图:
还可以创建联合分布图(marginal rugs),使用直方图,箱形图(box)或小提琴来显示双变量分布,也可以添加趋势线。 Plotly Express 甚至可以帮助你在悬停框中添加线条公式和R²值! 它使用 statsmodels 进行普通最小二乘(OLS)回归或局部加权散点图平滑(LOWESS)。
在上面的一些图中你会注意到一些不错的色标。 在 Plotly Express 中, px.colors 模块包含许多有用的色标和序列:定性的、序列型的、离散的、循环的以及所有您喜欢的开源包:ColorBrewer、cmocean 和 Carto 。 我们还提供了一些功能来制作可浏览的样本供您欣赏(ref-3):
定性的颜色序列:
众多内置顺序色标中的一部分:
我们特别为我们的交互式多维图表感到自豪,例如散点图矩阵(SPLOMS)、平行坐标和我们称之为并行类别的并行集。 通过这些,您可以在单个图中可视化整个数据集以进行数据 探索 。 在你的Jupyter 笔记本中查看这些单行及其启用的交互:
散点图矩阵(SPLOM)允许您可视化多个链接的散点图:数据集中的每个变量与其他变量的关系。 数据集中的每一行都显示为每个图中的一个点。 你可以进行缩放、平移或选择操作,你会发现所有图都链接在一起!
平行坐标允许您同时显示3个以上的连续变量。 dataframe 中的每一行都是一行。 您可以拖动尺寸以重新排序它们并选择值范围之间的交叉点。
并行类别是并行坐标的分类模拟:使用它们可视化数据集中多组类别之间的关系。
Plotly Express 之于 Plotly.py 类似 Seaborn 之于 matplotlib:Plotly Express 是一个高级封装库,允许您快速创建图表,然后使用底层 API 和生态系统的强大功能进行修改。 对于Plotly 生态系统,这意味着一旦您使用 Plotly Express 创建了一个图形,您就可以使用Themes,使用 FigureWidgets 进行命令性编辑,使用 Orca 将其导出为几乎任何文件格式,或者在我们的 GUI JupyterLab 图表编辑器中编辑它 。
主题(Themes)允许您控制图形范围的设置,如边距、字体、背景颜色、刻度定位等。 您可以使用模板参数应用任何命名的主题或主题对象:
有三个内置的 Plotly 主题可以使用, 分别是 plotly, plotlywhite 和 plotlydark。
px 输出继承自 Plotly.py 的 Figure 类 ExpressFigure 的对象,这意味着你可以使用任何 Figure 的访问器和方法来改变 px生成的绘图。 例如,您可以将 .update() 调用链接到 px 调用以更改图例设置并添加注释。 .update() 现在返回修改后的数字,所以你仍然可以在一个很长的 Python 语句中执行此操作:
在这里,在使用 Plotly Express 生成原始图形之后,我们使用 Plotly.py 的 API 来更改一些图例设置并添加注释。
Dash 是 Plotly 的开源框架,用于构建具有 Plotly.py 图表的分析应用程序和仪表板。Plotly Express 产生的对象与 Dash 100%兼容,只需将它们直接传递到 dash_core_components.Graph,如下所示: dcc.Graph(figure = px.scatter(...))。 这是一个非常简单的 50行 Dash 应用程序的示例,它使用 px 生成其中的图表:
这个 50 行的 Dash 应用程序使用 Plotly Express 生成用于浏览数据集的 UI 。
可视化数据有很多原因:有时您想要提供一些想法或结果,并且您希望对图表的每个方面施加很多控制,有时您希望快速查看两个变量之间的关系。 这是交互与 探索 的范畴。
Plotly.py 已经发展成为一个非常强大的可视化交互工具:它可以让你控制图形的几乎每个方面,从图例的位置到刻度的长度。 不幸的是,这种控制的代价是冗长的:有时可能需要多行 Python 代码才能用 Plotly.py 生成图表。
我们使用 Plotly Express 的主要目标是使 Plotly.py 更容易用于 探索 和快速迭代。
我们想要构建一个库,它做出了不同的权衡:在可视化过程的早期牺牲一些控制措施来换取一个不那么详细的 API,允许你在一行 Python 代码中制作各种各样的图表。 然而,正如我们上面所示,该控件并没有消失:你仍然可以使用底层的 Plotly.py 的 API 来调整和优化用 Plotly Express 制作的图表。
支持这种简洁 API 的主要设计决策之一是所有 Plotly Express 的函数都接受“整洁”的 dataframe 作为输入。 每个 Plotly Express 函数都体现了dataframe 中行与单个或分组标记的清晰映射,并具有图形启发的语法签名,可让您直接映射这些标记的变量,如 x 或 y 位置、颜色、大小、 facet-column 甚至是 动画帧到数据框(dataframe)中的列。 当您键入 px.scatter(data,x ='col1',y='col2') 时,Plotly Express 会为数据框中的每一行创建一个小符号标记 - 这就是 px.scatter 的作用 - 并将 “col1” 映射到 x 位置(类似于 y 位置)。 这种方法的强大之处在于它以相同的方式处理所有可视化变量:您可以将数据框列映射到颜色,然后通过更改参数来改变您的想法并将其映射到大小或进行行分面(facet-row)。
接受整个整洁的 dataframe 的列名作为输入(而不是原始的 numpy 向量)也允许 px 为你节省大量的时间,因为它知道列的名称,它可以生成所有的 Plotly.py 配置用于标记图例、轴、悬停框、构面甚至动画帧。 但是,如上所述,如果你的 dataframe 的列被笨拙地命名,你可以告诉 px 用每个函数的 labels 参数替换更好的。
仅接受整洁输入所带来的最终优势是它更直接地支持快速迭代:您整理一次数据集,从那里可以使用 px 创建数十种不同类型的图表,包括在 SPLOM 中可视化多个维度 、使用平行坐标、在地图上绘制,在二维、三维极坐标或三维坐标中使用等,所有这些都不需要重塑您的数据!
在 API 级别,我们在 px 中投入了大量的工作,以确保所有参数都被命名,以便在键入时最大限度地发现:所有 scatter -类似的函数都以 scatter 开头(例如 scatter_polar, scatter_ternary)所以你可以通过自动补全来发现它们。 我们选择拆分这些不同的散点图函数,因此每个散点图函数都会接受一组定制的关键字参数,特别是它们的坐标系。 也就是说,共享坐标系的函数集(例如 scatter, line & bar,或 scatter_polar, line_polar 和 bar_polar )也有相同的参数,以最大限度地方便学习。 我们还花了很多精力来提出简短而富有表现力的名称,这些名称很好地映射到底层的 Plotly.py 属性,以便于在工作流程中稍后调整到交互的图表中。
最后,Plotly Express 作为一个新的 Python 可视化库,在 Plotly 生态系统下,将会迅速发展。所以不要犹豫,立即开始使用 Plotly Express 吧!
利用python进行线性回归
理解什么是线性回归
线性回归也被称为最小二乘法回归(Linear Regression, also called Ordinary Least-Squares (OLS) Regression)。它的数学模型是这样的:
y = a+ b* x+e
其中,a 被称为常数项或截距;b 被称为模型的回归系数或斜率;e 为误差项。a 和 b 是模型的参数。
当然,模型的参数只能从样本数据中估计出来:
y'= a' + b'* x
我们的目标是选择合适的参数,让这一线性模型最好地拟合观测值。拟合程度越高,模型越好。
那么,接下来的问题就是,我们如何判断拟合的质量呢?
这一线性模型可以用二维平面上的一条直线来表示,被称为回归线。
模型的拟合程度越高,也即意味着样本点围绕回归线越紧密。
如何计算样本点与回归线之间的紧密程度呢?
高斯和勒让德找到的方法是:被选择的参数,应该使算出来的回归线与观测值之差的平房和最小。用函数表示为:
这被称为最小二乘法。最小二乘法的原理是这样的:当预测值和实际值距离的平方和最小时,就选定模型中的两个参数(a 和 b)。这一模型并不一定反映解释变量和反应变量真实的关系。但它的计算成本低;相比复杂模型更容易解释。
模型估计出来后,我们要回答的问题是:
我们的模型拟合程度如何?或者说,这个模型对因变量的解释力如何?(R2)
整个模型是否能显著预测因变量的变化?(F 检验)
每个自变量是否能显著预测因变量的变化?(t 检验)
首先回答第一个问题。为了评估模型的拟合程度如何,我们必须有一个可以比较的基线模型。
如果让你预测一个人的体重是多少?在没有任何额外信息的情况下,你可能会用平均值来预测,尽管会存在一定误差,但总比瞎猜好。
现在,如果你知道他的身高信息,你的预测值肯定与平均值不一样。额外信息相比平均值更能准确地预测被预测的变量的能力,就代表模型的解释力大小。
上图中,SSA 代表由自变量 x 引起的 y 的离差平方和,即回归平方和,代表回归模型的解释力;SSE 代表由随机因素引起的 y 的离差平方和,即剩余平方和,代表回归模型未能解释的部分;SST 为总的离差平方和,即我们仅凭 y 的平均值去估计 y 时所产生的误差。
用模型能够解释的变异除以总的变异就是模型的拟合程度:
R2=SSA/SST=1-SSE
R2(R 的平方)也被称为决定系数或判定系数。
第二个问题,我们的模型是否显著预测了 y 的变化?
假设 y 与 x 的线性关系不明显,那么 SSA 相对 SSE 占有较大的比例的概率则越小。换句话说,在 y 与 x 无线性关系的前提下,SSA 相对 SSE 的占比越高的概率是越小的,这会呈现一定的概率分布。统计学家告诉我们它满足 F 分布,就像这样:
如果 SSA 相对 SSE 占比较大的情况出现了,比如根据 F 分布,这个值出现的概率小于 5%。那么,我们最好是拒绝 y 与 x 线性关系不显著的原始假设,认为二者存在显著的线性关系较为合适。
第三个问题,每个自变量是否能显著预测因变量的变化?换句话说,回归系数是否显著?
回归系数的显著性检验是围绕回归系数的抽样分布(t 分布)来进行的,推断过程类似于整个模型的检验过程,不赘言。
实际上,对于只有一个自变量的一元线性模型,模型的显著性检验和回归系数的检验是一致的,但对于多元线性模型来说,二者就不能等价了。
利用 statsmodels 进行最小二乘回归
#导入相应模块
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: import statsmodels.api as sm
#将数据导入 pandas 的 dataframe 对象,第一列(年份)作为行标签
In [4]: df=pd.read_csv('/Users/xiangzhendong/Downloads/vincentarelbundock-Rdatasets-1218370/csv/datasets/longley.csv', index_col=0)
#查看头部数据
In [5]: df.head()
Out[5]:
GNP.deflator GNP Unemployed Armed.Forces Population Year \
1947 83.0 234.289 235.6 159.0 107.608 1947
1948 88.5 259.426 232.5 145.6 108.632 1948
1949 88.2 258.054 368.2 161.6 109.773 1949
1950 89.5 284.599 335.1 165.0 110.929 1950
1951 96.2 328.975 209.9 309.9 112.075 1951
Employed
1947 60.323
1948 61.122
1949 60.171
1950 61.187
1951 63.221
#设置预测变量和结果变量,用 GNP 预测 Employed
In [6]: y=df.Employed #结果变量
In [7]: X=df.GNP #预测变量
#为模型增加常数项,即回归线在 y 轴上的截距
In [8]: X=sm.add_constant(X)
#执行最小二乘回归,X 可以是 numpy array 或 pandas dataframe(行数等于数据点个数,列数为预测变量个数),y 可以是一维数组(numpy array)或 pandas series
In [10]: est=sm.OLS(y,X)
使用 OLS 对象的 fit() 方法来进行模型拟合
In [11]: est=est.fit()
#查看模型拟合的结果
In [12]: est.summary()
Out[12]:
#查看最终模型的参数
In [13]: est.params
Out[13]:
const 51.843590
GNP 0.034752
dtype: float64
#选择 100 个从最小值到最大值平均分布(equally spaced)的数据点
In [14]: X_prime=np.linspace(X.GNP.min(), X.GNP.max(),100)[:,np.newaxis]
In [15]: X_prime=sm.add_constant(X_prime)
#计算预测值
In [16]: y_hat=est.predict(X_prime)
In [17]: plt.scatter(X.GNP, y, alpha=0.3) #画出原始数据
#分别给 x 轴和 y 轴命名
In [18]: plt.xlabel("Gross National Product")
In [19]: plt.ylabel("Total Employment")
In [20]: plt.plot(X_prime[:,1], y_hat, 'r', alpha=0.9) #添加回归线,红色
多元线性回归(预测变量不止一个)
我们用一条直线来描述一元线性模型中预测变量和结果变量的关系,而在多元回归中,我们将用一个多维(p)空间来拟合多个预测变量。下面表现了两个预测变量的三维图形:商品的销量以及在电视和广播两种不同媒介的广告预算。
数学模型是:
Sales = beta_0 + beta_1*TV + beta_2*Radio
图中,白色的数据点是平面上的点,黑色的数据点事平面下的点。平面的颜色是由对应的商品销量的高低决定的,高是红色,低是蓝色。
利用 statsmodels 进行多元线性回归
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: import statsmodels.api as sm
In [4]: df_adv=pd.read_csv('g.csv',index_col=0)
In [6]: X=df_adv[['TV','Radio']]
In [7]: y=df_adv['Sales']
In [8]: df_adv.head()
Out[8]:
TV Radio Newspaper Sales
1 230.1 37.8 69.2 22.1
2 44.5 39.3 45.1 10.4
3 17.2 45.9 69.3 9.3
4 151.5 41.3 58.5 18.5
5 180.8 10.8 58.4 12.9
In [9]: X=sm.add_constant(X)
In [10]: est=sm.OLS(y,X).fit()
In [11]: est.summary()
Out[11]:
你也可以使用 statsmodels 的 formula 模块来建立多元回归模型
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Sales ~ TV + Radio',data=df_adv).fit()
处理分类变量
性别或地域都属于分类变量。
In [15]: df= pd.read_csv('httd.edu/~tibs/ElemStatLearn/datasets/SAheart.data', index_col=0)
In [16]: X=df.copy()
利用 dataframe 的 pop 方法将 chd 列单独提取出来
In [17]: y=X.pop('chd')
In [18]: df.head()
Out[18]:
sbp tobacco ldl adiposity famhist typea obesity alcohol \
row.names
1 160 12.00 5.73 23.11 Present 49 25.30 97.20
2 144 0.01 4.41 28.61 Absent 55 28.87 2.06
3 118 0.08 3.48 32.28 Present 52 29.14 3.81
4 170 7.50 6.41 38.03 Present 51 31.99 24.26
5 134 13.60 3.50 27.78 Present 60 25.99 57.34
age chd
row.names
1 52 1
2 63 1
3 46 0
4 58 1
5 49 1
In [19]: y.groupby(X.famhist).mean()
Out[19]:
famhist
Absent 0.237037
Present 0.500000
Name: chd, dtype: float64
In [20]: import statsmodels.formula.api as smf
In [21]: df['famhist_ord']=pd.Categorical(df.famhist).labels
In [22]: est=smf.ols(formula="chd ~ famhist_ord", data=df).fit()
分类变量的编码方式有许多,其中一种编码方式是虚拟变量编码(dummy-encoding),就是把一个 k 个水平的分类变量编码成 k-1 个二分变量。在 statsmodels 中使用 C 函数实现。
In [24]: est=smf.ols(formula="chd ~ C(famhist)", data=df).fit()
In [26]: est.summary()
Out[26]:
处理交互作用
随着教育年限(education)的增长,薪酬 (wage) 会增加吗?这种影响对男性和女性而言是一样的吗?
这里的问题就涉及性别与教育年限的交互作用。
换言之,教育年限对薪酬的影响是男女有别的。
#导入相关模块
In [1]: import pandas as pd
In [2]: import numpy as np
In [4]: import statsmodels.api as sm
#导入数据,存入 dataframe 对象
In [5]: df=pd.read_csv('/Users/xiangzhendong/Downloads/pydatafromweb/wages.csv')
In [6]: df[['Wage','Education','Sex']].tail()
Out[6]:
Wage Education Sex
529 11.36 18 0
530 6.10 12 1
531 23.25 17 1
532 19.88 12 0
533 15.38 16 0
由于性别是一个二分变量,我们可以绘制两条回归线,一条是 sex=0(男性),一条是 sex=1(女性)
#绘制散点图
In [7]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [9]: plt.xlabel('education')
In [10]: plt.ylabel('wage')
#linspace 的作用是生成从最小到最大的均匀分布的 n 个数
In [17]: education_linspace=np.linspace(df.Education.min(), df.Education.max(),100)
In [12]: import statsmodels.formula.api as smf
In [13]: est=smf.ols(formula='Wage ~ Education + Sex', data=df).fit()
In [18]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]0, 'r')
In [19]: plt.plot(education_linspace, est.params[0]+est.params[1]education_linspace+est.params[2]1, 'g')
以上两条线是平行的。这是因为分类变量只影响回归线的截距,不影响斜率。
接下来我们可以为回归模型增加交互项来探索交互效应。也就是说,对于两个类别,回归线的斜率是不一样的。
In [32]: plt.scatter(df.Education,df.Wage, alpha=0.3)
In [33]: plt.xlabel('education')
In [34]: plt.ylabel('wage')
#使用*代表我们的回归模型中除了交互效应,也包括两个变量的主效应;如果只想看交互效应,可以用:代替,但通常不会只看交互效应
In [35]: est=smf.ols(formula='Wage ~ Sex*Education', data=df).fit()
In [36]: plt.plot(education_linspace, est.params[0]+est.params[1]0+est.params[2]education_linspace+est.params[3]0education_linspace, 'r')
In [37]: plt.plot(education_linspace, est.params[0]+est.params[1]1+est.params[2]education_linspace+est.params[3]1education_linspace, 'g')
参考资料:
DataRobot | Ordinary Least Squares in Python
DataRoboe | Multiple Regression using Statsmodels
AnalyticsVidhya | 7 Types of Regression Techniques you should know!
ols方法得出函数:根据少量数据找出函数关系,一般用待定系数法或线性代数法。
正比例函数只要一组数据,一次函数要两组数据,二次函数通常要三组数据,利用最小二乘法可以简便地求得未知的数据,并使得所选择的回归模型应该使所有观察值的残差平方和达到最小。
函数的近代定义
给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示,函数概念含有三个要素:定义域A、值域B和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。