scieee AI-readable full text Open interactive document viewer

Evaluación de la eficiencia de los jugadores de la NBA utilizando análisis envolvente de datos

Martín Villares, Pablo

Abstract

Grado en Estadística

Full text

Universidad de Valladolid Trabajo Fin de Grado FACULTAD DE CIENCIAS Grado en Estad´ıstica Evaluaci´on de la eficiencia de los jugadores de la NBA utilizando An´alisis Envolvente de Datos Autor: D. Pablo Mart´ın Villares Tutores: D. Jes´us A. Tapia Garc´ıa D. Bonifacio Salvador Gonz´alez Agradecimientos Transmitir mi m´as sincero agradecimiento a todos aquellos que me han ayudado a lo largo de esta etapa y han colaborado en esta investigaci´on. En primer lugar, a mis tutores, Jes´us y Bonifacio, por su ayuda en la planificaci´on, organizaci´on y resoluci´on de este Trabajo de Fin de Grado. En segundo lugar, a mi familia, mi madre Isabel, mi padre Alberto, mi hermana Mar´ıa y mi sobrino Lucas. A mis amigos y a mi pareja Raquel que han estado a lo largo de toda mi carrera apoy´andome en todo momento y anim´andome a seguir adelante. Tambi´en, expresar mi m´as sentido agradecimiento a la Universidad de Valladolid por acogerme dentro de sus aulas y hacerme sentir como en casa. Despu´es de este per´ıodo de investigaci´on escribo este apartado de agradecimientos para finalizar mi TFG. Sin duda, ha sido un per´ıodo de aprendizaje cient´ıfico y personal. Desarrollar este estudio ha tenido un gran impacto en mi persona y es por eso que me gustar´ıa agradecer a todas aquellas personas que me han apoyado durante este proceso. A todos ellos, mil gracias 2 ´ Indice general P´agina ´ Indice de figuras 5 ´ Indice de tablas 7 1. Introducci´on 9 2. An´alisis envolvente de datos 11 2.1. Introducci´on....................................... 11 2.2. Conceptosb´asicos ................................... 12 2.3. Concepto intuitivo de envolvente . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.4. Definici´on del conjunto de posibilidades de producci´on . . . . . . . . . . . . . . . 17 2.5. Caracterizaci´on de los modelos DEA . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.6. Orientaci´ondelmodelo................................. 19 2.7. Tipolog´ıa de los rendimientos a escala . . . . . . . . . . . . . . . . . . . . . . . . 20 2.8. ModelosDEA...................................... 20 2.8.1. ModeloCCR .................................. 20 2.8.2. ModeloBCC .................................. 21 2.8.3. ModeloAditivo................................. 23 2.9. An´alisis en Componentes Principales . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.9.1. C´alculo de las componentes principales . . . . . . . . . . . . . . . . . . . . 25 3. Base de datos de jugadores de la NBA 27 3.1. Fichero de datos BoxScores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.2. Fechasdetemporadas ................................. 29 3.3. Salariodelosjugadores ................................ 29 3.4. Selecci´ondeInputs................................... 31 3.5. Selecci´ondeoutputs .................................. 31 4. Programa 33 4.1. Tecnolog´ıaPython ................................... 33 4.2. Descripci´on de las librerias utilizadas . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.2.1. Numpy ..................................... 33 4.2.2. Pandas ..................................... 33 4.2.3. Scipy ...................................... 34 4.2.4. Sklearn ..................................... 34 4.3. Descripci´on de los procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.3.1. readcalendar.................................. 34 4.3.2. princomp .................................... 34 3 4.3.3. readsalary ................................... 35 4.3.4. reducedata................................... 35 4.3.5. filterdata.................................... 35 4.3.6. BCCIO..................................... 35 4.3.7. BCCOO .................................... 35 4.3.8. CCR....................................... 35 4.3.9. Additive..................................... 36 4.3.10.DEAmodels .................................. 36 5. Ejemplo de los resultados para un caso concreto 37 6. Conclusiones 45 7. Bibliograf´ıa 47 8. Anexo: C´odigo 49 8.1. mergecalendars().................................... 49 8.2. readcalendar()..................................... 49 8.3. readsalary() ...................................... 50 8.4. reducedata() ...................................... 51 8.5. filterdata() ....................................... 51 8.6. princomp() ....................................... 52 8.7. BCCIO()........................................ 53 8.8. BCCOO() ....................................... 53 8.9. CCR().......................................... 54 8.10.Additive()........................................ 54 8.11.DEAmodels() ..................................... 55 4 ´ Indice de figuras P´agina 1.1. Mapa de Estados Unidos dividido por conferencias . . . . . . . . . . . . . . . . . 10 2.1. Frontera eficiente para 1 Input y 1 Output . . . . . . . . . . . . . . . . . . . . . . 14 2.2. Frontera eficiente para 1 Input y 2 Outputs . . . . . . . . . . . . . . . . . . . . . 16 2.3. Orientaciones en modelos DEA . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.1. Archivo CSV con las fechas de inicio y fin de las temporadas . . . . . . . . . . . 29 3.2. Ejemplo de la estructura del fichero Salaries 1990 2020.csv . . . . . . . . . . . . . 30 3.3. Ejemplo de las tablas de la p´agina ESPN . . . . . . . . . . . . . . . . . . . . . . 31 5.1. Salarios filtrados por equipo y temporada . . . . . . . . . . . . . . . . . . . . . . 37 5.2. Estad´ısticas de los jugadores filtradas por partido, equipo y temporada . . . . . . 38 5.3. Estad´ısticas totales por temporada para cada jugador . . . . . . . . . . . . . . . 38 5.4. Jugadores finales sobre los que se realiza el estudio . . . . . . . . . . . . . . . . . 39 5.5. Inputs,spysalary ................................... 39 5.6. Inputs, sp y salary normalizados . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 5.7. Componentes principales extra´ıdas en el ejemplo . . . . . . . . . . . . . . . . . . 40 5.8. Componentes principales tras realizar la traslaci´on . . . . . . . . . . . . . . . . . 41 5 6 ´ Indice de tablas P´agina 2.1. Datos caso 1 Input y 1 Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2. Eficienciarelativa.................................... 14 2.3. Datos para el caso de 1 Input y 2 Outputs . . . . . . . . . . . . . . . . . . . . . . 15 2.4. Output obtenido por unidad de Input consumida . . . . . . . . . . . . . . . . . . 16 2.5. Eficiencia relativa para el caso de 1 Input y 2 Output . . . . . . . . . . . . . . . 17 7 8 CAP´ ITULO 1 Introducci´on La National Basketball Association, m´as conocida por sus siglas NBA, es una liga de baloncesto profesional que se disputa en Estados Unidos. Es una entidad privada, por lo que no depende oficialmente de la Federaci´on Estadounidense de Baloncesto. El 6 de junio de 1946 se cre´o bajo el nombre de Basketball Association of America (BAA), m´as tarde renombrada como NBA, cuando se fusionan las ligas profesionales ya existentes, National Basketball League (NBL), fundada en 1937 y la Basketball Association of America (BAA), creada en 1946. En su primera temporada, la 1946-47, se disput´o con 11 franquicias: Los Boston Celtics, Philadelphia Warriors, New York Knicks, Washington Capitols, Providence Steamrollers, Toronto Huskies, Chicago Stags, St. Louis Bombers, Cleveland Rebels, Detroit Falcons y Pittsburgh Ironmen. Destacando a los Boston Celtics y New York Knicks como ´unicas franquicias que se mantienen desde aquella temporada hasta nuestra actualidad sin haber cambiado sus colores, nombre, ni ciudad. Desde la temporada 2004-05 la NBA cuenta con 30 franquicias, las cuales est´an divididos en dos conferencias: la este y la oeste, cada una compuesta por 15 franquicias, a su vez. Y estas conferencias se dividen en 3 divisiones de 5 franquicias cada una. CONFERENCIA ESTE: Divisi´on atl´antica: New York Knicks, Boston Celtics, New Jersey Nets, Philadelphia 76ers y Toronto Raptors Divisi´on central: Chicago Bulls, Cleveland Cavaliers, Detroit Pistons, Indiana Pacers y Milwaukee Bucks Divisi´on sudeste: Atlanta Hawks, Charlotte Bobcats, Miami Heat, Orlando Magic y Washington Wizards CONFERENCIA OESTE: Divisi´on sudoeste: Dallas Mavericks, Houston Rockets, Memphis Grizzlies, New Orleans Hornets y San Antonio Spurs. Divisi´on noroeste: Denver Nuggets, Minnesota Timberwolves, Portland Trail Blazers, Seattle Supersonics y Utah Jazz. Divisi´on pac´ıfica: Golden State Warriors, Phoenix Suns, Sacramento Kings, Los Angeles Clippers y Los Angeles Lakers. 9 Tal y como se ha comentado, pueden considerarse dos ´ındices: (y1/x)y(y2/x). Los resultados obtenidos al generar estos ´ındices son los siguientes: DMU (unidad) ´ Indice 1 (y1/x) (´ Indice 2 y2/x) A2 3 B2 4 C1 3 D3 2 E4 1 F2 2 Tabla 2.4: Output obtenido por unidad de Input consumida Como puede comprobarse en la tabla 2.4, la DMU E es el que obtiene el mayor rendimiento en lo referente al´ındice 1, pero en lo relativo al´ındice 2 por ejemplo el mejor desempe˜no corresponde a la DMU B, por lo que la frontera eficiente ser´a la que una estos dos puntos.Ninguna DMU situada sobre la frontera eficiente puede, dado el nivel de inputs, mejorar uno de sus outputs sin empeorar el otro. En la Figura 2.2 se han representado los datos contenidos en la tabla anterior. La DMU B es el m´as eficiente en la obtenci´on del output y2, en tanto que la DMU E lo es en el output y1. Figura 2.2: Frontera eficiente para 1 Input y 2 Outputs 16 Las DMUs B y E son eficientes t´ecnicamente, es decir: ETB= 1 y ETE= 1. Dibujando una l´ınea que una todas las unidades eficientes y prolong´andola de forma paralela a los ejes se obtiene la frontera de posibilidades de producci´on (FPP), es decir, el l´ımite entre los niveles de producci´on alcanzables e inalcanzables. Las DMUs (unidades) que permanecen por debajo de la frontera eficiente, que envuelve a aquellos, son calificados como DMUs ineficientes t´ecnicamente. La eficiencia relativa de estas unidades ineficientes puede obtenerse como la relaci´on entre la longitud de la l´ınea desde el origen hasta la unidad considerada y la longitud de la l´ınea que une el origen con el punto proyectado sobre la frontera eficiente. As´ı, por ejemplo, en el caso de la DMU D se tendr´ıa: Eficiencia T´ecnica de DMU D = ETD=OD OD0(2.7) Es decir, la eficiencia t´ecnica de la DMU D es el cociente entre la distancia del punto O al punto D y la distancia del punto O al punto D’ . As´ı, para calcular la eficiencia de D es necesario conocer las coordenadas del punto D’, que se corresponder´a con la intersecci´on entre la recta que pasa por los puntos A y E y la recta que pasa por los puntos O y D. ETD=OD OD0=p(3 −0)2+ (2 −0)2 p(3,23 −0)2+ (2,15 −0)2= 0,802373507 (2.8) La eficiencia de la DMU D es del 80,2 % o, de otra forma, su ineficiencia es del 19,8 %; lo que equivale a decir que la DMU D, para ser eficiente deber´ıa incrementar un 19,8 % las salidas. Operando de forma an´aloga a como se ha hecho con la unidad D, se obtendr´ıan las puntuaciones de eficiencia t´ecnica (relativa) del resto de DMUs. DMU (unidad) Eficiencia t´ecnica (relativa) en % A61,22 B100 C50,38 D80,23 E100 F36,44 Tabla 2.5: Eficiencia relativa para el caso de 1 Input y 2 Output 2.4. Definici´on del conjunto de posibilidades de producci´on La medida de la eficiencia de una unidad mediante la t´ecnica DEA implica dos pasos b´asicos: 17 1. La construcci´on del conjunto de posibilidades de producci´on. 2. La estimaci´on del m´aximo aumento posible del output o de la m´axima disminuci´on posible de los inputs de la unidad dentro del conjuntos de posibilidades de producci´on. El inter´es ahora se centra en determinar el conjunto de procesos productivos que se consideran factibles, a partir de los datos observados. Para ello la forma m´as f´acil de describir los planes de producci´on posibles es enumerar todas las combinaciones de factores y de productos tecnol´ogicamente factibles. El conjunto de estas combinaciones de denominar´a conjunto de producci´on. As´ı, el conjunto de posibilidades de producci´on (CPP) puede definirse como el conjunto de procesos productivos tecnol´ogicamente factibles. Puesto que la tecnolog´ıa no es conocida, la construcci´on del conjunto de posibilidades de producci´on se realizar´a a partir de las combinaciones input-output observadas. Suponiendo un proceso productivo que emplea un conjunto de inputs xpara producir un conjunto de outputs y. Las caracter´ısticas del conjunto de procesos productivos que definen el CPP son: 1. Es tecnol´ogicamente posible no producir ni inputs ni outputs. 2. Si dos procesos productivos pertenecen al CPP, todas sus combinaciones lineales convexas tambi´en pertenecen al CPP. 3. Una unidad productiva es capaz de producir la misma cantidad de output utilizando una cantidad mayor de cualquier input. Es decir, es posible desechar el exceso de inputs sin coste. 4. Una unidad productiva es capaz de producir una cantidad menor de cualquier output utilizando las mismas cantidades de input. 5. Es posible reescalar la actividad de cualquier proceso productivo perteneciente a P. 2.5. Caracterizaci´on de los modelos DEA Los modelos DEA pueden ser clasificados en funci´on de: 1. El tipo de medida de eficiencia que proporcionan: modelos radiales y no radiales. 2. La orientaci´on del modelo: input orientado, output orientado o input-output orientado. 3. La tipolog´ıa de los rendimientos a escala que tiene la tecnolog´ıa de producci´on, entendida ´esta como la forma en que los inputs son combinados para obtener un conjunto de outputs, de tal forma que esa combinaci´on de factores puede tener rendimientos a escala: constantes o variables. Respecto al primer punto, los modelos DEA que se van a tratar, proporcionan medidas de eficiencia de tipo radial (proporcional). Los otros dos puntos son explicados a continuaci´on. 18 2.6. Orientaci´on del modelo La eficiencia puede ser caracterizada con relaci´on a dos orientaciones b´asicas, pudiendo hacer referencia a modelos: 1. Input orientados: buscan, dado el nivel de outputs, la m´axima reducci´on proporcional en el vector de inputs mientras permanece en la frontera de posibilidades de producci´on. Una unidad no es eficiente si es posible disminuir cualquier input sin alterar sus outputs. 2. Output orientados: buscan, dado el nivel de inputs, el m´aximo incremento proporcional de los outputs permaneciendo dentro de la frontera de posibilidades de producci´on. En este sentido una unidad no puede ser caracterizada como eficiente si es posible incrementar cualquier output sin incrementar ning´un input y sin disminuir ning´un otro output. Teniendo en cuenta las orientaciones definidas, una unidad ser´a considerada eficiente si, y solo si, no es posible incrementar las cantidades de output manteniendo fijas las cantidades de inputs utilizadas ni es posible disminuir las cantidades de inputs empleadas sin alterar las cantidades de outputs obtenidas. En la Figura 2.3 se ha representado, el caso de un ´unico input y un ´unico output, y en ella puede verse como la unidad Aes ineficiente, se sit´ua por debajo de la frontera. Figura 2.3: Orientaciones en modelos DEA Desde el punto de vista de un modelo input orientado, la unidad A podr´ıa reducir la cantidad de input xy seguir produciendo la misma cantidad de output y, es decir, la unidad A deber´ıa tomar como referencia la mejor pr´actica de la unidad A1. De igual forma, al considerar la evaluaci´on de la eficiencia a trav´es de modelos outputs orientados, la unidad A ser´ıa calificada como ineficiente. Esta unidad podr´ıa, consumiendo la misma cantidad de input, producir una mayor cantidad de output. Como puede observarse en la Figura 2.3 cabe la posibilidad de considerar una tercera opci´on, correspondiente a los denominados modelos input-output orientados (tambi´en llamados no orien- 19 tados), que buscan simult´aneamente la reducci´on input y el aumento output equiproporcional. En este caso se mide la “distancia hacia la frontera” que representa a la unidad evaluada. 2.7. Tipolog´ıa de los rendimientos a escala Los rendimientos a escala, que indican los aumentos de la producci´on que son el resultado del incremento de los factores de producci´on en el mismo porcentaje, pueden ser constantes, crecientes o decrecientes: 1. Rendimientos constantes a escala: cuando el incremento porcentual del Output es igual al incremento porcentual de los recursos productivos. 2. Rendimientos crecientes a escala: se dice que la tecnolog´ıa exhibe este tipo de rendimientos cuando el incremento porcentual del output es mayor que el incremento porcentual de los factores. 3. Rendimientos decrecientes a escala: cuando el incremento porcentual del output es menor que el incremento porcentual de los inputs. 2.8. Modelos DEA Los modelos DEA se distinguen por la medida de la eficiencia, la orientaci´on del modelo para calcularla y la tipolog´ıa de los rendimientos a escala que caracterizan la frontera eficiente. 2.8.1. Modelo CCR El modelo DEA-CCR, denominado as´ı por haber sido desarrollado por Charnes, Cooper y Rhodes. El modelo proporciona medidas de eficiencia radiales, pudiendo ser input u output orientadas y supone convexidad, fuerte eliminaci´on gratuita de inputs y outputs y rendimientos constantes a escala. El modelo DEA-CCR puede escribirse, en t´erminos generales, de tres formas distintas: fraccional, multiplicativa y envolvente. Aunque solo se ver´a el modelo multiplicativo. El modelo DEA-CCR Input orientado en forma de cociente puede ser linealizado siguiendo la transformaci´on lineal de Charnes y Cooper, que selecciona la soluci´on (µ, δ) para que Pm i=1 δxio. Realizando dicho cambio de variable se obtiene el modelo en forma multiplicativa: Max µ,δ W0=µTy0 Sujeto a: δTx0= 1 µTY+−δTX≤0 µT, δT≥Iε (2.9) donde: 20 1. Yes una matriz de outputs de orden (sxn)      y11 y12 · · · y1n y21 y22 · · · y2n . . .. . ..... . . ys1ys2· · · ysn      2. y0representa el vector Output de la Unidad que est´a siendo evaluada 3. Xes una matriz de inputs de orden (mxn)      x11 x12 · · · x1n x21 x22 · · · x2n . . .. . ..... . . xm1xm2· · · xmn      4. x0representa el vector inputs de la Unidad que est´a siendo evaluada 5. µes el vector (sx1) de pesos outputs y δes el vector (mx1) de pesos inputs La unidad ser´a calificada de eficiente si w∗ 0= 1 y existe al menos un ´optimo (µ∗, δ∗) con µ∗>0 yδ∗>0 2.8.2. Modelo BCC El modelo DEA-BCC, as´ı denominado por haber sido desarrollado por Banker, Charnes y Cooper. Si el modelo DEA-CCR consideraba rendimientos constantes a escala, el modelo DEABCC relaja este supuesto, que en gran parte de las ocasiones resulta excesivamente restrictivo y por tanto irreal, permitiendo que la tipolog´ıa de rendimiento a escala que en un momento determinado caracterice la tecnolog´ıa sea variable, esto es: constante, creciente o decreciente. De lo dicho puede desprenderse que los fundamentos del modelo DEA-BCC se encuentran en el modelo DEA-CCR, puesto que el primero es una extensi´on del segundo. Modelo BCC Input orientado El modelo DEA-BCC es realmente una extensi´on del modelo DEA-CCR. Por tanto, su formulaci´on es similar. La diferencia fundamental entre el modelo DEA-CCR y DEA-BCC es que ´este introduce el supuesto de rendimientos variables a escala y el anterior considera rendimientos constantes a escala. El objetivo del modelo DEA-BCC Input orientado es hallar un hiperplano que permaneciendo por encima de todas las unidades, minimice la distancia horizontal desde dicho hiperplano a la unidad. 21 La forma multiplicativa del modelo, obtenida de nuevo al aplicar la transformaci´on realizada por Charnes y Cooper sobre el modelo fraccional, puede expresarse matricialmente de la siguiente forma: Max µ,δ,k W0=µTy0+k0 Sujeto a: δTx0= 1 µTY+k0≤δTX µT, δT≥Iε k0no restringida (2.10) La Unidad evaluada ser´a calificada de eficiente si w∗ 0= 1 y existe al menos un ´optimo (µ∗, δ∗) con µ∗>0yδ∗>0. El valor k∗ Aes usado para identificar el tipo de rendimiento a escala en el que opera localmente la unidad evaluada. Tambi´en es posible, a partir de los valores ´optimos de los pesos o multiplicadores de inputs y outputs, determinar los porcentajes de contribuci´on input/output. Si se compara el problema dado en el modelo 2.10 con el modelo 2.9 se puede observar como la definici´on de la medida de eficiencia bajo el supuesto de rendimiento variables a escala, W0=µTy0+k0, es similar a aquella que supone rendimientos constantes a escala W0=µTy0. La ´unica diferencia entre ambas es que para el segundo caso se le suma un t´ermino constante k0 (que en el supuesto de rendimientos contantes toma el valor cero). De tal manera que si la soluci´on ´optima del modelo 2.10 para la DMU, que se supone eficiente: k∗ 0>0 para todas las soluciones ´optimas, prevalecen rendimientos crecientes a escala. k∗ 0= 0 para cualquier soluci´on ´optima, prevalecen rendimientos constantes a escala. k∗ 0<0 para todas las soluciones ´optimas, prevalecen rendimientos decrecientes a escala. Modelo BCC Output orientado Si,por el contrario, se quiere evaluar la eficiencia de una unidad desde el punto de vista de la maximizaci´on de los outputs, dado el nivel de inputs, debe recurrirse al modelo DEA-BCC output orientado. Un cambio en la orientaci´on del modelo pr´acticamente equivale a invertir el cociente entre el output virtual (output total) y el input virtual (input total). Linealizando el modelo DEA-BCC output orientado con forma de cociente se obtiene el modelo en forma multiplicativa: 22 Max µ,δ,k W0=δTx0+k0 Sujeto a: µTy0= 1 δTX+k0≥µTY µT, δT≥Iε k0no restringida (2.11) La eficiencia t´ecnica Output pura de la Unidad0 vendr´a dada por 1 w∗ 0, de tal forma que ´esta ser´a eficiente si w∗ 0= 1. Como suced´ıa con el modelo DEA-BCC Input orientado, el signo que tome k (positivo, negativo o nulo) en la soluci´on ´optima indica el tipo de rendimiento a escala para una unidad. Sin embargo, a diferencia del modelo 2.10, en el modelo 2.11 el t´ermino constante se encuentra asociado con el valor input y su signo est´a invertido, de tal forma que: k∗ 0>0 para todas las soluciones ´optimas, prevalecen rendimientos decrecientes a escala. k∗ 0= 0 para cualquier soluci´on ´optima, prevalecen rendimientos constantes a escala. k∗ 0<0 para todas las soluciones ´optimas, prevalecen rendimientos crecientes a escala. 2.8.3. Modelo Aditivo Es un modelo que considera problemas que operan con retornos de escala variables. Fue introducido por primera vez por Charnes y m´as tarde fue elaborado por Banker. La diferencia principal del modelo aditivo con los modelos BCC y CCR recae en que se utiliza una m´etrica rectangular en lugar de la radial utilizada por los anteriores. Ya sea orientaci´on de entrada o salida siempre se maximizan las holguras, y por tanto el modelo aditivo no distingue dichos tipos de orientaciones. Las unidades eficientes en el modelo BCC resultan eficientes si se utiliza el modelo aditivo y viceversa. Sin embargo, cuando una unidad resulta ineficiente, las fuentes de ineficiencia y su importancia detectadas por el modelo BCC, se diferencian de las encontradas por el modelo aditivo. La raz´on de ello se debe a la diferente m´etrica utilizada por ambos m´etodos para la evaluaci´on de la eficiencia. Una ventaja de este modelo es la de ser invariante frente a traslaciones. Las traslaciones son necesarias cuando, por ejemplo, alguna de las variables (entradas o salidas) puede tomar valores negativos. En estos casos, resulta conveniente el empleo del modelo aditivo. 23 El dual de este modelo es el siguiente: Max s X k=1 vkjykj − m X i=1 uijxij +ζ Sujeto a: s X k=1 vkjykj − m X i=1 uijxij +ζ≤0j= 1,2, ..., n ukj ≥1j= 1,2, ..., s vkj ≥1i= 1,2, ..., m (2.12) 24 2.9. An´alisis en Componentes Principales El An´alisis en componentes Principales(PCA) es una t´ecnica de an´alisis de datos multivariantes cuyo problema central es la reducci´on de la dimensionalidad: si es posible describir con precisi´on los valores de p variables por un peque˜no subconjunto k < p de ellas, se habr´a reducido la dimensi´on del problema a costa de una peque˜na perdida de informaci´on. El PCA pertenece a la familia de t´ecnicas conocida como Aprendizaje no supervisado, en los que el objetivo no es predecir el valor de la respuesta Y no se tiene en cuenta ya que el objetivo no es predecir Y, si no extraer informaci´on empleando los predictores, por ejemplo, para identificar subgrupos. El an´alisis de componentes principales tiene el siguiente objetivo: dadas n observaciones de p variables, se analiza si es posible representar adecuadamente esta informaci´on con un n´umero menor de variables construidas como combinaciones lineales de las originales. Tiene dos utilidades: Permite representar ´optimamente en un espacio de dimensi´on peque˜na observaciones de un espacio general p-dimensional. En este sentido, componentes principales es el primer paso para identificar las posibles variables latentes, o no observadas que generan los datos. Permite transformar las variables originales, en general correladas, en nuevas variables incorreladas, facilitando la interpretaci´on de los datos Sup´ongase que existe una muestra con n individuos cada uno con p variables (X1, X2, . . . , Xp), es decir, con p dimensiones. El PCA permite encontrar un n´umero de factores k, con (k < p), que explican aproximadamente lo mismo que las p variables originales. Donde antes se necesitaban p valores para caracterizar a cada individuo, ahora bastan k valores. Cada una de estas k nuevas variables recibe el nombre de componente principal. 2.9.1. C´alculo de las componentes principales En el an´alisis de componentes principales se dispone de una muestra de tama˜no n acerca de p variables X1, X2, ..., Xpinicialmente correladas, para despu´es obtener un n´umero k de variables incorreladas, con k <=p,Z1, Z2, ..., Zk, las cuales son combinaci´on lineal de las variables iniciales y que expliquen la mayor parte o la totalidad de su variabilidad. La primera componente principal, al igual que todas las restantes, es la combinaci´on lineal normalizada de dichas variables. Esta se diferencia de las dem´as por ser la que tiene mayor varianza: Z1i=φ11X1i+φ21X2i+· · · +φp1Xpi (2.13) La ecuaci´on puede expresarse de forma abreviada como Z1=Xφ1y matricialmente como:      Z11 Z12 . . . Z1n      =     X11 X21 · · · Xp1 X12 X22 · · · Xp2 . . .. . ..... . . X1nX2n· · · Xpn           φ11 φ12 . . . φ1p      (2.14) 25 En la base de datos boxsxores basic.cav se dispone de los siguientes atributos, sp, fg, fga, fg3, fg3a, ft, fta, orb, drb, trb, ast, stl, blk, tov, pf, pts, plus minus, descriptos en la secci´on 3.1. Debido a que se dispone de demasiadas variables, es necesario realizar una reducci´on de la dimensionalidad para as´ı poder eliminar variables irrelevantes que no aportan informaci´on, poder reducir la complejidad del modelo y disminuir el coste computacional. Para ello se decidi´o emplear la t´ecnica aprendida en la asignatura de An´alisis de Datos, el An´alisis en Componentes Principales, esta t´ecnica nos permite disminuir el n´umero de variables disponibles sacrificando para ello la perdida de un porcentaje de la informaci´on explicada por las variables. Para ello se decide quedarse solo con un 90 % de la variabilidad explicada con las 17 variables disponibles. Permiti´endonos reducir los outputs de 17 atributos a 4 dimensiones o outputs, aunque seg´un el caso a analizar podr´ıan ser 3 o 5 dimensiones tambi´en. Por lo tanto ya se dispone de nuestros 2 inputs (Salario y segundos jugados) y nuestros outputs, correspondientes a las dimensiones extra´ıdas mediante el PCA. 32 CAP´ ITULO 4 Programa 4.1. Tecnolog´ıa Python En t´erminos t´ecnicos, Python es un lenguaje de programaci´on de alto nivel, orientado a objetos, con una sem´antica din´amica integrada, principalmente para el desarrollo web y de aplicaciones inform´aticas. Python es relativamente simple, por su facilidad de aprendizaje, ya que requiere una sintaxis ´unica que se centra en la legibilidad. Los desarrolladores pueden leer y traducir el c´odigo Python mucho m´as f´acilmente que otros lenguajes. Adem´as, soporta el uso de m´odulos y paquetes, lo que significa que los programas pueden ser dise˜nados en un estilo modular y el c´odigo puede ser reutilizado en varios proyectos. Una vez se ha desarrollado un m´odulo o paquete, se puede escalar para su uso en otros proyectos, y es f´acil de importar o exportar. Por otro lado, uno de los beneficios m´as importantes de Python es que tanto la librer´ıa est´andar como el int´erprete est´an disponibles gratuitamente, tanto en forma binaria como en forma de fuente. Tampoco hay exclusividad, ya que Python y todas las herramientas necesarias est´an disponibles en todas las plataformas principales,por lo tanto, es una opci´on multiplataforma. 4.2. Descripci´on de las librerias utilizadas 4.2.1. Numpy NumPy es un paquete de Python que significa “Numerical Python”, es la librer´ıa principal para la inform´atica cient´ıfica, proporciona potentes estructuras de datos, implementando matrices y matrices multidimensionales. Incorpora una nueva clase de objetos llamados arrays que permite representar colecciones de datos de un mismo tipo en varias dimensiones, y funciones muy eficientes para su manipulaci´on. 4.2.2. Pandas Pandas es una librer´ıa de c´odigo abierto de Python que proporciona herramientas de an´alisis y manipulaci´on de datos de alto rendimiento utilizando sus potentes estructuras de datos. El nombre de Pandas se deriva del t´ermino “Panel Data” y es la librer´ıa de an´alisis de datos de Python. 33 Las principales caracter´ısticas de esta librer´ıa son: Define nuevas estructuras de datos basadas en los arrays de la librer´ıa NumPy pero con nuevas funcionalidades. Permite leer y escribir f´acilmente ficheros en formato CSV, Excel y bases de datos SQL. Permite acceder a los datos mediante ´ındices o nombres para filas y columnas. Ofrece m´etodos para reordenar, dividir y combinar conjuntos de datos. Realiza todas estas operaciones de manera muy eficiente. 4.2.3. Scipy Scipy es una biblioteca de c´odigo abierto de herramientas y algoritmos matem´aticos. Contiene m´odulos para optimizaci´on, ´algebra lineal, integraci´on, interpolaci´on, funciones especiales, FFT, procesamiento de se˜nales e imagen, resoluci´on de EDOs y otras tareas relacionadas con la ciencia e ingenier´ıa. Est´a dirigida al mismo tipo de usuarios que los de aplicaciones como MATLAB, GNU Octave, y Scilab. En este proyecto se usar´a esta librer´ıa para resolver los problemas de programaci´on lineal que se plantean a la hora de realizar los algoritmos DEA. 4.2.4. Sklearn Sklearn es una librer´ıa de python para Machine Learning y An´alisis de Datos. Est´a basada en NumPy, SciPy y Matplotlib. La ventajas principales de Sklearn son su facilidad de uso y la gran cantidad de t´ecnicas de aprendizaje autom´atico que implementa. Se usar´a esta librer´ıa para calcular el modelo PCA y extraer las componentes principales necesarias correspondientes a los Outputs del an´alisis DEA. 4.3. Descripci´on de los procesos 4.3.1. read calendar Dicha funci´on consiste en la lectura de la columna date para todas las filas del archivo ’boxscores basic.csv’. Tras ordenar las fechas cronol´ogicamente, comprueba para cada partido/fila si la diferencia en d´ıas con el siguiente partido/fila es mayor de 90 d´ıas. Si es as´ı, se ha encontrado el ´ultimo partido de una temporada y el primer partido de la siguiente, por lo que se almacena la fecha intermedia de ambas, indicando que todos los partidos inferiores a esa fecha corresponden a una temporada, y todos los partidos superiores a esa fecha corresponden a la siguiente. 4.3.2. princomp La funci´on recibe un array con n columnas y un porcentaje p con valores entre 0 y 1. Y devuelve un array con las m componentes principales correspondientes al PCA de los datos con al menos un p % de la variabilidad explicada. 34 4.3.3. read salary La funci´on accede a las p´aginas web de ESPN [4] correspondientes a los a˜nos 2019 y 2020, descarga las tablas con los salarios de los jugadores para esos y a˜nos y los guarda en un archivo CSV. 4.3.4. reduce data Esta funci´on filtra la base de datos boxscore basic.csv, qued´andose solo con los partidos superiores a la fecha 24/08/1996, las filas correspondientes a los partidos completos y las filas en las que los jugadores al menos hab´ıan disputado un segundo del partido. Guardando el resultado en un nuevo fichero llamado bs basic.csv. 4.3.5. filter data Esta funci´on realiza un primer filtrado de las estad´ısticas y salarios de los jugadores en funci´on del equipo temporada o jugador pasados como par´ametros, qued´andose solo con las filas que contienen dichos valores. Una vez filtrado, agrupa las estad´ısticas por jugador y extrae las columnas correspondientes a los segundos jugados y al salario de cada jugador y lo guarda en un array. Con las columnas correspondientes a las estad´ısticas restantes realiza un PCA y guarda las componentes principales en otro array. Finalmente, la funci´on devuelve el primer array con los inputs, el segundo array con los outputs y un tercer array con los nombres de los jugadores a analizar. 4.3.6. BCC IO Esta funci´on recibe dos arrays, uno para los inputs y otro para los ouputs. Transforma los arrays en los problemas de programaci´on lineal bas´andose en el modelo BCC con orientaci´on input 2.10 realizando una iteraci´on para cada DMU. Y finalmente, devuelve un array con la eficiencia de cada DMU. 4.3.7. BCC OO Esta funci´on recibe dos arrays, uno para los inputs y otro para los ouputs. Transforma los arrays en los problemas de programaci´on lineal bas´andose en el modelo BCC con orientaci´on output 2.11 realizando una iteraci´on para cada DMU. Y finalmente, devuelve un array con la eficiencia de cada DMU. 4.3.8. CCR Esta funci´on recibe dos arrays, uno para los inputs y otro para los ouputs. Transforma los arrays en los problemas de programaci´on lineal bas´andose en el modelo CCR 2.9 realizando una iteraci´on para cada DMU. Y finalmente, devuelve un array con la eficiencia de cada DMU. 35 4.3.9. Additive Esta funci´on recibe dos arrays, uno para los inputs y otro para los ouputs. Transforma los arrays en los problemas de programaci´on lineal bas´andose en el modelo Additive 2.9 realizando una iteraci´on para cada DMU. Y finalmente, devuelve un array con la eficiencia de cada DMU. 4.3.10. DEA models Esta funci´on recibe 3 arrays, uno para los inputs, otro para los outputs y otro con los nombres de las DMU. Llama a las funciones BCC IO,BCC OO, CCR y Additive y muestra por pantalla un informe con los resultados de las eficiencias de dichos m´etodos. 36 CAP´ ITULO 5 Ejemplo de los resultados para un caso concreto En este cap´ıtulo se va a tratar de observar como funciona por dentro los procesos Python para un caso concreto, para ello se ha elegido el caso en el que se analizan los jugadores del equipo LAL (Los Angeles Lakers) para la temporada 2019. Lo primero que se hace es llamar a la funci´on filter data, pas´andole los par´ametros season=2019 y team=”LAL”. Esta funci´on leer´a los ficheros bs basic.csv, que contiene las estad´ısticas de los jugadores y all salaries.csv, que contiene los salarios. Realiza un filtrado de los datos qued´andose solo con las filas correspondientes a dicha temporada y equipo, pasando de tener 617.837 filas a tan solo 705 filas en el fichero bs basic y de 12.866 filas a 17 filas en el de all salaries, como se puede observar en las Figuras 5.1 y 5.2. Figura 5.1: Salarios filtrados por equipo y temporada 37 Figura 5.2: Estad´ısticas de los jugadores filtradas por partido, equipo y temporada Como se necesitan las estad´ısticas a nivel de temporada y no a nivel de partido, se agrupan las filas por temporada, a˜no y jugador y se suman todos los atributos qued´andonos con solo 17 filas como se puede ver en la Figura 5.3. Figura 5.3: Estad´ısticas totales por temporada para cada jugador Una vez filtrados ambos ficheros se realiza una uni´on de ambos, qued´andonos con los jugadores que tienen tanto salario como estad´ısticas, ya que se puede dar el caso como con los jugadores David Stockton, Dion Waiters o JR Smith que se ha obtenido su salario pero no se tiene estad´ısticas de esa temporada, por no haber jugado o porque no ven´ıan en los datos que se nos han proporcionado. Y lo mismo pero al rev´es, los jugadores Kostas Antetokounmpo, Zach Norvell y Troy Daniels tienen estad´ısticas pero no se tiene su salario anual. Una vez descartados dichos jugadores se tiene un total de 14 jugadores o DMU’s como se puede ver a continuaci´on: 38 Figura 5.4: Jugadores finales sobre los que se realiza el estudio Lo primero que se realizar´a es obtener los inputs para cada jugador, seleccionando las variables sp y salary y realizando una normalizaci´on de ambas variables dividiendo ambas por su media, tomando as´ı la media total de ambas valor 1. Figura 5.5: Inputs, sp y salary 39 Figura 5.6: Inputs, sp y salary normalizados Posteriormente se obtienen los outputs, seleccionando el resto de variables disponibles, fg, fga, fg3, fg3a, ft, fta, orb, drb, trb, ast, stl, blk, tov y plus minus y realizando sobre ellas un an´alisis en componentes principales para reducir su dimensionalidad. Se obtiene una reducci´on de la dimensionalidad pasando de 14 variables a tan solo 3 componentes, de las cuales la primera tiene un 70,63 % de la variabilidad explicada, la segunda un 8,5 con un 94 % y un 4,87 % la ´ultima. Dej´andonos un total el 94,07 % de la variabilidad explicada. Figura 5.7: Componentes principales extra´ıdas en el ejemplo El an´alisis en componentes principales devuelve los valores centrados en el origen, por lo que hay valores positivos y negativos en todas las componentes. Por lo que se tiene el problema de 40 que el an´alisis DEA no acepta valores negativos o nulos. Teniendo en cuenta la invarianza del an´alisis DEA respecto a cambios de localizaci´on no hay ninguna p´erdida de informaci´on al realizar una traslaci´on en cada uno de los ejes o componentes del ACP, sumando a todas las proyecciones de los individuos una cantidad constante, de modo que los valores finales sean todos positivos. Esta cantidad ser´a el valor m´ınimo de cada componente + 1, para que as´ı los valores sean estrictamente mayores que cero. Figura 5.8: Componentes principales tras realizar la traslaci´on Finalmente se llama a la funci´on DEA models(), que a su vez llama a las funciones que calculan los modelos CCR, BCC IO y BCC OO y termina mostr´andonos los resultados por pantalla junto a la media de estos resultados para cada DMU. Se muestra un ejemplo del funcionamiento de la funci´on que analiza el modelo BCC IO para los datos de este ejemplo. Teniendo todos los inputs (X) y outputs (Y), y los inputs y outputs correspondientes a la DMU Alex Caruso LAL 2019, respectivamente, XAeYa: X=0,983 1,799 1,130 1,456 1,136 0,974 0,296 1,527 · · · 0,005 0,343 3,381 0,595 1,826 0,202 0,499 0,202 1,009 · · · 0,112 Y=  4,191 10,944 4,114 5,950 5,764 4,969 1,631 5,230 · · · 1,000 2,646 5,644 2,119 1,635 6,607 5,960 3,269 1,967 · · · 3,459 3,031 2,708 3,002 4,480 2,366 2,829 2,087 3,235 · · · 1,794   XA=0,983 0,343, YA=  4,191 2,646 3,031   41 [13] Docs Spict. Linprog Function https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html [14] EL An´alisis Envolvente de Datos (DEA). Universidad de Alicante https://rua.ua.es/dspace/bitstream/10045/19658/6/Materiales.Teoria.Bloque.III.pdf [15] The LateX Project https://www.latex-project.org/ [16] Overleaf https://es.overleaf.com/ Todos los enlaces han sido verificados por ´ultima vez el d´ıa 6 de Julio de 2021. 48 CAP´ ITULO 8 Anexo: C´odigo 8.1. merge calendars() def merge calendars ( ) : e x c e l s a l a r i e s = pd . read csv ( ’ p l a y e r S a l a r i e s . csv ’ ) e x c e l s a l a r i e s = e x c e l s a l a r i e s [ [ ”Player Name” , ” Salary ” , ”Season Start ” , ”Team” ] ] e x c e l s a l a r i e s . columns = [ ” player ” , ” s a lary ” , ” season ” , ” team id ” ] web sa l ar i es = pd . read csv ( ’ s al a rie s we b . csv ’ ) we b sa l ar i es = we b sa l ari e s [ [ ” Player ” , ” Salary ” , ” Season” , ”team” ] ] w e b s al ar i es . columns = [ ” pla yer ” , ” s al ary ” , ” season ” , ” team id ” ] a l l s a l a r i e s = e x c e l s a l a r i e s . merge ( web salari es , how=’ outer ’ ) a l l s a l a r i e s . to c s v ( ’ a l l s a l a r i e s . csv ’ , index=False ) 8.2. read calendar() def read calendar (): a l l d a t a = pd . read csv ( ” boxscores 1969 2020 / bs ba sic . csv ” , u s e c ol s =[” date ” ] ) a l l d a t a = a l l d a t a . s o r t v a l u es ( ” date ” ) . d rop duplicates ( ) . r e s et i n de x ( ) a l l d a t a . date = pd . to datetime ( a l l d a t a . date ) cale ndar s easo n = pd . DataFrame ( columns=[” s t a r t s e a s o n ” , ” end season ” ] ) c a l e n d s t a r t = [ a l l d a t a . i l o c [ 0 ] . date −timedelta ( days =1)] for iin a l l d a t a . index −1: end season = a l l d a t a . i l o c [ i ] . date s t a r t s e a s o n = a l l d a t a . i l o c [ i + 1 ] . date d i f f = ( s t a r t s e a s o n −end season ) . days i f diff >90: print( d i f f ) print( end season , s t a r t s e a s o n ) c a l e n d s t a r t . append ( end season + ( s t a r t s e a s o n −end season ) / 2) c a l e n d s t a r t . append ( a l l d a t a . i l o c [ −1 ]. date + timed elta ( days =1)) 49 for idx in range(len (calend start) −1 ) : season name = c a l e n d s t a r t [ idx ] . s t r f t i m e ( ” %Y” ) # + c a l e n d s t a r t [ idx + 1 ] . s t r f t i m e(” %Y”) calendar sea son . loc [ season name ] = [ c a l e n d s t a r t [ idx ] . s t r f t i m e ( ” %d/ %m/ %Y” ) , c a l e n d s t a r t [ idx + 1 ] . s t r f t i m e ( ” %d/ %m/ %Y” ) ] c al end a r s easo n . r e s e t i n d e x ( i n place=True ) calendar sea son = c alendar season . rename ( columns={’ index ’ : ’ season ’ }) 8.3. read salary() def re a d sal a r y ( ) : a l l s a l a r i e s = pd . DataFrame () for year in range (2019 , 2021): end = False page = 1 while not end : web = f ’ http ://www. espn . com/nba/ s a l a r i e s / / year / ’ \ f ’ {year }/page /{page}/ seasontype /3/ ’ table = pd . read html (web) # Lee l a s t a b l a s de l a pagina web table = table [ 0 ] # Se queda con l a primera t a b l a table . columns = t able . i l o c [ 0] # Asigna la primera f i l a como nombre de la s columnas table = table . i l o c [ 1 : , 1 : ] # Elimina l a primera f i l a # Transforma l a s columnas des e sta t a b l a y l a s a a d e al t o t a l i f not table . empty : table [ ”Season” ] = str (year −1) table . columns = [ ” Player ” , ”Team” , ” Salary ” , ”Season” ] a l l s a l a r i e s = a l l s a l a r i e s . append ( table ) page += 1 else : end = True a l l s a l a r i e s = a l l s a l a r i e s [ a l l s a l a r i e s . Player != ”NAME” ] a l l s a l a r i e s . Salary = a l l s a l a r i e s . Salary . replace ({”\\$” : ”” , ” , ” : ”” }, regex=True ) a l l s a l a r i e s . Player = a l l s a l a r i e s . Player . replace ( {” , PG” : ”” , ” , PF” : ”” , ” , C” : ”” , ” , SF” : ”” , ” , SG” : ”” , ” , G” : ”” , ” , F” : ”” }, regex=True ) a l l s a l a r i e s . r e s e t i n d e x ( i n plac e=True , drop=True ) # Lee e l f i c h e r o teams que co ntiene l o s pares nombre equipo −s i g l a s equipo teams = pd . re ad csv ( ”teams . csv ” ) f i n a l s a l a r i e s = pd . merge ( a l l s a l a r i e s , teams , l e f t o n=”Team” , r igh t o n=” f u ll te am ” ) f i n a l s a l a r i e s . to c s v ( ’ sa l ari e s w e b . csv ’ , index=False ) 50 8.4. reduce data() def reduce data ( ) : calendar = pd . read csv ( ” cal end ar s eas on . csv ” ) ca lenda r . s t a r t s e a s o n = pd . to datetime ( calendar . s t a r t s e a s o n ) calendar . end season = pd . to datetime ( calendar . end season ) data = pd . read csv ( ’ boxscores 1969 2020 / b o x scores bas i c . csv ’ ) # , nrows=100) data . date = pd . to datetime ( data . date ) data = data [ data . date >”24/08/1996”] data = data [ data . box type == ”game−basic”] data = data [ data .sp >0 ] data = data [ [ ”team id ” , ” date” , ” player ” , ”sp” , ” fg ” , ” fga ” , ” fg3 ” , ” fg3a ” , ” f t ” , ” f ta ” , ”orb” , ”drb” , ” trb ” , ” ast ” , ” s t l ” , ” blk ” , ”tov” , ” pf ” , ” pts ” , ” plus minus ” ] ] data . plus minus = data . plus minus . f i l l n a (0) data [ ” season ” ] = 0 for , row in calendar . iterro w s ( ) : data . loc [ ( data . date <row . end season ) & ( data . date >row . s t a r t s e a s o n ) , ” season ” ] = row . season data . to csv ( ” boxscores 1969 2020 / bs bas i c . csv ” , index=False ) 8.5. filter data() def f i l t e r d a t a ( team=None , season=None , player=None ) : data = pd . re ad csv ( ” boxscores 1969 2020 / b s b a sic . csv ” ) s a l a r i e s = pd . read csv ( ’ a l l s a l a r i e s . csv ’ ) group = [ ” player ” ] i f team and season and player : print( ” e rr or ” ) e x i t (−1) i f team : data = data [ data . team id == team ] s a l a r i e s = s a l a r i e s [ s a l a r i e s . team id == team ] i f data . empty : print( ” e rr or team” ) e x i t (−1) else : group . append ( ” team id ” ) i f season : data = data [ data . season == season ] s a l a r i e s = s a l a r i e s [ s a l a r i e s . season == season ] i f data . empty : print( ” e rr or season ” ) e x i t (−1) 51 else : group . append ( ” season ” ) i f player : data = data [ data . player == player ] s a l a r i e s = s a l a r i e s [ s a l a r i e s . player == player ] i f data . empty : print( ” e rr or playe r ” ) e x i t (−1) data end = data . groupby ( [ ” team id ” , ” season ” , ” pl ayer ” ] ) [ ”sp” , ” fg ” , ” fga ” , ” fg3 ” , ” fg3a ” , ” f t ” , ” f t a ” , ”orb ” , ”drb” , ” trb ” , ” ast ” , ” s t l ” , ” blk ” , ” tov” , ” pf ” , ” pts ” , ” plus minus ” ] . apply( lambda x : x . astype ( float ) .sum( ) ) data end . r e s e t i n d e x ( in place=True ) a l l d a t a = data end . merge ( s a l a r i e s , on=[ ’ player ’ , ’ season ’ , ’ team id ’ ] , how=’ in ner ’ ) . s o r t v a l u e s ( ” season ” ) names DMU = ( a l l d a t a . player + ” ” + a l l d a t a . team id + ” ” + a l l d a t a . season . astype ( str ) ) . t o l i s t () x = a l l d a t a [ [ ’ sp ’ , ’ s ala ry ’ ] ] x = x / x . mean () x = np . array ( x ) .T y = a l l d a t a [ [ ” fg ” , ” fga ” , ” fg3 ” , ” fg3a ” , ” f t ” , ” f ta ” , ”orb” , ”drb” , ” trb ” , ” ast ” , ” s t l ” , ” blk ” , ” tov” , ” plus minus ” ] ] y = princomp . princomp (y , 0. 9 ) y = np . array ( y ) .T return x , y , names DMU 8.6. princomp() def princomp ( data , percentage ) : # Normalizamos los datos s c a l e r = StandardScaler () s c a l e r . f i t ( data ) x scale d = s c a l e r . transform ( data ) # Instanciamos obj e t o PCA y aplicamos pca = PCA( n components=percentage ) # Obtenemos l o s componentes p r i n c i p a l e s pca . f i t ( x s c a led ) # Convertimos nuestro s datos con l a s nuevas dimensiones de PCA x pca = pca . transform ( x s c a led ) expl = pca. explained variance ratio print( expl ) print( ’suma : ’ , sum( expl )) # Cambiamos e l nombre de l a s columnas columns = [ ’PC ’ + str ( s ) for sin l i s t (range(1 , len ( expl ) + 1 ) ) ] 52 x pca2 = pd . DataFrame( x pca , index=data . index , columns=columns ) x pca end = x pca2 −x pca2 .min() + 1 return x pca end 8.7. BCC IO() def BCC IO(x , y ) : n input , total dmu = x . shape m output , = y . shape Z = np . zero s ( total dmu ) A ub = np . concatenate ( (np . matrix ( y .T) , np . matrix(−x .T) , np . ones ( ( total dmu , 1 ) ) ) , a xis =1) b ub = np . zeros (( total dmu , 1)) b eq = 1 lb = np . concatenate (( np . zeros (( n input + m output , 1)) , [[ −np . i n f ] ] ) ) ub = np . array ( [ [ None ] ] ∗( n input + m output + 1)) bounds = np . concatenate (( lb , ub ) , axis =1) for dmu in range(total dmu ): print(dmu, total dmu ) f = np . concatenate ( (np . matrix(−y [ : , dmu] ) , np . zeros ((1 , n input ) ) , [ [ −1 ] ] ) , a xis =1) A eq = np . concatenate ( (np . zeros ((1 , m output ) ) , np . matrix (x [ : , dmu] ) , np . z e ro s ( ( 1 , 1 ) ) ) , axis =1) z = linprog ( f , A ub=A ub , b ub=b ub , A eq=A eq , b eq=b eq , bounds=bounds , method=’ simplex ’ ) Z [dmu] = −z . fun return Z 8.8. BCC OO() def BCC OO(x , y ) : n input , total dmu = x . shape m output , = y . shape Z = np . zero s ( total dmu ) A = np . concatenate ( (np . matrix ( y .T) , np . matrix(−x .T) , np . ones ( ( total dmu , 1 ) ) ) , a xis =1) b = np . zero s ( ( total dmu , 1)) beq = 1 53 lb = np . concatenate (( np . zeros ( ( n input + m output , 1)) , [[ −np . i n f ] ] ) ) ub = np . array ( [ [ None ] ] ∗( n input + m output + 1)) bounds = np . concatenate (( lb , ub ) , axis =1) for dmu in range(total dmu ): f = np . concatenate ( (np . z er os ( (1 , m output ) ) , np . matrix (x [ : , dmu] ) , [ [ −1 ] ] ) , a xis =1) Aeq = np . concatenate ( (np . matrix ( y [ : , dmu ] ) , np . z eros ( (1 , n input ) ) , np . zero s ( ( 1 , 1 ) ) ) , axis =1) z = linprog ( f , A ub=A, b ub=b , A eq=Aeq , b eq=beq , bounds=bounds , method=’ simplex ’ ) Z [dmu] = 1 / z . fun return Z 8.9. CCR() def CCR(x , y ) : n input , total dmu = x . shape m output , = y . shape Z = np . z eros ( total dmu ) A ub = np . concatenate (( np . matrix (y .T) , np . matrix(−x .T) ) , axis =1) b ub = np . zeros (( total dmu , 1)) b eq = 1 lb = np . array (( np . zer os (( n input + m output , 1 ) ) ) ) ub = np . array ( [ [ None ] ] ∗( n input + m output )) bounds = np . concatenate (( lb , ub ) , axis =1) for dmu in range(total dmu ): f = np . concatenate (( np . matrix(−y [ : , dmu] ) , np . zer os ((1 , n input ) ) ) , axis =1) A eq = np . concatenate (( np . zero s ((1 , m output ) ) , np . matrix (x [ : , dmu] ) ) , axis =1) z = linprog ( f , A ub=A ub , b ub=b ub , A eq=A eq , b eq=b eq , bounds=bounds , method=’ simplex ’ ) Z [dmu] = −z . fun return Z 8.10. Additive() def Additive (x , y ) : n input , total dmu = x . shape m output , = y . shape Z = np . z eros ( total dmu ) 54 A ub = np . concatenate ( (np . matrix ( y .T) , np . matrix(−x .T) , −np . ones ( ( total dmu , 1 ) ) ) , a xis =1) b ub = np . zeros (( total dmu , 1)) lb = np . concatenate (( np . ones (( n input + m output , 1 )) , [[ −np . i n f ] ] ) ) ub = np . array ( [ [ None ] ] ∗( n input + m output + 1)) bounds = np . concatenate (( lb , ub ) , axis =1) for dmu in range(total dmu ): f = np . concatenate (( np . matrix(−y [ : , dmu] ) , np . matrix (x [ : , dmu] ) , [ [ 1 ] ] ) , axis =1) z = linprog ( f , A ub=A ub , b ub=b ub , bounds=bounds ) s o l = z . x u = s o l [ 0 : m output ] v = s o l [ m output : m output + n input ] v0 = s o l [ n input + m output ] Y = u .T. dot (y [ : , dmu] ) X = v .T. dot ( x [ : , dmu] ) e f f = Y / (X + v0 ) e f f = round( e f f ∗100000) / 100000 Z [dmu] = e f f return Z def CCR(x , y ) : n input , total dmu = x . shape m output , = y . shape Z = np . zero s ( total dmu ) A ub = np . concatenate (( np . matrix (y .T) , np . matrix(−x .T)) , axi s =1) b ub = np . zeros (( total dmu , 1)) 8.11. DEA models() def DEA models(x , y , DMU names ) : r e s u l t 1 = BCC IO(x , y ) r e s u l t 2 = BCC OO(x , y ) r e s u l t 3 = CCR(x , y) r e s u l t 4 = Additive (x , y ) f i n a l r e s u l t = pd . DataFrame ( [ result1 , res ult2 , r esult3 , r e su lt 4 ] , columns=DMU names, index =[”BCC IO” , ”BCC OO” , ”CCR” , ” Additive” ] ) print(final result) f i n a l r e s u l t . to c s v ( ” f i n a l r e s u l t . csv ” , decimal=” , ” , f lo a t f o rma t=’ %.3 f ’ ) 55