This independent analysis is based on data collected from participants who enrolled the 6-week course “Planning for the Digital Learning Transition in K-12 Schools” in September 2013. This course was designed and implemented by the Friday Institute at the North Carolina State University and aimed to help the design and implementation process of the K-12 digital learning initiates (Kellogg, Booth & Oliver, 2014).

  1. Data source. The data sources include 1) the csv file with all participants’ attributes, such as ID, role, experience and location; 2) the csv file with all participants’ discussion data within the course online forum.

  2. Guided questions. In this independent analysis, I am interested in seeing how participants from the instructional technology background engaged in the discussion as they may involve in the planning and implementation process of digital learning initiates. Hence, this analysis is guided by two questions:

    1. which participant role (instructionaltech vs. other) had more more influence on the disucssion?

    2. what are the interactive patterns existing among the participant roles (instructionaltech and. other) in this course?

  3. Data analysis. This section contains five sub-section. Each sub-section provides a description and the matched code blocks to present the details of each step of the analysis.

    1. Load libraries: these packages are needed for this analysis.
    library(tidygraph)
    ## 
    ## Attaching package: 'tidygraph'
    ## The following object is masked from 'package:stats':
    ## 
    ##     filter
    library(tidyverse)
    ## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
    ## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
    ## ✓ tibble  3.1.6     ✓ dplyr   1.0.8
    ## ✓ tidyr   1.2.0     ✓ stringr 1.4.0
    ## ✓ readr   2.1.2     ✓ forcats 0.5.1
    ## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
    ## x dplyr::filter() masks tidygraph::filter(), stats::filter()
    ## x dplyr::lag()    masks stats::lag()
    library(ggplot2)
    library(ggraph)
    library(igraph)
    ## 
    ## Attaching package: 'igraph'
    ## The following objects are masked from 'package:dplyr':
    ## 
    ##     as_data_frame, groups, union
    ## The following objects are masked from 'package:purrr':
    ## 
    ##     compose, simplify
    ## The following object is masked from 'package:tidyr':
    ## 
    ##     crossing
    ## The following object is masked from 'package:tibble':
    ## 
    ##     as_data_frame
    ## The following object is masked from 'package:tidygraph':
    ## 
    ##     groups
    ## The following objects are masked from 'package:stats':
    ## 
    ##     decompose, spectrum
    ## The following object is masked from 'package:base':
    ## 
    ##     union
    library(readr)
    1. Import dataset: there are two data files used in this analysis, the edge and the node list. For the edge list, I added a new variable which is the “weight”; for the node list, I created a new variable to group the “instructionaltech” and “non-instructionaltech” roles.
    #the edge list
    dlt2_ties <- read_csv("data/dlt2-edges.csv")
    ## Rows: 2584 Columns: 9
    ## ── Column specification ────────────────────────────────────────────────────────
    ## Delimiter: ","
    ## chr (6): Timestamp, Title, Category, Parent, Description, DiscussionID
    ## dbl (3): Sender, Reciever, CommentID
    ## 
    ## ℹ Use `spec()` to retrieve the full column specification for this data.
    ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
    dlt2_edges <- dlt2_ties %>% 
      group_by(Sender,Reciever) %>% 
      summarise(weight=n()) %>% 
      ungroup()
    ## `summarise()` has grouped output by 'Sender'. You can override using the
    ## `.groups` argument.
    #the node list
    dlt2_actors <- read_csv("data/dlt2-nodes.csv")
    ## Rows: 492 Columns: 13
    ## ── Column specification ────────────────────────────────────────────────────────
    ## Delimiter: ","
    ## chr (7): role, grades, location, region, country, group, gender
    ## dbl (6): uid, facilitator, experience2, experience, expert, connect
    ## 
    ## ℹ Use `spec()` to retrieve the full column specification for this data.
    ## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
    dlt2_nodes <- dlt2_actors %>% mutate(
      role2 = case_when(role == "instructionaltech" ~ "instructionaltech",
                        role != "instructionaltech" ~"other"))
    1. Network overview: as the code blocks shown below, this network contains 492 nodes and 2080 edges. Although this group had more participants, the numbers of the edges went down compared with the first cohort. This network consists of 245 components. In particular, this network has a strong componnet with 247 members while most of the other components are isolated nodes.
    #network object
    dlt2_network <- tbl_graph(edges = dlt2_edges,
                              nodes = dlt2_nodes,
                              node_key = "uid",
                              directed = TRUE)
    #size
    dlt2_network #492 nodes and 2080 edges
    ## # A tbl_graph: 492 nodes and 2080 edges
    ## #
    ## # A directed multigraph with 69 components
    ## #
    ## # Node Data: 492 × 14 (active)
    ##     uid facilitator role  experience2 experience grades location region country
    ##   <dbl>       <dbl> <chr>       <dbl>      <dbl> <chr>  <chr>    <chr>  <chr>  
    ## 1     1           0 curr…           2         17 gener… IN       Midwe… US     
    ## 2     2           0 other           1          3 prima… NC       South  US     
    ## 3     3           0 inst…           2         20 gener… US       South  US     
    ## 4     4           0 inst…           2         12 middle TX       South  US     
    ## 5     5           0 other           1          0 gener… CAN      Inter… CA     
    ## 6     6           0 inst…           1          7 gener… CAN      Inter… CA     
    ## # … with 486 more rows, and 5 more variables: group <chr>, gender <chr>,
    ## #   expert <dbl>, connect <dbl>, role2 <chr>
    ## #
    ## # Edge Data: 2,080 × 3
    ##    from    to weight
    ##   <int> <int>  <int>
    ## 1     3   302      1
    ## 2     6    94      1
    ## 3     6   244      1
    ## # … with 2,077 more rows
    #component
    components(dlt2_network, mode = c("strong")) #245 distict components.
    ## $membership
    ##   [1] 245 244 154 241 153 154 154 216 152 154 154 230 242 154 151 150 154 154
    ##  [19] 154 154 149 154 154 154 148 154 147 154 154 154 146 154 154 154 243 145
    ##  [37] 143 154 142 154 154 195 154 154 141 154 140 154 239 169 154 154 154 167
    ##  [55] 224 139 138 137 154 154 166 154 154 136 135 134 133 154 154 154 219 154
    ##  [73] 132 154 128 127 154 126 125 208 124 154 154 154 123 122 121 154 120 154
    ##  [91] 119 194 154 154 154 172 213 154 118 154 227 211 193 117 116 154 154 115
    ## [109] 171 154 154 154 114 154 113 165 154 214 154 112 110 154 234 154 154 154
    ## [127] 154 154 154 154 164 154 154 154 154 109 154 108 107 106 105 154 238 104
    ## [145] 103 102 154 154 154 154 101 154 100  99 154 220 154 154  98 154 154 202
    ## [163]  97  96  95  93 154  92 154 154 154  91 190 154  90 154 154 154 188 154
    ## [181] 154  89 154 131 154 154 154 154 154 154  88 154  87  86 154 154 154 154
    ## [199] 163 154  85 225 154  84 162 187 154 154 199  83 161 154 154 154  82 154
    ## [217] 154 154  81 240 232  80 154 154  79 154 154  78 154  77 160  76 154  75
    ## [235] 154 154 159  74 154 186 154  94  73 154 154 154  72  71  70 184 154  69
    ## [253]  95  68 154 185 154  67  66 154  65  64 154 154 154 154 154 154 229 154
    ## [271] 154 154 154 154  63  62 154  61 204 154 154  60 154 154 154  59 221 154
    ## [289]  58  57 183 154 233  56  55 154  54 154  53 228 154 154 154 154  52 217
    ## [307] 129 201 154 154 158  51  50 182  49 154 154 154 130  48 154 154 181 215
    ## [325]  47 154  46 154 154  45 154 154 154 180 154 154 154 157  44 154 154 154
    ## [343] 231 154 154  43 154 154  42 203 154  41 156  40 237 236 154 154 191  39
    ## [361] 154 154  38  37  36 196 154  35 154 189 154 154 154 154 154 168  34 154
    ## [379] 154 154 154 154 154 154  33 222 154 154 209  32 192  31  30 154  29 154
    ## [397] 212 154 200  28 154  27 154  26 154  25 154  24 154 155 154 154 154 111
    ## [415]  23 198 154  22 154 154 154 154 154 170  21 154 179 154 154 154 154  20
    ## [433] 154 226 178 154 154  19  18 154 210  17  16  15 154  14 154 177 207  13
    ## [451] 218  12 154 176 154  11 154 154 154 154 144 197 154  10 223 154   9   8
    ## [469]   7 205 154   6   5 154 235   4 154 175 154 154 154   3 154 154 154 154
    ## [487]   2   1 206 174 154 173
    ## 
    ## $csize
    ##   [1]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ##  [19]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ##  [37]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ##  [55]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ##  [73]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ##  [91]   1   1   1   1   2   1   1   1   1   1   1   1   1   1   1   1   1   1
    ## [109]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ## [127]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ## [145]   1   1   1   1   1   1   1   1   1 247   1   1   1   1   1   1   1   1
    ## [163]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ## [181]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ## [199]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ## [217]   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
    ## [235]   1   1   1   1   1   1   1   1   1   1   1
    ## 
    ## $no
    ## [1] 245
    #only directed ties
    dlt2_network <- dlt2_network  %>% 
      activate(nodes)  %>% 
      mutate(strong_component = group_components(type = "strong"))
    as_tibble(dlt2_network)
    ## # A tibble: 492 × 15
    ##      uid facilitator role  experience2 experience grades location region country
    ##    <dbl>       <dbl> <chr>       <dbl>      <dbl> <chr>  <chr>    <chr>  <chr>  
    ##  1     1           0 curr…           2         17 gener… IN       Midwe… US     
    ##  2     2           0 other           1          3 prima… NC       South  US     
    ##  3     3           0 inst…           2         20 gener… US       South  US     
    ##  4     4           0 inst…           2         12 middle TX       South  US     
    ##  5     5           0 other           1          0 gener… CAN      Inter… CA     
    ##  6     6           0 inst…           1          7 gener… CAN      Inter… CA     
    ##  7     7           0 oper…           1          6 gener… RI       North… US     
    ##  8     8           0 curr…           2         12 middle ME       North… US     
    ##  9     9           0 other           2         11 gener… VA       South  US     
    ## 10    10           0 inst…           3         21 gener… WV       South  US     
    ## # … with 482 more rows, and 6 more variables: group <chr>, gender <chr>,
    ## #   expert <dbl>, connect <dbl>, role2 <chr>, strong_component <int>
    dlt2_network  %>% 
      as_tibble()  %>% 
      group_by(strong_component)  %>% 
      summarise(count = n())  %>% 
      arrange(desc(count))
    ## # A tibble: 245 × 2
    ##    strong_component count
    ##               <int> <int>
    ##  1                1   247
    ##  2                2     2
    ##  3                3     1
    ##  4                4     1
    ##  5                5     1
    ##  6                6     1
    ##  7                7     1
    ##  8                8     1
    ##  9                9     1
    ## 10               10     1
    ## # … with 235 more rows
    #this network has a strong component with 247 members and the most of the remaining components are isolated nodes. 
    1. Network measures: In this network, we can see that the two facilitators had the largest size which is not surprising. Besides these two facilitators, one participant who was the “libmedia” and one participant as an “instructionaltech”.
    #size
    dlt2_network <- dlt2_network |>
      activate(nodes) |>
      mutate(size = local_size())
    
    dlt2_network |> 
      as_tibble() |>
      arrange(desc(size)) |> 
      select(uid, role, size) #libmedia and instructionaltech has 74 and 54 size
    ## # A tibble: 492 × 3
    ##      uid role               size
    ##    <dbl> <chr>             <dbl>
    ##  1   302 otheredprof         224
    ##  2   158 otheredprof         165
    ##  3    23 libmedia             74
    ##  4   183 instructionaltech    54
    ##  5   361 curriculum           47
    ##  6   292 consultant           45
    ##  7   267 instructionaltech    42
    ##  8   229 instructionaltech    39
    ##  9   388 curriculum           39
    ## 10    26 instructionaltech    37
    ## # … with 482 more rows
    1. Roles and influences: Similar with the result in the previous sub-section, the “libmedia” and “instuctionaltech” participants had the higher betweenness degree. Overall, the “instructionaltech” participant groups with 134 participants had an average betweenness as 333.45 while the “non-instrucitonaltech” group with 356 participants had an average betweenness as 261.79.
    #closeness and betweenness
    dlt2_network <- dlt2_network |>
      activate(nodes) |>
      mutate(close_ness = centrality_closeness(),
             between_ness = centrality_betweenness())
    ## Warning in closeness(graph = graph, vids = V(graph), mode = mode, weights =
    ## weights, : At centrality.c:2874 :closeness centrality is not well-defined for
    ## disconnected graphs
    dlt2_network |> 
      as_tibble() |>
      arrange(desc(between_ness)) |> 
      select(uid, role, between_ness,facilitator) #libmedia and instructionaltech has higher between-ness
    ## # A tibble: 492 × 4
    ##      uid role              between_ness facilitator
    ##    <dbl> <chr>                    <dbl>       <dbl>
    ##  1   302 otheredprof             49891.           1
    ##  2   158 otheredprof             31591.           1
    ##  3    23 libmedia                 6929.           0
    ##  4   183 instructionaltech        5147.           0
    ##  5   361 curriculum               4745.           0
    ##  6   292 consultant               3642.           0
    ##  7   388 curriculum               3531.           0
    ##  8   125 instructionaltech        3342.           0
    ##  9   157 curriculum               3157.           0
    ## 10   303 other                    3089.           0
    ## # … with 482 more rows
    dlt2_network |> 
      as_tibble() |>
      filter(facilitator == 0) %>% 
      group_by(role2) %>% 
      summarise(mean = mean(between_ness),
                count = n())
    ## # A tibble: 2 × 3
    ##   role2              mean count
    ##   <chr>             <dbl> <int>
    ## 1 instructionaltech  333.   134
    ## 2 other              262.   356
  4. Data visualization. The graph is to show how the discussion pattern changed as the weight of each directed tie increased. As shown in the graph, participants from both roles (instructionaltech and other) engaged in at least one conversation. However, we could see that participants were more likely to continue the interaction with others who were in the same role.

    graph <- dlt2_network |> 
      activate(nodes) |>
      filter(facilitator == 0 & strong_component == 1)
    
    
    p <- ggraph(graph) + 
      geom_edge_link(aes(alpha = weight)) + 
      geom_node_point(aes(color = role2)) + 
      geom_node_text(aes(label = role2), repel=TRUE)+
      facet_edges(~weight)
    ## Using `stress` as default layout

  5. Conclusion. In summary, I looked at the two aspects of the network data collected from the course online discussions in September 2013. The dataset contained more nodes but less edges compared with the first cohort. Similar with the first cohort, the course facilitators had the largest size and betweenness. Besides, the discussion patterns between the “instructionaltech” and other roles showed that overall, the “instructionaltech” group had a higher betweenness which mean that their options/posts might lead to more discussions among participants. Moreover, as we saw in the graph, most of the interactions were happened between the two roles but as the weight increased, we saw participants were more likely to continue the discussions with the ones that had the same role. I assume that maybe similar experience between participants promote more frequent interactions. For next steps, I am interested in exploring what kinds of discussion topics had more/less discussions among participants.

  6. References.

    Kellogg, S., Booth, S., & Oliver, K. (2014). A social network perspective on peer supported learning in MOOCs for educatorsInternational Review of Research in Open and Distributed Learning15(5), 263-289.