Published on

May 3, 2020

Генерация нормального распределения в SQL Server

В статистическом анализе нормальное распределение, также известное как колоколообразная кривая, является распределением вероятностей, которое симметрично и следует определенному закономерному образцу. В SQL Server мы можем сгенерировать нормальное распределение с помощью кода T-SQL. В этой статье мы рассмотрим, как сгенерировать нормальное распределение с определенным средним, стандартным отклонением и точностью.

Создание временной таблицы

Сначала давайте создадим временную таблицу для хранения сгенерированных значений:

IF OBJECT_ID('tempdb..#tblNormalDistribution') IS NOT NULL
  DROP TABLE #tblNormalDistribution

CREATE TABLE #tblNormalDistribution (x FLOAT)

Установка переменных

Затем нам нужно объявить и установить переменные для нашего нормального распределения:

DECLARE @pi FLOAT, @2pi FLOAT, @randNum1 FLOAT, @randNum2 FLOAT
DECLARE @value1 FLOAT, @value2 FLOAT
DECLARE @iteration INT, @numberOfIterations INT
DECLARE @mean FLOAT
DECLARE @stdDev FLOAT --стандартное отклонение
DECLARE @precision INT --количество знаков после десятичной точки

SELECT @iteration = 0
SELECT @pi = PI()
SELECT @2pi = 2.0 * @pi
SELECT @mean = 75.0
SELECT @stdDev = 5.0
SELECT @precision = 1
SELECT @numberOfIterations = 500 --Два значения будут сгенерированы на каждой итерации

Генерация нормального распределения

Теперь давайте войдем в цикл для генерации и вставки наших значений с нормальным распределением:

WHILE (@iteration < @numberOfIterations)
BEGIN
  SELECT @randNum1 = RAND()
  SELECT @randNum2 = RAND()
  SELECT @value1 = ROUND((SQRT(-2.0 * LOG(@randNum1)) * COS(@2pi * @randNum2)) * @stdDev, @precision) + @mean
  SELECT @value2 = ROUND((SQRT(-2.0 * LOG(@randNum1)) * SIN(@2pi * @randNum2)) * @stdDev, @precision) + @mean
    
  INSERT INTO #tblNormalDistribution (x) VALUES (@value1)
  INSERT INTO #tblNormalDistribution (x) VALUES (@value2)

  SELECT @iteration = @iteration + 1
END

Проверка нормального распределения

После загрузки данных во временную таблицу мы можем выполнить следующий код T-SQL, чтобы проверить, что наши данные имеют нормальное распределение:

SELECT COUNT(*) AS [Count],
       MIN(x)   AS [Min],
       MAX(x)   AS [Max],
       AVG(x)   AS [Average],
       STDEV(x) AS [Standard Deviation]
FROM #tblNormalDistribution

Результат выполнения вышеприведенного запроса покажет количество, минимальное значение, максимальное значение, среднее и стандартное отклонение сгенерированных значений.

Генерация гистограммы

Если мы хотим визуализировать распределение сгенерированных значений, мы можем создать гистограмму с помощью следующего запроса T-SQL:

SELECT ROUND(x, 0) AS testValue,
       COUNT(*) AS testValueCount
FROM #tblNormalDistribution
GROUP BY ROUND(x, 0)
ORDER BY testValue

Этот запрос сгруппирует значения в корзины и подсчитает количество значений в каждой корзине. Результат можно использовать для создания гистограммы.

Следуя описанным в этой статье шагам, вы можете сгенерировать нормальное распределение в SQL Server с определенным средним, стандартным отклонением и точностью. Это может быть полезно в различных сценариях статистического анализа.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.