• Zuhause
  • Artikel
  • Digitale Blindheit: Lernen, das Gespräch zwischen zwei großen Banken und ihrem Publikum zu sehen
Veröffentlicht am 14-03-2019

Digitale Blindheit: Lernen, mit Python das digitale Gespräch zwischen zwei großen Bankenmarken und ihrem Publikum zu sehen

Sie lernen hier, wie Sie Emoji-Diagramme so zeichnen.

Neue "digitale" Banken werden in Brasilien immer beliebter. Es ist schwer, die genauen Gründe dafür zu finden, wir können durch die Untersuchung von Daten Einsicht in das Thema erhalten.

In diesem Artikel werden wir tiefer auf Tweets von zwei brasilianischen Banken eintauchen: Itaú und Nubank. Wir werden Python verwenden, um uns bei dieser Mission zu helfen.

Daten reinigen

Das Jupyter Notebook mit dem Code ist hier erhältlich.

Wir beginnen unsere Reise mit zwei Datensätzen im JSON-Format. Die Daten bestehen aus Tweets von beiden Banken zwischen 2014 und 2019 (Februar).

Lassen Sie uns einen der Datensätze importieren und mit Pandas bearbeiten.

Pandas als pd importieren
df_nubank = pd.read_json ("nubank_tweets.json")
df_nubank.head ()

Wir können sehen, dass dies Tweets von der Bank selbst sind, einige sind Antworten an andere Benutzer. Wir haben einige interessante Spalten: "created_at", "favorite_count" und "retweet_count".

Lassen Sie uns die Tweets nach „favorite_count“ sortieren und die nach Januar 2018 erstellten Tweets beibehalten. Wir müssen den Text bereinigen, aber wir duplizieren ihn und speichern ihn in einer neuen Spalte „original_tweet“, die uns später helfen wird.

df_nubank = df_nubank.sort_values ​​(nach = ['favorite_count'], aufsteigend = falsch) .copy ()
df_nubank = df_nubank.reset_index (drop = true)
df_nubank = df_nubank [df_nubank ["created_at"]> "2018–01–01"]]
df_nubank ["original_tweet"] = df_nubank ["text"]
df_nubank.head ()

Jede NLP-Pipeline (Natural Language Processing) beginnt mit der Textbereinigung. Lass es uns jetzt machen!

# Kleinschreibung
df_nubank ['text'] = df_nubank ['text']. apply (Lambda x: "" .join (x.lower () für x in x.split ()))
# Entfernen von Benutzernamen
df_nubank ['text'] = df_nubank ['text']. str.replace ('@ [^ \ s] +', "")
# URLs entfernen
df_nubank ['text'] = df_nubank ['text']. str.replace ('https?: \ / \ /.* [\ r \ n] *', '')
# Satzzeichen entfernen
df_nubank ['text'] = df_nubank ['text']. str.replace ('[^ \ w \ s]', '')
# Stoppwörter entfernen
von nltk.corpus importieren Stoppwörter
stop = stopwords.words ('portugiesisch')
df_nubank ['text'] = df_nubank ['text']. apply (lambda x: "" .join (x für x in x.split (), wenn x nicht in stop)
# Entfernen gebräuchlicher brasilianischer Namen -> Sie benötigen eine .txt-Datei, die Sie online finden können
names = pd.read_csv ('nomes.txt', Kodierung = 'lateinisch', header = keine)
name_list = (names [0] .str.lower ()). tolist ()
df_nubank ['text'] = df_nubank ['text']. apply (lambda x: "" .join (x für x in x.split (), wenn x nicht in name_list enthalten ist))
# Nummern entfernen
df_nubank ['text'] = df_nubank ['text']. str.replace ('\ d +', '')
# Entfernen von kleinen Wörtern -> z. B. é, tá, lá, pra usw
df_nubank ['text'] = df_nubank ['text']. str.replace (r '\ b (\ w {1,3}) \ b', '')
# Normalisieren
df_nubank.text = df_nubank.text.str.normalize ('NFKD') \
                               .str.encode ('ascii', Fehler = 'ignorieren') \
                               .str.decode ('utf-8')
# Leere Zeilen entfernen
importiere numpy als np
df_nubank ['text']. replace ('', np.nan, inplace = True)
df_nubank.dropna (subset = ['text'], inplace = True)
# Lassen Sie uns nur die ersten 10-KB-Tweets aus unserem Dataframe behalten
df_nubank = df_nubank [: 10000]
df_nubank.head ()

Inzwischen können Sie sehen, wie unterschiedlich unsere "Text" -Spalte im Vergleich zum "Original-Tweet" ist. Gehen wir zu unserer ersten Visualisierung: Word Clouds! Wir werden die Wordcloud-Bibliothek verwenden.

text = "" .join (Überprüfung zur Überprüfung in df_nubank.text)
von Wordcloud importieren Sie WordCloud, STOPWORDS
importieren Sie matplotlib.pyplot als plt
% matplotlib inline
Stoppwörter = gesetzt (STOPWORDS)
wordcloud = WordCloud (
    Breite = 3000,
    Höhe = 2000,
    background_color = 'schwarz',
    Stoppwörter = Stoppwörter) .generate (Text)
fig = plt.figure (
    figsize = (40, 30),
    facecolor = 'k',
    edgecolor = 'k')
plt.imshow (wordcloud, interpolation = 'bilinear')
plt.axis ('off')
plt.tight_layout (pad = 0)
plt.show ()
Von den Tweets von Nubank erzeugte Wortwolke.

Super, richtig ?! Machen wir dasselbe für Itaú und gehen wir zum Scattertext!

df_itau = pd.read_json ('itau_tweets.json')
# Sortierung nach Favoritenanzahl
df_itau = df_itau.sort_values ​​(durch = ['favorite_count'], aufsteigend = False) .copy ()
df_itau = df_itau.reset_index (drop = true)
df_itau = df_itau [df_itau ['created_at']> '2018-01-01']
df_itau ['original_tweet'] = df_itau ['text']
# Datenreinigung
# Kleinschreibung
df_itau ['text'] = df_itau ['text']. apply (lambda x: "" .join (x.lower () für x in x.split ()))
# Entfernen von Benutzernamen
df_itau ['text'] = df_itau ['text']. str.replace ('@ [^ \ s] +', "")
# URLs entfernen
df_itau ['text'] = df_itau ['text']. str.replace ('https?: \ / \ /.* [\ r \ n] *', '')
# Satzzeichen entfernen
df_itau ['text'] = df_itau ['text']. str.replace ('[^ \ w \ s]', '')
# Stoppwörter entfernen
von nltk.corpus importieren Stoppwörter
stop = stopwords.words ('portugiesisch')
df_itau ['text'] = df_itau ['text']. apply (lambda x: "" .join (x für x in x.split (), wenn x nicht in stop ist))
# Entfernen gebräuchlicher brasilianischer Namen -> Sie benötigen eine .txt-Datei, die Sie online finden können
names = pd.read_csv ('nomes.txt', Kodierung = 'lateinisch', header = keine)
name_list = (names [0] .str.lower ()). tolist ()
df_itau ['text'] = df_itau ['text']. apply (lambda x: "" .join (x für x in x.split (), wenn x nicht in name_list enthalten ist))
# Nummern entfernen
df_itau ['text'] = df_itau ['text']. str.replace ('\ d +', '')
# Entfernen von kleinen Wörtern -> z. B. é, tá, lá, pra usw
df_itau ['text'] = df_itau ['text']. str.replace (r '\ b (\ w {1,3}) \ b', '')
# Normalisieren
df_itau.text = df_itau.text.str.normalize ('NFKD') \
                               .str.encode ('ascii', Fehler = 'ignorieren') \
                               .str.decode ('utf-8')
# Leere Zeilen entfernen
df_itau ['text']. replace ('', np.nan, inplace = True)
df_itau.dropna (subset = ['text'], inplace = True)
# Nur die ersten 10k-Tweets verwenden
df_itau = df_itau [: 10000]
text_itau = "" .join (Überprüfung zur Überprüfung in df_itau.text)
# Wordcloud
Stoppwörter = gesetzt (STOPWORDS)
wordcloud = WordCloud (
    Breite = 3000,
    Höhe = 2000,
    background_color = 'schwarz',
    Stoppwörter = Stoppwörter) .generate (text_itau)
fig = plt.figure (
    figsize = (40, 30),
    facecolor = 'k',
    edgecolor = 'k')
plt.imshow (wordcloud, interpolation = 'bilinear')
plt.axis ('off')
plt.tight_layout (pad = 0)
plt.show ()
Wortwolke aus den Tweets von Itaú.

Wortwolken sind nicht die beste Art, Daten zu interpretieren. Der Vergleich von Größen und Intensitäten von Farben ist nicht einfach.

Scattertext

Aus dem Github-Repository:

„Ein Werkzeug, um in kleinen bis mittleren Corpora nach bestimmten Begriffen zu suchen und sie in einem sexy, interaktiven Streudiagramm mit nicht überlappenden Term-Labels darzustellen. Die explorative Datenanalyse hat einfach mehr Spaß gemacht. “

Wir werden es verwenden, um ein Streudiagramm der Wörter basierend auf der Häufigkeit und ohne Überlappung der Beschriftungen zu erstellen.

Lassen Sie uns beide Kategorien kombinieren und verwenden Sie die Spalten "created_at" und "original_tweet" als Metadaten

df_nubank ['bank'] = 'nubank'
df_nubank ['metadata'] = df_nubank.created_at.map (str) + "|" + df_nubank.original_tweet
df_nubank = df_nubank [['metadata', 'bank', 'text']]
df_itau ['bank'] = 'itau'
df_itau ['metadata'] = df_itau.created_at.map (str) + "|" + df_itau.original_tweet
df_itau = df_itau [['Metadaten', 'Bank', 'Text']]
df_scatter = df_nubank.append (df_itau)

Streudiagramm erstellen

scattertext als st. importieren
Spacy importieren
nlp = spacy.load ('pt')
corpus = (st.CorpusFromPandas (df_scatter,
                              category_col = 'Bank',
                              text_col = 'text',
                              nlp = nlp)
             .bauen()
             .get_unigram_corpus ()
             .compact (st.ClassPercentageCompactor (term_count = 1,
                                                   term_ranker = st.OncePerDocFrequencyRanker)))
html = st.produce_scattertext_explorer (Corpus,
                                       category = 'nubank',
                                       category_name = 'Nubank',
                                       not_category_name = 'Itaú',
                                       width_in_pixels = 1000,
                                       metadata = corpus.get_df () ['metadata'])
open ("visualization_nubank_itau.html", 'wb'). write (html.encode ('utf-8'))

Erkunden der Scattertext-HTML-Datei

Der obige Code generiert eine HTML-Datei. Sie können über diesen Link auf eine Live-Version zugreifen, aber ich werde einige Screenshots zur Veranschaulichung posten.

Das Bewegen eines Punktes mit dem Mauszeiger zeigt Statistiken über die relative Verwendung eines Begriffs in den zwei entgegengesetzten Kategorien. Versuchen Sie es live.

In der oberen linken Ecke sehen Sie die Wörter, die mehr von Nubank und weniger von Itaú verwendet werden. In der rechten unteren Ecke sehen Sie die Wörter, die mehr von Itaú und weniger von Nubank verwendet werden.

Die linke untere Ecke zeigt die am wenigsten häufigen Begriffe und die rechte obere Ecke die häufigsten.

Suche nach bestimmten Begriffen

Wir können sehen, dass "Ajudar" (Hilfe auf Portugiesisch) das charakteristischste Wort dieses Korpus ist. Sie können auf das Wort klicken oder es in das Suchfeld eingeben und sehen, wie oft es in jeder Kategorie erscheint.

Der Begriff "agência" (Agentur auf Portugiesisch) ist der oberste Begriff von Itaú und erscheint 586 Mal Es erscheint nur viermal in der Kategorie Nubank.

Itaú wurde am 2. Januar 1945 gegründet, während Nubank am 6. Mai 2013 gegründet wurde. Es ist vernünftig, dass wir solche Kontraste finden.

Der Begriff „Roxinho“ (eine niedliche Art, auf Portugiesisch lila zu sagen) ist der oberste Begriff von Nubank. Die Bank verwendet dieses Wort als Spitznamen für ihr Flaggschiff-Produkt: ihre Kreditkarte.

Emoji-Analyse

Scattertext einführender Text sagt:

"Explorative Datenanalyse hat jetzt mehr Spaß gemacht."

Lasst uns Spaß auf die nächste Ebene bringen, vergleichen wir die Emoji der Tweets beider Banken! Spielen Sie mit der Live-Version über diesen Link.

corpus = st.CorpusFromParsedDocuments (df_scatter,
                                      parsed_col = 'Metadaten',
                                      category_col = 'Bank',
                                      feats_from_spacy_doc = st.FeatsFromSpacyDocOnlyEmoji ()). build ()
html = st.produce_scattertext_explorer (Corpus,
                                       category = 'nubank',
                                       category_name = 'Nubank',
                                       not_category_name = 'Itaú',
                                       metadata = (corpus.get_df () ['metadata'])),
                                       width_in_pixels = 1000)
open ("emoji_nubank_itau.html", 'wb'). write (html.encode ('utf-8'))
Voilà! Versuchen Sie es live.

Ein Streudiagramm von Emoji basierend auf ihrer Nutzungshäufigkeit. Wie toll ist das ?!

Wir sehen überall Herzen, aber einen klaren Unterschied zwischen ihrer Farbe. Denken Sie daran, dass wir die Tweets nur für diejenigen ab Januar 2018 gefiltert haben und 2018 ein Weltmeisterschaftsjahr war.

Die Farbe der Herzen von Itaú war am stärksten von der brasilianischen Flagge und der Hauptfarbe der Bank: Orange. Die Bank ist offizieller Sponsor der brasilianischen Fußballmannschaft.

Die Herzen von Nubank folgten der charakteristischen Farbe der Marke: Lila.

Einpacken

Spielen Sie mit den Plots herum, um zu sehen, wie mächtig sie sind. Wenn Ihnen dieser Artikel gefallen hat, empfehlen Sie ihn und teilen Sie ihn mit Ihren Freunden.

Haftungsausschluss

Diese Analyse wurde basierend auf öffentlich verfügbaren Daten der Social-Media-Kanäle der Marke durchgeführt, um die Anwendung eines von unseren Ingenieuren entwickelten Algorithmus zu veranschaulichen. Wir haben keine Verbindung zu diesen Marken.

Zitat für die Scattertext-Bibliothek: Jason S. Kessler. Scattertext: Ein Browser-basiertes Tool zur Visualisierung der Unterschiede zwischen Corpora. ACL-Systemvorführungen. 2017

Siehe auch

Die sechsundzwanzig DingePODCAST: Neue Episode mit Robotics Experts von SoftBank, RoboKind und John Deere