User Behavior Analysis in Supporting Independent Mobility for People with Visual Impairments

Hernisa Kacorri, Sergio Mascetti, Andrea Gerino, Dragan Ahmetovic, Valeria Alampi, Hironobu Takagi, Chieko Asakawa

Table of contents

iMove dataset

Description

The iMove dataset (called DS1 in the following) was collected during the December 2015 - March 2017 period. It contains 3,784,700 log records across 61,715 unique user pseudo-identifiers.

To €filter out these users, we introduce the concept of “interaction session” (or simply, session). Dataset DS2 contains only log records from users having two or more sessions.

We partition this set into DS2-VO that contains the records for the users that generated at least one records while VoiceOver was active and DS2-NVO that contains all other records of DS2.
We also partition DS2 along a different dimension: the records of users that started using the app at version 31, 32 or 33 are in the dataset DS2-B34 (DS2 Before version 34), while the other records of DS2 are in DS2-A34 (DS2 at or After version 34).

Starting from iMove version 38 we also log system accessibility preferences. This means that, for any users that used version 38 we logged, at least once, his/her system accessibility preferences (This set also includes users that started using the app in a previous version and that updated to version 38).
The records from these users form dataset DS3.

Given the values of system accessibility parameters (SAT), we can partition DS3 according to whether a SAT is used. DS3-SAT includes logs of users that used a SAT at least once. DS3-NSAT contains the other records of DS3.

Download request

Each of these datasets are available as MongoDB dumps upon request. To obtain the data contact the developers at: info@everywaretechnologies.com. Please clearly state your affiliation and the intended use of the dataset in the request.

iMove preference semantics

Added in version 38:

Data structure of iMove logs

In the following sections we illustrate the data structure of iMove logs. iMove log records are represented as JSON objects:

{ 
    "_id" : ObjectId("58beb786e79a681308503b82"), 
    "appdata" : {
        "device" : "iPhone9,3", 
        "voiceover" : true, 
        "os" : "10.2.1", 
        "lang" : "en-US", 
        "uuid" : "4BC1F025-4A56-46EF-92D9-8FC23D2651C9", 
        "appname" : "iMove", 
        "appversion" : "38"
    }, 
    "timestamp" : {
        "user" : ISODate("2017-03-07T19:07:52.923+0000"), 
        "server" : ISODate("2017-03-07T13:37:10.000+0000")
    }, 
    "debug" : false, 
    "userdata" : {
        "Event" : "Exited", 
        "ScreenName" : "POIList-Around_me"
    }, 
    "datetime" : ISODate("2017-03-07T19:07:52.923+0000")
}

The main components of each record are:

* The reason of the duplication of a timing field, is due to the possible discrepancy and format among timestamps. This datetime field was manually added to each log, to use a uniform timing field.

App Data

Application data, data about the user and the device on which iMove is running, automatically populated by the logging library.

Timestamp

Timestamp object, contains three different timestamps:

Warning: This could have different formats or could contain errors. Use datetime instead.

Datetime

Datetime object indicating the referring timestamp. This field is well-formatted and unified among all logs.

User Data

User data, the application usage data, defined by the developer.

In iMove we partition user data in five different categories:

Each category specifies its own format for the userdata component.

Screen logs

Screen logs are generated when the user enters/exits a screen

{ 
    "userdata" : {
        "Event" : "Entered", 
        "ScreenName" : "POIList-Around_me"
    }

}

Possible values for the ScreenName property:

Action/Notification logs

These types of logs are generated when users perform certain actions in the application or when the application notifies the user about a new address/POI/GeoNote.

{ 
    "userdata" : {
        "EventName" : "NewRoute", 
        "EventCategory" : "Actions", 
        "EventLabel" : "Foreground_VoiceOverOFF"
    }
}
{ 
    "userdata" : {
        "EventName" : "Location", 
        "EventCategory" : "Notifications", 
        "EventLabel" : "Background_VoiceOverON",
        "EventContext" : {
            "speed" : 1.09, 
            "activity" : {
                "unknown" : false, 
                "cycling" : false, 
                "automotive" : true, 
                "confidence" : NumberInt(2), 
                "startTimestamp" : 1488895710.884092, 
                "stationary" : false, 
                "walking" : false, 
                "running" : false
            }, 
            "direction" : {
                "heading" : 47.01852, 
                "course" : 52.88281
            }
        }
    }
}

Possible values for the EventName property:

Preference logs

Preference logs are generated when users change the value of a preference.

{
    "userdata" : {
        "UserDefaults" : {
            "kPref_SayCity" : {
                "old" : false, 
                "new" : true
            }
        }
    }
}

The UserDefaults object contains one "preference" object for each preference key that has been changed. The preference object has two properties:

Possible keys for the preference object:

Application logs

Application logs are generated automatically from the application, when it modifies its state (switching from foreground to background and vice versa).

{
    "userdata" : {
        "EventName" : "willResignActive", 
        "EventLabel" : "Foreground_VoiceOverOFF", 
        "EventCategory" : "Application",
        "EventContext" : {
            "speed" : NumberInt(-1), 
            "activity" : {
                "unknown" : false, 
                "cycling" : false, 
                "automotive" : false, 
                "confidence" : NumberInt(2), 
                "startTimestamp" : 1488900735.258705, 
                "stationary" : false, 
                "walking" : false, 
                "running" : false
            }, 
            "direction" : {
                "heading" : 259.059, 
                "course" : NumberInt(-1)
            }
        }
    }
}

Exception logs

Exception logs can be automatically generated by the logging library when an exception occurs (catched == false) or manually raised by the programmer (catched == true)

{ 
    "userdata" : {
        "exception" : {
            "reason" : "-[__NSCFDictionary interruption:]: unrecognized selector sent to instance 0x17027fd40", 
            "name" : "NSInvalidArgumentException", 
            "catched" : false, 
            "callstack" : [
                "0   CoreFoundation                      0x000000018410c248  + 160", 
                "1   libobjc.A.dylib                     0x0000000195d800e4 objc_exception_throw + 60", 
                ...
            ]
        }
    }
}