function showTab(tabId) {
document.querySelectorAll('.tab-content').forEach(tab => {
tab.classList.remove('active');
});
document.querySelectorAll('.subtab-content').forEach(subtab => {
subtab.classList.remove('active');
});
const activeTab = document.getElementById(tabId);
activeTab.classList.add('active');
document.querySelectorAll('.tab').forEach(tab => {
tab.classList.remove('active');
});
const activeTabElement = document.querySelector(`.tab[onclick*="${tabId}"]`);
if (activeTabElement) {
activeTabElement.classList.add('active');
}
const firstSubtab = activeTab.querySelector('.subtab-content');
if (firstSubtab) {
firstSubtab.classList.add('active');
}
}
function showSubTab(subTabId) {
document.querySelectorAll('.tab-content.active .subtab-content').forEach(subtab => {
subtab.classList.remove('active');
});
const subtabToShow = document.getElementById(subTabId);
subtabToShow.classList.add('active');
document.querySelectorAll('.subtab').forEach(subtab => {
subtab.classList.remove('active');
});
const activeSubtabElement = document.querySelector(`.subtab[onclick*="${subTabId}"]`);
if (activeSubtabElement) {
activeSubtabElement.classList.add('active');
}
}
function importDataK1() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".txt";
fileInput.onchange = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result.split('\n').map(line => line.trim());
const dataTable = document.getElementById('dataTable').getElementsByTagName('tbody')[0];
let rowIndex = 0;
data.forEach((line, index) => {
let row;
if (rowIndex < dataTable.rows.length) {
row = dataTable.rows[rowIndex];
} else {
row = dataTable.insertRow();
row.insertCell();
row.insertCell();
}
row.cells[0].textContent = line;
rowIndex++;
});
};
reader.readAsText(file);
};
fileInput.click();
}
function importDataK2() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".txt";
fileInput.onchange = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result.split('\n').map(line => line.trim());
const dataTable = document.getElementById('dataTable').getElementsByTagName('tbody')[0];
let rowIndex = 0;
data.forEach((line, index) => {
let row;
if (rowIndex < dataTable.rows.length) {
row = dataTable.rows[rowIndex];
} else {
row = dataTable.insertRow();
row.insertCell();
row.insertCell();
}
row.cells[1].textContent = line;
rowIndex++;
});
};
reader.readAsText(file);
};
fileInput.click();
}
function importDataT1() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".txt";
fileInput.onchange = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result.split('\n').map(line => line.trim());
const dataTableTTest = document.getElementById('dataTableTTest').getElementsByTagName('tbody')[0];
let rowIndex = 0;
data.forEach((line, index) => {
let row;
if (rowIndex < dataTableTTest.rows.length) {
row = dataTableTTest.rows[rowIndex];
} else {
row = dataTableTTest.insertRow();
row.insertCell();
row.insertCell();
}
row.cells[0].textContent = line;
rowIndex++;
});
};
reader.readAsText(file);
};
fileInput.click();
}
function importDataT2() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".txt";
fileInput.onchange = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result.split('\n').map(line => line.trim());
const dataTableTTest = document.getElementById('dataTableTTest').getElementsByTagName('tbody')[0];
let rowIndex = 0;
data.forEach((line, index) => {
let row;
if (rowIndex < dataTableTTest.rows.length) {
row = dataTableTTest.rows[rowIndex];
} else {
row = dataTableTTest.insertRow();
row.insertCell();
row.insertCell();
}
row.cells[1].textContent = line;
rowIndex++;
});
};
reader.readAsText(file);
};
fileInput.click();
}
function importDataKC1() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".txt";
fileInput.onchange = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result.split('\n').map(line => line.trim());
const dataTable = document.getElementById('classesTable').getElementsByTagName('tbody')[0];
let rowIndex = 0;
data.forEach((line, index) => {
let row;
if (rowIndex < dataTable.rows.length) {
row = dataTable.rows[rowIndex];
} else {
row = dataTable.insertRow();
row.insertCell();
row.insertCell();
}
row.cells[2].textContent = line;
rowIndex++;
});
};
reader.readAsText(file);
};
fileInput.click();
}
function importDataKC2() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".txt";
fileInput.onchange = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result.split('\n').map(line => line.trim());
const dataTable = document.getElementById('classesTable').getElementsByTagName('tbody')[0];
let rowIndex = 0;
data.forEach((line, index) => {
let row;
if (rowIndex < dataTable.rows.length) {
row = dataTable.rows[rowIndex];
} else {
row = dataTable.insertRow();
row.insertCell();
row.insertCell();
}
row.cells[3].textContent = line;
rowIndex++;
});
};
reader.readAsText(file);
};
fileInput.click();
}
function importDataTC1() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".txt";
fileInput.onchange = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result.split('\n').map(line => line.trim());
const dataTableTTest = document.getElementById('classesTableTTest').getElementsByTagName('tbody')[0];
let rowIndex = 0;
data.forEach((line, index) => {
let row;
if (rowIndex < dataTableTTest.rows.length) {
row = dataTableTTest.rows[rowIndex];
} else {
row = dataTableTTest.insertRow();
row.insertCell();
row.insertCell();
}
row.cells[2].textContent = line;
rowIndex++;
});
};
reader.readAsText(file);
};
fileInput.click();
}
function importDataTC2() {
const fileInput = document.createElement("input");
fileInput.type = "file";
fileInput.accept = ".txt";
fileInput.onchange = (event) => {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = (e) => {
const data = e.target.result.split('\n').map(line => line.trim());
const dataTableTTest = document.getElementById('classesTableTTest').getElementsByTagName('tbody')[0];
let rowIndex = 0;
data.forEach((line, index) => {
let row;
if (rowIndex < dataTableTTest.rows.length) {
row = dataTableTTest.rows[rowIndex];
} else {
row = dataTableTTest.insertRow();
row.insertCell();
row.insertCell();
}
row.cells[3].textContent = line;
rowIndex++;
});
};
reader.readAsText(file);
};
fileInput.click();
}
function clearTable() {
const rows = document.querySelectorAll('#dataTable tbody tr');
rows.forEach(row => {
row.cells[0].innerText = '';
row.cells[1].innerText = '';
});
const rowsTTest = document.querySelectorAll('#dataTableTTest tbody tr');
rowsTTest.forEach(row => {
row.cells[0].innerText = '';
row.cells[1].innerText = '';
});
}
document.querySelector('#dataTable tbody').addEventListener('keydown', function (e) {
if (e.key === 'Enter') {
e.preventDefault();
const row = this.insertRow();
row.innerHTML = `
| | `;
}
});
function calculateKol() {
const rows = document.querySelectorAll('#dataTable tbody tr');
const freq1 = [];
const freq2 = [];
let n1 = 0;
let n2 = 0;
let a = 0;
rows.forEach(row => {
const cellValueA = parseFloat(row.cells[0].innerText) || 0;
const cellValueB = parseFloat(row.cells[1].innerText) || 0;
if ((!isNaN(cellValueA) && isNaN(cellValueB)) || (isNaN(cellValueA) && !isNaN(cellValueB))) {
alert("Data entry error");
return;
}
if (!isNaN(cellValueA) && !isNaN(cellValueB)) {
freq1[a] = cellValueA;
freq2[a] = cellValueB;
a++;
}
});
for (let i = 0; i < a; i++) {
n1 += freq1[i];
n2 += freq2[i];
}
if (a < 6 || n1 < 8 || n2 < 8) {
alert("Insufficient data.");
return;
}
const jval1 = new Array(a);
const jval2 = new Array(a);
jval1[0] = freq1[0] / n1;
jval2[0] = freq2[0] / n2;
for (let i = 1; i < a; i++) {
jval1[i] = jval1[i - 1] + (freq1[i] / n1);
jval2[i] = jval2[i - 1] + (freq2[i] / n2);
}
const DP = new Array(a);
DP[0] = Math.abs(jval1[0] - jval2[0]);
for (let i = 1; i < a; i++) {
DP[i] = Math.abs(jval1[i] - jval2[i]);
}
const D = Math.max(...DP);
document.getElementById('valueD').innerText = D.toFixed(3);
const confidenceLevel = parseInt(document.getElementById('confidence').value);
let criticalValue;
const C1 = Math.sqrt((n1 + n2) / (n1 * n2));
switch (confidenceLevel) {
case 80:
criticalValue = (1.28 * C1).toFixed(3);
break;
case 85:
criticalValue = (1.34 * C1).toFixed(3);
break;
case 90:
criticalValue = (1.22 * C1).toFixed(3);
break;
case 95:
criticalValue = (1.36 * C1).toFixed(3);
break;
case 99:
criticalValue = (1.63 * C1).toFixed(3);
break;
default:
alert("Invalid confidence level selected.");
return;
}
document.getElementById("criticalValue").textContent = criticalValue;
const meanChangeMessage = document.getElementById("distChangeMessageKI");
if (D < criticalValue) {
meanChangeMessage.textContent = "The two distributions are not different";
} else {
meanChangeMessage.textContent = "The two distributions are different";
}
}
function applyClasses() {
const start = parseFloat(document.getElementById('startClass').value);
const end = parseFloat(document.getElementById('endClass').value);
const numClasses = parseInt(document.getElementById('numClasses').value);
const classesTable = document.getElementById('classesTable');
const classesBody = document.getElementById('classesBody');
classesBody.innerHTML = '';
if (numClasses > 0) {
const interval = Math.abs(end - start) / numClasses;
for (let i = 0; i < numClasses; i++) {
let from, to;
if (start < end) {
from = (start + (i * interval)).toFixed(2);
to = (start + ((i + 1) * interval)).toFixed(2);
} else {
from = (start - (i * interval)).toFixed(2);
to = (start - ((i + 1) * interval)).toFixed(2);
}
const row = `
${from} |
${to} |
|
|
`;
classesBody.innerHTML += row;
}
classesTable.style.display = 'table';
}
}
function clearClasses() {
document.getElementById('classesBody').innerHTML = '';
document.getElementById('classesTable').style.display = 'none';
document.getElementById('startClass').value = '';
document.getElementById('endClass').value = '';
document.getElementById('numClasses').value = '';
}
function calculateClasses() {
const rows = document.querySelectorAll('#classesTable tbody tr');
const freq1 = [];
const freq2 = [];
let n1 = 0;
let n2 = 0;
let a = 0;
rows.forEach(row => {
if (row.cells.length < 4) {
return;
}
const cellValueA = parseFloat(row.cells[2].innerText) || 0;
const cellValueB = parseFloat(row.cells[3].innerText) || 0;
if ((!isNaN(cellValueA) && isNaN(cellValueB)) || (isNaN(cellValueA) && !isNaN(cellValueB))) {
alert("Data entry error");
return;
}
if (!isNaN(cellValueA) && !isNaN(cellValueB)) {
freq1[a] = cellValueA;
freq2[a] = cellValueB;
a++;
}
});
for (let i = 0; i < a; i++) {
n1 += freq1[i];
n2 += freq2[i];
}
if (a < 6 || n1 < 8 || n2 < 8) {
alert("Insufficient data.");
return;
}
const jval1 = new Array(a);
const jval2 = new Array(a);
jval1[0] = freq1[0] / n1;
jval2[0] = freq2[0] / n2;
for (let i = 1; i < a; i++) {
jval1[i] = jval1[i - 1] + (freq1[i] / n1);
jval2[i] = jval2[i - 1] + (freq2[i] / n2);
}
const DP = new Array(a);
DP[0] = Math.abs(jval1[0] - jval2[0]);
for (let i = 1; i < a; i++) {
DP[i] = Math.abs(jval1[i] - jval2[i]);
}
const D = Math.max(...DP);
document.getElementById('valueDClasses').innerText = D.toFixed(3);
const confidenceLevel = parseInt(document.getElementById('confidenceClasses').value);
let criticalValue;
const C1 = Math.sqrt((n1 + n2) / (n1 * n2));
switch (confidenceLevel) {
case 80:
criticalValue = (1.28 * C1).toFixed(3);
break;
case 85:
criticalValue = (1.34 * C1).toFixed(3);
break;
case 90:
criticalValue = (1.22 * C1).toFixed(3);
break;
case 95:
criticalValue = (1.36 * C1).toFixed(3);
break;
case 99:
criticalValue = (1.63 * C1).toFixed(3);
break;
default:
alert("Invalid confidence level selected.");
return;
}
document.getElementById('criticalValueClasses').innerText = criticalValue;
const meanChangeMessage = document.getElementById("distChangeMessageKC");
if (D < criticalValue) {
meanChangeMessage.textContent = "The two distributions are not different";
} else {
meanChangeMessage.textContent = "The two distributions are different";
}
}
function calculateT() {
const column1 = document.querySelectorAll("#dataTableTTest tr td:nth-child(2)");
const column2 = document.querySelectorAll("#dataTableTTest tr td:nth-child(1)");
let sum1 = 0, sum2 = 0, sumSq1 = 0, sumSq2 = 0;
const n1 = column1.length;
const n2 = column2.length;
if (n1 === 0 || n2 === 0) {
alert("Error: One of the data sets is empty.");
return;
}
column1.forEach(cell => {
const value = parseFloat(cell.textContent);
if (!isNaN(value)) {
sum1 += value;
sumSq1 += value * value;
} else {
console.warn("Non-numeric value found in column 1:", cell.textContent);
}
});
column2.forEach(cell => {
const value = parseFloat(cell.textContent);
if (!isNaN(value)) {
sum2 += value;
sumSq2 += value * value;
} else {
console.warn("Non-numeric value found in column 2:", cell.textContent);
}
});
const mean1 = sum1 / n1;
const mean2 = sum2 / n2;
document.getElementById("meanDataSet1").textContent = mean1.toFixed(2);
document.getElementById("meanDataSet2").textContent = mean2.toFixed(2);
const sigma = Math.sqrt(((sumSq1 - (sum1 * sum1 / n1)) + (sumSq2 - (sum2 * sum2 / n2))) / (n1 + n2 - 2));
if (isNaN(sigma) || sigma === 0) {
alert("Error: Standard deviation calculation resulted in an invalid value.");
return;
}
const tValue = (mean1 - mean2) / sigma * Math.sqrt((n1 * n2) / (n1 + n2));
document.getElementById("tValue").textContent = tValue.toFixed(3);
const degreesOfFreedom = n1 + n2 - 2;
const confidenceSelect = document.getElementById("confidence_ttest");
const confidenceLevel = parseFloat(confidenceSelect.value) / 100;
const tCriticalValue = jStat.studentt.inv(1 - (1 - confidenceLevel) / 2, degreesOfFreedom);
document.getElementById("tCriticalValue").textContent = tCriticalValue.toFixed(3);
const labelT = document.getElementById("dynamicLabelTI");
const alpha = (1 - confidenceLevel).toFixed(2);
labelT.innerHTML = `t${degreesOfFreedom}, ${alpha}:`;
const meanChangeMessage = document.getElementById("meanChangeMessageTI");
if (tValue < tCriticalValue) {
meanChangeMessage.textContent = "The mean has not changed";
} else {
meanChangeMessage.textContent = "The mean has changed";
}
}
function applyClassesTTest() {
const start = parseFloat(document.getElementById('startClassTTest').value);
const end = parseFloat(document.getElementById('endClassTTest').value);
const numClasses = parseInt(document.getElementById('numClassesTTest').value);
const classesTableTTest = document.getElementById('classesTableTTest');
const classesBodyTTest = document.getElementById('classesBodyTTest');
classesBodyTTest.innerHTML = '';
if (numClasses > 0) {
const interval = Math.abs(end - start) / numClasses;
let currentStart = start;
let currentEnd = start;
if (start < end) {
currentEnd += interval;
} else {
currentEnd -= interval;
}
while ((start < end && currentEnd <= end) || (start >= end && currentEnd >= end)) {
const row = `
${currentStart.toFixed(2)} |
${currentEnd.toFixed(2)} |
|
|
`;
classesBodyTTest.innerHTML += row;
currentStart = currentEnd;
if (start < end) {
currentEnd += interval;
} else {
currentEnd -= interval;
}
}
classesTableTTest.style.display = 'table';
}
}
function clearClassesTTest() {
document.getElementById('classesBodyTTest').innerHTML = '';
document.getElementById('classesTableTTest').style.display = 'none';
document.getElementById('startClassTTest').value = '';
document.getElementById('endClassTTest').value = '';
document.getElementById('numClassesTTest').value = '';
}
function calculateClassesTTest() {
const column1 = document.querySelectorAll("#classesTableTTest tr td:nth-child(4)");
const column2 = document.querySelectorAll("#classesTableTTest tr td:nth-child(3)");
let sum1 = 0, sum2 = 0, sumSq1 = 0, sumSq2 = 0;
let n1 = column1.length, n2 = column2.length;
column1.forEach(cell => {
const value = parseFloat(cell.textContent);
sum1 += value;
sumSq1 += value * value;
});
column2.forEach(cell => {
const value = parseFloat(cell.textContent);
sum2 += value;
sumSq2 += value * value;
});
const mean1 = sum1 / n1;
const mean2 = sum2 / n2;
document.getElementById("meanDataSetC1").textContent = mean2.toFixed(2);
document.getElementById("meanDataSetC2").textContent = mean1.toFixed(2);
const sigma = Math.sqrt(((sumSq1 - (sum1 * sum1 / n1)) + (sumSq2 - (sum2 * sum2 / n2))) / (n1 + n2 - 2));
const tValue = (mean1 - mean2) / sigma * Math.sqrt((n1 * n2) / (n1 + n2));
document.getElementById("tValueC").textContent = tValue.toFixed(3);
const degreesOfFreedom = n1 + n2 - 2;
const confidenceSelect = document.getElementById("confidenceClassesTTest");
const confidenceLevel = parseFloat(confidenceSelect.value) / 100;
const tCriticalValue = jStat.studentt.inv(1 - (1 - confidenceLevel) / 2, degreesOfFreedom);
document.getElementById("tCriticalValueC").textContent = tCriticalValue.toFixed(3);
const labelT = document.getElementById("dynamicLabelTC");
const alpha = (1 - confidenceLevel).toFixed(2);
labelT.innerHTML = `t${degreesOfFreedom}, ${alpha}:`;
const meanChangeMessage = document.getElementById("meanChangeMessageTC");
if (tValue < tCriticalValue) {
meanChangeMessage.textContent = "The mean has not changed";
} else {
meanChangeMessage.textContent = "The mean has changed";
}
}
function calculateSummaryT() {
const nbS = parseFloat(document.getElementById("nbS").value);
const sumBiS = parseFloat(document.getElementById("sumBiS").value);
const sumBiSquaredS = parseFloat(document.getElementById("sumBiSquaredS").value);
const naS = parseFloat(document.getElementById("naS").value);
const sumAiS = parseFloat(document.getElementById("sumAiS").value);
const sumAiSquaredS = parseFloat(document.getElementById("sumAiSquaredS").value);
const meanDataSetS1 = sumBiS / nbS;
const meanDataSetS2 = sumAiS / naS;
document.getElementById("meanDataSetS1").textContent = meanDataSetS1.toFixed(2);
document.getElementById("meanDataSetS2").textContent = meanDataSetS2.toFixed(2);
const sigmaS = Math.sqrt(((sumAiSquaredS - (sumAiS ** 2) / naS) + (sumBiSquaredS - (sumBiS ** 2) / nbS)) / (naS + nbS - 2));
const tS = ((meanDataSetS2 - meanDataSetS1) / sigmaS) * Math.sqrt((naS * nbS) / (naS + nbS));
document.getElementById("tValueS").textContent = tS.toFixed(3);
const degreesOfFreedomS = naS + nbS - 2;
const confidenceSelectS = document.getElementById("confidenceSummary");
const confidenceLevelS = parseFloat(confidenceSelectS.value) / 100;
const tCriticalValueS = jStat.studentt.inv(1 - (1 - confidenceLevelS) / 2, degreesOfFreedomS);
document.getElementById("tCriticalS").textContent = tCriticalValueS.toFixed(3);
const labelT = document.getElementById("dynamicLabelT");
const alpha = (1 - confidenceLevelS).toFixed(2);
labelT.innerHTML = `t${degreesOfFreedomS}, ${alpha}:`;
const meanChangeMessage = document.getElementById("meanChangeMessageS");
if (tS < 0) {
meanChangeMessage.textContent = "The mean has decreased";
} else {
meanChangeMessage.textContent = "The mean has increased";
}
}