Rewrote KPI and Project sections!
This commit is contained in:
@@ -0,0 +1,130 @@
|
|||||||
|
# Updated Investigation Cards
|
||||||
|
|
||||||
|
All methodologies tightened and formatted with `\n` line breaks for the detail panel.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PharMetrics
|
||||||
|
|
||||||
|
**Result Summary:** Interactive health economics platform — first TypeScript project
|
||||||
|
|
||||||
|
**Methodology:**
|
||||||
|
```
|
||||||
|
First TypeScript project — built to learn React while creating genuinely useful analytical tools.\n\nFeatures a risk calculator (ARR, RRR, NNT), five health economics modules (NNT cost analysis, QALY, ICER with NICE thresholds, sensitivity analysis with Monte Carlo simulations, and budget impact analysis), and two educational games: Placebo Playground (a p-hacking simulator) and Medical Trials Tycoon (a pharmaceutical business simulation).\n\nUses real Norfolk & Waveney prescribing data with custom BNF sub-groupings — extending the standard paragraph/subparagraph hierarchy to group drugs by therapeutic class (e.g. PPIs, H2 receptor antagonists) — enabling direct cost-effectiveness comparisons across the local population.\n\nThis analysis identified lansoprazole as significantly more cost-effective than omeprazole as first-line PPI: while list prices are similar, omeprazole is prescribed more frequently and patients typically require higher strengths, making a population-level switch worth over £1M in long-term savings.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Results:**
|
||||||
|
- Real-world cost-effectiveness analysis using local prescribing data with custom BNF therapeutic class groupings
|
||||||
|
- Identified lansoprazole as first-line PPI over omeprazole, with £1M+ long-term savings potential
|
||||||
|
- Five health economics modules covering NNT, QALY, ICER, sensitivity analysis, and budget impact
|
||||||
|
- Two educational games: p-hacking simulator and pharmaceutical business simulation
|
||||||
|
- Monte Carlo simulations and tornado charts for sensitivity analysis
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Patient Switching Algorithm
|
||||||
|
|
||||||
|
**Result Summary:** Months of manual analysis compressed to 3 days
|
||||||
|
|
||||||
|
**Methodology:**
|
||||||
|
```
|
||||||
|
Python algorithm ingesting real-world GP prescribing data across the full ICB population to automatically identify the optimal set of patient switches for maximum savings with minimum clinical risk.\n\nExtracts the active substance quantity from every product in the dm+d, standardising across units (g/mL, mg/L, etc.) to calculate cost per gram of active ingredient. This enables like-for-like cost-effectiveness comparisons across formulations, strengths, and brands within therapeutic classes — surfacing savings invisible from list price alone.\n\nCross-references clinical safety rules to exclude inappropriate switches, then ranks opportunities by population-level cost impact. Reimplemented in DAX as a self-serve Power BI tool for the wider team.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Results:**
|
||||||
|
- 14,000 patients identified for cost-effective switching in 3 days vs months manually
|
||||||
|
- £2.6M annual savings identified; £2M on target for delivery in-year
|
||||||
|
- Cost-per-gram standardisation across all dm+d products, surfacing savings invisible from list price
|
||||||
|
- Reimplemented in DAX as self-serve Power BI tool for team independence
|
||||||
|
- Methodology reusable annually with updated prescribing data
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NMS National Training Video
|
||||||
|
|
||||||
|
**Result Summary:** Self-initiated training resource adopted nationally across Tesco Pharmacy
|
||||||
|
|
||||||
|
**Methodology:**
|
||||||
|
```
|
||||||
|
Self-produced training video created independently to address inconsistent New Medicine Service delivery across stores.\n\nCovers the full NMS workflow — Engagement, Intervention, and Follow-up stages — including eligibility criteria for target conditions and practical identification techniques. Features a patient case study demonstrating inhaler technique correction, with adherence data showing non-adherence halving from 20% to 10%.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Results:**
|
||||||
|
- Adopted nationally across Tesco Pharmacy for NMS training delivery
|
||||||
|
- Enabled non-pharmacist staff to independently identify and enrol eligible patients
|
||||||
|
- Improved consistency of NMS engagement across stores
|
||||||
|
- Measurable uplift in NMS performance metrics
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Blueteq Generator
|
||||||
|
|
||||||
|
*(Unchanged from previous version)*
|
||||||
|
|
||||||
|
**Result Summary:** Automated 700 prior approval forms across every NICE TA
|
||||||
|
|
||||||
|
**Methodology:**
|
||||||
|
```
|
||||||
|
Built a NICE Technology Appraisal scraper that automatically extracts approval criteria, eligibility requirements, and clinical parameters for every published TA. Used this to programmatically generate standardised Blueteq prior approval forms.\n\nBy standardising form structures, enabled auto-approval workflows that eliminated the need for separate 16-week follow-up and annual renewal forms — reducing the number of forms clinicians must complete per patient despite increasing total form coverage.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Results:**
|
||||||
|
- 700 prior approval forms generated programmatically across every published NICE TA
|
||||||
|
- 200 hours of manual form creation eliminated in initial build
|
||||||
|
- ~30 hours per month in ongoing efficiency gains from automated new form generation and maintenance
|
||||||
|
- Removed requirement for separate 16-week and annual renewal forms per patient
|
||||||
|
- Integrated with secondary care activity databases for auto-approval workflows
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Patient Pathway Analysis Platform
|
||||||
|
|
||||||
|
*(Unchanged from previous version)*
|
||||||
|
|
||||||
|
**Result Summary:** £130M high-cost drug portfolio mapped to patient-level treatment pathways
|
||||||
|
|
||||||
|
**Methodology:**
|
||||||
|
```
|
||||||
|
Interactive analytics platform monitoring high-cost drug prescribing across a £130M portfolio.\n\nLinks secondary care prescribing data to build patient-level treatment sequences — first-line, second-line, third-line and beyond — then groups patients by shared pathways. These can be compared directly against NICE recommendations and local formulary guidelines, enabling systematic identification of prescribing variation and non-adherence at trust, directorate, and drug level.\n\nBuilt on a Snowflake-to-SQLite pre-computation pipeline with ~93% GP diagnosis matching via SNOMED cluster mapping. Packaged as a standalone desktop application via PyWebView for secure NHS deployment.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Results:**
|
||||||
|
- Patient-level treatment pathway mapping across a £130M high-cost drug portfolio
|
||||||
|
- Pathway compliance checking against both NICE and local prescribing guidelines
|
||||||
|
- Identified overprescribing of high-cost drugs (e.g. faricimab dosing intervals in ophthalmology), supporting trusts to return to guideline-adherent practice
|
||||||
|
- Coverage across all local trusts plus external providers treating local patients
|
||||||
|
- ~93% GP diagnosis match rate using SNOMED cluster mapping
|
||||||
|
- Standalone desktop packaging for secure NHS deployment without browser dependencies
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Opioid Monitoring System
|
||||||
|
|
||||||
|
*(Unchanged from previous version)*
|
||||||
|
|
||||||
|
**Result Summary:** Cross-system opioid safety monitoring across 1.2M population
|
||||||
|
|
||||||
|
**Methodology:**
|
||||||
|
```
|
||||||
|
Population-scale opioid monitoring system calculating oral morphine equivalents (OME) for every opioid prescription across the ICB footprint, tracking patient-level exposure over rolling six-month windows.\n\nCritically, links prescribing data across multiple sources — GP, out-of-hours, and NHS 111 — enabling identification of patients obtaining opioids from multiple prescribing settings. Supports the ICB's statutory controlled drug assurance responsibilities.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Results:**
|
||||||
|
- Patient-level OME tracking across all opioid prescriptions with rolling six-month exposure windows
|
||||||
|
- Cross-system data linkage (GP, out-of-hours, NHS 111) to identify patients accessing opioids from multiple prescribing routes
|
||||||
|
- Hundreds of high-risk patients flagged for clinical review, with ongoing GP engagement
|
||||||
|
- Supports ICB Controlled Drug Accountable Officer statutory assurance functions
|
||||||
|
- Population-scale analysis previously not possible with existing NHS tooling
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary of Changes
|
||||||
|
|
||||||
|
| Card | Key Change |
|
||||||
|
|---|---|
|
||||||
|
| **PharMetrics** | Reframed as "first TypeScript project" + lansoprazole finding as centrepiece |
|
||||||
|
| **Switching Algorithm** | Added dm+d active substance extraction and cost-per-gram standardisation |
|
||||||
|
| **NMS Training** | Tightened from verbose transcript summary to concise project description |
|
||||||
|
| **Blueteq** | Methodology split into two paragraphs with \n breaks |
|
||||||
|
| **Pathway Analysis** | Methodology split into three paragraphs with \n breaks |
|
||||||
|
| **Opioid Monitoring** | Methodology split into two paragraphs with \n breaks |
|
||||||
Binary file not shown.
@@ -65,6 +65,27 @@ export function ChatWidget({ onAction }: ChatWidgetProps) {
|
|||||||
|
|
||||||
const llmAvailable = isLLMAvailable()
|
const llmAvailable = isLLMAvailable()
|
||||||
|
|
||||||
|
// Nudge bubble: show once after 12s if user hasn't opened chat yet
|
||||||
|
const [showNudge, setShowNudge] = useState(false)
|
||||||
|
const hasInteracted = useRef(false)
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const timer = setTimeout(() => {
|
||||||
|
if (!hasInteracted.current) setShowNudge(true)
|
||||||
|
}, 12_000)
|
||||||
|
return () => clearTimeout(timer)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!showNudge) return
|
||||||
|
const dismiss = () => {
|
||||||
|
hasInteracted.current = true
|
||||||
|
setShowNudge(false)
|
||||||
|
}
|
||||||
|
window.addEventListener('click', dismiss, { once: true })
|
||||||
|
return () => window.removeEventListener('click', dismiss)
|
||||||
|
}, [showNudge])
|
||||||
|
|
||||||
// Build palette map for looking up items by ID
|
// Build palette map for looking up items by ID
|
||||||
const paletteMap = useMemo(() => {
|
const paletteMap = useMemo(() => {
|
||||||
const items = buildPaletteData()
|
const items = buildPaletteData()
|
||||||
@@ -649,36 +670,141 @@ export function ChatWidget({ onAction }: ChatWidgetProps) {
|
|||||||
initial="hidden"
|
initial="hidden"
|
||||||
animate="visible"
|
animate="visible"
|
||||||
variants={buttonVariants}
|
variants={buttonVariants}
|
||||||
onClick={() => setIsOpen((prev) => !prev)}
|
onClick={() => {
|
||||||
|
hasInteracted.current = true
|
||||||
|
setShowNudge(false)
|
||||||
|
setIsOpen((prev) => !prev)
|
||||||
|
}}
|
||||||
aria-label={isOpen ? 'Close chat' : 'Open chat'}
|
aria-label={isOpen ? 'Close chat' : 'Open chat'}
|
||||||
className={`fixed z-[101] cursor-pointer flex items-center justify-center bottom-4 right-4 h-10 w-10 md:bottom-6 md:right-6 md:h-12 md:w-12${isOpen ? ' max-md:!hidden' : ''}`}
|
className={`fixed z-[101] cursor-pointer flex items-center justify-center bottom-4 right-4 h-12 w-12 md:bottom-6 md:right-6 md:h-14 md:w-14 lg:h-16 lg:w-16 xl:h-[4.5rem] xl:w-[4.5rem]${isOpen ? ' max-md:!hidden' : ''}`}
|
||||||
style={{
|
style={{
|
||||||
bottom: isMobileNav ? 'calc(56px + env(safe-area-inset-bottom) + 16px)' : undefined,
|
bottom: isMobileNav ? 'calc(56px + env(safe-area-inset-bottom) + 16px)' : undefined,
|
||||||
borderRadius: '50%',
|
borderRadius: '50%',
|
||||||
border: 'none',
|
border: 'none',
|
||||||
background: 'var(--accent)',
|
background: 'var(--accent)',
|
||||||
|
opacity: 0.85,
|
||||||
color: '#FFFFFF',
|
color: '#FFFFFF',
|
||||||
boxShadow: 'var(--shadow-md)',
|
boxShadow: 'var(--shadow-md)',
|
||||||
transition: 'box-shadow 150ms ease-out, transform 150ms ease-out',
|
animation: prefersReducedMotion ? 'none' : 'chat-pulse 3s ease-in-out infinite',
|
||||||
|
transition: 'box-shadow 150ms ease-out, transform 150ms ease-out, opacity 150ms ease-out',
|
||||||
}}
|
}}
|
||||||
onMouseEnter={(e) => {
|
onMouseEnter={(e) => {
|
||||||
e.currentTarget.style.boxShadow = 'var(--shadow-lg)'
|
e.currentTarget.style.boxShadow = 'var(--shadow-lg)'
|
||||||
e.currentTarget.style.transform = 'scale(1.05)'
|
e.currentTarget.style.transform = 'scale(1.05)'
|
||||||
|
e.currentTarget.style.opacity = '1'
|
||||||
|
e.currentTarget.style.animation = 'none'
|
||||||
}}
|
}}
|
||||||
onMouseLeave={(e) => {
|
onMouseLeave={(e) => {
|
||||||
e.currentTarget.style.boxShadow = 'var(--shadow-md)'
|
e.currentTarget.style.boxShadow = 'var(--shadow-md)'
|
||||||
e.currentTarget.style.transform = 'scale(1)'
|
e.currentTarget.style.transform = 'scale(1)'
|
||||||
|
e.currentTarget.style.opacity = '0.85'
|
||||||
|
e.currentTarget.style.animation = prefersReducedMotion ? 'none' : 'chat-pulse 3s ease-in-out infinite'
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{isOpen ? <X size={20} strokeWidth={2} /> : <MessageCircle size={20} strokeWidth={2} />}
|
{isOpen ? (
|
||||||
|
<>
|
||||||
|
<X size={22} strokeWidth={2} className="lg:hidden" />
|
||||||
|
<X size={26} strokeWidth={2} className="hidden lg:block xl:hidden" />
|
||||||
|
<X size={30} strokeWidth={2} className="hidden xl:block" />
|
||||||
|
</>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<MessageCircle size={22} strokeWidth={2} className="lg:hidden" />
|
||||||
|
<MessageCircle size={26} strokeWidth={2} className="hidden lg:block xl:hidden" />
|
||||||
|
<MessageCircle size={30} strokeWidth={2} className="hidden xl:block" />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</motion.button>
|
</motion.button>
|
||||||
|
|
||||||
|
{/* Nudge bubble */}
|
||||||
|
<AnimatePresence>
|
||||||
|
{showNudge && !isOpen && (
|
||||||
|
<motion.div
|
||||||
|
initial={prefersReducedMotion ? { opacity: 1 } : { opacity: 0, y: 6 }}
|
||||||
|
animate={{ opacity: 1, y: 0, transition: motionSafeTransition(0.25, 'easeOut') }}
|
||||||
|
exit={prefersReducedMotion ? { opacity: 1 } : { opacity: 0, y: 4, transition: { duration: 0.2, ease: 'easeIn' } }}
|
||||||
|
className="fixed z-[101] right-4 md:right-6 pointer-events-none"
|
||||||
|
style={{
|
||||||
|
/* Position above button: button-bottom + button-height + gap */
|
||||||
|
bottom: isMobileNav
|
||||||
|
? 'calc(56px + env(safe-area-inset-bottom) + 72px)'
|
||||||
|
: undefined,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Mobile: above 48px button at bottom-4 */}
|
||||||
|
<div
|
||||||
|
className="md:hidden px-3 py-2 rounded-xl text-xs font-medium max-w-[200px]"
|
||||||
|
style={{
|
||||||
|
position: 'fixed',
|
||||||
|
bottom: isMobileNav ? undefined : 'calc(16px + 48px + 10px)',
|
||||||
|
right: '16px',
|
||||||
|
background: 'var(--surface)',
|
||||||
|
color: 'var(--text-primary)',
|
||||||
|
border: '1px solid var(--border)',
|
||||||
|
boxShadow: 'var(--shadow-md)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Hey! I can help you learn more about Andy.
|
||||||
|
</div>
|
||||||
|
{/* md: above 56px button at bottom-6 */}
|
||||||
|
<div
|
||||||
|
className="hidden md:block lg:hidden px-3.5 py-2.5 rounded-xl text-sm font-medium max-w-[240px]"
|
||||||
|
style={{
|
||||||
|
position: 'fixed',
|
||||||
|
bottom: 'calc(24px + 56px + 10px)',
|
||||||
|
right: '24px',
|
||||||
|
background: 'var(--surface)',
|
||||||
|
color: 'var(--text-primary)',
|
||||||
|
border: '1px solid var(--border)',
|
||||||
|
boxShadow: 'var(--shadow-md)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Hey! I can help you learn more about Andy.
|
||||||
|
</div>
|
||||||
|
{/* lg: above 64px button */}
|
||||||
|
<div
|
||||||
|
className="hidden lg:block xl:hidden px-4 py-3 rounded-xl text-base font-medium max-w-[280px]"
|
||||||
|
style={{
|
||||||
|
position: 'fixed',
|
||||||
|
bottom: 'calc(24px + 64px + 12px)',
|
||||||
|
right: '24px',
|
||||||
|
background: 'var(--surface)',
|
||||||
|
color: 'var(--text-primary)',
|
||||||
|
border: '1px solid var(--border)',
|
||||||
|
boxShadow: 'var(--shadow-md)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Hey! I can help you learn more about Andy.
|
||||||
|
</div>
|
||||||
|
{/* xl: above 72px button */}
|
||||||
|
<div
|
||||||
|
className="hidden xl:block px-5 py-3 rounded-2xl text-base font-medium max-w-[300px]"
|
||||||
|
style={{
|
||||||
|
position: 'fixed',
|
||||||
|
bottom: 'calc(24px + 72px + 14px)',
|
||||||
|
right: '24px',
|
||||||
|
background: 'var(--surface)',
|
||||||
|
color: 'var(--text-primary)',
|
||||||
|
border: '1px solid var(--border)',
|
||||||
|
boxShadow: 'var(--shadow-md)',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Hey! I can help you learn more about Andy.
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
|
|
||||||
{/* Spinner keyframes */}
|
{/* Spinner keyframes */}
|
||||||
<style>{`
|
<style>{`
|
||||||
@keyframes spin {
|
@keyframes spin {
|
||||||
from { transform: rotate(0deg); }
|
from { transform: rotate(0deg); }
|
||||||
to { transform: rotate(360deg); }
|
to { transform: rotate(360deg); }
|
||||||
}
|
}
|
||||||
|
@keyframes chat-pulse {
|
||||||
|
0%, 100% { transform: scale(1); opacity: 0.85; }
|
||||||
|
50% { transform: scale(1.06); opacity: 0.85; }
|
||||||
|
}
|
||||||
`}</style>
|
`}</style>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ export function ProjectDetail({ investigation }: ProjectDetailProps) {
|
|||||||
{/* Methodology */}
|
{/* Methodology */}
|
||||||
<div>
|
<div>
|
||||||
<h3 style={sectionHeadingStyle}>Methodology</h3>
|
<h3 style={sectionHeadingStyle}>Methodology</h3>
|
||||||
<p style={paragraphStyle}>{investigation.methodology}</p>
|
<p style={{ ...paragraphStyle, whiteSpace: 'pre-line' }}>{investigation.methodology}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Tech stack tags */}
|
{/* Tech stack tags */}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export const bulletListStyle: CSSProperties = {
|
|||||||
display: 'flex',
|
display: 'flex',
|
||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
gap: '8px',
|
gap: '8px',
|
||||||
|
listStyleType: 'disc',
|
||||||
}
|
}
|
||||||
|
|
||||||
export const bodyTextStyle: CSSProperties = {
|
export const bodyTextStyle: CSSProperties = {
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import { investigations } from '@/data/investigations'
|
|||||||
import { CardHeader } from '../Card'
|
import { CardHeader } from '../Card'
|
||||||
import { useDetailPanel } from '@/contexts/DetailPanelContext'
|
import { useDetailPanel } from '@/contexts/DetailPanelContext'
|
||||||
import type { Investigation } from '@/types/pmr'
|
import type { Investigation } from '@/types/pmr'
|
||||||
import { PROJECT_STATUS_COLORS } from '@/lib/theme-colors'
|
|
||||||
|
|
||||||
interface ProjectItemProps {
|
interface ProjectItemProps {
|
||||||
project: Investigation
|
project: Investigation
|
||||||
@@ -33,7 +32,6 @@ function ProjectItem({
|
|||||||
onEscape,
|
onEscape,
|
||||||
isInert,
|
isInert,
|
||||||
}: ProjectItemProps) {
|
}: ProjectItemProps) {
|
||||||
const dotColor = PROJECT_STATUS_COLORS[project.status]
|
|
||||||
const livePillLabel = project.demoUrl ? 'Live Demo' : project.externalUrl ? 'Live' : null
|
const livePillLabel = project.demoUrl ? 'Live Demo' : project.externalUrl ? 'Live' : null
|
||||||
const [isHovered, setIsHovered] = useState(false)
|
const [isHovered, setIsHovered] = useState(false)
|
||||||
|
|
||||||
@@ -239,19 +237,6 @@ function ProjectItem({
|
|||||||
gap: '8px',
|
gap: '8px',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{!livePillLabel && (
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
width: '8px',
|
|
||||||
height: '8px',
|
|
||||||
borderRadius: '50%',
|
|
||||||
backgroundColor: dotColor,
|
|
||||||
flexShrink: 0,
|
|
||||||
marginTop: '4px',
|
|
||||||
}}
|
|
||||||
aria-hidden="true"
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<span style={{ flex: 1, fontWeight: 500, display: 'flex', alignItems: 'center', gap: '6px', flexWrap: 'wrap' }}>
|
<span style={{ flex: 1, fontWeight: 500, display: 'flex', alignItems: 'center', gap: '6px', flexWrap: 'wrap' }}>
|
||||||
{project.name}
|
{project.name}
|
||||||
{livePillLabel && (
|
{livePillLabel && (
|
||||||
@@ -292,9 +277,9 @@ function ProjectItem({
|
|||||||
{project.resultSummary && (
|
{project.resultSummary && (
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
fontSize: '12px',
|
fontSize: '13px',
|
||||||
fontWeight: 700,
|
fontWeight: 400,
|
||||||
fontFamily: 'var(--font-geist-mono)',
|
//fontFamily: 'var(--font-geist-mono)',
|
||||||
color: 'var(--accent)',
|
color: 'var(--accent)',
|
||||||
letterSpacing: '-0.01em',
|
letterSpacing: '-0.01em',
|
||||||
lineHeight: 1.3,
|
lineHeight: 1.3,
|
||||||
|
|||||||
+1
-1
@@ -7,7 +7,7 @@ export const alerts: Alert[] = [
|
|||||||
icon: 'AlertTriangle',
|
icon: 'AlertTriangle',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
message: '£220M BUDGET OVERSIGHT',
|
message: '£215M BUDGET OVERSIGHT',
|
||||||
severity: 'amber',
|
severity: 'amber',
|
||||||
icon: 'AlertCircle',
|
icon: 'AlertCircle',
|
||||||
},
|
},
|
||||||
|
|||||||
+42
-40
@@ -7,14 +7,14 @@ export const investigations: Investigation[] = [
|
|||||||
requestedYear: 2025,
|
requestedYear: 2025,
|
||||||
reportedYear: 2025,
|
reportedYear: 2025,
|
||||||
status: 'Live',
|
status: 'Live',
|
||||||
resultSummary: 'Live at medicines.charlwood.xyz',
|
resultSummary: 'Interactive health economics platform — first TypeScript project',
|
||||||
requestingClinician: 'A. Charlwood',
|
requestingClinician: 'A. Charlwood',
|
||||||
methodology: 'First TypeScript project. Interactive health economics educational platform combining clinical trial statistics, health economics modules, and game-based learning. Features a risk calculator (ARR, RRR, NNT), five health economics education modules (NNT cost analysis, QALY, ICER with NICE thresholds, sensitivity analysis with Monte Carlo simulations, and budget impact analysis), and two educational games: Placebo Playground (a p-hacking simulator demonstrating how study parameters can be manipulated to achieve statistical significance) and Medical Trials Tycoon (a pharmaceutical business simulation exploring ethical trade-offs between patient outcomes and profit).',
|
methodology: 'First TypeScript project — built to learn React while creating genuinely useful analytical tools.\n\nFeatures a risk calculator (ARR, RRR, NNT), five health economics modules (NNT cost analysis, QALY, ICER with NICE thresholds, sensitivity analysis with Monte Carlo simulations, and budget impact analysis), and two educational games: Placebo Playground (a p-hacking simulator) and Medical Trials Tycoon (a pharmaceutical business simulation).\n\nUses real Norfolk & Waveney prescribing data with custom BNF sub-groupings — extending the standard paragraph/subparagraph hierarchy to group drugs by therapeutic class (e.g. PPIs, H2 receptor antagonists) — enabling direct cost-effectiveness comparisons across the local population.\n\nThis analysis identified lansoprazole as significantly more cost-effective than omeprazole as first-line PPI: while list prices are similar, omeprazole is prescribed more frequently and patients typically require higher strengths, making a population-level switch worth over £1M in long-term savings.',
|
||||||
results: [
|
results: [
|
||||||
'Risk calculator with interactive ARR, RRR, and NNT visualisations',
|
'Real-world cost-effectiveness analysis using local prescribing data with custom BNF therapeutic class groupings',
|
||||||
|
'Identified lansoprazole as first-line PPI over omeprazole, with £1M+ long-term savings potential',
|
||||||
'Five health economics modules covering NNT, QALY, ICER, sensitivity analysis, and budget impact',
|
'Five health economics modules covering NNT, QALY, ICER, sensitivity analysis, and budget impact',
|
||||||
'P-hacking game teaching research manipulation through parameter adjustment',
|
'Two educational games: p-hacking simulator and pharmaceutical business simulation',
|
||||||
'Pharma business simulation with ethical decision-making and clinical trial mechanics',
|
|
||||||
'Monte Carlo simulations and tornado charts for sensitivity analysis',
|
'Monte Carlo simulations and tornado charts for sensitivity analysis',
|
||||||
],
|
],
|
||||||
techStack: ['React', 'TypeScript', 'Vite', 'Zustand', 'Recharts', 'D3', 'Styled Components'],
|
techStack: ['React', 'TypeScript', 'Vite', 'Zustand', 'Recharts', 'D3', 'Styled Components'],
|
||||||
@@ -28,15 +28,15 @@ export const investigations: Investigation[] = [
|
|||||||
requestedYear: 2025,
|
requestedYear: 2025,
|
||||||
reportedYear: 2025,
|
reportedYear: 2025,
|
||||||
status: 'Complete',
|
status: 'Complete',
|
||||||
resultSummary: '14,000 patients identified',
|
resultSummary: 'Months of manual analysis compressed to 3 days',
|
||||||
requestingClinician: 'A. Charlwood',
|
requestingClinician: 'A. Charlwood',
|
||||||
methodology: 'Python-based algorithm using real-world GP prescribing data to automatically identify patients on expensive drugs suitable for cost-effective alternatives. Compressed months of manual analysis into 3 days.',
|
methodology: 'Python algorithm ingesting real-world GP prescribing data across the full ICB population to automatically identify the optimal set of patient switches for maximum savings with minimum clinical risk.\n\nExtracts the active substance quantity from every product in the dm+d, standardising across units (g/mL, mg/L, etc.) to calculate cost per gram of active ingredient. This enables like-for-like cost-effectiveness comparisons across formulations, strengths, and brands within therapeutic classes — surfacing savings invisible from list price alone.\n\nCross-references clinical safety rules to exclude inappropriate switches, then ranks opportunities by population-level cost impact. Reimplemented in DAX as a self-serve Power BI tool for the wider team.',
|
||||||
results: [
|
results: [
|
||||||
'14,000 patients identified for cost-effective alternatives',
|
'14,000 patients identified for cost-effective switching in 3 days vs months manually',
|
||||||
'£2.6M annual savings potential identified',
|
'£2.6M annual savings identified; £2M on target for delivery in-year',
|
||||||
'£2M on target for delivery this financial year',
|
'Cost-per-gram standardisation across all dm+d products, surfacing savings invisible from list price',
|
||||||
'Reimplemented in DAX for sharing as internal Power BI tool',
|
'Reimplemented in DAX as self-serve Power BI tool for team independence',
|
||||||
'Novel GP payment system linking rewards to savings'
|
'Methodology reusable annually with updated prescribing data',
|
||||||
],
|
],
|
||||||
techStack: ['DAX', 'Python', 'SQL'],
|
techStack: ['DAX', 'Python', 'SQL'],
|
||||||
skills: ['Health Economics', 'Medicines Optimisation', 'Power BI'],
|
skills: ['Health Economics', 'Medicines Optimisation', 'Power BI'],
|
||||||
@@ -48,15 +48,14 @@ export const investigations: Investigation[] = [
|
|||||||
requestedYear: 2018,
|
requestedYear: 2018,
|
||||||
reportedYear: 2018,
|
reportedYear: 2018,
|
||||||
status: 'Live',
|
status: 'Live',
|
||||||
resultSummary: 'Shared nationally across Tesco Pharmacy',
|
resultSummary: 'Self-initiated training resource adopted nationally across Tesco Pharmacy',
|
||||||
requestingClinician: 'A. Charlwood',
|
requestingClinician: 'A. Charlwood',
|
||||||
methodology: 'Self-produced training video covering the full New Medicine Service workflow — the three-stage consultation process (Engagement, Intervention, Follow-up), eligibility criteria for target conditions (asthma/COPD, hypertension, anticoagulation, type 2 diabetes), and practical techniques like the "star" prescription marking system. Features a patient case study demonstrating how NMS intervention corrected inhaler technique, and presents adherence data showing non-adherence halving from 20% to 10%. Created independently to address inconsistent NMS delivery across stores.',
|
methodology: 'Self-produced training video created independently to address inconsistent New Medicine Service delivery across stores.\n\nCovers the full NMS workflow — Engagement, Intervention, and Follow-up stages — including eligibility criteria for target conditions and practical identification techniques. Features a patient case study demonstrating inhaler technique correction, with adherence data showing non-adherence halving from 20% to 10%.',
|
||||||
results: [
|
results: [
|
||||||
'Shared across Tesco Pharmacy nationally to support delivery of the New Medicine Service',
|
'Adopted nationally across Tesco Pharmacy for NMS training delivery',
|
||||||
'Empowered non-pharmacist staff to identify and enrol eligible patients',
|
'Enabled non-pharmacist staff to independently identify and enrol eligible patients',
|
||||||
'Improved consistency and quality of NMS engagement from non-pharmacist staff',
|
'Improved consistency of NMS engagement across stores',
|
||||||
'Supported successful uplift in NMS performance metrics across stores',
|
'Measurable uplift in NMS performance metrics',
|
||||||
|
|
||||||
],
|
],
|
||||||
techStack: ['Video Production'],
|
techStack: ['Video Production'],
|
||||||
skills: ['Training & Development', 'Clinical Services', 'Leadership'],
|
skills: ['Training & Development', 'Clinical Services', 'Leadership'],
|
||||||
@@ -69,14 +68,15 @@ export const investigations: Investigation[] = [
|
|||||||
requestedYear: 2023,
|
requestedYear: 2023,
|
||||||
reportedYear: 2023,
|
reportedYear: 2023,
|
||||||
status: 'Complete',
|
status: 'Complete',
|
||||||
resultSummary: '70% reduction in forms',
|
resultSummary: 'Automated 700 prior approval forms across every NICE TA',
|
||||||
requestingClinician: 'A. Charlwood',
|
requestingClinician: 'A. Charlwood',
|
||||||
methodology: 'Software automation of Blueteq prior approval form creation, reducing manual data entry and standardising form generation across high-cost drug pathways.',
|
methodology: 'Built a NICE Technology Appraisal scraper that automatically extracts approval criteria, eligibility requirements, and clinical parameters for every published TA. Used this to programmatically generate standardised Blueteq prior approval forms.\n\nBy standardising form structures, enabled auto-approval workflows that eliminated the need for separate 16-week follow-up and annual renewal forms — reducing the number of forms clinicians must complete per patient despite increasing total form coverage.',
|
||||||
results: [
|
results: [
|
||||||
'70% reduction in required Blueteq forms',
|
'700 prior approval forms generated programmatically across every published NICE TA',
|
||||||
'200 hours immediate savings',
|
'200 hours of manual form creation eliminated in initial build',
|
||||||
'7–8 hours ongoing weekly efficiency gains',
|
'~30 hours per month in ongoing efficiency gains from automated new form generation and maintenance',
|
||||||
'Integrated with secondary care activity databases',
|
'Removed requirement for separate 16-week and annual renewal forms per patient',
|
||||||
|
'Integrated with secondary care activity databases for auto-approval workflows',
|
||||||
],
|
],
|
||||||
techStack: ['Python', 'SQL'],
|
techStack: ['Python', 'SQL'],
|
||||||
skills: ['High-Cost Drugs', 'Prior Approval', 'Process Automation'],
|
skills: ['High-Cost Drugs', 'Prior Approval', 'Process Automation'],
|
||||||
@@ -88,35 +88,37 @@ export const investigations: Investigation[] = [
|
|||||||
requestedYear: 2023,
|
requestedYear: 2023,
|
||||||
reportedYear: 2024,
|
reportedYear: 2024,
|
||||||
status: 'Complete',
|
status: 'Complete',
|
||||||
resultSummary: '9 interactive chart types, sub-50ms responses',
|
resultSummary: '£130M high-cost drug portfolio mapped to patient-level treatment pathways',
|
||||||
requestingClinician: 'A. Charlwood',
|
requestingClinician: 'A. Charlwood',
|
||||||
methodology: 'Interactive Dash web application for analysing high-cost drug patient pathways. Features a Snowflake→SQLite pre-computation pipeline feeding 9 interactive Plotly chart types including hierarchical icicle charts with Trust→Directorate→Drug→Pathway drill-down. Achieves ~93% GP diagnosis matching via SNOMED cluster mapping. Packaged as a standalone desktop application via PyWebView for secure NHS deployment without browser dependencies.',
|
methodology: 'Interactive analytics platform monitoring high-cost drug prescribing across a £130M portfolio.\n\nLinks secondary care prescribing data to build patient-level treatment sequences — first-line, second-line, third-line and beyond — then groups patients by shared pathways. These can be compared directly against NICE recommendations and local formulary guidelines, enabling systematic identification of prescribing variation and non-adherence at trust, directorate, and drug level.\n\nBuilt on a Snowflake-to-SQLite pre-computation pipeline with ~93% GP diagnosis matching via SNOMED cluster mapping. Packaged as a standalone desktop application via PyWebView for secure NHS deployment.',
|
||||||
results: [
|
results: [
|
||||||
'9 interactive chart types for pathway analysis',
|
'Patient-level treatment pathway mapping across a £130M high-cost drug portfolio',
|
||||||
'Sub-50ms response times via pre-computed SQLite pipeline',
|
'Pathway compliance checking against both NICE and local prescribing guidelines',
|
||||||
'~93% GP diagnosis match rate using SNOMED clusters',
|
'Identified overprescribing of high-cost drugs (e.g. faricimab dosing intervals in ophthalmology), supporting trusts to return to guideline-adherent practice',
|
||||||
'Standalone desktop packaging via PyWebView',
|
'Coverage across all local trusts plus external providers treating local patients',
|
||||||
'Trust-level compliance auditing across all high-cost drug pathways',
|
'~93% GP diagnosis match rate using SNOMED cluster mapping',
|
||||||
|
'Standalone desktop packaging for secure NHS deployment without browser dependencies',
|
||||||
],
|
],
|
||||||
techStack: ['Python', 'Dash', 'Plotly', 'Pandas', 'NumPy', 'SQLite', 'Snowflake', 'PyWebView'],
|
techStack: ['Python', 'Dash', 'Plotly', 'Pandas', 'NumPy', 'SQLite', 'Snowflake', 'PyWebView'],
|
||||||
skills: ['Health Economics', 'Clinical Pathways', 'Medicines Optimisation', 'Data Visualisation', 'NHS Secondary Care', 'Patient Safety'],
|
skills: ['Health Economics', 'Clinical Pathways', 'Medicines Optimisation', 'Data Visualisation', 'NHS Secondary Care', 'Patient Safety'],
|
||||||
demoUrl: 'https://demo.charlwood.xyz',
|
demoUrl: 'https://demo.charlwood.xyz',
|
||||||
thumbnail: '/thumbnails/pathways.jpg',
|
thumbnail: '/thumbnails/pathways.jpg',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'inv-cd-monitoring',
|
id: 'inv-cd-monitoring',
|
||||||
name: 'CD Monitoring System',
|
name: 'Opioid Monitoring System',
|
||||||
requestedYear: 2024,
|
requestedYear: 2024,
|
||||||
reportedYear: 2024,
|
reportedYear: 2024,
|
||||||
status: 'Complete',
|
status: 'Complete',
|
||||||
resultSummary: 'Population-scale OME tracking',
|
resultSummary: 'Cross-system opioid safety monitoring across 1.2M population',
|
||||||
requestingClinician: 'A. Charlwood',
|
requestingClinician: 'A. Charlwood',
|
||||||
methodology: 'Python-based controlled drug monitoring system calculating oral morphine equivalents (OME) across all opioid prescriptions to track patient-level exposure over time.',
|
methodology: 'Population-scale opioid monitoring system calculating oral morphine equivalents (OME) for every opioid prescription across the ICB footprint, tracking patient-level exposure over rolling six-month windows.\n\nCritically, links prescribing data across multiple sources — GP, out-of-hours, and NHS 111 — enabling identification of patients obtaining opioids from multiple prescribing settings. Supports the ICB\'s statutory controlled drug assurance responsibilities.',
|
||||||
results: [
|
results: [
|
||||||
'Patient-level OME tracking over time',
|
'Patient-level OME tracking across all opioid prescriptions with rolling six-month exposure windows',
|
||||||
'High-risk patient identification',
|
'Cross-system data linkage (GP, out-of-hours, NHS 111) to identify patients accessing opioids from multiple prescribing routes',
|
||||||
'Potential diversion detection',
|
'Hundreds of high-risk patients flagged for clinical review, with ongoing GP engagement',
|
||||||
'Previously impossible population-scale analysis',
|
'Supports ICB Controlled Drug Accountable Officer statutory assurance functions',
|
||||||
|
'Population-scale analysis previously not possible with existing NHS tooling',
|
||||||
],
|
],
|
||||||
techStack: ['Python', 'SQL'],
|
techStack: ['Python', 'SQL'],
|
||||||
skills: ['Controlled Drugs', 'Patient Safety', 'Prescribing Analytics'],
|
skills: ['Controlled Drugs', 'Patient Safety', 'Prescribing Analytics'],
|
||||||
|
|||||||
+46
-46
@@ -3,19 +3,19 @@ import type { KPI } from '@/types/pmr'
|
|||||||
export const kpis: KPI[] = [
|
export const kpis: KPI[] = [
|
||||||
{
|
{
|
||||||
id: 'budget',
|
id: 'budget',
|
||||||
value: '£220M',
|
value: '£215M',
|
||||||
label: 'Budget Oversight',
|
label: 'Budget Oversight',
|
||||||
sub: 'NHS prescribing',
|
sub: 'Bimonthly CMO financial reporting',
|
||||||
colorVariant: 'green',
|
colorVariant: 'green',
|
||||||
explanation: 'Full analytical accountability for the ICB\'s total prescribing budget, with sophisticated forecasting models identifying cost pressures and enabling proactive financial planning across Norfolk & Waveney.',
|
explanation: 'Full analytical accountability for the ICB\'s primary care prescribing budget, building forecasting models that integrate prescribing trends, NICE mandate costs, patent expiry timelines, and efficiency programme trajectories to enable proactive financial planning.',
|
||||||
story: {
|
story: {
|
||||||
context: 'Total primary care prescribing budget for NHS Norfolk & Waveney ICB, covering prescriptions for a population of 1.2 million across the integrated care system. Expenditure driven by GP prescribing patterns, NICE technology appraisal mandates, patent expiry timelines, and pharmaceutical pricing changes.',
|
context: 'Total primary care prescribing budget for NHS Norfolk & Waveney ICB, serving 1.2 million people. Expenditure driven by GP prescribing patterns, NICE technology appraisal mandates, patent expiry timelines, and pharmaceutical pricing changes.',
|
||||||
role: 'Full analytical accountability for budget oversight, building sophisticated forecasting models integrating prescribing trend data, cost pressure drivers, and efficiency programme trajectories. Presented budget position and evidence-based recommendations to Chief Medical Officer bimonthly.',
|
role: 'Full analytical accountability for budget monitoring and forecasting. Built models integrating multiple cost-pressure drivers to identify risks early and inform strategic decision-making. Presented budget position and evidence-based recommendations to Chief Medical Officer bimonthly.',
|
||||||
outcomes: [
|
outcomes: [
|
||||||
'Forecasting models identifying cost pressures and enabling proactive financial planning',
|
'Forecasting models integrating prescribing trends, NICE mandates, and patent expiry timelines',
|
||||||
'Proactive financial planning embedded across the medicines optimisation programme',
|
'Proactive identification of cost pressures enabling early intervention',
|
||||||
'Interactive Power BI dashboard tracking expenditure patterns against plan',
|
'Interactive Power BI dashboard tracking real-time expenditure against plan',
|
||||||
'Bimonthly financial reporting and evidence-based recommendations to CMO',
|
'Bimonthly evidence-based financial reporting direct to CMO',
|
||||||
],
|
],
|
||||||
period: 'Jul 2024 – Present',
|
period: 'Jul 2024 – Present',
|
||||||
},
|
},
|
||||||
@@ -23,58 +23,58 @@ export const kpis: KPI[] = [
|
|||||||
{
|
{
|
||||||
id: 'savings',
|
id: 'savings',
|
||||||
value: '£14.6M',
|
value: '£14.6M',
|
||||||
label: 'Efficiency Savings',
|
label: 'Efficiency Programme',
|
||||||
sub: 'Identified & tracked',
|
sub: 'Over-target delivery by Oct 2025',
|
||||||
colorVariant: 'amber',
|
colorVariant: 'amber',
|
||||||
explanation: 'Identified and prioritised a £14.6M efficiency programme through comprehensive prescribing data analysis; achieved over-target performance through targeted, evidence-based interventions across the integrated care system.',
|
explanation: 'Designed, prioritised, and tracked a £14.6M system-wide efficiency programme from prescribing data analysis through to GP-level delivery, achieving over-target performance within six months.',
|
||||||
story: {
|
story: {
|
||||||
context: 'System-wide efficiency programme identified through comprehensive analysis of real-world GP prescribing data, targeting high-cost medicines with cost-effective alternatives, generic switching opportunities, and evidence-based formulary optimisation across all practices in the integrated care system.',
|
context: 'System-wide efficiency programme requiring identification of cost-effective switching opportunities across hundreds of thousands of prescriptions, target-setting for individual GP practices, and a mechanism to incentivise and track delivery.',
|
||||||
role: 'Led the data analysis to identify, quantify, and prioritise efficiency opportunities. Built automated analytical tools compressing months of manual work into days. Designed the programme structure, set targets, and tracked delivery against plan. Created a novel GP incentive scheme linking payment to demonstrated savings.',
|
role: 'Led end-to-end programme design: identified and quantified opportunities through automated prescribing analysis, set practice-level targets, designed a novel GP incentive scheme linking payment directly to demonstrated savings, and tracked delivery against plan.',
|
||||||
outcomes: [
|
outcomes: [
|
||||||
'Identified and prioritised £14.6M efficiency programme through automated prescribing data analysis',
|
'£14.6M efficiency programme identified, prioritised, and structured for delivery',
|
||||||
'Achieved over-target performance by October 2025',
|
'Over-target performance achieved by October 2025',
|
||||||
'Built Python-based switching algorithm identifying 14,000 patients and £2.6M in annual savings',
|
'Novel GP incentive scheme linking payment to verified savings',
|
||||||
'Automated incentive scheme with novel GP payment system: 50% prescribing reduction in 2 months',
|
'50% reduction in targeted prescribing within first two months of deployment',
|
||||||
],
|
],
|
||||||
period: 'May 2025 – Nov 2025',
|
period: 'May 2025 – Nov 2025',
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'prescriptions',
|
||||||
|
value: '20M',
|
||||||
|
label: 'Prescriptions decoded annually',
|
||||||
|
sub: '90% coverage — free text to structured data',
|
||||||
|
colorVariant: 'teal',
|
||||||
|
explanation: 'Hybrid regex and AI pipeline parsing free-text prescription directions across 22M annual prescriptions, achieving 90% coverage (19.8M prescriptions) with structured daily quantities. Enables prescription duration calculations, adherence analysis, and over/underprescribing detection — now in production across the ICB\'s analytical infrastructure.',
|
||||||
|
story: {
|
||||||
|
context: 'NHS prescription directions are written as free text ("take one twice daily", "apply sparingly as needed", "two puffs morning and night"). With 22M prescriptions annually, determining how long a prescription should last, a fundamental clinical and financial question, was effectively unanswerable at population scale.',
|
||||||
|
role: 'Designed and built the full parsing pipeline: regular expressions handling standard patterns, with AI inference for complex or ambiguous directions. Maps drug-direction combinations to structured daily quantities, enabling duration calculations from prescription quantity data. Deployed into the production database as a reusable lookup.',
|
||||||
|
outcomes: [
|
||||||
|
'90% coverage achieved — 19.8M of 22M annual prescriptions parsed into structured daily quantities',
|
||||||
|
'Structured daily quantity data enabling prescription duration calculation at population scale',
|
||||||
|
'Foundation for adherence analysis and over/underprescribing detection — currently under investigation',
|
||||||
|
'Hybrid regex/AI approach handling both standard and complex direction formats',
|
||||||
|
],
|
||||||
|
period: '2024 – Present',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'algorithm',
|
id: 'algorithm',
|
||||||
value: '£2.6M',
|
value: '£2.6M',
|
||||||
label: 'Algorithm Savings',
|
label: 'Switching Algorithm',
|
||||||
sub: '14,000 patients in 3 days',
|
sub: 'Highest-opportunities identified, and clinically reviewed in 3 days',
|
||||||
colorVariant: 'teal',
|
colorVariant: 'teal',
|
||||||
explanation: 'Built a Python-based switching algorithm using real-world GP prescribing data to automatically identify patients on expensive drugs suitable for cost-effective alternatives, compressing months of manual analysis into 3 days.',
|
explanation: 'Python algorithm that ingests real-world GP prescribing data, cross-references clinical safety rules and cost-effectiveness thresholds, and automatically identifies the optimal set of patient switches — compressing months of manual analysis into 3 days.',
|
||||||
story: {
|
story: {
|
||||||
context: 'The annual medicines switching scheme previously required the optimisation team to spend months manually searching for opportunities across hundreds of thousands of prescriptions, identifying generic availability, price changes, and clinically appropriate alternatives one drug at a time.',
|
context: 'The annual medicines switching programme previously required months of manual work to identify clinically appropriate, cost-effective alternatives one drug at a time. Usually resulting in needing to switch 30-40k patients to meet savings targets',
|
||||||
role: 'Designed and built a Python algorithm ingesting real-world GP prescribing data, cross-referencing dm+d product information, clinical safety rules, and cost-effectiveness thresholds to automatically identify the optimal set of patient switches for maximum savings with minimum clinical intervention. Created the accompanying GP incentive payment system linking rewards to delivered savings.',
|
role: 'Designed and built the algorithm from scratch, integrating dm+d product data, clinical safety rules, and cost-effectiveness thresholds. Reimplemented in DAX as a self-serve Power BI tool for the wider medicines optimisation team.',
|
||||||
outcomes: [
|
outcomes: [
|
||||||
'14,000 patients identified for cost-effective switching in 3 days versus months manually',
|
'14,000 patients identified with medicines for cost-effective switching, with switches clinically reviewed and approved in 3 days vs months manually',
|
||||||
'£2.6M in annual savings identified, with £2M on target for delivery',
|
'£2.6M annual savings identified; £2M on target for delivery in-year',
|
||||||
'Novel GP payment system linking incentive rewards to actual savings delivered',
|
'Reimplemented in DAX as internal Power BI tool for team self-service',
|
||||||
'50% reduction in targeted prescribing within the first two months of deployment',
|
'Methodology reusable annually with updated prescribing data',
|
||||||
],
|
],
|
||||||
period: '2025',
|
period: '2025',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: 'population',
|
|
||||||
value: '1.2M',
|
|
||||||
label: 'Population Served',
|
|
||||||
sub: 'Norfolk & Waveney ICS',
|
|
||||||
colorVariant: 'teal',
|
|
||||||
explanation: 'Leading population health analytics and data-driven medicines optimisation for Norfolk & Waveney Integrated Care System, serving 1.2 million people across the region.',
|
|
||||||
story: {
|
|
||||||
context: 'Norfolk & Waveney Integrated Care System serves a population of 1.2 million people across Norfolk and parts of Suffolk, coordinating health and care services across primary care, secondary care, community services, and mental health provision.',
|
|
||||||
role: 'Lead population health analytics for the medicines optimisation function, developing patient-level datasets and analytical frameworks from real-world GP prescribing data to identify efficiency opportunities and address health inequalities across the integrated care system.',
|
|
||||||
outcomes: [
|
|
||||||
'Transformed analytics from practice-level data to patient-level SQL analysis',
|
|
||||||
'Built comprehensive dm+d medicines data table: standardised strengths, morphine equivalents, Anticholinergic Burden scoring',
|
|
||||||
'Developed population-scale controlled drug monitoring system tracking patient-level opioid exposure',
|
|
||||||
'Created self-serve Power BI tools improving data fluency across the wider team',
|
|
||||||
],
|
|
||||||
period: 'Jul 2024 – Present',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
]
|
||||||
@@ -24,7 +24,7 @@ Led population health initiatives and data-driven medicines optimisation, report
|
|||||||
### [exp-deputy-head-2024] Deputy Head, Population Health & Data Analysis
|
### [exp-deputy-head-2024] Deputy Head, Population Health & Data Analysis
|
||||||
NHS Norfolk & Waveney ICB | Jul 2024 to Present (substantive role)
|
NHS Norfolk & Waveney ICB | Jul 2024 to Present (substantive role)
|
||||||
Driving data analytics strategy for medicines optimisation, developing bespoke datasets and analytical frameworks from messy, real-world GP prescribing data to identify efficiency opportunities and address health inequalities across the integrated care system.
|
Driving data analytics strategy for medicines optimisation, developing bespoke datasets and analytical frameworks from messy, real-world GP prescribing data to identify efficiency opportunities and address health inequalities across the integrated care system.
|
||||||
- Managed £220M prescribing budget with sophisticated forecasting models identifying cost pressures and enabling proactive financial planning for ICB board reporting
|
- Managed £215M prescribing budget with sophisticated forecasting models identifying cost pressures and enabling proactive financial planning for ICB board reporting
|
||||||
- Collaborated with the ICB data engineering team to create a comprehensive dm+d medicines data table integrating all Dictionary of Medicines and Devices products with standardised strength calculations, oral morphine equivalent conversions, and Anticholinergic Burden scoring, providing a single source of truth for all medicines analytics
|
- Collaborated with the ICB data engineering team to create a comprehensive dm+d medicines data table integrating all Dictionary of Medicines and Devices products with standardised strength calculations, oral morphine equivalent conversions, and Anticholinergic Burden scoring, providing a single source of truth for all medicines analytics
|
||||||
- Led financial scenario modelling for a system-wide DOAC switching programme, building an interactive Power BI dashboard incorporating rebate mechanics, clinician switching capacity, workforce constraints, and patent expiry timelines to quantify risk trade-offs for senior decision-makers
|
- Led financial scenario modelling for a system-wide DOAC switching programme, building an interactive Power BI dashboard incorporating rebate mechanics, clinician switching capacity, workforce constraints, and patent expiry timelines to quantify risk trade-offs for senior decision-makers
|
||||||
- Renegotiated pharmaceutical rebate terms ahead of patent expiry, securing improved commercial position for the ICB
|
- Renegotiated pharmaceutical rebate terms ahead of patent expiry, securing improved commercial position for the ICB
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ export const profileContent: DeepReadonly<ProfileContent> = {
|
|||||||
kpiId: 'savings',
|
kpiId: 'savings',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '£220M Budget Oversight',
|
title: '£215M Budget Oversight',
|
||||||
subtitle: 'Prescribing budget with forecasting models',
|
subtitle: 'Prescribing budget with forecasting models',
|
||||||
keywords: '220m budget oversight analytical accountability icb board financial planning forecasting prescribing expenditure',
|
keywords: '220m budget oversight analytical accountability icb board financial planning forecasting prescribing expenditure',
|
||||||
kpiId: 'budget',
|
kpiId: 'budget',
|
||||||
|
|||||||
+1
-1
@@ -227,7 +227,7 @@ export const skills: SkillMedication[] = [
|
|||||||
status: 'Active',
|
status: 'Active',
|
||||||
icon: 'Banknote',
|
icon: 'Banknote',
|
||||||
prescribingHistory: [
|
prescribingHistory: [
|
||||||
{ year: 2024, description: 'Started: £220M prescribing budget oversight' },
|
{ year: 2024, description: 'Started: £215M prescribing budget oversight' },
|
||||||
{ year: 2024, description: 'Increased: Forecasting model development' },
|
{ year: 2024, description: 'Increased: Forecasting model development' },
|
||||||
{ year: 2025, description: 'Current: Proactive financial planning, pressure identification' },
|
{ year: 2025, description: 'Current: Proactive financial planning, pressure identification' },
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ const timelineEntitySeeds: TimelineEntity[] = [
|
|||||||
band: '8b',
|
band: '8b',
|
||||||
description: 'Driving data analytics strategy for medicines optimisation, developing bespoke datasets and analytical frameworks from messy, real-world GP prescribing data to identify efficiency opportunities and address health inequalities across the integrated care system.',
|
description: 'Driving data analytics strategy for medicines optimisation, developing bespoke datasets and analytical frameworks from messy, real-world GP prescribing data to identify efficiency opportunities and address health inequalities across the integrated care system.',
|
||||||
details: [
|
details: [
|
||||||
'Managed £220M prescribing budget with sophisticated forecasting models identifying cost pressures and enabling proactive financial planning for ICB board reporting',
|
'Managed £215M prescribing budget with sophisticated forecasting models identifying cost pressures and enabling proactive financial planning for ICB board reporting',
|
||||||
'Collaborated with ICB data engineering to create a comprehensive dm+d medicines data table: standardised strength calculations, oral morphine equivalent conversions, and Anticholinergic Burden scoring, providing a single source of truth for all medicines analytics',
|
'Collaborated with ICB data engineering to create a comprehensive dm+d medicines data table: standardised strength calculations, oral morphine equivalent conversions, and Anticholinergic Burden scoring, providing a single source of truth for all medicines analytics',
|
||||||
'Led financial scenario modelling for a system-wide DOAC switching programme, building an interactive Power BI dashboard incorporating rebate mechanics, clinician switching capacity, workforce constraints, and patent expiry timelines',
|
'Led financial scenario modelling for a system-wide DOAC switching programme, building an interactive Power BI dashboard incorporating rebate mechanics, clinician switching capacity, workforce constraints, and patent expiry timelines',
|
||||||
'Renegotiated pharmaceutical rebate terms ahead of patent expiry, securing improved commercial position for the ICB',
|
'Renegotiated pharmaceutical rebate terms ahead of patent expiry, securing improved commercial position for the ICB',
|
||||||
@@ -105,7 +105,7 @@ const timelineEntitySeeds: TimelineEntity[] = [
|
|||||||
'Team data fluency improved through training, documentation, and self-serve Power BI tools',
|
'Team data fluency improved through training, documentation, and self-serve Power BI tools',
|
||||||
],
|
],
|
||||||
codedEntries: [
|
codedEntries: [
|
||||||
{ code: 'BUD001', description: 'Budget management: £220M prescribing oversight' },
|
{ code: 'BUD001', description: 'Budget management: £215M prescribing oversight' },
|
||||||
{ code: 'DAT001', description: 'Data infrastructure: dm+d integration, single source of truth' },
|
{ code: 'DAT001', description: 'Data infrastructure: dm+d integration, single source of truth' },
|
||||||
{ code: 'MOD001', description: 'Financial modelling: DOAC switching, rebate negotiation' },
|
{ code: 'MOD001', description: 'Financial modelling: DOAC switching, rebate negotiation' },
|
||||||
{ code: 'MON001', description: 'CD monitoring: population-scale OME tracking' },
|
{ code: 'MON001', description: 'CD monitoring: population-scale OME tracking' },
|
||||||
|
|||||||
+2
-2
@@ -212,7 +212,7 @@ export function buildEmbeddingTexts(): Array<{ id: string; text: string }> {
|
|||||||
'data-analysis': 'Applied across NHS medicines optimisation, identifying £14.6M efficiency programme. Used for prescribing pattern analysis, budget forecasting, and population health analytics serving 1.2M people.',
|
'data-analysis': 'Applied across NHS medicines optimisation, identifying £14.6M efficiency programme. Used for prescribing pattern analysis, budget forecasting, and population health analytics serving 1.2M people.',
|
||||||
'python': 'Used to build switching algorithms (14,000 patients, £2.6M savings), controlled drug monitoring systems, Blueteq form automation, and Sankey chart visualisation tools. Self-taught.',
|
'python': 'Used to build switching algorithms (14,000 patients, £2.6M savings), controlled drug monitoring systems, Blueteq form automation, and Sankey chart visualisation tools. Self-taught.',
|
||||||
'sql': 'Core tool for patient-level analytics, dm+d data integration, and transforming practice-level data to patient-level SQL analysis. Used across all NHS data roles.',
|
'sql': 'Core tool for patient-level analytics, dm+d data integration, and transforming practice-level data to patient-level SQL analysis. Used across all NHS data roles.',
|
||||||
'power-bi': 'Built PharMetrics interactive dashboard tracking £220M prescribing budget. Created dashboards used by 200+ clinicians and commissioners across Norfolk & Waveney ICB.',
|
'power-bi': 'Built PharMetrics interactive dashboard tracking £215M prescribing budget. Created dashboards used by 200+ clinicians and commissioners across Norfolk & Waveney ICB.',
|
||||||
'javascript-typescript': 'Used for web development including this portfolio website. Built with React, TypeScript, and Vite.',
|
'javascript-typescript': 'Used for web development including this portfolio website. Built with React, TypeScript, and Vite.',
|
||||||
'excel': 'Used for financial modelling, data validation, and ad-hoc analysis. Foundational tool across all roles from community pharmacy to NHS ICB.',
|
'excel': 'Used for financial modelling, data validation, and ad-hoc analysis. Foundational tool across all roles from community pharmacy to NHS ICB.',
|
||||||
'algorithm-design': 'Designed patient switching algorithm and automated incentive scheme analysis. Applied to real-world GP prescribing data at population scale.',
|
'algorithm-design': 'Designed patient switching algorithm and automated incentive scheme analysis. Applied to real-world GP prescribing data at population scale.',
|
||||||
@@ -223,7 +223,7 @@ export function buildEmbeddingTexts(): Array<{ id: string; text: string }> {
|
|||||||
'health-economics': 'Financial modelling for DOAC switching programmes, tirzepatide commissioning, and pharmaceutical rebate negotiations.',
|
'health-economics': 'Financial modelling for DOAC switching programmes, tirzepatide commissioning, and pharmaceutical rebate negotiations.',
|
||||||
'clinical-pathways': 'Wrote most of the Norfolk & Waveney ICB high-cost drug pathways. Created Sankey chart tool for patient pathway visualisation and trust compliance auditing.',
|
'clinical-pathways': 'Wrote most of the Norfolk & Waveney ICB high-cost drug pathways. Created Sankey chart tool for patient pathway visualisation and trust compliance auditing.',
|
||||||
'controlled-drugs': 'Built Python-based population-scale monitoring system calculating oral morphine equivalents (OME) across all opioid prescriptions. Enables high-risk patient identification and potential diversion detection.',
|
'controlled-drugs': 'Built Python-based population-scale monitoring system calculating oral morphine equivalents (OME) across all opioid prescriptions. Enables high-risk patient identification and potential diversion detection.',
|
||||||
'budget-management': 'Managed £220M NHS prescribing budget with sophisticated forecasting models, variance analysis, and monthly financial reporting to the ICB executive team.',
|
'budget-management': 'Managed £215M NHS prescribing budget with sophisticated forecasting models, variance analysis, and monthly financial reporting to the ICB executive team.',
|
||||||
'stakeholder-engagement': 'Presented to Chief Medical Officer bimonthly. Engaged with GP practices, trusts, commissioners, and pharmaceutical companies across the integrated care system.',
|
'stakeholder-engagement': 'Presented to Chief Medical Officer bimonthly. Engaged with GP practices, trusts, commissioners, and pharmaceutical companies across the integrated care system.',
|
||||||
'pharma-negotiation': 'Renegotiated pharmaceutical rebate terms ahead of patent expiry, securing improved commercial position for the ICB.',
|
'pharma-negotiation': 'Renegotiated pharmaceutical rebate terms ahead of patent expiry, securing improved commercial position for the ICB.',
|
||||||
'team-development': 'Improved team data fluency through training and documentation. Supervised staff through NVQ3 to pharmacy technician registration. Created national induction training at Tesco.',
|
'team-development': 'Improved team data fluency through training and documentation. Supervised staff through NVQ3 to pharmacy technician registration. Created national induction training at Tesco.',
|
||||||
|
|||||||
Reference in New Issue
Block a user