Implementando las 4 reglas de agrupación en R y Python.
Decidir el número de intervalos que vamos a utilizar (1.,2.,3.,4.)

1. Regla de Scott: Se determina primero la amplitud teórica, As de las clases \(As = 3.5 \cdot \tilde{s} \cdot n^\frac{-1}{3}\) donde \(\tilde{s}\) es la desviación tipica muestral.Luego se toma \(k= \frac{\max(x)-min(x)}{As}\)
2. Regla de la raíz: \(K= \sqrt(n)\)

3. Regla de Sturges: \(k= 1+\log_2(n)\)

4. Regla de Freedman-Diaconis: Se determina primero la amplitud teórica, afd de las clases \(Afd= 2\cdot(Q_{0.75}-Q_{0.25})\cdot n^{\frac{-1}{3}}\), donde \(Q_{0.75}-Q_{0.25}\) es el rango intercuartílico y entonces \(k= \frac{\max(x)-min(x)}{Afd}\)

Rstudio:

crabs = read.table("D:/Archivos/Carlos/Programación 2019/R Studio/Curso Estadistica Descriptiva/r-basic-master/r-basic-master/data/datacrab.txt",sep = " ",header = TRUE)
str(crabs)
## 'data.frame':    173 obs. of  6 variables:
##  $ input : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ color : int  3 4 2 4 4 3 2 4 3 4 ...
##  $ spine : int  3 3 1 3 3 3 1 2 1 3 ...
##  $ width : num  28.3 22.5 26 24.8 26 23.8 26.5 24.7 23.7 25.6 ...
##  $ satell: int  8 0 9 0 4 0 0 0 0 0 ...
##  $ weight: int  3050 1550 2300 2100 2600 2100 2350 1900 1950 2150 ...
cw = crabs$width
n = length(cw) # Longitud de cw
head(cw)
## [1] 28.3 22.5 26.0 24.8 26.0 23.8

Python:

import pandas as pd
import numpy as np
import math
data = pd.read_csv("D:/Archivos/Carlos/Programación 2019/R Studio/Curso Estadistica Descriptiva/r-basic-master/r-basic-master/data/datacrab.txt",sep = " ")
cw_py = data["width"]
n_py = len(cw_py) # Longitud de cw_py
print(cw_py.head())
## 0    28.3
## 1    22.5
## 2    26.0
## 3    24.8
## 4    26.0
## Name: width, dtype: float64

1. Regla de Scott - Paso 1: Implementando Fórmula.

Rstudio:

As = 3.5*sd(cw)*n^(-1/3) # Amplitud teórica 
k3 = ceiling(diff(range(cw))/As)
k3
## [1] 10
nclass.scott(cw) #Función Scott en R
## [1] 10

Python:

As_py = 3.5*cw_py.std()*n_py**(-1/3) # Amplitud teórica 
k3_py = math.ceil((cw_py.max()-cw_py.min())/(As_py))
print(k3_py)
## 10

Regla de Scott - Paso 2: Decidir la amplitud de estos intervalos.

Rstudio:

A = diff(range(cw))/10
A
## [1] 1.25

Python:

A_py = (cw_py.max()-cw_py.min())/k3_py
A_py
## 1.25

Regla de Scott - Paso 3: Calcular los extremos de los intervalos.

Rstudio:

L1 = min(cw)-1/2*0.1
L1
## [1] 20.95
L = L1 + A*(0:10)
L
##  [1] 20.95 22.20 23.45 24.70 25.95 27.20 28.45 29.70 30.95 32.20 33.45

Python:

L1_py = cw_py.min()-1/2*0.1
print(L1_py)
## 20.95
L_py = L1_py + A_py * range(11)
print(L_py)
## [20.95 22.2  23.45 24.7  25.95 27.2  28.45 29.7  30.95 32.2  33.45]

Regla de Scott - Paso 4: Calcular las marcas de la clase.

Rstudio:

X1 = (L[1]+L[2])/2
X1
## [1] 21.575
X = X1 +A*(0:9)
X
##  [1] 21.575 22.825 24.075 25.325 26.575 27.825 29.075 30.325 31.575 32.825
Xx = (L[1:length(L)-1]+L[2:length(L)])/2

Python:

X1_py = (L_py[0]+L_py[1])/2
X1_py
## 21.575
X_py = X1_py + A_py * range(10)
X_py
## array([21.575, 22.825, 24.075, 25.325, 26.575, 27.825, 29.075, 30.325,
##        31.575, 32.825])

2. Regla de la raíz cuadrada - Paso 1: Implementando Fórmula.

Rstudio:

k1 = ceiling(sqrt(n)) # tomo la parte entera de la raiz cuadrada de n hacia arriba 
k1
## [1] 14

Python:

k1_py = math.ceil(math.sqrt(n_py))# tomo la parte entera de la raiz cuadrada de n hacia arriba
print(k1_py)
## 14

Regla de la raíz cuadrada - Paso 2: Decidir la amplitud de estos intervalos.

Rstudio:

A = diff(range(cw))/k1
A
## [1] 0.8928571

Python:

A_py = (cw_py.max()-cw_py.min())/k1_py
A_py
## 0.8928571428571429

Regla de la raíz cuadrada - Paso 3: Calcular los extremos de los intervalos.

Rstudio:

L1 = min(cw)-1/2*0.14
L1
## [1] 20.93
L = L1 + A*(0:10)
L
##  [1] 20.93000 21.82286 22.71571 23.60857 24.50143 25.39429 26.28714
##  [8] 27.18000 28.07286 28.96571 29.85857

Python:

L1_py = cw_py.min()-1/2*0.14
print(L1_py)
## 20.93
L_py = L1_py + A_py * range(11)
print(L_py)
## [20.93       21.82285714 22.71571429 23.60857143 24.50142857 25.39428571
##  26.28714286 27.18       28.07285714 28.96571429 29.85857143]

Regla de la raíz cuadrada - Paso 4: Calcular las marcas de la clase.

Rstudio:

X1 = (L[1]+L[2])/2
X1
## [1] 21.37643
X = X1 +A*(0:9)
X
##  [1] 21.37643 22.26929 23.16214 24.05500 24.94786 25.84071 26.73357
##  [8] 27.62643 28.51929 29.41214

Python:

X1_py = (L_py[0]+L_py[1])/2
X1_py
## 21.37642857142857
X_py = X1_py + A_py * range(10)
X_py
## array([21.37642857, 22.26928571, 23.16214286, 24.055     , 24.94785714,
##        25.84071429, 26.73357143, 27.62642857, 28.51928571, 29.41214286])

3. Regla de Sturgest - Paso 1: Implementando Fórmula.

Rstudio:

k2 = ceiling(1+log(n,2)) # tomo la parte entera hacia arriba 
k2
## [1] 9
nclass.Sturges(cw)#Función Sturges en R
## [1] 9

Python:

k2_py = math.ceil(1+math.log(n_py,2)) # tomo la parte entera hacia arriba 
print(k2_py)
## 9

Regla de Sturgest - Paso 2: Decidir la amplitud de estos intervalos.

Rstudio:

A = diff(range(cw))/k2
A
## [1] 1.388889

Python:

A_py = (cw_py.max()-cw_py.min())/k2_py
A_py
## 1.3888888888888888

Regla de Sturgest - Paso 3: Calcular los extremos de los intervalos.

Rstudio:

L1 = min(cw)-1/2*0.09
L1
## [1] 20.955
L = L1 + A*(0:10)
L
##  [1] 20.95500 22.34389 23.73278 25.12167 26.51056 27.89944 29.28833
##  [8] 30.67722 32.06611 33.45500 34.84389

Python:

L1_py = cw_py.min()-1/2*0.09
print(L1_py)
## 20.955
L_py = L1_py + A_py * range(11)
print(L_py)
## [20.955      22.34388889 23.73277778 25.12166667 26.51055556 27.89944444
##  29.28833333 30.67722222 32.06611111 33.455      34.84388889]

Regla de Sturgest - Paso 4: Calcular las marcas de la clase.

Rstudio:

X1 = (L[1]+L[2])/2
X1
## [1] 21.64944
X = X1 +A*(0:9)
X
##  [1] 21.64944 23.03833 24.42722 25.81611 27.20500 28.59389 29.98278
##  [8] 31.37167 32.76056 34.14944

Python:

X1_py = (L_py[0]+L_py[1])/2
X1_py
## 21.64944444444444
X_py = X1_py + A_py * range(10)
X_py
## array([21.64944444, 23.03833333, 24.42722222, 25.81611111, 27.205     ,
##        28.59388889, 29.98277778, 31.37166667, 32.76055556, 34.14944444])

4. Regla de Freedman-Diaconis - Paso 1: Implementando Fórmula.

Rstudio:

#Amplitud teórica
afd = 2*(quantile(cw,0.75,names=FALSE)-quantile(cw,0.25,names = FALSE))*n^(-1/3)
k4 = ceiling(diff(range(cw))/afd)
k4
## [1] 13

Por commando:

nclass.FD(cw)
## [1] 13

Python:

#Amplitud teórica
afd_py = 2*(cw_py.quantile(0.75)-cw_py.quantile(0.25))*n_py**(-1/3)
k4_py = math.ceil((cw_py.max()-cw_py.min())/(afd_py))
print(k4_py)
## 13

Regla de Freedman-Diaconis - Paso 2: Decidir la amplitud de estos intervalos.

Rstudio:

A = diff(range(cw))/k4
A
## [1] 0.9615385

Python:

A_py = (cw_py.max()-cw_py.min())/k4_py
A_py
## 0.9615384615384616

Regla de Freedman-Diaconis - Paso 3: Calcular los extremos de los intervalos.

Rstudio:

L1 = min(cw)-1/2*0.13
L1
## [1] 20.935
L = L1 + A*(0:10)
L
##  [1] 20.93500 21.89654 22.85808 23.81962 24.78115 25.74269 26.70423
##  [8] 27.66577 28.62731 29.58885 30.55038

Python:

L1_py = cw_py.min()-1/2*0.13
print(L1_py)
## 20.935
L_py = L1_py + A_py * range(11)
print(L_py)
## [20.935      21.89653846 22.85807692 23.81961538 24.78115385 25.74269231
##  26.70423077 27.66576923 28.62730769 29.58884615 30.55038462]

Regla de Freedman-Diaconis - Paso 4: Calcular las marcas de la clase.

Rstudio:

X1 = (L[1]+L[2])/2
X1
## [1] 21.41577
X = X1 +A*(0:9)
X
##  [1] 21.41577 22.37731 23.33885 24.30038 25.26192 26.22346 27.18500
##  [8] 28.14654 29.10808 30.06962

Python:

X1_py = (L_py[0]+L_py[1])/2
X1_py
## 21.41576923076923
X_py = X1_py + A_py * range(10)
X_py
## array([21.41576923, 22.37730769, 23.33884615, 24.30038462, 25.26192308,
##        26.22346154, 27.185     , 28.14653846, 29.10807692, 30.06961538])