Probability & Statistics Analyzer

Descriptive Statistics

Provide raw numerical data.

Probability Distributions

Probability Density at x=${x} (PDF): ${probabilityResults.pdf}

Cumulative Probability P(X ≤ ${x}): ${probabilityResults.cdf_le}

Cumulative Probability P(X > ${x}): ${probabilityResults.cdf_gt}

`; } else if (type === 'binomial') { const n = parseInt(binomialNInput.value); const p = parseFloat(binomialPInput.value); const k = parseInt(binomialKInput.value); if (isNaN(n) || isNaN(p) || isNaN(k)) { throw new Error('Please enter valid numbers for n, p, and k.'); } if (n < 0 || !Number.isInteger(n)) { throw new Error('Number of trials (n) must be a non-negative integer.'); } if (p < 0 || p > 1) { throw new Error('Probability of success (p) must be between 0 and 1.'); } if (k < 0 || !Number.isInteger(k) || k > n) { throw new Error('Number of successes (k) must be a non-negative integer less than or equal to n.'); } const pmf = jStat.binomial.pdf(k, n, p); // P(X = k) const cdf = jStat.binomial.cdf(k, n, p); // P(X <= k) const upper_cdf = 1 - (k > 0 ? jStat.binomial.cdf(k - 1, n, p) : 0); // P(X >= k) probabilityResults = { type: 'Binomial', params: { n: n, p: p, k: k }, pmf: pmf.toFixed(6), // P(X = k) cdf_le: cdf.toFixed(6), // P(X <= k) cdf_ge: upper_cdf.toFixed(6) // P(X >= k) }; probResultArea.innerHTML = `

Distribution: Binomial (n=${n}, p=${p})

Probability Mass P(X = ${k}): ${probabilityResults.pmf}

Cumulative Probability P(X ≤ ${k}): ${probabilityResults.cdf_le}

Cumulative Probability P(X ≥ ${k}): ${probabilityResults.cdf_ge}

`; } else { throw new Error('Please select a distribution type.'); } probResultArea.classList.remove('hidden'); showPdfButton(); } catch (error) { probErrorMsg.textContent = `Calculation Error: ${error.message}`; console.error(error); } } function showPdfButton() { // Show PDF button only if there's at least one valid result if (descriptiveStatsResults || probabilityResults) { pdfButton.classList.remove('hidden'); } } function hidePdfButton() { // Hide PDF button if both results are null (e.g., after clearing or error) if (!descriptiveStatsResults && !probabilityResults) { pdfButton.classList.add('hidden'); } // Optional: Always hide if triggered by specific events before recalculation // pdfButton.classList.add('hidden'); } function generatePdf() { if (!descriptiveStatsResults && !probabilityResults) { alert('No results available to download.'); return; } if (typeof jspdf === 'undefined' || typeof jspdf.jsPDF === 'undefined') { alert('Error: jsPDF library is not loaded.'); console.error('jsPDF not loaded'); return; } const { jsPDF } = jspdf; const doc = new jsPDF(); // Get computed styles for colors const computedStyle = getComputedStyle(document.querySelector('.prob-stats-analyzer-container')); const primaryColor = computedStyle.getPropertyValue('--analyzer-primary-color').trim(); const textColor = computedStyle.getPropertyValue('--analyzer-text-color').trim(); const titleFontSize = 18; const headingFontSize = 14; const textFontSize = 10; // Smaller text for PDF const sectionSpacing = 15; const itemSpacing = 6; let currentY = 20; const leftMargin = 15; const pageWidth = doc.internal.pageSize.width; // --- PDF Content --- // Title doc.setFontSize(titleFontSize); doc.setTextColor(primaryColor); doc.text('Probability & Statistics Analysis', pageWidth / 2, currentY, { align: 'center' }); currentY += sectionSpacing; // --- Descriptive Statistics Section --- if (descriptiveStatsResults) { doc.setFontSize(headingFontSize); doc.setTextColor(primaryColor); doc.text('Descriptive Statistics', leftMargin, currentY); currentY += itemSpacing * 1.5; doc.setFontSize(textFontSize); doc.setTextColor(textColor); doc.text(`Data Input Preview: ${descriptiveStatsResults.rawData.substring(0, 100)}${descriptiveStatsResults.rawData.length > 100 ? '...' : ''}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Count: ${descriptiveStatsResults.count}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Sum: ${descriptiveStatsResults.sum}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Min: ${descriptiveStatsResults.min}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Max: ${descriptiveStatsResults.max}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Range: ${descriptiveStatsResults.range}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Mean: ${descriptiveStatsResults.mean}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Median: ${descriptiveStatsResults.median}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Mode: ${descriptiveStatsResults.mode}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Variance (Sample): ${descriptiveStatsResults.variance}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Standard Deviation (Sample): ${descriptiveStatsResults.stdev}`, leftMargin, currentY); currentY += sectionSpacing; // Add space before next section } // --- Probability Distributions Section --- if (probabilityResults) { // Check for page break if (currentY > doc.internal.pageSize.height - 40) { // Add buffer doc.addPage(); currentY = 20; // Reset Y for new page } doc.setFontSize(headingFontSize); doc.setTextColor(primaryColor); doc.text('Probability Distribution Calculation', leftMargin, currentY); currentY += itemSpacing * 1.5; doc.setFontSize(textFontSize); doc.setTextColor(textColor); if (probabilityResults.type === 'Normal') { doc.text(`Distribution Type: Normal`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Parameters: Mean (μ) = ${probabilityResults.params.mean}, Standard Deviation (σ) = ${probabilityResults.params.stddev}, x = ${probabilityResults.params.x}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Probability Density at x (PDF): ${probabilityResults.pdf}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`P(X ≤ x): ${probabilityResults.cdf_le}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`P(X > x): ${probabilityResults.cdf_gt}`, leftMargin, currentY); currentY += itemSpacing; } else if (probabilityResults.type === 'Binomial') { doc.text(`Distribution Type: Binomial`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Parameters: Trials (n) = ${probabilityResults.params.n}, Success Prob (p) = ${probabilityResults.params.p}, Successes (k) = ${probabilityResults.params.k}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Probability Mass at k (P(X = k)): ${probabilityResults.pmf}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Cumulative Probability P(X ≤ k): ${probabilityResults.cdf_le}`, leftMargin, currentY); currentY += itemSpacing; doc.text(`Cumulative Probability P(X ≥ k): ${probabilityResults.cdf_ge}`, leftMargin, currentY); currentY += itemSpacing; } currentY += sectionSpacing; } // Footer (Optional) const pageHeight = doc.internal.pageSize.height; const generatedDate = new Date().toLocaleString(); // Use localeString for format doc.setFontSize(9); doc.setTextColor('#888888'); // Use doc.internal.getNumberOfPages() and loop if needed for multi-page footers const pageCount = doc.internal.getNumberOfPages(); for(let i = 1; i <= pageCount; i++) { doc.setPage(i); doc.text(`Generated on: ${generatedDate}`, leftMargin, pageHeight - 10); doc.text(`Page ${i} of ${pageCount}`, pageWidth - leftMargin, pageHeight - 10, { align: 'right' }); } // --- End PDF Content --- try { doc.save('statistics_analysis_results.pdf'); } catch (e) { alert('Error generating PDF. See console for details.'); console.error("jsPDF Error:", e); } } });
Scroll to Top