// Data Literacy Dashboard Application class DataLiteracyApp { constructor() { this.currentPage = 'home'; this.currentProfession = ''; this.testCurrentQuestion = 0; this.testAnswers = []; // Application data this.data = { statistics: { dataImportant: "87% співробітників вважають базові навички роботи з даними важливими", dataTrained: "Тільки 40% співробітників почуваються підготовленими", dataLiteracy: "64% керівників повідомляють про нестачу розуміння даних" }, professions: { marketing: { title: "Маркетинг та продажі", icon: "📊", uses: [ "Аналіз поведінки клієнтів", "Оптимізація рекламних кампаній", "Персоналізація повідомлень", "Прогнозування продажів", "Аналіз ROI" ], example: "DirectTV використовує USPS дані для персоналізації сторінок для людей, які переїжджають", metrics: ["CTR", "Conversion Rate", "CAC", "LTV", "ROAS"], interactive: "roi_calculator" }, hr: { title: "Людські ресурси", icon: "👥", uses: [ "Планування робочої сили", "Оптимізація рекрутингу", "Аналіз плинності кадрів", "Оцінка ефективності навчання", "Прогнозування продуктивності" ], example: "Credit Suisse використовує HR аналітику для прогнозування ризику звільнення", metrics: ["Turnover Rate", "Time to Hire", "Employee Satisfaction", "Training ROI"], interactive: "turnover_simulator" }, finance: { title: "Фінанси", icon: "💰", uses: [ "Фінансові коефіцієнти", "Аналіз прибутковості", "Управління ризиками", "Бюджетування та прогнозування", "Контроль витрат" ], example: "Банки використовують аналітику для категоризації клієнтів за кредитними ризиками", metrics: ["ROI", "NPV", "Liquidity Ratio", "Debt-to-Equity", "Profit Margin"], interactive: "financial_calculator" }, operations: { title: "Операції та логістика", icon: "🚚", uses: [ "Оптимізація ланцюга поставок", "Прогнозне обслуговування", "Управління запасами", "Планування маршрутів", "Контроль якості" ], example: "Walmart використовує аналітику для оптимізації запасів та зменшення витрат на 20%", metrics: ["Inventory Turnover", "Order Fulfillment Rate", "Lead Time", "Quality Score"], interactive: "inventory_simulator" }, customer_service: { title: "Клієнтський сервіс", icon: "📞", uses: [ "Аналіз задоволеності клієнтів", "Оптимізація часу відповіді", "Прогнозування навантаження", "Персоналізація підтримки", "Аналіз відгуків" ], example: "Компанії використовують аналітику для моніторингу в реальному часі та покращення досвіду клієнтів", metrics: ["CSAT", "NPS", "First Call Resolution", "Average Handle Time"], interactive: "service_dashboard" }, manufacturing: { title: "Виробництво", icon: "🏭", uses: [ "Прогнозне обслуговування обладнання", "Контроль якості", "Оптимізація виробничих процесів", "Управління ресурсами", "Планування виробництва" ], example: "United Airlines використовує прогнозну аналітику для технічного обслуговування літаків", metrics: ["OEE", "Downtime", "Quality Rate", "Production Cost", "Throughput"], interactive: "equipment_monitor" }, healthcare: { title: "Охорона здоров'я", icon: "🏥", uses: [ "Прогнозування захворюваності", "Оптимізація розкладу персоналу", "Управління запасами ліків", "Аналіз ефективності лікування", "Планування ресурсів" ], example: "Лікарні використовують ML для прогнозування кількості пацієнтів у відділенні невідкладної допомоги", metrics: ["Patient Satisfaction", "Readmission Rate", "Average Length of Stay", "Resource Utilization"], interactive: "hospital_predictor" }, it: { title: "IT та технології", icon: "💻", uses: [ "Моніторинг системи", "Аналіз продуктивності", "Прогнозування відмов", "Оптимізація ресурсів", "Безпека даних" ], example: "Компанії використовують аналітику для прогнозування та попередження системних збоїв", metrics: ["Uptime", "Response Time", "Security Incidents", "Resource Utilization"], interactive: "system_monitor" } }, literacyLevels: [ { level: 1, name: "Conversational", description: "Розуміння базових термінів та концепцій", skills: ["Читання графіків", "Розуміння основних метрик", "Участь в обговореннях даних"] }, { level: 2, name: "Literacy", description: "Здатність працювати з простими наборами даних", skills: ["Фільтрація даних", "Створення базових звітів", "Інтерпретація результатів"] }, { level: 3, name: "Competency", description: "Впевнене використання аналітичних інструментів", skills: ["Складні запити", "Візуалізація даних", "Статистичний аналіз"] }, { level: 4, name: "Fluency", description: "Експертний рівень аналітики", skills: ["Машинне навчання", "Прогнозування", "Комплексне моделювання"] }, { level: 5, name: "Multilingual", description: "Лідерство в data-driven організаціях", skills: ["Стратегія даних", "Управління командами", "Інновації в аналітиці"] } ], testQuestions: [ { question: "Як часто ви використовуєте дані у своїй роботі?", options: [ { text: "Щодня", value: 4 }, { text: "Кілька разів на тиждень", value: 3 }, { text: "Кілька разів на місяць", value: 2 }, { text: "Рідко або ніколи", value: 1 } ] }, { question: "Наскільки впевнено ви створюєте графіки та діаграми?", options: [ { text: "Дуже впевнено", value: 4 }, { text: "Достатньо впевнено", value: 3 }, { text: "Базово", value: 2 }, { text: "Не вмію", value: 1 } ] }, { question: "Чи можете ви виявити тренди в даних?", options: [ { text: "Легко виявляю складні тренди", value: 4 }, { text: "Виявляю основні тренди", value: 3 }, { text: "Іноді помічаю очевидні тренди", value: 2 }, { text: "Важко виявити тренди", value: 1 } ] }, { question: "Як ви ставитеся до статистичних понять?", options: [ { text: "Вільно використовую статистику", value: 4 }, { text: "Розумію базові концепції", value: 3 }, { text: "Знаю лише основи", value: 2 }, { text: "Статистика складна для мене", value: 1 } ] }, { question: "Чи маєте ви досвід з аналітичними інструментами?", options: [ { text: "Використовую професійні інструменти", value: 4 }, { text: "Працюю з Excel та подібними", value: 3 }, { text: "Базове використання таблиць", value: 2 }, { text: "Мінімальний досвід", value: 1 } ] } ] }; this.init(); } init() { this.renderProfessionNavigation(); this.renderLiteracyLevels(); this.bindEvents(); } bindEvents() { // Modal events document.getElementById('interactiveModal').addEventListener('click', (e) => { if (e.target.id === 'interactiveModal') { this.closeModal(); } }); document.getElementById('testModal').addEventListener('click', (e) => { if (e.target.id === 'testModal') { this.closeTestModal(); } }); // Escape key to close modals document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { this.closeModal(); this.closeTestModal(); } }); } renderProfessionNavigation() { const navContainer = document.getElementById('professionNav'); navContainer.innerHTML = ''; Object.entries(this.data.professions).forEach(([key, profession]) => { const navItem = document.createElement('button'); navItem.className = 'nav-item'; navItem.onclick = () => this.showProfession(key); navItem.innerHTML = ` ${profession.title} `; navContainer.appendChild(navItem); }); } renderLiteracyLevels() { const container = document.getElementById('literacyLevels'); container.innerHTML = ''; this.data.literacyLevels.forEach(level => { const levelElement = document.createElement('div'); levelElement.className = 'literacy-level'; levelElement.innerHTML = `
Спробуйте практичний інструмент для цієї професії
📈 Зростання на 12% за останній місяць
⚡ Час відповіді покращився на 25%
🎯 85% звернень вирішено з першого разу
🔧 Наступне ТО через 15 днів
⚠️ Рекомендується заміна фільтра через 7 днів
📊 Ризик поломки: Низький (5%)
✅ Всі сервіси працюють нормально
📊 Середній час відповіді: 120ms
🔒 Останній інцидент безпеки: 30 днів тому
Інтерактивний контент недоступний.
'; } } bindInteractiveEvents(type) { switch (type) { case 'turnover_simulator': ['salary', 'satisfaction', 'growth'].forEach(param => { const slider = document.getElementById(`${param}Slider`); const valueDisplay = document.getElementById(`${param}Value`); slider.addEventListener('input', () => { valueDisplay.textContent = slider.value; this.updateTurnoverRate(); }); }); this.updateTurnoverRate(); break; case 'inventory_simulator': ['stock', 'demand', 'lead'].forEach(param => { const slider = document.getElementById(`${param}Slider`); const valueDisplay = document.getElementById(`${param === 'stock' ? 'currentStock' : param === 'demand' ? 'dailyDemand' : 'leadTime'}Value`); slider.addEventListener('input', () => { valueDisplay.textContent = slider.value; this.updateInventoryDays(); }); }); this.updateInventoryDays(); break; case 'hospital_predictor': const daySlider = document.getElementById('daySlider'); const hourSlider = document.getElementById('hourSlider'); const seasonSlider = document.getElementById('seasonSlider'); daySlider.addEventListener('input', () => { const days = ['Понеділок', 'Вівторок', 'Середа', 'Четвер', 'П\'ятниця', 'Субота', 'Неділя']; document.getElementById('dayValue').textContent = days[daySlider.value - 1]; this.updatePatientCount(); }); hourSlider.addEventListener('input', () => { document.getElementById('hourValue').textContent = hourSlider.value; this.updatePatientCount(); }); seasonSlider.addEventListener('input', () => { const seasons = ['Зима', 'Весна', 'Літо', 'Осінь']; document.getElementById('seasonValue').textContent = seasons[seasonSlider.value - 1]; this.updatePatientCount(); }); this.updatePatientCount(); break; } } calculateROI() { const cost = parseFloat(document.getElementById('campaignCost').value) || 0; const revenue = parseFloat(document.getElementById('campaignRevenue').value) || 0; const roi = cost > 0 ? ((revenue - cost) / cost * 100) : 0; document.getElementById('roiResult').style.display = 'block'; document.getElementById('roiValue').textContent = `${roi.toFixed(1)}%`; } calculateFinancials() { const profit = parseFloat(document.getElementById('netProfit').value) || 0; const assets = parseFloat(document.getElementById('totalAssets').value) || 0; const equity = parseFloat(document.getElementById('equity').value) || 0; const revenue = parseFloat(document.getElementById('revenue').value) || 0; const roa = assets > 0 ? (profit / assets * 100).toFixed(1) + '%' : '0%'; const roe = equity > 0 ? (profit / equity * 100).toFixed(1) + '%' : '0%'; const margin = revenue > 0 ? (profit / revenue * 100).toFixed(1) + '%' : '0%'; document.getElementById('financialResults').style.display = 'block'; document.getElementById('roaValue').textContent = roa; document.getElementById('roeValue').textContent = roe; document.getElementById('marginValue').textContent = margin; } updateTurnoverRate() { const salary = parseInt(document.getElementById('salarySlider').value); const satisfaction = parseInt(document.getElementById('satisfactionSlider').value); const growth = parseInt(document.getElementById('growthSlider').value); // Simple turnover calculation formula const baseTurnover = 30; const salaryFactor = (100000 - salary) / 100000 * 20; const satisfactionFactor = (10 - satisfaction) * 3; const growthFactor = (10 - growth) * 2; const turnover = Math.max(0, baseTurnover + salaryFactor + satisfactionFactor + growthFactor); document.getElementById('turnoverRate').textContent = `${turnover.toFixed(1)}%`; } updateInventoryDays() { const stock = parseInt(document.getElementById('stockSlider').value); const demand = parseInt(document.getElementById('demandSlider').value); const days = demand > 0 ? Math.floor(stock / demand) : 0; document.getElementById('stockDays').textContent = days; } updatePatientCount() { const day = parseInt(document.getElementById('daySlider').value); const hour = parseInt(document.getElementById('hourSlider').value); const season = parseInt(document.getElementById('seasonSlider').value); // Simple patient count prediction let baseCount = 20; // Day factor (weekends are busier) if (day === 6 || day === 7) baseCount += 10; // Hour factor (peak hours) if (hour >= 9 && hour <= 17) baseCount += 15; if (hour >= 18 && hour <= 22) baseCount += 8; // Season factor (winter is busier) if (season === 1) baseCount += 12; // Winter if (season === 4) baseCount += 5; // Fall document.getElementById('patientCount').textContent = baseCount; } refreshServiceMetrics() { const metrics = { csat: (3.8 + Math.random() * 1.2).toFixed(1) + '/5', nps: Math.floor(50 + Math.random() * 40), fcr: Math.floor(75 + Math.random() * 20) + '%', aht: (2.5 + Math.random() * 2).toFixed(1) + ' хв' }; document.getElementById('csatMetric').textContent = metrics.csat; document.getElementById('npsMetric').textContent = metrics.nps; document.getElementById('fcrMetric').textContent = metrics.fcr; document.getElementById('ahtMetric').textContent = metrics.aht; } refreshEquipmentData() { const metrics = { temp: Math.floor(65 + Math.random() * 20) + '°C', vibr: Math.random() > 0.2 ? 'Норма' : 'Увага', eff: Math.floor(85 + Math.random() * 15) + '%', uptime: (98 + Math.random() * 2).toFixed(1) + '%' }; document.getElementById('tempMetric').textContent = metrics.temp; document.getElementById('vibrMetric').textContent = metrics.vibr; document.getElementById('effMetric').textContent = metrics.eff; document.getElementById('uptimeMetric').textContent = metrics.uptime; } refreshSystemData() { const metrics = { cpu: Math.floor(20 + Math.random() * 60) + '%', ram: Math.floor(40 + Math.random() * 40) + '%', disk: Math.floor(15 + Math.random() * 30) + '%', net: Math.floor(5 + Math.random() * 20) + ' Mbps' }; document.getElementById('cpuMetric').textContent = metrics.cpu; document.getElementById('ramMetric').textContent = metrics.ram; document.getElementById('diskMetric').textContent = metrics.disk; document.getElementById('netMetric').textContent = metrics.net; } startLiteracyTest() { this.testCurrentQuestion = 0; this.testAnswers = []; this.showTestQuestion(); document.getElementById('testModal').classList.add('active'); } showTestQuestion() { const question = this.data.testQuestions[this.testCurrentQuestion]; const modalBody = document.getElementById('testModalBody'); modalBody.innerHTML = `${question.question}
Оцінка: ${averageScore.toFixed(1)} з 4.0
Рекомендації: ${recommendations}