learn.lianglianglee.com/专栏/程序员的数学课/03 用数学决策,如何规划好投入、转化和产出?.md.html
2022-08-14 03:40:33 +08:00

323 lines
27 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>03 用数学决策,如何规划好投入、转化和产出?.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/程序员的数学课/00 开篇词 数学,编程能力的营养根基.md.html">00 开篇词 数学,编程能力的营养根基</a>
</li>
<li>
<a href="/专栏/程序员的数学课/01 从计数开始,程序员必知必会的数制转换法.md.html">01 从计数开始,程序员必知必会的数制转换法</a>
</li>
<li>
<a href="/专栏/程序员的数学课/02 逻辑与沟通,怎样才能讲出有逻辑的话?.md.html">02 逻辑与沟通,怎样才能讲出有逻辑的话?</a>
</li>
<li>
<a class="current-tab" href="/专栏/程序员的数学课/03 用数学决策,如何规划好投入、转化和产出?.md.html">03 用数学决策,如何规划好投入、转化和产出?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/04 万物可数学,经典公式是如何在生活中应用的?.md.html">04 万物可数学,经典公式是如何在生活中应用的?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/05 求极值:如何找到复杂业务的最优解?.md.html">05 求极值:如何找到复杂业务的最优解?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/06 向量及其导数:计算机如何完成对海量高维度数据计算?.md.html">06 向量及其导数:计算机如何完成对海量高维度数据计算?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/07 线性回归:如何在离散点中寻找数据规律?.md.html">07 线性回归:如何在离散点中寻找数据规律?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/08 加乘法则:如何计算复杂事件发生的概率?.md.html">08 加乘法则:如何计算复杂事件发生的概率?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/09 似然估计:如何利用 MLE 对参数进行估计?.md.html">09 似然估计:如何利用 MLE 对参数进行估计?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/10 信息熵:事件的不确定性如何计算?.md.html">10 信息熵:事件的不确定性如何计算?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/11 灰度实验:如何设计灰度实验并计算实验的收益?.md.html">11 灰度实验:如何设计灰度实验并计算实验的收益?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/12 统计学方法:如何证明灰度实验效果不是偶然得到的?.md.html">12 统计学方法:如何证明灰度实验效果不是偶然得到的?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/13 复杂度:如何利用数学推导对程序进行优化?.md.html">13 复杂度:如何利用数学推导对程序进行优化?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/14 程序的循环:如何利用数学归纳法进行程序开发?.md.html">14 程序的循环:如何利用数学归纳法进行程序开发?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/15 递归:如何计算汉诺塔问题的移动步数?.md.html">15 递归:如何计算汉诺塔问题的移动步数?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/16 二分法:如何利用指数爆炸优化程序?.md.html">16 二分法:如何利用指数爆炸优化程序?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/17 动态规划:如何利用最优子结构解决问题?.md.html">17 动态规划:如何利用最优子结构解决问题?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/18 AI 入门:利用 3 个公式搭建最简 AI 框架.md.html">18 AI 入门:利用 3 个公式搭建最简 AI 框架</a>
</li>
<li>
<a href="/专栏/程序员的数学课/19 逻辑回归:如何让计算机做出二值化决策?.md.html">19 逻辑回归:如何让计算机做出二值化决策?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/20 决策树:如何对 NP 难复杂问题进行启发式求解?.md.html">20 决策树:如何对 NP 难复杂问题进行启发式求解?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/21 神经网络与深度学习:计算机是如何理解图像、文本和语音的?.md.html">21 神经网络与深度学习:计算机是如何理解图像、文本和语音的?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/22 面试中那些坑了无数人的算法题.md.html">22 面试中那些坑了无数人的算法题</a>
</li>
<li>
<a href="/专栏/程序员的数学课/23 站在生活的十字路口,如何用数学抉择?.md.html">23 站在生活的十字路口,如何用数学抉择?</a>
</li>
<li>
<a href="/专栏/程序员的数学课/24 结束语 数学底子好,学啥都快.md.html">24 结束语 数学底子好,学啥都快</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>03 用数学决策,如何规划好投入、转化和产出?</h1>
<p>在工作和生活中,我们经常会说“这样做,划不划算?”其实这是做每个决策时都会面临的一个问题,也就是心里得有个“小算盘”。</p>
<p>那么怎么我们应该怎么“算账”呢?算完账后又应该如何决策呢?</p>
<p>下面我会先讲一个我的<strong>算账定律</strong>,带你在麻将局中认识算账的关键三要素:系统、指标、兑换;然后再带你回到学生时代的“补习场景”,认识<strong>转化漏斗分析法</strong>,看到外部力量向指标的转化路径;最后,还是回归各位程序员的现实工作场景中,通过三个案例看到不同的转化路径,深入理解“投入”“转化”“产出”三者的关系。</p>
<p>本课时的内容梗概如下图所示,可供你参考学习。</p>
<p><img src="assets/Ciqc1F-dAjGAePO0AAIvOCLSQwY954.png" alt="图片1.png" /></p>
<h3>公瑾的算账定律</h3>
<p>要算账,你需要先明确算账的对象,也就是你在算谁的账。虽然是同一件事情,但对象不一样,可能导致结果的截然不同。</p>
<p>假设你与好友大聪明、大漂亮、大迷糊一起打麻将4 个小时的激烈斗争后,你们的盈亏账单如下:</p>
<p><img src="assets/Ciqc1F-dAkGAHf0YAAFxp6MOKgc147.png" alt="图片2.png" /></p>
<p>假设计算的对象是你,那么会得到总盈亏为 100 元,胜率 40%,平均每局盈利 2 元。如果计算对象是你们四个人,那么会得到总盈亏为 0 元,平均每局盈利 0 元。</p>
<p>你会发现,在整个“麻将局”这一大的系统下,即使每个人的盈亏不同,但整体看这个“系统”的总盈亏情况是 0也就是不盈不亏。</p>
<p>所以接下来,给你介绍一个<strong>算账定律:对于一个没有外部力量作用的系统,它的总账为零</strong>。就好比,将你们 4 个人看作一个系统,打麻将只是系统内部的动作,整个系统并没有受到任何来自外部力量的作用,因此总账必然为零,这与物理学中的能量守恒定律很像。</p>
<p><strong>相反,如果一个系统受到了外部力量,那么总账就可能不是零了。</strong> 就好比,把你一个人看作一个系统,再把大聪明、大漂亮和大迷糊 3 个人看作是另一个系统,然后在系统和系统间的相互作用下。最后,你的系统盈利了 100 元,而另一个 3 人合体的系统亏损了 100 元。</p>
<h3>关键要素:系统、指标和兑换</h3>
<p>利用算账定律时,你需要把握好以下几个关键要素,分别是系统、指标和兑换。我们以大漂亮的学习成绩为例展开讨论。</p>
<p><strong>系统</strong>,就是一个个对象,它包括了你研究的目标对象,也包括了影响你研究目标的外部系统。对于大漂亮的学习而言,大漂亮就是一个系统,老师也是一个系统。</p>
<p><strong>指标</strong>,是评价系统运转结果的数学变量,即总账。例如,对于大漂亮的系统而言,指标包括但不限于考试成绩、生活愉悦度、日均自习时长、日均参加补习班的时长、日均娱乐时长等。</p>
<p><strong>兑换</strong>,是个动作,也是个结果,即你在用什么来换取什么。算账定律(算账版的能量守恒定律)说到,对于一个没有外部力量作用的系统,它的总账为零;反过来说,要想指标(总账)有提高,就需要借助外部力量,并把它兑换为指标的提高。</p>
<p>我们以大漂亮想要提升考试成绩为例,通过两种方式来看看系统情况:</p>
<ul>
<li>第一种方式是去参加补习班。此时,大漂亮是一个系统,补习班老师是另一个系统。大漂亮系统,在借助补习班老师系统的外部作用,来兑换出考试成绩的提高。</li>
<li>而另一个方式是减少娱乐时长,用来增加自习时长。此时大漂亮系统没有接收外力,那么总账还是零吗?依然是。大漂亮成绩提高了,但是娱乐时间变少,导致生活愉悦度下降,这是一种系统内部的兑换。</li>
</ul>
<p>对这个大漂亮的例子,我们可以得出以下结论:</p>
<ul>
<li>在外部力量改变的时候(例如,从参加大糊涂补习班,更改为参加小天才补习班),会让系统的总账变好。即生活愉悦度不折损的基础上,提高学习成绩。</li>
<li>在外部力量不改变的时候,系统总账不变,但可以通过系统内部兑换,提高某个指标。即减少娱乐时长,增加自习时长。通过降低生活愉悦度,兑换出学习成绩的提高。对于大漂亮而言,有得有失,总账不变。</li>
</ul>
<p>这两种方式的结论分别如下图所示:</p>
<p><img src="assets/CgqCHl-dAl2AMgR6AAKZS4cgyHc931.png" alt="图片3.png" /></p>
<h3>转化漏斗分析法</h3>
<p>从上面“打麻将”和“大漂亮提升成绩”的例子,你会发现纯内部力量的调整,只是左手倒右手的兑换,而让指标变得更好的方式是,要借助外部力量。</p>
<p>有了外部力量之后,就要开始分析外部力量作用在系统中的效率,这就需要<strong>转化漏斗分析法</strong></p>
<ul>
<li><strong>转化</strong>,是一个动作,表示的是外部力量转化为指标提高的动作过程。</li>
<li>漏斗,代表了效率,即转化过程的<strong>投入</strong><strong>产出</strong>分别是多少。</li>
</ul>
<p>转化漏斗分析,能够辅助你看清转化路径,并寻找瓶颈予以突破。</p>
<p><img src="assets/CgqCHl-dAm-ARmWlAADPH2Q_UMM974.png" alt="图片4.png" /></p>
<p>我们继续以大漂亮参加补习班为例。假设大漂亮每天参加 3 个小时的补习班学习,最终学习成绩获得了 10 分的提高。那么问题来了,这 3 小时的补习转化为 10 分的提高,转化路径是什么?转化效率如何?是否还有提高的空间呢?</p>
<p>带着这些问题,我们通过对大漂亮学习的无死角跟踪。我们发现,补习时长转化为分数提高的路径为:</p>
<ul>
<li>投入补习的时间,可以拆分为认真听课的时间,和不认真听课(玩手机、打瞌睡)的时间。</li>
<li>认真听课的时间里,会带来掌握知识点的提高。</li>
<li>掌握的知识点,会换取考试成绩的提高。</li>
</ul>
<p><img src="assets/CgqCHl-dAyiAa4RRAADxoNcVkX0641.png" alt="图片4.1.png" /></p>
<p>根据转化路径,我们就能计算出转化效率。下表是大漂亮的转化效率表:</p>
<p><img src="assets/CgqCHl-dA26AfrqCAADYY70w1tQ402.png" alt="图片5.png" /></p>
<p>假设大聪明也采取了上补习班提升成绩的方式,我们补充下大聪明的转化效率表,和大漂亮的转化效率对比观察。</p>
<p><img src="assets/CgqCHl-dA36ARiTnAADUPzL1DXI648.png" alt="图片6.png" /></p>
<p>根据对比就会有如下的数据洞察:</p>
<ul>
<li>72% &gt; 56%,所以大漂亮上课更加认真听讲;</li>
<li>3.85% &lt; 6%,大漂亮虽然认真听课,但她没有很好地理解老师所讲的知识点。显然,大漂亮的理解和学习能力需要提高;</li>
<li>考试技巧方面,大漂亮和大聪明是一样的,即掌握的知识点转化为分数的效率都是 2分/知识点。</li>
</ul>
<p>但整体看下你会发现,最终大聪明的转化效率还是要更高的。同样的补习时长,大聪明的成绩提高更多,仅仅因为在转化漏斗的过程中,大聪明在“掌握知识点”这一步做得更好。</p>
<p>所以据此,我们可以给出大漂亮如下学习建议:</p>
<p>大漂亮需要提高自己对知识点的吸收和理解能力。对于大漂亮而言,这是提高成绩最有效的方式。假设大漂亮也能以 6% 的转化率吸收知识,那么大漂亮会得到 130×6%×2 = 15.6 分的提高,这相当于她现在 15.6÷2÷3.85%÷72% = 281 分钟的参加补习时长投入!</p>
<p>虽然在真正的学习生活中,没有人会像这样计算自己工作、学习的转化漏斗情况,但这种思维方式却会影响我们做事风格。每个人的学生时代,班里都会有个超努力但学习总是中游的同学,他们其实就是转化漏斗出了问题,仅想着扩大自己的底部橙色区域的精力和时长,没想着如何提升转化效率,也就是精力没用到刀刃上。</p>
<p><strong>而一个做事风格高效的人,心里是有自己的转化漏斗的,尤其在复杂的工作业务中。他会用这种思维去理解许多事情的本质和原理,抓住关键要素,认清系统、指标、兑换,并规划好投入、转化、产出,将复杂过程简单化。</strong></p>
<h3>案例 程序员工作中的“算账”场景</h3>
<p>讲完了算账定律和漏斗分析法,我们给出一些程序员工作中可能遇到的算账案例。</p>
<p>假设某头条 App 有一个推荐系统的技术团队,负责用户的 PV 指标page view 页面点击量),它的基本思路如下图所示。长大后的大聪明、大漂亮、大迷糊均在这一团队中,我们看下他们各自的表现。</p>
<p><img src="assets/CgqCHl-dA6SAcd9qAAFe3REeIyk075.png" alt="图片7.png" /></p>
<h4>案例 1 没有外力,系统内部指标转化</h4>
<p>假设长大后的大聪明是该团队的其中一个推荐算法工程师,他设计的推荐系统方案是:对每个用户,利用 CTRClick-Through-Rate点击率模型预测用户点击文章的概率。接着只推荐点击率大于阈值设置为 0.8)的文章给用户,并形成首页的 feed 流。</p>
<p>有一天,大聪明调整了点击率阈值,由 0.8 提高到了 0.9,其余影响因素都没有变,你来帮大聪明算算账,看他这样的动作对这个推荐系统是否有帮助。</p>
<p>分析:先看一下我们的分析对象,也就是<strong>系统</strong>。此时,我们的系统可以是这个推荐系统。<strong>指标</strong>自然就是这个系统在用户身上产生的 PV。大聪明的动作是调整了点击率阈值这很显然是个系统内部的改动并没有外部力量注入这个系统。接下来我们对比分析一下两种不同阈值的转化路径。</p>
<p><img src="assets/Ciqc1F-dG7OAa-eAAAF4X8VCPPc965.png" alt="图片8.png" /></p>
<p>我们的 App 总共有注册用户 100 人,其中 50 人会在统计数据的观察期间内打开过 App我们的库存文章总量为 1000 篇。</p>
<ul>
<li>当设置阈值为 0.8 的时候,总共的曝光是 500 人次,最终产生的阅读量是 420 人次;</li>
<li>当阈值提高设置为 0.9 的时候,符合 CTR 阈值门槛的文章必然会减少。</li>
</ul>
<p>因此,曝光量由 500 人次降低到 470 人次。</p>
<p>但运气比较好,提高了阈值之后,<strong>由于文章匹配度更高,反而带来了更多的页面点击量</strong>430 人次)。对于这个推荐系统而言,<strong>在没有外力的情况下,通过折损了曝光量,兑换到了 PV 的提高</strong></p>
<p>这个兑换是否合理,或者说是否划算,可能要综合公司业务的现状来考量。</p>
<h4>案例 2 借助外力,指标提升</h4>
<p>长大后的大漂亮是其中的一个前端工程师,他从 App 前端交互上,优化了一些功能上的体验,例如 App 闪退、文章打开缓慢等问题。假设其余的影响因素都没有变化,我们再来帮大漂亮算算账吧。</p>
<p>分析:我们的系统、指标、转化路径都没有发生改变。但由于修复了系统 bug已经不再是系统内部的改动了。这个推荐系统有外力注入其中而这个外力就是大漂亮的代码。此时转化路径的指标就变成了如下图表所示。</p>
<p><img src="assets/Ciqc1F-dA_aAPKelAAFJs4gJXVg325.png" alt="图片9.png" /></p>
<p>当 bug 修复之后,注册用户数、打开 App 用户数、文章的曝光量都没有改变。但是因为<strong>产品交互体验变好了</strong>,用户点击文章的 PV 由 420 提高到了 430。</p>
<p>对于这个推荐系统而言,在有外力的情况下,外力换来了 PV 的提高。这个功能迭代就是合理的、划算的,毫无疑问是有价值的。</p>
<h4>案例 3 借助外力,指标提升</h4>
<p>长大后的大迷糊是其中一个建模工程师,他从 CTR 模型上进行优化,让 CTR 模型的预估准确率大幅提高。随后,他使用模型的方法是,给用户曝光模型预估 CTR 最高的 500 篇文章。假设其他影响因素都没有变化,你再来帮大迷糊算算账吧。</p>
<p>分析:此时 CTR 模型的准确率被提高了,这个推荐系统就又有了外力注入。而这个外力,就是模型哥做的 CTR 新模型,此时转化路径的指标就变成了下方图表所示。</p>
<p><img src="assets/Ciqc1F-dG52ASoJ7AAFBQB3WdUg225.png" alt="图片10.png" /></p>
<p>当 CTR 模型准确率提高后,注册用户数、打开 App 用户数、文章的曝光量都没有改变。<strong>但是因为模型更准了,用户曝光的文章跟用户的兴趣更匹配</strong>PV 由 430 提高到了 450。</p>
<p>对于这个推荐系统而言,在有外力的情况下,外力换来了 PV 的提高。这个功能迭代就是合理的、划算的,毫无疑问是有价值的。可见大迷糊,不仅不迷糊,反而很有业务能力。</p>
<p>还是那句话,转化漏斗分析法的应用是非常灵活的,以上三个案例仅仅是想向你展示这个思维在工作中的应用,工作中具体如何实践“转化漏斗分析法”,还是得看你的理解和思考。</p>
<h3>小结</h3>
<p>这一课时,我们重点讲述了两方面的内容,一是算账定律,另一个是转化漏斗分析。<strong>算账定律</strong>告诉我们,在没有外力注入的情况下,总账为零。即通过牺牲系统内的某个指标,换取另一个指标的提高。<strong>转化漏斗分析</strong>是在有外力的情况下,根据外力向指标的转化路径,寻找转化效率和转化瓶颈的分析方法。</p>
<p>这两方面的思维,非常利于我们看到生活中很多事情的本质。</p>
<p>例如,大迷糊想赚更多钱。一种方法是增加工作时间,利用休息时间自己“琢磨”技能,相当于大漂亮的“通过自习提升成绩”,这就是在没有外力的情况下系统内部的动作。</p>
<p>另一种方法是,大迷糊学习拉勾教育的课程,在专业大佬的指引下,找到能力提升通道,提升自己的溢价空间,这就是一个注入大迷糊系统的外部力量。利用这个力量,大迷糊在同样的时间内,换来了更多的收入回报。很明显,通过外部力量换来的指标提高,才是可持续的、良性的指标增长方式。</p>
<p><strong>当然,无论是哪种方式,只要是在不断地提升自我、挑战自我,都是可取并让人敬佩的。</strong> 只不过“方法比过程更重要”,这一课时的主题是“如何规划好投入、转化和产出”,希望你也能将这一思维应用到生活中,找到达到目标的最优方法。</p>
<p>你在工作、生活中有哪些运用到转化漏斗分析法的例子?或者你对此有什么感悟和想法?欢迎在下方留言区与大家分享。</p>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/程序员的数学课/02 逻辑与沟通,怎样才能讲出有逻辑的话?.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/程序员的数学课/04 万物可数学,经典公式是如何在生活中应用的?.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997bc27c9c3cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>