{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "LEFT JOIN: blog on analytics, visualisation & data science, posts tagged: visualisation",
    "home_page_url": "https:\/\/en.leftjoin.ru\/tags\/visualisation\/",
    "feed_url": "https:\/\/en.leftjoin.ru\/tags\/visualisation\/json\/",
    "icon": "https:\/\/en.leftjoin.ru\/user\/userpic@2x.jpg",
    "author": {
        "name": "Nikolay Valiotti",
        "url": "https:\/\/en.leftjoin.ru\/",
        "avatar": "https:\/\/en.leftjoin.ru\/user\/userpic@2x.jpg"
    },
    "items": [
        {
            "id": "69",
            "url": "https:\/\/en.leftjoin.ru\/all\/bubble-charts-basics-area-vs-radius\/",
            "title": "Bubble charts basics: area vs radius",
            "content_html": "<p>Data visualization is a skill used in any industry where data is present, because tables are only good for storing information. When there is a need to present data, or rather certain conclusions derived from them, the data must be presented on graphs of a suitable type. So, here you are faced with two tasks: the first is to choose the right type of graph, the second is to display the results in a plausible way. Today we will tell you about one mistake that designers sometimes make when visualizing data on bubble-charts and how this mistake can be avoided.<\/p>\n<h2>The crux of building a bubble-chart<\/h2>\n<p>Firstly, let us tell you a bit of boring theory before we start analyzing the data. Bubble-chart is a convenient way to show three numerical variables without building a 3D model. The usual X and Y axes indicate the values ​​of two parameters, and the third is shown by the size of the circle that corresponds to each observation. This is what makes it possible to avoid the need to build a complex 3D chart, that is, anyone who sees a bubble-chart will be able to draw conclusions about the data much faster.<\/p>\n<h2>A mistake that a designer, but not a data analyst, can make<\/h2>\n<p>With the metrics that are displayed on the axes of the graph, no questions arise. This is the usual way of visualizing data, but with the data shown by the size of the circles there is some difficulty: how to correctly and accurately display changes in the values ​​of a variable, if the control is not a point on the axis, but the size of this point?<br \/>\nThe fact is that when building such a graph without using analytical tools, for example, in a graphics editor, the author can draw circles, taking the radius of the circle as its size. At first glance, everything seems to be absolutely correct – the larger the value of the variable, the larger the radius of the circle. However, in this case, the area of ​​the circle will increase not as a linear, but as a power function, because S = π × r2. For instance, the figure below shows that if you double the radius of a circle, the area will quadruple.<\/p>\n<p><details><br \/>\n<summary> <span style = \"color: # 7ea9b8\"> Draw a circle in Matplotlib <\/span> <\/summary><\/p>\n<pre class=\"e2-text-code\"><code>fig = plt.figure (figsize = (10, 10))\r\nax = fig.add_subplot (1, 1, 1)\r\ns = 4 * 10e3\r\n\r\n\r\nax.scatter (100, 100, s = s, c = 'r')\r\nax.scatter (100, 100, s = s \/ 4, c = 'b')\r\nax.scatter (100, 100, s = 10, c = 'g')\r\nplt.axvline (99, c = 'black')\r\nplt.axvline (101, c = 'black')\r\nplt.axvline (98, c = 'black')\r\nplt.axvline (102, c = 'black')\r\n\r\n\r\nax.set_xticks (np.arange (95, 106, 1))\r\nax.grid (alpha = 1)\r\n\r\nplt.show ()<\/code><\/pre><p><\/details><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/example.png\" width=\"720\" height=\"720\" alt=\"\" \/>\n<\/div>\n<p>This means that the graph will look implausible, because the dimensions will not reflect the real change in the variable, and the viewer pays attention and compares exactly the area of ​​the circles on the graph.<\/p>\n<h2>How to build such a graph correctly?<\/h2>\n<p>Fortunately, if you build bubble-charts using Python libraries (Matplotlib and Seaborn), then the size of the circle will be determined by the area, which is absolutely correct from in terms of visualization.<br \/>\nNow, using the example of real data found on Kaggle, we will show how to build a bubble-chart. The data contains the following variables: country, population size, percentage of literate population. For the chart to be readable, let’s take a subsample of the top 10 countries after sorting all the data in order of increasing GDP.<\/p>\n<p>First, let’s load all the necessary libraries:<\/p>\n<pre class=\"e2-text-code\"><code>import pandas as pd\r\nimport matplotlib.pyplot as plt\r\nimport seaborn as sns<\/code><\/pre><p>Then, load the data, clear it from all rows with missing values ​​and transform the population of countries to millions of people:<\/p>\n<pre class=\"e2-text-code\"><code>data = pd.read_csv ('countries of the world.csv', sep = ',')\r\ndata = data.dropna ()\r\ndata = data.sort_values ​​(by = 'Population', ascending = False)\r\ndata = data.head (10)\r\ndata ['Population'] = data ['Population']. apply (lambda x: x \/ 1000000)<\/code><\/pre><p>Now that all the preparations are complete, you can build a bubble-chart:<\/p>\n<pre class=\"e2-text-code\"><code>sns.set (style = &quot;darkgrid&quot;)\r\nfig, ax = plt.subplots (figsize = (10, 10))\r\ng = sns.scatterplot (data = data, x = &quot;Literacy (%)&quot;, y = &quot;GDP ($ per capita)&quot;, size = &quot;Population&quot;, sizes = (10,1500), alpha = 0.5)\r\nplt.xlabel (&quot;Literacy (Percentage of literate citizens)&quot;)\r\nplt.ylabel (&quot;GDP per Capita&quot;)\r\nplt.title ('Chart with bubbles as area', fontdict = {'fontsize': 'x-large'})\r\n\r\ndef label_point (x, y, val, ax):\r\n    a = pd.concat ({'x': x, 'y': y, 'val': val}, axis = 1)\r\n    for i, point in a.iterrows ():\r\n        ax.text (point ['x'], point ['y'] + 500, str (point ['val']))\r\n\r\nlabel_point (data ['Literacy (%)'], data ['GDP ($ per capita)'], data ['Country'], plt.gca ())\r\n\r\nax.legend (loc = 'upper left', fontsize = 'medium', title = 'Population (in mln)', title_fontsize = 'large', labelspacing = 1)\r\n\r\nplt.show ()<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/_32.png\" width=\"720\" height=\"720\" alt=\"\" \/>\n<\/div>\n<p>This graph displays three metrics in an understandable way: the level of GDP per capita on the Y axis, the percentage of the literate population on the X axis, and the population – by the area of ​​the circle.<\/p>\n<p>We recommend using size of the circle to show one of the variables, if there is a need to show 3 or more variables on one chart.<\/p>\n",
            "date_published": "2021-10-14T17:58:24+03:00",
            "date_modified": "2021-10-14T17:58:05+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/example.png",
            "_date_published_rfc2822": "Thu, 14 Oct 2021 17:58:24 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "69",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/example.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/_32.png"
                ]
            }
        },
        {
            "id": "39",
            "url": "https:\/\/en.leftjoin.ru\/all\/pandas-profiling-in-action\/",
            "title": "Pandas Profiling in action:  reviewing a new EDA library on Superstore Sales dataset",
            "content_html": "<p>Before moving directly to data analysis we need to understand what type of data we are going to work with. In today’s material, we will take a closer look at the SuperStore Sales dataset, specifically at the <i>Orders<\/i> column. It includes customer shopping data of a Canadian online supermarket, such as order, product and customer ids,  type of shipping, prices, product categories, names and etc. You can find more information about this dataset on <a href=\"https:\/\/github.com\/PacktPublishing\/Tableau-10-Best-Practices\/blob\/master\/Chapter%205\/Sample%20-%20Superstore%20Sales%20(Excel).xls\">GitHub<\/a>. After creating a pandas DataFrame we can simply  use the <span class=\"inline-code\">describe()<\/span> method to get a sense of our data.<\/p>\n<pre class=\"e2-text-code\"><code>import pandas as pd\r\n\r\ndf = pd.read_csv('superstore_sales_orders.csv', decimal=',')\r\ndf.describe(include='all')<\/code><\/pre><p>And oftentimes it leads to such a mess:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/1-15.png\" width=\"984\" height=\"427\" alt=\"\" \/>\n<\/div>\n<p class=\"note\">The source code of this library is available on <a href=\"https:\/\/github.com\/pandas-profiling\/pandas-profiling\">GitHub<\/a><\/p>\n<p>If we spend some time trying to get a grasp of this descriptive table,  we can find out that customers are more likely to choose “Regular air” as a shipping type or that the majority of orders were made from Ontario.  Nevertheless, there is a better tool to describe the dataset in more detail  – the pandas-profiling library.  Just pass a DataFrame to it and we will get a generated HTML page with a detailed description of our dataset:<\/p>\n<pre class=\"e2-text-code\"><code>import pandas_profiling\r\nprofile = pandas_profiling.ProfileReport(df)\r\nprofile.to_file(&quot;output.html&quot;)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2-15.png\" width=\"973\" height=\"621\" alt=\"\" \/>\n<\/div>\n<p>As you see, it returned a page with 6 sections, namely: overview, variables, interactions and correlations, number of missing values, and dataset samples.<\/p>\n<p class=\"note\">View a full version of the <a href=\"http:\/\/leftjoin.ru\/files\/superstore.html\">Pandas Profiling Report<\/a><\/p>\n<h2>Data overview<\/h2>\n<p>Let’s move to the first subsection called “Overview”.  Pandas Profiling provided the following stats: number of variables, number of observations, missing cells, duplicates, and file size. The  <span class=\"inline-code\">Variable types<\/span>  column shows that our DataFrame consists of 12 categorical and 9 numerical variables.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/3-14.png\" width=\"737\" height=\"356\" alt=\"\" \/>\n<\/div>\n<p>The  “Reproduction”  subsection stores technical information,  showing how long it took to analyze the dataset,  currently installed version , configuration info and etc.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/4-12.png\" width=\"725\" height=\"293\" alt=\"\" \/>\n<\/div>\n<p>The  “Warnings”  subsection informs about possible issues in the dataset structure. Now,  it warns us that the “Order Date” column has too many distinct values.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/5_5.png\" width=\"712\" height=\"485\" alt=\"\" \/>\n<\/div>\n<h2>Variables<\/h2>\n<p>Moving further, this subsection contains a detailed description of each variable, displaying the number of duplicates and missing values stored, memory size, maximum and minimal values. Right next to the stats you can see the distribution of column values.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/6_6.png\" width=\"722\" height=\"282\" alt=\"\" \/>\n<\/div>\n<p>Clicking on  <span class=\"inline-code\">Toggle details<\/span>  you will see more expanded information:  quartiles, median and other useful descriptive statistical indicators. The remaining tabs contain a histogram displayed on the main screen, top 10 frequent values and extremes.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/7_7.png\" width=\"737\" height=\"404\" alt=\"\" \/>\n<\/div>\n<h2>Interactions<\/h2>\n<p>This section displays how variables are interconnected on a hexbin plot: The graph looks not very obvious and clear, since the legend is lacking.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/8_8.png\" width=\"716\" height=\"548\" alt=\"\" \/>\n<\/div>\n<h2>Correlations<\/h2>\n<p>The section represents correlations between variables calculated in a variety of ways. For example, the first tab shows Pearson’s r-value. It is noticeable that <span class=\"inline-code\">Profit <\/span> is positively correlated with  <span class=\"inline-code\">Sales<\/span>.  You can get a detailed explanation to each coefficient by clicking on the <span class=\"inline-code\">Toggle correlation descriptions<\/span> button.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/9_9.png\" width=\"739\" height=\"554\" alt=\"\" \/>\n<\/div>\n<h2>Missing values<\/h2>\n<p>This section includes a bar chart, matrix, and dendrogram with the number of fields in each variable. For instance,  the  <span class=\"inline-code\">Product Base Margin<\/span>  column is missing three values.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/10_10.png\" width=\"739\" height=\"411\" alt=\"\" \/>\n<\/div>\n<h2>Samples<\/h2>\n<p>And the final section show the first and last 10 rows as chunks of a dataset, pretty similar to the  <span class=\"inline-code\">head()<\/span>  method in Pandas.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/11_11.png\" width=\"661\" height=\"469\" alt=\"\" \/>\n<\/div>\n<h2>Key Takeaways<\/h2>\n<p>The library is definitely more focused on statistics than Pandas, one can get useful descriptive stats for each variable and see their correlation.  It provides a comprehensive report on a dataset in a user-friendly way,  allowing to undertake an initial investigation and get a sense of data.<br \/>\nStill, the library has its shortfalls. If your dataset is fairly large the report generation time may be extended up to several hours. It’s a great tool for automating EDA tasks,  however, it can’t do all the work for you and some details may be overlooked. If you are just getting started with data analysis, we would highly recommend to start it with pandas. It will solidify your knowledge and boost confidence in working with data.<\/p>\n",
            "date_published": "2020-09-18T15:37:40+03:00",
            "date_modified": "2020-09-18T15:42:43+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/1-15.png",
            "_date_published_rfc2822": "Fri, 18 Sep 2020 15:37:40 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "39",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/1-15.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/2-15.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/3-14.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/4-12.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/5_5.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/6_6.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/7_7.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/8_8.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/9_9.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/10_10.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/11_11.png"
                ]
            }
        },
        {
            "id": "34",
            "url": "https:\/\/en.leftjoin.ru\/all\/building-an-interactive-waterfall-chart-in-python\/",
            "title": "Building an interactive waterfall chart in Python",
            "content_html": "<p>Back in 2014, we built a waterfall chart in Excel, widely known in the consulting world, for one of our presentations about the e-commerce market in Ulmart. It’s been a while and today we are going to draw one in Python and <a href=\"https:\/\/plotly.com\">the Plotly library<\/a>. This type of charts is oftentimes used to illustrate changes with the appearance of a new positive or negative factor. In the latter article about data visualization, we explained <a href=\"https:\/\/www.valiotti.com\/leftjoin\/all\/beautiful-bar-charts-with-python-and-matplotlib\/\">how to build a beautiful Bar Chart with bars that resemble thermometers<\/a>, it’s especially useful when we want to compare planned targets with actual values.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/ecommerce-wf@2x.png\" width=\"592.5\" height=\"440.5\" alt=\"\" \/>\n<\/div>\n<p>We are using the Ulmart data on the e-commerce market growth from 2013 to 2014. Data on the X-axis is chart captions,  on the Y-axis we displayed the initial and final values,  as well as their change. With the sum() function calculate the total and add it to the end of our list. The &lt;br&gt tag in the <span class=\"inline-code\">x_list<\/span>  shows a line break in text.<\/p>\n<pre class=\"e2-text-code\"><code>import plotly.graph_objects as go\r\n\r\nx_list = ['2013','The Russian &lt;br&gt;Macroeconomy', 'Decline in working age&lt;br&gt;population','Internet usage growth','Development of&lt;br&gt;cross-border trade', 'National companies', '2014']\r\ny_list = [738.5, 48.7, -7.4, 68.7, 99.7, 48.0]\r\ntotal = round(sum(y_list))\r\ny_list.append(total)<\/code><\/pre><p>Let’s create a list with column values, we called it  <span class=\"inline-code\">text_list<\/span>. The values will be taken from the <span class=\"inline-code\">y_list<\/span>,  but first we need to transform them. Convert all numerical values into strings and if it’s not the first or the last column, add a plus sign for clarity. In case it’s a positive change, the color will be green, otherwise red. Highlight the first and the last values with the &lt;b&gt tag;<\/p>\n<pre class=\"e2-text-code\"><code>text_list = []\r\nfor index, item in enumerate(y_list):\r\n    if item &gt; 0 and index != 0 and index != len(y_list) - 1:\r\n        text_list.append(f'+{str(y_list[index])}')\r\n    else:\r\n        text_list.append(str(y_list[index]))\r\nfor index, item in enumerate(text_list):\r\n    if item[0] == '+' and index != 0 and index != len(text_list) - 1:\r\n        text_list[index] = '&lt;span style=&quot;color:#2ca02c&quot;&gt;' + text_list[index] + '&lt;\/span&gt;'\r\n    elif item[0] == '-' and index != 0 and index != len(text_list) - 1:\r\n        text_list[index] = '&lt;span style=&quot;color:#d62728&quot;&gt;' + text_list[index] + '&lt;\/span&gt;'\r\n    if index == 0 or index == len(text_list) - 1:\r\n        text_list[index] = '&lt;b&gt;' + text_list[index] + '&lt;\/b&gt;'<\/code><\/pre><p>Let’s set parameters for the dashed lines we want to add. Create a list of dictionaries and fill it with light-gray dashed lines, passing the following:<\/p>\n<pre class=\"e2-text-code\"><code>dict_list = []\r\nfor i in range(0, 1200, 200):\r\n    dict_list.append(dict(\r\n            type=&quot;line&quot;,\r\n            line=dict(\r\n                 color=&quot;#666666&quot;,\r\n                 dash=&quot;dot&quot;\r\n            ),\r\n            x0=-0.5,\r\n            y0=i,\r\n            x1=6,\r\n            y1=i,\r\n            line_width=1,\r\n            layer=&quot;below&quot;))<\/code><\/pre><p>Now, create a graph object with the <span class=\"inline-code\">Waterfall()<\/span> method. Each column in our table can be of a certain type: <span class=\"inline-code\">total<\/span>, <span class=\"inline-code\">absolute<\/span> (both with final values) or <span class=\"inline-code\">relative<\/span> (holds intermediate values). Then we need to set colors, make the connecting line transparent, positive changes will be green, while negative ones are red, and the final columns are purple. Here we are using the Open Sans font.<\/p>\n<p class=\"note\">Learn more about how to choose the right fonts for your data visualization from this article:<a href=\"https:\/\/medium.com\/nightingale\/choosing-a-font-for-your-data-visualization-2ed37afea637\/\"> “Choosing Fonts for Your Data Visualization”<\/a><\/p>\n<pre class=\"e2-text-code\"><code>fig = go.Figure(go.Waterfall(\r\n    name = &quot;e-commerce&quot;, orientation = &quot;v&quot;,\r\n    measure = [&quot;absolute&quot;, &quot;relative&quot;, &quot;relative&quot;, &quot;relative&quot;, &quot;relative&quot;, &quot;relative&quot;, &quot;total&quot;],\r\n    x = x_list,\r\n    y = y_list,\r\n    text = text_list,\r\n    textposition = &quot;outside&quot;,\r\n    connector = {&quot;line&quot;:{&quot;color&quot;:'rgba(0,0,0,0)'}},\r\n    increasing = {&quot;marker&quot;:{&quot;color&quot;:&quot;#2ca02c&quot;}},\r\n    decreasing = {&quot;marker&quot;:{&quot;color&quot;:&quot;#d62728&quot;}},\r\n    totals={'marker':{&quot;color&quot;:&quot;#9467bd&quot;}},\r\n    textfont={&quot;family&quot;:&quot;Open Sans, light&quot;,\r\n              &quot;color&quot;:&quot;black&quot;\r\n             }\r\n))<\/code><\/pre><p>Finally, add the title with the description, hide the legend, set the Y label and add dashed lines to our chart.<\/p>\n<pre class=\"e2-text-code\"><code>fig.update_layout(\r\n    title = \r\n        {'text':'&lt;b&gt;Waterfall chart&lt;\/b&gt;&lt;br&gt;&lt;span style=&quot;color:#666666&quot;&gt;E-commerce market growth from 2013 to 2014&lt;\/span&gt;'},\r\n    showlegend = False,\r\n    height=650,\r\n    font={\r\n        'family':'Open Sans, light',\r\n        'color':'black',\r\n        'size':14\r\n    },\r\n    plot_bgcolor='rgba(0,0,0,0)',\r\n    yaxis_title=&quot;млрд руб.&quot;,\r\n    shapes=dict_list\r\n)\r\nfig.update_xaxes(tickangle=-45, tickfont=dict(family='Open Sans, light', color='black', size=14))\r\nfig.update_yaxes(tickangle=0, tickfont=dict(family='Open Sans, light', color='black', size=14))\r\n\r\nfig.show()<\/code><\/pre><p>And here it is:<\/p>\n<iframe id=\"igraph\" scrolling=\"no\" style=\"border:none;\" seamless=\"seamless\" src=\"https:\/\/chart-studio.plotly.com\/~i-bond\/1.embed?showlink=false\" height=\"650\" width=\"100%\"><\/iframe>\n",
            "date_published": "2020-06-24T15:53:26+03:00",
            "date_modified": "2020-06-26T06:40:33+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/ecommerce-wf@2x.png",
            "_date_published_rfc2822": "Wed, 24 Jun 2020 15:53:26 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "34",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/ecommerce-wf@2x.png"
                ]
            }
        },
        {
            "id": "28",
            "url": "https:\/\/en.leftjoin.ru\/all\/beautiful-bar-charts-with-python-and-matplotlib\/",
            "title": "Beautiful Bar Charts with Python and Matplotlib",
            "content_html": "<p>The Matplotlib library provides a wide range of tools for Data Visualisation, allowing us to create compelling, expressive visualizations. But why then so many plots look so bland and boring? Back in 2011 we built a simple yet decent diagram for a telecommunication company report and named it ‘Thermometer’. Later this type of bars was exposed to a wide audience on  <a href=\"https:\/\/chandoo.org\">Chandoo<\/a>, which was a popular blog on Excel. By the way, here’s what it looks like:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/1.jpg\" width=\"1296\" height=\"586\" alt=\"\" \/>\n<\/div>\n<p>Times change, and today we’ll recall the way to plot this type of diagrams with the help of <span class=\"inline-code\">Matplotlib<\/span><\/p>\n<p><b>When should one use this type of diagram?<\/b><br \/>\nThe best way to plot this type of diagrams is when comparing target values with actual values because it reflects underfulfilment and overfulfilment of planned targets. A diagram may reflect data in percentages as well as in real figures. Let’s view an example using the latter.<\/p>\n<p>We’ll use data stored in an excel file and already familiar python libraries for data analysis:<\/p>\n<pre class=\"e2-text-code\"><code>import numpy as np\r\nimport pandas as pd\r\nimport matplotlib.pyplot as plt<\/code><\/pre><p>Read our file as a DataFrame:<\/p>\n<pre class=\"e2-text-code\"><code>df = pd.read_excel('data.xlsx')<\/code><\/pre><p>That’s what it looks like:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/1-5.png\" width=\"350\" height=\"386\" alt=\"\" \/>\n<\/div>\n<p>Now, we need to extract columns from the table. The first column called «Sales» will be displayed under each bar. Some values may be of a <span class=\"inline-code\">string type <\/span> if there is a comma between two values. We need to convert these type of values by replacing a comma with a dot and converting them to <span class=\"inline-code\">floats<\/span>.<\/p>\n<pre class=\"e2-text-code\"><code>xticks = df.iloc[:,0]\r\ntry:\r\n    bars2 = df.iloc[:,1].str.replace(',','.').astype('float')\r\nexcept AttributeError:\r\n    bars2 = df.iloc[:,1].astype('float')\r\ntry:\r\n    bars1 = df.iloc[:,2].str.replace(',','.').astype('float')\r\nexcept AttributeError:\r\n    bars1 = df.iloc[:,2].astype('float')<\/code><\/pre><p>As we don’t know for sure if the table includes such values, our actions may cause an  <span class=\"inline-code\">AttributeError<\/span> . Fortunatelly for us, Python has a built-in <span class=\"inline-code\">try – except<\/span><br \/>\nmethod for handling such errors.<\/p>\n<p>Let’s plot a simple side-by-side bar graph, setting a distance between two related values using a <span class=\"inline-code\">NumPy array<\/span>:<\/p>\n<pre class=\"e2-text-code\"><code>barWidth = 0.2\r\nr1 = np.arange(len(bars1))\r\nr2 = [x + barWidth for x in r1]\r\n \r\nplt.bar(r1, bars1, width=barWidth)\r\nplt.bar(r2, bars2, width=barWidth)<\/code><\/pre><p>And see what happens:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2-5.png\" width=\"1007\" height=\"293\" alt=\"\" \/>\n<\/div>\n<p>Obviously, this is not what we expected. Let’s try to set a different bar width to make bars overlapping each other.<\/p>\n<pre class=\"e2-text-code\"><code>barWidth1 = 0.065\r\nbarWidth2 = 0.032\r\nx_range = np.arange(len(bars1) \/ 8, step=0.125)<\/code><\/pre><p>We can plot the bars and set its coordinates, color, width, legend and signatures  in advance:<\/p>\n<pre class=\"e2-text-code\"><code>plt.bar(x_range, bars1, color='#dce6f2', width=barWidth1\/2, edgecolor='#c3d5e8', label='Target')\r\nplt.bar(x_range, bars2, color='#ffc001', width=barWidth2\/2, edgecolor='#c3d5e8', label='Actual Value')\r\nfor i, bar in enumerate(bars2):\r\n    plt.text(i \/ 8 - 0.015, bar + 1, bar, fontsize=14)<\/code><\/pre><div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/3-6.png\" width=\"1435\" height=\"411\" alt=\"\" \/>\n<\/div>\n<p>Add some final touches – remove the frames, ticks,  add a grey line under the bars, adjust font size and layout, make a plot a bit wider and save it as a .png file.<\/p>\n<pre class=\"e2-text-code\"><code>plt.xticks(x_range, xticks)\r\nplt.tick_params(\r\n    bottom=False,\r\n    left=False,\r\n    labelsize=15\r\n)\r\nplt.rcParams['figure.figsize'] = [25, 7]\r\nplt.axhline(y=0, color='gray')\r\nplt.legend(frameon=False, loc='lower center', bbox_to_anchor=(0.25, -0.3, 0.5, 0.5), prop={'size':20})\r\nplt.box(False)\r\nplt.savefig('plt', bbox_inches = &quot;tight&quot;)\r\nplt.show()<\/code><\/pre><p>And here’s the final result:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/4-5.png\" width=\"1444\" height=\"499\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2020-05-28T07:12:41+03:00",
            "date_modified": "2020-05-28T07:14:10+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/1.jpg",
            "_date_published_rfc2822": "Thu, 28 May 2020 07:12:41 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "28",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/1.jpg",
                    "https:\/\/en.leftjoin.ru\/pictures\/1-5.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/2-5.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/3-6.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/4-5.png"
                ]
            }
        },
        {
            "id": "22",
            "url": "https:\/\/en.leftjoin.ru\/all\/cohort-analysis-in-redash\/",
            "title": "Cohort analysis in Redash",
            "content_html": "<p>In one of the previous articles we have reviewed <a href=\"all\/retention-rate\/\">building of Retention-report<\/a> and have partially addressed the concept of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cohort_analysis\">cohorts<\/a> therein.<br \/>\nCohort usually implies group of users of a product or a company. Most often, groups are allocated on the basis of time of app installation \/ appearance of a user in a system.<br \/>\nIt turns out, that, using cohort analysis, one can track down how the changes in a product affected the behaviour of users (for example, of old and new users).<\/p>\n<p>Along with that, cohorts can be defined also proceeding from other parameters: geography of a user, traffic source, device platform and other important parameters of your product.<\/p>\n<p>We will figure out, how to compare Retention of users of weekly cohorts in Redash, since Redash has special type of visualization for building such type of report.<br \/>\nFirstly, let’s sort out SQL-query. We still have two tables – <i>user<\/i> (id of a user and time of app installation) and <i>client_session<\/i> – timestamps (<i>created_at<\/i>) of activity of each user (<i>user_id<\/i>). Let’s consider the Retention of the first seven days for last 60 days.<br \/>\nThe query is written in Cloudera Impala, let’s review it.<\/p>\n<p>For starters, let’s build the total size of cohorts:<\/p>\n<pre class=\"e2-text-code\"><code>select trunc(from_unixtime(user.installed_at), &quot;WW&quot;) AS cohort_week, \r\n\tndv(distinct user.id) as cohort_size \/\/counting the number of users in the cohort\r\n\tfrom user \r\n\twhere from_unixtime(user.installed_at) between date_add(now(), -60) and now() \/\/taking registered users for last 60 days\r\ngroup by trunc(from_unixtime(user.installed_at), &quot;WW&quot;)<\/code><\/pre><p>The second part of the query can calculate the quantity of active users for every day during the first thirty days:<\/p>\n<pre class=\"e2-text-code\"><code>select trunc(from_unixtime(user.installed_at), &quot;WW&quot;) AS cohort_week, \r\n        datediff(cast(cs.created_at as timestamp),cast(user.installed_at as timestamp)) as days,\r\n\tndv(distinct user.id) as value  \/\/counting the number of active users for every day\r\n\t\tfrom user \r\n\t\tleft join client_session cs on user.id=cs.user_id\r\nwhere from_unixtime(user.installed_at) between date_add(now(), -60) and now()\r\nand from_unixtime(cs.created_at) &gt;= date_add(now(), -60) \/\/taking sessions for last 60 days\r\nand datediff(cast(cs.created_at as timestamp),cast(user.installed_at as timestamp)) between 0 and 30 \/\/cutting off only the first 30 days of activity\r\ngroup by 1,2<\/code><\/pre><p>Bottom line, all the query entirely:<\/p>\n<pre class=\"e2-text-code\"><code>select size.cohort_week, size.cohort_size, ret.days, ret.value from\r\n(select trunc(from_unixtime(user.installed_at), &quot;WW&quot;) AS cohort_week, \r\n\t\tndv(distinct user.id) as cohort_size \r\n\tfrom user \r\n\twhere from_unixtime(user.installed_at) between date_add(now(), -60) and now()\r\ngroup by trunc(from_unixtime(user.installed_at), &quot;WW&quot;)) size\r\nleft join (select trunc(from_unixtime(user.installed_at), &quot;WW&quot;) AS cohort_week, \r\n        datediff(cast(cs.created_at as timestamp),cast(user.installed_at as timestamp)) as days,\r\n\t\tndv(distinct user.id) as value \r\n\t\tfrom user \r\n\t\tleft join client_session cs on user.id=cs.user_id\r\nwhere from_unixtime(user.installed_at) between date_add(now(), -60) and now()\r\nand from_unixtime(cs.created_at) &gt;= date_add(now(), -60)\r\nand datediff(cast(cs.created_at as timestamp),cast(user.installed_at as timestamp)) between 0 and 30\r\ngroup by 1,2) ret on size.cohort_week=ret.cohort_week<\/code><\/pre><p>Great, now correctly calculated data is available to us.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/cohort-data@2x.png\" width=\"326\" height=\"180\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Data of cohorts in tabular form<\/div>\n<\/div>\n<p>Let’s create new visualization in Redash and indicate the parameters correctly:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/cohort-viz@2x.png\" width=\"589\" height=\"471\" alt=\"\" \/>\n<div class=\"e2-text-caption\">It’s important to indicate the parameters correctly – the columns of the resulting query are compliant therewith.<\/div>\n<\/div>\n<p>Let’s make sure to indicate that we have weekly cohorts:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/cohort-options@2x.png\" width=\"580\" height=\"187\" alt=\"\" \/>\n<\/div>\n<p>Voila, our visualization of cohorts is ready:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/cohort-graph@2x.png\" width=\"807\" height=\"366\" alt=\"\" \/>\n<div class=\"e2-text-caption\">You can add filters and parameters to it and use in a dashboard<\/div>\n<\/div>\n<p>Materials on the topic<\/p>\n<ul>\n<li><a href=\"https:\/\/gopractice.ru\/cohort_analysis\/\">Cohort analysis. Metrics of product vs metrics of growth<\/a><\/li>\n<li><a href=\"https:\/\/medium.com\/analytics-for-humans\/a-beginners-guide-to-cohort-analysis-the-most-actionable-and-underrated-report-on-google-c0797d826bf4\">A beginners guide to cohort analysis<\/a><\/li>\n<\/ul>\n",
            "date_published": "2020-03-03T14:17:54+03:00",
            "date_modified": "2020-05-12T11:19:55+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/cohort-data@2x.png",
            "_date_published_rfc2822": "Tue, 03 Mar 2020 14:17:54 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "22",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/cohort-data@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/cohort-viz@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/cohort-options@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/cohort-graph@2x.png"
                ]
            }
        },
        {
            "id": "17",
            "url": "https:\/\/en.leftjoin.ru\/all\/updates-in-redash-v8\/",
            "title": "Updates in Redash v8",
            "content_html": "<p>Two weeks ago the <a href=\"https:\/\/discuss.redash.io\/t\/final-release-of-redash-v8\/4803\">final release of Redash edition 8<\/a> took place. The complete list of improvements can be found on the <a href=\"https:\/\/discuss.redash.io\/t\/v8-beta-is-here\/4532\">page of beta version of v8 release<\/a>.<\/p>\n<p>In my overview of the novelties, I will focus my attention only on those, that have the most significant impact on user’s experience of Redash utilization, i.e. that are more illustrative for you and me:<\/p>\n<ul>\n<li>Support for multi-select in dropdown (and query dropdown) parameters.<\/li>\n<li>Support for dynamic values in date and date-range parameters.<\/li>\n<li>Search dropdown parameter values.<\/li>\n<li>Pivot Table: support hiding totals.<\/li>\n<li>New Visualization: Details View.<\/li>\n<\/ul>\n<h2>Support for multi-select in dropdown (and query dropdown) parameters.<\/h2>\n<p>In the 8th version of Redash we finally receive the long-awaited support of selection of several values in a parameter such as “dropdown list” or “dropdown list on the basis of the query”:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/dropdown-multiple@2x.png\" width=\"497\" height=\"306\" alt=\"\" \/>\n<\/div>\n<p>When we select several different clues, the above-mentioned values transform into a list, divided by a comma. At that, there is an opportunity to wrap the values of such a list into single quotes or double quotes.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"434\" data-ratio=\"3.8407079646018\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/multiple-quotation@2x.png\" width=\"434\" height=\"113\" alt=\"\" \/>\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/single-double-quotation@2x.png\" width=\"476\" height=\"143\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>For us it means an opportunity to use requirements of IN type with a parameter in the queries:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/select-in@2x.png\" width=\"573\" height=\"215\" alt=\"\" \/>\n<\/div>\n<p>At application of such parameter values, we will receive the following URL in the line of the browser:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/url-parameter@2x.png\" width=\"383\" height=\"33\" alt=\"\" \/>\n<\/div>\n<h2>Support for dynamic values in date and date-range parameters.<\/h2>\n<p>Extremely handy and useful feature for selection of dates, that is often used in Tableau, however hadn’t been implemented into Redash until recently: utilization of dynamic values for dates:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/dynamic-dates@2x.png\" width=\"785\" height=\"414\" alt=\"\" \/>\n<\/div>\n<p>Pressing the zipper button, you can select a random period, and Redash will insert the required values into the query on its own. Thus, for instance, you can quickly look through the statistics for last week or last month.<\/p>\n<h2>Search dropdown parameter values.<\/h2>\n<p>Let’s assume that we are using a parameter of a type “dropdown list on the basis of the query”, and in the query selected there are more than 300 resulting lines, based on which we need to find a value of our interest. In the 8th version this problem is solved by auto-complete and search by parameter values. In the example below I am inserting a line “<i>Orga<\/i>” and obtain all the values, in which this line is met, very convenient.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/search-autocomplete-v8@2x.png\" width=\"450\" height=\"270\" alt=\"\" \/>\n<\/div>\n<h2>Pivot Table: support hiding totals.<\/h2>\n<p>Quite long-awaited feature, that allows to aggregate outcomes by rows \/ columns.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/totals@2x.png\" width=\"260\" height=\"286\" alt=\"\" \/>\n<\/div>\n<h2>New Visualization: Details View<\/h2>\n<p>New presentation of data results: view of details by each line. I assume, it can be convenient at use in a dashboard, when you apply filtration by a specific user \/ partner.<br \/>\nIt visualizes the names of columns and results of a specific line in a table form.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/details-view@2x.png\" width=\"490\" height=\"251\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2019-11-25T16:03:18+03:00",
            "date_modified": "2020-05-13T14:20:32+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/dropdown-multiple@2x.png",
            "_date_published_rfc2822": "Mon, 25 Nov 2019 16:03:18 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "17",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/dropdown-multiple@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/multiple-quotation@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/single-double-quotation@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/select-in@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/url-parameter@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/dynamic-dates@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/search-autocomplete-v8@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/totals@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/details-view@2x.png"
                ]
            }
        },
        {
            "id": "13",
            "url": "https:\/\/en.leftjoin.ru\/all\/excel-chart-matrix-bcg\/",
            "title": "Diagram of BCG (Boston Consulting Group) Matrix",
            "content_html": "<p>I will water down the blog with an interesting report, that was developed for Yota company on November, 2011. <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D0%91%D0%9A%D0%93\">BCG Matrix<\/a> has inspired us to develop this report.<\/p>\n<p>We had: one Excel package, 75 VBA macro, ODBC connection to Oracle, SQL queries to databases of all sorts and colours. We will review report construction within this stack, but first, let’s speak about the very idea of the report.<\/p>\n<p>BCG Matrix – is 2x2 matrix, whereon the clients’ segments are displayed by circumferences with their centres in the intersection of coordinates, formed by the relevant paces of two indicators selected.<\/p>\n<p>To make it simple, we had to divide all the clients of the company into 4 segments: ARPU above average\/below average, traffic consumption (main service) above average\/below average. Thus, it turned out that 4 quadrants appear, and you need to place a bubble chart into each one of them, whereas the size of a bubble means the total amount of users within a segment. In addition to that, one more bubble was added to each quadrant (smaller one), that showcased the churn in each segment (author’s improvement).<\/p>\n<p><b>What did we want to get at the output?<\/b><br \/>\nA chart of the following type:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/bubbles-chart@2x.png\" width=\"1039\" height=\"681\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Representation of the BCG matrix on the data of Yota company<\/div>\n<\/div>\n<p>The task statement is more or less clear, let’s move to the realization.<br \/>\nLet’s assume, that we’ve already collected all the required data (meaning that, we’ve learned to identify the average ARPU and average traffic consumption, in this post we won’t examine SQL-query), then the paramount task lies in understanding how to display the bubbles in the required places by means of Excel tools.<\/p>\n<p>For this aim, a bubble chart comes to help:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/viz-type@2x.png\" width=\"252\" height=\"345\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><i>Insert – Chart – Bubble<\/i><\/div>\n<\/div>\n<p>Going to the menu <i>Selection of data source<\/i> and evaluating, what is required in order to build a chart in the type that we need: coordinates <i>X<\/i>, coordinates <i>Y<\/i>, values of bubbles’ sizes.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/data-source@2x.png\" width=\"518\" height=\"529\" alt=\"\" \/>\n<\/div>\n<p>Great, so it turns out that if we assume that our chart will be located in coordinates on the <i>X<\/i> axis from -1 to 1, and on the <i>Y<\/i> axis from -1 to 1, then the centre of the right upper bubble will be the spot (0.5; 0.5) on the chart. Likewise, we’ll place all the other bubbles.<\/p>\n<p>We should separately consider the bubbles of <i>Churn<\/i> type (for displaying of the churn), they are located more to the right then the main bubble and might intersect with it, therefore we will place the right upper bubble to empirically obtained coordinates (0.65; 0.35).<\/p>\n<p>Thus, for four main and four additional bubbles, we can organize the data as follows:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/bubbles-data@2x.png\" width=\"562\" height=\"97\" alt=\"\" \/>\n<\/div>\n<p>Let’s review more thoroughly how we’ll use them:<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"535\" data-ratio=\"0.9006734006734\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/data-source-active@2x.png\" width=\"535\" height=\"594\" alt=\"\" \/>\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/data-source-churn@2x.png\" width=\"534\" height=\"591\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>So, we set on X-axis – horizontal coordinates of the centres of our bubbles, that lie in the cells <i>A9:A12<\/i>, on Y-axis – vertical coordinates of the centres of our bubbles, that lie in the cells <i>B9:B12<\/i>, and the sizes of the bubbles are stored in the cells <i>E9:E12<\/i>.<br \/>\nFurthermore, we add another data set for the Churn, once more indicating all the required parameters.<\/p>\n<p>We’ll get the following chart:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/bubbles-preparing@2x.png\" width=\"503\" height=\"423\" alt=\"\" \/>\n<\/div>\n<p>Then, we’re making it pretty: changing colours, deleting axis and getting a beautiful result.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/bubbles-preparing-step2@2x.png\" width=\"568\" height=\"458\" alt=\"\" \/>\n<\/div>\n<p>By adding the required data labels, we receive what we initially needed in the task.<\/p>\n<p>Share your experience in comments – did you build such charts and how you solved the task?<\/p>\n",
            "date_published": "2019-11-19T10:38:11+03:00",
            "date_modified": "2020-05-12T11:24:25+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/bubbles-chart@2x.png",
            "_date_published_rfc2822": "Tue, 19 Nov 2019 10:38:11 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "13",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/bubbles-chart@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/viz-type@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/data-source@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/bubbles-data@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/data-source-active@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/data-source-churn@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/bubbles-preparing@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/bubbles-preparing-step2@2x.png"
                ]
            }
        },
        {
            "id": "12",
            "url": "https:\/\/en.leftjoin.ru\/all\/retention-rate\/",
            "title": "How to calculate Retention?",
            "content_html": "<p>In this post we will discover, how to properly construct a report on Retention with application of <a href=\"all\/redash-full-fledged-on-demand-analytics\/\">Redash<\/a> and SQL language.<br \/>\nFor starters, let’s explain in a nutshell what the metric <b>Retention rate<\/b> is, why it is important,<\/p>\n<h2>Retention rate<\/h2>\n<p><b>Retention rate<\/b> metric is widespread and is particularly popular within the mobile industry, since it allows to understand how well a product engages the users into daily use. Let’s recall (or discover), how <b>Retention<\/b> is calculated:<\/p>\n<p>Retention of day <i>X<\/i> – is <i>N%<\/i> of users that will return to the product on day <i>X<\/i>. In other words, if on some specific day (day 0) 100 new users came, and 15 returned on the first day, then Retention of the 1st day will be equal to 15\/100=15%.<br \/>\nMost commonly, Retention of days 1, 3, 7 and 30 are singled out as the most descriptive metrics of a product, however it’s useful to address Retention curve as a whole and make conclusions, proceeding from it.<\/p>\n<h2>Retention curve<\/h2>\n<p>In the end, we are interested in construction of such curve, that shows the retention of users from day 0 to day 30.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/Retention@2x.png\" width=\"585\" height=\"200\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Retention rate curve from day 0 do day 30<\/div>\n<\/div>\n<h2>Rolling Retention (RR)<\/h2>\n<p>Besides classic Retention rate, Rolling Retention (hereinafter, RR) is allocated. At calculation of RR, apart from day X, all the subsequent days are also considered. Thus, RR of the 1st day – the amount of users who returned on the 1st and subsequent days.<\/p>\n<p>Let’s compare Retention and Rolling Retention of the 10th day:<br \/>\n<b>Retention<sub>10<\/sub><\/b> — the amount of users, who returned on the 10th day \/ the amount of users, who installed the app 10 days ago * 100%.<br \/>\n<b>Rolling Retention<sub>10<\/sub><\/b> — the amount of users, who returned on the 10th day <i>or later<\/i> \/ the amount of users, who installed the app 10 days ago * 100%.<\/p>\n<h2>Granularity (retention of time periods)<\/h2>\n<p>In some industries and respective tasks, it is useful to understand the Retention of a specific day (most often, in the mobile industry), in other cases it is useful to understand the retention of users on various time intervals: for example, weekly or monthly periods (oftentimes, it’s handy in e-commerce, retail).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/Monthly-Retention@2x.png\" width=\"669\" height=\"527\" alt=\"\" \/>\n<div class=\"e2-text-caption\">An example of cohorts by months and monthly Retention respective thereto<\/div>\n<\/div>\n<h2>How to build a Retention report on SQL language?<\/h2>\n<p>We have sorted out above how to calculate Retention in formulas. Now let’s apply it with SQL language.<br \/>\nLet’s assume, that we have two tables: <i>user<\/i> — storing data about users’ identifiers and meta-information, <i>client_session<\/i> — information on visits of the mobile app by users.<br \/>\nOnly these two tables will be present in the query, so you can easily adapt the query to yourself.<br \/>\n<i>note<\/i>: within this code, I am using Impala as DBMS.<\/p>\n<h3>Collecting the size of cohorts<\/h3>\n<pre class=\"e2-text-code\"><code>SELECT from_unixtime(user.installed_at, &quot;yyyy-MM-dd&quot;) AS reg_date,\r\n          ndv(user.id) AS users\r\n   FROM USER\r\n   WHERE from_unixtime(user.installed_at)&gt;=date_add(now(), -60)\r\n     AND from_unixtime(user.installed_at)&lt;=date_add(now(), -31)\r\n   GROUP BY 1<\/code><\/pre><p>Let’s sort out this pretty simple query: for every day we calculate the number of unique users for the period [60 days ago; 31 days ago].<br \/>\nIn order not to mess with documentation: command <i>ndv()<\/i> in Impala is analogue of a command <i>count(distinct)<\/i>.<\/p>\n<h3>Calculating the number of returned users on each cohort<\/h3>\n<pre class=\"e2-text-code\"><code>SELECT from_unixtime(user.installed_at, &quot;yyyy-MM-dd&quot;) AS reg_date,\r\n          datediff(cast(cs.created_at AS TIMESTAMP), cast(installed_at AS TIMESTAMP)) AS date_diff,\r\n          ndv(user.id) AS ret_base\r\n   FROM USER\r\n   LEFT JOIN client_session cs ON cs.user_id=user.id\r\n   WHERE 1=1\r\n     AND datediff(cast(cs.created_at AS TIMESTAMP), cast(installed_at AS TIMESTAMP)) between 0 and 30\r\n     AND from_unixtime(user.installed_at)&gt;=date_add(now(), -60)\r\n     AND from_unixtime(user.installed_at)&lt;=date_add(now(), -31)\r\n   GROUP BY 1, 2<\/code><\/pre><p>In this query, the key part is contained in the command <i>datediff<\/i>: now we are calculating for each cohort and for each <i>datediff<\/i> the number of unique users with the very same command <i>ndv()<\/i> (practically, the number of users, who returned within the days from 0 to 30).<\/p>\n<p>Great, now we have the size of cohorts and the number of returned users.<\/p>\n<h3>Combining all together<\/h3>\n<pre class=\"e2-text-code\"><code>SELECT reg.reg_date AS date_registration,\r\n       reg.users AS cohort_size,\r\n       cohort.date_diff AS day_difference,\r\n       cohort.ret_base AS retention_base,\r\n       cohort.ret_base\/reg.users AS retention_rate\r\nFROM\r\n  (SELECT from_unixtime(user.installed_at, &quot;yyyy-MM-dd&quot;) AS reg_date,\r\n          ndv(user.id) AS users\r\n   FROM USER\r\n   WHERE from_unixtime(user.installed_at)&gt;=date_add(now(), -60)\r\n     AND from_unixtime(user.installed_at)&lt;=date_add(now(), -31)\r\n   GROUP BY 1) reg\r\nLEFT JOIN\r\n  (SELECT from_unixtime(user.installed_at, &quot;yyyy-MM-dd&quot;) AS reg_date,\r\n          datediff(cast(cs.created_at AS TIMESTAMP), cast(installed_at AS TIMESTAMP)) AS date_diff,\r\n          ndv(user.id) AS ret_base\r\n   FROM USER\r\n   LEFT JOIN client_session cs ON cs.user_id=user.id\r\n   WHERE 1=1\r\n     AND datediff(cast(cs.created_at AS TIMESTAMP), cast(installed_at AS TIMESTAMP)) between 0 and 30\r\n     AND from_unixtime(user.installed_at)&gt;=date_add(now(), -60)\r\n     AND from_unixtime(user.installed_at)&lt;=date_add(now(), -31)\r\n   GROUP BY 1, 2) cohort ON reg.reg_date=cohort.reg_date\r\n    ORDER BY 1,3<\/code><\/pre><p>We have received the query, that calculates <b>Retention<\/b> for each cohort, and, eventually, the result can be displayed as follows:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/Cohort-retention@2x.png\" width=\"585\" height=\"200\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Retention rate, calculated for each cohort of users<\/div>\n<\/div>\n<h3>Construction of the sole Retention curve<\/h3>\n<p>Let’s modify our query a bit and obtain the data for construction of one Retention curve:<\/p>\n<pre class=\"e2-text-code\"><code>SELECT \r\n       cohort.date_diff AS day_difference,\r\n       avg(reg.users) AS cohort_size,\r\n       avg(cohort.ret_base) AS retention_base,\r\n       avg(cohort.ret_base)\/avg(reg.users)*100 AS retention_rate\r\nFROM\r\n  (SELECT from_unixtime(user.installed_at, &quot;yyyy-MM-dd&quot;) AS reg_date,\r\n          ndv(user.id) AS users\r\n   FROM USER\r\n   WHERE from_unixtime(user.installed_at)&gt;=date_add(now(), -60)\r\n     AND from_unixtime(user.installed_at)&lt;=date_add(now(), -31)\r\n   GROUP BY 1) reg\r\nLEFT JOIN\r\n  (SELECT from_unixtime(user.installed_at, &quot;yyyy-MM-dd&quot;) AS reg_date,\r\n          datediff(cast(cs.created_at AS TIMESTAMP), cast(installed_at AS TIMESTAMP)) AS date_diff,\r\n          ndv(user.id) AS ret_base\r\n   FROM USER\r\n   LEFT JOIN client_session cs ON cs.user_id=user.id\r\n   WHERE 1=1\r\n     AND datediff(cast(cs.created_at AS TIMESTAMP), cast(installed_at AS TIMESTAMP)) between 0 and 30\r\n     AND from_unixtime(user.installed_at)&gt;=date_add(now(), -60)\r\n     AND from_unixtime(user.installed_at)&lt;=date_add(now(), -31)\r\n   GROUP BY 1,2) cohort ON reg.reg_date=cohort.reg_date\r\n    GROUP BY 1        \r\n    ORDER BY 1<\/code><\/pre><p>Now, we have average by all the cohorts <b>Retention rate<\/b>, calculated for each day.<\/p>\n<h2>More on the subject<\/h2>\n<ul>\n<li><a href=\"https:\/\/gopractice.ru\/retention\/\">How to create products, forming habits?<\/a><\/li>\n<li><a href=\"https:\/\/www.braze.com\/blog\/calculate-retention-rate\/\">Top 3 Ways To Calculate User Retention Rate With Formulas<\/a><\/li>\n<\/ul>\n",
            "date_published": "2019-11-03T16:27:55+03:00",
            "date_modified": "2020-05-13T14:20:47+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/Retention@2x.png",
            "_date_published_rfc2822": "Sun, 03 Nov 2019 16:27:55 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "12",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/Retention@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/Monthly-Retention@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/Cohort-retention@2x.png"
                ]
            }
        },
        {
            "id": "8",
            "url": "https:\/\/en.leftjoin.ru\/all\/yandex-datalens-review\/",
            "title": "Overview of Yandex DataLens",
            "content_html": "<p>Let’s take our minds off of the project on receipt data collection for a while. We will speak about the project’s following steps a bit later.<\/p>\n<p>Today we’ll be discussing a new service from <a href=\"https:\/\/datalens.yandex.ru\">Yandex – DataLens<\/a> (the access to demo was kindly provided to me by my great friend <a href=\"https:\/\/fevlake.com\/\">Vasiliy Ozerov <\/a> and the team <a href=\"https:\/\/fevlake.com\">Fevlake <\/a> \/ <a href=\"http:\/\/rebrainme.com\">Rebrain<\/a>). Currently, the service is in <i>Preview<\/i> mode and is, in essence, a cloud BI. The main shtick of the service is that it can easily and handy work with clickhouse (<a href=\"https:\/\/tech.yandex.ru\/clickhouse\/\">Yandex Clickhouse<\/a>).<\/p>\n<h2>Connection of data sources<\/h2>\n<p>Let’s review the major things: connection of a data source and dataset setting.<br \/>\nThe selection of DBMS is not vast, nevertheless some main things are present. For the purpose of our testing, let’s take MySQL.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-11-17@2x.png\" width=\"1001\" height=\"713\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Selection of data sources DataLens<\/div>\n<\/div>\n<p>On the basis of the connection created, it is suggested to create a dataset:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-13-52@2x.png\" width=\"1032\" height=\"698\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Interface of dataset settings, definition of measurements and metrics<\/div>\n<\/div>\n<p>On this stage it’s defined which table’s attributes are becoming measurements, and which are turning into metrics. You can choose data aggregation type for the metrics.<br \/>\nUnfortunately, I didn’t manage to discover how it’s possible to state several interconnected tables (for example, attach a handbook for measurements) instead of a single table. Perhaps, on this stage developers suggest us to solve this issue by creating of required view.<\/p>\n<h2>Data visualization<\/h2>\n<p>Regarding the interface itself – everything is pretty easy and handy. It reminds of a cloud version of Tableau. If comparing to Redash, which is most frequently used in conjunction with Clickhouse, the opportunities of visualization are simply staggering.<br \/>\nEven pivot tables, in which one can use Measure Names as columns’ names are worth something:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-17-35@2x.png\" width=\"854\" height=\"423\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Setting of pivot tables in DataLens<\/div>\n<\/div>\n<p>Obviously, there is an opportunity to make also basic charts in DataLens from Yandex:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-18-15@2x.png\" width=\"1168\" height=\"679\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Construction of a linear chart in DataLens<\/div>\n<\/div>\n<p>There are also area charts:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-20-27@2x.png\" width=\"1165\" height=\"669\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Construction of an area chart in DataLens<\/div>\n<\/div>\n<p>However, I didn’t manage to find out how data classification by months \/ quarters \/ weeks is carried out. According to an example of data, available in the demo version, developers are still solving this issue by creating additional attributes (DayMonth, DayWeek, etc).<\/p>\n<h2>Dashboards<\/h2>\n<p>For now, interface of dashboard blocks’ creation looks bulky, and interface windows are not always comprehensive. Here is, for instance, a window, allowing to state a parameter:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-22-46@2x.png\" width=\"1177\" height=\"615\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Not really apparent setting window for dashboard parameters<\/div>\n<\/div>\n<p>However, in the gallery of examples we can see highly functional and convenient dashboards with selectors, tabs and parameters:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-25-19@2x.png\" width=\"1280\" height=\"691\" alt=\"\" \/>\n<div class=\"e2-text-caption\">An example of a working dashboard with parameters and tabs in DataLens<\/div>\n<\/div>\n<p>Looking forward to fixing of interface shortcomings, improving of Datalens and preparing to use it together with Clickhouse!<\/p>\n",
            "date_published": "2019-04-08T11:42:38+03:00",
            "date_modified": "2020-05-13T14:22:57+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-11-17@2x.png",
            "_date_published_rfc2822": "Mon, 08 Apr 2019 11:42:38 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "8",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-11-17@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-13-52@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-17-35@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-18-15@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-20-27@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-22-46@2x.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/2019-04-08_11-25-19@2x.png"
                ]
            }
        },
        {
            "id": "7",
            "url": "https:\/\/en.leftjoin.ru\/all\/stroim-funnel-report-v-redash\/",
            "title": "Building a funnel-report in redash",
            "content_html": "<p>So, we’ve been planning to review Funnel-visualization of a report in Redash.<br \/>\nFirst and foremost, let’s build a request <a href=\"https:\/\/www.valiotti.com\/leftjoin\/all\/how-to-connect-google-analytics-to-redash\/\">to the data source that we’ve created<\/a> – Google Analytics.<\/p>\n<p>The following text needs to be placed in the request console:<\/p>\n<pre class=\"e2-text-code\"><code>{\r\n    &quot;ids&quot;: &quot;ga:128886640&quot;,\r\n    &quot;start_date&quot;: &quot;30daysAgo&quot;,\r\n    &quot;end_date&quot;: &quot;yesterday&quot;,\r\n    &quot;metrics&quot;: &quot;ga:users,ga:goal1Completions,ga:goal2Completions,ga:goal3Completions&quot;\r\n}<\/code><\/pre><p>In this request we are asking API Google Analytics to provide data for the last 30 days on the account GA: 128886640. We want to see the number of users and the number of completion of goals 1, 2 and 3.<\/p>\n<p>As a result, our table will look as follows:<\/p>\n<div class=\"e2-text-table\">\n<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n<tr>\n<td><b>ga:users<\/b><\/td>\n<td><b>ga:goal1Completions<\/b><\/td>\n<td><b>ga:goal2Completions<\/b><\/td>\n<td><b>ga:goal3Completions<\/b><\/td>\n<\/tr>\n<tr>\n<td>3,926<\/td>\n<td>105<\/td>\n<td>41<\/td>\n<td>32<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>Great, that’s right what we need in order to build a funnel.<br \/>\nNow I will tell you about one very useful Redash feature: <i>query-results<\/i>. In order to connect tables with results of queries’ execution, we go to <i>Data Sources<\/i> and search for <i>query-results (beta)<\/i>. Connecting new data source.<br \/>\nNow we have an opportunity to refer to results of Redash queries. Thus, for instance, we can use the results of a requests to Google Analytics API.<\/p>\n<p><b>How to do it?<\/b><br \/>\nWe need to choose a data source query-results on the left:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/query-results.png\" width=\"350\" height=\"78\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Drop down menu with selection of data sources (in the console – on the left)<\/div>\n<\/div>\n<p>Now we’ll learn to make funnel-visualization. For this purpose, we write the following SQL-query:<\/p>\n<pre class=\"e2-text-code\"><code>select 'Add a good to the shopping cart' as step_name, ga_goal1Completions as goalCompletion from query_8\r\nunion all\r\nselect 'View the shopping cart' as step_name, ga_goal2Completions from query_8\r\nunion all\r\nselect 'Order processing' as step_name, ga_goal3Completions from query_8<\/code><\/pre><p>In this case <i>query_8<\/i> – is the very table with results of request to the data source Google Analytics.<\/p>\n<p>Let’s set visualization:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/visualisation.png\" width=\"600\" height=\"513\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Carefully selecting parameters, in order to achieve the desired result<\/div>\n<\/div>\n<p>As a result, we receive the funnel of conversions from one goal to another:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/en.leftjoin.ru\/pictures\/funnel.png\" width=\"600\" height=\"152\" alt=\"\" \/>\n<div class=\"e2-text-caption\">You can display this funnel in the dashboard and add filters \/ parameters thereto.<\/div>\n<\/div>\n",
            "date_published": "2018-12-04T14:36:00+03:00",
            "date_modified": "2020-05-13T14:23:11+03:00",
            "image": "https:\/\/en.leftjoin.ru\/pictures\/query-results.png",
            "_date_published_rfc2822": "Tue, 04 Dec 2018 14:36:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "7",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css",
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/en.leftjoin.ru\/pictures\/query-results.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/visualisation.png",
                    "https:\/\/en.leftjoin.ru\/pictures\/funnel.png"
                ]
            }
        }
    ],
    "_e2_version": 3386,
    "_e2_ua_string": "E2 (v3386; Aegea)"
}