Once again, we need to load in all the libraries we’ll be using.
library(tidyverse)
library(tidytext) # Tidy text mining
library(textstem) # Lemmatization and stemming
library(quanteda) # DTMs and DFMs
library(quanteda.textstats) # For distances
library(SentimentAnalysis) # For Sentiment Analysis
library (stm) # For LDA
library(tm) # DTM/TDM
library(broom) # For tidy()ing
If you haven’t run the part 1 document, we’ll run the pre-processing steps really quickly here:
socmedia_data<-read.csv("sentimentdataset.csv", header = T) # Read the data
socmedia_data <- socmedia_data %>% # handle spaces in the labels
mutate(across(c(Platform, Country, User, Sentiment, Hashtags),
str_trim))
# Tokenize and remove stopwords
socmedia_stoptoken <- socmedia_data %>%
unnest_tokens(word, Text) %>%
filter(!word %in% stop_words$word)
# Additionally, make a DTM with posts as documents
socmedia_dtm <- socmedia_stoptoken %>%
mutate(word = lemmatize_words(word)) %>% # lemmatize
count(ID, word, sort=FALSE) %>%
arrange(ID) %>%
cast_dtm(ID, word, n)
Sentiment analysis is performed in a bag-of-words framework by comparing each term to a sentiment dictionary, and totaling the sum of the sentiment elements for those terms.
Most often, this is done with “positive”, “negative”, and “neutral”
as the possible sentiment categories, rather than the many tags that we
have in the social media data set. We can do this quickly using
analyzeSentiment()
from the SentimentAnalysis
package.
Note that sentiment requires a dictionary. The package comes with several.
# Analyze sentiment using analyzeSentiment()
# Quite simple and neat!
socmedia_sentiment <- analyzeSentiment(tolower(socmedia_data$Text))
socmedia_data$SentimentQDAP <- socmedia_sentiment$SentimentQDAP
This gives us a set of different estimates, each driven by a different sentiment lexicon. The letters after “Sentiment” or “Positivity” or “Negativity” indicate which dictionary was used. There is no clear best. See the help pages to learn about each one. Here, we’ll use QDAP.
# Check out the results from a given dictionary just as an object.
head(socmedia_sentiment$SentimentQDAP)
## [1] 0.5000000 -0.3333333 0.5000000 0.2500000 0.0000000 0.0000000
We can simplify the sentiment model even further if we want to separate positive from negative tweets.
# View sentiment direction (i.e. positive, neutral and negative)
sentiment_direction<- convertToDirection(socmedia_sentiment$SentimentQDAP)
head(sentiment_direction)
## [1] positive negative positive positive neutral neutral
## Levels: negative neutral positive
The first few rows of our social media database have apparently been rated in terms of positivity and negativity (probably because they are tests for other models). We can see that these line up pretty well with our predictions from the sentiment analyzer.
head(data.frame(QDAP=socmedia_sentiment$SentimentQDAP,
sentiment_direction,
socmedia_data$Sentiment))
## QDAP sentiment_direction socmedia_data.Sentiment
## 1 0.5000000 positive Positive
## 2 -0.3333333 negative Negative
## 3 0.5000000 positive Positive
## 4 0.2500000 positive Positive
## 5 0.0000000 neutral Neutral
## 6 0.0000000 neutral Positive
Not a perfect match, certainly. That’s because different dictionaries will use different words, and therefore get slightly different results.
We can plot or fit sentiment against other features of the data set. For example, across time:
ggplot(socmedia_data, aes(x=Year, y=SentimentQDAP)) + geom_smooth(method="loess")
## `geom_smooth()` using formula = 'y ~ x'
Sentiment here is still generally positive. But that sure is changing.
Note that this kind of analysis could also be applied user-by-user or
hashtag-by-hashtag.
Before applying LDA, it is necessary to prepare a Document Term Matrix (DTM).
Latent Dirichlet Allocation (LDA) is an iterative technique that identifies topics within a set of documents by analyzing the frequency of words, which are represented in discrete form. The underlying concept of LDA is that documents typically focus on a limited number of topics, and similarly, these topics are generally comprised of a limited set of words.
We will again refer to our social media dataset to performing LDA. We
can use a document-feature matrix as a starting point using the
stm()
socmedia_dfm <- socmedia_stoptoken %>%
count(ID, word) %>% # count each word used in each identified review
cast_dfm(ID, word, n) # convert to a document-feature matrix
The stm
package will let us run an LDA from there.
socmedia_lda <- stm(
socmedia_dfm,
K = 3, # K is the number of topics we want the model to produce
verbose=FALSE,
seed=422 # Enforces replicability
)
socmedia_lda
## A topic model with 3 topics, 732 documents and a 2328 word dictionary.
We might want to see how many topics are really supported by our
data, though. A search through different K can give us a good guess; the
searchK()
function can do that, if you are interested.
k_options <- searchK(socmedia_dfm, K=3:7, N=100, verbose=FALSE)
plot(k_options)
Here, it looks like 3 may not be the best choice: 6 has more coherence,
a lower heldout likelihood, and lower residuals. See the
?searchK
function for more details. We’ll continue with 3
for this tutorial, though.
STM models are a more general form that also allows you to set covariates on your topic model. See Roberts, et al., 2016 for more.
We can tidy()
the result to bring pieces back into a
tidytext
-friendly format. Here, we extract the
per-topic-per-word probabilities, called β (“beta”) weights, from the
model.
#Extract the topics
lda_topics <- tidy(socmedia_lda, matrix = "beta")
This lets us rearrange things and run plots in typical tidy style.
lda_topics %>%
arrange(topic, desc(beta)) %>%
#arrange in descending order within topic
head()
## # A tibble: 6 × 3
## topic term beta
## <int> <chr> <dbl>
## 1 1 dreams 0.00750
## 2 1 night 0.00720
## 3 1 life 0.00660
## 4 1 beauty 0.00600
## 5 1 journey 0.00529
## 6 1 emotions 0.00510
We can see that “dreams”, “night” and “life” are the most probable terms for topic 1. We can get a similar list for topic 2, and look at the differences.
top_terms <- lda_topics %>%
group_by(topic) %>%
slice_max(beta, n = 15) %>%
ungroup() %>%
arrange(topic, -beta)
top_terms %>%
mutate(term = reorder_within(term, beta, topic)) %>%
ggplot(aes(beta, term, fill = factor(topic))) +
geom_col(show.legend = FALSE) +
facet_wrap(~ topic, scales = "free") +
scale_y_reordered() +
theme(axis.text.x = element_text(angle = 45, hjust=1))
We can start to see the differences in these topics from this. It’s also possible to go back to the original tweets and see what kinds of tweets show the biggest pieces of each topic. This shows up in the \(\gamma\) (gamma) matrix of the stm.
td_gamma <- tidy(socmedia_lda, matrix = "gamma",
document_names = rownames(socmedia_dfm)) %>%
pivot_wider(names_from = "topic", values_from="gamma", names_prefix = "topic")
head(td_gamma)
## # A tibble: 6 × 4
## document topic1 topic2 topic3
## <chr> <dbl> <dbl> <dbl>
## 1 0 0.106 0.856 0.0376
## 2 1 0.890 0.0694 0.0407
## 3 2 0.195 0.117 0.688
## 4 3 0.685 0.264 0.0505
## 5 4 0.121 0.837 0.0428
## 6 5 0.692 0.0995 0.208
From this, we can see that documents 0 and 4 is mostly topic 2, and document 1 and 3 are mostly topic 1. Let’s look at those:
socmedia_data %>% filter(ID %in% c(0,1,3,4))
## ID Text Sentiment
## 1 0 Enjoying a beautiful day at the park! Positive
## 2 1 Traffic was terrible this morning. Negative
## 3 3 Excited about the upcoming weekend getaway! Positive
## 4 4 Trying out a new recipe for dinner tonight. Neutral
## Timestamp User Platform Hashtags Retweets Likes
## 1 2023-01-15 12:30:00 User123 Twitter #Nature #Park 15 30
## 2 2023-01-15 08:45:00 CommuterX Twitter #Traffic #Morning 5 10
## 3 2023-01-15 18:20:00 AdventureX Facebook #Travel #Adventure 8 15
## 4 2023-01-15 19:55:00 ChefCook Instagram #Cooking #Food 12 25
## Country Year Month Day Hour SentimentQDAP
## 1 USA 2023 1 15 12 0.5000000
## 2 Canada 2023 1 15 8 -0.3333333
## 3 UK 2023 1 15 18 0.2500000
## 4 Australia 2023 1 15 19 0.0000000
Deeper exploration is warranted, but it looks like topic 2 might be a bit more about doing something, whereas topic 1 is more contemplative.
Topic models are mixture models–that is, each post can have several topics. Instead, we can look for groups of posts that are similar. We do that using a clustering approach. First, we need to convert our DFM matrix to a distance matrix.
socmedia_distances <- textstat_simil(socmedia_dfm, method="cosine")
socmedia_clustering <- hclust(as.dist(socmedia_distances))
plot(socmedia_clustering)
We can split the tree into however many groups we think is likely. Here, I would pick 5 or 6.
socmedia_data$cluster <- cutree(socmedia_clustering, 6)
And we can look at the cluster memberships by examining what’s in each group:
socmedia_data %>% filter(cluster==2) %>% select(Text)
## Text
## 1 Missing summer vibes and beach days.
## 2 Feeling a bit under the weather today.
## 3 Sipping coffee and enjoying a good book.
## 4 Exploring the world of virtual reality.
## 5 Productive day ticking off my to-do list.
## 6 Just finished a challenging workout routine.
## 7 Sunday brunch with friends.
## 8 Reflecting on the importance of mental health.
## 9 Weekend road trip to explore scenic views.
## 10 Attending a live music concert tonight.
## 11 Trying out a new dessert recipe.
## 12 Excited about the upcoming gaming tournament.
## 13 A cozy evening with a good movie.
## 14 Cooking a special dinner for loved ones.
## 15 Feeling optimistic about the week ahead.
## 16 Starting a new fitness challenge tomorrow! 💪
## 17 A surprise gift from a friend made my day!
## 18 Pride in achieving a personal milestone.
## 19 A moment of shame for not standing up against injustice.
## 20 The fear of the unknown is keeping me up at night.
## 21 Heartfelt sadness after bidding farewell to a dear friend.
## 22 The state of corruption in our society is utterly disgusting.
## 23 Overflowing happiness: welcoming a new family member!
## 24 Amused by the antics of my pet—it's pure amusement!
## 25 Enjoying every moment of this trip—pure enjoyment!
## 26 Admiring the dedication of volunteers at a local charity.
## 27 Embracing acceptance of life's ups and downs.
## 28 Bitter experience at the customer service department.
## 29 Finding calmness amidst the chaos of daily life.
## 30 Confusion reigns as I try to make sense of recent events.
## 31 Kindness witnessed today restores my faith in humanity.
## 32 Enthusiastically diving into a new project.
## 33 Reverence for the beauty of a historic landmark.
## 34 Serenity found in the pages of a favorite book.
## 35 Tenderness in the warmth of a cozy winter evening.
## 36 Arousal of excitement for an upcoming adventure.
## 37 Elation after achieving a personal goal.
## 38 Elation over discovering a hidden gem in the city.
## 39 The euphoria of a surprise birthday celebration.
## 40 Serenity found in the melody of a peaceful piano.
## 41 Gratitude for the supportive community around me.
## 42 Hopeful about the prospects of a new business venture.
## 43 Empowerment through learning a new skill.
## 44 Compassion in volunteering for a local charity.
## 45 Enthusiasm for a DIY home improvement project.
## 46 Overwhelmed by grief, missing a loved one dearly.
## 47 Resentment building up over past betrayals.
## 48 Anxiety grips my heart, worry clouds my thoughts.
## 49 Helplessness sinks in as challenges pile up.
## 50 Drowning in despair, hope slipping through my fingers.
## 51 Jealousy gnaws at my confidence, a toxic emotion.
## 52 Frustration boils over, a volcanic eruption of emotions.
## 53 Envy poisons my thoughts, coveting others' success.
## 54 Regret for decisions that led to a painful present.
## 55 Loneliness echoes in empty spaces, yearning for connection.
## 56 Embarking on a journey of discovery, fueled by curiosity and a thirst for knowledge.
## 57 Lost in the vast sea of information, an indifferent wave in the digital ocean.
## 58 Torn between conflicting emotions, an ambivalence that paints my decisions in shades of uncertainty.
## 59 Embracing the ebb and flow of life, finding acceptance in the dance of existence.
## 60 A tapestry of conflicting feelings, weaving through uncertainty, caught in the threads of ambivalence.
## 61 Wrestling with thoughts, a perplexed mind lost in the labyrinth of life's complexities.
## 62 Flipping through the pages of an old yearbook, nostalgia painting smiles and tears on my face.
## 63 An impenetrable numbness shields me from the emotional storms, a fortress of stoic resilience.
## 64 Determination as the driving force, propelling me forward on the path to extraordinary achievements.
## 65 Determination ablaze, forging a path through challenges, sculpting dreams into tangible realities.
## 66 Fueled by curiosity, venturing into uncharted realms, a fearless explorer of the mysteries of the world.
## 67 Soaring on the wings of a free spirit, unburdened by the chains of conformity, painting the sky with independence.
## 68 A compassionate rain, tears of empathy falling gently, nurturing the seeds of kindness in the garden of human connections.
## 69 A free spirit soaring on the wings of dreams, leaving trails of independence in the azure sky of boundless possibilities.
## 70 Bathed in the golden hues of gratefulness, a sunset of appreciation casting its warm glow on the landscapes of the heart.
## 71 Hopeful whispers of wind, carrying the promises of a brighter tomorrow, a symphony of optimism in the air of possibilities.
## 72 Playfully juggling responsibilities, a circus performer balancing the acts of work and joy, tossing laughter into the air.
## 73 Frustrated attempts to mend a broken connection, the threads of understanding slipping through the fingers like grains of sand.
## 74 Envious gazes cast upon the podium of success, a bitter pill swallowed, the taste lingering as a constant reminder of unattained heights.
## 75 Fearful eyes scanning the shadows, a prisoner of the night, terrorized by the lurking monsters born from the mind's darkest corners.
## 76 Awe-struck by the breathtaking sunrise over the mountains.
## 77 Thrilled to witness the grandeur of a cultural festival.
## 78 Excitement builds as the countdown to a long-awaited vacation begins.
## 79 Inspiration strikes while observing the colors of a vibrant sunset.
## 80 Motivated to achieve fitness goals after an invigorating workout.
## 81 Nostalgic memories flood in while revisiting childhood favorites.
## 82 Contentment in the midst of a family gathering filled with laughter.
## 83 A burst of creativity in the quiet solitude of an artist's studio.
## 84 Radiant joy akin to blooming flowers on a sun-kissed spring morning.
## 85 Rejuvenated by the salty breeze and the sound of waves at the seaside.
## 86 Euphoria floods in as the final puzzle piece clicks into place.
## 87 Immersed in the enchanting melodies of a street musician's violin.
## 88 Dazzled by the elegance of a masquerade ball's dazzling costumes.
## 89 Reflective contemplation amid the ruins of a forgotten era.
## 90 Harmony resonates as musicians play a symphony of unity.
## 91 Numbness sets in as the weight of loneliness grows heavier.
## 92 Shattered by betrayal, trust crumbles like fragile glass.
## 93 Emotional storm, a whirlwind of sadness engulfs every thought.
## 94 Heartache deepens, a solitary journey through the abyss of despair.
## 95 Melancholy lingers, a bittersweet serenade in the quietude of solitude.
## 96 Shattered by the echoes of a shattered dream, fragments of hope scattered.
## 97 Wandering in the maze of betrayal, the walls closing in with every wrong turn.
## 98 A soul weathered by the storm of heartbreak, seeking refuge in the calm after.
## 99 Like a withered rose in the garden of love, petals fall, a silent surrender to time.
## 100 In the embrace of love, each heartbeat is a melody, dancing to the rhythm of affection.
## 101 Floating on clouds of gratitude, each raindrop a blessing, a shower of thankfulness.
## 102 Amazed by the architectural marvels of Petra, each stone telling tales of an ancient civilization.
## 103 Embarking on a gondola ride in Venice, each canal reflecting the romance of this timeless city.
## 104 Walking the Great Wall of China, each step a testament to ancient engineering marvels.
## 105 Skiing down the slopes of the Swiss Alps, each turn a dance with the majesty of snow-capped peaks.
## 106 Cruising the fjords of Norway, each icy landscape a breathtaking masterpiece of nature's grandeur.
## 107 At the front row of Adele's concert, each note of 'Someone Like You' resonates with soul-stirring emotion.
## 108 Dancing to Shakira's rhythmic beats, hips swaying to the hypnotic charm of 'Hips Don't Lie'.
## 109 As the credits roll, a profound sense of nostalgia washes over, reminiscent of cherished moments in classic films.
## 110 Binge-watching a thrilling crime series, the suspense keeps the viewer on the edge of their seat, creating a rush of adrenaline.
## 111 Cheering for the underdog in the basketball finals, the crowd erupts in applause as the team defies odds to claim the championship title.
## 112 At the golf tournament, the golfer's precision and focus lead to a stunning victory, leaving spectators in awe of their exceptional skill.
## 113 After a series of defeats, the soccer team faces disappointment, struggling to find the silver lining in a challenging season.
## 114 Spent the afternoon at a museum, pretending to be cultured. Art enthusiast in the making. #MuseumDay #TeenArtLover
## 115 Started a blog about random thoughts and musings. Blogging is the new diary. #BloggerLife #TeenBlogger
## 116 Capturing the beauty of nature through photography. Every snapshot is a treasure. #NaturePhotography #SeniorPhotographer
## 117 Reconnecting with old friends over a cup of tea. Friendship, the true essence of companionship. #OldFriends #Companionship
## 118 Joined a community choir, harmonizing with fellow voices. Music creates bonds that withstand time. #CommunityChoir #HarmonyInAging
## 119 Visited an art gallery, appreciating the brushstrokes that tell tales of creativity. Art, an eternal companion. #ArtGallery #SeniorArtLover
## 120 Trying to master the perfect kickflip on my skateboard. Skating into the weekend like a pro!
## 121 Accidentally liked my crush's old photo while stalking their profile. Awkward level: Maximum!
## 122 Attempting to set a new record for the most consecutive hacky sack kicks. Hacky sack skills: Unleashed!
## 123 Attempting to impress the teacher with an elaborate science experiment. Science geek mode: Activated!
## 124 Experiencing cyberbullying. Hateful messages online are disheartening.
## 125 Having a string of bad luck with constant technology malfunctions. Tech troubles galore!
## 126 Attending a school club meeting to explore new interests. Dabbling in extracurricular activities.
## 127 Winning a friendly sports competition against rival schools. Victory celebrations in full swing!
These seem to be about doing fun or useful things.
socmedia_data %>% filter(cluster==6) %>% select(Text)
## Text
## 1 Sinking in despair, each day darker than the last.
## 2 Drifting through the day with an air of nonchalance, indifferent to the trivialities of life.
## 3 Wrapped in the cloak of emotional numbness, a shield against the storms of life's turbulence.
## 4 Navigating the river of contentment, a serene boat cruise through the tranquil waters of inner peace and acceptance.
## 5 A playful escapade in the carnival of life, carousel laughter and cotton candy dreams swirling in the joyous atmosphere.
## 6 Hopeful whispers of wind, carrying the promises of a brighter tomorrow, a symphony of optimism in the air of possibilities.
## 7 Shattered dreams lie on the floor like fragments of glass, a mosaic of disappointment crafted by the hands of frustration.
## 8 Jealousy, a venom that seeps through the veins, poisoning the heart and turning it into a breeding ground for discontent.
## 9 Devastated, a heart in ruins, the echoes of shattered dreams reverberating in the chambers, a requiem for what once was whole.
## 10 Loneliness, a silent companion in the night, the only echo in the chamber of solitude, a heart's solitary nocturne.
## 11 Navigating through the challenges with determination.
## 12 Bittersweet emotions arise while bidding farewell to a dear friend.
## 13 Feeling empowered after conquering a challenging hiking trail.
## 14 Contemplating life's mysteries under the starry night sky.
## 15 Reflecting on personal growth achieved through life experiences.
## 16 Whispers of inspiration from the rustling leaves in a serene forest.
## 17 Heartfelt gratitude for the laughter shared during a family reunion.
## 18 Embarking on a culinary odyssey, savoring flavors around the world.
## 19 Giddy with excitement as the first snowflakes dance from the sky.
## 20 Imbued with gratitude for the simple pleasure of a warm cup of tea.
## 21 Drowning in sorrow as memories of lost love resurface.
## 22 Darkness descends, engulfing the soul in the shadows of despair.
## 23 Avoiding the shards of shattered dreams, walking the tightrope of resilience.
## 24 Tears, the currency of grief, spent in the marketplace of lost love and longing.
## 25 Dancing on sunshine, each step a celebration of the joy found in simple moments.
## 26 Laughter echoes in the air, a chorus of happiness that lifts the spirit higher.
## 27 In the garden of contentment, each bloom whispers tales of inner peace and joy.
## 28 In the garden of friendships, each bloom a testament to the beauty of camaraderie.
## 29 In the symphony of excitement, each note is a burst of energy, igniting the soul with fervor.
## 30 In the carnival of emotions, the rollercoaster of thrill sends the heart on a wild ride.
## 31 Lost in the enchantment of Disneyland, each ride a journey into the realm of childhood fantasies.
## 32 Amidst the tulip fields of Keukenhof, a tapestry of colors that paints the soul with springtime joy.
## 33 Journeying through the serenity of Santorini, where each sunset paints the sky with hues of tranquility.
## 34 In the heart of New York City, Times Square dazzles with lights, a vibrant spectacle of urban energy.
## 35 Sailing the azure waters of the Maldives, each wave a whisper of serenity in paradise.
## 36 Rocking out to the guitar solos at a Queen tribute concert, a journey back in time with Freddie's spirit.
## 37 Swinging to the rhythms of a Frank Sinatra tribute, feeling the timeless charm of 'Fly Me to the Moon'.
## 38 In the mosh pit of a Metallica concert, the thunderous chords create a symphony of headbanging ecstasy.
## 39 Experiencing the magic of a Coldplay concert, where 'Fix You' becomes a beacon of hope in the night.
## 40 Discovering a hidden gem in the world of documentaries, the viewer is enlightened and inspired, feeling a renewed sense of curiosity.
## 41 As the closing scene unfolds, a sense of satisfaction washes over, completing the cinematic journey with a profound and fulfilling ending.
## 42 Facing a defeat in the championship, the boxer reflects on the challenges, vowing to return stronger and more determined in the next bout.
## 43 In the serene beauty of a sunset, nature unfolds a canvas of colors, evoking a sense of tranquility and wonder.
## 44 Embracing the aroma of freshly baked bread, the home chef finds joy in the art of baking, creating delicious memories for loved ones.
## 45 Got dressed for the day, then remembered it's Saturday. Oops. #WeekendVibes #TeenStruggles
## 46 Discovered a new book series and spent the whole night reading. Who needs sleep, anyway? #BookwormLife #LateNightReading
## 47 Exploring the world of digital art. It's never too late to discover new passions. #DigitalArtistry #LateBloomer
## 48 Exploring the art of meditation, finding tranquility in the stillness of the mind. #MeditationJourney #TranquilMind
## 49 Taking a stroll in the garden, appreciating the beauty of blooming flowers. Nature's wonders never cease. #GardenWalk #FloralBeauty
## 50 Attended a jazz concert and swayed to the rhythm of timeless tunes. Music, a constant companion in the golden years. #JazzConcert #SeniorMusic
## 51 Joined a writing group, penning down thoughts and reflections. Writing, a journey into the depths of the soul. #WritingGroup #SeniorWriter
## 52 Attended a vintage car show, reminiscing about the classics that once ruled the roads. Nostalgia in every rev. #VintageCars #ClassicRides
## 53 Embarked on a hiking adventure, conquering trails and relishing the beauty of nature. Age is just a number on the mountaintop. #HikingAdventure #SeniorHiker
## 54 Started learning ballroom dancing, gliding gracefully across the dance floor. Ageless elegance in every step. #BallroomDancing #SeniorDancer
## 55 Organized a community painting event, turning blank canvases into a masterpiece of shared creativity. #PaintingEvent #SeniorArtist
## 56 Joined a seniors' astronomy club, stargazing and finding wonder in the vastness of the cosmos. #AstronomyClub #SeniorStargazer
## 57 Started a blog sharing the wisdom gained through the years, proving that every day is a chance to learn and grow. #SeniorWisdom #Blog
## 58 Exploring the world of coding. Debugging is an adventure on its own! #CodingJourney #HighSchoolCoder
## 59 Building a time capsule to capture memories for the future. Time-traveling emotions!
## 60 Feeling down after not making the sports team. Disappointment lingers.
## 61 Dealing with unfounded rumors circulating about personal life. Rumors can be hurtful.
## 62 Celebrating a friend's birthday with a surprise party. Joyful moments and laughter all around!
## 63 Attending a school talent show to support classmates. Applauding the diverse talents on display!
## 64 Creating a beautiful mural with fellow art enthusiasts. The power of collaboration and creativity!
## 65 Achieving a personal best in a track and field competition. The thrill of victory and self-improvement!
## 66 Collaborating on a science project that received recognition at a regional fair. Science triumphs and smiles!
## 67 Participating in a multicultural festival, celebrating diversity with music, dance, and delicious food!
By contrast, these seem to be about internal thinking and emotionality.
Again, we can predict cluster memberships, or use them as predictors, to validate them.
Check out the cluster
package for additional information
about clustering.