MobiSurvStd

MobiSurvStd: Mobility Surveys Standardized

MobiSurvStd is an easy-to-use Python command line interface to convert any French mobility survey (EMC², EGT, EMD, etc.) to a unique standardized format.

Mobility Surveys in France

In France, despite recent efforts by CEREMA to create a standard format for mobility surveys – with the EMC² surveys – various formats co-exist:

  • EMC² (Enquête mobilité certifiée CEREMA): mobility surveys for many French territories (since 2018);
  • EGT H2020 (Enquête Globale Transport, Île-de-France Mobilités): mobility survey for Île-de-France (2018–2020; incomplete due to COVID-19);
  • EMP (Enquête mobilité des personnes, SDES): national mobility survey (2019).

Also surveys based on previous formats are still in use today:

  • EDVM (Enquêtes Déplacements Villes Moyennes, CEREMA): mobility surveys for medium-size cities (until 2018);
  • EDGT (Enquêtes Déplacements Grands Territoires, CEREMA): mobility surveys for periphery areas (until 2018);
  • EGT 2010 (Enquête Globale Transport, Île-de-France Mobilités): previous version of the Île-de-France mobility survey;
  • ENTD (Enquête nationale transports et déplacements, SDES): former national mobility survey (2008).

Why MobiSurvStd?

The existing formats all have the same drawbacks:

  • Data are sorted in CSV files which are not always straightforward to read (Which separator? Which encoding? What are the variable datatypes?).
  • Variable names and modalities are not always clear (e.g., in the EMC² format, variable “P2” represents the gender of the person, with modality 1 for a man and 2 for a woman).
  • Joining two datasets is hard and not well documented (e.g., in the EMC² format, to join the persons with their household, the variables to use are “METH”, “ZFM” and “ECH” for the households and “DMET”, “ZFD” and “ECH” for the persons).

Additionally, when working with different territories / periods, it is often necessary to write a similar code multiple times due to the extistence of different formats.

MobiSurvStd solves all these issues by being able to convert all survey formats to a well-defined format.

Check TODO to see how MobiSurvStd can help you write fewer and cleaner codes.

How to use?

Install the library with

pip install mobisurvstd

Convert your survey to the standard format with

python -m mobisurvstd -i original_survey/ -o std_survey/

What about other countries?

MobiSurvStd covers only French mobility survey formats. If other countries have similar survey formats, they might be easily integrated into MobiSurvStd. If you found a format that could be integrated, feel free to open an issue on GitHub.

Issues and Contributions

If you think you found a bug, if you have a suggestion, or if you want to integrate a new format, feel free to open an issue on GitHub and even to open a Pull Request.

Why MobiSurvStd?

import polars as pl
pers = pl.read_csv("Csv/Fichiers_Standard/brest_2018_std_pers.csv", separator=";")
depl = pl.read_csv("Csv/Fichiers_Standard/brest_2018_std_depl.csv", separator=";")
print(
    depl
    .join(
        pers,
        left_on=["DMET", "ZFD", "ECH", "PER"],
        right_on=["PMET", "ZFP", "ECH", "PER"]
    )
    .group_by("P2")
    .agg(
        (pl.col("D9") * pl.col("COEP")).sum()
        / pl.col("COEP").sum()
    )
    .sort("P2")
)
shape: (2, 2)
┌─────┬───────────┐
│ P2  ┆ D9        │
│ --- ┆ ---       │
│ i64 ┆ f64       │
╞═════╪═══════════╡
│ 1   ┆ 18.145294 │
│ 2   ┆ 15.915749 │
└─────┴───────────┘
import polars
pers = pl.read_parquet("persons.parquet")
trips = pl.read_parquet("trips.parquet")
print(
    trips
    .join(pers, on="person_id")
    .group_by("woman")
    .agg(
        (pl.col("travel_time") * pl.col("sample_weight_surveyed")).sum()
        / pl.col("sample_weight_surveyed").sum()
    )
    .sort("woman")
)
┌───────┬─────────────┐
│ woman ┆ travel_time │
│ ---   ┆ ---         │
│ bool  ┆ f64         │
╞═══════╪═════════════╡
│ false ┆ 18.145294   │
│ true  ┆ 15.915749   │
└───────┴─────────────┘

Glossary

Surveys

EMC²

  • TODO: Information on zoning system (including GT)

  • For each trips, the non-walking legs are recorded. MobiSurvStd reconstruct the walking legs using the access / egress walking time variables. This means that the leg travel time is known only for the walking legs (as it is not a recorded variable for the other legs).

  • Brest:

    • The municipality of Daoulas is not included in the INSEE shapefile, despite the municipality being inside the perimeter.
    • Some special locations are not defined in the shapefile but are used as origin / destination.

EMP

  • Pas de représentativité régionale
  • Une seule personne par ménage avec + d’infos (dont les déplacements)
  • Type de car pas connu mais peut inclure voiture particulière, VUL et camping-car
  • Troisième type de véhicules (58 voiturettes + 59 quads + 1 tricycle) pas lu

EGT 2020

  • Pas de secteur de tirage ni de carreaux (mais coordonnées)
  • Pas de type pour les “cars” (mais camping-cars et gros utilitaires exclus)
  • Stationnement des motos pas lu car la documentation n’est pas bonne
  • main_mode_group différent de MODP_H7 car pas même classification des groups, pas mêmes critères
  • start_insee and end_insee are derived from leg’s coordinates, using INSEE data from 2025
  • work_insee and study_insee are derived from coordinates, using INSEE data from 2025. There can be some mistakes (e.g., Puteaux when it should be Courbevoie)

Availability table

Households

EMC²EMP2019EGT2020EGT2010
household id
original_household id
survey_method
interview_date
sample_weight
home_lng
home_lat
home_special_location
home_detailed_zone
home_draw_zone
home_insee
home_dep
home_dep_name
home_nuts2
home_nuts2_name
home_nuts1
home_nuts1_name
household_type
income_lower_bound
income_upper_bound
housing_type
housing_status
has_internet
nb_cars
nb_motorcycles
nb_bicycles
nb_standard_bicycles
nb_electric_bicycles
has_bicycle_parking
nb_persons
nb_persons_5plus
nb_majors
nb_minors

Persons

EMC²EMP2019EGT2020EGT2010
person_id
household_id
person_index
original_person_id
reference_person_link
resident_type
woman
age
age_class
age_class_code
education_level
detailed_education_level
professional_occupation
detailed_professional_occupation
secondary_professional_occupation
pcs_group
pcs_group_code
pcs_category_code2020
pcs_category_code2003
work_only_at_home
workplace_singularity
work_lng
work_lat
work_special_location
work_detailed_zone
work_draw_zone
work_insee
work_insee_name
work_dep
work_dep_name
work_nuts2
work_nuts2_name
work_nuts1
work_nuts1_name
work_commute_euclidean_distance_km
has_car_for_work_commute
telework
work_car_parking
work_bicycle_parking
student_group
student_category
study_only_at_home
study_lng
study_lat
study_special_location
study_detailed_zone
study_draw_zone
study_insee
study_insee_name
study_dep
study_dep_name
study_nuts2
study_nuts2_name
study_nuts1
study_nuts1_name
study_commute_euclidean_distance_km
has_car_for_study_commute
study_car_parking
study_bicycle_parking
has_driving_license
has_motorcycle_driving_license
has_public_transit_subscription
public_transit_subscription
has_car_sharing_subscription
car_sharing_subscription
has_bike_sharing_subscription
has_travel_inconvenience
is_surveyed
traveled_during_surveyed_day
worked_during_surveyed_day
nb_trips
sample_weight_all
sample_weight_surveyed

Trips

EMC²EGT2020
trip_id
person_id
household_id
trip_index
first_trip
last_trip
home_sequence_index
original_trip_id
origin_purpose
origin_purpose_group
origin_activity_duration
destination_purpose
destination_purpose_group
destination_activity_duration
origin_escort_purpose
origin_escort_purpose_group
destination_escort_purpose
destination_escort_purpose_group
origin_lng
origin_lat
origin_special_location
origin_detailed_zone
origin_draw_zone
origin_insee
origin_insee_name
origin_insee_density
origin_insee_aav_type
origin_aav
origin_aav_name
origin_aav_category
origin_dep
origin_dep_name
origin_nuts2
origin_nuts2_name
origin_nuts1
origin_nuts1_name
destination_lng
destination_lat
destination_special_location
destination_detailed_zone
destination_draw_zone
destination_insee
destination_insee_name
destination_insee_density
destination_insee_aav_type
destination_aav
destination_aav_name
destination_aav_category
destination_dep
destination_dep_name
destination_nuts2
destination_nuts2_name
destination_nuts1
destination_nuts1_name
departure_time
arrival_time
travel_time
trip_date
trip_weekday
main_mode
main_mode_group
intermodality
public_transit_access_mode
public_transit_access_mode_group
public_transit_egress_mode
public_transit_egress_mode_group
trip_euclidean_distance_km
trip_travel_distance_km
intra_municipality
intra_aav
intra_dep
trip_perimeter
nb_tour_stops
nb_legs
nb_legs_walking
nb_legs_bicycle
nb_legs_motorcycle
nb_legs_car_driver
nb_legs_car_passenger
nb_legs_public_transit
nb_legs_other

Legs

EMC²EGT2020
leg_id
trip_id
person_id
household_id
leg_index
first_leg
last_leg
original_leg_id
mode
mode_group
public_transit_line
start_lng
start_lat
start_special_location
start_detailed_zone
start_draw_zone
start_insee
start_insee_name
start_dep
start_dep_name
start_nuts2
start_nuts2_name
start_nuts1
start_nuts1_name
end_lng
end_lat
end_special_location
end_detailed_zone
end_draw_zone
end_insee
end_insee_name
end_dep
end_dep_name
end_nuts2
end_nuts2_name
end_nuts1
end_nuts1_name
leg_travel_time
leg_euclidean_distance_km
leg_travel_distance_km
car_type
car_id
nolicense_car
nb_persons_in_vehicle
nb_majors_in_vehicle
nb_minors_in_vehicle
nb_household_members_in_vehicle
nb_non_household_members_in_vehicle
in_vehicle_person_ids
motorcycle_type
motorcycle_id
parking_location
parking_type
parking_search_time

Cars

EMC²EMP2019EGT2020EGT2010
car_id
household_id
car_index
original_car_id
type
fuel_type
fuel_type_group
year
tax_horsepower
critair
total_mileage
total_mileage_lower_bound
total_mileage_upper_bound
annual_mileage
annual_mileage_lower_bound
annual_mileage_upper_bound
ownership
parking_location
parking_type

Motorcycles

EMC²EMP2019EGT2020EGT2010
motorcycle_id
household_id
motorcycle_index
original_motorcycle_id
type
fuel_type
year
thermic_engine_type
cm3_lower_bound
cm3_upper_bound
kw_lower_bound
kw_upper_bound
annual_mileage
annual_mileage_lower_bound
annual_mileage_upper_bound
parking_location
parking_type

Households

Sort order: household_id

Indexing

household_id

Unique identifier of the household.

  • Type: UInt32
  • Guarantees:
    • Values range from 1 to the number of households.

original_household_id

Identifier of the household in the original data.

  • Type: Struct whose fields depend on the survey

Surveying

survey_method

Method that was used to survey the household.

  • Modalities:
    • "face_to_face": the household was surveyed during a face-to-face meeting
    • "phone": the household was surveyed on the phone
  • Guarantees:
    • Values are either all null (undefined survey method) or all defined.

interview_date

Date at which the interview took place.

Note that this is not the date at which the reported trips (if any) took place. See TODO.

  • Type: Date

sample_weight

Sample weight of the household.

The sum of the values is supposed to be approximately equal to the number of households in the survey area.

  • Type: Float64
  • Guarantees:
    • Values are either all null (undefined survey method) or all defined.
    • The value is non-negative.

Home location

home_lng

Longitude of home coordinates.

The accuracy depends on the survey type. For EGT surveys, the coordinates are guaranteed to be within 100 meters of the actual location. For other surveys, the coordinates represent the centroid of home_detailed_zone (or the exact coordinates defined by home_special_location when it is non-null).

  • Type: Float64

home_lat

Latitude of home coordinates.

See home_lng for details on the accuracy of the value.

  • Type: Float64

home_special_location

Identifier of the special location where the household is located.

  • Type: UInt32
  • Guarantees:
    • The home special location intersects with the home detailed zone, draw zone, and INSEE zone (only checked if the locations and zones are known).

home_detailed_zone

Identifier of the detailed zone where the household is located.

  • Type: UInt32
  • Guarantees:
    • Values are either all null or all defined.
    • If detailed_zones.parquet exists, then the value is a valid detailed_zone_id.
    • The home detailed zone intersects with the home draw zone and INSEE zone (only checked if the zones are known).

home_draw_zone

Identifier of the draw zone where the household is located.

  • Type: UInt32
  • Guarantees:
    • Values are either all null or all defined.
    • If draw_zones.parquet exists, then the value is a valid draw_zone_id.
    • The home draw zone intersects with the home INSEE zone (only checked if the zones are known).

home_insee

INSEE code of the municipality where the household is located.

  • Type: String
  • Guarantees:

home_insee_name

Name of the municipality where the household is located.

  • Type: String

home_dep

Département code of the household home.

  • Type: String
  • Guarantees:
    • The value is a valid département code.
    • If home_insee is not null, then the value is equal to the département of the home INSEE municipality.

home_dep_name

Name of the département of the household home.

  • Type: String
  • Guarantees:
    • The value is consistent with home_dep.

home_nuts2

NUTS 2 code of the household home.

In France, NUTS 2 corresponds to the 22 old administrative regions (and 5 overseas departments).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 2 code.
    • If home_dep is not null, then the value is equal to the NUTS 2 code corresponding to the home département.

home_nuts2_name

Name of the NUTS 2 region of the household home.

  • Type: String
  • Guarantees:
    • The value is consistent with home_nuts2.

home_nuts1

NUTS 1 code of the household home.

In France, NUTS 1 corresponds to the 13 administrative regions (and 1 overseas region).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 1 code.
    • If home_nuts2 is not null, then the value is equal to the NUTS 1 code corresponding to the home NUTS 2.

home_nuts1_name

Name of the NUTS 1 region of the household home.

  • Type: String
  • Guarantees:
    • The value is consistent with home_nuts1.

Household characteristics

household_type

Type of household structure.

  • Modalities:
    • "single:man": household with only one man
    • "single:woman": household with only one woman
    • "couple:no_child": couple with no child
    • "couple:children": couple with at least one child
    • "singleparent:father": singleparent family (man and at least one child)
    • "singleparent:mother": singleparent family (woman and at least one child)
    • "other": other type of household structure
  • Guarantees:
    • The value is compatible with the actual household structure (nb_persons, reference_person_link, etc.).

income_lower_bound

Lower bound for the net income of the household, in euros.

  • Type: UInt16

income_upper_bound

Upper bound for the net income of the household, in euros.

  • Type: UInt16
  • Guarantees:
    • The value is not smaller than income_lower_bound.

Housing

housing_type

Type of the housing the household is living in.

  • Modalities:
    • "house": an individual house
    • "apartment": an apartment in a collective building
    • "other": an other type of housing

housing_status

Type of ownership / renting for the housing.

  • Modalities:
    • "owner:ongoing_loan": the household is owning the housing and is paying loans (“accédant à la propriété”)
    • "owner:fully_repaid": the household is owning the housing and is not paying loans
    • "owner:usufructuary": the household is usufructuary of the housing (“usufruitier”)
    • "owner:unspecified": the household is owning the housing (without more specification)
    • "tenant:public_housing": the household is a tenant inside a public housing
    • "tenant:private": the household is a tenant inside a private-owned housing
    • "tenant:unspecified": the household is a tenant (without more specification)
    • "rent_free": the household is hosted for free
    • "university_resident": the household is living inside a university residence
    • "other": other type of ownership / renting

has_internet

Whether the household has internet access at home.

  • Type: Boolean

Motorized vehicles

nb_cars

Number of cars owned by the household.

  • Type: UInt8
  • Guarantees:
    • The number of cars for this household in cars.parquet is not larger than this value (but it can be smaller if the car details are not known for all cars).

nb_motorcycles

Number of motorcycles owned by the household.

  • Type: UInt8
  • Guarantees:
    • The number of motorcycles for this household in motorcycles.parquet is not larger than this value (but it can be smaller if the motorcycles details are not known for all motorcycles).

Bicycles

nb_bicycles

Number of bicycles (standard or electric) owned by the household.

  • Type: UInt8
  • Guarantees:
    • When nb_standard_bicycles and nb_electric_bicycles are specified, then we always have nb_bicycles = nb_standard_bicycles + nb_electric_bicycles.

nb_standard_bicycles

Number of standard bicycles (i.e., non-electric) owned by the household.

  • Type: UInt8

nb_electric_bicycles

Number of electric bicycles owned by the household.

  • Type: UInt8

has_bicycle_parking

Whether the household can park bicycles at home.

  • Type: Boolean

Counts

nb_persons

Number of persons belonging to the household.

Note that persons below 5 year old are sometimes excluded from the surveys.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is positive.
    • The value is equal to the number of persons in persons.parquet who belong to this household.

nb_persons_5plus

Number of persons in the household whose age is 6 or more.

  • Type: UInt8
  • Guarantees:
    • The value is not smaller than the number of persons in this household whose age is 6 or more.
    • The value is not larger than the number of persons in this household whose age is unknown or 6 or more.

nb_majors

Number of persons in the household whose age is 18 or more.

  • Type: UInt8
  • Guarantees:
    • The value is not smaller than the number of persons in this household whose age is 18 or more.
    • The value is not larger than the number of persons in this household whose age is unknown or 18 or more.

nb_minors

Number of persons in the household whose age is 17 or less.

  • Type: UInt8
  • Guarantees:
    • The value is not smaller than the number of persons in this household whose age is 17 or less.
    • The value is not larger than the number of persons in this household whose age is unknown or 17 or less.

Persons

Sort order: person_id

Indexing

person_id

Unique identifier of the person.

  • Type: UInt32
  • Guarantees:
    • Values range from 1 to the number of persons.

household_id

Identifier of the household the person belongs to.

  • Type: UInt32
  • Guarantees:
    • The value is not null.
    • There exists a household with this household_id.
    • The values are stored in increasing order (i.e., the persons from households with a smaller id are shown first).

person_index

Index of the person within the household’s persons.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • Values are unique within a household and range from 1 to the number of persons in the household.
    • The values are stored in increasing order within a household (i.e., the persons with smaller indices are shown first).

original_person_id

Identifier of the person in the original data.

  • Type: Struct whose fields depend on the survey

Demographic characteristics

Link of the person relative to the reference person of the household.

  • Modalities:
    • "reference_person": this person is the reference person of the household
    • "spouse": this person is the spouse (husband or wife) of the reference person
    • "child": this person is a child of the reference person
    • "roommate_or_tenant": this person is a roommate or tenant in the household, with no family link to the reference person
    • "other:relative": this person is a relative of the reference person (but not spouse or child)
    • "other:non_relative": other link to the reference person (excluding relatives)
  • Guarantees:
    • If the values are not null for all persons within a household, then there is exactly one person defined as the "reference_person" for this household.

resident_type

Whether the person is living in the household home for most of the year.

  • Modalities:
    • "permanent_resident": the person is living in the household for most of the year
    • "mostly_weekends": the person is usually only living in the household during weekends (with another location during weekdays for work or study reasons)
    • "mostly_weekdays": the person is usually only living in the household during weekdays (for work or study reasons)

woman

Whether the person is a woman.

  • Type: Boolean

age

Age of the person.

  • Type: UInt8
  • Guarantees:
    • The value is not larger than 125.
    • Persons whose reference_person_link is "child" are not older than the household reference person.

age_class

Age of the person in 7 classes.

  • Modalities:
    • "17-": 17 or less
    • "18-24": 18 to 24
    • "25-34": 25 to 34
    • "35-49": 35 to 49
    • "50-64": 50 to 64
    • "65-74": 65 to 74
    • "75+": 75 or more
  • Guarantees:
    • The class is compatible with the value of age.

age_class_code

Age of the person in 7 classes.

Value 1 is for "17-", 2 is for "18-24", …, 7 is for "75+".

  • Type: UInt8
  • Guarantees:
    • The value is consistent with age_class.

education_level

Highest education level reached by the person.

Note that given the diversity of the surveys regarding this question, some modalities might have different meanings depending on the survey (e.g., "primary" can mean either that the person did go to school after primary education or that their highest diploma earned is “Certificat d’études primaires”). Also see detailed_education_level.

  • Modalities:
    • "no_studies_or_no_diploma": the person did no go to school or did not get any diploma
    • "primary": the person has stopped going to school after primary education (“école primaire”) or their highest diploma is “Certificat d’études primaires”
    • "secondary:no_bac": the person has stopped going to school after middle-school (“collège”) or high-school (“lycée”) and did not get the baccalauréat
    • "secondary:bac": the person has stopped going to school after high-school (“lycée”) with the baccalauréat diploma
    • "higher:at_most_bac+2": the person has stopped going to school after at most 2 years of higher education
    • "higher:at_least_bac+3": the person has stopped going to school after at least 3 years of higher education

detailed_education_level

Highest education level reached by the person, in detailed categories.

The modalities try to reproduce as best as possible the large diversity of the modalities observed in the surveys without having too many modalities and without losing too much information.

  • Modalities:
    • "no_studies": the person did not go to school
    • "no_diploma": the person did not get any diploma
    • "primary:unspecified": the person has stopped going to school after primary education (“école primaire”), it is unknown whether they get the “Certificat d’études primaires”
    • "primary:CEP": the person’s highest diploma is the “Certificat d’études primaires”
    • "secondary:no_bac:college": the person has stopped going to school after middle-school (“collège”) or their highest diploma is “Brevet des collèges”
    • "secondary:no_bac:CAP/BEP": the person’s highest diploma is “CAP”, “BEP”, or an equivalent diploma
    • "secondary:bac:techno_or_pro": the person’s highest diploma is “Baccalauréat technologique”, “Baccalauréat professionnel”, or an equivalent diploma
    • "secondary:bac:general": the person’s highest diploma is “Baccalauréat général”
    • "secondary:bac:unspecified": the person’s highest diploma is “Baccalauréat” (without further specification)
    • "higher:at_most_bac+2:DEUG": the person’s highest diploma is “DEUG” (BAC+2)
    • "higher:at_most_bac+2:BTS/DUT": the person’s highest diploma is “BTS”, “DUT”, or an equivalent diploma (BAC+2)
    • "higher:at_most_bac+2:paramedical_social": the person’s highest diploma is at BAC+2 level (“formation paramédical et social”)
    • "higher:at_most_bac+2:unspecified": the person’s highest diploma is at BAC+2 level (unspecified diploma)
    • "higher:at_least_bac+3:universite": the person’s highest diploma is at least BAC+3 in a university (“Licence”, “Maîtrise”, “Master”, “DEA”, “DESS”, “Doctorat”)
    • "higher:at_least_bac+3:ecole": the person’s highest diploma is at least BAC+3 in a “Grande École”
    • "higher:at_least_bac+3:unspecified": the person’s highest diploma is at least BAC+3 (without further specification)
    • "higher:bac+3_or_+4": the person’s highest diploma is at level BAC+3 or BAC+4
    • "higher:at_least_bac+5": the person’s highest diploma is at least BAC+5

Occupancy

professional_occupation

Professional status of the person.

Note these categories cannot represent some mixed situations (e.g., students with week-end jobs, students in apprenticeship, retired people with small jobs). Also see detailed_professional_occupation and secondary_professional_occupation for more details.

  • Modalities:
    • "worker": the person has a full-time or part-time job
    • "student": the person is a student
    • "other": other status
  • Guarantees:
    • The value is "student" if and only if education_level is "in_school"

detailed_professional_occupation

Detailed professional status of the person.

  • Modalities:
    • "worker:full_time": the person has a full-time job
    • "worker:part_time": the person has a part-time job
    • "worker:unspecified": the person has a job with no further specification
    • "student:primary_or_secondary": the person is a student in primary or secondary education
    • "student:higher": the person is a student in higher education (“enseignement supérieur”)
    • "student:apprenticeship": the person is in apprenticeship training
    • "other:unemployed": the person is unemployed, looking for a job
    • "other:retired": the person is retired
    • "other:homemaker": the person is not working and not looking for a job
    • "other:unspecified": other unspecified situation
  • Guarantees:
    • The values are consistent with professional_occupation.

secondary_professional_occupation

Secondary professional occupation of the person (if any).

This is useful for students with part-time student job or workers with continuous training (“formation continue”) for example.

  • Modalities:
    • "work"
    • "education"
  • Guarantees:
    • The value is not "work" if "professional_occupation" is "worker"
    • The value is not "education" if "professional_occupation" is "student"

Work status

pcs_group

Group of “Professions et Catégories Socioprofessionnelles” the person belongs to.

The groups are defined by INSEE. Some surveys follow the INSEE 2003 definition, while others follow the 2020 definition. This means that the two last groups (“retraités” and “autres_personnes_sans_activité_professionnelle”) might not be used for some surveys. The detailed_professional_occupation variable should be used instead if you need to access job status. Note that unemployed and retired people might still be assigned to the group corresponding to their previous jobs.

  • Modalities:
    • "agriculteurs_exploitants"
    • "artisans_commerçants_chefs_d'entreprise"
    • "cadres_et_professions_intellectuelles_supérieures"
    • "professions_intermédiaires"
    • "employés"
    • "ouvriers"
    • "retraités"
    • "autres_personnes_sans_activité_professionnelle"
  • Guarantees:
    • If the professional_occupation is "student", then pcs_group is null.

pcs_group_code

Code of the group of “Professions et Catégories Socioprofessionnelles” the person belongs to.

The codes follow the 2003 definition of the groups.

  • Type: UInt8
  • Guarantees:
    • All values are between 1 and 8.
    • The values are consistent with variable pcs_group (e.g., value is 5 if and only if pcs_group is "employés").
    • The value is null if and only if pcs_group is "no_answer" or null.

pcs_category_code2020

Code of the category of “Professions et Catégories Socioprofessionnelles” the person belongs to.

This variable is used when the codes from the survey follow the INSEE 2020 definition.

  • Type: UInt8
  • Guarantees:
    • Possible values: 10, 21, 22, 23, 31, 33, 34, 35, 37, 38, 42, 43, 44, 45, 46, 47, 47, 52, 53, 54, 55, 56, 62, 63, 64, 65, 67, 68, 69.
    • If pcs_group_code is null, then the value is null.
    • If the value is not null, then its first digit is equal to the value of pcs_group_code.

pcs_category_code2003

Code of the category of “Professions et Catégories Socioprofessionnelles” the person belongs to.

This variable is used when the codes from the survey follow the INSEE 2003 definition.

  • Type: UInt8
  • Guarantees:
    • Possible values: 10, 21, 22, 23, 31, 32, 36, 41, 46, 47, 48, 51, 54, 55, 56, 61, 66, 69, 71, 72, 73, 76, 81, 82.
    • If pcs_group_code is null, then the value is null.
    • If the value is not null, then its first digit is equal to the value of pcs_group_code.

Workplace location

work_only_at_home

Whether the person works only at home.

  • Type: Boolean
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.

workplace_singularity

Whether the person has a unique, fixed workplace location.

  • Modalities:
    • "unique:outside": the person has a unique workplace location, outside home
    • "unique:home": the person is working only at home
    • "variable": the person has multiple usual workplace location or no usual workplace location (e.g., moving from client to client)
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • If work_only_at_home is true, then the value is "unique:home".

work_lng

Longitude of the usual workplace.

The accuracy depends on the survey type. For EGT surveys, the coordinates are guaranteed to be within 100 meters of the actual location. For other surveys, the coordinates represent the centroid of work_detailed_zone (or the exact coordinates defined by work_special_location when it is non-null).

  • Type: Float64

work_lat

Latitude of the usual workplace.

See work_lng for details on the accuracy of the value.

  • Type: Float64

work_special_location

Identifier of the special location where the person usually works.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • The work special location intersects with the work detailed zone, draw zone, and INSEE zone (only checked if the zones are known).
    • If work_only_at_home is true, then the value is null.

work_detailed_zone

Identifier of the detailed zone where the person usually works.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • The work detailed zone intersects with the work draw zone and INSEE zone (only checked if the zones are known).
    • If work_only_at_home is true, then the value is null.

work_draw_zone

Identifier of the draw zone where the person usually works.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • The work draw zone intersects with the work INSEE zone (only checked if the zones are known).
    • If work_only_at_home is true, then the value is null.

work_insee

INSEE code of the municipality where the person usually works.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • String is a valid INSEE code.
    • If work_only_at_home is true, then the value is null.

work_insee_name

Name of the municipality where the person usually works.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.

work_dep

Département code of the usual workplace.

  • Type: String
  • Guarantees:
    • The value is a valid département code.
    • If work_insee is not null, then the value is equal to the département of the work INSEE municipality.

work_dep_name

Name of the département of the usual workplace.

  • Type: String
  • Guarantees:
    • The value is consistent with work_dep.

work_nuts2

NUTS 2 code of the usual workplace.

In France, NUTS 2 corresponds to the 22 old administrative regions (and 5 overseas departments).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 2 code.
    • If work_dep is not null, then the value is equal to the NUTS 2 code corresponding to the work département.

work_nuts2_name

Name of the NUTS 2 region of the usual workplace.

  • Type: String
  • Guarantees:
    • The value is consistent with work_nuts2.

work_nuts1

NUTS 1 code of the usual workplace.

In France, NUTS 1 corresponds to the 13 administrative regions (and 1 overseas region).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 1 code.
    • If work_nuts2 is not null, then the value is equal to the NUTS 1 code corresponding to the work NUTS 2.

work_nuts1_name

Name of the NUTS 1 region of the usual workplace.

  • Type: String
  • Guarantees:
    • The value is consistent with work_nuts1.

Work commute

work_commute_euclidean_distance_km

Euclidean distance, in kilometers, between the person’s home location and usual work location.

  • Type: Float64
  • Guarantees:
    • All values are non-negative.
    • If professional_occupation is not "worker", then the value is null.
    • If work_only_at_home is false, then the value is zero.

has_car_for_work_commute

Whether the person has a car they can use to commute to work.

  • Modalities:
    • "yes:full_commute": the person has a car that they use for the full trip
    • "yes:partial_commute": the person has a car that they use for a part of the trip
    • "yes:not_used": the person has a car that they could use to commute to work but they do not
    • "yes:partial_or_not_used": the person has a car but it is not used or only for a part of the trip
    • "yes:full_or_partial": the person has a car that they use partially or fully to commute to work
    • "no": no
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • If work_only_at_home is true, then the value is null.

telework

Whether and frequency at which the person teleworks.

Note that persons who reported to only work at home (e.g., many farmers) are not considered to be telework each day (the value is null for them).

  • Modalities:
    • "yes:weekly": the person teleworks at least once a week
    • "yes:monthly": the person teleworks at least once a month
    • "yes:occasionally": the person teleworks but only occasionally (less than once a month)
    • "no": the person never telework
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • If work_only_at_home is true, then the value is null.

Workplace parking

work_car_parking

Whether the person has access to a car parking spot at the usual work location.

  • Modalities:
    • "yes:reserved": the person has (or could have) a reserved car spot at work
    • "yes:many_spots": the person can park their car at work because they are many spots available
    • "yes:compatible_schedule": the person can park their car at work because their work schedule allow them to easily find spots
    • "yes:unspecified": the person can park their car at work (no further specification)
    • "no": the person cannot park their car at work
    • "dont_know": the person does not know whether they can park their car at work
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • If work_only_at_home is true, then the value is null.

work_bicycle_parking

Whether the person has access to a bicycle parking spot at the usual work location.

  • Modalities:
    • "yes:on_site:sheltered": the person has access to a sheltered bicycle parking at workplace
    • "yes:on_site:unsheltered": the person has access to an unsheltered bicycle parking at workplace
    • "yes:on_site": the person has access to a bicycle parking at workplace (unknown whether it is sheltered)
    • "yes:nearby:sheltered": the person has access to a sheltered bicycle parking nearby work
    • "yes:nearby:unsheltered": the person has access to an unsheltered bicycle parking nearby work
    • "yes:nearby": the person has access to a bicycle parking nearby work (unknown whether it is sheltered)
    • "no": the person does not have access to a bicycle parking at workplace or nearby work
    • "no_answer": the person did not answer that question
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • If work_only_at_home is true, then the value is null.

Student status

student_group

Group indicating the current education level for students.

  • Modalities:
    • "primaire": “maternelle” or primary school
    • "collège": middle-school
    • "lycée": high-school
    • "supérieur": higher education
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • The values are consistent with detailed_professional_occupation ("student:higher" implies "supérieur"; "student:primary_or_secondary" implies "primaire", "collège", or "lycée"; "student:apprenticeship" implies "lycée" or "supérieur").

student_category

Category indicating the detailed current education level for students.

  • Modalities:
    • "maternelle"
    • "primaire": “école primaire” excluding “maternelle”
    • "collège:6e"
    • "collège:5e"
    • "collège:4e"
    • "collège:3e"
    • "collège:SEGPA"
    • "lycée:seconde"
    • "lycée:première"
    • "lycée:terminale"
    • "lycée:CAP": “lycée professionelle ou CFA, préparation du CAP”
    • "supérieur:technique": “IUT / BTS”
    • "supérieur:prépa1": “Classe préparatoire, première année”
    • "supérieur:prépa2": “Classe préparatoire, deuxième année”
    • "supérieur:BAC+1": Other higher education training, “niveau BAC+1”
    • "supérieur:BAC+2": Other higher education training, “niveau BAC+2”
    • "supérieur:BAC+3": Other higher education training, “niveau BAC+3”
    • "supérieur:BAC+4": Other higher education training, “niveau BAC+4”
    • "supérieur:BAC+5": Other higher education training, “niveau BAC+5”
    • "supérieur:BAC+6&+": Other higher education training, “niveau BAC+6 et plus”
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • The values are consistent with student_group (e.g., if student_category is "collège:6e", then student_group is "collège").

Study location

study_only_at_home

Whether the person studies only at home.

  • Type: Boolean
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.

study_lng

Longitude of the usual study location.

The accuracy depends on the survey type. For EGT surveys, the coordinates are guaranteed to be within 100 meters of the actual location. For other surveys, the coordinates represent the centroid of study_detailed_zone (or the exact coordinates defined by study_special_location when it is non-null).

  • Type: Float64

study_lat

Latitude of the usual study_location.

See study_lng for details on the accuracy of the value.

  • Type: Float64

study_special_location

Identifier of the special location zone where the person usually studies.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • The study special location intersects with the study detailed zone, draw zone, and INSEE zone (only checked if the zones are known).
    • If study_only_at_home is true, then the value is null.

study_detailed_zone

Identifier of the detailed zone where the person usually studies.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • The study detailed zone intersects with the study draw zone and INSEE zone (only checked if the zones are known).
    • If study_only_at_home is true, then the value is null.

study_draw_zone

Identifier of the draw zone where the person usually studies.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • The study draw zone intersects with the study INSEE zone (only checked if the zones are known).
    • If study_only_at_home is true, then the value is null.

study_insee

INSEE code of the municipality where the person usually studies.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • String is a valid INSEE code.
    • If study_only_at_home is true, then the value is null.

study_insee_name

Name of the municipality where the person usually studies.

  • Type: String
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.

study_dep

Département code of the usual study location.

  • Type: String
  • Guarantees:
    • The value is a valid département code.
    • If study_insee is not null, then the value is equal to the département of the study INSEE municipality.

study_dep_name

Name of the département of the usual study location.

  • Type: String
  • Guarantees:
    • The value is consistent with study_dep.

study_nuts2

NUTS 2 code of the usual study location.

In France, NUTS 2 corresponds to the 22 old administrative regions (and 5 overseas departments).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 2 code.
    • If study_dep is not null, then the value is equal to the NUTS 2 code corresponding to the study département.

study_nuts2_name

Name of the NUTS 2 region of the usual study location.

  • Type: String
  • Guarantees:
    • The value is consistent with study_nuts2.

study_nuts1

NUTS 1 code of the usual study location.

In France, NUTS 1 corresponds to the 13 administrative regions (and 1 overseas region).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 1 code.
    • If study_nuts2 is not null, then the value is equal to the NUTS 1 code corresponding to the study NUTS 2.

study_nuts1_name

Name of the NUTS 1 region of the usual study location.

  • Type: String
  • Guarantees:
    • The value is consistent with study_nuts1.

Study commute

study_commute_euclidean_distance_km

Euclidean distance, in kilometers, between the person’s home location and usual study location.

  • Type: Float64
  • Guarantees:
    • All values are non-negative.
    • If professional_occupation is not "student", then the value is null.
    • If study_only_at_home is false, then the value is zero.

has_car_for_study_commute

Whether the person has a car they can use to commute to study.

  • Modalities:
    • "yes:full_commute": the person has a car that they use for the full trip
    • "yes:partial_commute": the person has a car that they use for a part of the trip
    • "yes:not_used": the person has a car that they could use to commute to study but they do not
    • "yes:partial_or_not_used": the person has a car but it is not used or only for a part of the trip
    • "yes:full_or_partial": the person has a car that they use partially or fully to commute to study
    • "no": no
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • If study_only_at_home is true, then the value is null.

Study location parking

study_car_parking

Whether the person has access to a car parking spot at the usual study location.

  • Modalities:
    • "yes:reserved": the person has (or could have) a reserved car spot at study
    • "yes:many_spots": the person can park their car at study because they are many spots available
    • "yes:compatible_schedule": the person can park their car at study because their study schedule allow them to easily find spots
    • "no": the person cannot park their car at study
    • "dont_know": the person does not know whether they can park their car at study
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • If study_only_at_home is true, then the value is null.

study_bicycle_parking

Whether the person has access to a bicycle parking spot at the usual study location.

  • Modalities:
    • "yes:on_site:sheltered": the person has access to a sheltered bicycle parking at study location
    • "yes:on_site:unsheltered": the person has access to an unsheltered bicycle parking at study location
    • "yes:on_site": the person has access to a bicycle parking at study location (unknown whether it is sheltered)
    • "yes:nearby:sheltered": the person has access to a sheltered bicycle parking nearby study location
    • "yes:nearby:unsheltered": the person has access to an unsheltered bicycle parking nearby study location
    • "yes:nearby": the person has access to a bicycle parking nearby study location (unknown whether it is sheltered)
    • "no": the person does not have access to a bicycle parking at or near study location
    • "no_answer": the person did not answer that question
  • Guarantees:
    • If professional_occupation is not "student", then the value is null.
    • If study_only_at_home is true, then the value is null.

Mobility

has_driving_license

Whether the person has a driving license (for car vehicles).

  • Modalities:
    • "yes": the person has a driving license
    • "no": the person does not have a driving license
    • "in_progress": the person is taking driving lessons or learning through accompanied driving (“conduite accompagnée”)
  • Guarantees:
    • If the value is "yes", then the person is not younger than 17.
    • If the value is "in_progress", then the person is not younger than 15.

has_motorcycle_driving_license

Whether the person has a driving license for motorcycles.

  • Modalities:
    • "yes": the person has a driving license for motorcycles
    • "no": the person does not have a driving license for motorcycles
    • "in_progress": the person is taking driving lessons
  • Guarantees:
    • If the value is "yes", then the person is not younger than 17.
    • If the value is "in_progress", then the person is not younger than 15.

has_public_transit_subscription

Whether the person owns a valid public-transit subscription.

Usually, the question asked is “did you have a valid public-transit subscription yesterday?” which means that the subscription was valid during the person’s surveyed trips.

  • Type: Boolean

public_transit_subscription

Type of public-transit subscription that the person owns.

  • Modalities:
    • "yes:free": the person owns a free public-transit subscription
    • "yes:paid:with_employer_contribution", the person owns a paid public-transit subscription that is partially borne by the employer
    • "yes:paid:without_employer_contribution", the person owns a paid public-transit subscription that is not borne by the employer
    • "yes:paid": the person owns a paid public-transit subscription (with unspecified cost bearing)
    • "yes:unspecified": the person owns a public-transit subscription with unspecified cost)
    • "no": the person does not own a public-transit subscription
  • Guarantees:
    • The values are consistent with has_public_transit_subscription.

has_car_sharing_subscription

Whether the person has a subscription for a car-sharing service (“autopartage”).

  • Type: Boolean

car_sharing_subscription

Type of car-sharing service subscription that the person has.

  • Modalities:
    • "yes:organized": the person has a car-sharing subscription for a short-term rental service proposed by a firm or a public organization (e.g., Citiz)
    • "yes:peer_to_peer": the person has a car-sharing subscription for a peer-to-peer service (“partage entre particuliers”)
    • "yes:unspecified": the person has a car-sharing subscription (no further details)
    • "no": the person does not have a car-sharing subscription
  • Guarantees:
    • The values are consistent with has_car_sharing_subscription.

has_bike_sharing_subscription

Whether the person has a subscription for a bike-sharing service (“vélo libre service”).

  • Type: Boolean

has_travel_inconvenience

Whether the person has reported having travel inconveniences (e.g., wheelchair, blindness, pregnancy).

  • Type: Boolean

Trip survey

is_surveyed

Whether the person was surveyed for their trips over a day (usually the previous day of the interview).

Note that a surveyed person might have no trip if they did not travel during that day.

  • Type: Boolean
  • Guarantees:
    • The value is not null.
    • When set to false, there is no trip and leg for this person.

traveled_during_surveyed_day

Whether the person performed at least one trip during the surveyed day (usually the day before the interview).

  • Modalities:
    • "yes": the person did at least one trip
    • "no": the person did not travel
    • "away": the person was away from home during that day
  • Guarantees:
    • The value is null if and only if is_surveyed is false.
    • There is at least one trip defined for this person if the value is "yes".
    • There is no trip defined for this person if the value is "no" or "away".

worked_during_surveyed_day

Whether the person worked during the surveyd day (usually the day before the interview).

  • Modalities:
    • "yes:outside": the person worked outside from home
    • "yes:home:usual": the person worked from home, as usual
    • "yes:home:telework": the person teleworked
    • "yes:home:other": the person worked from home for another reason than telework
    • "yes:unspecified": the person worked (with no specification where)
    • "no:weekday": the person never work during that weekday
    • "no:reason": the person did not work exceptionally due to holidays, sickness, strike, or any other reason
    • "no:unspecified": the person did not work, for unspecified reason
  • Guarantees:
    • If professional_occupation is not "worker", then the value is null.
    • If the value is "yes:home:usual", then work_only_at_home must be true.
    • If the value is "no:weekday", then there is not trip with work purpose for that person (for "no:reason" and "no:unspecified" it might happen that the person went to work and realised that they could not work because of a strike for example).
    • If the value is "yes:outside" and is_surveyed is true, then there is at least one trip with work purpose for that person.

nb_trips

Number of trips that the person performed.

  • Type: UInt8
  • Guarantees:
    • The value is null if and only if is_surveyed is false.
    • The value is equal to the number of trips in trips.parquet for the person.
    • If traveled_during_surveyed_day is "no" or "away", then the value is zero.
    • If traveled_during_surveyed_day is "yes", then the value is positive.

Sample weights

sample_weight_all

Sample weight of the person among all the persons interviewed.

The sum of the values is supposed to be approximately equal to the number of persons in the survey area.

  • Type: Float64
  • Guarantees:
    • The value is non-negative.

sample_weight_surveyed

Sample weight of the person among all the persons whose trips were surveyed.

The sum of the values is supposed to be approximately equal to the number of persons in the survey area. Note that the sum of sample_weight_surveyed might differ from the sum of sample_weight_all because the former usually excludes children below 5.

  • Type: Float64
  • Guarantees:
    • The value is non-negative.
    • If is_surveyed is false, then the value is null.

Trips

Sort order: trip_id

Indexing

trip_id

Unique identifier of the trip.

  • Type: UInt32
  • Guarantees:
    • Values range from 1 to the number of trips.

person_id

Identifier of the person that performed the trip.

  • Type: UInt32
  • Guarantees:
    • There exists a person with this person_id.
    • The value is not null.

household_id

Identifier of the household of the person that performed the trip.

  • Type: UInt32
  • Guarantees:
    • The value is not null.
    • The value is equal to the household_id value of the person with id person_id.

trip_index

Index of the trip among the person’s trips.

Trips with smaller index are performed first.

  • Type: UInt8
  • Guarantees:
    • Values are unique within a person and range from 1 to the number of trips performed by that person.
    • The value is not null.

first_trip

Whether the trip is the first one of the person.

  • Type: Boolean
  • Guarantees:
    • The value is not null.
    • The value is true if and only if trip_index is 1.

last_trip

Whether the trip is the last one of the person.

  • Type: Boolean
  • Guarantees:
    • The value is not null.
    • The value is true if and only if trip_index is equal to the number of trips for this person.

home_sequence_index

The cumulative number of times that the person has started a trip from their home over the course of a day.

This variable is designed to identify sequences of trips that begin and end at home (“home-based tours”).

The value starts at 0 and increments by 1 each time a trip begins with origin_purpose_group == "home".

Examples:

  1. Trips: home → workwork → home

    home_sequence_index: 1, 1

    (One tour starting and ending at home.)

  2. Trips: home → workwork → homehome → leisureleisure → home

    home_sequence_index: 1, 1, 2, 2

    (Two distinct tours, both home-based.)

  3. Trips: work → homehome → work

    home_sequence_index: 0, 1

    (The value is 0 if the first trip of the day is not from home.)

  • Type: UInt8
  • Guarantees:
    • The value is equal to the cumulative number of times that the trip’s origin purpose group is "home", over a person’s trips.

original_trip_id

Identifier of the trip in the original data.

  • Type: Struct whose fields depend on the survey

Purpose

origin_purpose

Purpose of the activity performed at the trip’s origin.

  • Modalities:
    • "home:main": the person is at their usual home location
    • "home:secondary": the person is at a secondary home
    • "work:declared": the person is working at the usual workplace
    • "work:telework": the person is working from home
    • "work:secondary": the person is working at a secondary workplace
    • "work:business_meal": the person is having a meal in a business context
    • "work:other": the person is working at another place
    • "work:professional_tour": the person is doing trips for a professional tour (“tournée professionnelle”)
    • "education:childcare": the person (child) is at a daycare / nursery school
    • "education:declared": the person is studying at their usual study location
    • "education:other": the person is studying at a different location
    • "shopping:daily": the person is shopping for daily needs (e.g., bread, newspaper)
    • "shopping:weekly": the person is shopping for daily needs (e.g., groceries)
    • "shopping:specialized": the person is shopping for occasional needs (e.g., bookstore, clothing)
    • "shopping:mall": the person is doing shopping in a mall (“centre commercial”)
    • "shopping:large_store": the person is doing shopping in a large store (“supermarché”, “hypermarché”)
    • "shopping:small_store": the person is doing shopping in a small store (“petit et moyen commerce”)
    • "shopping:market": the person is doing shopping in a market (“marché”)
    • "shopping:pickup": the person is picking up purchases from online shopping (“drive”, “point relais”)
    • "shopping:no_purchase": the person is visiting a store without doing any purchase
    • "shopping:tour_no_purchase": the person is doing a tour of stores with buying anything
    • "task:healthcare:hospital": the person is at a hospital for healthcare reasons
    • "task:healthcare:doctor": the person is at a medical appointment (not in a hospital)
    • "task:healthcare": other healthcare-related activities
    • "task:procedure": the person is doing an administrative procedure or other procedure (apart from finding a job)
    • "task:job_search": the person is finding a job
    • "task:other": other task activity
    • "leisure:sport_or_culture": the person is involved in sport, cultural, or associative activity
    • "leisure:walk_or_driving_lesson": the person is doing a walk (“promenade”) or taking driving lessons
    • "leisure:lunch_break": the person is having lunch before / after work
    • "leisure:restaurant": the person is having diner outside home
    • "leisure:visiting": the person is visiting relatives, friends, or any other person
    • "leisure:visiting:parents": the person is visiting relatives
    • "leisure:visiting:friends": the person is visiting friends
    • "leisure:other": other leisure activity
    • "escort:activity:drop_off": the person is dropping off someone to an activity
    • "escort:activity:pick_up": the person is picking up someone from an activity
    • "escort:transport:drop_off": the person is dropping off someone to a transportation mode
    • "escort:transport:pick_up": the person is picking up someone from a transportation mode
    • "escort:unspecified:drop_off": the person is dropping off someone (either to an activity or a transportation mode)
    • "escort:unspecified:pick_up": the person is picking up someone (either from an activity or a transportation mode)
    • "other": other purpose not in the list
  • Guarantees:
    • If the person’s professional_occupation is not "worker", then the purpose is not "work:declared"
    • If the person’s professional_occupation is not "student", then the purpose is not "education:primary", "education:middle_school", "education:high_school", or "education:higher".

origin_purpose_group

Purpose group of the activity performed at the trip’s origin.

  • Modalities:
    • "home"
    • "work"
    • "education"
    • "shopping"
    • "task"
    • "leisure"
    • "escort"
    • "other"
  • Guarantees:
    • The values are consistent with origin_purpose.
    • If origin_purpose is not null, then the value is not null.

origin_activity_duration

Duration of the activity performed at the trip’s origin, in minutes.

If this is the first trip of the day, the value is null. Otherwise, the value is equal to the difference between the departure time of this trip and the arrival time of the previous trip.

  • Type: UInt16
  • Guarantees:
    • If first_trip is true, then the value is null.
    • The value is equal to the difference between departure_time for the current trip and arrival_time for the previous trip.

destination_purpose

Purpose of the activity performed at the trip’s destination.

Note that in most cases, the destination purpose should be equal to the origin purpose of the next trip (if any). Rare exceptions can occur when someone is moving to a different location while the activity is performed (e.g., for bus drivers). MobiSurvStd will show warning messages indicating how many trips does not match the constraint.

destination_purpose_group

Purpose group of the activity performed at the trip’s destination.

  • Modalities:
    • "home"
    • "work"
    • "education"
    • "shopping"
    • "task"
    • "leisure"
    • "escort"
    • "other"
  • Guarantees:
    • The values are consistent with destination_purpose.
    • If destination_purpose is not null, then the value is not null.

destination_activity_duration

Duration of the activity performed at the trip’s destination, in minutes.

If this is the last trip of the day, the value is null. Otherwise, the value is equal to the difference between the arrival time of the next trip and the departure time of this trip (i.e., it is equal to the origin_activity_duration value of the next trip).

  • Type: UInt16
  • Guarantees:
    • If last_trip is true, then the value is null.
    • The value is equal to the difference between departure_time for the next trip and arrival_time for the current trip.

Escorting

origin_escort_purpose

Purpose of the activity performed at the trip’s origin by the person who is escorted.

  • Modalities:
    • Same modalities as origin_purpose, excluding all the "escort:*" purposes.
  • Guarantees:
    • If origin_purpose_group is not "escort", then the value is null.

origin_escort_purpose_group

Purpose group of the activity performed at the trip’s origin by the person who is escorted.

  • Modalities:
    • "home"
    • "work"
    • "education"
    • "shopping"
    • "task"
    • "leisure"
    • "other"
  • Guarantees:
    • The values are consistent with origin_escort_purpose.

destination_escort_purpose

Purpose of the activity performed at the trip’s destination by the person who is escorted.

Note that in most cases, the destination escort purpose should be equal to the origin escort purpose of the next trip (if any). Rare exceptions can occur when someone is moving to a different location while the activity is performed (e.g., for bus drivers). MobiSurvStd will show warning messages indicating how many trips does not match the constraint.

  • Modalities:
    • Same modalities as origin_purpose, excluding all the "escort:*" purposes.
  • Guarantees:
    • If destination_purpose_group is not "escort", then the value is null.

destination_escort_purpose_group

Purpose group of the activity performed at the trip’s destination by the person who is escorted.

  • Modalities:
    • "home"
    • "work"
    • "education"
    • "shopping"
    • "task"
    • "leisure"
    • "other"
  • Guarantees:
    • The values are consistent with destination_escort_purpose.

Origin location

origin_lng

Longitude of the trip’s origin.

The accuracy depends on the survey type. For EGT surveys, the coordinates are guaranteed to be within 100 meters of the actual location. For other surveys, the coordinates represent the centroid of origin_detailed_zone (or the exact coordinates defined by origin_special_location when it is non-null).

  • Type: Float64

origin_lat

Latitude of the trip’s origin.

See origin_lng for details on the accuracy of the value.

  • Type: Float64

origin_special_location

Identifier of the special location of the trip’s origin.

  • Type: UInt8
  • Guarantees:
    • The origin special location intersects with the origin detailed zone, draw zone, and INSEE zone (only checked if the zones are known).

origin_detailed_zone

Identifier of the detailed zone of the trip’s origin.

  • Type: UInt8
  • Guarantees:
    • The origin detailed zone intersects with the origin draw zone and INSEE zone (only checked if the zones are known).

origin_draw_zone

Identifier of the draw zone of the trip’s origin.

  • Type: UInt8
  • Guarantees:
    • The origin detailed zone intersects with the origin draw zone and INSEE zone (only checked if the zones are known).

origin_insee

INSEE code of the municipality of the trip’s origin.

origin_insee_name

Name of the municipality of the trip’s origin.

  • Type: String

origin_insee_density

Density category of the origin INSEE municipality.

Density categories are defined by INSEE.

  • Modalities:
    • 1: “commune densément peuplée”
    • 2: “centre urbain intermédiaire”
    • 3: “ceinture urbaine”
    • 4: “petite ville”
    • 5: “bourg rural”
    • 6: “rural à habitat dispersé”
    • 7: “rural à habitat très dispersé”

origin_insee_aav_type

Category of the origin INSEE municipality within its “aire d’attraction des villes” (AAV).

The modalities follow the codes proposed by INSEE.

  • Modalities:
    • 11: “Commune-centre”
    • 12: “Autre commune du pôle principal”
    • 13: “Commune d’un pôle secondaire”
    • 20: “Commune de la couronne”
    • 30: “Commune hors attraction des villes”

origin_aav

Code of the “aire d’attraction des villes” (AAV) of the trip’s origin.

  • Type: String

origin_aav_name

Name of the “aire d’attraction des villes” (AAV) of the trip’s origin.

  • Type: String

origin_aav_category

Category of the “aire d’attraction des villes” (AAV) of the trip’s origin.

  • Modalities:
    • 1: Paris AAV
    • 2: area with more than 700,000 inhabitants, excluding Paris (“aire de 700 000 habitants ou plus (hors Paris)”)
    • 3: area between 200,000 and 700,000 inhabitants (“aire de 200 000 à moins de 700 000 habitants”)
    • 4: area between 50,000 and 200,000 inhabitants (“aire de 50 000 à moins de 200 000 habitants”)
    • 5: area with less than 50,000 inhabitants (“aire de moins de 50 000 habitants”)

origin_dep

Département code of the trip’s origin.

  • Type: String
  • Guarantees:
    • The value is a valid département code.
    • If origin_insee is not null, then the value is equal to the département of the origin INSEE municipality.

origin_dep_name

Name of the département of the trip’s origin.

  • Type: String
  • Guarantees:
    • The value is consistent with origin_dep.

origin_nuts2

NUTS 2 code of the trip’s origin.

In France, NUTS 2 corresponds to the 22 old administrative regions (and 5 overseas departments).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 2 code.
    • If origin_dep is not null, then the value is equal to the NUTS 2 code corresponding to the origin département.

origin_nuts2_name

Name of the NUTS 2 region of the trip’s origin.

  • Type: String
  • Guarantees:
    • The value is consistent with origin_nuts2.

origin_nuts1

NUTS 1 code of the trip’s origin.

In France, NUTS 1 corresponds to the 13 administrative regions (and 1 overseas region).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 1 code.
    • If origin_nuts2 is not null, then the value is equal to the NUTS 1 code corresponding to the origin NUTS 2.

origin_nuts1_name

Name of the NUTS 1 region of the trip’s origin.

  • Type: String
  • Guarantees:
    • The value is consistent with origin_nuts1.

Destination location

destination_lng

Longitude of the trip’s destination.

See origin_lng for details on the accuracy of the value.

  • Type: Float64

destination_lat

Latitude of the trip’s destination.

See origin_lng for details on the accuracy of the value.

  • Type: Float64

destination_special_location

Identifier of the special location of the trip’s destination.

Note that in most cases, the destination special location should be equal to the origin special location of the next trip (if any). Rare exceptions can occur when someone is moving to a different location while the activity is performed (e.g., for bus drivers). MobiSurvStd will show warning messages indicating how many trips does not match the constraint.

  • Type: UInt8
  • Guarantees:
    • The destination special location intersects with the destination detailed zone, draw zone, and INSEE zone (only checked if the zones are known).

destination_detailed_zone

Identifier of the detailed zone of the trip’s destination.

Note that in most cases, the destination detailed zone should be equal to the origin detailed zone of the next trip (if any). Rare exceptions can occur when someone is moving to a different location while the activity is performed (e.g., for bus drivers). MobiSurvStd will show warning messages indicating how many trips does not match the constraint.

  • Type: UInt8
  • Guarantees:
    • The destination detailed zone intersects with the destination draw zone and INSEE zone (only checked if the zones are known).

destination_draw_zone

Identifier of the draw zone of the trip’s destination.

Note that in most cases, the destination draw zone should be equal to the origin draw zone of the next trip (if any). Rare exceptions can occur when someone is moving to a different location while the activity is performed (e.g., for bus drivers). MobiSurvStd will show warning messages indicating how many trips does not match the constraint.

  • Type: UInt8
  • Guarantees:
    • The destination detailed zone intersects with the destination draw zone and INSEE zone (only checked if the zones are known).

destination_insee

INSEE code of the municipality of the trip’s destination.

Note that in most cases, the destination INSEE code should be equal to the origin INSEE code of the next trip (if any). Rare exceptions can occur when someone is moving to a different location while the activity is performed (e.g., for bus drivers). MobiSurvStd will show warning messages indicating how many trips does not match the constraint.

destination_insee_name

Name of the municipality of the trip’s destination.

  • Type: String

destination_insee_density

Density category of the destination INSEE municipality.

Density categories are defined by INSEE.

  • Modalities:
    • 1: “commune densément peuplée”
    • 2: “centre urbain intermédiaire”
    • 3: “ceinture urbaine”
    • 4: “petite ville”
    • 5: “bourg rural”
    • 6: “rural à habitat dispersé”
    • 7: “rural à habitat très dispersé”

destination_insee_aav_type

Category of the destination INSEE municipality within its “aire d’attraction des villes” (AAV).

The modalities follow the codes proposed by INSEE.

  • Modalities:
    • 11: “Commune-centre”
    • 12: “Autre commune du pôle principal”
    • 13: “Commune d’un pôle secondaire”
    • 20: “Commune de la couronne”
    • 30: “Commune hors attraction des villes”

destination_aav

Code of the “aire d’attraction des villes” (AAV) of the trip’s destination.

  • Type: String

destination_aav_name

Name of the “aire d’attraction des villes” (AAV) of the trip’s destination.

  • Type: String

destination_aav_category

Category of the “aire d’attraction des villes” (AAV) of the trip’s destination.

  • Modalities:
    • 1: Paris AAV
    • 2: area with more than 700,000 inhabitants, excluding Paris (“aire de 700 000 habitants ou plus (hors Paris)”)
    • 3: area between 200,000 and 700,000 inhabitants (“aire de 200 000 à moins de 700 000 habitants”)
    • 4: area between 50,000 and 200,000 inhabitants (“aire de 50 000 à moins de 200 000 habitants”)
    • 5: area with less than 50,000 inhabitants (“aire de moins de 50 000 habitants”)

destination_dep

Département code of the trip’s destination.

  • Type: String
  • Guarantees:
    • The value is a valid département code.
    • If destination_insee is not null, then the value is equal to the département of the destination INSEE municipality.

destination_dep_name

Name of the département of the trip’s destination.

  • Type: String
  • Guarantees:
    • The value is consistent with destination_dep.

destination_nuts2

NUTS 2 code of the trip’s destination.

In France, NUTS 2 corresponds to the 22 old administrative regions (and 5 overseas departments).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 2 code.
    • If destination_dep is not null, then the value is equal to the NUTS 2 code corresponding to the destination département.

destination_nuts2_name

Name of the NUTS 2 region of the trip’s destination.

  • Type: String
  • Guarantees:
    • The value is consistent with destination_nuts2.

destination_nuts1

NUTS 1 code of the trip’s destination.

In France, NUTS 1 corresponds to the 13 administrative regions (and 1 overseas region).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 1 code.
    • If destination_nuts2 is not null, then the value is equal to the NUTS 1 code corresponding to the destination NUTS 2.

destination_nuts1_name

Name of the NUTS 1 region of the trip’s destination.

  • Type: String
  • Guarantees:
    • The value is consistent with destination_nuts1.

Timing

departure_time

Departure time from origin, in number of minutes after midnight.

  • Type: UInt16
  • Guarantees:
    • The value is larger than departure_time values of the person’s trips with a smaller trip_index.

arrival_time

Arrival time at destination, in number of minutes after midnight.

  • Type: UInt16
  • Guarantees:
    • The value is not smaller than departure_time.
    • The value is not larger than the departure_time values of the next trip (if any).

travel_time

Travel time of the trip, in minutes.

  • Type: UInt16
  • Guarantees:
    • The value is equal to arrival_time - departure_time.

trip_date

Date at which the trip took place.

  • Type: Date
  • Guarantees:
    • The value cannot be later than the household’s interview_date.

trip_weekday

Day of the week when the trip took place.

  • Modalities:
    • "monday"
    • "tuesday"
    • "wednesday"
    • "thursday"
    • "friday"
    • "saturday"
    • "sunday"
  • Guarantees:
    • The value is consistent with trip_date.

Transportation mode

main_mode

Main mode of transportation used for the trip.

In case of intermodality, there is no clear rule how the main mode is defined.

  • Modalities:
    • "walking"
    • "bicycle:driver": driver of a bicycle (traditional or electric)
    • "bicycle:driver:shared": driver of a bicycle (traditional or electric) from a shared service
    • "bicycle:driver:traditional": driver of a traditional bicycle
    • "bicycle:driver:traditional:shared": driver of a traditional bicycle from a shared service
    • "bicycle:driver:electric": driver of an electric bicycle
    • "bicycle:driver:electric:shared": driver of an electric bicycle from a shared service
    • "bicycle:passenger": passenger on a (unspecified) bicycle
    • "motorcycle:driver": driver of a motorcycle (unspecified size)
    • "motorcycle:passenger": passenger on a motorcycle (unspecified size)
    • "motorcycle:driver:moped": driver of a small motorcycle (< 50 cm³)
    • "motorcycle:passenger:moped": passenger on a small motorcycle (< 50 cm³)
    • "motorcycle:driver:moto": driver of a large motorcycle (≥ 50 cm³)
    • "motorcycle:passenger:moto": passenger on a large motorcycle (≥ 50 cm³)
    • "car:driver": driver of a car
    • "car:passenger": passenger in a car
    • "taxi": passenger in a taxi
    • "VTC": passenger in a VTC
    • "taxi_or_VTC": passenger in a taxi or VTC
    • "public_transit:urban": passenger in a (unspecified) public-transit vehicle (in urban context)
    • "public_transit:urban:bus": passenger in a bus
    • "public_transit:urban:coach": passenger in a coach (“autocar”), excluding long-distance trips
    • "public_transit:urban:tram": passenger in a tramway
    • "public_transit:urban:metro": passenger in a metro
    • "public_transit:urban:rail": passenger in an express rail service (e.g., RER)
    • "public_transit:urban:TER": passenger in a TER
    • "public_transit:urban:demand_responsive": passenger in a demand-responsive service
    • "public_transit:interurban:coach": passenger in an interurban coach (“autocar”)
    • "public_transit:interurban:TGV": passenger in a TGV
    • "public_transit:interurban:intercités": passenger in an Intercités
    • "public_transit:interurban:other_train": passenger in another train type
    • "public_transit:school": passenger in a school transport line (“ramassage scolaire”)
    • "reduced_mobility_transport": passenger in a specialized transport for persons with reduced mobility
    • "employer_transport": passenger in a transport service provided by the employer
    • "truck:driver": driver of a truck (“fourgon”, “camionnette”, “camion”)
    • "truck:passenger": passenger of a truck (“fourgon”, “camionnette”, “camion”)
    • "water_transport": waterway or maritime transport
    • "airplane"
    • "wheelchair"
    • "personal_transporter:non_motorized": non-motorized personal transporter (“trottinette”, “skateboard”, “roller”, etc.)
    • "personal_transporter:motorized": motorized personal transporter (“trottinette électrique”, “segway”, “solowheel”, etc.)
    • "personal_transporter:unspecified": personal transporter (unspecified motorization)
    • "other": other transport mode
  • Guarantees:
    • There is at least one leg with that mode for the trip.

main_mode_group

Mode group of the main mode of transportation used for the trip.

  • Modalities:
    • "walking": walking, excluding wheelchair and personal transporter
    • "bicycle": bicycle (traditional or electric, driver or passenger, personal or shared)
    • "motorcycle": motorcycle (small and large, driver or passenger)
    • "car_driver": car as a driver
    • "car_passenger": car as a passenger (including taxi and VTC)
    • "public_transit": any form of public transit (excluding employer transport)
    • "other": all other modes
  • Guarantees:
    • The values are consistent with main_mode.

intermodality

Whether the trip involved using two different modes of transportation.

Note that combining walking with another transportation mode is not classified as intermodality and combining various public-transit modes (e.g., bus then metro) is not either.

  • Type: Boolean
  • Guarantees:
    • If the value is true, then there is at least two legs with different mode_group (excluding walking legs).

public_transit_access_mode

Mode of transportation used for the access part of the trip (for public-transit trip).

  • Modalities:
    • Same modalities as main_mode (excluding all public-transit modes).
  • Guarantees:
    • If main_mode_group is not "public_transit", then the value is null.
    • The value is equal to the mode of the first leg of the trip.

public_transit_access_mode_group

Mode group of the transportation mode used for the access part of the trip (for public-transit trip).

  • Modalities:
  • Guarantees:
    • If main_mode_group is not "public_transit", then the value is null.
    • The value is consistent with public_transit_access_mode.

public_transit_egress_mode

Mode of transportation used for the egress part of the trip (for public-transit trip).

  • Modalities:
    • Same modalities as main_mode (excluding all public-transit modes).
  • Guarantees:
    • If main_mode_group is not "public_transit", then the value is null.
    • The value is equal to the mode of the last leg of the trip.

public_transit_egress_mode_group

Mode group of the transportation mode used for the egress part of the trip (for public-transit trip).

  • Modalities:
  • Guarantees:
    • If main_mode_group is not "public_transit", then the value is null.
    • The value is consistent with public_transit_egress_mode.

Distances

trip_euclidean_distance_km

Euclidean distance between the trip’s origin and destination, in kilometers.

  • Type: Float64
  • Guarantees:
    • All values are non-negative.

trip_travel_distance_km

Travel distance of the trip, in kilometers.

This is usually a distance on the road network. The details regardings how this value is computed depends on the surveys.

  • Type: Float64
  • Guarantees:
    • All values are non-negative.
    • The value is not small than trip_euclidean_distance_km.

intra_municipality

Whether the INSEE municipality of the trip’s origin is equal to the INSEE municipality of the trip’s destination.

  • Type: Boolean
  • Guarantees:
    • If the value is true, then origin_insee is equal to destination_insee.

intra_aav

Whether the AAV of the trip’s origin is equal to the AAV of the trip’s destination.

  • Type: Boolean
  • Guarantees:
    • If the value is true, then origin_aav is equal to destination_aav.

intra_dep

Whether the département of the trip’s origin is equal to the département of the trip’s destination.

  • Type: Boolean
  • Guarantees:
    • If the value is true, then origin_dep is equal to destination_dep.

trip_perimeter

Perimiter in which the trip is taking place relative to the survey area.

  • Modalities:
    • "internal": the trip is starting and ending within the survey area
    • "crossing": the trip is either starting or ending within the survey area
    • "external": the trip is not starting nor ending within the survey area
  • Guarantees:
    • The value must be consistent with the trip’s origin and destination (only checked when the zones are known).

Leg / stop counts

nb_tour_stops

Number of stops for trips representing tours.

  • Type: UInt8
  • Guarantees:
    • If neither origin_purpose nor destination_purpose is "work:professional_tour" or "shopping:tour_no_purchase", then the value is null.

nb_legs

Number of legs that this trip is composed of.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is positive.
    • The value is equal to the number of legs in legs.parquet for that trip.

nb_legs_walking

Number of legs with mode group "walking" in the trip.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is equal to the number of legs in the trip whose mode_group is "walking".

nb_legs_bicycle

Number of legs with mode group "bicycle" in the trip.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is equal to the number of legs in the trip whose mode_group is "bicycle".

nb_legs_motorcycle

Number of legs with mode group "motorcycle" in the trip.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is equal to the number of legs in the trip whose mode_group is "motorcycle".

nb_legs_car_driver

Number of legs with mode group "car_driver" in the trip.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is equal to the number of legs in the trip whose mode_group is "car_driver".

nb_legs_car_passenger

Number of legs with mode group "car_passenger" in the trip.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is equal to the number of legs in the trip whose mode_group is "car_passenger".

nb_legs_public_transit

Number of legs with mode group "public_transit" in the trip.

For public-transit trips, the number of transfers is thus nb_legs_public_transit - 1.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is equal to the number of legs in the trip whose mode_group is "public_transit".

nb_legs_other

Number of legs with mode group "other" in the trip.

  • Type: UInt8
  • Guarantees:
    • The value is not null.
    • The value is equal to the number of legs in the trip whose mode_group is "other".

Legs

Sort order: leg_id

Indexing

leg_id

Unique identifier of the leg.

  • Type: UInt32
  • Guarantees:
    • Values range from 1 to the number of legs.

trip_id

Identifier of the trip the leg is a part of.

  • Type: UInt32
  • Guarantees:
    • There exists a trip with this trip_id.
    • The value is not null.

person_id

Identifier of the person that performed the leg.

  • Type: UInt32
  • Guarantees:
    • The value is not null.
    • The value is equal to the person_id value of the trip with id trip_id.

household_id

Identifier of the household of the person that performed the leg.

  • Type: UInt32
  • Guarantees:
    • The value is not null.
    • The value is equal to the household_id value of the person with id person_id.

leg_index

Index of the leg among the trip’s legs.

Legs with smaller index are performed first.

  • Type: UInt8
  • Guarantees:
    • Values are unique within a trip and range from 1 to the number of legs in that trip.
    • The value is not null.

first_leg

Whether the leg is the first one of the trip.

  • Type: Boolean
  • Guarantees:
    • The value is not null.
    • The value is true if and only if leg_index is 1.

last_leg

Whether the leg is the last one of the trip.

  • Type: Boolean
  • Guarantees:
    • The value is not null.
    • The value is true if and only if leg_index is equal to the number of legs in the trip.

original_leg_id

Identifier of the leg in the original data.

  • Type: Struct whose fields depend on the survey

Transportation mode

mode

Mode of transportation used to perform the leg.

mode_group

Mode group of the mode of transportation used to perform the leg.

  • Modalities:
    • "walking": walking, excluding wheelchair and personal transporter
    • "bicycle": bicycle (traditional or electric, driver or passenger, personal or shared)
    • "motorcycle": motorcycle (small and large, driver or passenger)
    • "car_driver": car as a driver
    • "car_passenger": car as a passenger (including taxi and VTC)
    • "public_transit": any form of public transit (excluding employer transport)
    • "other": all other modes
  • Guarantees:
    • The values are consistent with mode.

public_transit_line

Local name of the public-transit line taken, for public-transit legs.

The way public-transit lines’ names are defined depends on the survey type.

  • Type: String
  • Modalities:
    • If mode_group is not "public_transit", then the value is null.

Start location

start_lng

Longitude of the leg’s start point.

The accuracy depends on the survey type. For EGT surveys, the coordinates are guaranteed to be within 100 meters of the actual location. For other surveys, the coordinates represent the centroid of start_detailed_zone (or the exact coordinates defined by start_special_location when it is non-null).

  • Type: Float64

start_lat

Latitude of the leg’s start point.

See start_lng for details on the accuracy of the value.

  • Type: Float64

start_special_location

Identifier of the special location corresponding to the leg start point.

  • Type: UInt32
  • Guarantees:
    • The start special location intersects with the start detailed zone, draw zone, and INSEE zone (only checked if the zones are known).

start_detailed_zone

Identifier of the detailed zone corresponding to the leg start point.

  • Type: UInt32
  • Guarantees:
    • The start detailed zone intersects with the start draw zone and INSEE zone (only checked if the zones are known).

start_draw_zone

Identifier of the draw zone corresponding to the leg start point.

  • Type: UInt32
  • Guarantees:
    • The start detailed zone intersects with the start draw zone and INSEE zone (only checked if the zones are known).

start_insee

INSEE code of the municipality corresponding to the leg start point.

start_insee_name

Name of the municipality corresponding to the leg start point.

  • Type: String

start_dep

Département code of the leg start point.

  • Type: String
  • Guarantees:
    • The value is a valid département code.
    • If start_insee is not null, then the value is equal to the département of the start point INSEE municipality.

start_dep_name

Name of the département of the leg start point.

  • Type: String
  • Guarantees:
    • The value is consistent with start_dep.

start_nuts2

NUTS 2 code of the leg start point.

In France, NUTS 2 corresponds to the 22 old administrative regions (and 5 overseas departments).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 2 code.
    • If start_dep is not null, then the value is equal to the NUTS 2 code corresponding to the start point département.

start_nuts2_name

Name of the NUTS 2 region of the leg start point.

  • Type: String
  • Guarantees:
    • The value is consistent with start_nuts2.

start_nuts1

NUTS 1 code of the leg start point.

In France, NUTS 1 corresponds to the 13 administrative regions (and 1 overseas region).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 1 code.
    • If start_nuts2 is not null, then the value is equal to the NUTS 1 code corresponding to the start point NUTS 2.

start_nuts1_name

Name of the NUTS 1 region of the leg start point.

  • Type: String
  • Guarantees:
    • The value is consistent with start_nuts1.

End location

end_lng

Longitude of the leg’s end point.

See start_lng for details on the accuracy of the value.

  • Type: Float64

end_lat

Latitude of the leg’s end point.

See start_lng for details on the accuracy of the value.

  • Type: Float64

end_special_location

Identifier of the special location corresponding to the leg end point.

Note that in most cases, the end special location should be equal to the start special location of the next leg in the trip (if any). Exceptions can occur when two special locations are so closed that the person walked very quickly from one to the other and did not report that as a dedicate leg. MobiSurvStd will show warning messages indicating how many legs does not match the constraint.

  • Type: UInt32
  • Guarantees:
    • The end special location intersects with the end detailed zone, draw zone, and INSEE zone (only checked if the zones are known).

end_detailed_zone

Identifier of the detailed zone corresponding to the leg end point.

  • Type: UInt32
  • Guarantees:
    • The end detailed zone intersects with the end draw zone and INSEE zone (only checked if the zones are known).
    • The value is equal to the start_detailed_zone of the next leg (if any).

end_draw_zone

Identifier of the draw zone corresponding to the leg end point.

  • Type: UInt32
  • Guarantees:
    • The end detailed zone intersects with the end draw zone and INSEE zone (only checked if the zones are known).
    • The value is equal to the start_draw_zone of the next leg (if any).

end_insee

INSEE code of the municipality corresponding to the leg end point.

  • Type: String
  • Guarantees:
    • String is a valid INSEE code.
    • The value is equal to the start_insee_zone of the next leg (if any).

end_insee_name

Name of the municipality corresponding to the leg end point.

  • Type: String

end_dep

Département code of the leg end point.

  • Type: String
  • Guarantees:
    • The value is a valid département code.
    • If end_insee is not null, then the value is equal to the département of the end point INSEE municipality.

end_dep_name

Name of the département of the leg end point.

  • Type: String
  • Guarantees:
    • The value is consistent with end_dep.

end_nuts2

NUTS 2 code of the leg end point.

In France, NUTS 2 corresponds to the 22 old administrative regions (and 5 overseas departments).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 2 code.
    • If end_dep is not null, then the value is equal to the NUTS 2 code corresponding to the end point département.

end_nuts2_name

Name of the NUTS 2 region of the leg end point.

  • Type: String
  • Guarantees:
    • The value is consistent with end_nuts2.

end_nuts1

NUTS 1 code of the leg end point.

In France, NUTS 1 corresponds to the 13 administrative regions (and 1 overseas region).

  • Type: String
  • Guarantees:
    • The value is a valid NUTS 1 code.
    • If end_nuts2 is not null, then the value is equal to the NUTS 1 code corresponding to the end point NUTS 2.

end_nuts1_name

Name of the NUTS 1 region of the leg end point.

  • Type: String
  • Guarantees:
    • The value is consistent with end_nuts1.

Time and distance

leg_travel_time

Travel time spent for this leg, in minutes.

Usually, one can expect that the sum of leg_travel_time for all the legs of a trip is not larger than the travel_time value of the trip. In parctice, that constraint is not always satisfied due to miss-recorded travel times. MobiSurvStd will show warning messages indicating how many trips does not match the constraint.

  • Type: UInt32
  • Guarantees:
    • The value is positive.
    • The sum of leg_travel_time for the legs of a trip is not larger than the travel_time value of the trip.

leg_euclidean_distance_km

Euclidean distance between the leg’s start and stop points, in kilometers.

  • Type: Float64
  • Guarantees:
    • All values are non-negative.

leg_travel_distance_km

Travel distance of the leg, in kilometers.

This is usually a distance on the road network. The details regardings how this value is computed depends on the surveys.

  • Type: Float64
  • Guarantees:
    • All values are non-negative.
    • The value is not small than leg_euclidean_distance_km.

Car

car_type

Type of car used for the leg.

  • Modalities:
    • "household": the car used for the leg is a car owned by the household, whose characteristics are reported in cars.parquet
    • "other_household": the car used for the leg is a car owned by the household, whose characteristics have not been reported.
    • "rental": the car used for the leg is a rental car (“véhicule de location”)
    • "company": the car used for the leg is a car lended by the person’s employer
    • "shared": the car used for the leg is a car from a car-sharing service
    • "other": other cases
  • Guarantees:
    • If mode is not car:driver or car:passenger, then the value is null.
    • If the value is "other_household", then the household must have at least one car whose characteristics are unknown (i.e., household variable nb_cars is larger than the number of cars with reported characteristics).

car_id

Identifier of the car used to perform the leg.

  • Type: UInt32
  • Guarantees:
    • The value is non-null if and only if car_type is "household".
    • There is a car with the corresponding identifier in cars.parquet.
    • The corresponding car is owned by the household of the person who performed the leg.

nolicense_car

Whether the car used for the leg was a no-license car (“voiture sans permis”).

  • Type: Boolean
  • Guarantees:
    • If mode is not car:driver, then the value is null.

Motorcycle

motorcycle_type

Type of motorcycle used for the leg.

  • Modalities:
    • "household": the motorcycle used for the leg is a motorcycle owned by the household, whose characteristics are reported in motorcycles.parquet
    • "other_household": the motorcycle used for the leg is a motorcycle owned by the household, whose characteristics have not been reported.
    • "rental": the motorcycle used for the leg is a rental motorcycle (“moto de location”)
    • "company": the motorcycle used for the leg is a motorcycle lended by the person’s employer
    • "shared": the motorcycle used for the leg is a motorcycle from a motorcycle-sharing service
    • "other": other cases
  • Guarantees:
    • If mode_group is not motorcycle, then the value is null.
    • If the value is "other_household", then the household must have at least one motorcycle whose characteristics are unknown (i.e., household variable nb_motorcycles is larger than the number of motorcycles with reported characteristics).

motorcycle_id

Identifier of the motorcycle used to perform the leg.

  • Type: UInt32
  • Guarantees:
    • The value is non-null if and only if motorcycle_type is "household".
    • There is a motorcycle with the corresponding identifier in motorcycles.parquet.
    • The corresponding motorcycle is owned by the household of the person who performed the leg.

Vehicle Occupancy

nb_persons_in_vehicle

Number of persons that were present in the vehicle used.

  • Type: UInt8
  • Guarantees:
    • The value is positive.
    • If mode does not use a personal vehicle (car, motorcycle, bicycle, truck, personal transporter), then the value is null.
    • If mode is passenger related ("car:passenger", "motorcycle:passenger", etc.), then the value is at least 2.

nb_majors_in_vehicle

Number of majors (age ≥ 18) that were present in the vehicle used.

  • Type: UInt8
  • Guarantees:
    • If mode does not use a personal vehicle (car, motorcycle, bicycle, truck, personal transporter), then the value is null.
    • The value is not larger than nb_persons_in_vehicle.
    • If the person is major, then the value is at least 1.

nb_minors_in_vehicle

Number of minors (age < 18) that were present in the vehicle used.

  • Type: UInt8
  • Guarantees:
    • If mode does not use a personal vehicle (car, motorcycle, bicycle, truck, personal transporter), then the value is null.
    • The value is not larger than nb_persons_in_vehicle.
    • If nb_persons_in_vehicle and nb_majors_in_vehicle are non-null, then the value is nb_persons_in_vehicle - nb_majors_in_vehicle.
    • If the person is minor, then the value is at least 1.

nb_household_members_in_vehicle

Number of persons in the vehicle used that belong to the person’s household.

  • Type: UInt8
  • Guarantees:
    • The value is positive.
    • If mode does not use a personal vehicle (car, motorcycle, bicycle, truck, personal transporter), then the value is null.
    • The value is not larger than nb_persons_in_vehicle.

nb_non_household_members_in_vehicle

Number of persons in the vehicle used that do not belong to the person’s household.

  • Type: UInt8
  • Guarantees:
    • If mode does not use a personal vehicle (car, motorcycle, bicycle, truck, personal transporter), then the value is null.
    • The value is not larger than nb_persons_in_vehicle.
    • If nb_persons_in_vehicle and nb_household_members_in_vehicle are non-null, then the value is nb_persons_in_vehicle - nb_household_members_in_vehicle.

in_vehicle_person_ids

Identifiers of the person that were present in the vehicle for this leg.

  • Type: List of UInt32
  • Guarantees:
    • If mode does not use a personal vehicle (car, motorcycle, bicycle, truck, personal transporter), then the value is null.
    • The list includes the id of the current person.
    • The number of elements in the list is equal to nb_household_members_in_vehicle.
    • All values are valid ids of persons belonging to the same household as the current person.

Parking

parking_location

Location type where the car was parked at the end of the leg.

  • Modalities:
    • "stop_only": the car was only stopped temporarily and not parked
    • "garage": the car was parked in a private garage
    • "street": the car was parked in the street
    • "parking_lot": the car was park in an parking lot (no further specification)
    • "parking_lot:unsheltered": the car was park in an unsheltered parking lot
    • "parking_lot:sheltered": the car was park in a sheltered parking lot
    • "P+R": the car was park in a Park and Ride (P+R)
    • "none": TODO
    • "other": other parking location
  • Guarantees:
    • If mode does not use a personal vehicle (car, motorcycle, bicycle, truck, personal transporter), then the value is null.

parking_type

Type of parking (paid or free) used to park the car.

  • Modalities:
    • "forbidden": the car was parked in a forbidden location
    • "free": the car was parked in a free location
    • "paid": the car was parked in a paid location, the person paid
    • "paid_by_other": the car was parked in a paid location, someone else paid
    • "other": other types
  • Guarantees:
    • If parking_location is "stop_only", "none" or null, then the value is null.

parking_search_time

Time spent searching for a parking location, in minutes.

  • Type: UInt32
  • Guarantees:
    • If mode does not use a personal vehicle (car, motorcycle, bicycle, truck, personal transporter), then the value is null.

Cars

Sort order: car_id

Indexing

car_id

Unique identifier of the car.

  • Type: UInt32
  • Guarantees:
    • Values range from 1 to the number of cars.

household_id

Identifier of the household which owns that car.

  • Type: UInt32
  • Guarantees:
    • There exists a household with this household_id.
    • The value is not null.

car_index

Index of the car among the household’s cars.

  • Type: UInt8
  • Guarantees:
    • Values are unique within a household and range from 1 to the number of cars (whose characteristics are known) for that household.
    • The value is not null.

original_car_id

Identifier of the car in the original data.

  • Type: Struct whose fields depend on the survey

Characteristics

type

Type of car / vehicle.

  • Modalities:
    • "passenger_car": a standard car (“véhicule de tourisme”)
    • "recreational_car": “camping-car” and similar
    • "utility_car": “véhicule utilitaire” (usually defined as having a payload larger than 800kg)
    • "license_free_car": a car that does not require a driving license to be driven

fuel_type

Fuel type that the car is using.

  • Modalities:
    • "thermic:petrol": “essence” (“sans plomb” or “super”)
    • "thermic:diesel": “diesel”
    • "thermic:gas": “gaz”
    • "electric": “électrique”
    • "hybrid:regular": “hybride non-rechargeable” (unspecified engine type)
    • "hybrid:regular:petrol": “hybride non-rechargeable” (petrol engine)
    • "hybrid:regular:diesel": “hybride non-rechargeable” (diesel engine)
    • "hybrid:plug-in": “hybride rechargeable”
    • "hybrid:unspecified": “hybride” (without additional details)
    • "other"

fuel_type_group

Fuel type of the car in general groups.

  • Modalities:
    • "thermic"
    • "electric"
    • "hybrid": hybrid car (regular or plug-in)
    • "other"
  • Guarantees:
    • The value is consistent with fuel_type.

year

Year during which the car was used for the first time.

  • Type: UInt16
  • Guarantees:
    • The value is not earlier than 1900.
    • The value is not in the future.

tax_horsepower

Tax horsepower of the car (“cheval fiscale CV”).

  • Type: UInt16

critair

Crit’Air vignette of the car.

  • Modalities:
    • "E": Vignette Crit’Air E
    • "1": Vignette Crit’Air 1
    • "2": Vignette Crit’Air 2
    • "3": Vignette Crit’Air 3
    • "4": Vignette Crit’Air 4
    • "5": Vignette Crit’Air 5
    • "N": Unclassified vehicle
  • Guarantees:
    • The vignette Crit’Air is compatible with the fuel type and age of the vehicle.

Usage

total_mileage

Total mileage of the car, in kilometers.

Note that, depending on the survey and the respondent, the value might not be very accurate.

  • Type: UInt32

total_mileage_lower_bound

Lower bound for the total mileage of the car, in kilometers.

  • Type: UInt32
  • Guarantees:
    • The value is not larger than total_mileage.

total_mileage_upper_bound

Upper bound for the total mileage of the car, in kilometers.

  • Type: UInt32
  • Guarantees:
    • The value is not small than total_mileage_lower_bound.
    • The value is not larger than total_mileage.

annual_mileage

Estimated annual mileage of the car, in kilometers.

Note that, depending on the survey and the respondent, the value might not be very accurate.

  • Type: UInt32

annual_mileage_lower_bound

Lower bound for the estimated annual mileage of the car, in kilometers.

  • Type: UInt32
  • Guarantees:
    • The value is not larger than annual_mileage.

annual_mileage_upper_bound

Upper bound for the estimated annual mileage of the car, in kilometers.

  • Type: UInt32
  • Guarantees:
    • The value is not small than annual_mileage_lower_bound.
    • The value is not larger than annual_mileage.

Ownership

ownership

Type of ownership for the car.

  • Modalities:
    • "personal": the car is owned by the household
    • "employer:full_availability": the car is owned by an employer of a household member and is made available for unlimited used (“voiture de fonction”)
    • "employer:limited_availability": the car is owned by an employer of a household member and is made available for limited used (“voiture de service”)
    • "shared": the car is shared between multiple households
    • "leasing": the car is rented by the household over a long period of time
    • "other": other type of ownership

Parking

parking_location

Type of location usually used to park the car overnight.

  • Modalities:
    • "garage": the car is parked in a private garage
    • "street": the car is parked in the street
    • "parking_lot": the car is park in a parking lot
    • "other": other parking location

parking_type

Type of parking (paid or free) usually used to park the car overnight.

  • Modalities:
    • "forbidden": the car is parked in a forbidden location
    • "free": the car is parked in a free location
    • "paid": the car is parked in a paid location, the person paies
    • "paid_by_other": the car is parked in a paid location, someone else paies
    • "other": other types
  • Guarantees:
    • If parking_location is null, then the value is null.

Motorcycles

Sort order: motorcycle_id

Indexing

motorcycle_id

Unique identifier of the motorcycle.

  • Type: UInt32
  • Guarantees:
    • Values range from 1 to the number of motorcycles.

household_id

Identifier of the household which owns that motorcycle.

  • Type: UInt32
  • Guarantees:
    • There exists a household with this household_id.
    • The value is not null.

motorcycle_index

Index of the motorcycle among the household’s motorcycles.

  • Type: UInt8
  • Guarantees:
    • Values are unique within a household and range from 1 to the number of motorcycles (whose characteristics are known) for that household.
    • The value is not null.

original_motorcycle_id

Identifier of the motorcycle in the original data.

  • Type: Struct whose fields depend on the survey

Characteristics

type

Type of motorcycle.

  • Modalities:
    • "moped": small-size motorcycle, usually with limited speed (“cyclomoteur”)
    • "scooter"
    • "motorbike": large-size motorcycle (“moto”)
    • "motorized_tricycle": large-size motorcycle with three wheels (“3-roues motorisé”)
    • "other": other type of motorcycle

fuel_type

Fuel type that the motorcycle is using.

  • Modalities:
    • "thermic"
    • "electric"
    • "other"

year

Year during which the motorcycle was used for the first time.

  • Type: UInt16
  • Guarantees:
    • The value is not earlier than 1900.
    • The value is not in the future.

Thermic characteristics

thermic_engine_type

Type of engine for the thermic motorcycle.

  • Modalities:
    • "two_stroke": “deux temps”
    • "four_stroke": “quatre temps”
  • Guarantees:
    • If fuel_type is not "thermic", then the value is null.

cm3_lower_bound

Lower bound for the cubic capacity (“cylindrée”) of the motorcycle in cm³ (for thermic motorcycles).

  • Type: UInt16
  • Guarantees:
    • If fuel_type is not "thermic", then the value is null.

cm3_upper_bound

Upper bound for the cubic capacity (“cylindrée”) of the motorcycle in cm³ (for thermic motorcycles).

  • Type: UInt16
  • Guarantees:
    • If fuel_type is not "thermic", then the value is null.
    • The value is not smaller than cm3_lower_bound.

Electric characteristics

kw_lower_bound

Lower bound for the energy power of the motorcycle in kilowatts (for electric motorcycles).

  • Type: UInt16
  • Guarantees:
    • If fuel_type is not "electric", then the value is null.

kw_upper_bound

Upper bound for the energy power of the motorcycle in kilowatts (for electric motorcycles).

  • Type: UInt16
  • Guarantees:
    • If fuel_type is not "electric", then the value is null.
    • The value is not smaller than kw_lower_bound.

Usage

annual_mileage

Estimated annual mileage of the motorcycle, in kilometers.

Note that, depending on the survey and the respondent, the value might not be very accurate.

  • Type: UInt32

annual_mileage_lower_bound

Lower bound for the estimated annual mileage of the motorcycle, in kilometers.

  • Type: UInt32
  • Guarantees:
    • The value is not larger than annual_mileage.

annual_mileage_upper_bound

Upper bound for the estimated annual mileage of the motorcycle, in kilometers.

  • Type: UInt32
  • Guarantees:
    • The value is not small than annual_mileage_lower_bound.
    • The value is not larger than annual_mileage.

Parking

parking_location

Type of location usually used to park the motorcycle overnight.

  • Modalities:
    • "garage": the motorcycle is parked in a private garage
    • "street": the motorcycle is parked in the street
    • "parking_lot": the motorcycle is park in a parking lot
    • "other": other parking location

parking_type

Type of parking (paid or free) usually used to park the motorcycle overnight.

  • Modalities:
    • "forbidden": the motorcycle is parked in a forbidden location
    • "free": the motorcycle is parked in a free location
    • "paid": the motorcycle is parked in a paid location, the person paies
    • "paid_by_other": the motorcycle is parked in a paid location, someone else paies
    • "other": other types
  • Guarantees:
    • If parking_location is null, then the value is null.

Zones