- PDFView PDF
Under a Creative Commons license
Open access
Highlights
•
Uses purchasing portfolio logic and cluster analysis to categorize purchase types.
•Profiles skills requirements by purchase type, and analyses variation.
•As market risk and profit impact rise, so more (n) and more advanced skills needed.
•Proposes a survey methodology to support strategic development of purchasing.
•Leverages purchasing portfolio approach for human resource management.
Abstract
Kraljic's (1983) purchasing portfolio approach holds that different types of purchases need different sourcing strategies, underpinned by distinct sets of resources and practices. The approach is widely deployed in business and extensively researched, and yet little research has been conducted on how knowledge and skills vary across a portfolio of purchases. This study extends the body of knowledge on purchasing portfolio management, and its application in the strategic development of purchasing in an organization, and on human resource management in the purchasing function. A novel approach to profiling purchasing skills is proposed, which is well suited to dynamic environments which require flexibility. In a survey, experienced purchasing personnel described a specific purchase and profiled the skills required for effective performance in purchasing that item. Purchases were categorized according to their importance to the organization (internally-oriented evaluation of cost and production factors) and to the supply market (externally-oriented evaluation of commercial risk and uncertainty). Through cluster analysis three key types of purchase situations were identified. The skills required for effective purchasing vary significantly across the three clusters (for 22 skills, p<0.01). Prior research shows that global organizations use the purchasing portfolio approach to develop sourcing strategies, but also aggregate analyses to inform the design of purchasing arrangements (local vs global) and to develop their improvement plans. Such organizations would also benefit from profiling skills by purchase type. We demonstrate how the survey can be adapted to provide a management tool for global firms seeking to improve procurement capability, flexibility and performance.
Keywords
Purchasing portfolio
Purchasing skill
Cluster analysis
Skill profiling
Procurement HRM
Purchasing competence
Cited by (0)
Copyright © 2013 Elsevier B.V.
A significant question in applying the KPM is how to categorize purchased products and services within the matrix. Organizations vary in how they measure supply risk and profit impact. Furthermore, some organizations may choose to measure their purchases against different dimensions; however, the fundamental purpose of the matrix remains. For our purpose, we assume that the organization has developed a means to condense their measurement of each dimension to a single value. For example, many organizations use an index (i.e. IBISWorld Buyer Power Score) to measure one of the dimensions. Or some organizations develop an indexed value function that generates a single value score for many attributes (i.e. profit impact can be a function of volume purchased, expected growth in demand, percent of total purchase cost, impact on product quality and business growth, etc.). However, once you have a single value that represents each dimension, subjectivity still largely drives how they are positioned in the KPM. The kraljicMatrix package was designed to assist with this concern and the examples that follow walk you through how to implement kraljicMatrix functions.
Primary functions in kraljicMatrix
There are ten primary functions provided by kraljicMatrix as follows:
SAVF_score | Computes a utility score based on an exponential single attribute value function. |
SAVF_preferred_rho | Computes the preferred rho that minimizes the squared error between subject matter inputs and exponentially fitted utility scores. |
SAVF_plot_rho_error | Plots the squared error terms for the rho search space to illustrate the preferred rho that minimizes the squared error between subject matter desired values and exponentially fitted scores. |
SAVF_plot | Plots the single attribute utility curve along with the subject matter desired values for comparison. |
MAVF_score | Computes the multi-attribute value score based on x and y attribute utility scores and their respective weights. |
MAVF_sensitivity | Computes summary statistics for multi-attribute value scores for x and y given a range of swing weights for each attribute. |
kraljic_quadrant | Identifies the Kraljic purchasing matrix quadrant for each product or service based on the attribute utility scores of and . |
kraljic_matrix | Plots each product or service in the Kraljic purchasing matrix based on the attribute value score of x and y. |
get_frontier | Identifies and extracts the observations that have the Pareto optimal combination of x and y. |
geom_frontier | Plots the Pareto optimal front in a ggplot2 object. |
Furthermore, an example dataset psc is provided in the kraljicMatrix package. This data contains 200 product and service contracts (PSC). Each PSC has an x attribute (i.e. supply risk) score from 1 (worst) to 5 (best) and y attribute (i.e. profit impact) score from 1 (worst) to 10 (best).
psc ## # A tibble: 200 × 3 ## PSC x_attribute y_attribute ## <chr> <int> <int> ## 1 D233 3.01 4.84 ## 2 F352 4.34 5.64 ## 3 T713 3.37 4.30 ## 4 K833 2.67 5.53 ## 5 Q121 3.48 4.33 ## 6 C791 3.32 7.32 ## 7 Y207 3.48 5.42 ## 8 W439 2.47 3.35 ## 9 N290 1.66 4.02 ## 10 C251 1.00 7.47 ## # ... with 190 more rows
Implementation of kraljicMatrix
The x and y attributes are simply evaluation measures. They enable each product and service to obtain a score for each dimension being measured. For example, the x attribute score (1-5 in .01 increments) could be the IBISWorld Buyer Power Score measuring supply market complexity. However, to plot these attributes on the KPM matrix we need to normalize the value scores such that the values are between 0-1. To do this we can use an exponential single attribute value function (SAVF). For example, let \(v_x(x_i)\) represent the normalized value of the x attribute such that \(x^0\) and \(x^*\) are the lowest and highest preferred value of attribute x respectively. Thus, \(v_x(x^0)=0\) and \(v_x(x^*)=1\). Consequently, let \(v_x(x_i)\) be the SAVF of exponential form whereby each \(x_i\) is an input and \(\rho_x\) is the exponential constant for \(v_x(x_i)\):
\[v_x(x_i)=\frac{1-e^{[-(x_i-x^0)/\rho_x]}}{1-e^{[-(x^*-x^0)/\rho_x]}} \forall i \in PSC\]
However, prior to applying the SAVF to our x and y attributes we must first identify the appropriate \(\rho\) value. The benefit of applying an exponential SAVF is that it can take on many forms of increasing rates, along with aligning to a linear value function. Consequently, if certain x attribute values are valued more than other values an exponential SAVF will capture this utility curve. To identify the appropriate exponential rate, subject matter expert (SME) inputs are typically evaluated and an exponential rate that most closely matches the preffered values provided by the SMEs is chosen. Thus, let’s assume for our given x attribute the SME inputs suggest that x attribute values of 3, 4, & 5 provide a utility score of .75, .90 & 1.0 respectively (this represents a decreasing rate of return utility curve). Knowing that our x attribute is bounded between 1 and 5 we can search for a rho value between 0-1 that provides the best fit utility function using the SAVF_preferred_rho function.
SAVF_preferred_rho(desired_x = c(3, 4, 5), desired_v = c(.8, .9, 1), x_low = 1, x_high = 5, rho_low = 0, rho_high = 1) ## [1] 0.6531
Thus, we can see that \(\rho = 0.6531\) provides the best fit exponential SAVF. We can illustrate this two ways. First, we can use SAVF_plot to plot the single attribute utility curve compared to the subject matter desired values.
SAVF_plot(desired_x = c(3, 4, 5), desired_v = c(.8, .9, 1), x_low = 1, x_high = 5, rho = 0.6531)
We can also visualize the errors of the \(\rho\) search space with SAVF_plot_rho_error, which plots the squared error terms for all \(\rho\) values within the \(\rho\) search space to illustrate the preferred rho that minimizes the squared error between subject matter desired values and exponentially fitted scores.
SAVF_plot_rho_error(desired_x = c(3, 4, 5), desired_v = c(.75, .9, 1), x_low = 1, x_high = 5, rho_low = 0, rho_high = 1)
Once we’ve identified the preferred \(\rho\) value, we can now apply the exponential SAVF with SAVF_score to normalize our attributes based on our utility curve.
# using dplyr to add a new variable while preserving existing data library(dplyr) # here we are assuming we found the appropriate rho value for the y attribute using # the same process as mentioned above psc <- psc %>% mutate(x_SAVF_score = SAVF_score(x_attribute, 1, 5, .653), y_SAVF_score = SAVF_score(y_attribute, 1, 10, .70)) psc ## # A tibble: 200 x 5 ## PSC x_attribute y_attribute x_SAVF_score y_SAVF_score ## <chr> <dbl> <dbl> <dbl> <dbl> ## 1 D233 3.01 4.84 0.789 0.934 ## 2 F352 4.34 5.64 0.957 0.963 ## 3 T713 3.37 4.30 0.850 0.902 ## 4 K833 2.67 5.53 0.717 0.960 ## 5 Q121 3.48 4.33 0.866 0.904 ## 6 C791 3.32 7.32 0.842 0.990 ## 7 Y207 3.48 5.42 0.866 0.956 ## 8 W439 2.47 3.35 0.666 0.808 ## 9 N290 1.66 4.02 0.378 0.881 ## 10 C251 1.00 7.47 0 0.991 ## # ... with 190 more rows
Now that we have the normalized x and y attribute utility scores we can proceed with plotting each PSC within the Kraljic matrix with kraljic_matrix.
kraljic_matrix(psc, x_SAVF_score, y_SAVF_score)
This illustrates that most of our PSCs fall in the “Leverage” (upper left) quadrant while a few fall in the “Strategic” (upper right) and “Non-critical” (lower left) quadrants and no PSCs fall in the “Bottleneck” quadrant. Keep in mind that each category benefits from a different strategic sourcing approach. So decision-makers benefit from understanding specifically which products and services align to each so that they can coordinate the appropriate sourcing strategy for that particular product or service. We can easily do this with the kraljic_quadrant function.
psc %>% mutate(quadrant = kraljic_quadrant(x_SAVF_score, y_SAVF_score)) ## # A tibble: 200 x 6 ## PSC x_attribute y_attribute x_SAVF_score y_SAVF_score quadrant ## <chr> <dbl> <dbl> <dbl> <dbl> <chr> ## 1 D233 3.01 4.84 0.789 0.934 Leverage ## 2 F352 4.34 5.64 0.957 0.963 Leverage ## 3 T713 3.37 4.30 0.850 0.902 Leverage ## 4 K833 2.67 5.53 0.717 0.960 Leverage ## 5 Q121 3.48 4.33 0.866 0.904 Leverage ## 6 C791 3.32 7.32 0.842 0.990 Leverage ## 7 Y207 3.48 5.42 0.866 0.956 Leverage ## 8 W439 2.47 3.35 0.666 0.808 Leverage ## 9 N290 1.66 4.02 0.378 0.881 Strategic ## 10 C251 1.00 7.47 0 0.991 Strategic ## # ... with 190 more rows
Lastly, it is important to keep in mind that decision-makers may weight the importance of each attribute differently. Consequently, due to certain market environments, decision-makers may weight the x attribute (i.e. supply risk) of greater importance than the y attribute (i.e. profit impact). Thus, we can prioritize PSCs based on this preference by applying a multi-attribute value function (MAVF) with swing weights. Swing weight values for x and y attributes (\(w_x\) and \(w_y\) respectively) are typically elicited from SMEs. This allows for calculation of the interaction swing weight \(w_{xy} = 1 - w_x - w_y\). Thus, we can calculate the MAVF as outlined by Keeney and Raiffa (1993)3:
\[V(x,y) = w_x v_x (x) + w_y v_y (y) + w_{xy} v_x (x) v_y (y)\]
Thus, we can apply the MAVF_score function to compute the multi-attribute value score based on x and y attribute utility scores and their respective swing weights. So if through discussions with decision-makers we identify swing weight values of 0.65 and 0.35 for the x and y attributes respectively, we can obtain the computed MAVF score for each PSC:
psc %>% mutate(MAVF = MAVF_score(x_SAVF_score, y_SAVF_score, 0.65, 0.35)) ## # A tibble: 200 x 6 ## PSC x_attribute y_attribute x_SAVF_score y_SAVF_score MAVF ## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 D233 3.01 4.84 0.789 0.934 0.839 ## 2 F352 4.34 5.64 0.957 0.963 0.959 ## 3 T713 3.37 4.30 0.850 0.902 0.868 ## 4 K833 2.67 5.53 0.717 0.960 0.802 ## 5 Q121 3.48 4.33 0.866 0.904 0.879 ## 6 C791 3.32 7.32 0.842 0.990 0.894 ## 7 Y207 3.48 5.42 0.866 0.956 0.897 ## 8 W439 2.47 3.35 0.666 0.808 0.716 ## 9 N290 1.66 4.02 0.378 0.881 0.554 ## 10 C251 1.00 7.47 0 0.991 0.347 ## # ... with 190 more rows
This allows us to quickly dissect our PSCs. For example, if decision-makers are most concerned with the “Leverage” quadrant but want to assess the top 10 PSCs based on the decision-makers preferences of the attributes we can efficiently make this assessment. This identifies the top 10 PSCs that are most likely to benefit from a strategic sourcing approach specifically designed for “Leverage” PSCs.
psc %>% mutate(MAVF = MAVF_score(x_SAVF_score, y_SAVF_score, 0.65, 0.35), quadrant = kraljic_quadrant(x_SAVF_score, y_SAVF_score)) %>% filter(quadrant == "Leverage") %>% top_n(10, wt = MAVF) ## # A tibble: 10 x 7 ## PSC x_attribute y_attribute x_SAVF_score y_SAVF_score MAVF quadrant ## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> ## 1 Y357 5.00 6.55 1.00 0.981 0.993 Leverage ## 2 E103 4.46 7.71 0.967 0.993 0.976 Leverage ## 3 C432 4.65 6.05 0.980 0.973 0.977 Leverage ## 4 P402 5.00 5.82 1.00 0.968 0.989 Leverage ## 5 Q255 4.95 6.41 0.997 0.979 0.991 Leverage ## 6 H426 5.00 5.58 1.00 0.961 0.986 Leverage ## 7 E908 4.75 7.11 0.986 0.988 0.987 Leverage ## 8 X634 5.00 5.19 1.00 0.949 0.982 Leverage ## 9 O288 5.00 5.00 1.00 0.941 0.979 Leverage ## 10 V870 5.00 5.88 1.00 0.969 0.989 Leverage
And finally, since our swing weight inputs are subjective in nature we may wish to perform a senstivity analysis on these swing weights to see their impact on MAVF scores. The MAVF_sensitivity function executes a sensitivity analysis by performing a Monte Carlo simulation with 1000 trials for each product or service (row). Each trial randomly selects a weight from a uniform distribution between lower and upper bound swing weight parameters and calculates the mult-attribute utility score. From these trials, summary statistics for each product or service (row) are calculated and reported for the final output.
MAVF_sensitivity(psc, x = x_SAVF_score, y = y_SAVF_score, x_wt_min = .55, x_wt_max = .75, y_wt_min = .25, y_wt_max = .45) %>% select(PSC, starts_with("MAVF")) ## # A tibble: 200 x 8 ## PSC MAVF_Min MAVF_1st_Q MAVF_Median MAVF_Mean MAVF_3rd_Q MAVF_Max ## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 D233 0.815 0.830 0.839 0.839 0.850 0.864 ## 2 F352 0.952 0.957 0.959 0.959 0.961 0.967 ## 3 T713 0.847 0.861 0.868 0.868 0.875 0.889 ## 4 K833 0.772 0.788 0.801 0.802 0.816 0.831 ## 5 Q121 0.860 0.873 0.879 0.879 0.885 0.899 ## 6 C791 0.878 0.886 0.893 0.894 0.902 0.910 ## 7 Y207 0.881 0.891 0.897 0.897 0.904 0.913 ## 8 W439 0.678 0.702 0.716 0.716 0.729 0.754 ## 9 N290 0.496 0.525 0.552 0.554 0.582 0.612 ## 10 C251 0.248 0.296 0.344 0.347 0.399 0.446 ## # ... with 190 more rows, and 1 more variable: MAVF_Range <dbl>