Mostrando entradas con la etiqueta estadística. Mostrar todas las entradas
Mostrando entradas con la etiqueta estadística. Mostrar todas las entradas

viernes, 15 de agosto de 2014

Python básico para estadística.

Python básico para estadística.

Categoría: 2. Ciencia y tecnología.

En esta entrada se presenta un ejercicio básico de estadística utilizando como herramienta el lenguaje de programación Python.

En un principio se trata de elaborar un programa mínimo en Python que pueda correrse sin dificultades. A continuación se agregan funciones para obtener un código más complejo.

Si encuentras de interés esta información, tal vez te sea útil visitar una entrada donde resuelvo problemas parecidos utilizando MATLAB: Análisis de varianza para un blog.

Se puede trabajar en la ventana de Python para realizar cálculos relativamente simples. Cálculos repetitivos se pueden manejar con funciones, que están activas solamente durante el tiempo que dura la sesión. Puede realizar por ejemplo los siguientes cálculos con números binarios:

>>> y=0b0001
>>> for i in range(1,5):
...             y=y<<1
...             print y
...
2
4
8
16
>>>

El primer paso es entonces crear un archivo de texto con el nombre estadistica_1.txt. Selecciona un destino donde puedas guardar estos archivos, por ejemplo, una memoria USB en la unidad E:(E:/estadistica_codigo.txt). En esta unidad también es recomendable crear una carpeta llamada python donde guardar los archivos con extensión .py: E:/python/.

También vas a utilizar el directorio raíz de la unidad E: para guardar los archivos de salida. 

Algunas instrucciones previas para explicar lo que vamos haciendo:
- En Python se coloca un signo hash (#) para iniciar un comentario.
- Se deben llamar las librerías necesarias que contengan las funciones que ocupamos en el código. Esto se hace al inicio, después del nombre del programa y los créditos.
- Se pueden crear funciones que se ejecutan desde la ventana principal de Python.
- La indentación es muy importante para que se ejecute el código.
- La instrucción print despliega los valores de salida en la ventana de sistema.
- En el manejo de archivos no olvides utilizar las instrucciones de apertura, f=open('file.txt',"w") y de cierre, f.close().

Ejercicio en la ventana principal de Python. Después de la primera instrucción, def writefile(): se debe pulsar la tecla tab al inicio de la siguentes instrucciones; las instrucciones que estén dentro del ciclo for necesitan dos tab de indentación. Escribir una función que envía datos a un archivo de salida:

>>> def writefile():
... f=open("E:/myfile.txt","a")
... f.write("\n")
... for i in range(-10,10):
... i=i**3
... print i,"\t"
... v=str(i) # Convierte int a cadena
... f.write(v)
... f.write("\t")
... f.close() 
...

Es importante mencionar algunos modos en que puede abrirse un archivo para escribir datos.

Escribir datos en archivo de salida:
- Función: open() # deveulve un objeto archivo
- open(nombre_de_archivo, modo)

modo acción
'r' Lectura
'w' Escritura
'a' Abre archivo para agregar información. 
El dato se agrega automáticamente al final.
'r+' Abre archivo tanto para lectura como para escritura.

Ahora vas a preparar el mismo programa en un archivo con extensión .py para poderlo ejecutar de manera repetitiva sin necesidad de escribirlo cada vez, como lo haces en la ventana principal de Python. Lo primero que destaca es que se elimina la linea con el nombre de la función - def writefile(): - y también se agrega la instrucción raw_input() al final del código.

f=open("E:/myfile.txt","a")
f.write("\n")
for i in range(-10,10):
i=i**3
print i,"\t"
v=str(i) # Convierte int a cadena
f.write(v)
f.write("\t")
f.close() 
raw_input()

Este código lo capturas en un archivo de texto: E:/vector_Codigo.txt; y guardas. Ahora seleccionas [Archivo] [Guardar como], te desplazas a la carpeta E:/python/ y guardas el archivo como E:/python/vector.py. Recuerda colocar las indentaciones (un tab) en la cinco instrucciones dentro del ciclo for.

Es importante que lleve la extensión .py, de lo contrario no podrá ejecutarse tu código. La máquina donde se corre el programa debe tener instalado Python 2.7. En el explorador de archivos seleccionas el archivo vector.py y das [Enter]. Aparece una ventana de sistema desplegando los resultados. Das [Enter] para cerrar esta ventana de salida y te desplazas en el explorador de archivos hasta E: Ahí seleccionas el archivo myfile.txt y das [Enter]. Entonces puedes ver los resultados de tu primer programa. 

Nota que para este programa sólo utilizas funciones instaladas en la librería principal. Por eso no se incluyeron bibliotecas en el inicio del código.

******************************           *************************************
En el siguiente ejemplo se parte de tres conjuntos de datos, vectores dataset_1, dataset_2 y dataset_3, y se realizan los cálculos de la prueba de Wilcoxon y la prueba de Kruskal-Wallis.

La prueba de Wilcoxon se utiliza para poner a prueba la hipótesis nula Ho: mu1=mu2, contra la hipótesis alternativa H1: mu1 != mu2. Si el valor calculado para la prueba, w_calculada, es menor o igual que w_alfa, la hipótesis nula se rechaza (en este caso != se lee "no igual o diferente a").

Esta prueba solo se utiliza para la comparación de datos en pares. En el ejemplo, la prueba se realiza sobre los conjuntos de datos dataset_1 vs dataset_2 y sobre dataset_2 vs dataset_3.

Puedes ver el código de Programa1 al fina de esta página. La figura siguiente muestra la ventana de salida.


Salida de Programa1.

Para n=10 y alfa=0.05 el valor de w_alfa es w_alfa=8; para la prueba de dos extremos (este valor lo obtienes de tablas estadísticas, valores para la prueba de Wilcoxon).

En la comparación de los conjuntos dataset_1 vs dataset_2 la prueba genera los siguientes resultados: 8.5, 0.05. El primero corresponde a w+ y el segundo a w-. Como el menor de estos valores es menor que w_alfa se rechaza Ho: mu1=mu2 para dataset_1 vs dataset_2. El siguiente resultado muestra 0.0, 0.01, se rechaza Ho: mu1=mu2 para dataset_2 vs dataset_3.

La prueba de Kruskal-Wallis se utiliza para comparar los promedios de dos o más conjuntos de datos, que pueden ser los resultados de tratamientos diferentes en un experimento. Cuando se presume que los datos no muestran una distribución normal. El estadístico de prueba, H, se compara con el valor de Xi^2 con significancia alfa y a-1 grados de libertad. Donde a es el número de conjuntos de datos o tratamientos de donde provienen las muestras. Si el valor de H es mayor que Xi^2,alfa,a-1, Ho se rechaza. Se trata de probar Ho: mu1=mu2= ... =mu_n.

El resultado que muestra el programa despliega el valor de S^2 y de H. En el ejemplo S^2=22.5 y H=1.3e-5. Como el valor de X^2,0.05,2 es de 5.99, el estadístico de prueba cae dentro de la zona de rechazo de Ho. De manera que dataset_1 != dataset_2 != dataset_3.

La curtosis es un valor que indica la forma en que se distribuyen los datos alrededor de la media. Un valor elevado indica que los datos se concentran cerca de la media. En este ejemplo se tienen valores bajos para la curtosis. Esto se explica por la gran dispersión alrededor del promedio, como lo indican los valores altos de la varianza.

******************************            *************************************

En el ejemplo a continuación, se presenta el análisis de varianza para los tres conjuntos de datos que se utilizaron en el ejemplo anterior.

Puedes ver el código de Programa2 al fina de esta página. La salida del programa tiene el aspecto siguiente:


Salida de Programa2:

El resultado del análisis de varianza muestra que el valor del estadístico de prueba es F=204.1; el otro es el valor del estadístico p, que en este caso es p=5.01e-17. Para una prueba con significancia alfa=0.05 la hipótesis nula Ho: mu1=mu2=mu3 se rechaza. En este caso es claro por el elevado valor de F, marcadamente dentro de la zona de rechazo. El valor de p<<0.05 indica que el estadístico de prueba quedó bastante dentro de la zona de rechazo de Ho.

Debe recordarse que en esta prueba debe rechazarse Ho: tao_1=tao_2= ... tao_n=0, si f_obs > f_alfa_a-1_a(n-1).

El valor F con n-1 grados de libertad en el numerador y a(n-1) grados de libertad en el denominador y significancia alfa=0.05, que para este caso es F0.05,2,27=3.35, comparado con el valor f_obs=204.1 nos dice que se debe rechazar Ho.

******************************            *************************************

Ahora una función que crea un vector de nombre A y lo llena con valores generados aleatoriamente.

Puedes ver el código de Programa3 al fina de esta página. La salida del programa tiene el aspecto siguiente:


Salida Programa3.

Los valores de salida son diferentes cada vez que se corre el programa. De manera que nunca vas a obtener los mismos resultados que aparecen en esta imagen.

El programa genera un conjunto de 1000 valores con un generador de números aleatorios con distribución normal. En la salida se muestran los estadísticos que describen al conjunto. Aparece la media, mediana, mínimo, máximo, varianza, sesgo, curtosis y percentil 90.

El sesgo es un valor de la asimetría que se aplica a un histograma o a una distribución de probabilidad. Como la curtosis, es un valor que describe la simetría de un conjunto de datos alrededor del promedio. Su valor puede ser positivo, negativo, cero o inclusive una indefinición. Su interpretación no es muy directa, pero en una distribución unimodal un valor negativo del sesgo indica que hay una cola más alargada en el lado izquierdo de la función de densidad de probabilidad.

*************************                               ****************************

Conclusiones.

Los estadísticos que describen un conjunto de datos pueden calcularse de manera sencilla en python.

El análisis de varianza para hacer comparaciones entre las varianzas de varios conjuntos de datos para saber si provienen de poblaciones independientes, se puede hacer con python de manera rápida.

Una vez que se corren algunos ejercicios en python se puede experimentar con programas más complicados.

Visita la página web de python. Ahí puedes descargar python 2.7, por ahora la versión más reciente.

También puedes visitar la página web de SciPy, donde puedes descargar librerías: NumPy, SciPy, SymPy, MatPlotLib y Pandas.





Bibliografía.

Montgomery, Douglas C., and George C. Runger. 2003. Applied statistics and probability for engineers. Third edition. John Willey $ Sons Inc. United States of America.

Cárdenas Montes, Miguel. Estadística. Site: http://wwwae.ciemat.es/~cardenas/curso_MD/Estadistica.pdf


************************************                     ******************************
************************************                     ******************************
Código Programa1:

# Practica: Estadistica inferencia
# Se trabaja sobre los mismos datos que Estadistica basica
# Prueba de Kruskal-Wallis
# Prueba de Wilcoxon con signo

import scipy.stats

dataset_1=[326.4,324.9,316.3,302.8,317.0,325.4,311.9,322.4,312.1,322.2]
dataset_2=[299.0,301.9,309.4,316.9,304.8,314.2,305.3,308.9,312.5,308.1]
dataset_3=[264.8,275.9,259.0,270.6,266.7,261.8,266.1,268.4,266.2,267.4]

print 'dataset_1: ',dataset_1,'\n','Media: ',scipy.mean(dataset_1)
print 'dataset_2: ',dataset_2,'\n','Media: ',scipy.mean(dataset_2)
print 'dataset_3: ',dataset_3,'\n','Media: ',scipy.mean(dataset_3)

f=open('E:/Estadistica_Inferencia.txt','a')

f.write("Dataset_1: " + str(dataset_1) + '\n')
f.write("Media dataset_1: " + str(scipy.mean(dataset_1)) + '\n')
f.write("Dataset_2: " + str(dataset_2) + '\n')
f.write("Media dataset_2: " + str(scipy.mean(dataset_2)) + '\n')
f.write("Dataset_3: " + str(dataset_3) + '\n')
f.write("Media dataset_3: " + str(scipy.mean(dataset_3)) + '\n')

print 'dataset_1 Median: ',scipy.median(dataset_1)
f.write("Dataset_1 Median: " + str(scipy.median(dataset_1)) + '\n')
print 'dataset_2 Median: ',scipy.median(dataset_2)
f.write("Dataset_2 Median: " + str(scipy.median(dataset_2)) + '\n')
print 'dataset_3 Median: ',scipy.median(dataset_3)
f.write("Dataset_3 Median: " + str(scipy.median(dataset_3)) + '\n')

print 'dataset_1 Min: ',min(dataset_1)
f.write("Dataset_1 Min: " + str(min(dataset_1)) + '\n')
print 'dataset_2 Min: ',min(dataset_2)
f.write("Dataset_2 Min: " + str(min(dataset_2)) + '\n')
print 'dataset_3 Min: ',min(dataset_3)
f.write("Dataset_3 Min: " + str(min(dataset_3)) + '\n')

print 'dataset_1 Max: ',max(dataset_1)
f.write("Dataset_1 Max: " + str(max(dataset_1)) + '\n')
print 'dataset_2 Max: ',max(dataset_2)
f.write("Dataset_2 Max: " + str(max(dataset_2)) + '\n')
print 'dataset_3 Max: ',max(dataset_3)
f.write("Dataset_3 Max: " + str(max(dataset_3)) + '\n')

print 'dataset_1 Var: ',scipy.var(dataset_1)
f.write("Dataset_1 Var: " + str(scipy.var(dataset_1)) + '\n')
print 'dataset_2 Var: ',scipy.var(dataset_2)
f.write("Dataset_2 Var: " + str(scipy.var(dataset_2)) + '\n')
print 'dataset_3 Var: ',scipy.var(dataset_3)
f.write("Dataset_3 Var: " + str(scipy.var(dataset_3)) + '\n')

print 'dataset_1 Sesgo: ',scipy.stats.skew(dataset_1)
f.write("Dataset_1 Sesgo: " + str(scipy.stats.skew(dataset_1)) + '\n')
print 'dataset_2 Sesgo: ',scipy.stats.skew(dataset_2)
f.write("Dataset_2 Sesgo: " + str(scipy.stats.skew(dataset_2)) + '\n')
print 'dataset_3 Sesgo: ',scipy.stats.skew(dataset_3)
f.write("Dataset_3 Sesgo: " + str(scipy.stats.skew(dataset_3)) + '\n')

print 'dataset_1 Kurtosis: ',scipy.stats.kurtosis(dataset_1)
f.write("Dataset_1 Kurtosis: " + str(scipy.stats.kurtosis(dataset_1)) + '\n')
print 'dataset_2 Kurtosis: ',scipy.stats.kurtosis(dataset_2)
f.write("Dataset_2 Kurtosis: " + str(scipy.stats.kurtosis(dataset_2)) + '\n')
print 'dataset_3 Kurtosis: ',scipy.stats.kurtosis(dataset_3)
f.write("Dataset_3 Kurtosis: " + str(scipy.stats.kurtosis(dataset_3)) + '\n')

KW_test=scipy.stats.kruskal(scipy.array(dataset_1),scipy.array(dataset_2),scipy.array(dataset_3))

Wi_test_1vs2=scipy.stats.wilcoxon(dataset_1,dataset_2)
Wi_test_2vs3=scipy.stats.wilcoxon(dataset_2,dataset_3)

print 'Kruskal-Wallis test: ',KW_test

f.write("Kruskal-Wallis test: " + str(KW_test) + '\n')

f.write("Wilcoxon signed-rank test dataset_1 vs dataset_2: " + str(Wi_test_1vs2) + '\n')
f.write("Wilcoxon signed-rank test dataset_2 vs dataset_3: " + str(Wi_test_2vs3) + '\n')

print 'Wilcoxon signed-rank test dataset_1 vs dataset_2: ',Wi_test_1vs2
print 'Wilcoxon signed-rank test dataset_2 vs dataset_3: ',Wi_test_2vs3

f.write('\n')
f.close()


raw_input()

*******************************                          ****************************
Código Programa2:

# Practica: ANOVA
#
# print 'X= %5.3f' % X[i]

import numpy as np
import scipy.stats
import random
from numpy import array
from scipy.stats import kstest

dataset_1=[326.4,324.9,316.3,302.8,317.0,325.4,311.9,322.4,312.1,322.2]
dataset_2=[299.0,301.9,309.4,316.9,304.8,314.2,305.3,308.9,312.5,308.1]
dataset_3=[264.8,275.9,259.0,270.6,266.7,261.8,266.1,268.4,266.2,267.4]

f=open('E:/Estadistica_ANOVA.txt','a')
anova_ans=scipy.stats.f_oneway(dataset_1,dataset_2,dataset_3)
print 'ANOVA: ',anova_ans

f.write('ANOVA: ')
w=str(anova_ans)
f.write(w)
f.write("\n")

# ***
f.write('dataset_1: ')
v=str(dataset_1)
f.write(v)
f.write("\n")

f.write('dataset_2: ')
v=str(dataset_2)
f.write(v)
f.write("\n")

f.write('dataset_3: ')
v=str(dataset_3)
f.write(v)
f.write("\n")

# ***
v=scipy.mean(dataset_1)
print 'Mean dataset_1: ',v
w=str(v)
f.write('Mean dataset_1: ')
f.write(w)
f.write("\n")

v=scipy.mean(dataset_2)
print 'Mean dataset_2: ',v
w=str(v)
f.write('Mean dataset_2: ')
f.write(w)
f.write("\n")

v=scipy.mean(dataset_3)
print 'Mean dataset_3: ',v
w=str(v)
f.write('Mean dataset_3: ')
f.write(w)
f.write("\n")

# ***
v=scipy.var(dataset_1)
print 'Var dataset_1: ',v
w=str(v)
f.write('Var dataset_1: ')
f.write(w)
f.write("\n")

v=scipy.var(dataset_2)
print 'Var dataset_2: ',v
w=str(v)
f.write('Var dataset_2: ')
f.write(w)
f.write("\n")

v=scipy.var(dataset_3)
print 'Var dataset_3: ',v
w=str(v)
f.write('Var dataset_3: ')
f.write(w)
f.write("\n")

# ***
v=scipy.stats.skew(dataset_1)
print 'sesgo dataset_1: ',v
w=str(v)
f.write('sesgo dataset_1: ')
f.write(w)
f.write("\n")

v=scipy.stats.skew(dataset_2)
print 'sesgo dataset_2: ',v
w=str(v)
f.write('sesgo dataset_2: ')
f.write(w)
f.write("\n")

v=scipy.stats.skew(dataset_3)
print 'sesgo dataset_3: ',v
w=str(v)
f.write('sesgo dataset_3: ')
f.write(w)
f.write("\n")

# ***
v=scipy.stats.kurtosis(dataset_1)
print 'curtosis dataset_1: ',v
w=str(v)
f.write('curtosis dataset_1: ')
f.write(w)
f.write("\n")

v=scipy.stats.kurtosis(dataset_2)
print 'curtosis dataset_2: ',v
w=str(v)
f.write('curtosis dataset_2: ')
f.write(w)
f.write("\n")

v=scipy.stats.kurtosis(dataset_3)
print 'curtosis dataset_3: ',v
w=str(v)
f.write('curtosis dataset_3: ')
f.write(w)
f.write("\n")

# ***
v=kstest(dataset_1,'norm')
print 'KS test, Gaussian dataset_1?',v
w=str(v)
f.write('KS test, Gaussian dataset_1? ')
f.write(w)
f.write("\n")

v=kstest(dataset_2,'norm')
print 'KS test, Gaussian dataset_2?',v
w=str(v)
f.write('KS test, Gaussian dataset_2? ')
f.write(w)
f.write("\n")

v=kstest(dataset_3,'norm')
print 'KS test, Gaussian dataset_3?',v
w=str(v)
f.write('KS test, Gaussian dataset_3? ')
f.write(w)
f.write("\n")

f.write("\n")
f.close()
raw_input()


*********************************                        *****************************
Código Programa3:

# Practica: Estadistica Ajuste
#

import numpy
import numpy as np
import scipy.stats
from scipy import stats

a=numpy.random.normal(size=1000)
loc, std=stats.norm.fit(a)
print loc,'\n',std

f=open('E:/Estadistica_Ajuste.txt','a')
f.write(str(loc) + str(std) + '\n')

v=scipy.mean(a)
print 'Mean: ',v
f.write('Mean: ' + str(v) + '\n')

v=scipy.median(a)
print 'Median: ',v
f.write('Median: ' + str(v) + '\n')

v=min(a)
print 'Min: ',v
f.write('Min: ' + str(v) + '\n')

v=max(a)
print 'Max: ',v
f.write('Max: ' + str(v) + '\n')

v=scipy.var(a)
print 'Var: ',v
f.write('Var: ' + str(v) + '\n')

v=scipy.stats.skew(a)
print 'Sesgo: ',v
f.write('Sesgo: ' + str(v) + '\n')

v=scipy.stats.kurtosis(a)
print 'Kurtosis: ',v
f.write('Kurtosis: ' + str(v) + '\n')

v=scipy.stats.scoreatpercentile(a,90)
print 'Percentil 90: ',v
f.write('Percentil 90: ' + str(v) + '\n')

f.write('\n')
f.close()



raw_input()


*********************************                     ***************************





domingo, 8 de septiembre de 2013

Análisis de varianza para un Blog

Análisis de varianza para un Blog.

Categoría: 2. Ciencia y tecnología.

Las entradas de este Blog, "La epistemología en la práctica", son preparadas con base en información obtenida de bibliografía especializada, artículos publicados en internet, información proporcionada en los museos y otras fuentes. La epistemología estudia las formas en las que se genera el conocimiento y cómo éste se traslada a la mente humana. Así, es interesante encontrar el camino que siguieron los descubrimientos científicos y tecnológicos para alcanzar su estado último de desarrollo.

Si encuentras información de tu interés en esta entrada, puede que te sirva también visitar en este mismo blog: Python básico para estadística.

Un análisis atractivo para obtener información sobre el desempeño de un Blog se obtiene al tabular y graficar las entradas contra el número de ingresos. Esto permite visualizar los temas que más impactan sobre el interés de los lectores o internautas, en este caso, y que por lo tanto, se convierten en las entradas más visitadas y leídas. Es importante comentar también que un número reducido de entradas, además de indicar que su contenido es poco atractivo, indica que tal vez ni siquiera han sido leídas, ya que se debe recordar que los buscadores de internet arrojan gran cantidad de sitios para los resultados de una búsqueda y por lo tanto, algunas de las visitas sólo sirven para descartar las opciones que quedan fuera del interés particular del lector potencial.

Adelante se presenta una tabla (Tabla 1 y Figura 1) con los títulos de las entradas publicadas, un total de 50, junto con la fecha de su publicación y el número de entradas acumulado al 10 de junio de 2013.


Tabla 1. Título de las entradas, fecha de su publicación y número de entradas acumulado al 10 de junio de 2013.





Figura 1. Título de las entradas, fecha de su publicación y número de entradas acumulado al 10 de junio de 2013.


A partir de este análisis preliminar es posible poner el énfasis en los temas que han sido más exitosos, en términos del mayor número de visitas. Para esto se puede proceder de manera inicial clasificando las entradas en grupos y obtener las sumas parciales de número de visitantes.

Antes de continuar se puede comentar que entre otras ayudas que presenta el Blogger de Google es el despliegue de estadísticas de visitas por país, que para este Blog se presenta en forma de Tabla (Tabla 2), de la siguiente manera:

Tabla 2. Número de ingresos por país.


El número de ingresos por tema (Tabla 3) se distribuye de la siguiente manera:

Tabla 3. Número de ingresos por tema de la entrada.



Los datos anteriores sugieren que existe una clara preferencia por algunos temas sobre otros. Además se debe notar que el título de las entradas parece tener un cierto efecto sobre la atracción de visitantes a su lectura, por ejemplo, en el tema 4 (Cine y literatura), se tienen números de visitantes más bajos, pero también hay una entrada que tuvo gran número de visitas, es el caso de la entrada titulada "Algo de cine. Labios rojos." con 52 entradas acumuladas. Tal vez las mujeres que buscan consejos para el uso de sus cosméticos pueden estar ingresando, aunque se encuentran con que el tema no corresponde con el de su búsqueda. Es posible también, que los buscadores de temas de carácter erótico se estén encontrando con esta entrada, de acuerdo con las palabras clave que utilicen en su búsqueda. Esto debe tomarse en cuenta para no atraer la atención de lectores que buscan con palabras que corresponden a su criterio de interés y que se encuentren de pronto en un sitio que no tiene el mismo tema de interés.

La tabla anterior, una vez clasificadas las entradas, puede sintetizarse de la siguiente manera (Tabla 4):

Tabla 4. Temas de las entradas, número de entradas por tema y número de ingresos por tema.


Los datos de la tabla anterior pueden visualizarse más claramente en la forma de un gráfico de barras como el siguiente (Figura 2):


Figura 2. Número de entradas y número de ingresos por tema.

Un análisis más preciso de estos datos nos permite obtener conclusiones acerca de la validez estadística de las diferencias numéricas encontradas en los resultados presentados hasta ahora. Para esto se obtuvieron intervalos de confianza para el número de ingresos por tema utilizando la distribución T de Student, lo cual permite comparar pares de promedios. En este caso el intervalo de confianza al 95% se puede interpretar para cada par de promedios. Si no hay traslape entre los intervalos de confianza, se tienen promedios estadísticamente diferentes al 95% de confianza. Si se quiere obtener un resultado aún más válido estadísticamente, es necesario hacer un análisis de varianza para comparar los cuatro promedios obtenidos, bajo un modelo completamente aleatorizado.

Por lo pronto se presentan los resultados comentados hasta ahora para el número de ingresos. La tabla de número de ingresos por tema queda de la siguiente manera (Tabla 5 y Figura 3):

Tabla 5. Intervalo de confianza para los temas de las entradas.




Figura 3. Intervalos de confianza al 95% para el número de ingresos por tema.

Ahora se puede concluir que el tema 3 (Humanidades y comportamiento humano) y tema 4 (Cine y literatura) tuvieron estadísticamente igual número de ingresos y sus promedios fueron los más bajos de los cuatro grupos. El tema 2 (Ciencia y tecnología) tuvo 130 ingresos y fue el segundo tema con más ingresos. El tema 1 (Programación y electrónica) tuvo 343 ingresos y fue el tema con más ingresos.

Se realizó una comparación de promedios con la distribución T-Student para los promedios de los temas 3 y 4. El valor de p=0.0160, con un valor para t-calculada de -2.6110 y valores de t-crítico de -3.1772 y +3.1772, es decir, el valor de t-calculada cae dentro de la zona de aceptación de la hipótesis nula Ho : µ1=µ2, con valor alfa=0.05. De manera que estos valores son estadísticamente diferentes.

Análisis de varianza
El análisis de varianza se realizó mediante un programa para MATLAB. Este análisis compara el número de ingresos para cada tema mediante la hipótesis nula Ho : µ1=µ2=µ3=µ4. La instrucción anova1(X,group) genera un análisis de varianza para datos desbalanceados, genera una tabla de resultados del análisis de varianza (Tabla 6) y un gráfico de cajas (Figura 4) para los datos proporcionados en la matriz X. El gráfico de cajas muestra el valor promedio de ingresos, el tercer cuartil, el intervalo de confianza al 95% y los valores extremos - y +. El código de MATLAB para realizar este análisis de varianza es el siguiente:

>>X=[1 8 4 52; 5 8 2 2; 3 2 9 4; 4 15 4 3; 20 7 22 1; 3 3 2 2; 17 19 7 2; 
    80 12 4 6; 48 15 4 6; 102 14 5 10; 35 25 4 NaN; 24 2 2 NaN;
    1 NaN 6 NaN; NaN NaN 4 NaN; NaN NaN 5 NaN];
>>A=[1 2 3 4];
>>[p, table]=anova1(X,A)
>>xlabel('Tema de entrada')
>>ylabel('Numer de ingresos')
>>text(2, 100, 'Grafico de ingresos por tema')

Tabla 6. Análisis de varianza para número de entradas por tema.




Figura 4. Gráfico de cajas para los datos de número ingresos por tema.

Como puede verse en la Tabla 6, el valor de p=0.028 indica que el estadístico de prueba cae dentro de la zona de rechazo de Ho, de manera que los temas son estadísticamente diferentes en el número de ingresos, con una significancia de 95%.

Las conclusiones estadísticas obtenidas mediante la técnica del análisis de varianza eran hasta cierto punto obvias desde el inicio. Sin embargo, otras conclusiones igualmente útiles pueden no ser tan obvias en un primer vistazo de los datos. Por ejemplo, ahora se va a hacer un análisis del número de ingresos contra la antigüedad de la entrada. En primer lugar, se acomodan los datos para mostrarlos en un formato más cómodo para el lector. El presentar los datos con un formato dedicado a mostrar una relación posible con algún factor en estudio, es una técnica que permite visualizar un posible comportamiento, que de otra manera permanecería oculto para el lector menos familiarizado con el tema o con las técnicas de análisis de datos.

Para este análisis se van a descartar los temas 3 y 4 que tienen un número significativamente menor de ingresos, y se va a centrar en las entradas más visitadas que son los temas 1 y 2. Así, los datos quedan de la siguiente forma (Tabla 7):

Tabla 7. Coeficiente de correlación para antigüedad (valores x) y número de ingresos (valores y).


Todo este formateo de datos se hizo con una hoja de cálculo, en este caso con Excel de Microsoft Office.

Para probar la hipótesis de que las entradas de mayor antigüedad serían las entradas con más ingresos de usuarios, se ordenaron los datos utilizando la antigüedad como criterio, y se calculó el coeficiente de correlación para los datos Antigüedad (valor de x) y el número de ingresos (valor de y). El coeficiente de correlación calculado fue de -0.3302, esto quiere decir en primer lugar, que a mayor antigüedad hubo menor número de ingresos, pero este valor es muy bajo, lo cual indica que el comportamiento no es consistente. Esto se puede apreciar mejor en un gráfico con una línea de tendencia, como se muestra a continuación:



Figura 5. Gráfico de antigüedad contra número de ingresos y línea obtenida por regresión lineal.

La línea de tendencia (recta), obtenida por regresión lineal por mínimos cuadrados, muestra un valor de pendiente sumamente bajo (Figura 5), como se comentó antes y el coeficiente de correlación (R^2) también sumamente bajo. Con esto se refuerza la conclusión de que el número de ingresos no depende de la antigüedad de la entrada.

Conclusiones.
El tema de las entradas es el factor principal que determina el número de ingresos para cada entrada del Blog.

El título de las entradas es importante para evitar atraer lectores que realmente no están interesados en el tema que se trata. Esto es importante, pues las personas que no encuentran el material que requieren, permanecen poco tiempo, no leen realmente la entrada y es menos probable que se enlacen con alguna página de los anunciantes que aparecen en ese momento en el Blog.

Las personas que ingresan en las diferentes entradas del Blog, pero no lo leen, por tener otros intereses en mente, son un factor de sesgo para la popularidad del Blog. Puede parecer que una entrada sea leída muy frecuentemente cuando en realidad la mayoría de los ingresos fueron por equivocación, por una asociación correcta del buscador con los criterios de búsqueda, pero una asociación incorrecta del título de la entrada con su contenido.

La antigüedad de la entrada no es un factor que determine el número de ingresos hacia una entrada en particular.

Los ingresos por país fueron en los Estados Unidos en su mayoría, después estuvo México y otros países de habla hispana le siguieron, empezando con España.

Bibliografía
Baker, Stephen. 2009. Los numerati. Editorial Planeta. México.
Montgomery, Douglas C., y George C. Runger. 1996. Probabilidad y estadística aplicadas a la ingeniería. McGraw-Hill. México.

Procesamiento de los datos
En el procesamiento de los datos se emplearon los programas computacionales Microsoft Word Starter, Microsoft Office Excel y MATLAB. Además se empleó una calculadora HP-50G.