<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>白加黑</title>
  
  <subtitle>重要的不是拥有了什么 | 而是留下了什么</subtitle>
  <link href="https://blog.blublu.site/atom.xml" rel="self"/>
  
  <link href="https://blog.blublu.site/"/>
  <updated>2023-02-10T14:49:20.000Z</updated>
  <id>https://blog.blublu.site/</id>
  
  <author>
    <name>Blute Fu</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>js的优化写法</title>
    <link href="https://blog.blublu.site/2023/02/js-good-code/index.html"/>
    <id>https://blog.blublu.site/2023/02/js-good-code/index.html</id>
    <published>2023-02-10T14:49:20.000Z</published>
    <updated>2023-02-10T14:49:20.000Z</updated>
    
    <content type="html"><![CDATA[<p>记录下js的几种优秀写法</p><span id="more"></span><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 多条件判断的精简写法 </span></span><br><span class="line"><span class="keyword">const</span> options [<span class="string">&#x27;si&#x27;</span>,<span class="string">&#x27;xue&#x27;</span>,<span class="string">&#x27;tang&#x27;</span>];</span><br><span class="line"><span class="keyword">if</span> (options.includes(value))&#123;</span><br><span class="line">  <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 如果条件不满足，则直接返回</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">handleFun</span>(<span class="params">event</span>)</span></span><br><span class="line"><span class="function">  <span class="title">if</span> (<span class="params">!event || !event.target</span>)</span>&#123;</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// es6新增语法，可以避免null值无属性的报错</span></span><br><span class="line"><span class="keyword">const</span> value reponse?.data?.text <span class="comment">// 链式运算符，无则返回undefined</span></span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 取数组最后一位</span></span><br><span class="line"><span class="keyword">const</span> value = arr.at(-<span class="number">1</span>)</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 判断赋值，如果foo为 null/undefined/0/false等用||，如果foo为null/undefined用??</span></span><br><span class="line"><span class="comment">// 具体见：https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing</span></span><br><span class="line"><span class="keyword">const</span> value = foo || bat</span><br><span class="line"><span class="keyword">const</span> value = foo ?? bat</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 三目运算符赋值</span></span><br><span class="line"><span class="keyword">const</span> value = a ? b : c</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 数组去重</span></span><br><span class="line"><span class="keyword">const</span> value = <span class="function">(<span class="params">arr</span>)=&gt;</span> [... <span class="keyword">new</span> <span class="built_in">Set</span>(arr)]</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//去除数组空项</span></span><br><span class="line"><span class="keyword">let</span> arr=[<span class="number">1</span>,<span class="number">2</span>,,<span class="number">4</span>,<span class="number">5</span>];</span><br><span class="line">arr.flat(arr)</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> a = <span class="number">3</span>;</span><br><span class="line"><span class="keyword">const</span> c = <span class="literal">null</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// a||c,输出第一个不为Falsy的值</span></span><br><span class="line"><span class="comment">// falsy有false、0、-0、0n、&quot;&quot;、null、undefined 和 NaN</span></span><br><span class="line"><span class="built_in">console</span>.log(a || c);</span><br><span class="line"><span class="comment">// Expected output: 3</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// a&amp;&amp;c,输出第一个不为Truthy的值</span></span><br><span class="line"><span class="comment">// 除 false、0、-0、0n、&quot;&quot;、null、undefined 和 NaN 以外的皆为Truthy</span></span><br><span class="line"><span class="built_in">console</span>.log(a &amp;&amp; c);</span><br><span class="line"><span class="comment">// Expected output: null</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;记录下js的几种优秀写法&lt;/p&gt;</summary>
    
    
    
    <category term="前端" scheme="https://blog.blublu.site/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="js" scheme="https://blog.blublu.site/tags/js/"/>
    
  </entry>
  
  <entry>
    <title>流量归因模型</title>
    <link href="https://blog.blublu.site/2021/11/attribution-model/index.html"/>
    <id>https://blog.blublu.site/2021/11/attribution-model/index.html</id>
    <published>2021-11-27T16:00:00.000Z</published>
    <updated>2021-11-27T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>流量的归因存在多种模型，比如首次归因、末次归因、平均归因、马尔科夫链流量归因等等，在电商场景下对流量的归因主要应用于流量入口归因，以及具体页面的转化归因，主要解决的问题是以下两个：</p><ol><li>首屏放置了多个不同板块的流量入口，需要评估具体的流量效率，哪个入口的流量转化率最高</li><li>整个app上有非常多的页面，每个页面都会涉及到流量的转化，那每个页面的转化率如何计算</li></ol><span id="more"></span><p>对于归因而言，可以只在考虑当前状态的基础上考虑归因，如下图的几种归因方式，但是在营销领域，存在流量作弊的情况，所以就应运而生了马尔科夫链流量归因这种从全局角度出发进行归因的方案，这里做一个详细的拆解。<br><img src="https://i.loli.net/2020/03/26/mTn1i2SspUZvgua.png" alt="神策归因模型.png"></p><p><strong>未完待续</strong></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;流量的归因存在多种模型，比如首次归因、末次归因、平均归因、马尔科夫链流量归因等等，在电商场景下对流量的归因主要应用于流量入口归因，以及具体页面的转化归因，主要解决的问题是以下两个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首屏放置了多个不同板块的流量入口，需要评估具体的流量效率，哪个入口的流量转化率最高&lt;/li&gt;
&lt;li&gt;整个app上有非常多的页面，每个页面都会涉及到流量的转化，那每个页面的转化率如何计算&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="数据驱动" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8/"/>
    
    
    <category term="归因" scheme="https://blog.blublu.site/tags/%E5%BD%92%E5%9B%A0/"/>
    
  </entry>
  
  <entry>
    <title>web界面设计</title>
    <link href="https://blog.blublu.site/2021/06/web-gui-design/index.html"/>
    <id>https://blog.blublu.site/2021/06/web-gui-design/index.html</id>
    <published>2021-06-21T16:00:00.000Z</published>
    <updated>2021-06-21T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>依据《用户体验的要素》这本书对产品设计层级的划分，框架层和界面层对应的就是我们所理解的产品界面设计。</p><span id="more"></span><p>一直在找一本书，能够把所有的界面设计全部纳入其中，也就是《用户体验的要素》中的框架层和界面层，比如导航布局，交互方式，错误提醒，表格展示等等的设计逻辑？<br>《简约至上》，《点石成金》算是这种类型的书，但是有没有更细粒度的拆分，比如按钮，为什么用这个按钮，表格，如何展示表格数据等原则依然是一头雾水，《web界面设计》算是一本书，但是过于枯燥，例子也太古老。直到我看到了Ant Design和AntV的设计文档，立即觉得这就是我要找的。所以，这里对二者的文档结合书籍进行拆解，整理为自己需要的设计系统。</p><p>由于涉及的内容过多，所以单独做了个文档网站。</p><p><a href="https://www.blublu.site/design/">文档地址点这里</a></p><p><img src="https://img.blublu.site/20211121205407.png" alt="image-20211121205402088"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;依据《用户体验的要素》这本书对产品设计层级的划分，框架层和界面层对应的就是我们所理解的产品界面设计。&lt;/p&gt;</summary>
    
    
    
    <category term="数据产品" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E4%BA%A7%E5%93%81/"/>
    
    
  </entry>
  
  <entry>
    <title>埋点的spm和scm模型</title>
    <link href="https://blog.blublu.site/2021/04/spm-scm-model/index.html"/>
    <id>https://blog.blublu.site/2021/04/spm-scm-model/index.html</id>
    <published>2021-04-23T16:00:00.000Z</published>
    <updated>2021-12-03T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>spm和scm是埋点中定义传入参数的一种模型，其本质还是埋点的属性通过一定的规范进行传输，只是一种传参模式。那么如何搭建SPM方案呢？ 以及如何更有效的体现其业务价值呢？</p><span id="more"></span><p>从百度统计上看到有很多人访问了我这篇文章，说明还是有一定数量的人在关注这块儿，以前写的过于随意，所以就更新了下。</p><ol><li><p>updated  2021-11-03</p></li><li><p>updated  2021-12-04</p></li></ol><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>首先引入一个问题，如何用一句话描述app的所有内容？简单来说，就是用户+物品+事件的集合体，这也是神策分析底层的数据模型，user+item+event模型，这里的事件指的就是用户的行为，我们对事件的追踪也叫用户行为采集，就是我们常说的埋点，那么如何描述用户的行为？4w1h的逻辑</p><p><img src="https://i.loli.net/2020/05/30/sC6SY8FtegVyMZo.png"></p><p>具体来讲，what代表的是event，where代表位置，在app的初始阶段，我们可能只需要关注到页面粒度，即event发生在某个page，但是随着业务的发展以及对精细化分析能力的要求，where的关注粒度可能需要进一步下沉，在app上，体现的就是不仅仅要知道event发生的page，还要细化到改page下具体的楼层和具体的点位，也就是具体的评估指标从页面级精细化到楼层和坑位级别，这也是我们引入spm这一套方案的目的。</p><p>在查阅spm资料的过程中，发现阿里推出过一款数据产品Quick Analytics Plus（现已改名Quick Tracking），这款产品的<a href="https://help.aliyun.com/apsara/enterprise/v_3_12_0_20200630/man/enterprise-user-guide/t2277443.html">文档</a>里有对应的埋点管理模型描述，如下图。其内部的埋点管理逻辑是位置 &gt; 事件，我称之为位置优先的埋点模型，在该模型下，事件是限定在位置下的事件，意味着其内部可能有着成千上万的埋点事件……</p><img src="https://img.blublu.site/20211204125458.png" style="zoom: 33%;" /><p>两种模型的对比如下表：</p><table><thead><tr><th>对比维度</th><th>事件优先</th><th>位置优先</th></tr></thead><tbody><tr><td>主要使用方</td><td>神策</td><td>淘宝</td></tr><tr><td>主要差异点</td><td>事件优先，即事件是位置的上一层级，同一事件可以多位置复用</td><td>位置优先，即位置是事件的上一层级，不同位置的相同事件，其埋点事件可能不同</td></tr><tr><td>结构对比</td><td></td><td></td></tr><tr><td>事件量对比</td><td>少</td><td>多多多多多</td></tr><tr><td>使用上对比</td><td>基于统一的事件逻辑，使用方不用频繁参考不同的事件文档</td><td>每个埋点的参数其字段和格式可能都是不同的，需要case by case，阿里用了spm和scm进行了一定的规范</td></tr></tbody></table><p>当然，也有可能是由于埋点模型的不同，阿里当年做spm的目的可能仅仅只是做一套位置规范化，将散落于how中的位置参数统一，并不是我说的只到页面粒度的问题。</p><h2 id="一、spm是什么"><a href="#一、spm是什么" class="headerlink" title="一、spm是什么"></a>一、spm是什么</h2><p>做过埋点的应该都了解过阿里的那套spm模型，全称超级位置模型(Super Position Model)，之前一直觉得这套规范应该极其深奥，毕竟是能够支撑亿级别DAU的埋点规范。在我之前公司的业务场景下，DAU有限，并且业务对用户行为数据的分析还并未深入到点位的粒度，所以也仅仅只是了解，并未深入研究。</p><p>目前阶段主要做数据产品，在当前业务场景下终于有机会能够深入研究这块儿的内容。深入了解之后，发现spm模型的本质还是通过参数来区分位置信息，只不过是通过一套统一的规范约束楼层、点位的命名与上报。</p><blockquote><p>spm叫超级位置模型，最早是受到土地户籍制度启发而设计的位置系统，目的应用于页面的统计、追踪页面的来源等场景，通常在埋点时作为埋点参数上报到数据后台。其编码形式采用A.B.C.D四层级进行组合，分别代表了业务、页面、页面区块、区块内的点位。</p></blockquote><img src="https://img.blublu.site/spm实例.png" style="zoom: 33%;" /><p>以上其实还少了个E参数，通常取值是行为发生的时间戳，用来区分同一用户在同一位置的点击行为。</p><p>阿里在使用时spm时，通过spm-pre来标识上级来源页面的上级页面，通过spm-url来标识上级来源页面，通过spm-cnt来标识当前页面，其关系见下图，使用该逻辑在不进行join的情况下可以追踪用户当前行为的前2级页面具体点击位置，通常而言，追踪前一级页面就能够满足绝大多数的使用场景。</p><img src="https://img.blublu.site/spm.png"  /><h2 id="二、为什么要做spm"><a href="#二、为什么要做spm" class="headerlink" title="二、为什么要做spm"></a>二、为什么要做spm</h2><p>从技术角度而言，其最重要的价值就是统一数据采集的规范和认知，减少上下游的沟通和开发使用成本，产品和研发能够快速get到需要的数据怎么埋，下游能够快速获取到所需要的正确合理的数据。</p><blockquote><p>在精细化运营及算法推荐等应用场景下，需要非常精确掌握行为发生的位置场所。如果每个业务都自定义一套标识方式，那么每次分析及埋点工作都需要重新开发，无法复用逻辑，这将极大的浪费开发资源，因此需要制定出统一的位置规范。</p></blockquote><p>但是从业务角度，其能够实现流量的统一标记和管理：</p><ol><li>流量实现精准定位</li><li>位置和内容分离，使得二者可以分开评估，且位置的评估可以到具体点位级别（这条在事件模型中，二者本身就是分离的）</li><li>建立以资源位为中心的数据体系和运营体系</li></ol><p>以上第3条是业务方更加关注的点，也是spm这套体系对业务最终的价值点，所以如果要推动spm规范，其核心产出应当明确为建立以资源位为中心的数据运营体系。</p><p>其对业务方可感知的产出应当如下：</p><ul><li>基于位置的流量及转化评估模型，告知业务方，每个页面及页面下坑位的流量效率具体是多少</li><li>一个以资源位为中心的管理运营平台</li></ul><h2 id="三、如何实现spm"><a href="#三、如何实现spm" class="headerlink" title="三、如何实现spm"></a>三、如何实现spm</h2><h3 id="3-1-具体流程"><a href="#3-1-具体流程" class="headerlink" title="3.1 具体流程"></a>3.1 具体流程</h3><p><strong>首先进行spm的边界限定，spm只做位置的追踪，不进行该位置下展示内容的追踪。</strong></p><p>2个我总结的关于埋点采集的原则：</p><p>1.业务最小侵入原则，比如utm链路，比如归因，比如spm，都要尽可能少的减少业务侵入</p><p>2.埋点参数最小化满足原则，只有必要的数据才需要进行获取</p><p>目前业界常用的埋点体系大多是基于事件的埋点体系，在该埋点体系下，传输参数只需要放在ext字段中即可，但是spm模型规范中最重要的部分是对位置体系的划分，站点-&gt;页面-&gt;区块-&gt;点位，如何在不过多侵入业务的基础上低成本的实现这套位置体系才是重点，但是看了下相关文章，spm肯定会侵入到页面发布的相关流程。</p><p>设计的具体流程：<strong>位置划分 —&gt; 客户端埋点上报 —&gt; 流量归因模型处理 —&gt; 资源位数据运营体系</strong></p><h3 id="3-2-位置划分平台"><a href="#3-2-位置划分平台" class="headerlink" title="3.2 位置划分平台"></a>3.2 位置划分平台</h3><p>通常而言，app上的页面会随着版本逐步变化，所以区块和点位的划分也会随着版本逐渐变化，如果每个区块和点位的划分都通过文档之类的更新势必会造成混乱，所以需要一个完善的平台来对区块和点位进行划分，这种划分应当是可视化的形式。</p><h3 id="3-3-区块信息同步到埋点中"><a href="#3-3-区块信息同步到埋点中" class="headerlink" title="3.3 区块信息同步到埋点中"></a>3.3 区块信息同步到埋点中</h3><p>这一步其实也是我非常困惑的一步，简单来说，如果每一个坑位的spm信息都需要通过研发使用代码进行埋点，那这套方案的ROI就实在是太低，所以一直在想是否有更加低成本的同步方式。</p><p>比如，能否通过技术手段，关联spm的位置划分系统，将定义的位置信息自动同步到对应代码里，然后事件上报时获取对应的位置信息即可。</p><h2 id="四、如何划分spm"><a href="#四、如何划分spm" class="headerlink" title="四、如何划分spm"></a>四、如何划分spm</h2><p>通常而言，app页面的搭建我们可以理解为搭积木，再复杂的页面都可以拆解为一个个控件和元素，其内的可能性总归是有限的，我们只需要进行层层拆解，就可以实现这套位置追踪模型。</p><ul><li>元素：设计的最小层级，通常是图片、文字、几何元素和图标</li><li>控件：由最基础的设计元素组合而成，是执行特定操作和功能的单位，使用app时最基础的操作组件</li><li>组件：由控件+元素组合而成，包含相对独立且完整的功能和信息的app模块</li><li>区块：由多个组件+控件组合而成的区域</li><li>页面：由区块拼接成的页面，理论上只由区块内的组件组成</li></ul><p><img src="https://img.blublu.site/20210809231218.png"></p><p>基于以上认知，我们可以考虑进行spm层级的划分。</p><h3 id="4-1-站点-app-的划分"><a href="#4-1-站点-app-的划分" class="headerlink" title="4.1 站点(app)的划分"></a>4.1 站点(app)的划分</h3><p>站点就是我们通常意义上说的app名称，可以用id，也可以用包名，还可以唯一写定一个固定值。</p><h3 id="4-2-页面-page-的划分"><a href="#4-2-页面-page-的划分" class="headerlink" title="4.2 页面(page)的划分"></a>4.2 页面(page)的划分</h3><p>页面是站点的下一级，常规的埋点体系中，对位置的追踪只做到了该级别。</p><p>在原先的基础上，考虑到页面的迭代更新、AB测试，我们还应当引入页面版本(pageVersion)和页面状态(pageStatus)这两个参数来区分该页面的具体版本以及逻辑判断下的具体状态。</p><p>pageVersion：主要针对页面的更新迭代来做数据回溯，不同于app版本，此处的页面版本仅代该页面的历史更新。不同页面版本间的页面区块展示可能是完全不同的，比如2018年的淘宝首页和2021年的淘宝首页虽然都是同一个页面，但是里面的区块分布有着非常大的差异。</p><p>pageStatus：针对逻辑判断场景下的不同页面展示数据不同，例如登录页面，未登录状态、会员状态、普通用户状态三种状态下展示的区块内容会有差异，也可能会现在动态推荐场景下，人群a和人群b看到的页面区块分布存在差异，所以用该字段来区分不同的页面状态。</p><p>基于pageVersion和pageStatus两个参数才能唯一确定当前区块(area)的分布。</p><h3 id="4-3-区块-area-的划分"><a href="#4-3-区块-area-的划分" class="headerlink" title="4.3 区块(area)的划分"></a>4.3 区块(area)的划分</h3><p>以淘宝首页为例，此时已经明确app=淘宝，page=淘宝首页，那么接下来，需要对页面中的区块(area)进行划分，area包含2部分组成，前1部分代表区块名称，后1一部分代表区块顺序，用@进行分隔，如图，从上到下分别划分区块为搜索区块(search@1)、banner楼层(banner@2)、金刚位区块(kingkong@3)、瓷片区区块(porcelain@4)、猜你喜欢区块(recommend@5)，注意，这里区块的划分依据是从上到下按照区块划分。</p><img src="https://img.blublu.site/20210725214806.png" style="zoom:40%;" /><p><del>考虑到即使是同一版本同一状态的同一页面，也会有针对其内的某个区块(floor)进行更新修改，所以引入区块版本(floorVersion)变量，考虑到某个区块(floor)的逻辑判断场景，所以还需要引入区块状态(floorStatus)。</del></p><p><del>pageVersion和floorVersion的关系：pageVersion&gt;=floorVersion，</del></p><p><del>pageStatus和floorStatus的关系：pageStatus&gt;=floorStatus，</del></p><p><del>那么在实际应用中，什么时候选择区块，什么时候选择页面呢？依据最小化原则，能用区块进行版本和状态划分的，就不要用页面。</del></p><div class="tag-plugin note" color="green"><div class="body"><p>对floor进行version和status的管理，会和page重复，并且无法在产品设计上进行有效收拢，故删除floor的version和status管理，只要floor进行修改就更新pageVersion，如果floor存在逻辑判断的场景，那么通过业务参数区分不同的场景，SPM不涉及到业务参数，只做位置的划分。</p></div></div><h3 id="4-4-点位-component-的划分"><a href="#4-4-点位-component-的划分" class="headerlink" title="4.4 点位(component)的划分"></a>4.4 点位(component)的划分</h3><p>当区块划分完成之后，接下来就需要继续对区块内的点位进行划分，点位依然是两部分组成，前1部分代表元素名称，后1一部分代表元素位置，通过@区分。</p><p>考虑到较为复杂的情况，如淘宝首页瓷片区聚划算点位，下方带了2个图片，为了区分哪个图片的点击，我们需要用「.」符号来将element字段一层一层标识到最细粒度，如下方聚划算的「划算好货」的点位element=”<a href="mailto:&#112;&#x6f;&#114;&#x63;&#101;&#108;&#97;&#x69;&#110;&#64;&#x31;&#46;&#x69;&#x6d;&#103;">&#112;&#x6f;&#114;&#x63;&#101;&#108;&#97;&#x69;&#110;&#64;&#x31;&#46;&#x69;&#x6d;&#103;</a>@2”，如果某区块下的点位还能往下细分，那么可以继续追加「.」，直至到最小粒度的元素。</p><img src="https://img.blublu.site/20210725215042.png" style="zoom:50%;" /><p>注意：在某些场景下，如瓷片区区块，会存在动态推荐的情况，虽然用户a和用户b点击的都是位置2，element=porcelain@1.img@2的瓷片，但是他们实际上点击的可能一个是聚划算，一个是淘宝直播，SPM在这里是不区分的，具体点击内容会放在业务参数中。这样既能够对SPM和业务参数做交叉验证，还能够解耦SPM与业务参数采集。</p><h3 id="4-5-spm埋点采集的数据"><a href="#4-5-spm埋点采集的数据" class="headerlink" title="4.5 spm埋点采集的数据"></a>4.5 spm埋点采集的数据</h3><p>在埋点采集时，参考阿里的做法，预留3个字段给到spm，分别是spm_pre，spm_ref，spm_cnt，分别代表上级来源页面的上级页面点击点位，上级来源页面的点击点位，当前页面(如无点击则为null值)，每个字段用「_」连接app标识(app)、页面标识(page)、区块(floor)和点位(element)标识不同的位置，如果不涉及到某个字段则用0填充，如「从淘宝首页聚划算进入到聚划算主页再进入到商品详情页」此时在商品详情页上报的典型事件数据如下：</p><p><img src="https://img.blublu.site/20210727221813.png"></p><table><thead><tr><th>event</th><th>spm_pre</th><th>spm_ref</th><th>spm_cnt</th><th>ext</th></tr></thead><tbody><tr><td>click</td><td>app1_home_porcelainFloor@<a href="mailto:&#x34;&#x5f;&#112;&#x6f;&#x72;&#99;&#101;&#108;&#97;&#105;&#110;&#64;&#49;&#46;&#105;&#109;&#x67;">&#x34;&#x5f;&#112;&#x6f;&#x72;&#99;&#101;&#108;&#97;&#105;&#110;&#64;&#49;&#46;&#105;&#109;&#x67;</a>@2</td><td>app1_jhs_itemRecFloor@5_itemCard@1</td><td>app1_itemDetail_itemOpeFloor@12_addCart@4</td><td>{业务参数}</td></tr><tr><td>expo</td><td>app1_home_porcelainFloor@<a href="mailto:&#52;&#x5f;&#x70;&#x6f;&#114;&#99;&#x65;&#108;&#x61;&#x69;&#110;&#64;&#49;&#x2e;&#x69;&#109;&#103;">&#52;&#x5f;&#x70;&#x6f;&#114;&#99;&#x65;&#108;&#x61;&#x69;&#110;&#64;&#49;&#x2e;&#x69;&#109;&#103;</a>@2</td><td>app1_jhs_itemRecFloor@5_itemCard@1</td><td>app1_itemDetail_0_0</td><td>{业务参数}</td></tr><tr><td>pageShow</td><td>app1_home_porcelainFloor@<a href="mailto:&#52;&#x5f;&#112;&#111;&#114;&#x63;&#101;&#x6c;&#97;&#105;&#110;&#64;&#49;&#46;&#105;&#x6d;&#103;">&#52;&#x5f;&#112;&#111;&#114;&#x63;&#101;&#x6c;&#97;&#105;&#110;&#64;&#49;&#46;&#105;&#x6d;&#103;</a>@2</td><td>app1_jhs_itemRecFloor@5_itemCard@1</td><td>app1_itemDetail_0_0</td><td>{业务参数}</td></tr></tbody></table><p>当然，如果当前阶段数据分析的粒度没有那么细，不准备采用spm这一套规范，那么数据只需要上报到页面级别即可：</p><table><thead><tr><th>event</th><th>app_id</th><th>spm_pre</th><th>spm_ref</th><th>spm_cnt</th><th>ext</th></tr></thead><tbody><tr><td>click</td><td>app1</td><td>home</td><td>jhs</td><td>itemDetail</td><td>{业务参数}</td></tr><tr><td>expo</td><td>app1</td><td>home</td><td>jhs</td><td>itemDetail</td><td>{业务参数}</td></tr><tr><td>pageShow</td><td>app1</td><td>home</td><td>jhs</td><td>itemDetail</td><td>{业务参数}</td></tr></tbody></table><h2 id="五、spm点位可视化"><a href="#五、spm点位可视化" class="headerlink" title="五、spm点位可视化"></a>五、spm点位可视化</h2><p>spm的主要目的还是为了方便下游的使用，那么在做好元数据管理的基础上，一个完善的点位查询平台就是非常必要的了，能够统一上下游认知，减少沟通成本，压缩花费在查找具体埋点上的时间。</p><p>从功能上来说，应当由两个主要功能，第一是页面可视化，期望达到的效果是在网页端展示一个app页面，用户可以选择页面进入，来查看该页面的具体floor及element分布，以及当前页面存在的具体埋点，其次是通过spm点位以及具体的事件名称来搜索到对应的页面。</p><p>下面随便画了2个demo：</p><p>demo1:淘宝首页的搜索框</p><img src="https://img.blublu.site/20210725224826.png" style="zoom: 25%;" /><p>demo2:淘宝首页的金刚位第4个icon</p><img src="https://img.blublu.site/20210725225111.png" style="zoom:25%;" /><h2 id="六、流量归因模型"><a href="#六、流量归因模型" class="headerlink" title="六、流量归因模型"></a>六、流量归因模型</h2><p>具体参考另一篇文章，主要目的就是在数仓层面建立一套统一的流量归因模型，统一口径，为下一级的资源位管理平台提供有力支撑。</p><p><a href="https://blog.blublu.site/2021/11/attribution-model/index.html">流量归因模型</a></p><h2 id="七、以资源位为中心的数据运营体系"><a href="#七、以资源位为中心的数据运营体系" class="headerlink" title="七、以资源位为中心的数据运营体系"></a>七、以资源位为中心的数据运营体系</h2><p>还没想好，待定。</p><p>理想产出应当是一套资源位管理平台。</p><h2 id="八、扩展–scm模型"><a href="#八、扩展–scm模型" class="headerlink" title="八、扩展–scm模型"></a>八、扩展–scm模型</h2><blockquote><p>scm叫超级内容模型，用来标识唯一一块内容的模型，在埋点时scm模型的数据作为埋点参数上报到数据后台，其编码形式和spm一样也是通过A.B.C.D四个层级进行编码，只不过四个层级记录的信息与spm有所差别，分别是：内容来源、投放算法、算法版本以及对应的人群，还以上面的内容为例：</p><p>内容来源(content_source)：shop</p><p>投放算法(algorithm)：cf</p><p>算法版本(version)：3.3</p><p>对应人群（crowd）：woman</p></blockquote><p>spm针对的是用户位置分析，而scm针对的是内容分析，通过内容来源、投放算法、算法版本、对应人群四个参数标识当前用户的feed流推荐内容来源，再针对性的计算不同类型的CTR就能够做到数据追踪与复盘。</p><p>以上查阅到的资料应该少了具体的内容id参数。</p><h2 id="九、最后"><a href="#九、最后" class="headerlink" title="九、最后"></a>九、最后</h2><p>spm、scm其本质还是一套埋点规范，将分析需要用到的信息通过参数上报，其难点是在页面区块及元素的统一标识上，需要一套完善的元数据管理系统来支撑。</p><p>这套方案太侵入页面发布流程了，和之前的埋点成本最小化原则其实是相悖的，在做这套方案的时候，还是需要考虑到实际的ROI，去评估这套方案是否能够真正的带来价值。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;spm和scm是埋点中定义传入参数的一种模型，其本质还是埋点的属性通过一定的规范进行传输，只是一种传参模式。那么如何搭建SPM方案呢？ 以及如何更有效的体现其业务价值呢？&lt;/p&gt;</summary>
    
    
    
    <category term="数据驱动" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8/"/>
    
    
    <category term="埋点" scheme="https://blog.blublu.site/tags/%E5%9F%8B%E7%82%B9/"/>
    
  </entry>
  
  <entry>
    <title>数据产品经理jd分析</title>
    <link href="https://blog.blublu.site/2021/04/data-pm-jd-analysis/index.html"/>
    <id>https://blog.blublu.site/2021/04/data-pm-jd-analysis/index.html</id>
    <published>2021-04-10T16:00:00.000Z</published>
    <updated>2021-04-10T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近要考虑彻底转向数据产品的工作了，</p><p>又到了新的一年了，今年想要到一个更高的平台去实现价值，所以，是时候换工作了。金三银四，不能错过4月份了，换工作第一步是什么？当然是了解下市场需求。</p><span id="more"></span><h3 id="一、目的"><a href="#一、目的" class="headerlink" title="一、目的"></a>一、目的</h3><p>由于之前从事的是数据产品、数据分析、离线数据开发的综合性角色，不太清楚市场对数据产品的要求是什么，这里需要把一些大厂的jd拿出来分析一波，抽离出共性的要求，看自己是否满足，如果满足的话需要在简历里面体现出来。</p><h3 id="二、典型jd"><a href="#二、典型jd" class="headerlink" title="二、典型jd"></a>二、典型jd</h3><p>这里选择杭州要求3-5年经验的数据产品的jd，先从大厂的jd看。</p><ul><li><p>1.阿里</p><ul><li><p>薪资范围：25-50K·16薪</p></li><li><p>职位描述<br>1、负责淘宝内容生态<strong>数据体系搭建</strong>，基于对业务理解，搭建出可全面衡量内容生态健康的数据指标体系，且将数据体系产品化、工具化，构建<strong>数据驱动</strong>内容生态发展的核心能力；<br>2、负责阿里内容中台下数据平台建设，整合各内容业务线的数据，帮助<strong>提升数据分析效率</strong>；同时根据反馈，不断优化数据平台的<strong>产品体验</strong>；<br>3、对新零售下内容业务及内容场景下的用户、内容进行分析，构建用户画像、内容画像，进行<strong>产品化与平台化</strong>，并应用于下游内容业务；<br>4、负责淘宝直播、逛逛、点淘等最热风口的内容行业数据产品体系搭建。</p></li><li><p>职位要求<br>1、3年以上数据产品或数据分析经验，对数据产品定位、发展方向有深入的理解和认识，有内容领域数据分析工作经历优先；<br>2、具备良好的<strong>数据敏感度和业务视野</strong>，能够敏锐的捕获数据价值和产品机会；<br>3、了解底层数据的架构技术以及应用层数据分析和算法的基本概念，能够<strong>运用数据作为产品解决业务方运营及决策问题</strong>。</p></li><li><p>分析</p><p>职位描述的核心关键词是数据体系搭建、数据驱动、提升数据分析效率，优化产品体验，产品化与平台化，要求上核心的是两点，一是拥有数据敏感度和业务视野，能够发现数据产品的机会，二是运用数据作为产品解决业务方运营及决策问题。</p></li></ul></li><li><p>2.滴滴</p><ul><li><p>薪资范围：30-40K·15薪</p></li><li><p>岗位职责：<br>1、负责业务线<strong>数据应用及分析产品的建设</strong>；<br>2、深入<strong>理解业务</strong>战略和策略，<strong>拓展</strong>数据应用<strong>场景</strong>和数据维度，落地数据指标体系、数据分析框架等，<strong>提高</strong>业务线的<strong>数据分析效率</strong>；<br>3、把握<strong>数据应用痛点</strong>，帮助需求方准确高效地理解业务 ，并及时发现风险和机会；<br>4、作为<strong>产品owner</strong>，负责从需求收集、产品规划、项目推进、效果验收、线上问题跟进、用户反馈等全过程；</p></li><li><p>任职资格：<br>1、3年及以上数据产品、数据分析或策略产品相关经验<br>2、参与数据体系或数据产品的搭建，有较好的<strong>需求抽象能力和产品设计能力</strong>；<br>3、对数据敏感，对数据问题定位和数据可视化有自己的认识；<br>3、具备良好的沟通协调能力、抗压能力和和团队精神，<strong>善于拿结果</strong>。</p></li><li><p>分析</p><p>岗位职责还是突出理解业务，然后能够发现数据的应用场景和价值，去解决业务的问题或者提升数据分析效率。要求上除了经验以为，突出的是注重结果，以及需求抽象和产品的设计能力。</p></li></ul></li><li><p>3.饿了么</p><ul><li><p>薪资范围：25-50K</p></li><li><p>岗位职责：</p><p>1 <strong>贴近业务</strong>主动思考业务<strong>应用场景</strong>，基于对于销售网络的业务理解设计产品；<br>2 独立承担产品设计、推进、落地、上线、推动等一系列工作，同时做好产品的数据分析工作；<br>3 推动产品上线推广，并与产品用户保持有效沟通，定期收集用户反馈，有效<strong>提升产品</strong>的<strong>使用效果</strong>。</p></li><li><p>职位要求<br>1、有至少5年以上的数据产品或数据分析项目经验，能够熟练使用原型设计工具进行产品的原型设计；<br>2、具有<strong>数据分析报告</strong>的撰写能力，并且能够熟练使用SQL进行<strong>取数</strong>工作；<br>3、熟悉<strong>数据仓库、商业智能基本理论</strong>，对于DW数据底层、数据集市等有一定了解；<br>4、良好的项目管理经验，根据产品的生命周期理论推进产品的<strong>迭代优化</strong>；<br>5、对于常用数据挖掘模型及其工具有使用经验者优先考虑；<br>6、强烈责任心，开放的性格，良好的<strong>沟通能力</strong>。</p></li><li><p>分析</p><p>岗位职责写的有点敷衍，重点还是对业务+数据的结合，然后设计数据产品，还有产品的推进流程，也比较注重结果。职位要求上除了经验以外，就是数仓、数据分析、产品相关的要求了。</p></li></ul></li><li><p>4.网易</p><ul><li><p>薪资范围：15-30K</p></li><li><p>职位介绍：<br>1、负责数据产品设计，推进<strong>产品设计</strong>的实现；<br>2、负责数据<strong>产品的运营</strong>，完成数据产品培训、咨询与推广；<br>3、负责<strong>数据服务需求</strong>的对接、梳理与跟进；<br>4、负责数据产品设计、用户手册等<strong>相关文档</strong>的编写。</p></li><li><p>职位要求：<br>1、 对<strong>业务有深入的洞察力</strong>，具有良好的抽象能力，能够<strong>洞察业务本质</strong>，抽象业务模型。<br>2、 熟练使用Axure RP等工具梳理业务流程和<strong>设计产品</strong>原型；<br>3、了解<strong>数据分析</strong>，思维逻辑清晰，良好的自我学习及驱动力，有创造性；<br>4、对数据存储、计算、可视化有基本的了解；<br>5、具备良好的沟通能力和文字表达能力，有较强的团队协作能力，<strong>沟通能力</strong>强，耐心、<strong>有责任心</strong>。</p></li><li><p>分析</p><p>网易的描述类似，职位介绍上突出了产品的运营和推广工作，以及相关文档的撰写。职位要求上还是要求对业务有深入洞察力，能发现并解决业务痛点，沟通能力强，有责任心。</p></li></ul></li><li><p>5.吉利科技</p><ul><li><p>薪资范围：20-40K</p></li><li><p>职位描述<br>1、负责数据产品的规划设计，推进<strong>数据产品的建设</strong>，包含不限于：BI系统、数据大屏、指标管理系统、数据监控、数据中台等；<br>2、负责各业务线、产品线、项目的<strong>数据服务需求</strong>的对接、梳理和对接，抽象出标准通用化的数据产品服务能力；<br>3、负责数据<strong>产品</strong>的<strong>运营</strong>、产品的相关培训、用户手册编写、咨询和推广；</p></li><li><p>任职要求：<br>1、5年以上数据产品设计经验；<br>2、熟悉数据的采集、清洗、分析、可视化等工作原理，输出数据产品的能力、应用和收益，<strong>赋能业务</strong>；<br>3、熟悉了解数据平台技术架构、技术选项的原理，Hadoop、Kafka、Spark等，会写SQL语句；<br>4、对<strong>业务有深入的洞察力</strong>，具有良好的抽象能力，洞悉业务本质、抽象业务模型；<br>5、跨部门/团队沟通协作，良好的<strong>沟通</strong>和文字表达能力，有较强的自我驱动、项目推动能力，做产品的<strong>owner</strong>；</p></li><li><p>分析：</p><p>传统汽车行业的数据产品经理，职位描述上可能是属于从0-1的阶段，任职要求上依然重点是对业务有深入洞察，赋能业务。</p></li></ul></li><li><p>6.涂鸦智能</p><ul><li><p>薪资范围：15-30K</p></li><li><p>工作职责：</p><ol><li>负责各业务线、产品线以及项目等数据服务的<strong>需求梳理</strong>和对接，抽象出标准通用化的数据产品服务能力，<strong>推进数据产品的建设</strong>，包括不限于BI系统、数据大屏等；</li><li>推动<strong>可视化</strong>相关能力建设，包括发展方向、技术探索、组件体系建设、项目管理、流程标准化等；</li><li>推进产品<strong>数据化运营</strong>体系，推动产品不断迭代；</li><li>对数据产品<strong>生命周期</strong>负责，对业务进行数据产品的使用培训和推广，推进数据化驱动在业务中的应用和落地；</li></ol></li><li><p>岗位要求：</p><ol><li>本科以上学历，5年以上的数据产品设计经验，具备独立产品规划及落地能力；</li><li><strong>数据sense</strong>强，具备较强数据分析能力和数据分析产品经验；</li><li>有阿里DataV、腾讯RayData、Tableau或其他<strong>数据可视化</strong>项目经验优先；</li><li>具有跨团队沟通协调能力及抗压能力，良好的自我驱动和创新意识，推动团队<strong>拿结果</strong>。</li></ol></li><li><p>分析：</p><p>应该是可视化相关的数据产品，重点是需求梳理和对接，对业务理解的要求没这么高，比较重视结果。</p></li></ul></li><li><p>7.曹操出行</p><ul><li><p>薪资范围：18-35K·14薪</p></li><li><p>工作职责<br>﻿1 负责<strong>大数据部产品建设</strong>，包括权限管理平台、埋点管理平台、元数据管理平台、数据血缘管理平台等；<br>2 负责产品项目的需求整理、功能设计、推动落地及线上效果验收等；<br>3 根据部门中长期的目标，对数据产品进行整体规划，并逐步落实到各个迭代版本，完成产品系统化建设；<br>4 对接业务需求，收集需求，<strong>深入理解业务需求</strong>，并结合业务痛点提出合理、可行的解决方案。</p></li><li><p>任职要求<br>﻿1 本科及以上学历，计算机、信息管理等相关专业优先；<br>2 三年以上数据产品经理或中后台产品经理工作经验，独立负责过一个系<strong>统产品的从0到1的建</strong>设；<br>3 具备较强数据意识，关注产品上线后使用效果，并通过数据反馈驱动产品迭代；<br>4 良好的沟通能力，跨团队协作能力；责任心强，工作中遇到困难能竭力推动解决问题；<br>5 自驱力强，工作积极性高，能够积极主动地承担工作；<br>6 熟悉大数据领域，了解 Hadoop 相关技术，熟悉数据采集、数据加工、数据消费、数据应用者优先。</p></li><li><p>分析</p><p>典型的基建类数据产品的岗位。</p></li></ul></li><li><p>8.浮云科技</p><ul><li><p>薪资范围：20-40K</p></li><li><p>职位描述：<br>1、 负责<strong>游戏数据应用体系</strong>建设，负责开发和维护标注系统，完善用户画像。<br>2、 负责<strong>深入调研和理解业务场景</strong>，梳理业务活动效果的指标体系并结合海量数据，为游戏运营及用户增长提供产品能力支撑；<br>3、为业务的迭代方向<strong>提供高效数据分析产品工具</strong>（包括但不仅限于用户行为分析系统、AB试验系统、投放归因系统、游戏DMP等）</p></li><li><p>职位要求：<br>1、本科以上学历，统计学、应用数学、计算机等理工科专业背景优先。<br>2-5年数据产品工作经验，熟练掌握Axure等原型工具，有实际数据产品项目经验，熟悉用户画像，特征工程和标注平台建设；<br>2、有较好的技术和算法理解能力，有营销、搜索、推荐、风控等产品系统相关经验；<br>3、热爱大数据+AI方向，了解相关算法</p></li><li><p>分析：</p><p>游戏相关的数据产品，看职位描述也是基建类数据产品的搭建工作。</p></li></ul></li></ul><h3 id="三、核心关键词"><a href="#三、核心关键词" class="headerlink" title="三、核心关键词"></a>三、核心关键词</h3><ul><li>数据产品和数据分析相关的工作经验，</li><li>深入理解业务，能够发现数据产品的价值点，也就是能够用数据解决业务方的问题，或者提升数据分析效率</li><li>良好的产品抽象能力，洞察业务本质，然后设计数据产品</li><li>产品owner意识</li><li>结果为先，要拿出成果</li></ul><h3 id="四、总结"><a href="#四、总结" class="headerlink" title="四、总结"></a>四、总结</h3><p>以上只是简单选取了几个jd分析下，并不能代表整体，数据产品还可以细分为数据开发平台的产品、机器学习的产品、可视化的产品等等。如果想去大厂的话，重点要突出的是深入了解业务解决问题的能力，而不是基建产品的搭建能力。所以，还得好好改下简历啊…</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近要考虑彻底转向数据产品的工作了，&lt;/p&gt;
&lt;p&gt;又到了新的一年了，今年想要到一个更高的平台去实现价值，所以，是时候换工作了。金三银四，不能错过4月份了，换工作第一步是什么？当然是了解下市场需求。&lt;/p&gt;</summary>
    
    
    
    <category term="数据产品" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E4%BA%A7%E5%93%81/"/>
    
    
  </entry>
  
  <entry>
    <title>魔术技巧</title>
    <link href="https://blog.blublu.site/2021/03/magic-tricks/index.html"/>
    <id>https://blog.blublu.site/2021/03/magic-tricks/index.html</id>
    <published>2021-03-27T16:00:00.000Z</published>
    <updated>2021-03-27T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近看到了一些简单易懂的小魔术，所以收藏一下，哪天可以给喜欢的人表演一下。</p><span id="more"></span><p>2个皮筋小魔术</p><p><a href="https://www.zhihu.com/zvideo/1356670408012427264">皮筋瞬间转移</a></p><p><a href="https://www.zhihu.com/zvideo/1357748969683087360">皮筋穿越</a></p><p><a href="https://www.zhihu.com/zvideo/1369701155468152832">橡皮筋神奇穿透</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近看到了一些简单易懂的小魔术，所以收藏一下，哪天可以给喜欢的人表演一下。&lt;/p&gt;</summary>
    
    
    
    <category term="skill" scheme="https://blog.blublu.site/categories/skill/"/>
    
    
  </entry>
  
  <entry>
    <title>数据产品经理实战进阶读书笔记</title>
    <link href="https://blog.blublu.site/2020/10/data-prduct-manager-advanced-combat-reading-notes/index.html"/>
    <id>https://blog.blublu.site/2020/10/data-prduct-manager-advanced-combat-reading-notes/index.html</id>
    <published>2020-10-02T15:23:59.000Z</published>
    <updated>2020-10-02T15:23:59.000Z</updated>
    
    <content type="html"><![CDATA[<p>这本书目前对我作用最大的点：</p><p>1.数据分析的目的是为了得到有价值的数据结论</p><p>2.什么是有价值的数据结论：增加收益或者减少损失</p><span id="more"></span><p>以下是书中作者总结的常用数据分析方法，确实抽象总结出了我目前工作中常用的分析模式，结合目前流量分析中常用的漏斗、留存、分布、归因等分析方法，让我在数据分析的术方面，又有了提升。</p><ul><li>全链路分析<ul><li>类比于漏斗分析，就是把整个核心的转化链路串起来</li><li>第一步：梳理链路关键节点，确定每个节点指标</li><li>第二步：进行节点洞察，分析每个节点的数据，查看问题点和增长点</li></ul></li><li>组成因子分解<ul><li>把整体指标数据按照某种分类标准分成不同因子的过程，成为组成因子分析，整体目标等于所有的组成因子之和。</li><li>例如：gmv=uv <strong>X</strong> 转化率 <strong>X</strong> 客单价，广告平台总收入=信息流收入+搜索广告收入+其他类型广告收入</li><li>注意：如何进行组成因子分解代表着思考问题的第一维度，直接影响能否得到有用的结论，要尝试多种方式，试验出最好的因子分解方式</li></ul></li><li>影响因子拆解<ul><li>很多情况，因子对结论的影响是定性的，并不能简单的相加</li><li>使用时列出所有影响因子，逐步尝试</li></ul></li><li>枚举法<ul><li>使用步骤<ul><li>第一步：数据列举</li><li>第二步：逐个解读</li><li>第三步：汇总问题，给出解决建议和优先级</li></ul></li><li>应用的两种思维<ul><li>排序思维：就是二八法则</li><li>随机抽样：分层抽样等等，样本估算整体</li></ul></li></ul></li><li>实际分析案例：图表的表现形式可以好好参考下</li></ul><p><img src="https://i.loli.net/2020/10/03/k1MzaLUeb4CrDh6.jpg" alt="分析案例"></p><p>读书笔记见幕布：<a href="https://mubu.com/doc/4Q1IOb0P7p">https://mubu.com/doc/4Q1IOb0P7p</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;这本书目前对我作用最大的点：&lt;/p&gt;
&lt;p&gt;1.数据分析的目的是为了得到有价值的数据结论&lt;/p&gt;
&lt;p&gt;2.什么是有价值的数据结论：增加收益或者减少损失&lt;/p&gt;</summary>
    
    
    
    <category term="数据产品" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E4%BA%A7%E5%93%81/"/>
    
    <category term="读书笔记" scheme="https://blog.blublu.site/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
  </entry>
  
  <entry>
    <title>数据平台的权限设计</title>
    <link href="https://blog.blublu.site/2020/10/data-platform-authority-design/index.html"/>
    <id>https://blog.blublu.site/2020/10/data-platform-authority-design/index.html</id>
    <published>2020-10-01T14:02:46.000Z</published>
    <updated>2021-11-27T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>如何为数据平台做权限控制？</p><span id="more"></span><h2 id="一、基础"><a href="#一、基础" class="headerlink" title="一、基础"></a>一、基础</h2><p>数据权限管理对于一个数据平台的重要性自不必多说，通常而言，对于一个数据平台，权限体系可以分为如下两类：<strong>功能权限</strong>与<strong>数据权限</strong>两部分。</p><ul><li><strong>功能权限</strong>指的是在系统中的功能可否使用，通常我们将功能权限分为查看、编辑、删除等，同时编辑、删除权限又包含了查看。通过小的权限点拆分更精细的赋予了员工能否进入某个页面查看信息、编辑信息的能力。</li><li><strong>数据权限</strong>指数据中存在的数据是否能查看，是一个更细粒度的权限。比如一个页面，不同角色查看不同的数据就需要通过数据权限控制。在RBAC模型中通过定义资源进行控制，在ABAC模型中通过资源及限定具体策略进行控制</li></ul><h2 id="二、常用的权限管控模型"><a href="#二、常用的权限管控模型" class="headerlink" title="二、常用的权限管控模型"></a>二、常用的权限管控模型</h2><ul><li><p><strong>ACL（Access Control List）</strong>：基于用户级别的权限控制。</p><p>将系统的各种权限直接授予具体的用户。抽象来说，为每个用户维护了单独的权限列表，当需要分配权限、收回权限时，需要修改对应用户的权限信息。</p></li><li><p><strong>RBAC（Role Base Access Control）</strong>：基于角色级别的权限控制。</p><p>与 ACL 对比，RBAC不用给用户单个分配权限，权限与用户之前通过角色关联。通过给不同的角色分配不同的权限，只需要将用户指向对应的角色就会有对应的权限。分配权限、收回权限只需要通过修改用户的角色即可。</p><blockquote><p>用户：你的终端用户；<br>角色：角色是一个逻辑集合，你可以授权一个角色某些操作权限，然后将角色授予给用户，该用户将会继承这个角色中的所有权限；<br>资源：你可以把你应用系统中的实体对象定义为资源，比如订单、商品、文档、书籍等等，每种资源都可以定义多个操作，比如文档有阅读、编辑、删除操作；<br>操作：操作是用户试图对资源进行的操作。常见的操作包括“读取”，“写入”，“编辑”，“复制”和“删除”；<br>授权：把某类（个）资源的某些（个）操作授权给角色或者用户。<br>通过用户、角色、资源、操作、授权的组合，就可以轻松直观地实现灵活、细粒度的权限模型。</p></blockquote></li><li><p><strong>ABAC（Attribute Base Access Control）</strong>：基于属性级别的权限控制。</p><p>不同于常见的将用户通过某种方式直接关联到权限的方式，ABAC 是通过动态计算一个或一组属性来是否满足某种条件来进行权限判断,你可以细粒度地授权在何种情况下对某个资源具备某个特定的权限。ABAC授权模型理论上能够实现非常灵活的权限控制，几乎能满足所有类型的需求。从使用场景来说比较适用于用户数量多并且授权比较复杂的场景。简单的场景也是可以使用ABAC的，但是使用基础的ACL或者RBAC也能满足需求。</p><blockquote><p>在 ABAC 中，一个操作是否被允许是基于对象、资源、操作和环境信息共同动态计算决定的。<br>对象：对象是当前请求访问资源的用户。用户的属性包括ID，个人资源，角色，部门和组织成员身份等；<br>资源：资源是当前访问用户要访问的资产或对象（例如文件，数据，服务器，甚至API）。资源属性包含文件的创建日期，文件所有者，文件名和类型以及数据敏感性等等；<br>操作：操作是用户试图对资源进行的操作。常见的操作包括“读取”，“写入”，“编辑”，“复制”和“删除”；<br>环境：环境是每个访问请求的上下文。环境属性包含访问尝试的时间和位置，对象的设备，通信协议和加密强度等。</p></blockquote></li></ul><p>ABAC对于RBAC有以下优点:</p><ul><li>对于大型组织，基于RBCA的控制模型需要维护大量的角色和授权关系，相比而言，ABAC更加灵活；对于中小型组织，维护角色和授权关系的工作量不大，反而定制各种策略相对麻烦，更容易接受RBAC授权模型。</li><li>新增资源时，ABAC仅需要维护较少的资源。而RBAC需要维护所有相关的角色。ABAC可扩展性更强、更方便。</li><li>RBAC支持带有动态参数的授权规则，RBAC只能基于静态的参数进行判断。</li><li>ABAC权限控制的粒度比RBAC更细。</li></ul><h2 id="三、数据平台的权限设计"><a href="#三、数据平台的权限设计" class="headerlink" title="三、数据平台的权限设计"></a>三、数据平台的权限设计</h2><h3 id="3-1-RBAC下的权限设计"><a href="#3-1-RBAC下的权限设计" class="headerlink" title="3.1 RBAC下的权限设计"></a>3.1 RBAC下的权限设计</h3><p>通常使用业界通用的RBAC权限模型，基于角色进行用户的权限控制。</p><p>在权限设计时，通常抽离出以下四个实体进行设计</p><ul><li>用户：最终拥有权限的一个个用户</li><li>角色：对资源进行权限授权的集合体</li><li>资源：要操作的目标对象，在不同的场景下指代的对象不同，既可以是数据，也可以是功能</li><li>操作：一般分为三种，查看、编辑、删除，在设计具体的权限时可以结合资源定义具体的<strong>操作事件</strong>进行授权，比如查看某菜单，使用某功能的权限</li></ul><p>他们之间的关系用一句话描述：基于“用户-角色-资源-操作”的权限控制，将“XX资源(菜单、数据)”的“XX操作(增删改查等)”授权给“XX角色”，然后将“XX角色”授权给“XX用户”。</p><p><img src="https://img.blublu.site/%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86.png"></p><p>RBAC模型下需要将资源划分为功能和数据两种，功能权限的划分是常规的页面功能逻辑，如下图：</p><p><img src="https://img.blublu.site/20211204123711.png" alt="Image"></p><p>对于数据产品而言，数据权限的管理才是其中最重要的内容，通常而言，RBAC模型下，会采用组织机构树进行数据权限的控制，这种方式比较复杂，但是非常灵活，能够支撑多种复杂的业务数据权限诉求。</p><p><img src="https://img.blublu.site/20211204123451.png" alt="Image"></p><h3 id="3-2-ABAC下的权限设计"><a href="#3-2-ABAC下的权限设计" class="headerlink" title="3.2 ABAC下的权限设计"></a>3.2 ABAC下的权限设计</h3><p>采用ABAC模型的描述：基于“对象-资源-操作-环境”的权限控制，描述了“XX对象（人/应用/组织/角色等）对 XX资源（页面/菜单/按钮/数据等）在 XX环境/因素（城市=北京等）下拥有 XX操作类型（增删改查等）的权限”。</p><h2 id="四、扩展"><a href="#四、扩展" class="headerlink" title="四、扩展"></a>四、扩展</h2><p>在可能的情况下，建议使用ABAC模型进行权限管理，即使当前状况下使用较为繁琐，但是提前预留了扩展，能减少后续重构的成本和时间。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;如何为数据平台做权限控制？&lt;/p&gt;</summary>
    
    
    
    <category term="数据产品" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E4%BA%A7%E5%93%81/"/>
    
    
  </entry>
  
  <entry>
    <title>天池-工业蒸汽量预测</title>
    <link href="https://blog.blublu.site/2020/09/tianchi-industrial-steam-prediction/index.html"/>
    <id>https://blog.blublu.site/2020/09/tianchi-industrial-steam-prediction/index.html</id>
    <published>2020-09-05T14:47:02.000Z</published>
    <updated>2020-09-05T15:54:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近买了阿里云天池大赛赛题解析这本书，跟着这本书开始深入学习机器学习，这是第一个题目：工业蒸汽量预测。</p><p>比赛地址：<a href="https://tianchi.aliyun.com/competition/entrance/231693/introduction">https://tianchi.aliyun.com/competition/entrance/231693/introduction</a></p><span id="more"></span><h2 id="一、赛题理解"><a href="#一、赛题理解" class="headerlink" title="一、赛题理解"></a>一、赛题理解</h2><h3 id="（一）数据概览"><a href="#（一）数据概览" class="headerlink" title="（一）数据概览"></a>（一）数据概览</h3><h4 id="1-数据说明"><a href="#1-数据说明" class="headerlink" title="1.数据说明"></a>1.数据说明</h4><h4 id="2-评估指标"><a href="#2-评估指标" class="headerlink" title="2.评估指标"></a>2.评估指标</h4><p>MSE</p><h3 id="（二）塞题模型"><a href="#（二）塞题模型" class="headerlink" title="（二）塞题模型"></a>（二）塞题模型</h3><p>这是一道典型的预测题，属于机器学习中的监督学习，常用的预测模型主要有回归预测模型和分类预测模型。</p><h4 id="1-回归预测模型"><a href="#1-回归预测模型" class="headerlink" title="1.回归预测模型"></a>1.回归预测模型</h4><p>回归预测模型的预测结果是一个连续值域上的任意值，回归可以具有实值或离散的输入变量，通常把多个输入变量的回归问题成为<strong>多元回归问题</strong>，输入变量按时间排序的回归问题称为<strong>时间序列预测问题</strong>。</p><h4 id="2-分类预测模型"><a href="#2-分类预测模型" class="headerlink" title="2.分类预测模型"></a>2.分类预测模型</h4><p>典型的：泰坦尼克号，预测的结果分为生或者死。</p><p>主要分为二分类及多分类。</p><p>本赛题中预测值为连续性数值变量，故为回归预测求解。</p><p>回归预测模型使用的算法：</p><p>1.线性回归</p><p>2.岭回归</p><p>3.LASSO回归</p><p>4.决策树回归</p><p>5.梯度提升树回归</p><h2 id="二、数据探索"><a href="#二、数据探索" class="headerlink" title="二、数据探索"></a>二、数据探索</h2><h2 id="三、特征工程"><a href="#三、特征工程" class="headerlink" title="三、特征工程"></a>三、特征工程</h2><h2 id="四、模型训练"><a href="#四、模型训练" class="headerlink" title="四、模型训练"></a>四、模型训练</h2><h2 id="五、模型验证"><a href="#五、模型验证" class="headerlink" title="五、模型验证"></a>五、模型验证</h2><h2 id="六、特征优化"><a href="#六、特征优化" class="headerlink" title="六、特征优化"></a>六、特征优化</h2><h2 id="七、模型融合"><a href="#七、模型融合" class="headerlink" title="七、模型融合"></a>七、模型融合</h2><h2 id="八、业务应用及平台化开发"><a href="#八、业务应用及平台化开发" class="headerlink" title="八、业务应用及平台化开发"></a>八、业务应用及平台化开发</h2><p>主要解决业务问题：我们通过历史数据对下单/未下单的用户的行为进行建模，利用逻辑回归模型预测用户下单意愿，并提高用户下单率，如下图：</p><p>文章地址：<a href="https://mp.weixin.qq.com/s/cdTNRFFJcKrpWgOtuFzYFw">https://mp.weixin.qq.com/s/cdTNRFFJcKrpWgOtuFzYFw</a></p><p><img src="https://i.loli.net/2020/09/05/i3mL7QRYSPtHxKn.png" alt="预测购买率"></p><p>平台化方案：</p><p>前端：vue</p><p>后端：阿里云函数计算</p><p>主要界面：上传文件格式</p><table><thead><tr><th>userid</th><th>v1变量</th><th>…</th><th>vn变量</th></tr></thead><tbody><tr><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td></tr></tbody></table><p>输出文件格式：</p><table><thead><tr><th>userid</th><th>v1变量</th><th>…</th><th>vn变量</th><th>是否下单</th></tr></thead><tbody><tr><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td></tr></tbody></table>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近买了阿里云天池大赛赛题解析这本书，跟着这本书开始深入学习机器学习，这是第一个题目：工业蒸汽量预测。&lt;/p&gt;
&lt;p&gt;比赛地址：&lt;a href=&quot;https://tianchi.aliyun.com/competition/entrance/231693/introduction&quot;&gt;https://tianchi.aliyun.com/competition/entrance/231693/introduction&lt;/a&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="机器学习" scheme="https://blog.blublu.site/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
    
    
  </entry>
  
  <entry>
    <title>页面停留时长的处理</title>
    <link href="https://blog.blublu.site/2020/08/processing-of-page-stay-time/index.html"/>
    <id>https://blog.blublu.site/2020/08/processing-of-page-stay-time/index.html</id>
    <published>2020-08-08T16:00:00.000Z</published>
    <updated>2020-08-08T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>埋点日志中对于页面停留时长的处理。</p><span id="more"></span><p>页面访问时长为<a href="http://zh.wikipedia.org/zh/%E5%81%8F%E5%BA%A6">右偏分布</a>（均值在高峰的右侧），对这种分布来说，总是有均值 &gt; 中位数 &gt; 众数，从这个角度上来讲，如果想用一个数字来了解这种偏态分布的大体状况，中位数可能比均值具有更大的参考价值。</p><p>使用时不能简单的看均值，应当参考中位数和众数。且由于埋点方案的固有缺陷，会产生一定比例的异常值，所以需要通过一定的统计学方式进行处理。</p><p>为计算更加合理的均值，这里提供2种方案：</p><p><del>1.采用Q3+1.5(Q3-Q1)排除异常大值</del></p><p><del>2.将异常大值使用中位数替换</del></p><p>3.凭经验，将大于1000s的单次访问行为替换为中位数，进行计算</p><p>4.类比于去除最小值，去除最大值，计算平均值的方法，去除前10%，后10%时长的pv行为，再计算平均值，即取<strong>截尾平均值</strong>，改计算方法能够很好的消除极端值对算术平均数的影响，建议用该种方式。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;埋点日志中对于页面停留时长的处理。&lt;/p&gt;</summary>
    
    
    
    <category term="统计学" scheme="https://blog.blublu.site/categories/%E7%BB%9F%E8%AE%A1%E5%AD%A6/"/>
    
    
  </entry>
  
  <entry>
    <title>用户行为分析平台</title>
    <link href="https://blog.blublu.site/2020/08/user-behavior-analysis-platform/index.html"/>
    <id>https://blog.blublu.site/2020/08/user-behavior-analysis-platform/index.html</id>
    <published>2020-08-02T08:10:37.000Z</published>
    <updated>2021-05-01T08:10:37.000Z</updated>
    
    <content type="html"><![CDATA[<p>一般而言，数据分析依赖于专业的BI人员先进行报表产出，运营再依据产出的报表进行分析，对于长期稳定的业务，报表总会慢慢覆盖尽可能多的维度，但是依然会存在多种组合维度指标的追加。如果在业务经常变化的情况下，报表覆盖的维度就没法做到及时有效，报表产出周期动辄几天，且数据口径方面会存在运营和BI人员之间的理解误差，数据准确性依赖于报表产出人员的水平，这样会严重影响数据驱动的时效性和顺畅性。并且该种方案不利于培养运营人员的数据意识，试问，如果一个简单的数据分布查看都要提需求等排期，那么谁还愿意到处拿数据说话呢？</p><p><strong>数据产品的价值就在于此，降低数据的使用门槛，让数据能更加方便、快捷、准确的为业务人员使用。</strong></p><span id="more"></span><h2 id="一、需求背景"><a href="#一、需求背景" class="headerlink" title="一、需求背景"></a>一、需求背景</h2><p>之前写过 <a href="https://www.blublu.site/2020/02/build-a-data-index-system/">构建数据指标体系</a>，在文章中，数据指标体系搭建好之后就需要通过ETL过程进行数据开发，然后通过ads层输出数据，再经由superset进行报表展示，开发周期长不说，预定义的维度还有限，没法一次覆盖所有的分析场景，且业务处于快速迭代期，经常需要进行报表的调整，只能按照需求管理的方式慢慢添加报表，更加致命的是，由于口径和维度的调整，往往需要经常修改报表逻辑，耗费时间长，技术含量低，响应周期慢。</p><p>基于此种情况，构建一套人人可用，简单高效的用户行为分析平台就非常有必要了。</p><p>为什么叫用户行为分析平台？因为在当前的电商场景下，我们分析的对象绝大多数都是用户的行为，比如下单、支付、留存等等，所以叫做用户行为平台。</p><blockquote><p>用户行为分析与B分析有哪些区别?<br>分析对象不一样:用户行为分析,顾名思义,主要分析对象是用户,是运营部门最关心的对象;BI可以分析商品、销售、供应链、会员、财务等场景,也包含用户。<br>数据来源不一样:用户行为分析通过在App、Web、小程序等进行埋点获取用户生命周期中的行为数据;B是通过接入各个部门信息系统中的数据再进行分析,包含支付、会员、供应链、进销存、CRM、<br>财务等等。<br>作用价值不一样:用户行为分析通过数据洞察用户行为,从而提高拉新、转化、留存等各个环节的RO,B是通过数据融合、分析、可视化为公司搭建自上而下的数据分析体系,最终目标是提高各个层级决策的科学性和实时性。</p></blockquote><h2 id="二、解决的问题"><a href="#二、解决的问题" class="headerlink" title="二、解决的问题"></a>二、解决的问题</h2><p>主要解决的问题应该分为两部分：</p><ul><li>对于分析师而言<ul><li>提升写报表效率，常规需求可通过点选快速产出报表</li><li>固化分析模型，将一些成熟的分析模型产品化之后赋能给业务人员</li><li>可以进行一部分探索性的分析工作</li></ul></li><li>对于业务人员<ul><li>降低数据需求的响应周期</li><li>部分常规需求可以自主完成，不用通过分析师</li><li>部分高阶用户可以进行多种维度的组合分析用来探索性的数据分析</li></ul></li></ul><p>核心而言，解决的就2个问题，第一，提高数据需求的效率，第二，固化分析模型进行业务赋能。</p><h2 id="三、产品目标及抓手"><a href="#三、产品目标及抓手" class="headerlink" title="三、产品目标及抓手"></a>三、产品目标及抓手</h2><p>针对要解决的核心问题，我们定下的目标是能够覆盖60%的常规数据需求。</p><p>通过数据分析模型的覆盖，事件的覆盖度。</p><h2 id="四、产品调研及分析"><a href="#四、产品调研及分析" class="headerlink" title="四、产品调研及分析"></a>四、产品调研及分析</h2><p>目前市场上该类产品其实有很多，这里选择两家典型的产品进行分析。</p><p>主线问题是，他们是如何快速实现数据分析需求的？</p><h2 id="五、产品实现思路"><a href="#五、产品实现思路" class="headerlink" title="五、产品实现思路"></a>五、产品实现思路</h2><h3 id="5-1-底层数据模型"><a href="#5-1-底层数据模型" class="headerlink" title="5.1 底层数据模型"></a>5.1 底层数据模型</h3><p>这里的数据采集，本质上就是把用户的行为抽象为一个个的事件，或者说将业务过程合并到一张行为表event中。</p><p>事件模型是目前数据分析的基础，用来描述用户的一次行为，该模型用以规范并结构化用户的行为日志。</p><p>通过事件模型，我们可以这样来描述用户的一次行为：</p><p><img src="https://img.blublu.site/%E4%BA%8B%E4%BB%B6%E6%A8%A1%E5%9E%8B.png"></p><p>简单来说，事件模型 = 谁 在什么时间 在哪里 做了什么事，基于事件模型，通过app上的埋点技术，我们可以采集结构化的用户行为日志，并存储在数据库中用以分析。</p><p>使用4w来描述用户的一次行为，这里所说的行为就是事件，事件可以是多种多样的，比如用户的访问是一种事件，出价、下单、支付同样是一种类型的事件，埋点采集的就是我们所定义的事件，我们所分析的也是用户所做的每一种事件。</p><p>数据结构采用<a href="https://www.blublu.site/2020/05/event-user-model/">event-user-item模型</a></p><p>• 单边，双边用户</p><p>单双边是针对产品有多个身份使用用户时才会进行区分。单边用户，即仅有一 类用户的产品，如健身产品Keep，聊天工具 QQ 等 ; 双边用户如 O2O 产品，用户可能是普通消费者，也可能是商家用户。需要根据产品的不同，提前对用 户识别和相应属性进行设计。</p><p>• 缓慢变化维</p><p>如果遇到一些会发生变化的属性，比如用户的 VIP 等级，不能只作为用户属 性传进用户表中，还需在事件表中，记录一个 “当前发生事件 VIP 等级” 这个 属性。因为当前会员等级的统计，和发生事件时用户的会员等级统计是两种情况。</p><h3 id="5-2-分析模型"><a href="#5-2-分析模型" class="headerlink" title="5.2 分析模型"></a>5.2 分析模型</h3><p><a href="https://www.blublu.site/2020/06/the-technique-of-data-analysis/">数据分析常用思路</a></p><p>相关的分析模型主要通过sql拼接的最小成本方式实现，为此牺牲了一定的功能，待后续产品使用量提升之后会继续推进优化。</p><h3 id="5-3-产品易用性逻辑"><a href="#5-3-产品易用性逻辑" class="headerlink" title="5.3 产品易用性逻辑"></a>5.3 产品易用性逻辑</h3><p>初期未考虑太多产品易用性的设计，后期参照简约至上，对产品的易用性进行了一些改进。</p><h3 id="5-4-其他"><a href="#5-4-其他" class="headerlink" title="5.4 其他"></a>5.4 其他</h3><p>是一款<strong>数据分析产品</strong>，其主要作用是让运营、产品等非专业人员能够通过点选的方式进行自助式的数据分析，让每个人都能够<strong>及时</strong>、<strong>准确</strong>且<strong>便捷</strong>的进行业务数据分析。</p><p>其次，提供的并不仅仅是分析工具，还提供<strong>分析模型</strong>，比如日常工作中常用的分析思路如留存、复购、漏斗、用户行为路径等固化为模型，使用者只需要选定对应的分析模型，再通过点选所需内容，即可快速得出所需结果。</p><h2 id="六、产品结果评估"><a href="#六、产品结果评估" class="headerlink" title="六、产品结果评估"></a>六、产品结果评估</h2><p>产品目前的结果评估并不理想，主要原因</p><p>在项目的推进过程中，犯了很多的错误，</p><ul><li>错失项目推进加速器</li><li>未考虑不同人群的易用性设计，初期推广错了人群</li><li>错失关键窗口期</li></ul><h2 id="七、后续规划"><a href="#七、后续规划" class="headerlink" title="七、后续规划"></a>七、后续规划</h2><p>需求池：</p><ul><li>虚拟事件</li><li>事件和属性的注释</li><li>底层数据模型优化，使用ck的大宽表模型</li><li>场景库</li><li>新的分析模型</li></ul><p>路线图：</p><p>用户行为路径，分布分析，场景库，事件和属性的注释</p><h2 id="八、总结"><a href="#八、总结" class="headerlink" title="八、总结"></a>八、总结</h2><p>总的来说，这款产品是在技术思维主导下设计的一款数据产品，初期的不顺利主要是产品的易用性上设计的不够好，切入场景不够，所以，产品的推广和定位一定一定要明确。</p><p><strong>最后，数据产品首先是一款产品，然后才是数据的属性，万不可本末倒置。</strong></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;一般而言，数据分析依赖于专业的BI人员先进行报表产出，运营再依据产出的报表进行分析，对于长期稳定的业务，报表总会慢慢覆盖尽可能多的维度，但是依然会存在多种组合维度指标的追加。如果在业务经常变化的情况下，报表覆盖的维度就没法做到及时有效，报表产出周期动辄几天，且数据口径方面会存在运营和BI人员之间的理解误差，数据准确性依赖于报表产出人员的水平，这样会严重影响数据驱动的时效性和顺畅性。并且该种方案不利于培养运营人员的数据意识，试问，如果一个简单的数据分布查看都要提需求等排期，那么谁还愿意到处拿数据说话呢？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数据产品的价值就在于此，降低数据的使用门槛，让数据能更加方便、快捷、准确的为业务人员使用。&lt;/strong&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="数据产品" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E4%BA%A7%E5%93%81/"/>
    
    
  </entry>
  
  <entry>
    <title>数据分析模型</title>
    <link href="https://blog.blublu.site/2020/06/data-analysis-model/index.html"/>
    <id>https://blog.blublu.site/2020/06/data-analysis-model/index.html</id>
    <published>2020-06-13T15:01:04.000Z</published>
    <updated>2020-06-13T15:01:04.000Z</updated>
    
    <content type="html"><![CDATA[<p>在数据分析的技能方面，优秀的数据产品已经将常用的数据分析思路抽象为了几种分析模式，结合日常工作种的内容，这里分别写下我对这几种分析模式的想法与实践。</p><p>数据分析的器术道，这里是术。</p><p>在数据分析的思路方面，业界领先的数据产品已经将常用的数据分析思路抽象为了几种分析模式，结合日常工作种的内容，这里分别写下我对这几种分析模式的看法与实践。</p><p>常用分析思路：事件、留存、漏斗、分布、归因、用户分群，在日常工作中的大部分分析内容无非是以上几种分析思路的组合。</p><span id="more"></span><h2 id="一、事件分析"><a href="#一、事件分析" class="headerlink" title="一、事件分析"></a>一、事件分析</h2><h2 id="二、留存分析"><a href="#二、留存分析" class="headerlink" title="二、留存分析"></a>二、留存分析</h2><h2 id="三、漏斗分析"><a href="#三、漏斗分析" class="headerlink" title="三、漏斗分析"></a>三、漏斗分析</h2><h2 id="四、分布分析"><a href="#四、分布分析" class="headerlink" title="四、分布分析"></a>四、分布分析</h2><h2 id="五、归因分析"><a href="#五、归因分析" class="headerlink" title="五、归因分析"></a>五、归因分析</h2><p>近期涉及到了归因分析这个场景，运营需要知道最后的成交是不是由于访问了某个活动页造成的，基于此，我们需要明确归因逻辑与归因的计算方式。</p><p>参考神策的归因分析，</p><p><img src="https://i.loli.net/2020/03/26/LeDijvUq3S9tYWd.png"></p><p><img src="https://i.loli.net/2020/03/26/mTn1i2SspUZvgua.png"></p><p><a href="https://www.sensorsdata.cn/blog/20190528/">https://www.sensorsdata.cn/blog/20190528/</a></p><p>两种实现方案：第一种关联后rownumber()</p><p>第二种将下单时间统一为event事件中</p><h2 id="六、用户分群"><a href="#六、用户分群" class="headerlink" title="六、用户分群"></a>六、用户分群</h2><h2 id="七、用户行为路径"><a href="#七、用户行为路径" class="headerlink" title="七、用户行为路径"></a>七、用户行为路径</h2><h2 id="八、用户重合度分析"><a href="#八、用户重合度分析" class="headerlink" title="八、用户重合度分析"></a>八、用户重合度分析</h2><h2 id="九、session分析"><a href="#九、session分析" class="headerlink" title="九、session分析"></a>九、session分析</h2><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>看到的一些关于数据分析方面的好文章。</p><p>一文解答了我很多的迷惑：<a href="https://school.sensorsdata.cn/details/350/home">为什么我认为魔法数字有坑</a></p><p><a href="https://mp.weixin.qq.com/s/e-mdTE-xPgday40yK-9Z3Q">漏斗分析究竟能够给业务人员带来什么？（上篇）</a></p><p><a href="https://mp.weixin.qq.com/s/HfDGUeOPr5AQ_FNcJMrAww">漏斗分析究竟能够给业务人员带来什么？（下篇）</a></p><p><a href="https://mp.weixin.qq.com/s/MKt2M6qwcNtBITeYltK1eA">数据分析必知必会 | TGI指数分析实战</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;在数据分析的技能方面，优秀的数据产品已经将常用的数据分析思路抽象为了几种分析模式，结合日常工作种的内容，这里分别写下我对这几种分析模式的想法与实践。&lt;/p&gt;
&lt;p&gt;数据分析的器术道，这里是术。&lt;/p&gt;
&lt;p&gt;在数据分析的思路方面，业界领先的数据产品已经将常用的数据分析思路抽象为了几种分析模式，结合日常工作种的内容，这里分别写下我对这几种分析模式的看法与实践。&lt;/p&gt;
&lt;p&gt;常用分析思路：事件、留存、漏斗、分布、归因、用户分群，在日常工作中的大部分分析内容无非是以上几种分析思路的组合。&lt;/p&gt;</summary>
    
    
    
    <category term="数据驱动" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8/"/>
    
    
  </entry>
  
  <entry>
    <title>numpy使用</title>
    <link href="https://blog.blublu.site/2020/06/numpy-use/index.html"/>
    <id>https://blog.blublu.site/2020/06/numpy-use/index.html</id>
    <published>2020-06-13T14:49:20.000Z</published>
    <updated>2020-06-13T14:50:20.000Z</updated>
    
    <content type="html"><![CDATA[<p>python数据分析三大模块，pandas、numpy、matplotlib，这里是numpy。</p><p><img src="https://pic3.zhimg.com/v2-794a8575f409a8b0b108f6d5128a9ffc_1200x500.jpg"></p><span id="more"></span><p>numpy中的日期操作：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np </span><br><span class="line"><span class="comment"># 获取两个日期之间对应的日期，左闭右开区间</span></span><br><span class="line">np.arange(<span class="string">&#x27;2016-07-01&#x27;</span>, <span class="string">&#x27;2016-07-05&#x27;</span>, dtype=<span class="string">&#x27;datetime64[D]&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#输出：</span></span><br><span class="line">array([<span class="string">&#x27;2016-07-01&#x27;</span>, <span class="string">&#x27;2016-07-02&#x27;</span>, <span class="string">&#x27;2016-07-03&#x27;</span>, <span class="string">&#x27;2016-07-04&#x27;</span>],</span><br><span class="line">      dtype=<span class="string">&#x27;datetime64[D]&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取当前日期</span></span><br><span class="line">np.datetime64(<span class="string">&#x27;today&#x27;</span>, <span class="string">&#x27;D&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">#输出：</span></span><br><span class="line">numpy.datetime64(<span class="string">&#x27;2020-06-14&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 日期相加减</span></span><br><span class="line">yesterday = np.datetime64(<span class="string">&#x27;2016-07-01&#x27;</span>, <span class="string">&#x27;D&#x27;</span>) - np.timedelta64(<span class="number">1</span>, <span class="string">&#x27;D&#x27;</span>)</span><br><span class="line">today     = np.datetime64(<span class="string">&#x27;today&#x27;</span>, <span class="string">&#x27;D&#x27;</span>)</span><br><span class="line">tomorrow  = np.datetime64(<span class="string">&#x27;today&#x27;</span>, <span class="string">&#x27;D&#x27;</span>) + np.timedelta64(<span class="number">1</span>, <span class="string">&#x27;D&#x27;</span>)</span><br><span class="line"><span class="built_in">print</span> (<span class="string">&quot;2016-07-01的Yesterday is &quot;</span> + <span class="built_in">str</span>(yesterday))</span><br><span class="line"><span class="built_in">print</span> (<span class="string">&quot;Today is &quot;</span> + <span class="built_in">str</span>(today))</span><br><span class="line"><span class="built_in">print</span> (<span class="string">&quot;Tomorrow is &quot;</span>+ <span class="built_in">str</span>(tomorrow))</span><br><span class="line"></span><br><span class="line"><span class="comment">#输出：</span></span><br><span class="line"><span class="number">2016</span>-07-01的Yesterday <span class="keyword">is</span> <span class="number">2016</span>-06-<span class="number">30</span></span><br><span class="line">Today <span class="keyword">is</span> <span class="number">2020</span>-06-<span class="number">14</span></span><br><span class="line">Tomorrow <span class="keyword">is</span> <span class="number">2020</span>-06-<span class="number">15</span></span><br></pre></td></tr></table></figure><p><strong>内容见以下附件</strong></p><p><a href="/JupyterNotebook/8.numpy%E7%94%9F%E6%88%90%E9%9A%8F%E6%9C%BA%E6%95%B0.html">8.numpy生成随机数.html</a> </p>]]></content>
    
    
    <summary type="html">&lt;p&gt;python数据分析三大模块，pandas、numpy、matplotlib，这里是numpy。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic3.zhimg.com/v2-794a8575f409a8b0b108f6d5128a9ffc_1200x500.jpg&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="python" scheme="https://blog.blublu.site/categories/python/"/>
    
    
  </entry>
  
  <entry>
    <title>utm参数追踪</title>
    <link href="https://blog.blublu.site/2020/05/utm-resource-track/index.html"/>
    <id>https://blog.blublu.site/2020/05/utm-resource-track/index.html</id>
    <published>2020-05-09T03:24:47.000Z</published>
    <updated>2020-05-09T03:24:47.000Z</updated>
    
    <content type="html"><![CDATA[<p>以前在追踪用户来源的时候，只是简单的在链接上添加source=xx这个参数，全靠这一个参数来标识来源，虽然当时也了解到了utm参数，但是由于不懂其含义且当时场景有限，觉得source参数就足够了，直到最近，才真正了解了这套标识框架的含义，瞬间觉得这套标识框架太好用了，这里把知乎上GrowingIO的文章记录下。</p><span id="more"></span><p>utm最早是Google analytics用来定义链接来源 媒介等使用的参数以方便在分析用户站内行为时分析用户来源的效果，现在可以把它放在各个内容、活动、推广中，监控渠道的流量情况。</p><h2 id="一、utm-参数"><a href="#一、utm-参数" class="headerlink" title="一、utm 参数"></a>一、utm 参数</h2><p>目的：把投放在不同渠道的链接打上特定的标记，以监控各个链接的流量情况。</p><p><img src="https://i.loli.net/2020/05/10/yLAHSslF5JpYMVB.jpg" alt="img"></p><h2 id="二、utm举例"><a href="#二、utm举例" class="headerlink" title="二、utm举例"></a>二、utm举例</h2><ol><li>当这条链接用于付费推广时，可以这样定义：</li></ol><p><img src="https://i.loli.net/2020/05/10/KsUO7on4f2X39GF.jpg" alt="img"></p><ol start="2"><li>当这条链接用于内容文章时，可以这样定义：</li></ol><p><img src="https://i.loli.net/2020/05/10/IkszOPAv9DxGSem.jpg" alt="img"></p><ol start="3"><li>当这条链接用于活动时，可以这样定义：</li></ol><p><img src="https://i.loli.net/2020/05/10/TGhK5O7AEPvWbjm.jpg" alt="img"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;以前在追踪用户来源的时候，只是简单的在链接上添加source=xx这个参数，全靠这一个参数来标识来源，虽然当时也了解到了utm参数，但是由于不懂其含义且当时场景有限，觉得source参数就足够了，直到最近，才真正了解了这套标识框架的含义，瞬间觉得这套标识框架太好用了，这里把知乎上GrowingIO的文章记录下。&lt;/p&gt;</summary>
    
    
    
    <category term="数据驱动" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8/"/>
    
    
    <category term="埋点" scheme="https://blog.blublu.site/tags/%E5%9F%8B%E7%82%B9/"/>
    
  </entry>
  
  <entry>
    <title>Event-User模型</title>
    <link href="https://blog.blublu.site/2020/05/event-user-model/index.html"/>
    <id>https://blog.blublu.site/2020/05/event-user-model/index.html</id>
    <published>2020-05-03T16:45:03.000Z</published>
    <updated>2020-08-01T16:45:03.000Z</updated>
    
    <content type="html"><![CDATA[<p>数据驱动四个步骤，数据采集、数据建模、数据分析、指标体系，这里对应的是数据建模。目前数据开发中最常用的数据建模其实就是维度建模，本文中所参考的神策分析的数据建模也不例外，其架构就是简化了的维度建模，其中event表存储的是用户的一个个行为，是一张事实表，user表和item表是维度表，存储的是事实表中user对象和item对象的扩展信息，在进行分析时通过join进行关联查询分析。</p><p><img src="https://i.loli.net/2020/05/04/eZt2v9GB8NgJF4n.png" alt="img"></p><span id="more"></span><p><strong>神策分析的数据模型设计</strong></p><blockquote><p>在介绍数据导入模块与数据存储模块之前，我们需要先讨论一下神策分析的数据模型设计。</p><p>前面已经提到，神策分析主要解决的是用户行为分析这么一个特定领域的数据分析需求，并且期望尽量简化数据模型以降低 ETL 代价。最终，我们选择了业内非常流行的 Event + User 模型，可以覆盖客户的绝大部分分析需求，并且对于采集到的数据不需要有太多的 ETL 工作。</p><p>Event 主要是描述用户做了什么事情。每一条 Event 数据对应用户的一次事件，由 用户 ID、Event 名称、自定义属性三部分组成。Event 名称主要是对 Event 的一个分类，例如“PageView”、“Search”、“PayOrder”等等。我们在客户端会默认采集设备 ID 或者 Cookie ID 作为用户 ID，客户也可以自己设置一个合理的用户 ID。而我们最多可以支持一万个自定义属性，并且开发者并不需要事先告之系统，系统会自动从接收的数据中解析发现新的字段并且进行相应的处理。Event 数据以追加为主，不可修改，这也符合事件这一概念的实际物理意义。不过，为了方便后续系统的运维以及客户的使用，我们特别为 Event 数据提供了有限的数据删除能力，这一点会在后续存储部分更详尽地描述。</p><p>User 则主要描述用户是个什么样的人。它由用户 ID 与自定义属性两部分组成。自定义属性是年龄、所在地、Tag等。在神策分析中，它的来源主要有三类，一类是使用者自己采集并且通过接口告之系统的，例如用户的注册信息；一类是基于使用者的第一方数据挖掘得到的用户画像数据；还有一类则是通过第三方供应商得到的用户在第三方行为所体现出来的属性和特质。在神策分析中，User 数据，是每一行对应一个用户，并且可以任意修改的。</p></blockquote><p><strong>模型扩展：从 Event-User 到 Event-Item-User</strong></p><blockquote><p><strong>所有的数据模型本质上都是对现实世界的抽象，而在抽象之后必然会损失一些对现实世界的还原能力。</strong></p><p>所以 Event-User 模型虽然在电商、金融、在线教育、互联网娱乐、企业服务等不同的行业上都发挥了很好的价值，但是随着客户需求的不断深入，尤其是在和具体行业业务的深入融合中，我们也逐渐发现了这个模型的一些缺点。</p><p>例如在 Event-User 模型中，出于性能和可解释性等各方面的考虑，Event 是被设计为不可变的。从逻辑上看似乎没有问题，因为 Event 代表的是历史上已经发生过的事件，一般来说不应该需要进行更新。</p><p>但是，在实际的应用过程中，并不一定是这么理想的状态。</p><p>为了满足上述需求，我们在新版的神策分析中对 Event-User 模型进行了扩展，引入了 Item 的概念。这里的所谓 Item，在严格意义上是指一个和用户行为相关联的实体，可能是一个商品、一个视频剧集、一部小说等等。</p><p><strong>如果不严格约束的话，理论上它也可以存储其它任意的扩展维度信息。</strong></p><p><img src="https://i.loli.net/2020/05/04/z7MTkLmZYrUI36P.png" alt="img"></p></blockquote><p><strong>扩展</strong></p><p>其中值得注意的是，event表的所有变量都是横向扩展到的，即埋点中每增加一个对象，event表就要扩张一列，这样做是为了方便后续自助式分析场景下event和user、item的关联，减少复杂度。</p><p>对于user表，由于涉及到用户画像的人群圈选与保存，我们注意到神策是将画像新建的每一个人群存储为一张表，并不存储在user表中，大大减少了user表关联的复杂度。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;数据驱动四个步骤，数据采集、数据建模、数据分析、指标体系，这里对应的是数据建模。目前数据开发中最常用的数据建模其实就是维度建模，本文中所参考的神策分析的数据建模也不例外，其架构就是简化了的维度建模，其中event表存储的是用户的一个个行为，是一张事实表，user表和item表是维度表，存储的是事实表中user对象和item对象的扩展信息，在进行分析时通过join进行关联查询分析。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2020/05/04/eZt2v9GB8NgJF4n.png&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="数据驱动" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8/"/>
    
    
  </entry>
  
  <entry>
    <title>数据驱动读书笔记</title>
    <link href="https://blog.blublu.site/2020/05/data-driven-reading-notes/index.html"/>
    <id>https://blog.blublu.site/2020/05/data-driven-reading-notes/index.html</id>
    <published>2020-05-02T15:23:59.000Z</published>
    <updated>2020-05-02T15:23:59.000Z</updated>
    
    <content type="html"><![CDATA[<p>神策数据创始人桑文锋的《数据驱动：从方法到实践》读书笔记，每读一个章节，都能有所收获，特别是作者还穿插了大量的案例，结合案例，相信你会对书中所讲内容有更加深入的思考。如果你工作中恰好有着类似疑问、遇到类似问题，那么，这本书能够带来的，就不仅仅是收获，还有实实在在的问题解决方案。强烈推荐！！！</p><p><img src="https://img.blublu.site/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8.png" alt="数据驱动"></p><span id="more"></span><p>读书笔记见幕布：<a href="https://mubu.com/doc/s8Lsztgg3N">https://mubu.com/doc/s8Lsztgg3N</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;神策数据创始人桑文锋的《数据驱动：从方法到实践》读书笔记，每读一个章节，都能有所收获，特别是作者还穿插了大量的案例，结合案例，相信你会对书中所讲内容有更加深入的思考。如果你工作中恰好有着类似疑问、遇到类似问题，那么，这本书能够带来的，就不仅仅是收获，还有实实在在的问题解决方案。强烈推荐！！！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.blublu.site/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8.png&quot; alt=&quot;数据驱动&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="数据驱动" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8/"/>
    
    <category term="读书笔记" scheme="https://blog.blublu.site/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
  </entry>
  
  <entry>
    <title>再谈埋点</title>
    <link href="https://blog.blublu.site/2020/04/talk-about-event-track-again/index.html"/>
    <id>https://blog.blublu.site/2020/04/talk-about-event-track-again/index.html</id>
    <published>2020-04-18T12:02:21.000Z</published>
    <updated>2020-05-04T03:39:21.000Z</updated>
    
    <content type="html"><![CDATA[<p>埋点是数据的来源，埋点数据是分析的原材料，无论从哪方面来看，确保埋点的准确性合理性都至关重要。</p><p><img src="https://i.loli.net/2020/09/17/7GkuL5f3VOBwISD.png" alt="image-20200917140232150"></p><span id="more"></span><h2 id="一、埋点采集框架"><a href="#一、埋点采集框架" class="headerlink" title="一、埋点采集框架"></a>一、埋点采集框架</h2><p>这里直接推荐神策开源的sdk，数据模型就是event模型，简单来说就是who、when、where、how、what模型，用来描述event发生时的具体场景和内容。</p><p><img src="https://i.loli.net/2020/05/30/sC6SY8FtegVyMZo.png" alt="Snipaste_2020-05-30@02_14"></p><p><img src="https://i.loli.net/2020/05/30/8sQlUbxJ7DfdhMp.png" alt="Snipaste_2020-05-30@02_15"></p><blockquote><p>WHO：即参与这个事件的用户是谁。用户进入一个功能页面，我们要知道进来的用户是谁，并且同一个用户以不同身 份状态在不同的端操作时，都能是识别出来就是同一个人，一套合适且完备的ID-mapping解决方案，对于提高用户行为 分析的准确性、完整性有非常大的影响，对用户数量的统计、以及漏斗、留存、路径等期望用户行为流相关的分析尤其明显。 同一用户的识别出现断层，会导致以上分析数据不准确或不可用。因此，我们在进行任何数据接入之前，都应当先确定如 何来标识用户。以APP的页面浏览为例，在互联网时代，用户都以设备为载体，因此可通过设备旧来记录；具体业务场 景下，用户自身也带着业务属性，可通过user_id、 login_id等类似的业务身份标识来记录，确保单个用户在多设备之间 的行为可以打通。总之，关于who，大家要想清楚要如何准确地标识客户，一个项目的旧机制要在项目开始时特别慎重地进行确认，之后技术人员需要遵循这个规范来埋点，否则后期修改旧机制、清洗旧错误都是一个非常麻烦的事情。</p><p>WHEN:即这个事件发生的时间，神策分析通过自动采集的时间戳属性来记录。</p><p>WHAT:WHAT描述了一个事件具体是什么，这里就是神策事件设计模型的一个独特的地方。在这里场景下，按照神策的事件设计规范，事件是‘’APP页面浏览”，而不是“首页的浏览”，通过增加『页面名称』这个属性来区分究竟浏览的是 哪个具体的页面，大家可以思考下，为什么是这种设计思路呢？实际上，一般一个产品会有N多个不同的页面，如果将每个页面都单独定义为一个事件，那么后台的事件将会有几百上千个，业务人员在使用时会非常的麻烦，筛选事件的成本也会非常大。神策分析在做埋点需求设计时，针对所有类似的触发机制和场景的事件，都会做聚合处理，因此企业的事件量 通常会维持在30-50个左右，配以神策的归类机制，极大方便企业进行事件管理，给业务人员带来极强的易用性。</p><p>HOW：即用户从事这个事件的方式，HOW关联的是与事件强相关的属性内容。这是企业在事件梳理过程中非常容易出纰漏的地方。比如在APP页面浏览或者APP的点击事件上，经常会出现找不到按钮，或者无法定位页面的情况，原因就是研发的规范性较差，比如对页面标题的定义不规范等。<strong>神策针对页面标题做了自定义和规范，主要包括两方面：一是所有页面本身都有名字，并且与APP的页面是同一个名字，如此保证业务同学定位该页面时很容易找到；一是针对lOS与安卓经常出现两个同样的页面命名不一样的情况，神策分析会做维度字典的规整，如此，其可用性能够满足绝大多数的应用 场景。</strong> .</p><p>WHERE: IP、国家、省、市区等用户的操作属性，神策分析都是会在基础信息采集上做加工衍生，可以做到自动采集。 端口、应用版本、操作系统、操作系统版本、设备制造商、设备型号、屏幕高度、屏幕宽度这些前端维度与属性，神策分 析的采集也是默认获取的。对于后端自定义采集来说，则需要根据分析需求进行判断和梳理，确认是否需要通过接口透传等方式获取到对应这些前端属性，否则将会影响后续的多维分析。 </p></blockquote><p>神策开源的埋点SDK <a href="http://opensource.sensorsdata.cn/">http://opensource.sensorsdata.cn/</a></p><h2 id="二、埋点采集的数据源"><a href="#二、埋点采集的数据源" class="headerlink" title="二、埋点采集的数据源"></a>二、埋点采集的数据源</h2><p>通常而言，包括三项数据源，分别是：</p><p><img src="https://i.loli.net/2020/05/04/XAGYFVSILyC9Bxl.png" alt="Snipaste_2020-05-04@11_25"></p><p>前端操作和业务数据是我们最常使用的埋点数据，分析时所使用的大部分数据也是这两个来源的数据，我们会比较容易忽略后端日志来源的数据，有些前后端交互的行为，比如点赞这个动作，既有前端采集的动作，又有后端的数据库记录，但是后端数据库记录的时候往往是从业务的角度决定记录什么字段，但是在分析的角度，可能就没有我们需要分析的维度了，所以，此时可以再增加一个步骤，将点赞的日志数据采集下来，日志数据上可以很方便的带上我们需要分析的维度，且对业务方没太大影响。</p><h2 id="三、前端埋点和后端埋点"><a href="#三、前端埋点和后端埋点" class="headerlink" title="三、前端埋点和后端埋点"></a>三、前端埋点和后端埋点</h2><p>有篇文档写的非常详细，这里直接copy过来，重点是能后端记录的优先后端记录。</p><blockquote><p>前端埋点：收集数据在客户端进行，用户在客户端浏笕页面、点击按钮、滑动界面等均可采集。一般在用户动作发生时，采集数据后端埋点：收集数据在服务器端进行，收集的是http请求发生时的数据，更多的是数据层，业务逻辑层的数据。一般在http请求触发、或结果返回时采集数据</p><p><strong>前端埋点</strong></p><p>优势：直接了断，贴近用户在产品中的行为</p><p>劣势：</p><ul><li>App迭代更新有变化时，需要重新埋点</li><li>埋点更新需要伴随App更新，用户不更新App时，采集不到相应数据</li><li>涉及到本地缓存和公网传输，数据丢失率高于后端埋点，数据准确性低于后端埋点</li><li>事件发生时间使用客户端时间，时间记录存在与标准时间不同步的情况</li><li>数据经过公网传输，需要考虑安全性问题</li><li>数据时效性差</li></ul><p><strong>后端埋点</strong></p><p>优势：</p><ul><li>埋点的新增和修改均不受客户端发版的限制</li><li>数据仅在内网传输，时效性、安全性、可靠性问题迎刃而解</li><li>日志变更可以直接在服务端变更，不依赖客户端的发版与更新</li></ul><p>劣势：</p><ul><li>部分行为或者字段，一般情况下在后端采集不到，需要客户端传递给后端，如设备信息、网络信息等</li><li>与后端服务耦合，代码不合理时可能影响业务稳定性</li></ul><p><strong>如何选择</strong></p><ul><li>纯前端交互行为，如：下拉框选择、按钮点击等，选择前端埋点</li><li>业务行为多选择在后端埋点；如评论、点赞、购买、提交订单、支付等行为</li><li>前端、后端都可以获取数据时，优先后端接入数据</li></ul></blockquote><p>也可以参考这篇文章：<a href="https://mp.weixin.qq.com/s/5nz5lURyPyRB6kV3tXkV6w">客户端埋点 or 服务端埋点</a></p><h2 id="四、埋点方案设计的四要素"><a href="#四、埋点方案设计的四要素" class="headerlink" title="四、埋点方案设计的四要素"></a>四、埋点方案设计的四要素</h2><p><a href="https://mp.weixin.qq.com/s/7vH-rlibYmedn1h1c-AEiA">数据采集方式</a></p><blockquote><p><strong>1. 确认事件与变量</strong></p><ul><li>事件：指产品中的操作</li><li>变量：指描述事件的属性</li></ul><p><strong>2. 明确事件的触发时机</strong></p><p><strong>3. 规范命名</strong></p><p><strong>4. 明确优先级</strong></p></blockquote><h2 id="五、埋点采集方式、触发时机、同步策略"><a href="#五、埋点采集方式、触发时机、同步策略" class="headerlink" title="五、埋点采集方式、触发时机、同步策略"></a>五、埋点采集方式、触发时机、同步策略</h2><blockquote><p> <strong>前端触发就上报：</strong>点击“去支付”按钮就触发，这是最常见的前端采集方式，如果业务方是想了解的是“用户是否有 意愿支付”，那么当用户点击“支付订单”这个按钮时或者发出支付请求就触发采集即可。这是时机埋点采集时最常用的一 种方式。<br><strong>前端获取后端结果后上报：</strong>这种方式一般是由于除了记录用户操作外，还需要获取用户操作的结果，比如需要收到 后端结果的返回，以判断用户是否支付成功，以及失败情况下具体的报错原因，那么其触发机制必须等到前端拿到后端服 务器处理结果后，再进行上报。<br><strong>后端触发就上报：</strong>这种方式是指后端处理后直接上报，比如后端处理付款请求出结果时直接后端触发上报。采用这种方式的主要好处是数据不会出现漏报，但也由于是直接后端上报，基本是拿不到用户的设备终端及软硬件环境属性的，比 如用户在支付时用的是什么设备、网络环境是什么等信息。<br><strong>后端获取前端属性且触发后上报：</strong>这种情况就是为了解决后端埋点的软硬件环境属性问题，让前端在用户点击“去 支付”时，将相应的属性一并传回服务器，服务器发生“支付成功”时，带上相应的前端属性上报数据。当然这种方式理 论上是数据准确度、完备性最高的，但同时这种方式的采集成本会比较高，意味着所有端的前后端接口需要做变更，建议是只在数据准确性、前端属性获取两个需求都非常强时采用。 </p></blockquote><blockquote><p>通过以上的描述大家也能看得出来，每种触发时机有各自的优劣势，在具体设计触发时机中，决定具体采用哪种方式的因素，特别值得关注：业务含义、旧识别机制、前端软硬件环境属性获取、业务处理结果获取、数据准确性要求。神策团队在给企业做事件设计时也会格外关注这些点；在后续企业自己做事件设计时候，企业也应该从这几个方面给研发同学讲解清楚，以保证采集的数据更符合场景诉求。 </p></blockquote><p>为了最大限度的保证数据的完整性和准确性，SDK 采集的数据，一般会先缓存到本地，待符合一定条件之后再同步。</p><p>常见的数据同步策略：</p><ul><li>事件先缓存到本地 sqlite3</li><li>本地缓存一定条数量的事件会同步（默认 100 条）</li><li>固定时间间隔同步（默认 15 秒）</li><li>核心事件发生同步（trackInstallation、login 等）</li><li>APP 退出尝试同步</li><li>本地缓存太多事件时的处理</li></ul><p>在 APP 退出时尝试同步数据，是为了防止用户之后长时间不启动 APP、不再启动 APP 或者直接卸载 APP。</p><h2 id="六、埋点工作流程"><a href="#六、埋点工作流程" class="headerlink" title="六、埋点工作流程"></a>六、埋点工作流程</h2><p><img src="https://i.loli.net/2020/05/30/ec72o9nVSbiGEHr.png" alt="Snipaste_2020-05-30@02_34"></p><h2 id="七、如何标识用户与设备"><a href="#七、如何标识用户与设备" class="headerlink" title="七、如何标识用户与设备"></a>七、如何标识用户与设备</h2><blockquote><p>在 Android 如何准确标识设备？各个方案有什么优缺点？</p><hr><p>常用的设备唯一标识符有：UUID、MAC 地址、IMEI、AndroidId。</p><p>各自的优缺点<br>UUID：UUID 一般会配合 SharedPreferences 使用来标识一个设备，它的优点是不需要任何权限，也不会有任何机构认为 UUID 有过度窃取用户隐私的嫌疑，缺点在于如果用户卸载重装 App ，存储的 UUID 就会被抹掉。</p><p>MAC 地址：MAC 地址就是设备网卡的唯一识别码，它的优点是 MAC 地址值不会改变并且值唯一，缺点在于需要获取权限并且在 Android 6.0 之后任何手机通过 getMacAddress() 都只能获取到 “02:00:00:00:00:00” 这个值，虽然有其他途径获取但很容易触犯到隐私条款。</p><p>IMEI：IMEI 是国际移动设备身份码，它的优点同样是值不会改变并且值唯一，缺点在于需要获取权限，并且在 Android 10 版本系统层面禁止了 IMEI 的获取，IMEI 同样也容易触犯到隐私条款。</p><p>AndroidId：AndroidId 是设备首次运行的时候，系统随机生成的一串 16 进制的数字，它的优点是不需要任何权限、每个设备值唯一且值也不像 UUID 那样容易变，缺点就是在用户恢复出厂设置的时候 AndroidId 会重新生成。在 Android 8 之前不同 App 对于同一设备取到的 AndroidId 甚至是相同的，在 Android 8 后 AndroidId 的生成开始与包名有关，不同包名的 App 对于同一个设备取到的 AndroidId 开始不同。</p><p>神策 Android SDK 默认正是采用了 AndroidId 来标识一个设备，如果 AndroidId 获取不到则获取随机的 UUID。</p></blockquote><blockquote><p>ios中的用户标识方案可以看这篇文章：<a href="https://www.jianshu.com/p/c5eca7cd56c2">iOS获取设备唯一标识的8种方法</a></p><p>现在苹果主推 IDFA 和 IDFV 这两种方法，分别对外和对内，但是 IDFV 在 APP 重新安装时会更改，所以我的方法是通过第一次生成的 IDFV 存储到 keychain 中，以后每次获取标识符都从 keychain 中获取。</p><p>如果开启 IDFA ，神策 SDK 会优先获取 IDFA，如果获取失败再尝试获取 IDFV。使用 IDFA 能避免用户在重装 App 后设备 ID 发生变化的情况。</p></blockquote><p>这里其实还涉及到了oneid的内容，理想状态下是我们能够通过一个id准确的标识用户，但是实际情况会比较复杂，这块儿没什么特别完美的方案，oneid的实施方案可以参照<a href="https://www.blublu.site/2020/01/oneid-implementation/">oneid实现</a>。</p><h2 id="八、时长、时间戳采集方案"><a href="#八、时长、时间戳采集方案" class="headerlink" title="八、时长、时间戳采集方案"></a>八、时长、时间戳采集方案</h2><h3 id="1、时长的采集方案"><a href="#1、时长的采集方案" class="headerlink" title="1、时长的采集方案"></a>1、时长的采集方案</h3><p>Android 和 iOS，都有一个 boot time 的概念，即手机启动了多长时间。可以理解为系统里有一个定时器，每次手机启动后，这个定时器就从零开始计时，与客户端时间无关，如果使用这个 time 来计算间隔，就是 100% 准确的，之后再在服务器端进行数据纠正。</p><h3 id="2、时间戳的纠正"><a href="#2、时间戳的纠正" class="headerlink" title="2、时间戳的纠正"></a>2、时间戳的纠正</h3><p>神策的时间纠正策略：</p><p><img src="https://i.loli.net/2020/09/17/rfTDIQ235sXoVwN.png" alt="image-20200917135309345"></p><blockquote><p>用户在手机时间戳 T1 时触发了一个事件（比如登录事件），然后事件存入本地缓存。数据采集 SDK 在用户手机时间戳 T2 时开始同步事件数据（包含登录事件），然后服务端通过 HTTP(S) 的 Request Header Date 可以获取到数据采集 SDK 发起 Request 时用户手机时间戳 T2 。</p></blockquote><blockquote><p>如果 T2 与当前服务端的时间戳 T3 的误差在一定的可接受范围之内（比如 30s，这是因为网络请求也需要一定的时间），就可以说明当前用户手机的时间戳是准确的（我们假设服务端时间戳是准确的，绝大部分情况下也都是准确的），同时说明登录事件发生时的时间戳 T1 也是准确的，服务端在接收到登录事件时无需做任何的特殊处理。</p></blockquote><blockquote><p>如果 T2 与 T3 相差比较大（比如上图中的 T2 为 15:00，T3 为 16:00），我们可以确定当前用户手机的时间戳 T2 是不准确的，即比服务端的时间戳晚了一个小时（16:00 - 15:00 = 一个小时），从而就可以假设登录事件发生时的时间戳 T1 也比服务端晚了一个小时，即 14:00 加上一个小时应该为 15:00。</p></blockquote><blockquote><p>因此，服务端在接收到事件时会把登录事件的时间戳 T1 再加上一个小时，变成 15:00，从而就达到了“时间纠正”的效果。</p></blockquote><blockquote><p>当然，“时间纠正”策略，也无法确保可以 100% 解决所有和时间戳相关的问题。比如，还是以上图为例，如果在时间戳 T1 和 T2 之间，用户手机的时间戳再次发生了人为变更，那么，该方案就无法正确的进行时间纠正了，这是因为时间戳 T2 和 T3 之间的误差额，与时间戳 T1 和当时服务端对应时间戳的差额就不相等了。</p></blockquote><blockquote><p>但从实际情况来看，由于数据采集 SDK 一般都会以较短的固定时间间隔同步数据（比如 15s），所以时间戳 T1 和 T2 之间的时间间隔会比较短，本身发生时间戳变更的可能性就比较小，即使真正发生变更了，影响到的事件数量也比较少（15s 内可能只会触发几条事件）。因此，“时间纠正”策略可以解决 99% 以上的和事件时间戳相关的问题。</p></blockquote><h2 id="九、解决埋点问题的根源性解决方案"><a href="#九、解决埋点问题的根源性解决方案" class="headerlink" title="九、解决埋点问题的根源性解决方案"></a>九、解决埋点问题的根源性解决方案</h2><p>把埋点采集当成独立的研发业务来对待。</p><blockquote><p> 实际上，造成埋点成本高、效率低下的真正原因，就在于没有找到合适的埋点管理和落地方法，埋点的全面性和复用性太低，导致整个埋点体系持续陷入拆东墙补西墙、每个采集的需求都要单独走完整的采集业务流程，沟通、验证的成本高，对团队的整体消耗过大。</p></blockquote>]]></content>
    
    
    <summary type="html">&lt;p&gt;埋点是数据的来源，埋点数据是分析的原材料，无论从哪方面来看，确保埋点的准确性合理性都至关重要。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2020/09/17/7GkuL5f3VOBwISD.png&quot; alt=&quot;image-20200917140232150&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="数据驱动" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8/"/>
    
    
    <category term="埋点" scheme="https://blog.blublu.site/tags/%E5%9F%8B%E7%82%B9/"/>
    
  </entry>
  
  <entry>
    <title>matplotlib可视化基础</title>
    <link href="https://blog.blublu.site/2020/04/matplotlib-visual-basics/index.html"/>
    <id>https://blog.blublu.site/2020/04/matplotlib-visual-basics/index.html</id>
    <published>2020-04-12T14:49:20.000Z</published>
    <updated>2020-04-12T14:50:20.000Z</updated>
    
    <content type="html"><![CDATA[<p>matplotlib制作可视化图表是python数据分析中的一个非常重要的模块，这个模块我之前一直没怎么使用过，这里重新练习下matplotlib模块的使用，数据源来自天池比赛中的二手车交易价格预测数据。</p><span id="more"></span><h2 id="一、matplotlib基础"><a href="#一、matplotlib基础" class="headerlink" title="一、matplotlib基础"></a>一、matplotlib基础</h2><h3 id="1、matplotlib图形的基本构成部分"><a href="#1、matplotlib图形的基本构成部分" class="headerlink" title="1、matplotlib图形的基本构成部分"></a>1、matplotlib图形的基本构成部分</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 一般在jupyter notebook中导入matplotlib的方式</span></span><br><span class="line"><span class="keyword">import</span> matplotlib <span class="keyword">as</span> mpl</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">%matplotlib inline <span class="comment">#在notebook中嵌入画图</span></span><br></pre></td></tr></table></figure><ul><li><strong>基础 (primitives) 类</strong>：线 (line), 点 (marker), 文字 (text), 图例 (legend), 网格 (grid), 标题 (title), 图片 (image) 等。</li><li><strong>容器 (containers) 类</strong>：图 (figure), 坐标系 (axes), 坐标轴 (axis) 和刻度 (tick)</li></ul><p>基础类元素是我们想画出的标准对象，而容器类元素是基础类元素的寄居出，它们也有层级结构。</p><p>图 → 坐标系 → 坐标轴 → 刻度→绘制图型</p><p>如下图所示，主要元素及结构：figure(图形)、axes(子图形)、title(标题)、legend(图例)、Major tick(大标尺刻度)、Minor tick(小标尺刻度)、Major tick label(大标尺刻度数值)、Minor tick label(小标尺刻度数值)、Y axis label(y轴指标说明)、X axis label(x轴指标说明)、Line(线型图)、Markers(数据标注点)、Grid(格子)等。</p><p><img src="https://i.loli.net/2020/05/31/eWPZzkEoDHdChBl.png" alt="image-20200531221650861"></p><h3 id="2、matplotlib图形的几个容器类："><a href="#2、matplotlib图形的几个容器类：" class="headerlink" title="2、matplotlib图形的几个容器类："></a>2、matplotlib图形的几个容器类：</h3><h4 id="2-1-Figure对象（图）"><a href="#2-1-Figure对象（图）" class="headerlink" title="2.1 Figure对象（图）"></a>2.1 Figure对象（图）</h4><p>整个图形即是一个Figure对象。<br>Figure对象至少包含一个子图，也就是Axes对象。<br>Figure对象包含一些特殊的Artist对象，如title标题、图例legend。<br>Figure对象包含画布canvas对象。 canvas对象一般不可见，通常无需直接操作该对象，matplotlib程序实际绘图时需要调用该对象。</p><p>figure对象上可以添加各种元素：文字、图片、折线等，接下来实际操作下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在figure中显示文本并自定义位置</span></span><br><span class="line">plt.figure()</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;Figure&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"><span class="comment"># 第一、二个参数是指横轴和纵轴坐标</span></span><br><span class="line"><span class="comment"># 第三个参数字符是指要显示的内容</span></span><br><span class="line"><span class="comment"># ha, va 是横向和纵向位置</span></span><br><span class="line"><span class="comment"># size 设置字体大小</span></span><br><span class="line"><span class="comment"># alpha 设置字体透明度 (0.5 是半透明)</span></span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/05/31/vI5YkLQFXoySEcd.png"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 用 Image.open() 将图片转成像素存在 ndarray 中，再用 plt.imshow() 展示。</span></span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image <span class="comment">#导入图片处理模块</span></span><br><span class="line">plt.figure()</span><br><span class="line">plt.xticks([]) <span class="comment">#将x、y的刻度置为null</span></span><br><span class="line">plt.yticks([])</span><br><span class="line">im = np.array(Image.<span class="built_in">open</span>(<span class="string">&#x27;111.png&#x27;</span>))</span><br><span class="line">plt.imshow(im)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/05/31/Svymhc7QLjM6ifs.png" alt="image-20200531212320096"></p><h4 id="2-2-Subplot对象（子图）"><a href="#2-2-Subplot对象（子图）" class="headerlink" title="2.2 Subplot对象（子图）"></a>2.2 Subplot对象（子图）</h4><p>常用方法set_xlim()以及set_ylim()：设置子图x轴和y轴对应的数据范围。</p><p>set_xticks()以及set_yticks()：设置子图的x轴和y轴刻度标签</p><p>set_title()：设置子图的标题。</p><p>set_xlabel()以及set_ylable()：设置子图x轴和y轴指标的描述说明</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># subplot(rows, columns, i-th plots) </span></span><br><span class="line">plt.figure()</span><br><span class="line">plt.subplot(<span class="number">2</span>,<span class="number">1</span>,<span class="number">1</span>)</span><br><span class="line">plt.xticks([])</span><br><span class="line">plt.yticks([])</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;subplot(2,1,1)&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line">plt.subplot(<span class="number">2</span>,<span class="number">1</span>,<span class="number">2</span>)</span><br><span class="line">plt.xticks([])</span><br><span class="line">plt.yticks([])</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;subplot(2,1,2)&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line">plt.show()</span><br><span class="line"><span class="comment"># 声明完子图后，下面所有代码就只在这幅子图上生效，直到声明下一幅子图</span></span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/05/31/W2qGz3SIPBFr7Hp.png" alt="image-20200531212506334"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 循环绘制子图</span></span><br><span class="line">fig,axes = plt.subplots(nrows=<span class="number">2</span>,ncols=<span class="number">2</span>)</span><br><span class="line"><span class="comment"># enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)</span></span><br><span class="line"><span class="comment"># 组合为一个索引序列，同时列出数据和数据下标，一般用在 for 循环当中。</span></span><br><span class="line"><span class="keyword">for</span> i,ax <span class="keyword">in</span> <span class="built_in">enumerate</span>(axes.flat): </span><br><span class="line">    ax.<span class="built_in">set</span>(xticks=[],yticks=[])</span><br><span class="line">    s = <span class="string">&#x27;subplot(2,2&#x27;</span> + <span class="built_in">str</span>(i) + <span class="string">&#x27;)&#x27;</span></span><br><span class="line">    ax.text(<span class="number">0.5</span>,<span class="number">0.5</span>,s,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>)</span><br><span class="line">    </span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/05/31/Ybf5lraiReAcXES.png" alt="image-20200531212515700"></p><h4 id="2-3-Axes对象（坐标系）"><a href="#2-3-Axes对象（坐标系）" class="headerlink" title="2.3 Axes对象（坐标系）"></a>2.3 Axes对象（坐标系）</h4><p>字面上理解，Axes是数据轴Axis的复数，但它并不是指数据轴，而是子图对象，可以这样理解，每一个子图都有x和y轴，Axes则用于代表这两个数据轴所对应的一个子图坐标系对象，我们每次画图看起来是在图（Figure）中进行，实际是绘制在Axes坐标系对象中的，一个Figure对象能有多个Axes对象。</p><blockquote><p>一幅图 (Figure) 中可以有多个坐标系 (Axes)，说一幅图中有多幅子图 (Subplot)，因此坐标系和子图是不是同样的概念？</p><p>在绝大多数情况下是的，两者有一点细微差别：</p><ul><li>子图在母图中的网格结构一定是规则的</li><li>坐标系在母图中的网格结构可以是不规则的</li></ul><p>子图是坐标系的一个特例。</p></blockquote><p>坐标系比子图更通用，有两种生成方式</p><ul><li><p>用 gridspec 包加上 subplot() </p></li><li><p>用 plt.axes()</p></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 不规则网格</span></span><br><span class="line"><span class="keyword">import</span> matplotlib.gridspec <span class="keyword">as</span> gridspec</span><br><span class="line">G = gridspec.GridSpec(<span class="number">3</span>,<span class="number">3</span>)</span><br><span class="line"></span><br><span class="line">ax1 = plt.subplot(G[<span class="number">0</span>:<span class="number">1</span>,:<span class="number">3</span>])  <span class="comment">#类似于numpy的选取方式，选取矩阵数据</span></span><br><span class="line">plt.xticks([]),plt.yticks([])</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;Axes 1&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">ax2 = plt.subplot(G[<span class="number">1</span>:<span class="number">2</span>,<span class="number">0</span>:<span class="number">2</span>])  <span class="comment">#类似于numpy的选取方式，选取矩阵数据</span></span><br><span class="line">plt.xticks([]),plt.yticks([])</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;Axes 2&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">ax3 = plt.subplot(G[<span class="number">1</span>:<span class="number">3</span>,<span class="number">2</span>:<span class="number">3</span>])  <span class="comment">#类似于numpy的选取方式，选取矩阵数据</span></span><br><span class="line">plt.xticks([]),plt.yticks([])</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;Axes 3&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">ax4 = plt.subplot(G[<span class="number">2</span>:<span class="number">3</span>,<span class="number">0</span>:<span class="number">1</span>])  <span class="comment">#类似于numpy的选取方式，选取矩阵数据</span></span><br><span class="line">plt.xticks([]),plt.yticks([])</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;Axes 4&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">ax5 = plt.subplot(G[<span class="number">2</span>:<span class="number">3</span>,<span class="number">1</span>:<span class="number">2</span>])  <span class="comment">#类似于numpy的选取方式，选取矩阵数据</span></span><br><span class="line">plt.xticks([]),plt.yticks([])</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;Axes 5&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/05/31/M3DczKoCLk6bBjS.png" alt="image-20200531214553755"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 大图套小图</span></span><br><span class="line">plt.axes([<span class="number">0.1</span>,<span class="number">0.1</span>,<span class="number">0.8</span>,<span class="number">0.8</span>])</span><br><span class="line"><span class="comment"># plt.xticks([]),plt.yticks([])</span></span><br><span class="line">plt.text(x=<span class="number">0.6</span>,y=<span class="number">0.6</span>,s=<span class="string">&#x27;axes([0.1,0.1,0.8,0.8])&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">plt.axes([<span class="number">0.2</span>,<span class="number">0.2</span>,<span class="number">0.3</span>,<span class="number">0.3</span>])</span><br><span class="line">plt.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=<span class="string">&#x27;axes([0.2,0.2,0.3,0.3])&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,ha=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">10</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line">plt.show()</span><br><span class="line"><span class="comment"># 此时的axes对象的坐标和xticks刻度上的坐标并不一致</span></span><br><span class="line"><span class="comment"># plt.axes([l,b,w,h]) </span></span><br><span class="line"><span class="comment"># 其中 [l, b, w, h] 可以定义坐标系</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># l 代表坐标系左边到 Figure 左边的水平距离</span></span><br><span class="line"><span class="comment"># b 代表坐标系底边到 Figure 底边的垂直距离</span></span><br><span class="line"><span class="comment"># w 代表坐标系的宽度</span></span><br><span class="line"><span class="comment"># h 代表坐标系的高度</span></span><br><span class="line"><span class="comment"># 如果 l, b, w, h 都小于 1，那它们是标准化 (normalized) 后的距离。比如 Figure 底边长度为 10， 坐标系底边到它的垂直距离是 2，那么 b = 2/10 = 0.2。</span></span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/05/31/UHW7elbCIO5hcjE.png" alt="image-20200531214621588"></p><p>两种生成坐标系的推荐代码：</p><p>第一种，同时生成图和坐标系：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">fig,ax = plt.subplots()</span><br><span class="line">ax.<span class="built_in">set</span>(xticks=[],yticks=[])</span><br><span class="line">s=<span class="string">&#x27;xxx&#x27;</span></span><br><span class="line">ax.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=s,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><p>第二种，先生成图，再添加坐标系</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fig=plt.figure()</span><br><span class="line">ax = fig.add_subplot(<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>)</span><br><span class="line">ax.<span class="built_in">set</span>(xticks=[],yticks=[])</span><br><span class="line">s=<span class="string">&#x27;xxx&#x27;</span></span><br><span class="line">ax.text(x=<span class="number">0.5</span>,y=<span class="number">0.5</span>,s=s,ha=<span class="string">&#x27;center&#x27;</span>,va=<span class="string">&#x27;center&#x27;</span>,size=<span class="number">20</span>,alpha=<span class="number">0.5</span>)</span><br><span class="line">plt.show()</span><br></pre></td></tr></table></figure><h4 id="2-4-Axis对象（坐标轴）"><a href="#2-4-Axis对象（坐标轴）" class="headerlink" title="2.4 Axis对象（坐标轴）"></a>2.4 Axis对象（坐标轴）</h4><p>Axis是数据轴对象，主要用于控制数据轴上刻度位置和显示数值，通常是二维的，有两条坐标轴</p><ul><li>横轴：XAxis</li><li>纵轴：YAxis</li></ul><p>每个坐标轴包含两个元素</p><ul><li>容器类元素「刻度」，该对象里还包含<strong>刻度本身</strong>和<strong>刻度标签</strong></li><li>基础类元素「标签」，该对象包含的是<strong>坐标轴标签</strong></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">fig, ax = plt.subplots()</span><br><span class="line">ax.set_xlabel(<span class="string">&#x27;x label&#x27;</span>,size=<span class="number">20</span>,color=<span class="string">&#x27;red&#x27;</span>,rotation=<span class="number">30</span>) </span><br><span class="line"><span class="comment">#所有的文本对象都可以调整文字和颜色以及角度</span></span><br><span class="line">ax.set_ylabel(<span class="string">&#x27;t label&#x27;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> label <span class="keyword">in</span> ax.xaxis.get_ticklabels():</span><br><span class="line">    <span class="comment"># x轴的label是文本对象，都可以调整相关文本的参数，y轴同样</span></span><br><span class="line">    label.set_color(<span class="string">&#x27;blue&#x27;</span>)</span><br><span class="line">    label.set_rotation(<span class="number">45</span>)</span><br><span class="line">    label.set_fontsize(<span class="number">20</span>)</span><br><span class="line">    </span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> ax.yaxis.get_ticklines():</span><br><span class="line">    <span class="comment"># y轴的line对象进行调整，线条的对象同样有类似的属性</span></span><br><span class="line">    line.set_color(<span class="string">&#x27;green&#x27;</span>)</span><br><span class="line">    line.set_markersize(<span class="number">500</span>)</span><br><span class="line">    line.set_markeredgewidth(<span class="number">30</span>)</span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/05/31/qDkAt2BO7FMSp6j.png" alt="image-20200531220320757"></p><h4 id="2-5-Tick对象（刻度）"><a href="#2-5-Tick对象（刻度）" class="headerlink" title="2.5 Tick对象（刻度）"></a>2.5 Tick对象（刻度）</h4><h4 id="2-6-Artist对象"><a href="#2-6-Artist对象" class="headerlink" title="2.6 Artist对象"></a>2.6 Artist对象</h4><p>基本上所有的对象都是一个Artist对象，包括Figure对象、Axes对象和Axis对象，可以将Artist理解为一个基本类。当提交代码，图像最终呈现时，所有的artist对象都会绘制于canvas画布上，这个对象其实大部分时间用不上。</p><h3 id="3、matplotlib图形的基础元素："><a href="#3、matplotlib图形的基础元素：" class="headerlink" title="3、matplotlib图形的基础元素："></a>3、matplotlib图形的基础元素：</h3><p>要画出一幅有内容的图，还需要在容器里添加基础元素比如线 (line), 点 (marker), 文字 (text), 图例 (legend), 网格 (grid), 标题 (title), 图片 (image) 等，具体来说</p><ul><li>画一条线，用 plt.plot() 或 ax.plot()</li><li>画个记号，用 plt.scatter() 或 ax.scatter()</li><li>添加文字，用 plt.text() 或 ax.text()</li><li>添加图例，用 plt.legend() 或 ax.legend()</li><li>添加图片，用 plt.imshow() 或 ax.imshow()</li></ul><h2 id="二、实例绘图"><a href="#二、实例绘图" class="headerlink" title="二、实例绘图"></a>二、实例绘图</h2><p>本实例绘图数据依据天池比赛<a href="https://tianchi.aliyun.com/competition/entrance/231784/introduction">零基础入门数据挖掘 - 二手车交易价格预测</a>的数据源进行绘制，探索该部分数据结构。</p><p>首先读取数据</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 读取天池二手车交易价格预测的训练数据</span></span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np </span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">dftrain = pd.read_csv(<span class="string">r&#x27;.\\天池二手车交易交额预测\\used_car_train_20200313.csv&#x27;</span>,sep=<span class="string">&#x27; &#x27;</span>)</span><br><span class="line">dftrain.head()</span><br></pre></td></tr></table></figure><table><thead><tr><th align="right"></th><th align="right">SaleID</th><th align="right">name</th><th align="right">regDate</th><th align="right">model</th><th align="right">brand</th><th align="right">bodyType</th><th align="right">fuelType</th><th align="right">gearbox</th><th align="right">power</th><th align="right">kilometer</th><th align="right">…</th><th align="right">v_5</th><th align="right">v_6</th><th align="right">v_7</th><th align="right">v_8</th><th align="right">v_9</th><th align="right">v_10</th><th align="right">v_11</th><th align="right">v_12</th><th align="right">v_13</th><th>v_14</th></tr></thead><tbody><tr><td align="right">0</td><td align="right">0</td><td align="right">736</td><td align="right">20040402</td><td align="right">30.0</td><td align="right">6</td><td align="right">1.0</td><td align="right">0.0</td><td align="right">0.0</td><td align="right">60</td><td align="right">12.5</td><td align="right">…</td><td align="right">0.235676</td><td align="right">0.101988</td><td align="right">0.129549</td><td align="right">0.022816</td><td align="right">0.097462</td><td align="right">-2.881803</td><td align="right">2.804097</td><td align="right">-2.420821</td><td align="right">0.795292</td><td>0.914762</td></tr><tr><td align="right">1</td><td align="right">1</td><td align="right">2262</td><td align="right">20030301</td><td align="right">40.0</td><td align="right">1</td><td align="right">2.0</td><td align="right">0.0</td><td align="right">0.0</td><td align="right">0</td><td align="right">15.0</td><td align="right">…</td><td align="right">0.264777</td><td align="right">0.121004</td><td align="right">0.135731</td><td align="right">0.026597</td><td align="right">0.020582</td><td align="right">-4.900482</td><td align="right">2.096338</td><td align="right">-1.030483</td><td align="right">-1.722674</td><td>0.245522</td></tr><tr><td align="right">2</td><td align="right">2</td><td align="right">14874</td><td align="right">20040403</td><td align="right">115.0</td><td align="right">15</td><td align="right">1.0</td><td align="right">0.0</td><td align="right">0.0</td><td align="right">163</td><td align="right">12.5</td><td align="right">…</td><td align="right">0.251410</td><td align="right">0.114912</td><td align="right">0.165147</td><td align="right">0.062173</td><td align="right">0.027075</td><td align="right">-4.846749</td><td align="right">1.803559</td><td align="right">1.565330</td><td align="right">-0.832687</td><td>-0.229963</td></tr><tr><td align="right">3</td><td align="right">3</td><td align="right">71865</td><td align="right">19960908</td><td align="right">109.0</td><td align="right">10</td><td align="right">0.0</td><td align="right">0.0</td><td align="right">1.0</td><td align="right">193</td><td align="right">15.0</td><td align="right">…</td><td align="right">0.274293</td><td align="right">0.110300</td><td align="right">0.121964</td><td align="right">0.033395</td><td align="right">0.000000</td><td align="right">-4.509599</td><td align="right">1.285940</td><td align="right">-0.501868</td><td align="right">-2.438353</td><td>-0.478699</td></tr><tr><td align="right">4</td><td align="right">4</td><td align="right">111080</td><td align="right">20120103</td><td align="right">110.0</td><td align="right">5</td><td align="right">1.0</td><td align="right">0.0</td><td align="right">0.0</td><td align="right">68</td><td align="right">5.0</td><td align="right">…</td><td align="right">0.228036</td><td align="right">0.073205</td><td align="right">0.091880</td><td align="right">0.078819</td><td align="right">0.121534</td><td align="right">-1.896240</td><td align="right">0.910783</td><td align="right">0.931110</td><td align="right">2.834518</td><td>1.923482</td></tr></tbody></table><p>5 rows × 31 columns</p><p>主要指标含义如下：</p><p><strong>train.csv</strong></p><ul><li>SaleID - 销售样本ID</li><li>name - 汽车编码</li><li>regDate - 汽车注册时间</li><li>model - 车型编码</li><li>brand - 品牌</li><li>bodyType - 车身类型</li><li>fuelType - 燃油类型</li><li>gearbox - 变速箱</li><li>power - 汽车功率</li><li>kilometer - 汽车行驶公里</li><li>notRepairedDamage - 汽车有尚未修复的损坏</li><li>regionCode - 看车地区编码</li><li>seller - 销售方</li><li>offerType - 报价类型</li><li>creatDate - 广告发布时间</li><li>price - 汽车价格</li><li>v_0’, ‘v_1’, ‘v_2’, ‘v_3’, ‘v_4’, ‘v_5’, ‘v_6’, ‘v_7’, ‘v_8’, ‘v_9’, ‘v_10’, ‘v_11’, ‘v_12’, ‘v_13’,’v_14’ 【匿名特征，包含v0-14在内15个匿名特征】 　</li></ul><p>数字全都脱敏处理，都为label encoding形式，即数字形式。</p><p>首先对数据进行常规解读：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">dftrain.info()</span><br><span class="line"><span class="comment"># 输出：</span></span><br><span class="line">&lt;<span class="class"><span class="keyword">class</span> &#x27;<span class="title">pandas</span>.<span class="title">core</span>.<span class="title">frame</span>.<span class="title">DataFrame</span>&#x27;&gt;</span></span><br><span class="line"><span class="class"><span class="title">RangeIndex</span>:</span> <span class="number">150000</span> entries, <span class="number">0</span> to <span class="number">149999</span></span><br><span class="line">Data columns (total <span class="number">31</span> columns):</span><br><span class="line">SaleID               <span class="number">150000</span> non-null int64</span><br><span class="line">name                 <span class="number">150000</span> non-null int64</span><br><span class="line">regDate              <span class="number">150000</span> non-null int64</span><br><span class="line">model                <span class="number">149999</span> non-null float64</span><br><span class="line">brand                <span class="number">150000</span> non-null int64</span><br><span class="line">bodyType             <span class="number">145494</span> non-null float64</span><br><span class="line">fuelType             <span class="number">141320</span> non-null float64</span><br><span class="line">gearbox              <span class="number">144019</span> non-null float64</span><br><span class="line">power                <span class="number">150000</span> non-null int64</span><br><span class="line">kilometer            <span class="number">150000</span> non-null float64</span><br><span class="line">notRepairedDamage    <span class="number">150000</span> non-null <span class="built_in">object</span></span><br><span class="line">regionCode           <span class="number">150000</span> non-null int64</span><br><span class="line">seller               <span class="number">150000</span> non-null int64</span><br><span class="line">offerType            <span class="number">150000</span> non-null int64</span><br><span class="line">creatDate            <span class="number">150000</span> non-null int64</span><br><span class="line">price                <span class="number">150000</span> non-null int64</span><br><span class="line">v_0                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_1                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_2                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_3                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_4                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_5                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_6                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_7                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_8                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_9                  <span class="number">150000</span> non-null float64</span><br><span class="line">v_10                 <span class="number">150000</span> non-null float64</span><br><span class="line">v_11                 <span class="number">150000</span> non-null float64</span><br><span class="line">v_12                 <span class="number">150000</span> non-null float64</span><br><span class="line">v_13                 <span class="number">150000</span> non-null float64</span><br><span class="line">v_14                 <span class="number">150000</span> non-null float64</span><br><span class="line">dtypes: float64(<span class="number">20</span>), int64(<span class="number">10</span>), <span class="built_in">object</span>(<span class="number">1</span>)</span><br><span class="line">memory usage: <span class="number">35.5</span>+ MB</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dftrain.describe().<span class="built_in">round</span>(<span class="number">2</span>)</span><br><span class="line"><span class="comment"># 输出</span></span><br></pre></td></tr></table></figure><table><thead><tr><th align="right"></th><th align="right">SaleID</th><th align="right">name</th><th align="right">regDate</th><th align="right">model</th><th align="right">brand</th><th align="right">bodyType</th><th align="right">fuelType</th><th align="right">gearbox</th><th align="right">power</th><th align="right">kilometer</th><th align="right">…</th><th align="right">v_5</th><th align="right">v_6</th><th align="right">v_7</th><th align="right">v_8</th><th align="right">v_9</th><th align="right">v_10</th><th align="right">v_11</th><th align="right">v_12</th><th align="right">v_13</th><th>v_14</th></tr></thead><tbody><tr><td align="right">count</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">149999.00</td><td align="right">150000.00</td><td align="right">145494.00</td><td align="right">141320.00</td><td align="right">144019.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">…</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td align="right">150000.00</td><td>150000.00</td></tr><tr><td align="right">mean</td><td align="right">74999.50</td><td align="right">68349.17</td><td align="right">20034170.51</td><td align="right">47.13</td><td align="right">8.05</td><td align="right">1.79</td><td align="right">0.38</td><td align="right">0.22</td><td align="right">119.32</td><td align="right">12.60</td><td align="right">…</td><td align="right">0.25</td><td align="right">0.04</td><td align="right">0.12</td><td align="right">0.06</td><td align="right">0.06</td><td align="right">-0.00</td><td align="right">0.01</td><td align="right">0.00</td><td align="right">0.00</td><td>-0.00</td></tr><tr><td align="right">std</td><td align="right">43301.41</td><td align="right">61103.88</td><td align="right">53649.88</td><td align="right">49.54</td><td align="right">7.86</td><td align="right">1.76</td><td align="right">0.55</td><td align="right">0.42</td><td align="right">177.17</td><td align="right">3.92</td><td align="right">…</td><td align="right">0.05</td><td align="right">0.05</td><td align="right">0.20</td><td align="right">0.03</td><td align="right">0.04</td><td align="right">3.77</td><td align="right">3.29</td><td align="right">2.52</td><td align="right">1.29</td><td>1.04</td></tr><tr><td align="right">min</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">19910001.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.50</td><td align="right">…</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">-9.17</td><td align="right">-5.56</td><td align="right">-9.64</td><td align="right">-4.15</td><td>-6.55</td></tr><tr><td align="right">25%</td><td align="right">37499.75</td><td align="right">11156.00</td><td align="right">19990912.00</td><td align="right">10.00</td><td align="right">1.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">75.00</td><td align="right">12.50</td><td align="right">…</td><td align="right">0.24</td><td align="right">0.00</td><td align="right">0.06</td><td align="right">0.04</td><td align="right">0.03</td><td align="right">-3.72</td><td align="right">-1.95</td><td align="right">-1.87</td><td align="right">-1.06</td><td>-0.44</td></tr><tr><td align="right">50%</td><td align="right">74999.50</td><td align="right">51638.00</td><td align="right">20030912.00</td><td align="right">30.00</td><td align="right">6.00</td><td align="right">1.00</td><td align="right">0.00</td><td align="right">0.00</td><td align="right">110.00</td><td align="right">15.00</td><td align="right">…</td><td align="right">0.26</td><td align="right">0.00</td><td align="right">0.10</td><td align="right">0.06</td><td align="right">0.06</td><td align="right">1.62</td><td align="right">-0.36</td><td align="right">-0.13</td><td align="right">-0.04</td><td>0.14</td></tr><tr><td align="right">75%</td><td align="right">112499.25</td><td align="right">118841.25</td><td align="right">20071109.00</td><td align="right">66.00</td><td align="right">13.00</td><td align="right">3.00</td><td align="right">1.00</td><td align="right">0.00</td><td align="right">150.00</td><td align="right">15.00</td><td align="right">…</td><td align="right">0.27</td><td align="right">0.10</td><td align="right">0.13</td><td align="right">0.08</td><td align="right">0.09</td><td align="right">2.84</td><td align="right">1.26</td><td align="right">1.78</td><td align="right">0.94</td><td>0.68</td></tr><tr><td align="right">max</td><td align="right">149999.00</td><td align="right">196812.00</td><td align="right">20151212.00</td><td align="right">247.00</td><td align="right">39.00</td><td align="right">7.00</td><td align="right">6.00</td><td align="right">1.00</td><td align="right">19312.00</td><td align="right">15.00</td><td align="right">…</td><td align="right">0.29</td><td align="right">0.15</td><td align="right">1.40</td><td align="right">0.16</td><td align="right">0.22</td><td align="right">12.36</td><td align="right">18.82</td><td align="right">13.85</td><td align="right">11.15</td><td>8.66</td></tr></tbody></table><p>8 rows × 30 columns</p><h2 id="三、基础参数"><a href="#三、基础参数" class="headerlink" title="三、基础参数"></a>三、基础参数</h2><p>参照这个GitHub地址总结的：<a href="https://github.com/rougier/matplotlib-cheatsheet">https://github.com/rougier/matplotlib-cheatsheet</a></p><p><img src="https://i.loli.net/2020/04/12/Ni7LJvBuIoWmeTD.png" alt="matplotlib-cheatsheet"></p><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>给出以上实例的jupyter notebook文件：</p><p><a href="/JupyterNotebook/matplotlib%E5%9F%BA%E7%A1%80.html">matplotlib基础.html</a> </p><p>给出matplotlib的预定义格式</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 可视化显示在页面，包含3种</span></span><br><span class="line"><span class="comment"># %matplotlib inline</span></span><br><span class="line"><span class="comment"># %matplotlib notebook</span></span><br><span class="line"><span class="comment"># %matplotlib qt5 </span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#%config InlineBackend.figure_format = &#x27;svg&#x27; #输出矢量图，放大不失真</span></span><br><span class="line"><span class="comment">#原始风格</span></span><br><span class="line"><span class="comment">#%config InlineBackend.figure_format=&#x27;retina&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 导入所有使用到的模块，并设定matplotlib的绘图基础格式</span></span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line">%matplotlib inline</span><br><span class="line"></span><br><span class="line"><span class="comment"># 统一绘图格式</span></span><br><span class="line">large = <span class="number">22</span>; med = <span class="number">16</span>; small = <span class="number">12</span> <span class="comment">#其余字体大小统一设置为14</span></span><br><span class="line">params = &#123;<span class="string">&#x27;axes.titlesize&#x27;</span>: large,</span><br><span class="line">          <span class="string">&#x27;legend.fontsize&#x27;</span>: med,</span><br><span class="line">          <span class="string">&#x27;figure.figsize&#x27;</span>: (<span class="number">15</span>, <span class="number">8</span>),</span><br><span class="line">          <span class="string">&#x27;axes.labelsize&#x27;</span>: med,</span><br><span class="line">          <span class="string">&#x27;axes.titlesize&#x27;</span>: med,</span><br><span class="line">          <span class="string">&#x27;xtick.labelsize&#x27;</span>: med,</span><br><span class="line">          <span class="string">&#x27;ytick.labelsize&#x27;</span>: med,</span><br><span class="line">          <span class="string">&#x27;figure.titlesize&#x27;</span>: large&#125;</span><br><span class="line">plt.rcParams.update(params)</span><br><span class="line">plt.style.use(<span class="string">&#x27;seaborn-whitegrid&#x27;</span>) <span class="comment">#更改模块风格</span></span><br><span class="line"></span><br><span class="line">plt.rcParams[<span class="string">&#x27;font.sans-serif&#x27;</span>]=[<span class="string">&#x27;SimHei&#x27;</span>] <span class="comment">#用来正常显示中文标签 plt.rcParam</span></span><br><span class="line">plt.rcParams[<span class="string">&#x27;axes.unicode_minus&#x27;</span>]=<span class="literal">False</span> <span class="comment">#用来正常显示负号</span></span><br><span class="line"><span class="comment"># plt.rcParams[&#x27;savefig.dpi&#x27;] = 300 #保存图片像素</span></span><br><span class="line"><span class="comment"># plt.rcParams[&#x27;figure.dpi&#x27;] = 300 #显示分辨率</span></span><br><span class="line"><span class="comment"># plt.rcParams[&#x27;animation.embed_limit&#x27; ] = 100 #限定animation模块的最大mb</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#百度 Echarts 里面的一组颜色卡</span></span><br><span class="line">r_hex = <span class="string">&#x27;#dc2624&#x27;</span>     <span class="comment"># red,       RGB = 220,38,36</span></span><br><span class="line">dt_hex = <span class="string">&#x27;#2b4750&#x27;</span>    <span class="comment"># dark teal, RGB = 43,71,80</span></span><br><span class="line">tl_hex = <span class="string">&#x27;#45a0a2&#x27;</span>    <span class="comment"># teal,      RGB = 69,160,162</span></span><br><span class="line">r1_hex = <span class="string">&#x27;#e87a59&#x27;</span>    <span class="comment"># red,       RGB = 232,122,89</span></span><br><span class="line">tl1_hex = <span class="string">&#x27;#7dcaa9&#x27;</span>   <span class="comment"># teal,      RGB = 125,202,169</span></span><br><span class="line">g_hex = <span class="string">&#x27;#649E7D&#x27;</span>     <span class="comment"># green,     RGB = 100,158,125</span></span><br><span class="line">o_hex = <span class="string">&#x27;#dc8018&#x27;</span>     <span class="comment"># orange,    RGB = 220,128,24</span></span><br><span class="line">tn_hex = <span class="string">&#x27;#C89F91&#x27;</span>    <span class="comment"># tan,       RGB = 200,159,145</span></span><br><span class="line">g50_hex = <span class="string">&#x27;#6c6d6c&#x27;</span>   <span class="comment"># grey-50,   RGB = 108,109,108</span></span><br><span class="line">bg_hex = <span class="string">&#x27;#4f6268&#x27;</span>    <span class="comment"># blue grey, RGB = 79,98,104</span></span><br><span class="line">g25_hex = <span class="string">&#x27;#c7cccf&#x27;</span>   <span class="comment"># grey-25,   RGB = 199,204,207</span></span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/04/12/Z6THxdV3sbquv5t.jpg" alt="1f271b23-5ee5-474c-a6cb-71072c907837"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 第二组色卡，从左往右</span></span><br><span class="line">zhong_gray = <span class="string">&#x27;#8C8EA1&#x27;</span> <span class="comment">#RGB=140，142，161 </span></span><br><span class="line">qian_gray = <span class="string">&#x27;#959EC3&#x27;</span> <span class="comment">#RGB=149，158，195 </span></span><br><span class="line">dan_gray =<span class="string">&#x27;#D9DBF5&#x27;</span> <span class="comment">#RGB=217，219，245 </span></span><br><span class="line">qian_blue = <span class="string">&#x27;#3B4F88&#x27;</span> <span class="comment">#RGB=59，79，136 </span></span><br><span class="line">shen_black = <span class="string">&#x27;#0A0D1E&#x27;</span> <span class="comment">#RGB=10，13，30 </span></span><br><span class="line">shen_gray = <span class="string">&#x27;#786B7A&#x27;</span> <span class="comment">#RGB=120，107，122 </span></span><br></pre></td></tr></table></figure><p><img src="https://i.loli.net/2020/04/12/OMFh2XPE4AsI6CW.jpg" alt="9a78b6da-5890-4bde-9450-ff68ab4fcde5"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;matplotlib制作可视化图表是python数据分析中的一个非常重要的模块，这个模块我之前一直没怎么使用过，这里重新练习下matplotlib模块的使用，数据源来自天池比赛中的二手车交易价格预测数据。&lt;/p&gt;</summary>
    
    
    
    <category term="python" scheme="https://blog.blublu.site/categories/python/"/>
    
    <category term="可视化" scheme="https://blog.blublu.site/categories/%E5%8F%AF%E8%A7%86%E5%8C%96/"/>
    
    
  </entry>
  
  <entry>
    <title>数据分析报告怎么写？</title>
    <link href="https://blog.blublu.site/2020/04/how-to-write-data-analysis-report/index.html"/>
    <id>https://blog.blublu.site/2020/04/how-to-write-data-analysis-report/index.html</id>
    <published>2020-04-12T06:58:22.000Z</published>
    <updated>2020-04-12T06:58:22.000Z</updated>
    
    <content type="html"><![CDATA[<p>最近太注重于工程实现，忽略了作为一个分析师最重要的职责：分析业务，so，在此重新整理下分析报告的写作逻辑，开始深入参与业务，分析业务。</p><span id="more"></span><h2 id="一、分析报告的目的"><a href="#一、分析报告的目的" class="headerlink" title="一、分析报告的目的"></a>一、分析报告的目的</h2><ul><li>解答业务问题</li><li>展示分析结果</li><li>验证分析质量</li><li>为决策提供参考依据</li></ul><p>简单来说，分析报告最后的结果一定只有2个，增加收益或者减少损失。</p><h2 id="二、分析报告类型"><a href="#二、分析报告类型" class="headerlink" title="二、分析报告类型"></a>二、分析报告类型</h2><ol><li><p>问题分析型：有明确的问题需要分析解答</p><p>要牢记：<strong>先问是不是，再问为什么</strong>。<strong>因为：脱离概率谈个案、脱离整体谈细节、脱离数据谈现状、脱离标准谈判断，统统都是耍流氓</strong></p></li><li><p>数据解读型：无明确问题，需要从常规数据中解读</p></li></ol><h2 id="三、数据分析报告的6个步骤"><a href="#三、数据分析报告的6个步骤" class="headerlink" title="三、数据分析报告的6个步骤"></a>三、数据分析报告的6个步骤</h2><p>目标确定、数据获取、数据清洗、数据整理、描述分析、洞察结论，撰写数据分析报告。</p><h2 id="四、分析报告的整体逻辑"><a href="#四、分析报告的整体逻辑" class="headerlink" title="四、分析报告的整体逻辑"></a>四、分析报告的整体逻辑</h2><p>S（Situation）情景——熟悉的情景、场景。</p><p>此处可以对业务场景进行描述，阐述，描述你要做这个数据分析目的、目标和期望对业务上有什么帮助。</p><p>C（Complication）冲突——实际情况往往和我们的要求有冲突。</p><p>对于分析的数据结果进行阐述，描述预测的数据情况</p><p>Q（Question）疑问——怎么办？</p><p>描述该种数据表现的状况对业务的影响，探究产生这样数据结果的原因</p><p>A（Answer）回答——解决方案</p><p>给出应对方案及下一步的业务调整计划及数据跟踪计划。。</p><h2 id="五、分析报告的核心"><a href="#五、分析报告的核心" class="headerlink" title="五、分析报告的核心"></a>五、分析报告的核心</h2><p>1.结构清晰，主次分明</p><p>2.每个分析都有结论，结论一定要明确</p><p>3.分析结论不要太多，要精</p><p>4.分析结论一定要基于紧密严禁的数据分析推导过程，要有论点、论据、论证过程</p><p>5.图表化、易读化，务必注明数据单位和特殊指标计算方法</p><p>6.讲故事的讲述过程</p><p>7.给出业务解决方案及跟踪计划</p><h2 id="六、思维导图格式"><a href="#六、思维导图格式" class="headerlink" title="六、思维导图格式"></a>六、思维导图格式</h2><ul><li>分析类型：问题分析or数据解读</li><li>问题or数据是什么</li><li>结论</li><li>数据来源</li><li>数据论证</li><li>结论</li><li>解决方案</li></ul><h2 id="七、分析报告的输出形式"><a href="#七、分析报告的输出形式" class="headerlink" title="七、分析报告的输出形式"></a>七、分析报告的输出形式</h2><p>思维导图</p><p>ppt</p><p>markdown</p><p>考虑到对思路的梳理，我比较倾向于使用markdown形式的文章来输出结论，这样稍微会显得有点啰嗦，但是思路上会比较连贯清洗。</p><p>你在跟谁沟通？</p><p>你希望受众了解哪些内容或者做什么？</p><p>如何用数据表达自己的观点？</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近太注重于工程实现，忽略了作为一个分析师最重要的职责：分析业务，so，在此重新整理下分析报告的写作逻辑，开始深入参与业务，分析业务。&lt;/p&gt;</summary>
    
    
    
    <category term="数据驱动" scheme="https://blog.blublu.site/categories/%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8/"/>
    
    
  </entry>
  
  <entry>
    <title>pandas基础操作笔记</title>
    <link href="https://blog.blublu.site/2020/04/pandas-basic-operation-notes/index.html"/>
    <id>https://blog.blublu.site/2020/04/pandas-basic-operation-notes/index.html</id>
    <published>2020-04-04T14:49:20.000Z</published>
    <updated>2020-06-13T15:26:20.000Z</updated>
    
    <content type="html"><![CDATA[<p>记录下常用的pandas的操作代码。</p><span id="more"></span><p>Jupyter Notebook环境配置：<a href="https://www.zhihu.com/question/40012144/answer/363009024">https://www.zhihu.com/question/40012144/answer/363009024</a></p><p>不推荐使用jupyter-themes，页面越改越丑，我只想改个里面的字体。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># python的pandas模块获取日期间隔</span></span><br><span class="line"><span class="keyword">import</span> pandas <span class="keyword">as</span> pd</span><br><span class="line">date_list = [d.strftime(<span class="string">&quot;%Y%m%d&quot;</span>) <span class="keyword">for</span> d <span class="keyword">in</span> pd.date_range(<span class="string">&#x27;2020-05-25&#x27;</span>, end=<span class="string">&#x27;2020-06-07&#x27;</span>, freq=<span class="string">&quot;d&quot;</span>)]</span><br><span class="line">date_list</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># pandas计算唯一值个数</span></span><br><span class="line">dferr.groupby(by=[<span class="string">&#x27;ds&#x27;</span>]).userid.nunique()</span><br><span class="line">dferr.pivot_table(index=[<span class="string">&#x27;ds&#x27;</span>],columns=[<span class="string">&#x27;user_level&#x27;</span>],values=[<span class="string">&#x27;userid&#x27;</span>],aggfunc=<span class="keyword">lambda</span> x:<span class="built_in">len</span>(x.unique()),margins=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># pandas按照百分比展示</span></span><br><span class="line">df2.div(df2.iloc[-<span class="number">1</span>,-<span class="number">1</span>],axis=<span class="number">0</span>).applymap(<span class="keyword">lambda</span> x:<span class="built_in">format</span>(x,<span class="string">&#x27;.1%&#x27;</span>))</span><br><span class="line">df3.div(df3.iloc[:,-<span class="number">1</span>],axis=<span class="number">0</span>).applymap(<span class="keyword">lambda</span> x:<span class="built_in">format</span>(x,<span class="string">&#x27;.1%&#x27;</span>))</span><br></pre></td></tr></table></figure><p><strong>Jupyter Notebook笔记</strong></p><ul><li><a href="/JupyterNotebook/1.%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%94%9F%E6%88%90%E5%92%8C%E6%A3%80%E6%9F%A5.html">1.数据表生成和检查.html</a> </li><li><a href="/JupyterNotebook/2.%E6%95%B0%E6%8D%AE%E8%A1%A8%E6%B8%85%E6%B4%97.html">2.数据表清洗.html</a> </li><li><a href="/JupyterNotebook/3.%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86.html">3.数据预处理.html</a> </li><li><a href="/JupyterNotebook/4.%E6%95%B0%E6%8D%AE%E6%8F%90%E5%8F%96.html">4.数据提取.html</a> </li><li><a href="/JupyterNotebook/5.%E6%95%B0%E6%8D%AE%E7%AD%9B%E9%80%89%E5%92%8C%E6%B1%87%E6%80%BB.html">5.数据筛选和汇总.html</a> </li><li><a href="/JupyterNotebook/6.%E6%95%B0%E6%8D%AE%E7%BB%9F%E8%AE%A1.html">6.数据统计.html</a> </li><li><a href="/JupyterNotebook/7.%E6%95%B0%E6%8D%AE%E9%80%8F%E8%A7%86%E8%A1%A8.html">7.数据透视表.html</a> </li></ul><p>最后再来个pandas官方出的速查图：</p><p>github地址：<a href="https://github.com/pandas-dev/pandas/blob/master/doc/cheatsheet/Pandas_Cheat_Sheet.pdf">Pandas_Cheat_Sheet</a></p><p><img src="https://img.blublu.site/pandas.png" alt="pandas官方速查"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;记录下常用的pandas的操作代码。&lt;/p&gt;</summary>
    
    
    
    <category term="python" scheme="https://blog.blublu.site/categories/python/"/>
    
    
  </entry>
  
</feed>
