Describing an audience

An audience in Hiasynth is a list of conditions on attributes: this age, that income, this kind of home. You say it in words and your assistant writes the conditions. This page explains what it writes, so you can check it, and lists the few details that change an answer without telling you.

From words to filters

Take "affluent people under 40 in the Netherlands". Your assistant turns that into three conditions and a place:

Attribute
Condition
Value
age
less than
40
income_q
equals
Q4
place
Netherlands

Every condition is an attribute, an operator and a value. The operators are equals, not equals, less than, at most, greater than, at least, in for a list of values, and top_pct and bottom_pct for "the most" and "the least" of something. Conditions are combined with and: a person has to meet all of them.

Sent to a tool, the same audience looks like this:

{
  "place": "Netherlands",
  "filters": [
    { "column": "age", "op": "<", "value": 40 },
    { "column": "income_q", "op": "=", "value": "Q4" }
  ]
}

The same filters shape works on every tool that takes an audience: analyze_market, compare_places, rank_places, reach_audience, sample_persona and query_population.

Ask your assistant to show the filters it used. It is the quickest way to see whether "affluent" became the top income quartile or the top wealth decile, which are different audiences.

Two tables: people and households

The population has two tables, and every attribute lives in one of them.

Persons holds what belongs to an individual: age, sex, education, employment, civil status, personal income quartile, values, media, subscriptions, brand affinities, commute, schedule, life events.

Households holds what belongs to a home: composition, number of children, household income and wealth deciles, financial stress, housing costs, tenure, heating, solar, cars, what the home spends on, what it eats, what it emits, and everything about the surroundings.

You rarely need to care which is which. On every tool, a household attribute in filters selects the people who live in those homes. "Children in homes with an electric car" is about persons (children) selected by a household fact (the car), and it is one list:

{
  "place": "Germany",
  "filters": [
    { "column": "age", "op": ">=", "value": 3 },
    { "column": "age", "op": "<=", "value": 10 },
    { "column": "bev_owner", "op": "=", "value": true }
  ]
}

Because the people are matched through their household, everything a persons question gets still applies, including the square-kilometre breakdown. A question with a household condition needs a place, a country at minimum. Set table to households only when you want to count homes and not people.

An "unknown column" error names the closest matches and where they are.

What is in the catalogue

list_attributes with no arguments returns the groups. These are the ones you will use most.

Group
Table
What it holds
demographics
both
Age, sex, education, employment, civil status, household type and size, children
economics
both
Income quartile and deciles, wealth, debt, transfers, financial stress, housing cost burden
values_attitudes
both
Around sixty European Social Survey measures, as z-scores
media
persons
Media diet, digital engagement, channel use, advertising reach
subscriptions_propensity
persons
Paid video, music, news, gaming and fitness, and the propensity for each
brand_affinity
persons
Premium, sustainability, tech and novelty, health and wellness, experiences
life_events
persons
Chance of moving, changing job, partnering or having a child within three years
consumption
households
Spending in 47 categories, each as an amount and as a share of the household budget
emissions
households
Carbon footprint in tonnes of CO2e a year: total, car, heating, flying, and what is embedded in each spending category
lifestyle
households
Diet, how much the household goes out, how much it flies, the quality tier of the clothes it buys
place_activity
households
Daytime presence, shops, restaurants, cafés, bars, nightlife, offices, chargers nearby
place_access
households
Distance to city centre, rail, motorway, healthcare, grocery, fast chargers
geography
both
Density class, metro size, place type, land use
special_category
both
Religion, origin, health, political leaning. Restricted, see below

Search by keyword when you need something specific: list_attributes with search: "electric vehicle" returns the matching columns, their meaning, their table and their valid values. The catalogue is free to read.

The details that change an answer

These are the few places where a reasonable guess gives a wrong number. Your assistant is told about each of them when it connects, and the server catches most mistakes, but they are worth knowing.

income_q is a quartile. The values are Q1 to Q4, Q4 being the top. There is no Q5. Asking for the "top quintile" as Q5 matches nobody, and the answer will say that no rows matched and to check the values, not that the audience is rare.

income_q is empty for anyone under 20. An income filter therefore removes children and teenagers without saying so. To select children, or anyone, by how well off their home is, filter on the household: hh_net_income_decile.

Money is in local currency. Columns ending in _tlc are thousands of the country's own currency: euros in Germany, kronor in Sweden, pounds in the United Kingdom. They are fine within a country and meaningless across a border. Across countries use income_q, hh_net_income_decile (a national ladder where 5.5 is the median) or net_wealth_decile.

"A lot" is a percentage, never an amount. "People who spend a lot on eating out" has no threshold anyone could guess: the column is thousands of kronor in Sweden and thousands of euros in Germany. top_pct and bottom_pct say it relatively. spend_restaurants_cafes_tlc, top_pct, 20 is the fifth of households that spend the most, and the cut is made within each country, so it means the same thing in Södermalm as in Norrland and never mixes currencies. It works on any numeric attribute and needs a place or a country.

Spending comes twice. Every category is there as an amount, spend__tlc, and as a share of the household's whole budget, spend__share. They answer different questions. The amount finds the money: high earners in big households top every list. The share finds the taste: who puts eating out ahead of other things. Shares compare across countries, amounts don't.

Cafés are not separate from restaurants. The statistical category is eating and drinking out as a whole: restaurants, cafés, bars, takeaway and canteens together. For a café question, pair it with the place layer, which does count the cafés within 500 metres of a home.

Footprints are per household, and consumption-based. co2_total_t is tonnes of CO2e a year for the whole home: what it burns directly in cars and heating, plus what is embedded in everything it buys. A family of five has a bigger footprint than a student living alone for that reason only. Tonnes compare across countries.

Diet is one of four groups. diet_group is meat_regular, flexitarian, vegetarian or vegan.

Values are z-scores. Every ess_ attribute is centred on the European average: 0 is average, positive is above, negative is below. "Cares about the environment" is a condition such as at least 0.5 on the environment measure, not a yes or a no. The tools that report values translate the scores into words for you.

Affinities and engagement run from 0 to 1. "High sustainability affinity" is a threshold you choose, for instance at least 0.7. Say where you want the line, or ask what share of people clear it.

Education and employment cover everyone aged 15 and over. Employment is one of employed, unemployed and outside_lf. From 75 up, everyone is outside the labour force.

Occupation and industry are not available in this build. Use education, employment and weekly_schedule_profile, which separates full-time workers, retirees, students, pupils and people at home.

Categorical values are exact. commute_mode is one of none, car, transit, bike, walk. media_diet_segment is one of mainstream_mixed, news_traditional, social_streamer, informed_digital, light_offline. A value that doesn't exist matches nobody. When in doubt, list_attributes shows the valid values.

Sensitive attributes

Religion, ethnic and migration origin, health, sexual-orientation attitudes and political leaning are special-category data under European law, and they are treated differently even though the population is synthetic.

  • They can be used for aggregate work at region level and above.
  • They are never returned at fine geography. A question that crosses one of them with a municipality, a district or a square kilometre is answered for the surrounding region instead, and the answer says so.
  • The catalogue lists them in one group, special_category, without their values. A list of denominations is a menu, and we don't publish one.
  • The same goes for anything that would reveal them sideways. The population knows which households keep a religious diet, so that detail sits in the restricted group, and the diet_group you can map folds those households into the meat-eating group they belong to nutritionally. Spending on narcotics and on prostitution, both real lines in the national accounts, is restricted too.

Two attributes are never an audience at all: whether a person is able to consent, and whether they live in an institution.

How small an audience can be

The privacy floor is 100 people, and it applies to every cell of a breakdown, not only to the total. Reading an answer explains what you get instead. Personas of an area smaller than a municipality need more people behind each one, because a composite of one square kilometre describes a street and not a segment.

Next