Модуль:Statistics

Материал из Поле цифровой дидактики

Краткое описание

Модуль Statistics используется для простых статистических расчётов по числовым данным, переданным в виде строки со значениями через запятую.

Модуль позволяет вычислять:

  • среднее арифметическое;
  • медиану;
  • дисперсию;
  • стандартное отклонение;
  • сумму;
  • количество элементов;
  • минимум и максимум;
  • корреляцию Пирсона для двух наборов данных.

Также модуль может формировать краткую сводную таблицу статистических показателей в формате wikitable.

Использование

Общий вызов модуля:

{{#invoke:Statistics|functionName|arg1|arg2|...}}

Примеры

Среднее значение:

{{#invoke:Statistics|mean|10,20,30,40}}

Медиана:

{{#invoke:Statistics|median|10,20,30,40,50}}

Сумма:

{{#invoke:Statistics|sum|5,10,15}}

Минимум и максимум:

{{#invoke:Statistics|minmax|3,7,2,9,5}}

Корреляция двух наборов данных:

{{#invoke:Statistics|correlation|1,2,3,4|2,4,6,8}}

Сводная таблица:

{{#invoke:Statistics|summary|12,15,18,20,22,25}}

-- Модуль для статистических расчетов
-- Использование: {{#invoke:Statistics|functionName|arg1|arg2|...}}

local stats = {}

-- Функция для разбора CSV-строки
local function parseCSV(str)
    local numbers = {}
    for num in string.gmatch(str, "[^,]+") do
        table.insert(numbers, tonumber(num))
    end
    return numbers
end

-- Функция для расчета среднего арифметического (mean)
function stats.mean(frame)
    local data = parseCSV(frame.args[1])
    if #data == 0 then return "Ошибка: пустые данные" end
    
    local sum = 0
    for _, v in ipairs(data) do
        sum = sum + v
    end
    
    local mean = sum / #data
    return string.format("%.2f", mean)
end

-- Функция для расчета медианы
function stats.median(frame)
    local data = parseCSV(frame.args[1])
    if #data == 0 then return "Ошибка: пустые данные" end
    
    -- Сортировка данных
    table.sort(data)
    
    local n = #data
    local median
    
    if n % 2 == 0 then
        median = (data[n/2] + data[n/2 + 1]) / 2
    else
        median = data[math.ceil(n/2)]
    end
    
    return string.format("%.2f", median)
end

-- Функция для расчета дисперсии (variance)
function stats.variance(frame)
    local data = parseCSV(frame.args[1])
    if #data == 0 then return "Ошибка: пустые данные" end
    
    -- Расчет среднего значения
    local sum = 0
    for _, v in ipairs(data) do
        sum = sum + v
    end
    local mean = sum / #data
    
    -- Расчет дисперсии
    local variance_sum = 0
    for _, v in ipairs(data) do
        variance_sum = variance_sum + (v - mean) ^ 2
    end
    
    local variance = variance_sum / (#data - 1)
    return string.format("%.2f", variance)
end

-- Функция для расчета стандартного отклонения (standard deviation)
function stats.stddev(frame)
    local data = parseCSV(frame.args[1])
    if #data == 0 then return "Ошибка: пустые данные" end
    
    -- Расчет среднего значения
    local sum = 0
    for _, v in ipairs(data) do
        sum = sum + v
    end
    local mean = sum / #data
    
    -- Расчет дисперсии
    local variance_sum = 0
    for _, v in ipairs(data) do
        variance_sum = variance_sum + (v - mean) ^ 2
    end
    
    local variance = variance_sum / (#data - 1)
    local stddev = math.sqrt(variance)
    
    return string.format("%.2f", stddev)
end

-- Функция для минимума и максимума
function stats.minmax(frame)
    local data = parseCSV(frame.args[1])
    if #data == 0 then return "Ошибка: пустые данные" end
    
    local min_val = data[1]
    local max_val = data[1]
    
    for _, v in ipairs(data) do
        if v < min_val then min_val = v end
        if v > max_val then max_val = v end
    end
    
    return "Мин: " .. string.format("%.2f", min_val) .. 
           " | Макс: " .. string.format("%.2f", max_val)
end

-- Функция для расчета суммы
function stats.sum(frame)
    local data = parseCSV(frame.args[1])
    if #data == 0 then return "Ошибка: пустые данные" end
    
    local sum = 0
    for _, v in ipairs(data) do
        sum = sum + v
    end
    
    return string.format("%.2f", sum)
end

-- Функция для расчета количества элементов (count)
function stats.count(frame)
    local data = parseCSV(frame.args[1])
    return tostring(#data)
end

-- Функция для расчета корреляции Пирсона
function stats.correlation(frame)
    local data_x = parseCSV(frame.args[1])
    local data_y = parseCSV(frame.args[2])
    
    if #data_x ~= #data_y then
        return "Ошибка: размеры массивов не совпадают"
    end
    if #data_x == 0 then
        return "Ошибка: пустые данные"
    end
    
    -- Средние значения
    local mean_x = 0
    local mean_y = 0
    for i = 1, #data_x do
        mean_x = mean_x + data_x[i]
        mean_y = mean_y + data_y[i]
    end
    mean_x = mean_x / #data_x
    mean_y = mean_y / #data_y
    
    -- Расчет корреляции
    local numerator = 0
    local denominator_x = 0
    local denominator_y = 0
    
    for i = 1, #data_x do
        numerator = numerator + (data_x[i] - mean_x) * (data_y[i] - mean_y)
        denominator_x = denominator_x + (data_x[i] - mean_x) ^ 2
        denominator_y = denominator_y + (data_y[i] - mean_y) ^ 2
    end
    
    local correlation = numerator / math.sqrt(denominator_x * denominator_y)
    return string.format("%.4f", correlation)
end

-- Функция для создания таблицы статистики
function stats.summary(frame)
    local data = parseCSV(frame.args[1])
    if #data == 0 then return "Ошибка: пустые данные" end
    
    local sum = 0
    for _, v in ipairs(data) do
        sum = sum + v
    end
    local mean = sum / #data
    
    local variance_sum = 0
    for _, v in ipairs(data) do
        variance_sum = variance_sum + (v - mean) ^ 2
    end
    local variance = variance_sum / (#data - 1)
    local stddev = math.sqrt(variance)
    
    table.sort(data)
    local n = #data
    local median
    if n % 2 == 0 then
        median = (data[n/2] + data[n/2 + 1]) / 2
    else
        median = data[math.ceil(n/2)]
    end
    
    local result = ""
    result = result .. "{| class='wikitable'\n"
    result = result .. "! Показатель\n! Значение\n|-\n"
    result = result .. "| Количество (N)\n| " .. tostring(#data) .. "\n|-\n"
    result = result .. "| Среднее\n| " .. string.format("%.2f", mean) .. "\n|-\n"
    result = result .. "| Медиана\n| " .. string.format("%.2f", median) .. "\n|-\n"
    result = result .. "| Дисперсия\n| " .. string.format("%.2f", variance) .. "\n|-\n"
    result = result .. "| Стандартное отклонение\n| " .. string.format("%.2f", stddev) .. "\n|-\n"
    result = result .. "| Минимум\n| " .. string.format("%.2f", data[1]) .. "\n|-\n"
    result = result .. "| Максимум\n| " .. string.format("%.2f", data[#data]) .. "\n|-\n"
    result = result .. "|}\n"
    
    return result
end

return stats