part03-analyze-zoom-conversation-data.Rmd
Virtual meetings afford granular data on how people communicate with one another. With this granularity comes both opportunities and challenges. With respect to opportunities, researchers can use virtual meetings to track the flow and content of communications on a second-by-second basis. This enables deriving insights into who talks to whom and how different people may communicate with one another in distinct ways.
With respect to challenges, granular data often requires researchers–who may be used to smaller sample datasets–to contend with incredibly large volumes of information. For example, if a researcher were to collect data from 100 60-minute group meetings, this would yield 6000 minutes of recorded speech. Depending on the rate of speech, this could present 50,000 to 60,000 spoken utterances.
Because virtual meetings present data on events in time (e.g., a spoken sentence or chat message) made by an individual within a virtual meeting, they require close attention to levels of analysis. For many questions, researchers are not interested in the fine-grained events; rather, researchers are interested in using those fine-grained events to measure attributes of individuals or groups within certain segments of time. zoomGroupStats
provides basic functionality to derive these kinds of aggregated metrics. Whether a given aggregation is appropriate for assessing some construct, however, will fundamentally depend on the phenomenon under investigation.
zoomGroupStats
provides functions for analyzing conversations that occur through two channels in a virtual meeting:
Text analysis is a dynamic area brimming with innovation. zoomGroupStats
does not currently include direct functions for cleaning or modifying the text that is captured in either a transcript or a chat file. Because, however, the text for each of these files is stored in a variable, it is straightforward to use functions from other packages to clean or otherwise modify text before conducting conversation analysis.
Depending on your research questions and the scale of your dataset, you may wish to manually review and correct the transcribed audio content. Just like transcriptions done by humans, transcriptions produced by otter.ai will have errors. A manual review of a transcription can correct for these errors and provide a sharper analysis of text.
transcript
fileIf you have followed the steps outlined in Part 2, you will have a single list object from your batch analysis. Within this list you will find a transcript
dataset. transcript
is a data.frame that is the parsed audio transcript file. Each row represents a single marked “utterance” using Zoom’s cloud-based transcription algorithm. Utterances are marked as a function of pauses in speech and/or speaker changes.
# Three records from the sample transcript dataset
head(batchOut$transcript, 3)
#> utteranceId utteranceStartSeconds utteranceStartTime utteranceEndSeconds
#> 1 1 4.859 2020-09-04 15:00:04 7.41
#> 2 2 9.540 2020-09-04 15:00:09 12.99
#> 3 3 15.630 2020-09-04 15:00:15 17.76
#> utteranceEndTime utteranceTimeWindow userName
#> 1 2020-09-04 15:00:07 2.551 Andrew Knight
#> 2 2020-09-04 15:00:12 3.450 Andrew Knight
#> 3 2020-09-04 15:00:17 2.130 Andrew Knight
#> utteranceMessage utteranceLanguage batchMeetingId
#> 1 Okay, so we're recording. We're streaming en 00000000001
#> 2 We have that setup. Okay. en 00000000001
#> 3 It's like Mary Kate's here. I'll let her in. en 00000000001
Each row contains identifying information for the utterance, including what meeting it was in (batchMeetingId
) who said it (userName
), when it was said (utteranceStartTime
, utteranceStartSeconds
), and how long it lasted (utteranceTimeWindow
). There is also an indicator of the language for the utterance (utteranceLanguage
). This indicator is used with some text analysis packages.
chat
fileAlso included in your batch output file will be a chat
dataset. chat
is a data.frame that is the parsed text-based chat file. Each row represents a single chat message submitted by a user. Note that non-ASCII characters will not be correctly rendered in the message text.
# Three records from the sample transcript dataset
head(batchOut$chat, 3)
#> messageId messageSeconds messageTime userName
#> 1 1 1274 2020-09-04 15:21:14 Andrew Knight
#> 2 2 1295 2020-09-04 15:21:35 Andrew Knight
#> 3 3 1321 2020-09-04 15:22:01 Ringo Starr
#> message
#> 1 Hello Everyone - It’s great to see folks dropping into the session. We’ll get started here in just about 5 minutes.
#> 2 Please don’t hesitate to use the chat to say hello to friends and colleagues
#> 3 Also drop in questions and comments throughout the discussion in that chat and I’ll respond as we go thanks!
#> messageLanguage batchMeetingId
#> 1 en 00000000001
#> 2 en 00000000001
#> 3 en 00000000001
Like transcript
, each row contains identifying information for the chat message, including what meeting it was in (batchMeetingId
) who posted it (userName
), and when it was posted (messageTime
, messageSeconds
). There is also an indicator of the language for the message (messageLanguage
).
transcript
and chat
zoomGroupStats
includes functions that aid in deriving common conversation metrics at several levels of analysis. Each of the functions can be applied to either the chat
or the transcript
file.
Sentiment analysis–the assessment and/or classification of language according to its emotional tone–is among the most ubiquitous kinds of text analysis. zoomGroupStats
provides the ability to perform sentiment analysis on the utterances or messages in transcript
and chat
files. Because this type of analysis scores pieces of text, I recommend conducting this analysis first. The sentiment metrics can then be included in downstream conversation analyses that aggregate aspects of the conversation to the individual or meeting levels.
Using the textSentiment()
function, there are two different types of sentiment analysis that you can request:
syuzhet
package. A lexicon-based analysis uses pre-existing dictionaries to measure the sentiment of individual words in a piece of text. In essence, this approach is a word-counting method.In deciding which method to use, you should consider your research objectives. In general, the aws method will provide greater validity for assessing sentiment. However, it also will take longer to run and, for larger datasets, will incur financial costs.
# You can request both sentiment analysis methods by including them in sentMethods
transcriptSent = textSentiment(inputData=batchOut$transcript, idVars=c('batchMeetingId','utteranceId'), textVar='utteranceMessage', sentMethods=c('aws', 'syuzhet'), appendOut=FALSE, languageCodeVar='utteranceLanguage')
# This does only the aws sentiment analysis on a chat file
chatSent = textSentiment(inputData=batchOut$chat, idVars=c('batchMeetingId', 'messageId'), textVar='message', sentMethods=c('aws'), appendOut=FALSE, languageCodeVar='messageLanguage')
The results of textSentiment come as a named list, with items for aws
and/or syuzhet
:
# This does only the syuzhet analysis on the transcript and appends does not append it to the input dataset
transcriptSent = textSentiment(inputData=batchOut$transcript, idVars=c('batchMeetingId','utteranceId'), textVar='utteranceMessage', sentMethods=c('syuzhet'), appendOut=FALSE, languageCodeVar='utteranceLanguage')
#> Running syuzhet lexicon-based sentiment analysis
head(transcriptSent$syuzhet)
#> batchMeetingId utteranceId wordCount syu_anger syu_anticipation syu_disgust
#> 1 00000000001 1 8 0 0 0
#> 2 00000000001 2 5 0 0 0
#> 3 00000000001 3 12 0 0 0
#> 4 00000000001 4 6 0 0 0
#> 5 00000000001 5 9 0 1 0
#> 6 00000000001 6 2 0 0 0
#> syu_fear syu_joy syu_sadness syu_surprise syu_trust syu_negative syu_positive
#> 1 0 0 0 0 0 0 0
#> 2 0 0 0 0 0 0 0
#> 3 0 0 0 0 0 0 0
#> 4 0 0 0 0 0 0 0
#> 5 0 1 0 0 0 0 1
#> 6 0 0 0 0 0 0 0
The appendOut option in textSentiment gives you the ability to merge the sentiment metrics back to the original input data. I usually do this so that I can incorporate these metrics into downstream conversation analyses.
# This does only the syuzhet sentiment analysis on a chat file and appends it to the input dataset
chatSent = textSentiment(inputData=batchOut$chat, idVars=c('batchMeetingId', 'messageId'), textVar='message', sentMethods=c('syuzhet'), appendOut=TRUE, languageCodeVar='messageLanguage')
#> Running syuzhet lexicon-based sentiment analysis
head(chatSent$syuzhet)
#> batchMeetingId messageId messageSeconds messageTime userName
#> 1 00000000001 1 1274 2020-09-04 15:21:14 Andrew Knight
#> 2 00000000001 2 1295 2020-09-04 15:21:35 Andrew Knight
#> 3 00000000001 3 1321 2020-09-04 15:22:01 Ringo Starr
#> 4 00000000001 4 1476 2020-09-04 15:24:36 Andrew Knight
#> 5 00000000001 5 1802 2020-09-04 15:30:02 Andrew Knight
#> 6 00000000001 6 1851 2020-09-04 15:30:51 Andrew Knight
#> message
#> 1 Hello Everyone - It’s great to see folks dropping into the session. We’ll get started here in just about 5 minutes.
#> 2 Please don’t hesitate to use the chat to say hello to friends and colleagues
#> 3 Also drop in questions and comments throughout the discussion in that chat and I’ll respond as we go thanks!
#> 4 Wow, Joe - that looks like a nice spot for joining a webinar
#> 5 Please feel free to add questions, comments, ideas, and resources here in the chat
#> 6 And Turbo Pascal…programming language!
#> messageLanguage wordCount syu_anger syu_anticipation syu_disgust syu_fear
#> 1 en 20 0 0 0 0
#> 2 en 14 0 0 0 0
#> 3 en 19 1 0 1 1
#> 4 en 12 0 0 0 0
#> 5 en 14 0 0 0 0
#> 6 en 4 0 0 0 0
#> syu_joy syu_sadness syu_surprise syu_trust syu_negative syu_positive
#> 1 0 0 0 0 0 0
#> 2 0 0 0 0 0 0
#> 3 0 1 0 0 1 1
#> 4 0 0 0 0 0 0
#> 5 1 0 0 1 0 1
#> 6 0 0 0 0 0 0
Note that I have not included the aws
output in this vignette because it requires a call to a third-party service.
Conversation analysis entails using the exchanges of communications among meeting members to assess attributes of individuals, dyads, and groups. zoomGroupStats
currently includes two basic kinds of conversation analysis.
The textConversationAnalysis()
function will provide a descriptive assessment of either the transcript
or the chat
file.
# Analyze the transcript, without the sentiment metrics
convoTrans = textConversationAnalysis(inputData=batchOut$transcript, inputType='transcript', meetingId='batchMeetingId', speakerId='userName')
textConversationAnalysis()
provides a list with output at two levels of analysis–the meeting level (first item) and the speaker level (second item). These items are named according to the type of input that you have provided.
# This is output at the meeting level. (Note that the values across meetings are equivalent because the sample dataset is a replication of the same meeting multiple times.)
head(convoTrans$transcriptlevel)
#> batchMeetingId transcriptStartTime transcriptEndTime
#> 1 00000000001 2020-09-04 15:00:04 2020-09-04 15:55:41
#> 2 00000000002 2020-09-05 15:03:19 2020-09-05 15:58:56
#> 3 00000000003 2020-09-06 15:20:04 2020-09-06 16:15:41
#> utteranceTimeWindow_sum utteranceTimeWindow_x utteranceTimeWindow_sd
#> 1 2658.961 8.863203 8.863203
#> 2 2658.961 8.863203 8.863203
#> 3 2658.961 8.863203 8.863203
#> utteranceGap_x utteranceGap_sd numUtterances numUniqueSpeakers
#> 1 2.26806 25.58092 300 6
#> 2 2.26806 25.58092 300 6
#> 3 2.26806 25.58092 300 6
#> totalTranscriptTime silentTime_sum burstinessRaw
#> 1 3337.111 678.15 0.8371172
#> 2 3337.111 678.15 0.8371172
#> 3 3337.111 678.15 0.8371172
Variable | Description |
---|---|
batchMeetingId | The meeting identifier that you specified |
transcriptStartTime | When the first utterance was recorded |
transcriptEndTime | When the last utterance ended |
utteranceTimeWindow_sum | Total number of seconds of speaking time |
utteranceTimeWindow_x | Mean duration, in seconds, of utterances |
utteranceTimeWindow_sd | Standard deviation of the duration, in seconds, of utterances |
utteranceGap_x | Mean duration, in seconds, of silent time between consecutive utterances |
utteranceGap_sd | Standard deviation of the duration, in seconds, of silent time between consecutive utterances |
numUtterances | Count of the number of utterances in the meeting |
numUniqueSpeakers | Count of the number of unique speakers in the meeting. Note that this includes any utterances for which the speaker is UNIDENTIFIED. |
silentTime_sum | Total number of seconds of silent time |
burstinessRaw | A measure of the concentration of utterances in time |
# This is output at the speaker level
head(convoTrans$speakerlevel)
#> batchMeetingId userName firstUtteranceTime lastUtteranceTime
#> 1 00000000001 Andrew Knight 2020-09-04 15:00:04 2020-09-04 15:55:26
#> 2 00000000001 George Harrison 2020-09-04 15:00:27 2020-09-04 15:00:44
#> 3 00000000001 John Lennon 2020-09-04 15:00:39 2020-09-04 15:01:54
#> 4 00000000001 Paul McCartney 2020-09-04 15:00:24 2020-09-04 15:54:48
#> 5 00000000001 Ringo Starr 2020-09-04 15:00:31 2020-09-04 15:00:31
#> 6 00000000001 UNIDENTIFIED 2020-09-04 15:02:30 2020-09-04 15:02:48
#> utteranceTimeWindow_sum utteranceTimeWindow_x utteranceTimeWindow_sd
#> 1 356.071 7.912689 7.912689
#> 2 4.290 1.430000 1.430000
#> 3 19.890 2.841429 2.841429
#> 4 2275.050 9.401033 9.401033
#> 5 1.980 1.980000 1.980000
#> 6 1.680 0.840000 0.840000
#> utteranceGap_x utteranceGap_sd numUtterances
#> 1 11.3093182 66.5995130 45
#> 2 0.9300000 0.2954657 3
#> 3 1.0714286 0.5614394 7
#> 4 0.6949587 0.4954115 242
#> 5 0.5400002 NA 1
#> 6 0.7649999 0.5727565 2
Variable | Description |
---|---|
batchMeetingId | The meeting identifier that you specified |
userName | The speaker identifier that you specified |
firstUtteranceTime | Timestamp for this person’s first utterance |
lastUtteranceTime | Timestamp for this person’s last utterance |
utteranceTimeWindow_sum | Total number of seconds of this person’s speaking time |
utteranceTimeWindow_x | Mean duration, in seconds, of this person’s utterances |
utteranceTimeWindow_sd | Standard deviation of the duration, in seconds, of this person’s utterances |
utteranceGap_x | Mean duration, in seconds, of silent time before this person speaks after a prior utterance |
utteranceGap_sd | Standard deviation of the duration, in seconds, of silent time before this person speaks after a prior utterance |
numUtterances | Count of the number of utterances this person made in this the meeting |
If you have already conducted a sentiment analysis using the textSentiment()
function, you can further include those attributes. Note that currently you can only analyze one sentiment analysis method at a time. For example, here is a request for an analysis of the chat file:
# Analyze the conversation within the chat file, including the sentiment metrics
convoChat = textConversationAnalysis(inputData=chatSent$syuzhet, inputType='chat', meetingId='batchMeetingId', speakerId='userName', sentMethod="syuzhet")
The names of the items in the list output for chat
are chatlevel
and userlevel
:
# This is output at the meeting level
head(convoChat$chatlevel)
#> batchMeetingId chatStartTime chatEndTime messageNumChars_sum
#> 1 00000000001 2020-09-04 15:21:14 2020-09-04 15:36:49 527
#> 2 00000000002 2020-09-05 15:21:14 2020-09-05 15:36:49 527
#> 3 00000000003 2020-09-06 15:21:14 2020-09-06 15:36:49 527
#> messageNumChars_x messageNumChars_sd messageGap_x messageGap_sd
#> 1 52.7 41.30927 103.8889 141.3793
#> 2 52.7 41.30927 103.8889 141.3793
#> 3 52.7 41.30927 103.8889 141.3793
#> numUniqueMessagers numMessages totalChatTime burstinessRaw syu_anger.sum
#> 1 5 10 935 0.1528548 1
#> 2 5 10 935 0.1528548 1
#> 3 5 10 935 0.1528548 1
#> syu_anticipation.sum syu_disgust.sum syu_fear.sum syu_joy.sum syu_sadness.sum
#> 1 0 1 1 1 1
#> 2 0 1 1 1 1
#> 3 0 1 1 1 1
#> syu_surprise.sum syu_trust.sum syu_negative.sum syu_positive.sum
#> 1 0 1 1 2
#> 2 0 1 1 2
#> 3 0 1 1 2
#> syu_anger.pct syu_anticipation.pct syu_disgust.pct syu_fear.pct syu_joy.pct
#> 1 0.1 0 0.1 0.1 0.1
#> 2 0.1 0 0.1 0.1 0.1
#> 3 0.1 0 0.1 0.1 0.1
#> syu_sadness.pct syu_surprise.pct syu_trust.pct syu_negative.pct
#> 1 0.1 0 0.1 0.1
#> 2 0.1 0 0.1 0.1
#> 3 0.1 0 0.1 0.1
#> syu_positive.pct
#> 1 0.2
#> 2 0.2
#> 3 0.2
Variable | Description |
---|---|
batchMeetingId | The meeting identifier that you specified |
chatStartTime | The time of the first chat message in this meeting |
chatEndTime | The time of the last chat message in this meeting |
messageNumChars_sum | Total number of characters chatted in meeting |
messageNumChars_x | Mean number of characters per message chatted in meeting |
messageNumChars_sd | Standard deviation of the number of characters per message chatted in meeting |
messageGap_x | Mean duration, in seconds, of time between chat messages in this meeting |
messageGap_sd | Standard deviation of the duration, in seconds, of time between chat messages in this meeting |
numUniqueMessagers | Number of individuals who sent chat messages in this meeting. |
numMessages | Total number of messages sent in this meeting |
totalChatTime | Amount of time between first and last messages |
burstinessRaw | Measure of the concentration of chat messages in time |
… | Additional variables depend on the type of sentiment analysis you may have requested. |
# This is output at the speaker level
head(convoChat$userlevel)
#> batchMeetingId userName numMessages firstMessageTime
#> 1 00000000001 Andrew Knight 6 2020-09-04 15:21:14
#> 2 00000000001 George Harrison 1 2020-09-04 15:36:43
#> 3 00000000001 John Lennon 1 2020-09-04 15:36:47
#> 4 00000000001 Paul McCartney 1 2020-09-04 15:36:49
#> 5 00000000001 Ringo Starr 1 2020-09-04 15:22:01
#> 6 00000000002 Andrew Knight 6 2020-09-05 15:21:14
#> lastMessageTime messageNumChars_sum messageNumChars_x messageNumChars_sd
#> 1 2020-09-04 15:36:42 392 65.33333 33.46441
#> 2 2020-09-04 15:36:43 7 7.00000 NA
#> 3 2020-09-04 15:36:47 12 12.00000 NA
#> 4 2020-09-04 15:36:49 8 8.00000 NA
#> 5 2020-09-04 15:22:01 108 108.00000 NA
#> 6 2020-09-05 15:36:42 392 65.33333 33.46441
#> messageGap_x messageGap_sd syu_anger.sum syu_anticipation.sum syu_disgust.sum
#> 1 180.4 152.9895 0 0 0
#> 2 1.0 NA 0 0 0
#> 3 4.0 NA 0 0 0
#> 4 2.0 NA 0 0 0
#> 5 26.0 NA 1 0 1
#> 6 180.4 152.9895 0 0 0
#> syu_fear.sum syu_joy.sum syu_sadness.sum syu_surprise.sum syu_trust.sum
#> 1 0 1 0 0 1
#> 2 0 0 0 0 0
#> 3 0 0 0 0 0
#> 4 0 0 0 0 0
#> 5 1 0 1 0 0
#> 6 0 1 0 0 1
#> syu_negative.sum syu_positive.sum syu_anger.pct syu_anticipation.pct
#> 1 0 1 0 0
#> 2 0 0 0 0
#> 3 0 0 0 0
#> 4 0 0 0 0
#> 5 1 1 1 0
#> 6 0 1 0 0
#> syu_disgust.pct syu_fear.pct syu_joy.pct syu_sadness.pct syu_surprise.pct
#> 1 0 0 0.1666667 0 0
#> 2 0 0 0.0000000 0 0
#> 3 0 0 0.0000000 0 0
#> 4 0 0 0.0000000 0 0
#> 5 1 1 0.0000000 1 0
#> 6 0 0 0.1666667 0 0
#> syu_trust.pct syu_negative.pct syu_positive.pct
#> 1 0.1666667 0 0.1666667
#> 2 0.0000000 0 0.0000000
#> 3 0.0000000 0 0.0000000
#> 4 0.0000000 0 0.0000000
#> 5 0.0000000 1 1.0000000
#> 6 0.1666667 0 0.1666667
Variable | Description |
---|---|
batchMeetingId | The meeting identifier that you specified |
userName | The individual identifier you specified |
firstMessageTime | The time of this person’s first chat message in this meeting |
lastMessageTime | The time of this person’s last chat message in this meeting |
messageNumChars_sum | Total number of characters this person chatted in meeting |
messageNumChars_x | Mean number of characters per message this person chatted in meeting |
messageNumChars_sd | Standard deviation of the number of characters per message this person chatted in meeting |
messageGap_x | Mean duration, in seconds, of time before this person sends a chat message after a prior message |
messageGap_sd | Standard deviation of the duration, in seconds, of time before this person sends a chat message after a prior message |
… | Additional variables depend on the type of sentiment analysis you may have requested. |
One of the unique strengths of collecting data using virtual meetings is the ability to assess dynamics–how meeting characteristics and participants’ behavior changes over time. Beyond analyzing the raw events over time, zoomGroupStats
enables you to run the textConversationAnalysis above within temporal windows in a given meeting. By windowing, and aggregating data within the window, you can derive more reliable indicators of attributes than relying solely on the raw events.
For example, using the following function call, you could analyze how conversation attributes–who is speaking alot, what is the sentiment of speech–change throughout a meeting, in 5-minute (windowSize=300
seconds) increments.
= windowedTextConversationAnalysis(inputData=batchOut$transcript, inputType='transcript', meetingId='batchMeetingId', speakerId='userName', sentMethod="none", timeVar="utteranceStartSeconds", windowSize=300)
win.convo.out #>
|
| | 0%
|
|=================================== | 50%
|
|======================================================================| 100%
The output of windowedTextConversationAnalysis
is a list with two data.frames as items:
# View the window-level output
head(win.convo.out$windowlevel)
#> windowId windowStart windowEnd batchMeetingId transcriptStartTime
#> 1 1 0 299 00000000001 2020-09-04 15:00:04
#> 2 2 300 599 00000000001 <NA>
#> 3 3 600 899 00000000001 2020-09-04 15:10:15
#> 4 4 900 1199 00000000001 2020-09-04 15:15:02
#> 5 5 1200 1499 00000000001 2020-09-04 15:20:06
#> 6 6 1500 1799 00000000001 2020-09-04 15:25:03
#> transcriptEndTime utteranceTimeWindow_sum utteranceTimeWindow_x
#> 1 2020-09-04 15:02:52 112.411 2.882333
#> 2 <NA> 0.000 NA
#> 3 2020-09-04 15:15:01 272.490 9.731786
#> 4 2020-09-04 15:20:05 287.670 11.506800
#> 5 2020-09-04 15:25:03 271.740 8.234545
#> 6 2020-09-04 15:30:08 289.140 9.638000
#> utteranceTimeWindow_sd utteranceGap_x utteranceGap_sd numUtterances
#> 1 2.882333 1.4471053 1.4377420 39
#> 2 NA NA NA 0
#> 3 9.731786 0.5222222 0.3300272 28
#> 4 11.506800 0.6550000 0.3376388 25
#> 5 8.234545 0.7912500 0.5997459 33
#> 6 9.638000 0.5617241 0.3392120 30
#> numUniqueSpeakers totalTranscriptTime silentTime_sum burstinessRaw
#> 1 6 167.401 54.99 -0.003245657
#> 2 0 0.000 0.00 NA
#> 3 2 286.590 14.10 -0.225514982
#> 4 1 303.390 15.72 -0.319714619
#> 5 1 297.060 25.32 -0.137674098
#> 6 1 305.430 16.29 -0.246978824
Variable | Description |
---|---|
windowId | Incrementing numeric identifier for the temporal window |
windowStart | Number of seconds from start of transcript when this window begins |
windowEnd | Number of seconds from start of transcript when this window ends |
… | All other variables correspond to the textConversationAnalysis output; but, they are calculated within a given temporal window |
# View the output for speakers within windows
head(win.convo.out$speakerlevel)
#> batchMeetingId userName windowId windowStart windowEnd
#> 1 00000000001 Andrew Knight 1 0 299
#> 2 00000000001 Andrew Knight 2 300 599
#> 3 00000000001 Andrew Knight 3 600 899
#> 4 00000000001 Andrew Knight 4 900 1199
#> 5 00000000001 Andrew Knight 5 1200 1499
#> 6 00000000001 Andrew Knight 6 1500 1799
#> firstUtteranceTime lastUtteranceTime utteranceTimeWindow_sum
#> 1 2020-09-04 15:00:04 2020-09-04 15:02:50 56.371
#> 2 <NA> <NA> 0.000
#> 3 2020-09-04 15:10:15 2020-09-04 15:13:36 210.570
#> 4 <NA> <NA> 0.000
#> 5 <NA> <NA> 0.000
#> 6 <NA> <NA> 0.000
#> utteranceTimeWindow_x utteranceTimeWindow_sd utteranceGap_x utteranceGap_sd
#> 1 3.523187 3.523187 2.320 1.8074370
#> 2 NA NA NA NA
#> 3 10.027143 10.027143 0.498 0.3121336
#> 4 NA NA NA NA
#> 5 NA NA NA NA
#> 6 NA NA NA NA
#> numUtterances
#> 1 16
#> 2 0
#> 3 21
#> 4 0
#> 5 0
#> 6 0
This output will provide a record for each possible speaker within each possible window. This is done so that valid zeros (e.g., no speaking) are represented in the dataset.
Variable | Description |
---|---|
batchMeetingId | Meeting identifier requested |
userName | Speaker identifier requested |
windowId | Incrementing numeric identifier for the temporal window |
windowStart | Number of seconds from start of transcript when this window begins |
windowEnd | Number of seconds from start of transcript when this window ends |
… | All other variables correspond to the textConversationAnalysis output; but, they are calculated within a given temporal window |
In the final part of this guide, you will learn how to process and anlayze video files downloaded from Zoom sessions.