跳转至
For the complete DHIS2 documentation index, see llms.txt.

分析

分析模块提供某种本地分析数据,即基于存储在设备中的数据的一些分析值。目前,没有与服务器分析集成,尽管它们共享基本概念,如可视化、相对周期、相对 orgunits 等。

聚合分析

它们以聚合方式显示分析值。值可能来自聚合数据或跟踪器数据。如果您熟悉 Web 分析工具,则此模块与数据可视化工具(表格、图表等)非常相似。

原始分析

此模块遵循与 Web API 中的分析端点类似的概念。它们是必须提供给分析引擎以执行评估的两个基本参数:维度和过滤器。

例如,获取过去 3 个月 (RelativePeriod) 中“ANC 第一次访问”(数据元素“fbfJHSPpUQD”)的数量并由组织单位“Ngelehun CHC”(绝对组织单位“DiszpKrYNg8”)过滤的基本查询就像这:

d2.analyticsModule().analytics()
        .withDimension(new DimensionItem.DataItem.DataElementItem("fbfJHSPpUQD"))
        .withDimension DimensionItem.PeriodItem.RelativeRelativePeriod.LAST_3_MONTHS))
        .withFilter(new DimensionItem.OrganisationUnitItem.Absolute("DiszpKrYNg8"))
        评价();

引擎将返回一个包含DimensionalResponseAnalyticsExceptionResult对象。让我们看一下DimensionalResponse的结构。为方便起见,我们使用 Kotlin 表示,但 Java 表示非常相似:

``kt DimensionalResponse( metadata = mapOf( "fbfJHSPpUQD" to MetadataItem.DataElementItem、 "DiszpKrYNg8" 到 MetadataItem.OrganisationUnitItem、 将 "202108 "转至 MetadataItem.PeriodItem、 "202109" 转至 MetadataItem.PeriodItem、 将 "202110 "更改为 MetadataItem.PeriodItem。 ), dimensions = listOf( 维度.数据.周期 维度.周期 ), dimensionItems = mapOf( Dimension.Data to listOf( DimensionItem.DataItem.DataElementItem(uid=fbfJHSPpUQD) ), Dimension.Period 至 listOf( DimensionItem.PeriodItem.Relative(relative=RelativePeriod.LAST_3_MONTHS) ), Dimension.OrganisationUnit 改为 listOf( DimensionItem.OrganisationUnitItem.Absolute(uid=DiszpKrYNg8) ) ), filters = listOf( "DiszpKrYNg8" ), 值 = listOf( DimensionalValue( dimensions = listOf("fbfJHSPpUQD", "202108")、 值 = "17" ) ), DimensionalValue( dimensions = listOf("fbfJHSPpUQD", "202109")、 值 = "112" ) ), DimensionalValue( dimensions = listOf("fbfJHSPpUQD", "202110")、 值 = "20" ) ) ) )

`DimensionalResponse` 对象中包含的属性:

- **元数据**:它包含 ID 到`MetadataItem`的映射。 id 是标识数据元素、句点(相对或绝对)、orgunits 等的字符串。id 的一些示例是“fbfJHSPpUQD”、“202108”、“LAST_3_MONTHS”、“USER_ORGUNIT”、...。此映射的目的是从其他属性(dimensionItems、过滤器或值)中使用的任何 id 快速获取可打印表示。 `MetadataItem` 接口包含两个基本属性,`id` 和 `displayName`,它可以很容易地与底层类匹配,以获取有关 DataElement、Indicator、Period 等的更多信息。
- **维度**:维度的有序列表,其中的值被分解。在上面的示例中,第一个维度是 `Data`,这意味着 values 中的 `dimensions` 属性中的第一个维度属于 `Data` 维度。第二个是时期。
- **DimensionItems**:它包含按维度类型分组的项目映射。它包含最初用于构建查询的项目:在上面的示例中,时间段是相对的,因此 Period 维度包括相对时间段`LAST_3_MONTHS`。
- **过滤器**:在查询中充当过滤器的 ID 列表。
- **值**:`维度值`列表。每个值都包含定义该值的有序 ID 列表。在上面的示例中,值“17”对应于“ANC 第一次访问”(“fbfJHSPpUQD”)和“2021 年 8 月”(“202108”)。您可以使用元数据映射从这些 ID 中获取更多信息。

DimensionItems 可以用作维度或过滤器。同一维度的多个项目可以组合在同一个查询中。例如,此查询获取“ANC 第一次访问”(数据元素“fbfJHSPpUQD”)和“ANC 1-3 辍学率”(指标“ReUHfIn0pTQ”)按类别“位置:固定/外展”(类别“fMZEcRHuamy”)分解使用UserOrganisationUnit(相对组织单位)中最近 3 个月(相对期间)内的选项“固定”(CategoryOption“qkPbeWaFsnU”)和“外展”(CategoryOption“wbrDrL2aYEc”),按数据项 legendSet 对值进行分类并覆盖聚合类型:

```java
d2.analyticsModule().analytics()
        .withDimension(new DimensionItem.DataItem.DataElementItem("fbfJHSPpUQD"))
        .withDimension(new DimensionItem.DataItem.IndicatorItem("ReUHfIn0pTQ"))
        .withDimension(new DimensionItem.CategoryItem("fMZEcRHuamy", "qkPbeWaFsnU"))
        .withDimension(new DimensionItem.CategoryItem("fMZEcRHuamy", "wbrDrL2aYEc"))

        .withFilter(新 DimensionItem.PeriodItem.Relative(RelativePeriod.LAST_3_MONTHS))
        .withFilter(new DimensionItem.OrganisationUnitItem.Relative(RelativeOrganisationUnit.USER_ORGUNIT))

        .withLegendStrategy(AnalyticsLegendStrategy.ByDataItem.INSTANCE)

        .withAggregationType(AggregationType.LAST)

        。评价();

评估器对作为维度或过滤器传递的参数施加了一些限制(它们类似于 analytics web api 施加的参数):

  1. 至少必须包含一个维度项作为维度属性。
  2. 必须至少包含一个 data 维度项作为维度或过滤器。

此外,查询是根据本地元数据和数据进行评估的,这会施加额外的限制:

  1. DimensionItems(DataElement、Indicator、OrganisationUnit,...)必须下载到设备中。默认情况下,SDK 下载用户可访问的所有数据集和程序以及相关的元数据。
  2. 数据必须下载到设备中。评估仅考虑存储在本地数据库中的数据。

可以通过三个选项来定义 legendSet 策略。 AnalyticsLegendStrategy 类在 Kotlin 中是一个密封类,因此在使用 Java 编码时必须在对象值的末尾附加关键字 INSTANCE。代码示例:

d2.analyticsModule().analytics()
        .withLegendStrategy(AnalyticsLegendStrategy.ByDataItem.INSTANCE) // 数据项使用自己的LegendSet
        .withLegendStrategy(AnalyticsLegendStrategy.None.INSTANCE) // 不使用 LegendSets
        .withLegendStrategy(new AnalyticsLegendStrategy.Fixed("fqs276KXCXi")) // 提供的 LegendSet 将用于所有数据项

可视化分析

可视化分析引擎提供了方便的方法来评估可视化对象。该引擎是在原始分析引擎之上实现的,它基本上实现了两个目标:

  1. 将可视化对象转换为对 Analtyics 引擎的查询。
  2. 返回可视化中定义的行、列和过滤器之后的格式化结果。

为了使用可视化对象,它们必须在 Android 设置 web 应用程序的“分析”部分进行设置。目前,无法从服务器下载按需可视化,只能通过 Android 设置 webapp 下载。

例如,假设我们有一个具有以下参数的可视化:

  • 可视化(“SwtkWZFhrFQ”)。
  • 列:
    • 数据:两个数据元素(ANC 第一次访问“fbfJHSPpUQD”,ANC 第二次访问“cYeuwXTCPkU”)。
    • 类别:位置固定/外展(“fMZEcRHuamy”)。
  • 行数:
    • 期间:LAST_3_MONTHS。
  • 筛选:
    • 组织单位:Badja(“YuQRtpLP10I”)。

可视化的预期表示将是这样的:

我们可以通过调用分析模块中的“可视化”存储库来获取可视化结果。或者,我们可以覆盖 Period 和 OrganisationUnit 的值。这对于在 UI 中公开过滤器以允许轻松修改结果很有用。

d2.analyticsModule().visualizations()
        .withVisualization("SwtkWZFhrFQ")
        [.withPeriods()]
        [.withOrganisationUnits()]
        评价();

该方法将返回具有两个可能值的结果GridAnalyticsResponseAnalyticsResponse。让我们看一下GridAnalyticsResponse的结构。为了方便起见,我们使用 Kotlin 表示:

GridAnalyticsResponse(
        metadata = mapOf(
            "fbfJHSPpUQD" to MetadataItem.DataElementItem、
            "cYeuwXTCPkU" to MetadataItem.DataElementItem、
            将 "fMZEcRHuamy "转至 MetadataItem.CategoryItem.DataElementItem
            将 "qkPbeWaFsnU "转至 MetadataItem.CategoryOptionItem、
            将 "wbrDrL2aYEc "改为 MetadataItem.CategoryOptionItem、
            将 "YuQRtpLP10I "更改为 MetadataItem.OrganisationUnitItem、
            将 "202108 "更改为 MetadataItem.PeriodItem、
            "202109" 转至 MetadataItem.PeriodItem、
            将 "202110 "更改为元数据项.周期项
        ),
        标题 = GridHeader(
            columns = listOf(
                listOf(
                    GridHeaderItem(id=fbfJHSPpUQD, weight=2)、
                    GridHeaderItem(id=cYeuwXTCPkU, weight=2)
                ),
                listOf(
                    GridHeaderItem(id=qkPbeWaFsnU, weight=1)、
                    GridHeaderItem(id=wbrDrL2aYEc, weight=1)、
                    GridHeaderItem(id=qkPbeWaFsnU, weight=1)、
                    GridHeaderItem(id=wbrDrL2aYEc, weight=1)
                )
            ),
            rows = listOf(
                listOf(
                    GridHeaderItem(id=202108, weight=1)、
                    GridHeaderItem(id=202109, weight=1)、
                    GridHeaderItem(id=202110, weight=1)
                )
            )
        ),
        dimensions = GridDimension(
            columns = listOf(
                Dimension.Data、
                Dimension.Category(uid=fMZEcRHuamy)
            ),
            行 = listOf(
                维度.周期
            )
        ),
        dimensionItems = mapOf(
            Dimension.Data to listOf(
                DimensionItem.DataItem.DataElementItem(uid=fbfJHSPpUQD)、
                DimensionItem.DataItem.DataElementItem(uid=cYeuwXTCPkU)
            ),
            Dimension.Period to listOf(
                DimensionItem.PeriodItem.Relative(relative=LAST_3_MONTHS)
            ),
            Dimension.Category(uid=fMZEcRHuamy) to listOf(
                DimensionItem.CategoryItem(uid=fMZEcRHuamy, categoryOption=qkPbeWaFsnU)、
                DimensionItem.CategoryItem(uid=fMZEcRHuamy, categoryOption=wbrDrL2aYEc)
            ),
            Dimension.OrganisationUnit 到 listOf(
                DimensionItem.OrganisationUnitItem.Absolute(uid=YuQRtpLP10I)
            )
        ),
        filters = listOf(
            "YuQRtpLP10I"
        ),
        值 = listOf(
            listOf(
                GridResponseValue(
                    columns=[fbfJHSPpUQD, qkPbeWaFsnU]、 
                    rows=[202108]、 
                    值=23
                ),
                GridesponseValue(
                    columns=[fbfJHSPpUQD, wbrDrL2aYEc]、 
                    rows=[202108]、 
                    value=3
                ),
                GridesponseValue(
                    columns=[cYeuwXTCPkU, qkPbeWaFsnU]、 
                    rows=[202108]、 
                    值=46
                ),
                GridesponseValue(
                    columns=[cYeuwXTCPkU, wbrDrL2aYEc]、 
                    rows=[202108]、 
                    值=3
                )
            ),
            listOf(
                GridesponseValue(
                    columns=[fbfJHSPpUQD, qkPbeWaFsnU]、 
                    rows=[202109]、 
                    值=21
                ),
                GridesponseValue(
                    columns=[fbfJHSPpUQD, wbrDrL2aYEc]、 
                    rows=[202109]、 
                    value=10
                ),
                GridesponseValue(
                    columns=[cYeuwXTCPkU, qkPbeWaFsnU]、 
                    rows=[202109]、 
                    值=23
                ),
                GridesponseValue(
                    columns=[cYeuwXTCPkU, wbrDrL2aYEc]、 
                    rows=[202109]、 
                    值=8
                )
            ),
            listOf(
                GridesponseValue(
                    columns=[fbfJHSPpUQD, qkPbeWaFsnU]、 
                    rows=[202110]、 
                    值=24
                ),
                GridesponseValue(
                    columns=[fbfJHSPpUQD, wbrDrL2aYEc]、 
                    rows=[202110]、 
                    value=1
                ),
                GridesponseValue(
                    columns=[cYeuwXTCPkU, qkPbeWaFsnU]、 
                    rows=[202110]、 
                    值=47
                ),
                GridesponseValue(
                    columns=[cYeuwXTCPkU, wbrDrL2aYEc]、 
                    rows=[202110]、 
                    值=2
                )
            )
        )
)

正如我们所看到的,GridDimensionalResponseDimensionalResponse 非常相似,带有关于可视化中定义的列和行的附加信息。

GridDimensionalResponse 对象中包含的属性:

  • 元数据:它具有与DimensionalResponse相同的格式并遵循目的。
  • 表头:它定义表中表头的结构。列/行中的每个条目代表一个维度。权重表示它适用于多少列/行。在示例中,列中的第一个维度 (dataElements) 的权重为 2,而第二个维度 (categoryOptions) 的权重为 1。查看表格很容易理解。
  • 维度:它与DimensionalResponse具有相同的目的,但维度按列和行分组。
  • DimensionItems:它具有与DimensionalResponse相同的格式并遵循目的。
  • 过滤器:它具有与DimensionalResponse相同的格式并遵循目的。
  • :它包括有关值表示的附加信息。 数组中的每个条目代表表中的一行。此条目是 GridResponseValue 的列表,代表表格中的一个单元格。每个“GridResponseValue”都包含有关该值所属的列和行的上下文信息。这种格式可以很容易地以表格格式打印结果,而无需进一步处理。

维度支持

尺寸 元件 支持
数据: 指标 是*
数据元素 是的
数据元素详细信息 是的
事件数据项 是的
计划指标 是**
数据集:报告率
数据集:按时报告率
数据集:实际报告
数据集:按时实际报告
数据集:预期报告
时期: 固定的 是的
相对的 是的
组织单位: 固定的 是的
相对的 是的
等级 是的
OU组 是的
其他: 类别(CategoryOptions) 是***
类别选项组集
组织单位组集

*详情请查看表格 Indicator support

**详情请查看 程序指示器支持 表格。

***在 ProgramIndicators 的情况下,它们只适用于 EVENT ProgramIndicators。

指标支持{ #android_sdk_analytics_indicator_support }

此表显示了与后端分析相比,指标维度项支持的功能。

类型 元件 后端 安卓开发工具包
数学: 插入语 是的 是的
加号 (+) 是的 是的
减 (-) 是的 是的
功率 (^) 是的
乘法 (*) 是的 是的
除法 (/) 是的 是的
模量 (%) 是的 是的
逻辑: 不是 是的 是的
是的 是的
是的 是的
&& 是的 是的
或者 是的 是的
|| 是的 是的
比较: 等于 (==) 是的 是的
不等于 (!=) 是的 是的
GT (>) 是的 是的
长 (<) 是的 是的
通用电气 (>=) 是的 是的
乐 (<=) 是的 是的
字数: 无效 是的 是的
职能: 第一非空 是的 是的
最伟大 是的 是的
如果 是的 是的
IsNotNull 是的 是的
IsNull 是的 是的
最少 是的 是的
日志 是的
对数10 是的
子表达式 是的
.聚合类型 是的 是的
.maxDate 是的 是的
.minDate 是的 是的
.periodOffset 是的 是的
.yearToDate 是的 是的
尺寸: 不变 是的 是的
数据元素 是的 是的
程序属性 是的 是的
程序数据元素 是的 是的
计划指示器 是的 是的
组织单位组 是的
报告率 是的
天数 是的 是的
年度期间 是的 是的
年度周期数 是的 是的
N_Brace (指标) 是的

计划指标支持{ #android_sdk_analytics_program_indicator_support }

本表显示了 ProgramIndicator 维度项与后台分析相比所支持的功能。

类型 元件 后台 安卓 SDK
数学: 括号 是的 是的
加号 (+) 是的 是的
减号 (-) 是的 是的
功率 (^) 是的
乘法 (*) 是的 是的
除法 (/) 是的 是的
模量 (%) 是的 是的
逻辑: 不是 是的 是的
! 是的 是的
是的 是的
&& 是的 是的
是的 是的
比较: 相等 (==) 是的 是的
NotEqual (!=) 是的 是的
GT (>) 是的 是的
LT (<) 是的 是的
通用电气 (>=) 是的 是的
LE (<=) 是的 是的
字数: 无效 是的 是的
职能: 第一非空 是的 是的
最伟大 是的 是的
如果 是的 是的
IsNotNull 是的 是的
IsNull 是的 是的
最少 是的 是的
日志 是的
对数10 是的
周期偏移 是的
包含 是的 是的
包含项目 是的 是的
D2功能: D2AddDays
D2Ceil
D2C 连接
D2Condition 是的 是的
D2Count 是的 是的
D2CountIfCondition 是的 是的
D2CountIfValue 是的 是的
D2DaysBetween 是的 是的
D2Floor
D2HasValue 是的 是的
D2Left
D2 长度
D2MaxValue 是的 是的
D2 分钟之间 是的 是的
D2MinValue 是的 是的
D2 模数
D2MonthsBetween 是的 是的
D2Oizp 是的 是的
D2RelationshipCount 是的 是的
D2Right
D2Round
D2Split
D2Substring
D2ValidatePattern
D2WeeksBetween 是的 是的
D2 年之间 是的 是的
D2Zing 是的 是的
D2Zpvc 是的 是的
D2 最后活动日期
D2 添加控制数字
D2CheckControlDigits
D2ZScoreWFA
D2ZScoreWFH
D2ZScoreHFA
D2 机构单位组
D2HasUserRole
汇总功能: 平均值 是的
计数 是的
最大 是的
分钟 是的
百分位数 是的
stddev 是的
stddevPop 是的
stddevSamp 是的
数额 是的
差异 是的
变量: 分析周期结束 是的 是的
分析周期开始 是的 是的
创建日期 是的 是的
当前日期 是的 是的
完成日期 是的 是的
到期日 是的 是的
入学人数 是的 是的
注册日期 是的 是的
注册状态 是的 是的
事件状态 是的 是的
事件计数 是的 是的
执行日期 是的 是的
活动日期 是的 是的
事件日期 是的 是的
单位计数 是的 是的
计划阶段 ID 是的 是的
节目阶段名称 是的 是的
同步日期 是的 是的
TeiCount 是的 是的
值计数 是的 是的
零位值计数 是的 是的
其他: 不变 是的 是的
节目阶段元素 是的 是的
程序属性 是的 是的
PS_EVENTDATE 是的 是的

聚合类型支持{ #android_sdk_analytics_aggregation_type_support }

类型 安卓 SDK
总计 是的
平均值 是的
机构单位平均总和 是的
最后 是的
最后平均机构单位 是的
LAST_IN_PERIOD 是的
上期平均机构单位 是的
最后一个机构单位 是的
第一 是的
第一平均机构单位 是的
第一机构单位 是的
COUNT 是的
STDDEV
差异
MIN 是的
最小机构单位总和 是的
最大 是的
max_sum_org_unit 是的
定制
默认值

跟踪线路列表{ #android_sdk_tracker_line_list }

这种分析类似于通过线路列表网络应用程序获得的分析。它允许生成事件或注册级别的行列表。这些行列表可能包括数据元素、属性、计划指标、变量,并可选择通过其列中的值过滤这些条目。

常见的用例是生成符合特定条件的事件或注册列表,如特定范围内的值,或特定状态,或特定日期范围。

例如,如果查询包含 "fbfJHSPpUQD "计划中属性 "p4mRWMtCxtB "值介于 40 和 50 之间的所有 "ACTIVE "注册信息,查询结果将如下所示。请注意,状态是作为过滤器包含的,因此没有明确的列。

d2.analyticsModule().trackerLineList()
            .withEnrollmentOutput("fbfJHSPpUQD")
            .withFilter(
                TrackerLineListItem.ProgramStatusItem(
                    filters = listOf(
                        EnumFilter.EqualTo(EnrollmentStatus.ACTIVE.name)
                    )
                )
            )
            .withColumn(TrackerLineListItem.OrganisationUnitItem())
            .withColumn(
                TrackerLineListItem.ProgramAttribute(
                    uid = "p4mRWMtCxtB"、
                    filters = listOf(
                        DataFilter.GreaterThan("40")、
                        DataFilter.LowerThan("50")、
                    ),
                ),
            )
            .evaluate()

响应是 TrackerLineListResponse 的结果对象,其结构如下:

``kt TrackerLineListResponse( metadata = mapOf( "p4mRWMtCxtB" to MetadataItem.TrackedEntityAttributeItem ), headers = listOf( TrackerLineListItem.OrganisationUnitItem、 TrackerLineListItem.ProgramAttribute ), 过滤器 = listOf( TrackerLineListItem.ProgramStatusItem ), 行 = listOf( listOf( TrackerLineListValue(id="ouItem",value="Child 1")、 TrackerLineListValue(id="p4mRWMtCxtB",value="45")。 ), listOf( TrackerLineListValue(id = "ouItem",value = "Child 2")、 TrackerLineListValue(id="p4mRWMtCxtB",value="49")。 ), listOf( TrackerLineListValue(id = "ouItem",value = "Child 2")、 TrackerLineListValue(id = "p4mRWMtCxtB", value = "41") ) ) )

可选择使用 TrackerVisualization 对象(在 API 中称为 EventVisualization)来评估预定义的行列表。TrackerVisualization 必须具有 LINE_LIST 类型。也可以覆盖特定值。

例如,该查询使用 TrackerVisualization "s85urBIkN0z "中的配置,并添加或覆盖按 ACTIVE 过滤的 ProgramStatusItem 列。

```kt
d2.analyticsModule().trackerLineList()
  .withTrackerVisualization("s85urBIkN0z")
  .withColumn(
    TrackerLineListItem.ProgramStatusItem(
      filters = listOf(
        EnumFilter.EqualTo(EnrollmentStatus.ACTIVE.name)
      )
    )
  )
  .evaluate()

要使用 TrackerVisualization 对象,必须在安卓设置网络应用程序的 "分析 "部分进行设置。目前,还不能从服务器按需下载可视化,只能通过 Android 设置网络应用程序下载。

活动线路列表{ #android_sdk_event_line_list }

它们是基于事件的分析。如果你熟悉网络分析工具,它与事件报告(行列表)非常相似。它是 Tracker 行列表的简化案例。

一种常见的使用情况是,在特定 TEI 的背景下生成可重复阶段的事件行列表,以显示整个事件中特定值的演变情况。

例如,假设我们有一个包含两个数据元素(身高和体重)和一个基于这些值的指标(BMI,身体质量指数)的可重复阶段。我们希望显示这些值在不同事件中的变化情况

d2.analyticsModule().eventLineList()
        .byProgramStage().eq("stage_id")
        .byTrackedEntityInstance().eq("tei_id")
        .withDataElement("height_id")
        .withDataElement("weight_id")
        .withProgramIndicator("BMI_id")
        .evaluate()

结果将是一个事件列表,其中包含评估值(数据元素和指标)以及一些方便的displayName属性以在表格或图表中显示结果。