<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>会議効率シミュレーター</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background: linear-gradient(135deg,
min-height: 100vh;
color:
}
.container {
background: rgba(255, 255, 255, 0.95);
padding: 30px;
border-radius: 15px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
backdrop-filter: blur(10px);
}
h1 {
text-align: center;
color:
margin-bottom: 30px;
font-size: 2.2em;
text-shadow: 2px 2px 4px rgba(0,0,0,0.1);
}
.formula-display {
background: linear-gradient(135deg,
color: white;
padding: 20px;
border-radius: 10px;
margin-bottom: 30px;
text-align: center;
font-size: 1.1em;
font-weight: bold;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.parameter-group {
margin-bottom: 25px;
padding: 20px;
background: linear-gradient(135deg,
border-radius: 10px;
box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
}
label {
display: block;
margin-bottom: 8px;
font-weight: bold;
color:
}
input[type="range"] {
width: 100%;
height: 8px;
border-radius: 5px;
background: #e2e8f0 ;
outline: none;
margin-bottom: 10px;
appearance: none;
}
input[type="range"]::-webkit-slider-thumb {
appearance: none;
width: 20px;
height: 20px;
border-radius: 50%;
background: linear-gradient(135deg,
cursor: pointer;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}
input[type="range"]::-moz-range-thumb {
width: 20px;
height: 20px;
border-radius: 50%;
background: linear-gradient(135deg, #667eea 0%,
cursor: pointer;
border: none;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
}
.value-display {
font-size: 1.1em;
font-weight: bold;
color:
text-align: center;
margin-bottom: 10px;
}
.result {
background: linear-gradient(135deg,
padding: 25px;
border-radius: 10px;
text-align: center;
font-size: 1.3em;
font-weight: bold;
color:
margin: 30px 0;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
}
.reset-btn {
background: linear-gradient(135deg,
color: white;
border: none;
padding: 15px 30px;
border-radius: 25px;
font-size: 1.1em;
font-weight: bold;
cursor: pointer;
display: block;
margin: 20px auto;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
transition: all 0.3s ease;
}
.reset-btn:hover {
transform: translateY(-2px);
box-shadow: 0 7px 20px rgba(0, 0, 0, 0.3);
}
.interpretation {
background: linear-gradient(135deg,
padding: 20px;
border-radius: 10px;
margin-top: 20px;
border-left: 5px solid
}
.parameter-description {
font-size: 0.9em;
color:
margin-top: 5px;
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.result.updated {
animation: pulse 0.5s ease-in-out;
}
</style>
</head>
<body>
<div class="container">
<h1>📊 会議効率シミュレーター</h1>
<div class="formula-display">
会議時間% = (利息) ÷ (会議有益率) × (才能偏在率) × (時間ムダ率)
</div>
<div class="parameter-group">
<label for="interest">利息 (Interest Rate)</label>
<div class="parameter-description">時間の機会費用を表す係数</div>
<input type="range" id="interest" min="1.00" max="1.10" step="0.01" value="1.03">
<div class="value-display" id="interestValue">1.03</div>
</div>
<div class="parameter-group">
<label for="beneficial">会議有益率 (Meeting Benefit Rate)</label>
<div class="parameter-description">参加者が会議を有益と感じる割合</div>
<input type="range" id="beneficial" min="0.50" max="0.90" step="0.01" value="0.75">
<div class="value-display" id="beneficialValue">75%</div>
</div>
<div class="parameter-group">
<label for="talent">才能偏在率 (Talent Distribution Rate)</label>
<div class="parameter-description">組織内での才能の偏在度合い</div>
<input type="range" id="talent" min="0.10" max="0.30" step="0.001" value="0.153">
<div class="value-display" id="talentValue">0.153</div>
</div>
<div class="parameter-group">
<label for="waste">時間ムダ率 (Time Waste Rate)</label>
<div class="parameter-description">会議を時間のムダと感じる人の割合</div>
<input type="range" id="waste" min="0.15" max="0.35" step="0.01" value="0.21">
<div class="value-display" id="wasteValue">21%</div>
</div>
<div class="result" id="result">
会議時間割合: 2.9%
</div>
<button class="reset-btn" onclick="resetValues()">🔄 リセット</button>
<div class="interpretation">
<h3>💡 解釈</h3>
<p id="interpretation">現在の設定では、全体の21%が会議時間として使われています。これは適切な範囲内ですが、パラメータを調整することで最適化できます。</p>
</div>
</div>
<script>
// 初期値
const defaultValues = {
interest: 1.03,
beneficial: 0.75,
talent: 0.153,
waste: 0.21
};
// 要素の取得
const interestSlider = document.getElementById('interest');
const beneficialSlider = document.getElementById('beneficial');
const talentSlider = document.getElementById('talent');
const wasteSlider = document.getElementById('waste');
const interestValue = document.getElementById('interestValue');
const beneficialValue = document.getElementById('beneficialValue');
const talentValue = document.getElementById('talentValue');
const wasteValue = document.getElementById('wasteValue');
const result = document.getElementById('result');
const interpretation = document.getElementById('interpretation');
// 計算関数
function calculateMeetingTime() {
const interest = parseFloat(interestSlider.value);
const beneficial = parseFloat(beneficialSlider.value);
const talent = parseFloat(talentSlider.value);
const waste = parseFloat(wasteSlider.value);
const meetingTime = (interest / beneficial) * talent * waste;
return {
meetingTime: meetingTime,
percentage: (meetingTime * 100).toFixed(1)
};
}
// 表示更新関数
function updateDisplay() {
const interest = parseFloat(interestSlider.value);
const beneficial = parseFloat(beneficialSlider.value);
const talent = parseFloat(talentSlider.value);
const waste = parseFloat(wasteSlider.value);
// 値の表示更新
interestValue.textContent = interest.toFixed(2);
beneficialValue.textContent = (beneficial * 100).toFixed(0) + '%';
talentValue.textContent = talent.toFixed(3);
wasteValue.textContent = (waste * 100).toFixed(0) + '%';
// 結果計算
const calc = calculateMeetingTime();
result.textContent = `会議時間割合: ${calc.percentage}%`;
result.classList.add('updated');
setTimeout(() => result.classList.remove('updated'), 500);
// 解釈の更新
updateInterpretation(calc.percentage, interest, beneficial, talent, waste);
}
// 解釈更新関数
function updateInterpretation(percentage, interest, beneficial, talent, waste) {
let text = '';
if (percentage < 15) {
text = '会議時間が非常に少ない状態です。効率的ですが、必要なコミュニケーションが不足している可能性があります。';
} else if (percentage < 25) {
text = '適切な会議時間の範囲内です。効率とコミュニケーションのバランスが取れています。';
} else if (percentage < 35) {
text = '会議時間がやや多めです。会議の必要性を見直すか、効率化を検討してください。';
} else {
text = '会議時間が過多です。大幅な見直しが必要です。会議の数を減らすか、時間短縮を検討してください。';
}
// 要因分析
if (interest > 1.05) {
text += ' 機会費用が高く、時間の価値が重要視されています。';
}
if (beneficial < 0.65) {
text += ' 会議の有益性が低いため、内容の改善が必要です。';
}
if (talent > 0.20) {
text += ' 才能の偏在が大きく、効率的な人材活用が課題です。';
}
if (waste > 0.25) {
text += ' 時間のムダと感じる人が多く、会議の質向上が急務です。';
}
interpretation.textContent = text;
}
// リセット関数
function resetValues() {
interestSlider.value = defaultValues.interest;
beneficialSlider.value = defaultValues.beneficial;
talentSlider.value = defaultValues.talent;
wasteSlider.value = defaultValues.waste;
updateDisplay();
}
// イベントリスナーの設定
interestSlider.addEventListener('input', updateDisplay);
beneficialSlider.addEventListener('input', updateDisplay);
talentSlider.addEventListener('input', updateDisplay);
wasteSlider.addEventListener('input', updateDisplay);
// 初期表示
updateDisplay();
</script>
</body>
</html>