Redditing From Home – Explorer les données
Les Redditors restent-ils debout de plus en plus tard? Découvrons-le avec Python.
Il ne fait aucun doute que cette pandémie a bouleversé nos horaires. J’écris cette introduction à minuit en ce moment, et de temps en temps, je dois me rappeler quel jour il est sur le calendrier.
Ce problème a suscité une curiosité en moi – combien d’autres ont rencontré ce problème? Le Redditor de longue date en moi s’est alors demandé si les modèles d’utilisation sur un site comme Reddit différeraient pendant ces temps extraordinaires. Les gens se réveillaient sûrement plus tard, dormant plus tard – leurs routines diurnes étaient légèrement modifiées, voire perturbées. La WFH, ou apprentissage à domicile pour les étudiants, élimine les temps de trajet, une heure de pointe essentielle pour la consommation des médias sociaux.
Il serait certainement intéressant de savoir comment les utilisateurs de mon subreddit r / singapour serait de changer leurs habitudes. Comment procéder pour analyser cela?
Une hypothèse simple peut être suggérée: Les Redditors singapouriens resteraient debout plus tard et participeraient davantage la nuit, tandis que l’activité le matin en semaine baisserait.
On peut également suggérer une 2ème hypothèse: la différence dans les modes d’utilisation entre les jours de la semaine et les week-ends diminuerait pendant la pandémie de COVID-19. Essentiellement, les jours de semaine et les week-ends commenceraient à se ressembler.
Hypothèses
Compte tenu des différents facteurs qui entrent en jeu, nous pouvons faire quelques hypothèses:
- Une plus grande proportion de Redditors resterait à la maison pendant cette période.
- Le changement d’habitudes dû au COVID-19 resterait constant pendant la période choisie, étant donné qu’il n’y a eu aucun changement radical dans les mesures de verrouillage.
Choisir notre jeu de données
Reddit est ÉNORME. Compte tenu des nombreuses soumissions quotidiennes sur le subreddit r / singapour, ainsi que des contraintes de collecte de données, nous avons besoin d’une bonne étendue de données à analyser. Un choix idéal: le fil du jour épinglé au sommet du subreddit.
Vous voyez, tous les matins, à 6h du matin, un fil de discussion quotidien a été automatiquement créé pour que les utilisateurs contribuent des commentaires. Les utilisateurs étaient autorisés à partager n’importe quoi sur leur vie: de leur trajet, à leurs relations, et même à leurs patrons au travail (quelquefois).
La nature de ces conversations ici était insouciante, et il ne serait pas surprenant non plus de se réveiller avec un « Bonjour » message sur le fil. Ces conversations ont facilement accumulé plus de 1000 commentaires en une journée.
Maintenant, si nous collectons tout ces fils de la période COVID-19, et les comparer à une période précédente pour voir comment la distribution des commentaires différait, peut-être quelques modèles intéressants pourraient émerger.
Décidons d’abord de la période à couvrir. Étant donné que les mesures de verrouillage sont entrées en vigueur début avril 2020, nous pourrions passer une semaine à la mi-avril si nous considérons que le changement des habitudes de nos utilisateurs aurait besoin d’un certain temps pour prendre effet. Nous comparons les périodes suivantes:
- 13 avril 2020 au 24 mai 2020 (6 semaines)
- 15 avril 2019 au 26 mai 2019 (6 semaines)
Une période de 6 semaines devrait être un ensemble de données suffisamment volumineux pour être examiné. Nous comparons cela avec le même délai d’un an, économisons quelques jours de différence car nous voulons que cet ensemble de données commence également un lundi. Le choix d’utiliser les données 2019 au lieu des premiers mois de 2020 est dû à la possibilité qu’il puisse y avoir saisonnalité dans les modèles de commentaires. Un exemple d’une telle saisonnalité: les étudiants restent debout plus tard en raison des examens de mi-année.
Pour collecter les données, nous aurions besoin d’une sorte d’API avec laquelle extraire. Pour cela, nous pouvons utiliser l’API Reddit ou l’API Pushshift.
Gratter les fils avec PRAW
Personnellement, j’ai préféré les fonctions de recherche de l’API Reddit pour extraire les threads. L’encapsuleur Python Reddit API (PRAW) est facile à utiliser, tout en autorisant jusqu’à 30 requêtes par minute.
Après importation de PRAW, nous définissons le subreddit r / singapore avant d’effectuer des recherches avec les titres de threads respectifs pour chaque mois. Voici un exemple de notre première recherche:
import praw#define subreddit
subreddit = reddit.subreddit('singapore')#make a search
apr2019 = subreddit.search('random discussion and small questions April 2019')
Après avoir effectué toutes les recherches pertinentes, nous créons un dictionnaire pour nous de stocker les détails de chaque fil. Nous commençons ensuite à ajouter à ce dictionnaire.
Remarque: Je me réfère à chacun fil comme un submission
dans le code. Ils signifient la même chose.
submissions_dict = { 'title':[], 'created_utc': [], 'comms_num': [], 'id':[]}for submission in generator:
submissions_dict['title'].append(submission.title)
submissions_dict['created_utc'].append(submission.created_utc)
submissions_dict['comms_num'].append(submission.num_comments)
submissions_dict['id'].append(submission.id)
Enfin, nous stockons ce dictionnaire dans un pandas Trame de données:
import pandas as pd
submissionsRaw = pd.DataFrame(submissions_dict)
Il est temps de travailler avec notre DataFrame! Voici un bref résumé des colonnes supplémentaires ajoutées:
-
timestamp
: nous utilisons lefromtimestamp
méthode pour obtenir le datetime réel -
year
: dérivé de notre nouveautimestamp
colonne -
dayOfWeek
: dérivé en utilisant leweekday
méthode -
typeOfDay
: En utilisant ledayOfWeek
, nous classons les jours en semaine / week-end. Nous pouvons également apporter quelques ajustements en supposant que les jours fériés tombés en semaine seraient essentiellement des week-ends. Un exemple serait le Vendredi Saint.
Un DataFrame grossier comme celui-ci nous sera présenté:
Premier coup d’œil: les week-ends ont moins de commentaires que les jours de semaine
Après avoir éliminé les publications qui ne tombent pas dans notre délai d’analyse, nous aurons finalement un DataFrame appelé submissions.
Jetons un coup d’œil rapide avec un table pivot, regroupement par year
et dayOfWeek
colonnes et la recherche du nombre moyen de commentaires chaque jour de la semaine a:
Il semble qu’en moyenne, le nombre de commentaires en 2020 ait augmenté. D’après les faits saillants que nous avons faits, nous pouvons dire que les commentaires sont les plus élevés au début de la semaine, tandis que les week-ends voient le plus petit nombre de commentaires.
Intéressant! On pourrait penser que ce serait l’inverse… ..
Scraping des commentaires avec l’API Pushshift
Si vous pensez que nous avons terminé… non, pas encore. Nous avons encore besoin de l’heure exacte à laquelle chaque commentaire a été écrit!
Nous utiliserons l’API Pushshift pour gratter les commentaires. Maintenant, l’API Reddit peut faire la même chose, mais extraire près de 1000 commentaires par thread (dont nous avons environ 80) serait plutôt lent. Avec Pushshift, tout ce dont vous avez besoin est l’ID de thread unique, et il vous renvoie tous les commentaires dans un seul fichier JSON:
Après avoir vérifié s’il existe des valeurs nulles, nous résumons et trouvons plus de 83 000 commentaires dans notre ensemble de données.
Félicitations pour s’être accroché! La partie exténuante est terminée, ouf. La collecte de données prend toujours le plus de temps, mais c’est honnêtement la partie la plus importante. Vient maintenant la partie la plus amusante: observons la répartition de nos données.
Nous allons expérimenter avec 3 types de graphiques différents, en explorant leurs avantages et leurs inconvénients.
Parcelles de violon
Les tracés de violon sont un excellent moyen d’afficher plusieurs distributions dans un ensemble de données. Nous verrons comment, en séparant nos données par type de journée et en constatant la répartition des données entre les heures de la journée. Nous tracerons en utilisant Seaborn:
sns.violinplot(x='subm_typeOfDay', y='comment_hour', hue='subm_year', data=commentsDf, split=True)
Il semble que nos violons ressemblent plutôt à du poisson! Mais ce n’est pas surprenant. Il est naturel qu’il n’y ait pratiquement personne éveillé pour commenter entre les petites heures de 3h et 6h du matin (sauf peut-être moi).
Ce qui précède n’est pas aussi informatif que nous l’aurions souhaité. En effet, les tracés de violon sont lissés juste pour donner une forme globale aux données et nous donner une idée approximative de leur apparence. Nous pouvons, cependant, comparer les pics pour voir quels moments ont une densité de probabilité plus élevée, et nous pouvons voir que Les jours de semaine 2020 semblent avoir un pic plus élevé à minuit.
Mais même en sachant cela, il est toujours difficile de lui attribuer un chiffre. Les points exacts sont ajoutés et lissés à l’aide d’une bande passante que vous pouvez facilement manipuler. Vous pouvez voir ce qui se passe si vous réduisez la bande passante en dessous de la valeur par défaut, en ajoutant un argument bw
:
sns.violinplot(x='subm_typeOfDay', y='comment_hour', hue='subm_year', data=commentsDf, split=True, bw =0.05)
Cela n’aide pas du tout.
J’aime quand même un peu l’intrigue ci-dessous:
sns.violinplot(x='subm_year', y='comment_hour', hue='subm_typeOfDay', palette='Set2', data=commentsDf, split=True)
Vous pouvez voir que les données 2019 ont une forme relativement différente entre les jours de la semaine et les week-ends. L’activité à minuit est plus faible en semaine qu’en week-end.
Alors que les données 2020 semblent plus symétriques. La queue de notre poisson regarde presque parfait. Notre deuxième hypothèse selon laquelle les Redditors font à peine la différence entre un jour de semaine et un week-end est peut-être juste.
Mais les formes ne sont que des formes. Plongeons plus profondément!
Histogrammes
Les histogrammes sont meilleurs lorsque l’on regarde les bacs individuels, qui, dans ce cas, correspondent aux heures de la journée. Si vous ne l’avez pas remarqué, nos violons dans les parcelles avant s’étiraient au-delà des heures 0-24, ce qui se produit lorsque nous utilisons la densité de probabilité. Ce n’est donc pas exactement la représentation la plus idéale, mais assez lancinante à ce sujet.
Nous allons maintenant utiliser l’histogramme de Matplotlib, tout en utilisant le style «seaborn» pour le rendre un peu moins laid:
plt.hist(comments19['comment_hour'], bins = bins, alpha = 1, edgecolor = 'white', label = '2019')
plt.hist(comments20['comment_hour'], bins = bins, alpha = 0.66, edgecolor = 'white', label = '2020')
Pour le rendre un peu plus agréable pour les yeux, nous pouvons superposer les données de 2020 au-dessus de celles de 2019, réduisant son opacité de comparaison. Nous remarquons que ce n’est que de 6 heures à 9 heures qu’il y a eu plus de commentaires en 2019. À d’autres intervalles de la journée, 2020 a plus de commentaires. Mais quelque chose ne va pas tout à fait. Et si la croissance des commentaires était motivée par une croissance des utilisateurs?
Rendons les choses plus justes en comparant les fréquence relative de chaque intervalle:
plt.hist(comments19['comment_hour']/3, bins = bins, alpha = 1, edgecolor = 'white', label = '2019', density = True)
plt.hist(comments20['comment_hour']/3, bins = bins, alpha = 0.66, edgecolor = 'white', label = '2020', density = True)
Maintenant, on peut dire avec plus de confiance: Les rédacteurs en 2020 commentent moins entre 6 heures et 15 heures.
Ils commentent aussi plus la nuit aussi! Plongeons-nous dans ceci en le regardant heure par heure:
La tendance suit. Une augmentation des commentaires nocturnes en 2020, avec moins de commentaires hâtifs. C’est aussi fascinant qu’un écart existe toujours de 11h à 12h! Les gens en 2020 se réveillent-ils de plus en plus tard, même après 12 heures? Ou le déjeuner-Redditing n’est plus une chose puisque nous pouvons faire une pause à tout moment à la maison?
Une chose qui reste constante cependant, c’est la fréquence des commentaires de 15h à 12h. Je suppose que les habitudes n’y ont pas vraiment changé puisque presque tout le monde était déjà réveillé à ce moment-là.
Une chose que nous avons peut-être oubliée en ce moment est que nous comparons les années 2019 et 2020 en utilisant tous les jours de la semaine. Ce n’est pas tout à fait juste. Les gens devraient être autorisés à dormir le week-end (pas de jugement là-bas).
Comparons seulement les jours de la semaine:
Les différences sont toujours présentes!
D’accord, alors qu’en est-il de notre 2e hypothèse? Avec notre tracé de violon, nous avons remarqué une distribution plus symétrique des données en 2020 entre les jours de la semaine et les week-ends. Essayons de le prouver avec un histogramme, en mettant 2019 et 2020 côte à côte:
fig,ax = plt.subplots(1,2, figsize = (18,8), sharey= True)