Working capital breakdown

We complement the previous section's working capital analysis with a closer look at the elements that make up each measure. In the case of DSI, we analyze Average Inventory Value and Annual Cost of Goods Sold (COGS). This auxiliary analysis helps us understand whether an increasing DSI is the result of rising inventory levels or decreasing sales. It also helps us detect which product is not rotating frequently enough.

Note

As a warehouse manager, I want to know which items spend the most time in the warehouse and whether this is because there is too much stock or too few sales. This information will help me reduce the amount of unnecessary stock and free up available cash.

Let's combine the related metrics and have them share the same dimension axis, as in the following visualization:

Working capital breakdown

Exercise 5.5

  1. Let's create three separate combo charts. We represent the current period with bars and the last period with circles. In each chart, we set the orientation to be horizontal, and move the legend to the top. When we use Ctrl + Shift to place the legend on top, we wait until its red outline covers the entire top section so that the labels appear in a row:

    Title

    DSI

    Dimensions

    Labels

    Value

    Item

    Item

    Expressions

    Labels

    Value

    Current

    avg({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>}aggr( sum({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>} [Inventory Balance]),[Year-Month],Item))/sum({$<[AsOf Months Ago]={">0<=12"}>} [Cost])*365

    Past

    This is the same as the Current DSI but replace [AsOf Months Ago]={">0<=12"} with [AsOf Months Ago]={">12<=24"}

    Title

    Average Inventory Value

    Dimensions

    Labels

    Value

    Item

    Item

    Expressions

    Labels

    Value

    Current

    avg({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>}aggr( sum({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>} [Inventory Balance]),[Year-Month],Item))

    Past

    This is the same as the Current Inventory Value but replace [AsOf Months Ago]={">0<=12"} with [AsOf Months Ago]={">12<=24"}

    Title

    COGS

    Dimensions

    Labels

    Value

    Item

    Item

    Expressions

    Labels

    Value

    Current

    sum({$<[AsOf Months Ago]={">0<=12"}>} [Cost])

    Past

    This is the same as the Current COGS but replace [AsOf Months Ago]={">0<=12"} with [AsOf Months Ago]={">12<=24"}

    Create a container object and, in the Presentation tab, select Container Type as Grid. Set Columns to 3 and Rows to 1.

  2. Drag each chart into the container object.
  3. In the Sort tab of each chart, enable only Expression and select Descending. Insert the following code into the expression field:
    avg({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>}aggr( sum({$<_Periodicity={'Monthly'},[AsOf Months 
    Ago]={">0<=12"}>} [Inventory Balance]),[Year-Month],Item))/sum({$<[AsOf Months Ago]={">0<=12"}>} [Cost])*365
  4. We cannot scroll through the three charts at the same time, so, in the Dimension Limits tab of each chart, let's select the option to Restrict which values are displayed using the first expression.
  5. In the same tab and under the Show Only option, we change the value to First.
  6. In the Presentation tab, disable the option to Suppress Zero-Values.
  7. Finally, after verifying that each row of bars corresponds to the same item, let's remove the dimension labels in the second and third charts by deselecting the Show Legend option in the Dimensions tab.

Instead of using a common scroll bar, we repeatedly click on the bar that represents Others in order to scroll through the charts and review more items. When we analyze all three measures in a single view, it becomes clear that the DSI of most of the items is increasing and that this increase is due to both an increase in the inventory value and a decrease in COGS.

After breaking down each working capital element and analyzing its parts, the next step is to analyze more closely the operations that cause these results. Let's continue to explore the inventory data in more detail and compare each product's inventory levels with their corresponding minimum, reorder, and maximum levels.

Inventory stock levels

The business defines each product's minimum, reorder, and maximum stock levels so as to maintain an adequate quantity in inventory. We often calculate these numbers and insert them into an ERP system that automatically generates purchase orders or work orders every time an item reaches the reorder stock limit In QlikView, we can use sales and purchase cycle data to easily calculate each limit and compare it to historical inventory behavior. We use the following formulas to calculate each stock level:

Note

As a purchasing team manager, I want to dynamically calculate stock limits so that I can be sure to have just the right amount of stock according to historical sales trends.

Reorder Stock Level = Max Lead Time * Max Daily Sales

Minimum Stock Level = Reorder Stock Level – (Avg Lead Time * Avg Daily Sales)

Maximum Stock Level = Reorder Stock Level – (Min Lead Time * Min Daily Sales) + Reorder Quantity

We use a predefined lead time, or the time needed to restock an item, from the item master data table. We review, how to dynamically calculate the lead time in Chapter 6, Operations Perspective. We also assume that the minimum daily sales amount of any item is 0 and that the reorder quantity is equal to the reorder stock level. Given these assumptions the maximum stock level is the reorder stock level multiplied by two.

Like much of the information at a glance. We therefore use the following trellis chart to compare each item's historical inventory behavior with the calculated stock levels.

Inventory stock levels

Exercise 5.6

Let's create a line chart with the following dimensions and expressions:

Dimensions

Labels

Value

Item

Item

Year-Month

Year-Month

Expressions

Labels

Value

Actual Stock

sum({$<_Periodicity={'Monthly'}>} [Inventory Balance Quantity]) 

Reorder Stock Level

max(Total <Item> {$<$(vSetRolling12Modifier)>}aggr(sum(Quantity),_KEY_Date, Item))*max([Item Lead Time]) 

Min Stock Level

[Reorder Stock Level]-sum({$<$(vSetRolling12Modifier)>} 
   Total <Item> 
Quantity) 
/ 
networkdays(
    addmonths(max(Total _KEY_Date),-12)
    ,max(Total _KEY_Date)
)*avg([Item Lead Time]) 

Max Stock Level

2*[Reorder Stock Level] 

  1. In the Dimensions tab, click Trellis… and tick the Enable Trellis Chart option.
  2. Set Number of Columns to Fixed and 2. Set Number of Rows to Fixed and 2.
  3. In the Expressions tab, change the Line Style properties of Reorder Stock Level, Min Stock Level, and Max Stock Level to a thin, dotted line. For example, use '<S2><W.5>'.
  4. In the Sort tab, select the option to sort by Y-value.

The set analysis variable in the previous expression is from Rob Wunderlich's QlikView Component's library and allows us to determine the stock levels based on twelve months of sales data. The actual twelve-month period we use depends on the date that we select in QlikView. In the particular case of Min Stock Level, we use the networkdays() function to calculate the average daily sales by working days. We also have the option to calculate the maximum and minimum daily sales using more advanced methods. For example, we can experiment with the fractile() function and use 5% or 95% fractiles to remove outliers. We can also use the same t-distribution functions that we used in Chapter 2, Sales Perspective, to calculate a more conservative daily sales average.

Finally, let's create a customer aging report that helps us monitor the operations that impact DSO.

Aging report

If we are to lower DSO, we need to make sure that customers pay on time. We monitor collections using a customer aging report. The following report shows the customers' total balances and categorizes it into bins based on the original due date of the each payment. As we're mostly interested in the past due payments, it groups these amounts into thirty-day period bins.

Note

As the collections team manager, I want to quickly recognize which customers are the most delinquent and which have the largest debt so that I can follow up with these customers.

The same report structure can be used to monitor suppliers in order to maintain a healthy DPO:

Aging report

Exercise 5.7

Let's create a pivot table with the following dimensions and expressions:

Dimensions

Labels

Value

Customer

Customer

Status

[A/R Invoice Days Overdue Bin]

Expressions

 

Labels

Value

A/R Balance

sum({$<_Periodicity={'Monthly'}>} [A/R Invoice Balance])

<space>

sum({$<_Periodicity={'Monthly'}>} [A/R Invoice Balance])

<space>

=''

  1. Select the second expression and select Linear Gauge in Display Options.
  2. Click Gauge Setting and define the Min in the Gauge Settings section as 0 and Max as the following expression:
    sum({$<_Periodicity={'Monthly'}>} [A/R Invoice Balance])
  3. In the Segments Setup section, delete Segment 2 and change the color of Segment 1 to blue.
  4. In the Indicator section, select Mode Fill to Value.
  5. Disable the Show Scale option.
  6. Enable the Hide Segment Boundaries and Hide Gauge Outlines options.
  7. In the Sort tab, select Status and only enable Numeric Value.
  8. In the Presentation tab, enable the option to Show Partial Sums for both dimensions and enable the option to show Subtotals on Top.
  9. Pivot the table as shown in the previous figure.

The creation of the [A/R Invoice Days Overdue Bin] field in the script makes this report easy to create. In the script, we subtract the invoice due date by the date of the data snapshot and then use several nested if-statements to assign that result to a bin. As this field is relative to each snapshot's date and not today's date, we can analyze the aging report over time. The field is also a dual() data type where Current is 0, 0-30 is 1, 31-60 is 2, and so on. This feature allows us to sort the field more easily by selecting only Numeric Value option in the Sort tab.

How well a customer pays us, or their DSO is an important indicator of how important that customer is to our business. Let's continue the customer stratification exercise that we started in Chapter 2, Sales Perspective, and see how we use DSO to evaluate a customer's importance.

Customer stratification

In Chapter 2, Sales Perspective, we had the following user story:

Note

As a sales representative, I want to see who my most important customers are so that I can focus my time and effort on them.

A customer's importance is determined by a mixture of measures. In the sales perspective, we started to determine a customer's importance using a Pareto analysis over sales. The following diagram shows the results of a customer stratification based on sales:

Customer stratification

We can use Pareto analysis to stratify all measurements whose total is the sum of its parts, such as gross profit and quantity. However, there is another set of customer metrics whose total is an average of its parts. For example, the total company DSO is a weighted average of the DSO of each customer. In this case, we use quartiles to stratify customers.

Finally, once we have more than one measurement that stratifies customers, we look at how to combine them both numerically and visually. Even though we discuss customer stratification, the same principles apply to stratification based on any other dimension, such as item, sales representative, or supplier. The only difference between these is the exact measurements that we use to stratify them.

Stratification by distribution

When the measurement that we want use to stratify customers is based on averages, we use the distribution of the averages to classify them. As we use four letters to stratify customers in the example, we group them by quartiles. Each quartile will contain the same—or nearly the same—number of customers.

Let's create the following chart in the next exercise to see how quartiles group customers by DSO:

Stratification by distribution

Exercise 5.8

Let's create a bar chart with the following property options:

Dimensions

Label

Value

Customer

Customer

Expressions

Label

Value

DSO

avg({$<_Periodicity={'Monthly'}
          ,[AsOf Months Ago]={">0<=12"}>}aggr( sum({$<_Periodicity={'Monthly'}
                    ,[AsOf Months Ago]={">0<=12"}>}
                 [A/R Invoice Balance]),[Year-Month],[Customer]))/sum({$<[AsOf Months Ago]={">0<=12"}>} [Net Sales])*
365

  1. In the Presentation tab, add the first reference line. This represents the first quartile and uses the following expression:
    fractile(aggr(avg({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>}aggr( sum({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>} [A/R Invoice Balance]),[Year-Month],Customer))/sum({$<[AsOf Months Ago]={">0<=12"}>} [Net Sales])*365,Customer),.25) 
  2. Add three more reference lines for the second, third, and fourth quartile. For each quartile, We use the same expression as in the previous step and change the second parameter in the fractile function from .25 to .5, .75, and 1, respectively.

We make slight changes to the aggr() function in the expression we used to calculate DSO in Exercise 5.2. calculated total DSO by year-month, We replace [AsOf Year-Month] with [Customer] as this is the dimension we use this chart. We also go as far as to use a second aggr() function to calculate each fractile as the fractile() function only works over a set of numbers. This second aggr() function creates a list that contains the DSO of every customer for the fractile() function.

Stratification by distribution divides the customers into nearly equal-sized bins. The bar belongs to the nearest quartile reference line above it. According to the previous chart, Divanoodle, Fanoodle, and Skipfire are in the first quartile. Every other quartile has two customers. As the best customers have a low DSO, we classify customers in the first quartile as A, in the second quartile as B, in the third quartile as C, and in the fourth quartile as D.

Let's add DSO to the customer stratification we started in the sales perspective:

Exercise 5.8

Exercise 5.9

  1. Let's create the following variables:

    Variable

    Label

    Value

    vExp_DSOCustomer

    avg({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>}aggr( sum({$<_Periodicity={'Monthly'},[AsOf Months Ago]={">0<=12"}>} [A/R Invoice Balance]),[Year-Month],Customer))/sum({$<[AsOf Months Ago]={">0<=12"}>} [Net Sales])*365 

    vExp_DSOCustomerStratificationBoundaries

    fractile(Totalaggr($(vExp_DSOCustomer),Customer),$1) 

  2. In the working capital perspective, let's create the same customer stratification table that we created in the sales perspective (Exercise 2.3).
  3. Let's add the following expressions to the previously created customer stratification table:

    Expressions

    Label

    Value

    DSO

    $(vExp_DSOCustomer)

    DSO Class

    if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.25)),'A',if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.5)),'B',if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.75)),'C','D'
    ))) 

    Total Weighted

    match([Sales Class],'D','C','B','A') * .6+match([DSO Class],'D','C','B','A') * .4 

    Total Class

    pick(round([Total Weighted]),'D','C','B','A') 

  4. Change the background color of the DSO Class expression to the following expression:
    if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.25)),blue(100),if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.5)),blue(75),if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.75)),blue(50),blue(25))))
  5. Change the background color of the Total Class expression to the following expression.
    pick(round([Total Weighted]),blue(25),blue(50),blue(75),blue(100)) 

We create the vExp_DSOcustomerStratification variable with a $1 parameter so that we can calculate different factiles using only one variable. In general, when we encounter several expression variables whose only difference is a number, we reduce them to one variable and add a parameter.

The Total Weighted stratification is calculated by first converting the letters A, B, C, and D of each individually stratified metric into the numbers 1, 2, 3, and 4, respectively. In this example, We use the match() function to efficiently turn the letters into numbers. We then multiple each number by a factor that allows us define how important each metric is to the final customer stratification. Other than the fact that the sum of the factors should be equal to one, they are completely arbitrary and depend on the business's strategy. For example, as we want to put more emphasis on the sales stratification, we multiply it by .6 and the DSO stratification by .4.

As the sum of factors is equal to one, the sum of the all the weighted stratifications is between one and four which makes it possible for us to convert it back to a letter format. In this example, we use the pick() function in Total Class to convert a rounded Total Weight back into letters. In this way, we can combine multiple customer stratifications into one. For many business users, such as sale representatives, this can help them more easily determine a customer's importance according to the business's strategy. Finally, we introduce a way to visualize how individual customer measures influence how they are classified.

Visualizing stratification

We can use a native scatterplot to compare two measures used for stratification. For example, we create the following chart using the expressions we use in the customer stratification table. The legend at the top is a group of eight text objects—one for each dot and letter:

Visualizing stratification

The scatterplot helps us identify whether each classification describes a tight group of closely-related customers or a disparate group of loners. It also helps describe the characteristics of an ideal customer. Although scatterplots appear to be too simple for complex stratifications that use more than two variables, it has the advantage of being easy to read. For most business users, we can add two cyclical expressions to a scatterplot and give them the power to compare any two of a potentially large group of customer stratification metrics. For the more experienced analysts, we can also create a more involved visualization called a scatterplot matrix.

The following figure shows a scatterplot matrix that compares three variables: Sales, DSO, and Gross Profit:

Visualizing stratification

Exercise 5.10

  1. Download and install the scatterplot matrix from Qlik Branch (http://branch.qlik.com/#/project/56d99a0a20d00edd11554ea9).
  2. Add a third stratification metric based on gross profit. Use the example of the sales stratification in Chapter 2, Sales Perspective, in Exercise 2.3 to create the gross profit stratification that is based on a Pareto.
  3. Add the following variables:

    Variable

    Label

    Value

    vExp_DSOCustomerStratification

    if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.25)),'A',if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.5)),'B',if($(vExp_DSOCustomer) < $(vExp_DSOCustomerStratificationBoundaries(.75)),'C','D'))) 

    vExp_SalesCustomerStratification

    if(len(only({A_CustomerSales} Customer)) <> 0, 'A',if(len(only({AB_CustomerSales} Customer)) <> 0, 'B',if(len(only({ABC_CustomerSales} Customer)) <> 0, 'C',if(len(only({$} Customer)) <> 0,'D'))))

    vExp_GrossProfitCustomerStratification

    if(len(only({A_CustomerGrossProfit} Customer)) <> 0, 'A',if(len(only({AB_CustomerGrossProfit} Customer)) <> 0, 'B',if(len(only({ABC_CustomerGrossProfit} Customer)) <> 0, 'C',if(len(only({$} Customer)) <> 0,'D'))))

    In the Web View, add a New Sheet Object called Scatterplot Matrix:

    Dimensions

    Label

    Value

    Customer

    Customer

    Customer Classification

    =aggr(
     pick(
      round(
       match($(vExp_SalesCustomerStratification),'D','C', 'B','A') * .35
       +
       match($(vExp_DSOCustomerStratification),'D','C','B','A') * .3
       +
       match($(vExp_GrossProfitCustomerStratification),'D','C','B','A') * .35
    )
    ,'D'
    ,'C'
    ,'B'
    ,'A'
    )
    ,Customer)

    Expressions

    Label

    Value

    Rolling 12-month net sales

    =sum({$<$(vSetRolling12Modifier),_ActualFlag={1}>} [Net Sales]) 

    DSO

    $(vExp_DSOCustomer) 

    Rolling 12-month gross profit

    =sum({$<$(vSetRolling12Modifier),_ActualFlag={1}>} [Gross Profit])  

Multivariate analysis leads to complex data visualization. The scatterplot matrix serves as a tool for more advanced analysts who want a rough idea of correlations and clustering between multiple variables at a glance. For example, we can observe that there is a stronger relationship between gross profit and sales than there is between DSO and either of these two metrics.

In the same way we use DSO for customer stratification, we can also use DSI and DPO for product and supplier stratification. This type of analysis helps us understand each working capital element within the context of other measurements. For example, a top-selling customer with a high DSO may be acceptable. However, we might lower the credit available to customers that buy little and have a high DSO.

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset