pccpy 0.4.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. pccpy-0.4.3/LICENSE +21 -0
  2. pccpy-0.4.3/PKG-INFO +319 -0
  3. pccpy-0.4.3/README.md +282 -0
  4. pccpy-0.4.3/pyproject.toml +58 -0
  5. pccpy-0.4.3/setup.cfg +4 -0
  6. pccpy-0.4.3/src/pccpy.egg-info/PKG-INFO +319 -0
  7. pccpy-0.4.3/src/pccpy.egg-info/SOURCES.txt +35 -0
  8. pccpy-0.4.3/src/pccpy.egg-info/dependency_links.txt +1 -0
  9. pccpy-0.4.3/src/pccpy.egg-info/requires.txt +15 -0
  10. pccpy-0.4.3/src/pccpy.egg-info/top_level.txt +1 -0
  11. pccpy-0.4.3/src/spyc/__init__.py +89 -0
  12. pccpy-0.4.3/src/spyc/_constants.py +101 -0
  13. pccpy-0.4.3/src/spyc/_data.py +106 -0
  14. pccpy-0.4.3/src/spyc/_sigma.py +88 -0
  15. pccpy-0.4.3/src/spyc/capability.py +395 -0
  16. pccpy-0.4.3/src/spyc/charts/__init__.py +24 -0
  17. pccpy-0.4.3/src/spyc/charts/_engine.py +102 -0
  18. pccpy-0.4.3/src/spyc/charts/advanced.py +497 -0
  19. pccpy-0.4.3/src/spyc/charts/attributes.py +122 -0
  20. pccpy-0.4.3/src/spyc/charts/timeweighted.py +108 -0
  21. pccpy-0.4.3/src/spyc/charts/variables.py +148 -0
  22. pccpy-0.4.3/src/spyc/multivariate.py +542 -0
  23. pccpy-0.4.3/src/spyc/normality.py +78 -0
  24. pccpy-0.4.3/src/spyc/plotting.py +227 -0
  25. pccpy-0.4.3/src/spyc/quality_tools.py +60 -0
  26. pccpy-0.4.3/src/spyc/results.py +181 -0
  27. pccpy-0.4.3/src/spyc/rules.py +169 -0
  28. pccpy-0.4.3/tests/test_advanced_charts.py +283 -0
  29. pccpy-0.4.3/tests/test_capability.py +167 -0
  30. pccpy-0.4.3/tests/test_charts.py +285 -0
  31. pccpy-0.4.3/tests/test_constants.py +42 -0
  32. pccpy-0.4.3/tests/test_multivariate.py +274 -0
  33. pccpy-0.4.3/tests/test_multivariate_stages_boxcox.py +218 -0
  34. pccpy-0.4.3/tests/test_normality_and_tools.py +76 -0
  35. pccpy-0.4.3/tests/test_plots.py +46 -0
  36. pccpy-0.4.3/tests/test_rules.py +96 -0
  37. pccpy-0.4.3/tests/test_zone_mcusum.py +226 -0
pccpy-0.4.3/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Autores de spyc
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
pccpy-0.4.3/PKG-INFO ADDED
@@ -0,0 +1,319 @@
1
+ Metadata-Version: 2.4
2
+ Name: pccpy
3
+ Version: 0.4.3
4
+ Summary: Control Estadístico de Procesos (SPC) en Python: cartas de control, capacidad y pruebas al estilo Minitab
5
+ Author-email: LeoSanta15 <angelsanta1@gmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/LeoSanta15/pccpy
8
+ Project-URL: Issues, https://github.com/LeoSanta15/pccpy/issues
9
+ Project-URL: Changelog, https://github.com/LeoSanta15/pccpy/blob/main/CHANGELOG.md
10
+ Keywords: spc,control estadístico de procesos,cartas de control,capacidad,minitab,six sigma
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.9
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Intended Audience :: Science/Research
19
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
20
+ Requires-Python: >=3.9
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: numpy>=1.22
24
+ Requires-Dist: scipy>=1.9
25
+ Requires-Dist: pandas>=1.4
26
+ Requires-Dist: matplotlib>=3.5
27
+ Provides-Extra: dev
28
+ Requires-Dist: pytest>=7; extra == "dev"
29
+ Requires-Dist: pytest-cov>=4; extra == "dev"
30
+ Requires-Dist: ruff>=0.6; extra == "dev"
31
+ Requires-Dist: mypy>=1.10; extra == "dev"
32
+ Provides-Extra: docs
33
+ Requires-Dist: sphinx>=7; extra == "docs"
34
+ Requires-Dist: sphinx-rtd-theme>=2; extra == "docs"
35
+ Requires-Dist: myst-parser>=2; extra == "docs"
36
+ Dynamic: license-file
37
+
38
+ # spyc
39
+
40
+ **Control Estadístico de Procesos (SPC) en Python, al estilo Minitab.**
41
+
42
+ Cartas de control, pruebas de causas especiales, análisis de capacidad, prueba de
43
+ normalidad y Pareto, con salidas y convenciones (LCS/LCI, LEI/LES, Cp/Cpk/Pp/Ppk,
44
+ Z.Bench, PPM, Anderson-Darling) pensadas para quien viene de Minitab.
45
+
46
+ Todo en español: nombres de columnas, mensajes, descripciones de pruebas y gráficos.
47
+
48
+ ## Instalación
49
+
50
+ Desde GitHub:
51
+
52
+ ```bash
53
+ pip install git+https://github.com/TU_USUARIO/spyc.git
54
+ ```
55
+
56
+ Desarrollo local:
57
+
58
+ ```bash
59
+ git clone https://github.com/TU_USUARIO/spyc.git
60
+ cd spyc
61
+ pip install -e ".[dev]"
62
+ pytest --cov=spyc # pruebas + cobertura (97% al momento de escribir esto)
63
+ ruff check src/ # estilo y errores comunes
64
+ mypy src/spyc # tipos
65
+ ```
66
+
67
+ Ver [`CHANGELOG.md`](CHANGELOG.md) para el historial de versiones.
68
+
69
+ ## Documentación
70
+
71
+ Hay documentación construida con Sphinx en `docs/`, con una página por cada grupo
72
+ de cartas (generadas a partir de los docstrings, así que siempre coinciden con el
73
+ código instalado). Para generarla y abrirla en tu máquina:
74
+
75
+ ```bash
76
+ pip install -e ".[docs]"
77
+ sphinx-build -b html docs/source docs/build
78
+ ```
79
+
80
+ Abre `docs/build/index.html`. Una vez el repositorio esté en GitHub, puedes conectarlo
81
+ en [readthedocs.org](https://readthedocs.org) para tenerla publicada automáticamente
82
+ en cada push; el archivo `.readthedocs.yaml` ya está listo para eso.
83
+
84
+ Requiere Python ≥ 3.9 (numpy, scipy, pandas, matplotlib).
85
+
86
+ ## Inicio rápido
87
+
88
+ ```python
89
+ import numpy as np
90
+ import spyc
91
+
92
+ rng = np.random.default_rng(1)
93
+ x = rng.normal(100, 2, 60)
94
+ x[40:] += 3 # el proceso se desplaza
95
+
96
+ carta = spyc.imr_chart(x, tests=(1, 2, 3, 4, 5, 6, 7, 8))
97
+ print(carta.summary()) # resumen tipo sesión de Minitab
98
+ carta.violations() # DataFrame: panel, punto, prueba, descripción
99
+ carta.to_frame() # todos los valores, límites y pruebas fallidas
100
+ carta.plot() # figura de matplotlib
101
+ ```
102
+
103
+ ## Cartas de control
104
+
105
+ | Minitab | Función | Notas |
106
+ |---|---|---|
107
+ | I-MR | `imr_chart(x)` | `sigma_method`: `'mr'`, `'median_mr'`, `'mssd'`; `span` configurable |
108
+ | Xbar-R | `xbar_r_chart(datos)` | `sigma_method`: `'rbar'`, `'pooled'` |
109
+ | Xbar-S | `xbar_s_chart(datos)` | `sigma_method`: `'sbar'`, `'pooled'` |
110
+ | P | `p_chart(defectuosos, n)` | límites variables con `n` variable |
111
+ | NP | `np_chart(defectuosos, n)` | |
112
+ | C | `c_chart(defectos)` | |
113
+ | U | `u_chart(defectos, n)` | |
114
+ | Laney P' / U' | `laney_p_chart`, `laney_u_chart` | corrige sobredispersión |
115
+ | EWMA | `ewma_chart(datos, weight=0.2, k=3)` | límites exactos (se ensanchan al inicio) |
116
+ | CUSUM | `cusum_chart(datos, h=4, k=0.5)` | tabular, sumas superior e inferior |
117
+ | Media móvil | `ma_chart(datos, length=3)` | límites más anchos en los primeros `length-1` puntos |
118
+ | Z-MR | `zmr_chart(x, partes)` | corridas cortas; ver más abajo |
119
+ | I-MR-R/S (entre/dentro) | `imr_rs_chart(datos, within='r')` | variación entre y dentro de subgrupos |
120
+ | G | `g_chart(entre_eventos)` | eventos raros, geométrica |
121
+ | T | `t_chart(tiempos)` | eventos raros, Weibull o exponencial |
122
+ | T² de Hotelling | `t2_chart(matriz)` | Fase I / Fase II, con diagnóstico por variable |
123
+ | Varianza generalizada | `generalized_variance_chart(matriz, subgroup_size=n)` | dispersión multivariada, `\|S\|` |
124
+ | MEWMA | `mewma_chart(matriz)` | límite por ARL (por defecto 200) |
125
+
126
+ Los datos de variables aceptan una matriz 2D (filas = subgrupos), un vector con
127
+ `subgroup_size=5`, o un vector con `subgroup=identificadores` (subgrupos de tamaño desigual).
128
+
129
+ ```python
130
+ datos = rng.normal(50, 1, size=(25, 5))
131
+ spyc.xbar_r_chart(datos, tests=(1, 2, 3, 4)).summary()
132
+
133
+ vector = datos.ravel() # mismos datos en un solo vector
134
+ ids = np.repeat(np.arange(25), 5) # identificador de subgrupo de cada dato
135
+ spyc.xbar_r_chart(vector, subgroup_size=5)
136
+ spyc.xbar_s_chart(vector, subgroup=ids)
137
+ ```
138
+
139
+ **Parámetros históricos y etapas** (equivalentes a *Opciones de estimación* y *Etapas* de Minitab):
140
+
141
+ ```python
142
+ spyc.imr_chart(x, mu=100, sigma=2) # parámetros conocidos
143
+ spyc.imr_chart(x, stages=["antes"] * 40 + ["después"] * 20) # límites por etapa
144
+ ```
145
+
146
+ **Atributos:**
147
+
148
+ ```python
149
+ defectuosos = rng.binomial(200, 0.05, 30)
150
+ spyc.p_chart(defectuosos, n=200)
151
+ spyc.laney_p_chart(defectuosos, n=200)
152
+ ```
153
+
154
+ ## Cartas avanzadas
155
+
156
+ ```python
157
+ # Z-MR: partes con medias y variaciones distintas en una sola carta (corridas cortas)
158
+ partes = ["A"] * 10 + ["B"] * 10 + ["A"] * 10
159
+ medidas = np.r_[rng.normal(50, 1, 10), rng.normal(80, 2, 10), rng.normal(50, 1, 10)]
160
+ spyc.zmr_chart(medidas, partes, sigma_method="by_part") # 'constant', 'relative', 'by_part', 'by_run'
161
+
162
+ # I-MR-R/S: la variación entre subgrupos no genera falsas alarmas como en Xbar-R
163
+ sub = rng.normal(20, 1, (25, 5)) + rng.normal(0, 1.5, (25, 1))
164
+ c = spyc.imr_rs_chart(sub, within="s")
165
+ c.params[0] # sigma_dentro, sigma_entre, sigma_entre_dentro
166
+
167
+ # Eventos raros
168
+ spyc.g_chart(rng.geometric(0.02, 40) - 1) # casos entre eventos
169
+ spyc.t_chart(rng.weibull(1.5, 40) * 30) # tiempo entre eventos
170
+
171
+ # Media móvil
172
+ spyc.ma_chart(x, length=5)
173
+ ```
174
+
175
+ `zmr_chart` estandariza cada observación con la media de su parte y una sigma estimada
176
+ con el rango móvil *dentro de cada corrida* (bloque consecutivo de la misma parte);
177
+ `mu={parte: valor}` y `sigma=` aceptan valores históricos o nominales.
178
+
179
+ ## Cartas multivariadas
180
+
181
+ ```python
182
+ Sigma = [[1, .6, .3], [.6, 1, .2], [.3, .2, 1]]
183
+ historico = rng.multivariate_normal([0, 0, 0], Sigma, 100)
184
+ nuevos = rng.multivariate_normal([0, 0, 0], Sigma, 40)
185
+ nuevos[25:, 2] += 4 # la variable 3 se desplaza
186
+
187
+ # Fase I: parámetros estimados de los mismos datos
188
+ spyc.t2_chart(historico).summary()
189
+
190
+ # Fase II: parámetros históricos (n_hist = observaciones con que se estimaron)
191
+ c = spyc.t2_chart(nuevos, mu=historico.mean(axis=0), cov=np.cov(historico, rowvar=False),
192
+ n_hist=100)
193
+ c.violations()
194
+ c.contributions(31) # ¿qué variable explica la señal?
195
+
196
+ # Subgrupos: matriz N x p con subgroup_size, o array 3-D (subgrupos x n x p)
197
+ spyc.t2_chart(nuevos[:40], subgroup_size=4)
198
+ spyc.generalized_variance_chart(nuevos[:40], subgroup_size=8)
199
+
200
+ # MEWMA: cambios pequeños y sostenidos
201
+ spyc.mewma_chart(nuevos, mu=historico.mean(axis=0), cov=np.cov(historico, rowvar=False))
202
+ spyc.mewma_limit(p=2, weight=0.1, arl=200) # límite H para un ARL dado (≈ 8.64)
203
+ ```
204
+
205
+ Los datos pueden ser un `DataFrame` (los nombres de columna se usan en `contributions`).
206
+ El límite de T² usa por defecto α = 0.00135 (cola de 3 sigmas, como Minitab). Sin `mu`/`cov`
207
+ se usan límites de **Fase I** (Beta para individuales, F para subgrupos); con `mu`/`cov` y
208
+ `n_hist`, de **Fase II**; con `mu`/`cov` sin `n_hist` los parámetros se toman como conocidos (χ²).
209
+
210
+ ### Etapas y Box-Cox
211
+
212
+ Las 4 cartas multivariadas (T², varianza generalizada, MEWMA y MCUSUM) aceptan `stages`
213
+ y `boxcox`, igual que las cartas univariadas:
214
+
215
+ ```python
216
+ etapas = [1] * 40 + [2] * 40 # p. ej. antes/después de un ajuste
217
+
218
+ # Sin mu/cov: la media y la covarianza se vuelven a estimar dentro de cada etapa
219
+ c = spyc.t2_chart(nuevos_con_dos_etapas, stages=etapas)
220
+ c.stage_mean[1], c.stage_mean[2] # medias distintas por etapa
221
+ c.contributions(45) # usa la media/cov de la etapa del punto 45
222
+
223
+ # Con mu/cov históricos: los mismos parámetros en todas las etapas
224
+ spyc.t2_chart(nuevos_con_dos_etapas, mu=mu, cov=cov, n_hist=100, stages=etapas)
225
+
226
+ # MEWMA y MCUSUM: el acumulador reinicia al empezar cada etapa
227
+ spyc.mewma_chart(nuevos_con_dos_etapas, stages=etapas)
228
+ spyc.mcusum_chart(nuevos_con_dos_etapas, stages=etapas)
229
+
230
+ # Box-Cox: una lambda por variable (no se puede combinar con mu/cov históricos)
231
+ c = spyc.t2_chart(datos_positivos, boxcox=True)
232
+ c.params[0]["lambda_boxcox"] # {'X1': ..., 'X2': ..., 'X3': ...}
233
+ spyc.generalized_variance_chart(datos_positivos, subgroup_size=6, boxcox=True)
234
+ spyc.mewma_chart(datos_positivos, boxcox=True)
235
+ spyc.mcusum_chart(datos_positivos, boxcox=True)
236
+ ```
237
+
238
+ ## Pruebas de causas especiales
239
+
240
+ Las 8 pruebas de Minitab (1 a 8) con sus parámetros por defecto
241
+ (`K` = 3, 9, 6, 14, 2, 4, 15, 8). Se piden con `tests=(...)` y se ajustan con `test_params`:
242
+
243
+ ```python
244
+ spyc.imr_chart(x, tests=(1, 2, 5), test_params={2: 7}) # prueba 2 con 7 puntos
245
+ ```
246
+
247
+ Cada tipo de carta aplica el subconjunto que corresponde (completo en I, Xbar y Z;
248
+ básicas 1-4 en MR, R, S, G, T y cartas de atributos; solo la 1 en EWMA, CUSUM, MA y las
249
+ multivariadas). En G y T la prueba 1 usa los percentiles de su distribución.
250
+ Las funciones individuales están en `spyc.rules`.
251
+
252
+ ## Capacidad del proceso
253
+
254
+ ```python
255
+ datos = rng.normal(10, 0.1, 100)
256
+ res = spyc.capability_analysis(datos, lsl=9.7, usl=10.3, subgroup_size=5)
257
+ print(res.summary()) # Cp, CPL, CPU, Cpk, Pp, PPL, PPU, Ppk, Cpm, Z.Bench, PPM, IC
258
+ res.to_frame()
259
+ res.plot()
260
+ ```
261
+
262
+ Como en Minitab, **Cp/Cpk usan la desviación estándar dentro de subgrupos** y
263
+ **Pp/Ppk la desviación general**; por eso Cpk ≠ Ppk cuando el proceso se desplaza o hay variación entre subgrupos.
264
+
265
+ Datos no normales:
266
+
267
+ ```python
268
+ spyc.capability_nonnormal(x, lsl=1, usl=20, distribution="weibull")
269
+ spyc.capability_boxcox(x, lsl=1, usl=20)
270
+ ```
271
+
272
+ Distribuciones: `normal`, `lognormal`, `weibull`, `gamma`, `exponential`,
273
+ `loglogistic`, `logistic`, `largest_extreme`, `smallest_extreme` (método de percentiles).
274
+
275
+ `spyc.capability_sixpack(datos, lsl, usl, subgroup_size=5)` genera el **Capability Sixpack**.
276
+
277
+ ## Normalidad, Pareto y constantes
278
+
279
+ ```python
280
+ spyc.normality_test(x) # Anderson-Darling (por defecto), 'shapiro', 'dagostino'
281
+ spyc.probability_plot(x)
282
+
283
+ tabla = spyc.pareto(["rayón", "abolladura", "rayón", "otro"])
284
+ spyc.plot_pareto(tabla)
285
+
286
+ spyc.control_chart_constants(5) # d2, d3, c4, c5, A2, A3, D3, D4, B3, B4
287
+ ```
288
+
289
+ Las constantes se calculan por integración numérica para **cualquier** `n ≥ 2` (no solo tablas hasta 25).
290
+
291
+ ## Validación
292
+
293
+ pruebas automatizadas. Las referencias son independientes de spyc:
294
+
295
+ - Constantes d2, d3, c4 frente a las tablas publicadas (Montgomery).
296
+ - Límites I-MR, Xbar-R y Xbar-S frente al cálculo manual con A2, D3, D4, A3, B3, B4.
297
+ - Anderson-Darling frente a `statsmodels.stats.diagnostic.normal_ad` (coincide a 9 decimales).
298
+ - EWMA y CUSUM frente a la recursión manual.
299
+ - Las 8 pruebas de causas especiales frente a casos construidos a mano, incluidos los casos límite.
300
+ - T²: valores frente a `scipy.spatial.distance.mahalanobis`; los límites de Fase I y II
301
+ (Beta y F) por simulación Monte Carlo (tasa de falsa alarma y valor esperado).
302
+ - Varianza generalizada: constantes b1 y b2 por simulación de matrices de covarianza.
303
+ - MEWMA: el límite para p=2, λ=0.1, ARL=200 da 8.63 (publicado: 8.64, Prabhu y Runger 1997)
304
+ y el ARL se comprueba por simulación.
305
+ - G y T: cuantiles frente a `scipy.stats`, y máxima verosimilitud Weibull por su ecuación de score.
306
+ - Constantes de Z-MR (1.128 y 3.686) frente a las que documenta Minitab.
307
+
308
+ > **Importante:** spyc no se ha comparado corrida a corrida contra el software Minitab
309
+ > (no hay licencia disponible en el desarrollo). Sigue las fórmulas y convenciones que
310
+ > Minitab documenta. Si encuentras una diferencia, abre un issue (ver `CONTRIBUTING.md`).
311
+
312
+ ## Fuera de alcance (por ahora)
313
+
314
+ Cartas multivariadas (T² de Hotelling), cartas de corridas cortas, Z-MR, I-MR-R/S
315
+ (entre/dentro), transformación de Johnson, MSA/Gage R&R.
316
+
317
+ ## Licencia
318
+
319
+ MIT.
pccpy-0.4.3/README.md ADDED
@@ -0,0 +1,282 @@
1
+ # spyc
2
+
3
+ **Control Estadístico de Procesos (SPC) en Python, al estilo Minitab.**
4
+
5
+ Cartas de control, pruebas de causas especiales, análisis de capacidad, prueba de
6
+ normalidad y Pareto, con salidas y convenciones (LCS/LCI, LEI/LES, Cp/Cpk/Pp/Ppk,
7
+ Z.Bench, PPM, Anderson-Darling) pensadas para quien viene de Minitab.
8
+
9
+ Todo en español: nombres de columnas, mensajes, descripciones de pruebas y gráficos.
10
+
11
+ ## Instalación
12
+
13
+ Desde GitHub:
14
+
15
+ ```bash
16
+ pip install git+https://github.com/TU_USUARIO/spyc.git
17
+ ```
18
+
19
+ Desarrollo local:
20
+
21
+ ```bash
22
+ git clone https://github.com/TU_USUARIO/spyc.git
23
+ cd spyc
24
+ pip install -e ".[dev]"
25
+ pytest --cov=spyc # pruebas + cobertura (97% al momento de escribir esto)
26
+ ruff check src/ # estilo y errores comunes
27
+ mypy src/spyc # tipos
28
+ ```
29
+
30
+ Ver [`CHANGELOG.md`](CHANGELOG.md) para el historial de versiones.
31
+
32
+ ## Documentación
33
+
34
+ Hay documentación construida con Sphinx en `docs/`, con una página por cada grupo
35
+ de cartas (generadas a partir de los docstrings, así que siempre coinciden con el
36
+ código instalado). Para generarla y abrirla en tu máquina:
37
+
38
+ ```bash
39
+ pip install -e ".[docs]"
40
+ sphinx-build -b html docs/source docs/build
41
+ ```
42
+
43
+ Abre `docs/build/index.html`. Una vez el repositorio esté en GitHub, puedes conectarlo
44
+ en [readthedocs.org](https://readthedocs.org) para tenerla publicada automáticamente
45
+ en cada push; el archivo `.readthedocs.yaml` ya está listo para eso.
46
+
47
+ Requiere Python ≥ 3.9 (numpy, scipy, pandas, matplotlib).
48
+
49
+ ## Inicio rápido
50
+
51
+ ```python
52
+ import numpy as np
53
+ import spyc
54
+
55
+ rng = np.random.default_rng(1)
56
+ x = rng.normal(100, 2, 60)
57
+ x[40:] += 3 # el proceso se desplaza
58
+
59
+ carta = spyc.imr_chart(x, tests=(1, 2, 3, 4, 5, 6, 7, 8))
60
+ print(carta.summary()) # resumen tipo sesión de Minitab
61
+ carta.violations() # DataFrame: panel, punto, prueba, descripción
62
+ carta.to_frame() # todos los valores, límites y pruebas fallidas
63
+ carta.plot() # figura de matplotlib
64
+ ```
65
+
66
+ ## Cartas de control
67
+
68
+ | Minitab | Función | Notas |
69
+ |---|---|---|
70
+ | I-MR | `imr_chart(x)` | `sigma_method`: `'mr'`, `'median_mr'`, `'mssd'`; `span` configurable |
71
+ | Xbar-R | `xbar_r_chart(datos)` | `sigma_method`: `'rbar'`, `'pooled'` |
72
+ | Xbar-S | `xbar_s_chart(datos)` | `sigma_method`: `'sbar'`, `'pooled'` |
73
+ | P | `p_chart(defectuosos, n)` | límites variables con `n` variable |
74
+ | NP | `np_chart(defectuosos, n)` | |
75
+ | C | `c_chart(defectos)` | |
76
+ | U | `u_chart(defectos, n)` | |
77
+ | Laney P' / U' | `laney_p_chart`, `laney_u_chart` | corrige sobredispersión |
78
+ | EWMA | `ewma_chart(datos, weight=0.2, k=3)` | límites exactos (se ensanchan al inicio) |
79
+ | CUSUM | `cusum_chart(datos, h=4, k=0.5)` | tabular, sumas superior e inferior |
80
+ | Media móvil | `ma_chart(datos, length=3)` | límites más anchos en los primeros `length-1` puntos |
81
+ | Z-MR | `zmr_chart(x, partes)` | corridas cortas; ver más abajo |
82
+ | I-MR-R/S (entre/dentro) | `imr_rs_chart(datos, within='r')` | variación entre y dentro de subgrupos |
83
+ | G | `g_chart(entre_eventos)` | eventos raros, geométrica |
84
+ | T | `t_chart(tiempos)` | eventos raros, Weibull o exponencial |
85
+ | T² de Hotelling | `t2_chart(matriz)` | Fase I / Fase II, con diagnóstico por variable |
86
+ | Varianza generalizada | `generalized_variance_chart(matriz, subgroup_size=n)` | dispersión multivariada, `\|S\|` |
87
+ | MEWMA | `mewma_chart(matriz)` | límite por ARL (por defecto 200) |
88
+
89
+ Los datos de variables aceptan una matriz 2D (filas = subgrupos), un vector con
90
+ `subgroup_size=5`, o un vector con `subgroup=identificadores` (subgrupos de tamaño desigual).
91
+
92
+ ```python
93
+ datos = rng.normal(50, 1, size=(25, 5))
94
+ spyc.xbar_r_chart(datos, tests=(1, 2, 3, 4)).summary()
95
+
96
+ vector = datos.ravel() # mismos datos en un solo vector
97
+ ids = np.repeat(np.arange(25), 5) # identificador de subgrupo de cada dato
98
+ spyc.xbar_r_chart(vector, subgroup_size=5)
99
+ spyc.xbar_s_chart(vector, subgroup=ids)
100
+ ```
101
+
102
+ **Parámetros históricos y etapas** (equivalentes a *Opciones de estimación* y *Etapas* de Minitab):
103
+
104
+ ```python
105
+ spyc.imr_chart(x, mu=100, sigma=2) # parámetros conocidos
106
+ spyc.imr_chart(x, stages=["antes"] * 40 + ["después"] * 20) # límites por etapa
107
+ ```
108
+
109
+ **Atributos:**
110
+
111
+ ```python
112
+ defectuosos = rng.binomial(200, 0.05, 30)
113
+ spyc.p_chart(defectuosos, n=200)
114
+ spyc.laney_p_chart(defectuosos, n=200)
115
+ ```
116
+
117
+ ## Cartas avanzadas
118
+
119
+ ```python
120
+ # Z-MR: partes con medias y variaciones distintas en una sola carta (corridas cortas)
121
+ partes = ["A"] * 10 + ["B"] * 10 + ["A"] * 10
122
+ medidas = np.r_[rng.normal(50, 1, 10), rng.normal(80, 2, 10), rng.normal(50, 1, 10)]
123
+ spyc.zmr_chart(medidas, partes, sigma_method="by_part") # 'constant', 'relative', 'by_part', 'by_run'
124
+
125
+ # I-MR-R/S: la variación entre subgrupos no genera falsas alarmas como en Xbar-R
126
+ sub = rng.normal(20, 1, (25, 5)) + rng.normal(0, 1.5, (25, 1))
127
+ c = spyc.imr_rs_chart(sub, within="s")
128
+ c.params[0] # sigma_dentro, sigma_entre, sigma_entre_dentro
129
+
130
+ # Eventos raros
131
+ spyc.g_chart(rng.geometric(0.02, 40) - 1) # casos entre eventos
132
+ spyc.t_chart(rng.weibull(1.5, 40) * 30) # tiempo entre eventos
133
+
134
+ # Media móvil
135
+ spyc.ma_chart(x, length=5)
136
+ ```
137
+
138
+ `zmr_chart` estandariza cada observación con la media de su parte y una sigma estimada
139
+ con el rango móvil *dentro de cada corrida* (bloque consecutivo de la misma parte);
140
+ `mu={parte: valor}` y `sigma=` aceptan valores históricos o nominales.
141
+
142
+ ## Cartas multivariadas
143
+
144
+ ```python
145
+ Sigma = [[1, .6, .3], [.6, 1, .2], [.3, .2, 1]]
146
+ historico = rng.multivariate_normal([0, 0, 0], Sigma, 100)
147
+ nuevos = rng.multivariate_normal([0, 0, 0], Sigma, 40)
148
+ nuevos[25:, 2] += 4 # la variable 3 se desplaza
149
+
150
+ # Fase I: parámetros estimados de los mismos datos
151
+ spyc.t2_chart(historico).summary()
152
+
153
+ # Fase II: parámetros históricos (n_hist = observaciones con que se estimaron)
154
+ c = spyc.t2_chart(nuevos, mu=historico.mean(axis=0), cov=np.cov(historico, rowvar=False),
155
+ n_hist=100)
156
+ c.violations()
157
+ c.contributions(31) # ¿qué variable explica la señal?
158
+
159
+ # Subgrupos: matriz N x p con subgroup_size, o array 3-D (subgrupos x n x p)
160
+ spyc.t2_chart(nuevos[:40], subgroup_size=4)
161
+ spyc.generalized_variance_chart(nuevos[:40], subgroup_size=8)
162
+
163
+ # MEWMA: cambios pequeños y sostenidos
164
+ spyc.mewma_chart(nuevos, mu=historico.mean(axis=0), cov=np.cov(historico, rowvar=False))
165
+ spyc.mewma_limit(p=2, weight=0.1, arl=200) # límite H para un ARL dado (≈ 8.64)
166
+ ```
167
+
168
+ Los datos pueden ser un `DataFrame` (los nombres de columna se usan en `contributions`).
169
+ El límite de T² usa por defecto α = 0.00135 (cola de 3 sigmas, como Minitab). Sin `mu`/`cov`
170
+ se usan límites de **Fase I** (Beta para individuales, F para subgrupos); con `mu`/`cov` y
171
+ `n_hist`, de **Fase II**; con `mu`/`cov` sin `n_hist` los parámetros se toman como conocidos (χ²).
172
+
173
+ ### Etapas y Box-Cox
174
+
175
+ Las 4 cartas multivariadas (T², varianza generalizada, MEWMA y MCUSUM) aceptan `stages`
176
+ y `boxcox`, igual que las cartas univariadas:
177
+
178
+ ```python
179
+ etapas = [1] * 40 + [2] * 40 # p. ej. antes/después de un ajuste
180
+
181
+ # Sin mu/cov: la media y la covarianza se vuelven a estimar dentro de cada etapa
182
+ c = spyc.t2_chart(nuevos_con_dos_etapas, stages=etapas)
183
+ c.stage_mean[1], c.stage_mean[2] # medias distintas por etapa
184
+ c.contributions(45) # usa la media/cov de la etapa del punto 45
185
+
186
+ # Con mu/cov históricos: los mismos parámetros en todas las etapas
187
+ spyc.t2_chart(nuevos_con_dos_etapas, mu=mu, cov=cov, n_hist=100, stages=etapas)
188
+
189
+ # MEWMA y MCUSUM: el acumulador reinicia al empezar cada etapa
190
+ spyc.mewma_chart(nuevos_con_dos_etapas, stages=etapas)
191
+ spyc.mcusum_chart(nuevos_con_dos_etapas, stages=etapas)
192
+
193
+ # Box-Cox: una lambda por variable (no se puede combinar con mu/cov históricos)
194
+ c = spyc.t2_chart(datos_positivos, boxcox=True)
195
+ c.params[0]["lambda_boxcox"] # {'X1': ..., 'X2': ..., 'X3': ...}
196
+ spyc.generalized_variance_chart(datos_positivos, subgroup_size=6, boxcox=True)
197
+ spyc.mewma_chart(datos_positivos, boxcox=True)
198
+ spyc.mcusum_chart(datos_positivos, boxcox=True)
199
+ ```
200
+
201
+ ## Pruebas de causas especiales
202
+
203
+ Las 8 pruebas de Minitab (1 a 8) con sus parámetros por defecto
204
+ (`K` = 3, 9, 6, 14, 2, 4, 15, 8). Se piden con `tests=(...)` y se ajustan con `test_params`:
205
+
206
+ ```python
207
+ spyc.imr_chart(x, tests=(1, 2, 5), test_params={2: 7}) # prueba 2 con 7 puntos
208
+ ```
209
+
210
+ Cada tipo de carta aplica el subconjunto que corresponde (completo en I, Xbar y Z;
211
+ básicas 1-4 en MR, R, S, G, T y cartas de atributos; solo la 1 en EWMA, CUSUM, MA y las
212
+ multivariadas). En G y T la prueba 1 usa los percentiles de su distribución.
213
+ Las funciones individuales están en `spyc.rules`.
214
+
215
+ ## Capacidad del proceso
216
+
217
+ ```python
218
+ datos = rng.normal(10, 0.1, 100)
219
+ res = spyc.capability_analysis(datos, lsl=9.7, usl=10.3, subgroup_size=5)
220
+ print(res.summary()) # Cp, CPL, CPU, Cpk, Pp, PPL, PPU, Ppk, Cpm, Z.Bench, PPM, IC
221
+ res.to_frame()
222
+ res.plot()
223
+ ```
224
+
225
+ Como en Minitab, **Cp/Cpk usan la desviación estándar dentro de subgrupos** y
226
+ **Pp/Ppk la desviación general**; por eso Cpk ≠ Ppk cuando el proceso se desplaza o hay variación entre subgrupos.
227
+
228
+ Datos no normales:
229
+
230
+ ```python
231
+ spyc.capability_nonnormal(x, lsl=1, usl=20, distribution="weibull")
232
+ spyc.capability_boxcox(x, lsl=1, usl=20)
233
+ ```
234
+
235
+ Distribuciones: `normal`, `lognormal`, `weibull`, `gamma`, `exponential`,
236
+ `loglogistic`, `logistic`, `largest_extreme`, `smallest_extreme` (método de percentiles).
237
+
238
+ `spyc.capability_sixpack(datos, lsl, usl, subgroup_size=5)` genera el **Capability Sixpack**.
239
+
240
+ ## Normalidad, Pareto y constantes
241
+
242
+ ```python
243
+ spyc.normality_test(x) # Anderson-Darling (por defecto), 'shapiro', 'dagostino'
244
+ spyc.probability_plot(x)
245
+
246
+ tabla = spyc.pareto(["rayón", "abolladura", "rayón", "otro"])
247
+ spyc.plot_pareto(tabla)
248
+
249
+ spyc.control_chart_constants(5) # d2, d3, c4, c5, A2, A3, D3, D4, B3, B4
250
+ ```
251
+
252
+ Las constantes se calculan por integración numérica para **cualquier** `n ≥ 2` (no solo tablas hasta 25).
253
+
254
+ ## Validación
255
+
256
+ pruebas automatizadas. Las referencias son independientes de spyc:
257
+
258
+ - Constantes d2, d3, c4 frente a las tablas publicadas (Montgomery).
259
+ - Límites I-MR, Xbar-R y Xbar-S frente al cálculo manual con A2, D3, D4, A3, B3, B4.
260
+ - Anderson-Darling frente a `statsmodels.stats.diagnostic.normal_ad` (coincide a 9 decimales).
261
+ - EWMA y CUSUM frente a la recursión manual.
262
+ - Las 8 pruebas de causas especiales frente a casos construidos a mano, incluidos los casos límite.
263
+ - T²: valores frente a `scipy.spatial.distance.mahalanobis`; los límites de Fase I y II
264
+ (Beta y F) por simulación Monte Carlo (tasa de falsa alarma y valor esperado).
265
+ - Varianza generalizada: constantes b1 y b2 por simulación de matrices de covarianza.
266
+ - MEWMA: el límite para p=2, λ=0.1, ARL=200 da 8.63 (publicado: 8.64, Prabhu y Runger 1997)
267
+ y el ARL se comprueba por simulación.
268
+ - G y T: cuantiles frente a `scipy.stats`, y máxima verosimilitud Weibull por su ecuación de score.
269
+ - Constantes de Z-MR (1.128 y 3.686) frente a las que documenta Minitab.
270
+
271
+ > **Importante:** spyc no se ha comparado corrida a corrida contra el software Minitab
272
+ > (no hay licencia disponible en el desarrollo). Sigue las fórmulas y convenciones que
273
+ > Minitab documenta. Si encuentras una diferencia, abre un issue (ver `CONTRIBUTING.md`).
274
+
275
+ ## Fuera de alcance (por ahora)
276
+
277
+ Cartas multivariadas (T² de Hotelling), cartas de corridas cortas, Z-MR, I-MR-R/S
278
+ (entre/dentro), transformación de Johnson, MSA/Gage R&R.
279
+
280
+ ## Licencia
281
+
282
+ MIT.
@@ -0,0 +1,58 @@
1
+ [build-system]
2
+ requires = ["setuptools>=77.0.3", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "pccpy"
7
+ version = "0.4.3"
8
+ description = "Control Estadístico de Procesos (SPC) en Python: cartas de control, capacidad y pruebas al estilo Minitab"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+
12
+ license = "MIT"
13
+ license-files = ["LICENSE"]
14
+
15
+ authors = [
16
+ { name = "LeoSanta15", email = "angelsanta1@gmail.com" }
17
+ ]
18
+ keywords = ["spc", "control estadístico de procesos", "cartas de control", "capacidad", "minitab", "six sigma"]
19
+ classifiers = [
20
+ "Programming Language :: Python :: 3",
21
+ "Programming Language :: Python :: 3.9",
22
+ "Programming Language :: Python :: 3.10",
23
+ "Programming Language :: Python :: 3.11",
24
+ "Programming Language :: Python :: 3.12",
25
+ "Programming Language :: Python :: 3.13",
26
+ "Operating System :: OS Independent",
27
+ "Intended Audience :: Science/Research",
28
+ "Topic :: Scientific/Engineering :: Information Analysis",
29
+ ]
30
+ dependencies = [
31
+ "numpy>=1.22",
32
+ "scipy>=1.9",
33
+ "pandas>=1.4",
34
+ "matplotlib>=3.5",
35
+ ]
36
+
37
+ [project.optional-dependencies]
38
+ dev = ["pytest>=7", "pytest-cov>=4", "ruff>=0.6", "mypy>=1.10"]
39
+ docs = ["sphinx>=7", "sphinx-rtd-theme>=2", "myst-parser>=2"]
40
+
41
+ [project.urls]
42
+ Homepage = "https://github.com/LeoSanta15/pccpy"
43
+ Issues = "https://github.com/LeoSanta15/pccpy/issues"
44
+ Changelog = "https://github.com/LeoSanta15/pccpy/blob/main/CHANGELOG.md"
45
+
46
+ [tool.setuptools.packages.find]
47
+ where = ["src"]
48
+
49
+ [tool.pytest.ini_options]
50
+ testpaths = ["tests"]
51
+ addopts = "-q"
52
+
53
+ [tool.mypy]
54
+ ignore_missing_imports = true
55
+
56
+ [tool.ruff]
57
+ line-length = 110
58
+ target-version = "py39"
pccpy-0.4.3/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+