CMS reimbursement forms a nexus between political, corporate, and economic influences. This intersection ultimately determines the prices of healthcare procedures for senior citizens, and, indirectly, for consumers in the private insurance market. There has been considerable attention paid to the notion of variability in pricing for procedures in CMS reimbursement. Recent news stories have highlighted differences in costs for identical procedures performed in both proximate and disparate geographic areas. In an effort to introduce transparency into CMS pricing and reimbursement strategies, and to shed light on variability in pricing and fraud, CMS recently released provider utilization and charges data and made an earnest call to developers to build data visualization applications that use the dataset.
In my free time I’ve been working on one such data visualization application. The application is built using basic front-end technology (JQuery and D3) and a MySQL database to store the provider charges and utilization data. My goal was to make it possible to dynamically query the underlying dataset and produce interesting, meaningful charts without having knowledge of SQL and databases. Users can select variables to filter the dataset by and can calculate a weighted average value for charges submitted to CMS, payments made by CMS, and the CMS allowed amount. These weighted average charges can be grouped by various values in order to produce bar charts for visualizing the CMS data.
Users can add filters, which presents a modal window that allows users to select filters from the available underlying variables. Selected filters are highlighted and can be removed by unselecting them. The list is regenerated as variables are selected so that the application is responsive to the user’s actions.
Users can remove filters either from the filters modal or by removing them from the filter control section to the right of the chart. Once the user has selected an appropriate set of filters that satisfies their interests, they can regenerate the chart and the chart will be dynamically built by querying a PHP service behind the scenes using Ajax.
For example, let’s say the user wants to view the average charges billed by the provider, average payment amounts, and average CMS allowed amounts for all procedures performed in California. Let’s also assume that they want to group the results by provider type. This will produce a fairly large chart, with one bar for each provider type.
This provides some fairly immediate observations about the underlying data. For example, the highest submitted charges are coming from ambulatory surgical centers. This is hardly surprising as surgeries would undoubtedly be more expensive than routine procedures (such as routine evaluation and management or laboratory tests).
The user can also change the group by variable, allowing them to view the averages calculated over different buckets or subsets of the data. For example, the user might want to remove all filters and change the grouping variable to “state” in order to simply view the average charges, average payment, and average CMS allowed amounts by state.
By clicking “Regenerate Chart” the data is fetched using the new criteria and the chart is rebuilt. In this case we will have one bar per state and will be able to easily view the differences in total average charges and reimbursement across all CPT codes and procedures performed within the state.
If you look closely you may see some funny states (what the heck is ZZ??) but it turns out that these are just special classifications for additional procedures performed in areas that are covered but are not one of the standard 50 states. For example, the documentation for the provider utilization and charges file says the following:
‘XX’ = ‘Unknown’
‘AA’ = ‘Armed Forces Central/South America’
‘AE’ = ‘Armed Forces Europe’
‘AP’ = ‘Armed Forces Pacific’
‘AS’ = ‘American Samoa’
‘GU’ = ‘Guam’
‘MP’ = ‘North Mariana Islands’
‘PR’ = ‘Puerto Rico’
‘VI’ = ‘Virgin Islands’
‘ZZ’ = ‘Foreign Country’
While this chart doesn’t tell us much on its own, there are a few interesting nuggets that could be explored further. For example, the average payment amount is considerable higher in the ‘XX’ bucket, which is an ‘Unknown’ state. Why would this be? Could this potentially be a signal that there is some fraud occurring in charges submitted from ‘Unknown’ states?
It’s also interesting to note that the average submitted charges are so much higher for the ‘Armed Forces Europe’, ‘Armed Forces Pacific’, and ‘Foreign Country’ categories. Finally, this chart displays regional differences in CMS reimbursement, which is based on a variety of factors that are geographically dependent, including wages.
Finally, to illustrate another use, let’s filter the dataset down to include only chiropractors. Let’s not apply any other filters to the dataset and instead let’s group by HCPCS code.
This chart makes one thing very obvious. Chiropractors are charging and being paid much more for the procedure with HCPCS code 99205. Let’s list out what some of these procedures are:
99203: New patient visit with detailed history and exam, low degree of medical decision making, presenting with a moderately sever problem
99205: New patient visit with comprehensive history and exam, high degree of medical decision making, presenting with a moderate to highly severe problem
Notice the conspicuous absence of 99202 and 99204 codes. While 99202 is similar to 99203, it indicates less effort on the part of the physician, and therefore likely translates to lower reimbursement. The case is similar for 99204.
99202: New patient visit with an expanded, problem-focused history and exam, straightforward degree of medical decision making, presenting with a low-to-moderate problem.
99204: New patient visit with a comprehensive history and exam, moderate degree of medical decision making, presenting with a moderate to high severity problem
While this may be perfectly plausible, it could also be a sign of “upcoding,” when billing specialists assign a more valuable code to a procedure that was performed even though the procedure actually is more accurately captured by a lower-value code. While this chart is in no way proof or evidence of that fact, it could possibly be an indicator that this is occurring, and could be explored further. If the chart were to indicate the presence of upcoding, this would be an example of how data visualization can help CMS accomplish their goals of identifying fraud and abuse.