Dados da Medicare

Como consultar conjuntos de dados públicos usando o BigQuery

O BigQuery é uma plataforma de análise e armazenamento de dados totalmente gerenciada. Os conjuntos de dados públicos estão disponíveis para serem analisados usando consultas SQL. Para acessar conjuntos de dados públicos do BigQuery, basta usar a IU da Web, a ferramenta de linha de comando ou fazer chamadas para a REST API do BigQuery usando várias bibliotecas de cliente, como Java, .NET ou Python.

Atualmente, os conjuntos de dados públicos do BigQuery são armazenados no local multirregional US. Ao consultar um conjunto de dados público, forneça a sinalização --location=US na linha de comando, escolha US como o local de processamento na IU da Web do BigQuery ou especifique a propriedade location na seção jobReference do recurso do job quando usar a API. Como os conjuntos de dados públicos são armazenados nos EUA, não é possível gravar resultados da consulta de dados pública em uma tabela em outra região ou unir tabelas em conjuntos de dados públicos a tabelas em outra região.

Para começar a usar um conjunto de dados públicos do BigQuery, crie ou selecione um projeto. O primeiro terabyte de dados processados por mês é gratuito. Assim, você pode começar a consultar conjuntos de dados públicos sem ativar o faturamento. Para usar além da quantia gratuita, você precisa ativar o faturamento.

  1. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. Selecione ou crie um projeto do GCP.

    Acessar a página Gerenciar recursos

  3. Verifique se o faturamento foi ativado para o projeto.

    Saiba como ativar o faturamento

  4. O BigQuery é ativado automaticamente em novos projetos. Para ativar o BigQuery em um projeto já existente, Ativar BigQuery API.

    Ativar a a API

Visão geral do conjunto de dados

Este conjunto de dados público foi criado pelos centros de serviços da Medicare e Medicaid dos Estados Unidos. Esses dados resumem a utilização e os pagamentos feitos em procedimentos, serviços e remédios fornecidos sob prescrição para beneficiários da Medicare por hospitais específicos para pacientes internados e ambulatoriais, médicos e outros fornecedores. O conjunto de dados inclui os seguintes dados.

  • serviços comuns para pacientes internados e ambulatoriais
  • todos os procedimentos e serviços de médicos e outros fornecedores
  • todas as prescrições da Parte D

Os provedores determinam o que cobrarão pelos itens, serviços e procedimentos fornecidos aos pacientes, e esses encargos são o valor que os provedores cobram por um item, serviço ou procedimento.

Comece explorando esses dados no console do BigQuery:

Acessar o conjunto de dados da Medicare

Consultas de exemplo

Aqui estão alguns exemplos de consultas SQL que você pode executar nesses dados no BigQuery.

Essas amostras usam a compatibilidade do BigQuery com o SQL padrão. Use a tag #standardSQL para informar ao BigQuery que você quer usar o SQL padrão. Para mais informações sobre o prefixo #standardSQL, consulte Como configurar um prefixo de consulta.

Qual é o número total de medicamentos prescritos em cada estado?

A consulta a seguir calcula o número total de solicitações feitas em cada estado. A contagem de solicitações totais para os cinco principais estados é mostrada na tabela de saída.

IU da Web

Abrir a consulta a seguir na IU da Web

#standardSQL
SELECT
  nppes_provider_state AS state,
  ROUND(SUM(total_claim_count) / 1e6) AS total_claim_count_millions
FROM
  `bigquery-public-data.medicare.part_d_prescriber_2014`
GROUP BY
  state
ORDER BY
  total_claim_count_millions DESC
LIMIT
  5;

Linha de comando

bq query --use_legacy_sql=false '
SELECT
  nppes_provider_state AS state,
  ROUND(SUM(total_claim_count) / 1e6) AS total_claim_count_millions
FROM
  `bigquery-public-data.medicare.part_d_prescriber_2014`
GROUP BY
  state
ORDER BY
  total_claim_count_millions DESC
LIMIT
  5;'

Veja os resultados abaixo:

+-------+----------------------------+
| state | total_claim_count_millions |
+-------+----------------------------+
|  CA   | 116.0                      |
|  FL   | 91.0                       |
|  NY   | 80.0                       |
|  TX   | 76.0                       |
|  PA   | 63.0                       |
+-------+----------------------------+

Qual é a medicação mais prescrita em cada estado?

Esta consulta baseia-se na consulta anterior para encontrar a medicação com a maior contagem de solicitações para cada estado.

IU da Web

Abrir a consulta a seguir na IU da Web

#standardSQL
SELECT
  A.state,
  drug_name,
  total_claim_count,
  day_supply,
  ROUND(total_cost_millions) AS total_cost_millions
FROM (
  SELECT
    generic_name AS drug_name,
    nppes_provider_state AS state,
    ROUND(SUM(total_claim_count)) AS total_claim_count,
    ROUND(SUM(total_day_supply)) AS day_supply,
    ROUND(SUM(total_drug_cost)) / 1e6 AS total_cost_millions
  FROM
    `bigquery-public-data.medicare.part_d_prescriber_2014`
  GROUP BY
    state,
    drug_name) A
INNER JOIN (
  SELECT
    state,
    MAX(total_claim_count) AS max_total_claim_count
  FROM (
    SELECT
      nppes_provider_state AS state,
      ROUND(SUM(total_claim_count)) AS total_claim_count
    FROM
      `bigquery-public-data.medicare.part_d_prescriber_2014`
    GROUP BY
      state,
      generic_name)
  GROUP BY
    state) B
ON
  A.state = B.state
  AND A.total_claim_count = B.max_total_claim_count
ORDER BY
  A.total_claim_count DESC
LIMIT
  5;

Linha de comando

bq query --use_legacy_sql=false '
SELECT
  A.state,
  drug_name,
  total_claim_count,
  day_supply,
  ROUND(total_cost_millions) AS total_cost_millions
FROM (
  SELECT
    generic_name AS drug_name,
    nppes_provider_state AS state,
    ROUND(SUM(total_claim_count)) AS total_claim_count,
    ROUND(SUM(total_day_supply)) AS day_supply,
    ROUND(SUM(total_drug_cost)) / 1e6 AS total_cost_millions
  FROM
    `bigquery-public-data.medicare.part_d_prescriber_2014`
  GROUP BY
    state,
    drug_name) A
INNER JOIN (
  SELECT
    state,
    MAX(total_claim_count) AS max_total_claim_count
  FROM (
    SELECT
      nppes_provider_state AS state,
      ROUND(SUM(total_claim_count)) AS total_claim_count
    FROM
      `bigquery-public-data.medicare.part_d_prescriber_2014`
    GROUP BY
      state,
      generic_name)
  GROUP BY
    state) B
ON
  A.state = B.state
  AND A.total_claim_count = B.max_total_claim_count
ORDER BY
  A.total_claim_count DESC
LIMIT
  5;'

Os cinco principais estados são mostrados na saída, juntamente com o nome da medicação, o custo total e a contagem total de solicitações.

+-------+---------------------------+-------------------+--------------+---------------------+
| state |         drug_name         | total_claim_count |  day_supply  | total_cost_millions |
+-------+---------------------------+-------------------+--------------+---------------------+
| CA    | LEVOTHYROXINE SODIUM      |         3845087.0 |  2.1174738E8 |                78.0 |
| FL    | LEVOTHYROXINE SODIUM      |         2982612.0 |  1.6338837E8 |                64.0 |
| TX    | HYDROCODONE/ACETAMINOPHEN |         2834059.0 |  6.0410516E7 |                63.0 |
| NY    | AMLODIPINE BESYLATE       |         2609896.0 | 1.23226481E8 |                21.0 |
| PA    | LEVOTHYROXINE SODIUM      |         2353845.0 | 1.09168537E8 |                44.0 |
+-------+---------------------------+-------------------+--------------+---------------------+

Amostragem aleatória estratificada do conjunto de dados

A consulta a seguir demonstra como você pode estratificar um conjunto de dados e retirar uma amostra aleatória de cada estrato. Nesse caso, o produto cruzado de provider_state e provider_city define a lista dos estratos. Atribuímos um número de ordem RANK() por estratos depois de ordenar por um número aleatório. Você pode especificar o número de amostras por estrato por meio da edição do filtro: WHERE samples_per_strata <= 10.

IU da Web

Abrir a consulta a seguir na IU da Web

#standardSQL
SELECT
  *
FROM (
  SELECT
    provider_state,
    provider_city,
    ROUND(average_covered_charges,2),
    ROUND(average_total_payments,2),
    ROUND(average_medicare_payments,2),
    RANK() OVER(PARTITION BY provider_state, provider_city ORDER BY random_number) AS samples_per_strata
  FROM (
    SELECT
      provider_state,
      provider_city,
      average_covered_charges,
      average_total_payments,
      average_medicare_payments,
      RAND() AS random_number
    FROM
     `bigquery-public-data.medicare.inpatient_charges_2014`) )
WHERE
  samples_per_strata <= 10
LIMIT
  5;

Linha de comando

bq query --use_legacy_sql=false '
SELECT
  *
FROM (
  SELECT
    provider_state,
    provider_city,
    ROUND(average_covered_charges,2),
    ROUND(average_total_payments,2),
    ROUND(average_medicare_payments,2),
    RANK() OVER(PARTITION BY provider_state, provider_city ORDER BY random_number) AS samples_per_strata
  FROM (
    SELECT
      provider_state,
      provider_city,
      average_covered_charges,
      average_total_payments,
      average_medicare_payments,
      RAND() AS random_number
    FROM
     `bigquery-public-data.medicare.inpatient_charges_2014`) )
WHERE
  samples_per_strata <= 10
LIMIT
  5;'

Veja os resultados abaixo:

+----------------+---------------+-----------+----------+----------+--------------------+
| provider_state | provider_city |    f0_    |   f1_    |   f2_    | samples_per_strata |
+----------------+---------------+-----------+----------+----------+--------------------+
| AL             | GADSDEN       | 100478.64 |  7359.86 |  6324.43 |                  3 |
| AL             | GADSDEN       |  57587.79 |  6003.93 |  5309.07 |                  1 |
| AL             | GADSDEN       |  47132.23 |   4039.9 |  2634.94 |                  5 |
| AL             | GADSDEN       |  55738.92 |  6098.92 |  5264.46 |                  2 |
| AL             | GADSDEN       |  582430.0 | 59699.62 | 58705.15 |                  4 |
+----------------+---------------+-----------+----------+----------+--------------------+

Qual é o custo médio de tratamento para pacientes internados e ambulatoriais em cada cidade e estado?

Para encontrar o custo médio de pacientes internados e ambulatoriais por provedor em cada cidade e estado em 2014, precisamos de duas tabelas: a tabela de pacientes internados em 2014 (inpatient_charges_2014) e a de pacientes ambulatoriais em 2014 (outpatient_charges_2014).

A consulta inclui as seguintes etapas.

  1. Agregue o custo em cada tabela por provider_id. Isso é feito ao fazer uma média ponderada dos custos de cada procedimento feito pelo provedor.

  2. Junte a provider_id, provider_city e provider_state.

  3. Ordene pelo custo médio combinado de procedimentos para pacientes internados e ambulatoriais.

IU da Web

Abrir a consulta a seguir na IU da Web

#standardSQL
SELECT
  OP.provider_state AS State,
  OP.provider_city AS City,
  OP.provider_id AS Provider_ID,
  ROUND(OP.average_OP_cost) AS Average_OP_Cost,
  ROUND(IP.average_IP_cost) AS Average_IP_Cost,
  ROUND(OP.average_OP_cost + IP.average_IP_cost) AS Combined_Average_Cost
FROM (
  SELECT
    provider_state,
    provider_city,
    provider_id,
    SUM(average_total_payments*outpatient_services)/SUM(outpatient_services) AS average_OP_cost
  FROM
    `bigquery-public-data.medicare.outpatient_charges_2014`
  GROUP BY
    provider_state,
    provider_city,
    provider_id ) AS OP
INNER JOIN (
  SELECT
    provider_state,
    provider_city,
    provider_id,
    SUM(average_medicare_payments*total_discharges)/SUM(total_discharges) AS average_IP_cost
  FROM
    `bigquery-public-data.medicare.inpatient_charges_2014`
  GROUP BY
    provider_state,
    provider_city,
    provider_id ) AS IP
ON
  OP.provider_id = IP.provider_id
  AND OP.provider_state = IP.provider_state
  AND OP.provider_city = IP.provider_city
ORDER BY
  combined_average_cost DESC
LIMIT
  10;

Linha de comando

bq query --use_legacy_sql=false '
SELECT
  OP.provider_state AS State,
  OP.provider_city AS City,
  OP.provider_id AS Provider_ID,
  ROUND(OP.average_OP_cost) AS Average_OP_Cost,
  ROUND(IP.average_IP_cost) AS Average_IP_Cost,
  ROUND(OP.average_OP_cost + IP.average_IP_cost) AS Combined_Average_Cost
FROM (
  SELECT
    provider_state,
    provider_city,
    provider_id,
    SUM(average_total_payments*outpatient_services)/SUM(outpatient_services) AS average_OP_cost
  FROM
    `bigquery-public-data.medicare.outpatient_charges_2014`
  GROUP BY
    provider_state,
    provider_city,
    provider_id ) AS OP
INNER JOIN (
  SELECT
    provider_state,
    provider_city,
    provider_id,
    SUM(average_medicare_payments*total_discharges)/SUM(total_discharges) AS average_IP_cost
  FROM
    `bigquery-public-data.medicare.inpatient_charges_2014`
  GROUP BY
    provider_state,
    provider_city,
    provider_id ) AS IP
ON
  OP.provider_id = IP.provider_id
  AND OP.provider_state = IP.provider_state
  AND OP.provider_city = IP.provider_city
ORDER BY
  combined_average_cost DESC
LIMIT
  10;'

Veja os resultados abaixo:

+-------+---------------+-------------+-----------------+-----------------+-----------------------+
| State |     City      | Provider_ID | Average_OP_Cost | Average_IP_Cost | Combined_Average_Cost |
+-------+---------------+-------------+-----------------+-----------------+-----------------------+
| IN    | MISHAWAKA     |      150177 |           399.0 |        102521.0 |              102920.0 |
| MI    | WARREN        |      230264 |           104.0 |         88620.0 |               88724.0 |
| TX    | HOUSTON       |      450674 |            88.0 |         67571.0 |               67659.0 |
| TX    | EL PASO       |      450877 |           230.0 |         45179.0 |               45409.0 |
| CO    | VAIL          |       60096 |           261.0 |         38651.0 |               38912.0 |
| TN    | MEMPHIS       |      440152 |            90.0 |         35698.0 |               35788.0 |
| LA    | BATON ROUGE   |      190128 |            87.0 |         34369.0 |               34456.0 |
| LA    | LEESVILLE     |      190297 |           560.0 |         32611.0 |               33172.0 |
| CA    | SAN FRANCISCO |       50454 |           157.0 |         32803.0 |               32959.0 |
| CA    | LOS ANGELES   |       50262 |           120.0 |         31795.0 |               31916.0 |
+-------+---------------+-------------+-----------------+-----------------+-----------------------+

Classificação das condições e comparação dos pagamentos médios por cidade

Nesta consulta, estamos tentando responder às seguintes perguntas:

  • Quais são as condições de diagnóstico de pacientes internados mais comuns nos Estados Unidos?

  • Quais cidades têm o maior número de casos para cada condição de diagnóstico?

  • Quais são os pagamentos médios dessas condições nessas cidades e como eles se comparam à média nacional?

IU da Web

Abrir a consulta a seguir na IU da Web

#standardSQL
SELECT
  drg_definition AS Diagnosis,
  provider_city AS City,
  provider_state AS State,
  cityrank AS City_Rank,
  CAST(ROUND(citywise_avg_total_payments) AS INT64) AS Citywise_Avg_Payments,
  CONCAT(CAST(ROUND(citywise_avg_total_payments /national_avg_total_payments * 100, 0) AS STRING), " %") AS Avg_Payments_City_vs_National
FROM (
  SELECT
    drg_definition,
    provider_city,
    provider_state,
    cityrank,
    national_num_cases,
    citywise_avg_total_payments,
    national_sum_total_payments,
    (national_sum_total_payments /national_num_cases) AS national_avg_total_payments
  FROM (
    SELECT
      drg_definition,
      provider_city,
      provider_state,
      citywise_avg_total_payments,
      RANK() OVER (PARTITION BY drg_definition ORDER BY citywise_num_cases DESC ) AS cityrank,
      SUM(citywise_num_cases) OVER (PARTITION BY drg_definition ) AS national_num_cases,
      SUM(citywise_sum_total_payments) OVER (PARTITION BY drg_definition ) AS national_sum_total_payments
    FROM (
      SELECT
        drg_definition,
        provider_city,
        provider_state,
        SUM(total_discharges) AS citywise_num_cases,
        SUM(average_total_payments * total_discharges)/ SUM(total_discharges) AS citywise_avg_total_payments,
        SUM(average_total_payments * total_discharges) AS citywise_sum_total_payments
      FROM
        `bigquery-public-data.medicare.inpatient_charges_2014`
      GROUP BY
        drg_definition,
        provider_city,
        provider_state))
  WHERE
    cityrank <=3)  # Limit to top 3 cities for each Diagnosis
ORDER BY
  national_num_cases DESC,
  cityrank
LIMIT
  9;  # Limit Results to the top 3 cities for the top 3 diagnosis

Linha de comando

bq query --use_legacy_sql=false '
SELECT
  drg_definition AS Diagnosis,
  provider_city AS City,
  provider_state AS State,
  cityrank AS City_Rank,
  CAST(ROUND(citywise_avg_total_payments) AS INT64) AS Citywise_Avg_Payments,
  CONCAT(CAST(ROUND(citywise_avg_total_payments /national_avg_total_payments * 100, 0) AS STRING), " %") AS Avg_Payments_City_vs_National
FROM (
  SELECT
    drg_definition,
    provider_city,
    provider_state,
    cityrank,
    national_num_cases,
    citywise_avg_total_payments,
    national_sum_total_payments,
    (national_sum_total_payments /national_num_cases) AS national_avg_total_payments
  FROM (
    SELECT
      drg_definition,
      provider_city,
      provider_state,
      citywise_avg_total_payments,
      RANK() OVER (PARTITION BY drg_definition ORDER BY citywise_num_cases DESC ) AS cityrank,
      SUM(citywise_num_cases) OVER (PARTITION BY drg_definition ) AS national_num_cases,
      SUM(citywise_sum_total_payments) OVER (PARTITION BY drg_definition ) AS national_sum_total_payments
    FROM (
      SELECT
        drg_definition,
        provider_city,
        provider_state,
        SUM(total_discharges) AS citywise_num_cases,
        SUM(average_total_payments * total_discharges)/ SUM(total_discharges) AS citywise_avg_total_payments,
        SUM(average_total_payments * total_discharges) AS citywise_sum_total_payments
      FROM
        `bigquery-public-data.medicare.inpatient_charges_2014`
      GROUP BY
        drg_definition,
        provider_city,
        provider_state))
  WHERE
    cityrank <=3)  # Limit to top 3 cities for each Diagnosis
ORDER BY
  national_num_cases DESC,
  cityrank
LIMIT # Limit Results to the top 3 cities for the top 3 diagnosis
  9;'

Estes são os resultados:

+--------------------------------------------------------------------------+-----------+-------+-----------+-----------------------+-------------------------------+
|                                Diagnosis                                 |   City    | State | City_Rank | Citywise_Avg_Payments | Avg_Payments_City_vs_National |
+--------------------------------------------------------------------------+-----------+-------+-----------+-----------------------+-------------------------------+
| 470 - MAJOR JOINT REPLACEMENT OR REATTACHMENT OF LOWER EXTREMITY W/O MCC | NEW YORK  | NY    |         1 |                 21656 | 144 %                         |
| 470 - MAJOR JOINT REPLACEMENT OR REATTACHMENT OF LOWER EXTREMITY W/O MCC | BOSTON    | MA    |         2 |                 18324 | 122 %                         |
| 470 - MAJOR JOINT REPLACEMENT OR REATTACHMENT OF LOWER EXTREMITY W/O MCC | BALTIMORE | MD    |         3 |                 23056 | 154 %                         |
| 871 - SEPTICEMIA OR SEVERE SEPSIS W/O MV 96+ HOURS W MCC                 | HOUSTON   | TX    |         1 |                 14592 | 106 %                         |
| 871 - SEPTICEMIA OR SEVERE SEPSIS W/O MV 96+ HOURS W MCC                 | CHICAGO   | IL    |         2 |                 16071 | 117 %                         |
| 871 - SEPTICEMIA OR SEVERE SEPSIS W/O MV 96+ HOURS W MCC                 | BROOKLYN  | NY    |         3 |                 23398 | 170 %                         |
| 291 - HEART FAILURE & SHOCK W MCC                                        | CHICAGO   | IL    |         1 |                 13287 | 122 %                         |
| 291 - HEART FAILURE & SHOCK W MCC                                        | HOUSTON   | TX    |         2 |                 12572 | 116 %                         |
| 291 - HEART FAILURE & SHOCK W MCC                                        | BALTIMORE | MD    |         3 |                 16992 | 157 %                         |
+--------------------------------------------------------------------------+-----------+-------+-----------+-----------------------+-------------------------------+

Sobre os dados

Origem do conjunto de dados: centros de serviços Medicare e Medicaid

Categoria: saúde

Uso: esse conjunto de dados está disponível ao público conforme os termos a seguir fornecidos pela origem do conjunto de dados (http://www.data.gov/privacy-policy#data_policy) e é concedido no formato original, sem garantia expressa ou implícita do Google. O Google isenta-se de qualquer responsabilidade por eventuais danos, diretos ou indiretos, decorrentes do uso do conjunto de dados.

Frequência de atualização: anual

Ver no BigQuery: acessar o conjunto de dados da Medicare

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.