美文网首页
plotly 996和幸福感因果回归分析

plotly 996和幸福感因果回归分析

作者: Python_Camp | 来源:发表于2022-04-09 15:05 被阅读0次

github
https://plotly.com/python/

image.png image.png image.png image.png image.png image.png image.png image.png
import plotly.io as pio

import pandas as pd

df = pd.read_csv("https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv")

colors = ['blue', 'orange', 'green', 'red', 'purple']

opt = []
opts = []
for i in range(0, len(colors)):
    opt = dict(
        target = df['continent'][[i]].unique(), value = dict(marker = dict(color = colors[i]))
    )
    opts.append(opt)

data = [dict(
  type = 'scatter',
  mode = 'markers',
  x = df['lifeExp'],
  y = df['gdpPercap'],
  text = df['continent'],
  hoverinfo = 'text',
  opacity = 0.8,
  marker = dict(
      size = df['pop'],
      sizemode = 'area',
      sizeref = 200000
  ),
  transforms = [
      dict(
        type = 'filter',
        target = df['year'],
        orientation = '=',
        value = 2007
      ),
      dict(
        type = 'groupby',
        groups = df['continent'],
        styles = opts
    )]
)]

layout = dict(
    yaxis = dict(
        type = 'log'
    )
)

fig_dict = dict(data=data, layout=layout)
pio.show(fig_dict, validate=False)

image.png
import plotly.graph_objects as go
import numpy as np

# Create figure
fig = go.Figure()

# Add traces, one for each slider step
for step in np.arange(0, 5, 0.1):
    fig.add_trace(
        go.Scatter(
            visible=False,
            line=dict(color="#00CED1", width=6),
            name="𝜈 = " + str(step),
            x=np.arange(0, 10, 0.01),
            y=np.sin(step * np.arange(0, 10, 0.01))))

# Make 10th trace visible
fig.data[10].visible = True

# Create and add slider
steps = []
for i in range(len(fig.data)):
    step = dict(
        method="update",
        args=[{"visible": [False] * len(fig.data)},
              {"title": "Slider switched to step: " + str(i)}],  # layout attribute
    )
    step["args"][0]["visible"][i] = True  # Toggle i'th trace to "visible"
    steps.append(step)

sliders = [dict(
    active=10,
    currentvalue={"prefix": "Frequency: "},
    pad={"t": 50},
    steps=steps
)]

fig.update_layout(
    sliders=sliders
)

fig.show()
image.png
import pandas as pd
df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2014_apple_stock.csv')
df.head()
image.png
import pandas as pd
import plotly.express as px

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2014_apple_stock.csv')

fig = px.line(df, x = 'AAPL_x', y = 'AAPL_y', title='Apple Share Prices over time (2014)')
fig.show()
image.png
import plotly.express as px

df = px.data.gapminder()
fig = px.scatter(df, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country",
           size="pop", color="continent", hover_name="country",
           log_x=True, size_max=55, range_x=[100,100000], range_y=[25,90])

fig["layout"].pop("updatemenus") # optional, drop animation buttons
fig.show()
image.png

plotly 炫酷效果-

#https://plotly.com/python/

import plotly.express as px
from vega_datasets import data
df = data.disasters()
df = df[df.Year > 1990]
fig = px.bar(df,
             y="Entity",
             x="Deaths",
             animation_frame="Year",
             orientation='h',
             range_x=[0, df.Deaths.max()],
             color="Entity")
# improve aesthetics (size, grids etc.)
fig.update_layout(width=1000,
                  height=800,
                  xaxis_showgrid=False,
                  yaxis_showgrid=False,
                  paper_bgcolor='rgba(0,0,0,0)',
                  plot_bgcolor='rgba(0,0,0,0)',
                  title_text='Evolution of Natural Disasters',
                  showlegend=False)
fig.update_xaxes(title_text='Number of Deaths')
fig.update_yaxes(title_text='')
fig.show()

因果推理的必要性
探索我们为什么要处理因果关系的一个简单原因

照片:Michal Mrozek on Unsplash
机器学习领域的后期趋势之一是因果推断或因果关系的概念。简而言之,它应该回答这样的问题。
一个特征(称为治疗)对另一个特征(称为反应或结果)的影响是什么?
因果推断绝不是一个新的方法--它至少有50年的历史,并且已经在社会科学、经济学和政治科学中使用了很长时间。在医学上,一个具体的问题可以是。
服用一种药丸对病人的生存概率有什么影响?
在这里,治疗是二元的(给药?是/否),而反应是在0和1之间连续的(一种概率),例如。
对这个问题的天真看法
作为一个抽象而简单的例子,设想我们有一个数据集,其中有一个单一的特征x和一个目标y。

图片由作者提供。
要做到这一点,让我们假设我们对数据进行了线性模型ŷ=2x+1的拟合,该模型的性能还算不错。现在x对y的影响是什么?好吧,由于线性模型的简单形式,我们可以这样描述其影响:x增加1,y增加2。

图片由作者提供。
但请稍安勿躁,当我们引入更多的变量时,事情就变得有趣了。
许多特征,许多答案
我创建了一个小的数据集来告诉你,答案并不总是那么清晰。就在Python中跟着做吧。

import pandas as pd
data = pd.read_csv('https://raw.githubusercontent.com/Garve/datasets/5734e7783ed5c39b03348fe7484af19d9936ed9f/causal.csv')

在这里,我们已经加载数据集。
每一行对应于一个假设的人。每个人都有以下特征:
职责感
加班的数量(待遇)
幸福感,以及
收入(反应)

我们现在想找出加班对收入的影响,这应该是一个非常简单的问题。让我们也使用线性回归,因为我们可以很容易地用一个数字描述加班对收入的影响--加班系数的斜率。所以,让我们抓住scikit-learn,做我们最擅长的事情。

我们现在将运行一个简单的线性回归,将Overtime作为输入特征,Income作为目标。在试图回答这个问题时,这感觉是最直接的做法。

酷,所以增加1个加班时间就能增加2.8个收入,对吗?好吧,也许吧,让我们先检查一下这个模型是否抓住了数据。

from sklearn.model_selection import cross_val_score
print(cross_val_score(LinearRegression(), X, y).mean()) 
# Output:
# 0.9566128136325356

5倍交叉验证的平均r²(在我写这篇文章的时候,scikit-learn的标准方法)大约是0.95,这是非常体面的,所以我们应该能够相信模型告诉我们的一切。

但是我们的口袋里有更多的功能,对吗?更多的信息是更好的,所以让我们使用它们。我们现在将使用处理方法Overtime以及额外的回归因子Sense of duty

X = data[['Overtime', 'Sense of duty']]。
y = data['Income']
Print(LinearRegression().fit(X, y).coef_)

# Output: 
# [1.99819195 0.98356566]

使用这两个特征,故事发生了很大的变化。现在,增加1个加班时间意味着收入只增加了2个,而不是之前的2.8个! 5倍的平均r²也比以前略好,约为0.976。

如果我们也使用最后一个特征--幸福感--呢?

X = data[['Overtime', 'Sense of Duty', 'Happiness']]
y = data['Income']
print(LinearRegression().fit(X, y).coef_)
# Output: 
# [2.92794148 0.52911897 0.46879848]

Overtime的斜率再次发生变化,这次是2.9左右。 这里的5倍平均r²约为0.987,这是最高值。
那么,对于 "加班如何影响收入?"这个简单的问题,你的最终答案会是什么?
真正的斜率是否...
...大约2.8,因为只用加班费作为预测因素,以最直接的方式回答了这个问题?
...大约2.9,因为我们使用了所有可用的特征,而且5倍的平均r²在那里是最高的?
...大约2,因为...它是唯一的偶数质数?😅
...完全不同的东西?

如果你理解了这里的斗争,那么恭喜你,你知道因果推理是为了什么了

解决争论
在这篇非常基本的介绍文章中,我无法告诉你如何系统地解决这个问题--这是另一篇文章的内容。如果你等不及了,如果你等不及了😉,我也不会感到惊讶,可以看看布雷迪-尼尔制作的这些关于因果
让我给你一些关键词:它与因果图、混杂物、碰撞器和do-calculus有关系。 我还能为你做的是给你一些关于这些东西的直觉。

因果图
数据集的因果图是一个你可以读出哪些特征相互影响的图。因果推理中典型的--不幸的是极其困难的--问题是得到这个图。因为我自己通过一些规则创建了这个数据集,所以我可以给你它的因果图。

图片由作者提供。
用一句话来说。
责任感影响着加班和收入。
加班时间影响收入和幸福感。
收入影响幸福感。
同样,获得这类声明(即因果图)是非同小可的。我们只是很幸运,因为这个数据集是合成的,而且我知道生成过程。顺便说一下,它是如下的。

import numpy as np
import pandas as pdnp.random.seed(0)duty = np.random.randn(1000) + 4
overtime = duty + 3.5 + 0.5*np.random.randn(1000)
income = duty + 2*overtime + 10 + 0.5*np.random.randn(1000)
happiness = income - 4*overtime + 6 + 0.5*np.random.randn(1000)data = pd.DataFrame({
    'Sense of duty': duty,
    'Overtime': overtime,
    'Happiness': happiness,
    'Income': income
})

在这里,我们可以看到哪些特征会影响哪些其他特征,另外,我们甚至可以直接从上面标有粗体字的部分看到2是正确的答案。
再比如说,从这一行来看

overtime = duty + 3.5 + 0.5*np.random.randn(1000)

我们可以看到职责感是如何影响加班的,因此有一个从职责到加班的箭头。

混杂因素和冲突因素

同时影响治疗和反应的特征被称为混杂因素。在我们的案例中,责任感是我们唯一的混杂因素,我们必须对它进行控制,这基本上意味着我们必须把它包括在回归中。

另一方面,幸福感不是一个混杂因素,而是一个碰撞因素。正如我们在这里看到的那样,将碰撞者包括在回归中会引起问题。

注意:你不必理解为什么这些东西会这样工作,因为我没有向你解释任何东西。我们可以在另一篇文章中介绍。

做微积分
使用Judea Pearl发明的所谓do-calculus,我们可以证明我刚刚抛给你的关于混杂者、碰撞者等的陈述。这个话题的标准资源是朱迪亚-珀尔的《为什么之书》。

结语
在这篇文章中,我们通过一个小例子看到,即使是像 "一个特征对另一个特征的影响是什么?"这样简单的问题,也不能用天真的方式正确回答。我们必须投入更多的精力来解决与因果关系有关的问题,而这正是我们需要因果推理的原因。

因果推理是一个有趣的领域,也是极其重要的,因为它可以让你推理出真正的因果关系--这是你得出正确结论所需要的。否则,你将会有几个同样好的模型,告诉你关于一个特征对另一个特征的影响的完全不同的故事,就像我们一样。

相关文章

网友评论

      本文标题:plotly 996和幸福感因果回归分析

      本文链接:https://www.haomeiwen.com/subject/ndupsrtx.html