Social science research has been moving into the virtual realm for more than a decade. Beyond the rise of mTurk, Prolific, and other crowd-sourced participant pools, researchers have increasingly relied on web-based modes of data collection.
The purpose of this package is to enable researchers to efficiently use the virtual meetings platform Zoom to collect data that illuminates how people interact with one another. The focal research areas that have motivated the package so far are group dynamics and interpersonal relations. However, the basic tools in this package could be of use to a broad range of research domains. (They also are helpful for supplementing instructor judgment in assessing class participation in virtual courses…). With this package you will be able to:
This is a project that is actively in development. For the most
up-to-date documentation, about zoomGroupStats
, visit http://zoomgroupstats.org.
For researchers who have deep expertise collecting data within a
face-to-face lab or simply using a web browser, research using virtual
meetings can be daunting. Yet, when viewed as a constellation of data
streams, virtual meetings can be fairly straightforward. To help
researchers ramp up efficiently, I am developing a multi-part guide to aid in collecting
research through Zoom. In addition to detailing how to use
zoomGroupStats
, this guide offers best practices for
configuring your Zoom subscription and a delineates a process to use
when collecting data across many virtual meetings.
Like with any research paradigm, investing time upfront to develop your virtual meeting process will pay dividends when it comes to analyzing data. I highly recommend reviewing this portion of the guide before you begin collecting data.
This package is available through CRAN. It is also a package that I am actively developing. So, you might find value in installing the development version of the package through my github repository. The former will be stable. The latter will be dynamic and (I think) full of exciting new functionality.
# Install zoomGroupStats from CRAN
install.packages("zoomGroupStats")
# Or, install the development version from GitHub:
# install.packages("devtools")
::install_github("andrewpknight/zoomGroupStats") devtools
Finally, the zoomGroupStats
package is an outgrowth of a
primitive set of functions that I created in April of 2020. If you were
using those functions and would like to continue doing so, you can
access them using:
source("http://apknight.org/zoomGroupStats_deprecated.R")
Note, however, that these functions will not be updated nor will they align with the documentation and vignettes that accompany the package version.
The multi-part guide provides extensive detail about how to use this package. To get started quickly, though, here are some sample actions that you might take with this package to analyze your Zoom data.
Using a template and set of named Zoom files, you can input and parse information for a batch of Zoom meetings using a single function. This example would further output a rosetta file that can be helpful for resolving Zoom display name issues. Instructions for using the template and naming your Zoom files can be found in this vignette.
= batchProcessZoomOutput(batchInput="./myMeetingsBatch.xlsx", exportZoomRosetta="./myMeetings_rosetta_original.xlsx") batchOut
After you have aligned a unique individual identifier with the Zoom display names provided in the rosetta file, you can add this unique identifier to all of the Zoom datasets that you initially created (e.g., transcript, chat, participant info, meeting info).
= importZoomRosetta(zoomOutput=batchOut, zoomRosetta="./myEditedRosetta.xlsx",
batchOutIds meetingId="batchMeetingId")
Measure the sentiment of the different text-based datasets that are
in your Zoom output (e.g., chat, transcript). You can request two types
of sentiment analysis–a lexicon-based analysis using the open source
syuzhet
package or a machine learning-based analysis using
Amazon Web Services. To request the latter, you
must have appropriately configured your AWS credentials.
# Request sentiment analysis of transcribed audio
= textSentiment(inputData=batchOutIds$transcript, idVars=c('batchMeetingId', 'utteranceId'), textVar='utteranceMessage', sentMethods=c('aws', 'syuzhet'), appendOut=TRUE, languageCodeVar='utteranceLanguage')
transcriptSent
# Request sentiment analysis of text-based chat
= textSentiment(inputData=batchOutIds$chat, idVars=c('batchMeetingId', 'messageId'), textVar='message', sentMethods=c('aws', 'syuzhet'), appendOut=TRUE, languageCodeVar='messageLanguage') transcriptSent
Measure attributes of the conversation flow–either based on the transcribed audio or the text-based chat. You will receive measurements (e.g., speaking time, number of chat messages) at the level of the individual meeting participant and the meeting as a whole. If you have conducted a sentiment analysis, you can further request analysis of sentiment metrics.
# Request conversation analysis of transcribed audio with aws sentiment analysis completed already
= textConversationAnalysis(inputData=transcriptSent$aws, inputType='transcript', meetingId='batchMeetingId', speakerId='indivId', sentMethod="aws")
convo.out
# Request conversation analysis of text-based chat without sentiment analysis
= textConversationAnalysis(inputData=batchOutIds$chat, inputType='chat', meetingId='batchMeetingId', speakerId='indivId') convo.out
In addition to measuring attributes of the conversation across an entire virtual meeting, you can analyze conversations in temporal windows–subsets of the overall meeting. By using the following function, you can break the virtual meeting into segments and output conversation metrics within each segment.
= windowedTextConversationAnalysis(inputData=transcriptSent$aws, inputType="transcript", meetingId="batchMeetingId", speakerId="indivId", sentMethod="aws", timeVar="utteranceStartSeconds", windowSize=600) win.text.out
Measure characteristics of the video feeds in a downloaded Zoom video
file. This function currently focuses just on facial expressions. It
requires either magick
or ffmpeg
to process
the video file. And, it requires appropriately configured AWS
credentials to analyze faces in the video. With these prerequisites, you
can detect known individuals in a video and extract facial
characteristics (e.g., emotional expressions).
# First, break the videos down into image files:
batchGrabVideoStills(batchInfo=batchOut$batchInfo, imageDir="~/Documents/myMeetings/videoImages", sampleWindow=60)
# Then, analyze the facial expressions, including an identified face collection
= batchVideoFaceAnalysis(batchInfo=batchOut$batchInfo, imageDir="~/Documents/myMeetings/videoImages", sampleWindow=60, facesCollectionID="group-r") vidOut