This text proposes a mathematical formalism to analyze the labor embodied in commodities, a central idea in econophysics that treats the economy statistically. It begins by defining labor content as the sum of direct labor hours and the proportional fraction of labor contained in products used in production. Through a series of matrix equations, the author constructs tools to model production, consumption, and, crucially, the allocation of labor between workers and other social classes. The objective is to quantify the distribution of labor contained in net production, revealing how a portion is appropriated by other sectors of society, as exemplified in the analysis of capitalist versus worker appropriation."
Although the focus of my work involves the use of microscopic models to investigate complex systems, econophysics is not limited to this. Among some of the works considered seminal in the field, the books by Farjoun and Machover stand out: Laws of Chaos: A Probabilistic Approach to Political Economy and How Labor Powers the Global Economy. The main idea in these works is that the economy should be treated statistically.
The text of this chapter is taken from the appendix of the book How Labor Powers the Global Economy, where we aim to develop mathematical tools to analyze the labor embodied in commodities. Therefore, we are not presenting a model or law here, only a mathematical formalism for conducting analyses.
To begin, we need to define some properties of labor content (my translation of Labor Content):
The labor content of a collection of products is equal to the total number of hours of labor directly invested in their production, plus the proportional fraction of labor contained in the products involved in their production process.
The labor content of the net production of an entire economy, over a given period, is equal to the total number of hours worked during that period.
Evidently, the second property is a consequence of the first, since, when we consider the entire net production of society, we necessarily also consider all production that was used in the production process. In this way, we are taking into account the production of society as a whole.
Let us consider an economy with m production units that are able, over a certain period of time (one year, for example), to produce a collection of products B. A part BI of these products will be consumed during the production process itself, thus resulting in a net product BL=B−BI.
From the net product, a portion BT is allocated to workers—assuming that the other part of the net product BC is allocated to capitalists, so that BL=BT+BC. The labor LT contained in BT will, in the same way, be a part of the total labor L contained in the net product. Analogously, we can suppose that the remainder LC of the labor contained in the net product is the labor embodied in the products allocated to capitalists, so that L=LT+LC. We will call this the partition of labor, which will be denoted as:
In other words, only the fraction λ of the labor content in the net product is embodied in the product allocated to workers; the rest is appropriated by other sectors of society. Let us now classify all products into d distinct types. We can then construct a vector b=(b1,…,bd) that records the quantity of each type of product that makes up the net product. If we define a vector c=(c1,…,cd) that describes the labor content per unit of each type of product, we can then calculate the total labor content in the net product as follows:
If we construct a vector w that represents the quantity of net products distributed to the workforce divided by the total labor employed by society, we have LbT=w, where bT is the vector representing the portion of the net product allocated to workers. Evidently, the labor content in the net product allocated to workers will be:
Now let us connect the products distributed to the workforce with the products produced across the m distinct production units. Let us consider that firm i employs xi hours of labor directly in a given year, and let ai be a vector specifying the quantity of each type of product used per hour of labor directly employed by the firm. Then the products consumed by a firm over the year are aixi. For example, if we have only two products, we would have for a firm i:
We can then construct a matrix A where each column j is a column vector ai indicating the consumption of products by firm i per hour of labor employed. That is, row i indicates the consumption of product i by each firm, and column j indicates the consumption of each product by firm j. For example, if we have two firms with two types of products, then:
Thus, we can obtain the vector bI representing the basket of products consumed during the production process over the course of a year by using a matrix with components aij:
This calculation can be easily generalized for any number d of product types and m firms, where x is a column vector of dimension m, and A is a matrix of dimension d×m:
Denoting the vector of products produced by firm i over the year as qi=[qi1,…,qid], we define that firm i produces pijqj units of type j, i.e., qij=pijqj, where pij is the proportion in which firm i contributes to the total production of product j in the entire economy, given by the component qj of the vector q. For example, if firm i produces 100% of product j, then simply pij=1 and qji=qj, and for any other firm different from i we have qji=pij=0.
A firm i directly employs xi units of labor to produce di different types of products. Then the quantity lij=xi/qij gives the number of hours of labor that must be directly employed by firm i to produce one unit of product type j. We can also rewrite lij=xi/(pijqj). We can rewrite this as:
Here we are indicating, for example, that if u=(u1,u2) and v=(v1,v2), then in a concise notation we write (u,v)=(u1,u2,v1,v2). Furthermore, 0 is a vector of zero values, and In is an identity matrix of size n×n. This is necessary because for the multiplication of matrices n×m and j×k, we need m=j, that is, the number of columns of the first matrix must equal the number of rows of the second. Then, Id is a d×d matrix in order to multiply the vector q of size d. Since A is a d×m matrix, the number of columns in the whole matrix is d+m=n. L is an m×d matrix, so the number of rows is also n=m+d, which perfectly complements the last identity matrix Im that multiplies the vector x of dimension m. Thus, the column vector also has dimension n=m+d.
We can now relate the quantity of products allocated to the workforce to the products it produces. If L=∑ixi is the total number of hours of labor directly employed by the firms over the year, then if we write a vector of size m where all elements are 1 as 1, we have 1⋅x=∑ixi=L. Thus:
Now we want the component α21 of the inverse matrix. Let us calculate the inverse explicitly—recalling that in this notation, each element of the matrix H is itself a matrix. Therefore, the elements on the right-hand side of the equality are also matrices (zero and identity). The identity matrix on the right must be n×n overall, but we have some flexibility in choosing the dimensions of the identity sub-matrices. Defining them with orders n1×n1 and n2×n2, as long as n=n1+n2, and the zero matrices being of the necessary size to maintain the full square matrix.
We then choose n1=d and n2=m. In this way, the zero matrices need to have the dimensions of A and L:
We can note that by definition, the elements αi1 must have d columns to multiply Id and A, analogous to αi2 which must have m columns to multiply L and Im. Thus:
It is worth noting that AL is a matrix of order d×m multiplying a matrix of order m×d, resulting in a matrix of order d×d. That is, by multiplying the entire equality by its right inverse, we have:
The book calls W the worker allocation matrix. Recalling the equation bT=Wb, it does not specify exactly how workers are allocated, but from the net production b, it tells us which part of the production is allocated to the workers bT. If we can write bT=Wb, then:
If we recall that λ=c⋅w, this invites us to consider that λ is independent of b; that is, the partition of labor depends on certain technical aspects of the mode of production given by c, and not on the net production b. Thus:
Recalling that by associativity we have c⋅(Wb)=(cW)⋅b, then λ is the eigenvalue given by det(WT−λI)=0. Since det(WT−λI)=det(W−λI), we are simply looking for the eigenvalues of W. With W=w1L(Id−AL)−1, then:
It can be observed that the measure of labor content L calculates the average labor spent across all production units and adds all the intermediate labor required at each stage of production. If we use the series expansion of a matrix in L=1L(Id−AL)−1b, we obtain:
Where cn=1L(AL)n determines the labor required at the n-th stage of production (counting backward from the end). In this way, L accounts for all the labor necessary to produce a collection of products[^2].
Let’s imagine a society with two production units (One and Two) that during a year produce Steel and Bananas. The total production in the year is 30 units of steel and 40 units of bananas, i.e., q=(30,40), of which half is net production b=(15,20) and approximately half of the net production is allocated to the workers bT=(5,10).
The two firms together employ L=250 hours of annual labor. Let’s consider that Firm One employs 150h and Firm Two 100h, i.e., x=(150,100). The production that is internally consumed, as we defined, is half of the total production, i.e., bI=b=(15,20). Considering that Firm One consumes 15 units of steel and 10 units of bananas, then bI1=(15,10). Firm Two consumes the remainder: 0 units of steel and 10 units of bananas, i.e., bI2=(0,10).
import numpy as np
bt = np.array([5, 10])
bc = np.array([10, 10])
b = bt + bc
bi = b
q = b + bi
Um = np.array([1,1])
x = np.array([150,100])
L = np.dot(x,Um)
print('Basket of commodities for workers: bt =', bt)
print('Basket of commodities for capitalists: bc =', bc)
print('Net basket of commodities: b =', b)
print('Basket of commodities used in production: bi =', bi)
print('Basket of gross products: q =', q)
print('Hours worked by each firm: x =', x)
print('Total hours worked in society: L =', L)
Basket of commodities for workers: bt = [ 5 10]
Basket of commodities for capitalists: bc = [10 10]
Net basket of commodities: b = [15 20]
Basket of commodities used in production: bi = [15 20]
Basket of gross products: q = [30 40]
Hours worked by each firm: x = [150 100]
Total hours worked in society: L = 250
w = bt/L
A = np.zeros((2, 2))
bi1 = np.array([15,10])
bi2 = np.array([0,10])
for i in range(2):
A[i, 0] = bi1[i]/x[0]
A[i, 1] = bi2[i]/x[1]
print('w =',w)
print('Commodities consumed by Firm One: bi1 =',bi1)
print('Commodities consumed by Firm One: bi2 =',bi2)
print('Matrix A:\n',A)
print('Check: bi = A.x =',np.dot(A,x))
w = [0.02 0.04]
Commodities consumed by Firm One: bi1 = [15 10]
Commodities consumed by Firm One: bi2 = [ 0 10]
Matrix A:
[[0.1 0. ]
[0.06666667 0.1 ]]
Check: bi = A.x = [15. 20.]
Now regarding gross production, considering that Firm One produces all the steel and half of the bananas, we have q1=(30,20), so Firm Two must produce the remainder q2=(0,20), with the sum of both clearly giving the total gross production q=q1+q2 as defined at the beginning.
Another way to put this is by saying that Firm One is responsible for producing 100% of the steel (p11=1 and p21=0), and regarding bananas, each firm produces half (p12=p22=0.5).
Since Firm One produces two products d1=2 and Firm Two only one d2=1, we can calculate the terms lij through both paths, for example l12 (related to Firm One’s banana production):
It is interesting to note here that for l21 I used an approximation which indicates that Firm Two would require infinite hours to produce steel, since it does not produce it. It is worth noting that we are not directly defining how the future gross production of each firm is divided between internal consumption for production and net production, nor how the products consumed by the firm are distributed among its net products.
Note: To keep the notation adopted in the book, whenever we encounter the indeterminate form limpij→0lijpij, we assign it a value of 0. We also can recover x:
q1=np.array([30,20])
q2=np.array([0,20])
L = np.zeros((2, 2))
p = np.array([[q1[0]/q[0],q1[1]/q[1]],
[q2[0]/q[0],q2[1]/q[1]]])
d1 = 2; d2 = 1
I = np.eye(2)
for i in range(2):
L[0,i] = (x[0]/d1)*(1/q[i]) if (p[0,i]>0) else 0
L[1,i] = (x[1]/d2)*(1/q[i]) if (p[1,i]>0) else 0
print('Gross product by Firm One: q1 =',q1)
print('Gross product by Firm Two: q2 =',q2)
print('Firm One makes d1 =',d1,'products')
print('Firm Two makes d2 =',d2,'products')
print('Check: x = Lq =',np.dot(L,q))
print('Check: b = (I-AL)q =',np.dot(I-np.dot(A,L),q))
Gross product by Firm One: q1 = [30 20]
Gross product by Firm Two: q2 = [ 0 20]
Firm One makes d1 = 2 products
Firm Two makes d2 = 1 products
Check: x = Lq = [150. 100.]
Check: b = (I-AL)q = [15. 20.]
Finally, we can calculate the workers’ allocation matrix:
# Up to this point, we let Python identify the vector automatically
# But it will perform a dot product between two vectors
# We need to specify explicitly when we have:
w = w.reshape(-1, 1) # Column vector (n x 1)
T = np.dot(Um, np.dot(L, MI)).reshape(1, -1) # Row vector (1 x m)
# Multiplication: column vector x row vector → matrix
W = np.dot(w, T)
print("The allocation matrix is \n", W)
The allocation matrix is
[[0.1047619 0.17142857]
[0.20952381 0.34285714]]
We can interpret each term Wij as the fraction of net product i that is allocated to the workers for each unit of net product j. For example, W11≈0.1 indicates that for every 10 units of steel of net product produced, 1 unit of steel is allocated to the workers (0.1⋅15=1.5), and W12≈0.17 similarly indicates that for each unit of banana of net product, 0.17 unit of steel is allocated to the workers (0.17⋅20≈3.5), resulting in a total of 5 units of steel produced for the workers for this net production b.
c = np.dot(Um, np.dot(L, MI))
lamb = np.dot(c, w)
Li = np.dot(c, b)
print('The average number of hours required to produce each commodity is c =', c)
print('Check: L = 1.L.MI =', Li)
print('The labor allocation is lambda =', lamb[0])
The average number of hours required to produce each commodity is c = [5.23809524 8.57142857]
Check: L = 1.L.MI = 250.0
The labor allocation is lambda = 0.44761904761904764
Let’s interpret these results. Each unit of steel requires on average 5.23 hours of work to be produced, and each unit of banana requires 8.57 hours, so c=(5.23,8.57).
Then, the labor contained in the net production is L=c⋅b=5.23⋅15+8.57⋅20≈250, and the labor contained in the production allocated to workers is LT=c⋅bT=5.23⋅5+8.57⋅10≈112, so the labor partition is given by λ=112/250≈0.45, approximately the same result found previously.
This means that 45% of the hours employed by workers directly in the productive system of this society are contained in the products allocated to the working class, while the remaining 55% is appropriated by another class that is not directly involved in the production system. This is still a division by class; it is important to remember that typically the working class is much larger than the capitalist class. Considering a proportion of 10 workers for each capitalist, it means that the 45% of labor contained and allocated to workers is distributed among 10 times more people than the 55% appropriated by capitalists.
We can now calculate labor per capita, that is, if there are N capitalists, and 55% of production is appropriated by capitalists, on average each capitalist appropriates N55% of the production. Doing the same for the workers, but considering that there are 10N workers, each worker appropriates 10N45% of the production. Now calculating the ratio, that is, how many times more a capitalist appropriates the production compared to a worker, we have:
In this case, a capitalist appropriates 12 times more of the production than a worker. If we consider that there are 100 workers for each capitalist, then this capitalist appropriates more than 122 times the production compared to a worker. This considers a capitalist who extracts profits simply from owning the means of private production.
Lt = np.dot(c, bt)
cap = 10
ratio = cap * (1 - lamb) / lamb
print(f'Labor content allocated to workers: lambdaT = c.bt = {Lt:.2f}')
print(f'Check: lambda = Lt/L = {Lt/Li:.2f}')
print(f'If there are {cap} times more capitalists than workers, then each capitalist appropriates {ratio[0]:.2f} times more of the production than a worker.')
Labor content allocated to workers: lambdaT = c.bt = 111.90
Check: lambda = Lt/L = 0.45
If there are 10 times more capitalists than workers, then each capitalist appropriates 12.34 times more of the production than a worker.