<jupyter_start><jupyter_text>---__Universidad Tecnológica Nacional, Buenos Aires__\__Ingeniería Industrial__\__Cátedra de Investigación Operativa__\__Autor: <NAME>__, <EMAIL>---  Ejercicios Markov clase 5<jupyter_code>import numpy as np<jupyter_output><empty_output><jupyter_text>Ejercicio 7Los consumidores de café en el área de Pontevedra usan tres marcas A, B, C. En marzo de 2016 se hizo una encuesta en lo que entrevistó a las 8450 personas que compran café y los resultados fueron:| Desde/Hasta| A | B  | C  ||--:|--:|---:|---:|| A |507|845 |338 || B |676|2028|676|| C |845|845 |1690 |* Si las compras se hacen mensualmente, ¿cuál será la distribución del mercado de café en Pontevedra en el mes de junio?* A la larga, ¿cómo se distribuirán los clientes de café?* En junio, cual es la proporción de clientes leales a sus marcas de café?<jupyter_code># Ingreso de vector de estado inicial:
p_0 = np.array([1690, 3380, 3380])
p_0 = p_0 / sum(p_0) # Relativizar
print('Vector de estado a t=0: \n %s \n' %p_0)

# Ingreso de matriz de transición:
M_abs = np.array([[507, 845, 338], [676, 2028, 676], [845, 845, 1690]])
T = np.zeros(M_abs.shape)
for i in range(0, T.shape[0]):
    T[i] = M_abs[i] / sum(M_abs[i])
     
print('Matriz de transición: \n %s \n' %T)
# Primer punto: distribución en el mes de junio (3 meses desde marzo):
# Matriz de transición de 3 meses:
T_3 = np.linalg.matrix_power(T, 3)

# Estado final a 3 meses:
p_3 = np.dot(p_0, T_3)
print('Vector de probabilidades a t=3: \n %s \n' %p_3)
# Segundo punto: cálculo de estado estable:
# Lo calculamos a través de las fórmulas (T' - I)pi = 0, sum(pi) = 1

# Construir matriz A y vector B:
A = (np.transpose(T) - np.identity(T.shape[0]))
print('Matriz A relacionada al sistema lineal de ecuaciones: \n %s \n' %A)
B = np.zeros(T.shape[0])
print('Vector B relacionado al sistema lineal de ecuaciones: \n %s \n' %B)

# Agregar sumatoria de probabilidades:
adicional = np.array([[1, 1, 1]])
A = np.concatenate((A, adicional), axis=0)
print('Matriz A: \n %s \n' %A)
B = np.append(B, 1)
print('Vector B: \n %s \n' %B)

# Resolvemos por mínimos cuadrados:
X, _, _, _ = np.linalg.lstsq(A, B)
print('Solución del sistema lineal de ecuaciones: \n %s \n' %X)
# Tercer punto: clientes leales a sus marcas en junio:
p_leal = np.diag(T_3)
print('Clientes que elegirían la marca nuevamente en junio: \n %s \n' % p_leal)

# Interesante alternativa (clientes que solo quedaron en cada nodo):
# los clientes leales están ubicados sobre la diagonal de la matriz:
T_leal = np.diag(np.diag(T))
print('Matriz de transición de clientes leales: \n %s \n' % T_leal)

# Vamos a t=3 solamente con los leales:
T_leal_3 = np.linalg.matrix_power(T_leal, 3)
# Los clientes leales a t=3 son los ubicados sobre la diagonal:
prop_leales = np.dot(p_0, T_leal_3)
print('Distribución de clientes leales: \n %s \n' % prop_leales)<jupyter_output>Clientes que elegirían la marca nuevamente en junio: 
 [0.237 0.486 0.305] 

Matriz de transición de clientes leales: 
 [[0.3 0.  0. ]
 [0.  0.6 0. ]
 [0.  0.  0.5]] 

Distribución de clientes leales: 
 [0.0054 0.0864 0.05  ]<jupyter_text>Ejercicio 8<jupyter_code># Ingreso de vector inicial:
p_0 = np.array([0.6, 0.4])
print('Vector de estado a t=0: \n %s \n' %p_0)

# Ingreso de matriz de transición:
T = np.array([[0.7, 0.3], [0.25, 0.75]])
print('Matriz de transición: \n %s \n' %T)
# a) 
# Matriz de transición en 3 pasos:
T_3 = np.linalg.matrix_power(T, 3)
print('Matriz de transición a t=3: \n %s \n' %T_3)

# Distribución en t=3:
p_3 = np.dot(p_0, T_3)
print('Vector de probabilidades a t=3: \n %s \n' %p_3)
# b) Si consume B, probabilidad de consumir D pasadas dos compras:
# Matriz de transición a 2 pasos:
T_2 = np.linalg.matrix_power(T, 2)
print('Matriz de transición a t=2: \n %s \n' %T_2)

# Distrubición a t=2:
p_0_b = np.array([0, 1])
p_2 = np.dot(p_0_b, T_2)
D_proba_2 = p_2[0]
print('Probabilidad de consumir D: \n %s \n' % D_proba_2)
# c) 
# Matriz de transición en 4 pasos:
T_4 = np.linalg.matrix_power(T, 4)
print('Matriz de transición a t=4: \n %s \n' %T_4)

# Distribución en t=4:
p_4 = np.dot(p_0, T_4)
print('Vector de probabilidades a t=4: \n %s \n' %p_4)
# d) Si consume D, probabilidad de consumir B pasadas tres compras:
# Distrubición a t=3:
p_0_d = np.array([1, 0])
p_3 = np.dot(p_0_d, T_3)
B_proba_3 = p_3[1]
print('Probabilidad de consumir B: \n %s \n' % B_proba_3)
# e) Si consume B, probabilidad de consumir B pasadas cinco compras:
# Matriz de transición en 5 pasos:
T_5 = np.linalg.matrix_power(T, 5)
print('Matriz de transición a t=5: \n %s \n' %T_5)

# Distrubición a t=5:
p_5 = np.dot(p_0_b, T_5)
B_proba_5 = p_5[1]
print('Probabilidad de consumir B: \n %s \n' % B_proba_5)
# f) cálculo de estado estable:

# Método 1: vector de estado en un 'n' grande:
# 1.1) n arbitrario:

n = 999
T_n = np.linalg.matrix_power(T, n)
p_n = T_n[0]
print('Estado en %i iteraciones arbitrarias: \n %s \n' % (n, p_n))

# 1.2) n por tolerancia:
tol = 10e-5

# inicializamos:
e = 999
contador = 1
p_i = p_0
# mientras el error sea mayor a la tolerancia:
while e > tol:
    # calculamos el estado siguiente:
    p_imas1 = np.dot(p_i, T)
    # calculamos la diferencia entre estados:
    dif = p_imas1 - p_i
    # calculamos la norma del error:
    e = np.linalg.norm(dif)
    # actualizamos p_i y el contador de estados
    p_i = p_imas1
    contador += 1
    
print('Estado estacionario: %s alcanzado en %i iteraciones \n' % (p_i, contador))
# Método 2: sistema de ecuaciones a partir de Chapman-Kolmogorov

# Matriz de sistema de ecuaciones:
A = np.array([[-0.3, 0.25], [1, 1]])
B = np.array([0, 1])

# Solución:
X = np.linalg.solve(A, B)

print('Solución del sistema lineal de ecuaciones: \n %s \n' %X)
# Método 3: Por flujo probabilístico:
# Para el nodo D llegamos al sistema (ver resolución en apunte):
sist_flujo = np.array([[0.25, -0.3], [1, 1]])
ind_flujo = np.array([0, 1])

# Resolvemos:
pi = np.linalg.solve(sist_flujo, ind_flujo)

print('Solución del sistema lineal de ecuaciones: \n %s \n' %pi)
# Método 4: Lo calculamos a través de las fórmulas pi(T - I) = 0, sum(pi) = 1

# Construir matriz A y vector B:
A = (T - np.identity(T.shape[0]))
print('A = T - I: \n %s \n' %A)
B = np.zeros(T.shape[0])
print('B: \n %s \n' %B)

# Agregar sumatoria de probabilidades:
adicional = np.array([1, 1]).transpose()
A[:, 1] = adicional
print('Matriz A modificada: \n %s \n' %A)
B[1] = 1
print('Vector B modificado: \n %s \n' %B)

# Inversa de la matriz A:
A_inv = np.linalg.inv(A)
print('Inversa de A: \n %s \n' %A_inv)

# Resolvemos por mínimos cuadrados:
pi = np.dot(B, A_inv)
print('Solución del sistema lineal de ecuaciones: \n %s \n' %pi)<jupyter_output>A = T - I: 
 [[-0.3   0.3 ]
 [ 0.25 -0.25]] 

B: 
 [0. 0.] 

Matriz A modificada: 
 [[-0.3   1.  ]
 [ 0.25  1.  ]] 

Vector B modificado: 
 [0. 1.] 

Inversa de A: 
 [[-1.81818182  1.81818182]
 [ 0.45454545  0.54545455]] 

Solución del sistema lineal de ecuaciones: 
 [0.45454545 0.54545455]
{'fraction_non_alphanumeric': 0.14522403111943524, 'fraction_numerical': 0.05143351102146665, 'mean_word_length': 3.810810810810811, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 14, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '3', 'dir': 'jupyter-structured-clean-dedup', 'id': '282490', 'license': 'Apache-2.0', 'n_tokens_mistral': 3223, 'n_tokens_neox': 3041, 'n_words': 953, 'path': '04_markov/casos_codigo/clase05_ejercicios_codigo/clase5.ipynb', 'repo_name': 'juanntripaldi/pyOperativ', 'size': '6971'}