Als ich auf die Idee kam, dass "Data Science Spaß macht und ich anfangen möchte!", Gab es Informationen zu "Methoden" wie Paketen wie Pandas und Modellen wie SVM, aber es gibt nur wenige Einführungen bekannter Fälle. Ich glaube schon. ~~ Ich bin nicht begeistert von Ayames Klassifizierung. ~~
Der Zweck dieses Artikels ist es daher, Ihnen eine Reihe von Datenanalyseprozessen am Beispiel der "Analyse zur Erhöhung der Anzahl der Ansichten von VOCALOIDs erstem veröffentlichten Werk" zu ermöglichen, die ich als Hobby durchgeführt habe. Ich hoffe, ich konnte Ihre Analyse und Motivation beeinflussen.
Wir werden mit der Analyse in der folgenden Reihenfolge fortfahren. Ich beziehe mich nicht auf etwas Spezifisches, aber ich bin mir der Form bewusst, die Programmiertechnologie beinhaltet, die auf dem Fluss empirischer Arbeiten unter Verwendung der metrischen Ökonomie basiert. [^ 1]
[^ 1]: Diese Analyse ist Teil des klassischen Datenanalyse-Frameworks, bei dem "zuerst eine Hypothese erstellt und dann mit Daten getestet wird". Ich denke, der Prozess unterscheidet sich vom Data-Mining-Ansatz, "nützliches Wissen aus unordentlichen Daten zu finden".
Der Hauptzweck dieses Artikels ist es, Sie über den Prozess der Datenanalyse zu informieren. Wenn Sie jedoch an den folgenden für die Analyse verwendeten Themen interessiert sind, schauen Sie bitte vorbei!
Sie haben Ihre erste Arbeit als Newcomer Bokaro P. abgeschlossen. Wenn ich eine Arbeit auf einer Video-Site poste, denke ich darüber nach, die Anzahl der Aufrufe so weit wie möglich zu erhöhen. Die Qualität des Songs selbst kann nicht mehr geändert werden, daher denke ich darüber nach, etwas für den Titel und die Poster-Kommentare zu entwickeln.
Die erste veröffentlichte Arbeit eines VOCALOID-Songs ist fast immer als "VOCALOID-Jungfernarbeit" gekennzeichnet. Auf der anderen Seite haben nur wenige Leute den "ersten Beitrag" in den Titel ihrer Arbeit gesetzt. (Zum Beispiel "[Hatsune Miku Original] ~ Titel ~ [Erster Beitrag]")
Wenn Sie dem Titel "erster Beitrag" hinzufügen, welche Art von Bild haben die Betrachter, wenn sie es sehen? Es gibt zwei mögliche Reaktionen: "Oh, ich werde dich fragen, was für ein Neuling du bist" und "Ich kann nicht anders, als dich zu fragen, ob du ein Neuling ohne Erfolgsbilanz bist." Wenn die erstere Reaktion vorherrscht, können Sie eine Zunahme der Anzahl der Aufrufe erwarten, indem Sie dem Titel ein Wort hinzufügen, um ihn auffälliger zu machen.
Daher möchte ich in diesem Artikel die Hypothese testen, dass sich die Anzahl der Aufrufe erhöhen kann, indem dem Titel der mit "VOCALOID maiden work" gekennzeichneten Werke "first post" hinzugefügt wird.
Die für diese Analyse benötigten Daten sind
-Die Arbeit mit dem Tag "VOCALOID maiden work"
Wird sein. Darüber hinaus werden wir die Daten der letzten 4 Jahre verarbeiten (Arbeiten von 2013 bis 2016).
Lassen Sie uns die Arbeitsinformationen aus dem Nico Nico-Video "Snapshot Search API v2" abrufen. Die Verwendung ist im offiziellen Handbuch beschrieben. http://site.nicovideo.jp/search-api-docs/snapshot.html
Die Punkte sind wie folgt.
[^ 2]: Verwendung des Versatzes: Wenn Sie beispielsweise nach der Anzahl der Ansichten sortieren und den Versatz auf 30 setzen, können Sie Werke nach dem 30. Rang angeben.
import urllib
import requests
import time
import pandas as pd
class NiconicoApi():
def __init__(self, keyword):
self.keyword = keyword
def gen_url(self, year, offset):
url_body = 'http://api.search.nicovideo.jp/api/v2/video/contents/search?'
url_query = urllib.parse.urlencode( {
'q': self.keyword,
'filters[startTime][gte]': '%i-01-01T00:00:00' % year,
'filters[startTime][lt]': '%i-01-01T00:00:00' % (year + 1),
'_offset': offset,
'targets': 'tags',
'fields': 'title,viewCounter,startTime',
'_sort': '-viewCounter',
'_limit': 100,
'_context': 'apiguide'
} )
self.url_ = url_body + url_query
return self
def get_json(self):
response = requests.get(self.url_)
self.json_ = response.json()
return self.json_
'''Daten bekommen'''
data = []
nicoApi = NiconicoApi('VOCALOID Jungfernarbeit')
for year in range(2013, 2017):
offset = 0
nicoApi.gen_url(year=year, offset=offset)
json = nicoApi.get_json()
while json['data']:
data += json['data']
offset += 100
nicoApi.gen_url(year=year, offset=offset)
json = nicoApi.get_json()
time.sleep(1)
'''Konvertierung in DataFrame'''
df = pd.DataFrame.from_dict(data)
df.shape # => (4579, 3)
Die Stichprobengröße beträgt jetzt 4579 [^ 3]. Da es sich um Daten für 4 Jahre handelt, wird berechnet, dass jedes Jahr mehr als 1000 Neuankömmlinge Bokaro P geboren werden.
[^ 3]: Stand 06.03.2017
Bevor wir uns mit der vollständigen Analyse befassen, erhalten wir einen schnellen Überblick über die Daten.
Zeichnen Sie zunächst die Anzahl der Wiedergaben auf der vertikalen Achse und die Rangfolge auf der horizontalen Achse. Da zu diesem Zeitpunkt vorhergesagt werden kann, dass es einen großen Unterschied in der Anzahl der Ansichten zwischen populären und unbekannten Werken gibt, werden wir die vertikale Achse auf der logarithmischen Skala nehmen.
import numpy as np
import matplotlib.pyplot as plt
df = df.sort_values('viewCounter', ascending=False)
ranking = np.arange(len(df.index))
view_counter = df['viewCounter'].values
plt.scatter(ranking, view_counter)
plt.yscale('log')
plt.grid()
plt.title('2013~2016 Ranking & ViewCounter')
plt.xlabel('Ranking')
plt.ylabel('ViewCounter')
plt.show()
Ergebnis:
――Es scheint, dass etwa 3/4 der Werke 100 bis 1000 Mal gespielt werden. ――Der Grad dieser Verzerrung, obwohl die vertikale Achse logarithmisch ist. Die Ungleichheit ist schrecklich ... ―― Da wir den Grad der Verzerrung der Verteilung und das Vorhandensein von Ausreißern bestätigen konnten, möchten wir ihn für zukünftige Analysen verwenden.
Für die Analyse ist es notwendig, Werke zu trennen, die "erster Beitrag" im Titel enthalten, und Werke, die dies nicht tun. Verwenden Sie die Pandas-Gruppe nach Methode.
Groupby übergibt häufig einen Spaltennamen als Argument, Sie können jedoch auch eine Funktion übergeben. Das Übergeben einer Funktion erleichtert das Gruppieren unter beliebigen Bedingungen.
Dieses Mal möchten wir nach "ob der Titel" erster Beitrag "enthält oder nicht" gruppieren. Definieren wir also die Funktion der Beurteilungsbedingung. Wir werden auch "jungfräuliche Arbeit", die die gleiche Bedeutung wie "erster Beitrag" hat, in die Analyse einbeziehen.
Definieren Sie eine Funktion mit einem anderen Rückgabewert, je nachdem, ob das Argument "First Post" oder "Virgin Work" enthält oder nicht.
def include_keyword(title):
if 'Erster Beitrag' in title:
return 'Erster Beitrag'
elif 'Erstes Buch' in title:
return 'Erstes Buch'
else:
return 'Kontrollgruppe'
Übergeben Sie die definierte Funktion als Argument von groupby. Dann wird die Funktion auf jedes Indexelement von df1 angewendet und gemäß dem Rückgabewert gruppiert. Es ist ähnlich wie Filter.
#Ändern Sie den Index in die Titelspalte
df1 = df[['viewCounter', 'title']].set_index('title')
#Gruppierung
df1_grouped = df1.groupby(include_keyword)
Nachdem die Gruppierung abgeschlossen ist, fahren wir mit einer detaillierten Analyse fort.
Wenn Sie den Durchschnittswert und den Medianwert für jede Gruppe berechnen und diese mit "Arbeiten mit Schlüsselwörtern (im Folgenden: Behandlungsgruppe)" und "Arbeiten ohne Schlüsselwörter (Kontrollgruppe)" vergleichen, "Auswirkungen des Einschlusses von Schlüsselwörtern (Effekte durch Einbeziehen von Schlüsselwörtern) Behandlungseffekt) ”kann gemessen werden.
Dann für jede Gruppe
Fragen wir nach.
Agg ist nützlich, um mehrere beschreibende Statistiken gleichzeitig zu finden. Durch Übergeben mehrerer Methoden als Array an das Argument von agg können diese Methoden gemeinsam auf df1_grouped angewendet werden.
functions = ['count', 'mean', 'median', 'std']
df1_summary = df1_grouped.agg(functions)
Ergebnis: ―― Von den 4579 Beispielen haben 109 Werke den "ersten Beitrag" im Titel und 144 Werke, darunter "jungfräuliche Arbeit". ――Die Ergebnisse zeigten, dass die Behandlungsgruppe sowohl im Durchschnitt als auch im Median mehr Regenerationen aufwies als die Kontrollgruppe. Mit anderen Worten, durch Hinzufügen eines Wortes "erster Beitrag" zum Titel scheint es in der Lage zu sein, Aufmerksamkeit zu erregen.
Betrachten wir von nun an zwei Gruppen, die "Behandlungsgruppe" und die "Kontrollgruppe", um die Analyse zu vereinfachen. Ändern Sie df1_grouped wie folgt.
def include_keyword(title):
if 'Erster Beitrag' in title or 'Erstes Buch' in title:
return 'Behandlungsgruppe'
else:
return 'Kontrollgruppe'
df1_grouped = df1.groupby(include_keyword)
df1_summary = df1_grouped.agg(functions)
df1_summary
Ergebnis:
Betrachten wir nun den Unterschied zwischen den beiden Gruppen in einem Diagramm.
X_treated = np.log(df1_grouped.get_group('Behandlungsgruppe').values)
X_untreated = np.log(df1_grouped.get_group('Kontrollgruppe').values)
plt.hist(X_treated, normed=True, bins=20, label='Behandlungsgruppe', color='r', alpha=0.5)
plt.hist(X_untreated, normed=True, bins=20, label='Kontrollgruppe', color='b', alpha=0.5)
plt.show()
Ergebnis:
Die Grafik zeigt auch den Unterschied in der Verteilung zwischen der Behandlungsgruppe und der Kontrollgruppe.
Übrigens wurde das gewünschte Ergebnis (die Anzahl der Ansichten erhöht sich durch Aufnahme des "ersten Beitrags" in den Titel) bisher vorgeschlagen, aber der im vorherigen Abschnitt erhaltene "Unterschied in der Anzahl der Ansichten zwischen der Behandlungsgruppe und der Kontrollgruppe" ist statistisch. Ich werde überprüfen, ob es signifikant ist (ist es ein Unterschied, der durch Zufall erklärt werden kann).
Wie bereits erwähnt, ist die Verteilung der Wiedergaben stark verzerrt. Sie sollten daher eher den Median als den Mittelwert betrachten. Es ist nicht der Medianvergleich der beiden Gruppen, aber eine Alternative ist der Mann-Whitney-U-Test [^ 4].
Der U-Test von Mann-Whitney stellt die Nullhypothese auf, dass die Form der Verteilung zwischen den beiden Gruppen dieselbe ist [^ 5]. Wenn diese Nullhypothese verworfen wird, ist die Anzahl der Wiederholungen in der Behandlungs- und Kontrollgruppe unerklärlich unterschiedlich.
Der U-Test wird im Statistikmodul von scipy bereitgestellt. Lass es uns testen.
from scipy import stats
result = stats.mannwhitneyu(X_treated, X_untreated)
print(result.pvalue) # => 0.00137327945838
Da der p-Wert 0,0014 beträgt, kann gesagt werden, dass die Verteilung zwischen den beiden Gruppen signifikant unterschiedlich ist. Du hast es geschafft!
[^ 5]: Um den Mann-Whitney-U-Test durchzuführen, muss die gleiche Streuung der beiden Gruppen angenommen werden, dies ist jedoch der Einfachheit halber weggelassen. Ich habe auch den Brunner-Munzel-Test ausprobiert, der keinen gleichmäßig verteilenden Prozess erfordert, und signifikante Ergebnisse gefunden, sodass die Ergebnisse robust zu sein scheinen. (Informationen zum Brunner-Munzel-Test finden Sie hier: http://oku.edu.mie-u.ac.jp/~okumura/stat/brunner-munzel.html)
Eine Sache, die bei einer solchen Analyse beachtet werden muss, ist die "falsche Korrelation". Man kann sagen, dass "Korrelation ≠ kausale Wirkung".
Alles, was wir bisher gemacht haben, ist, dass es einen Zusammenhang zwischen dem Hinzufügen eines "ersten Beitrags" zum Titel und der Anzahl der Aufrufe gibt. Wir werden prüfen, ob diese Korrelation als Kausalzusammenhang interpretiert werden kann.
Zum Beispiel besteht eine Korrelation zwischen Eisverkäufen und Wasserunfällen. Von hier aus scheint es grob zu sein, zu schließen, dass "das Essen von Eis Sie anfälliger für Wasserunfälle macht", oder?
Die wahre Ursache ist die "Jahreszeit". Das Vergessen, "Jahreszeit" zu berücksichtigen und zu der oben erwähnten falschen Korrelation zu führen, wird in metrischer wirtschaftlicher Hinsicht als "fehlende variable Verzerrung" bezeichnet. (In diesem Fall fehlt Variable = Saison)
Kehren wir zum VOCALOID-Song zurück. Was sind die möglichen Faktoren, wenn diese Analyse "fehlende Variablen" enthält?
Ich habe mir den Fall ausgedacht, dass "Datum der Veröffentlichung" eine fehlende Variable ist. Angenommen, die folgende Situation gilt.
――Die VOCALOID-Kultur ist in eine Phase des Niedergangs eingetreten, und die Anzahl der Aufrufe nimmt von 2013 bis 2016 ab. --VOCALOID Es ist eine alte Praxis, dem Titel eines Songs "ersten Beitrag" hinzuzufügen, und er ist kürzlich verschwunden.
Unter diesen Umständen sind die beiden Phänomene "Buchungsjahr ist alt -> hohe Anzahl von Ansichten" und "Buchungsjahr ist alt -> Hinzufügen des" ersten Beitrags "zum Titel" Überlappung ", wodurch eine gefälschte Korrelation entsteht. Ich verstehe das.
Lassen Sie uns überprüfen, ob es eine falsche Korrelation wie oben gibt. Zwei Spalten, die das "Beitragsjahr" und die "Behandlungsgruppe oder Kontrollgruppe" darstellen, werden im Voraus erstellt, und die Gruppierung wird basierend auf diesen beiden Spalten durchgeführt.
df2 = df.copy()
df2['title'] = df2['title'].apply(include_keyword)
df2['startTime'] = pd.DatetimeIndex(df2['startTime'])
# tz_Lokalisierung anwenden'startTime'Wird im Index angegeben
df2 = df2.set_index('startTime')
df2.index = df2.index.tz_localize('UTC').tz_convert('Asia/Tokyo')
df2['startTime'] = df2.index
df2['startTime'] = df2['startTime'].apply(lambda x: x.year)
df2_grouped = df2.groupby(['startTime', 'title']).viewCounter
df2_summary = df2_grouped.agg(functions)
df2_summary
Ergebnis: Auch wenn nach Buchungsjahr gruppiert, ist ersichtlich, dass die Anzahl der Ansichten der Behandlungsgruppe und der Kontrollgruppe mit Ausnahme von 2013 unterschiedlich ist.
Nachdem wir in der obigen Tabelle grob bestätigt haben, dass das Jahr der Veröffentlichung keine fehlende Variable ist, analysieren wir sie genauer unter Verwendung der multiplen Regression.
Angenommen, die Anzahl der Ansichten wird wie folgt bestimmt:
Hier sind die Details jeder Variablen wie folgt.
Als nächstes werde ich die Vorteile der Verwendung der multiplen Regression erläutern. Mit multipler Regression ist es möglich zu schätzen, "wie stark sich die Anzahl der Spiele zwischen der Behandlungsgruppe und der Kontrollgruppe unterscheidet, wenn der Zeittrend festgelegt ist ($ \ beta_1 $)". Daher ist es möglich, die offensichtliche Korrelation aufgrund von Zeittrends zu entfernen.
Der Nachteil hierbei ist, dass die durchschnittliche Anzahl von Spielen verwendet wird, um $ \ beta_1 $ zu schätzen, wodurch es anfälliger für Ausreißer wird.
Lass es uns laufen.
import statsmodels.formula.api as smf
def include_keyword(title):
if 'Erster Beitrag' in title or 'Erstes Buch' in title:
return 1
else:
return 0
df3 = df.copy()
df3['title'] = df3['title'].apply(include_keyword)
df3['startTime'] = pd.DatetimeIndex(df3['startTime'])
df3['timeTrend'] = df3['startTime'].apply(lambda x: (df3['startTime'].max() - x).days)
df3['lviewCounter'] = np.log(df3['viewCounter'])
mod = smf.ols('lviewCounter ~ title + timeTrend', data=df3).fit()
mod.summary()
Ergebnis:
Es kann gesagt werden, dass dieses Analyseergebnis robuster ist, da bestätigt wurde, dass das "Post-Datum und die Uhrzeit" keine fehlende variable Verzerrung erzeugt haben. Du hast es geschafft!
Damit ist die "Validitätsbewertung der Analyse" abgeschlossen. Wenn Sie jedoch der Meinung sind, dass es besser ist, auch diesen Faktor zu überprüfen, kommentieren Sie dies bitte!
Es ist lange her, aber vielen Dank, dass Sie so weit gelesen haben.
Basierend auf dieser Analyse habe ich dem Titel übrigens "erster Beitrag" hinzugefügt und ihn bei Nikodo gepostet, aber die Anzahl der Aufrufe betrug weniger als 200. Beachten Sie, dass statistische Trends nicht für Einzelfälle gelten.
Dieser Artikel endet, wenn ich eine Pointe bekomme. Ich würde mich freuen, wenn ich Ihnen etwas über den Analysefluss, das, worüber Sie vorsichtig sein müssen, und die Technologie, die Sie benötigen, erzählen könnte.