[PYTHON] Kaggle Zusammenfassung: Outbrain # 1

Einführung

Wir werden die Informationen von Kaggle aktualisieren, der in der Vergangenheit teilgenommen hat. Hier werden wir die Dateneinführung von Outbrain Click Prediction und die prominente Diskussion im Forum aufgreifen. Der Code des Gewinners des Wettbewerbs ist in Kaggle Summary: Outbrain (Part 2) zusammengefasst. Dies ist eine Zusammenfassung und eine Zusammenfassung jeder Datenanalyse. (Derzeit im Bau)

Dieser Artikel verwendet Python 2.7, Numpy 1.11, Scipy 0.17, Scikit-Learn 0.18, Matplotlib 1.5, Seaborn 0.7, Pandas 0.17. Es wurde bestätigt, dass es an einem Jupiter-Notebook funktioniert. (Bitte ändern Sie% matplotlib inline entsprechend) Wenn Sie beim Ausführen des Beispielskripts Fehler finden, ist es hilfreich, wenn Sie einen Kommentar abgeben können.

Inhaltsverzeichnis

  1. Übersicht
  2. Bewertungsindex
  3. Einführung von Daten
  4. kernels

Hintergrund

front_page.png

Im Internet handeln viele Benutzer basierend auf ihren Communitys und Erfahrungen, entdecken neue Artikel und streben basierend auf den entdeckten Artikeln das nächste Ziel an. Outbrain bietet Benutzern eine Plattform für die Bereitstellung von Inhalten, die sie zu einem Ort führt, der ihren Vorlieben entspricht. Outbrain gibt jeden Monat 250 Milliarden persönliche Empfehlungen an Tausende von Websites ab. Dieses Mal bitten wir kaggler, das Verhalten des Benutzers anhand des Klickverlaufs des Benutzers vorherzusagen. Und wir wollen ein Empfehlungsalgorithmus sein, der Geschichten liefert, die Benutzer mehr denn je zufriedenstellen.

Die charakteristischen Punkte dieser Zeit sind wie folgt.

2. Bewertungsindex

Der Bewertungsindex lautet diesmal Mean Average Precision @ 12.

Screen Shot 2017-01-12 at 7.42.08.png

Details sind in den Link geschrieben, aber es ist ein abgeleitetes System von MAP (durchschnittliche Genauigkeitsrate). Die Genauigkeitsrate ist die Genauigkeit in Bezug auf F-Wert und ROC. Da die Erklärungen auf Japanisch und verwandte Erklärungen wesentlich sind, werden die Erklärungen hier weggelassen.

Darüber hinaus drückt das Format der übermittelten Datei die Entsprechung zwischen display_id und ad_id in CSV aus, und ad_id ist eine durch Leerzeichen getrennte Liste.

display_id,ad_id
16874594,66758 150083 162754 170392 172888 180797
16874595,8846 30609 143982
16874596,11430 57197 132820 153260 173005 288385 289122 289915
etc.

3. Einführung von Daten

Diese Daten sind Zeitreihen- und Kategoriedaten, die in eine große Anzahl von Dateien unterteilt sind. Der Browserverlauf und der Klickverlauf des Benutzers umfassen ungefähr zwei Wochen vom 14. bis 28. Juni auf mehreren Websites in den USA. Die Details sind wie folgt.

Die Daten enthalten Empfehlungen für jeden Benutzer in einem bestimmten Kontext. Der Kontext hier ist ein Empfehlungssatz für den Benutzer. Jeder Kontext wird durch display_id dargestellt. Es enthält auch Empfehlungen, auf die mindestens ein Benutzer für jede display_id geklickt hat. In diesem Wettbewerb besteht das Ziel darin, das Empfehlungsranking zu bestimmen, indem die Klickvorhersagen in absteigender Reihenfolge angeordnet werden.

Es ist zu beachten, dass diese Daten sehr große relationale Daten sind. Wenn Sie sich einen Teil der Tabelle ansehen, ist er klein genug, um in den Speicher zu passen, aber die Datenlänge der Seitenansicht beträgt mehr als 200 Millionen Zeilen und es sind 100 GB unkomprimierte Daten.

Datenfeld

In den Daten wird der Benutzer durch eine eindeutige UUID dargestellt. Websites, die Benutzer sehen können, werden durch document_id dargestellt. Jedes Dokument hat eine Anzeige, die durch ad_id angezeigt wird. Jede Anzeige verfügt über eine Kampagnen-ID, die vom Werbetreibenden bereitgestellt wird und von der Werbetreibenden-ID angegeben wird. Es gibt auch document_id-Metadaten. Welche Produkte erregten Aufmerksamkeit, Klassifizierung von Kategorien, Themen von Interesse und Anbieter von document_id.

Dateidetails

Als nächstes wird jede Datei erklärt. Diesmal gibt es 6 Arten von Dateien. Natürlich werden alle Daten anonymisiert und verarbeitet, so dass der einzelne Benutzer nicht identifiziert wird.

1. page_views.csv Dies sind die Daten der vom Benutzer besuchten Artikel. Aus Platzgründen werden die Zeitstempel für jeden Datensatz nur beim ersten Besuch aufgelistet. Wenn Sie die tatsächliche Epochenzeit wiederherstellen möchten, fügen Sie dem Zeitstempel 1465876799998 hinzu.

2. clicks_train.csv Dies ist die Geschichte der Klicks auf Anzeigen.

In ähnlicher Weise wird auch clicks_test.csv bereitgestellt, aber es wird angeklickt, dh die richtigen Antwortdaten werden nicht angehängt. Das Ziel dieser Zeit ist es, ein Modell zu erstellen, das vorhersagt, dass aus dieser Datei geklickt wird. Jede display_id wird nur einmal angeklickt. Die display_id der Testdaten enthält den Zeitrahmen des gesamten Datensatzes.

3. events.csv Stellt den Kontext von display_id bereit. Dieser Inhalt wird häufig trainiert und getestet.

4. promoted_content.csv Bietet Werbedetails.

  1. documents_meta.csv Detaillierte Informationen zum Dokument.
  1. documents_topics.csv, documents_entities.csv, documents_categories.csv Beinhaltet Beziehungen zwischen Dokumenten. Detaillierte Informationen sind wie folgt.

page_view.png

  1. Forum

4.1. Analyse der Hauptdaten (Klickinformationen)

Analysieren Sie die Hauptdaten. Überprüfen Sie zunächst die Datei

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os
import gc # We're gonna be clearing memory a lot
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

p = sns.color_palette()

print('# File sizes')
for f in os.listdir('../input'):
    if 'zip' not in f:
        print(f.ljust(30) + str(round(os.path.getsize('../input/' + f) / 1000000, 2)) + 'MB')
# File sizes
page_views_sample.csv         454.35MB
documents_meta.csv            89.38MB
documents_categories.csv      118.02MB
events.csv                    1208.55MB
clicks_test.csv               506.95MB
promoted_content.csv          13.89MB
documents_topics.csv          339.47MB
documents_entities.csv        324.1MB
sample_submission.csv         273.14MB
clicks_train.csv              1486.73MB

Sie können sehen, dass es viele CSV-Dateien gibt. Als nächstes konzentrieren wir uns auf clicks_train und clicks_test zur Analyse.

df_train = pd.read_csv('../input/clicks_train.csv')
df_test = pd.read_csv('../input/clicks_test.csv')
sizes_train = df_train.groupby('display_id')['ad_id'].count().value_counts()
sizes_test = df_test.groupby('display_id')['ad_id'].count().value_counts()
sizes_train = sizes_train / np.sum(sizes_train)
sizes_test = sizes_test / np.sum(sizes_test)

plt.figure(figsize=(12,4))
sns.barplot(sizes_train.index, sizes_train.values, alpha=0.8, color=p[0], label='train')
sns.barplot(sizes_test.index, sizes_test.values, alpha=0.6, color=p[1], label='test')
plt.legend()
plt.xlabel('Number of Ads in display', fontsize=12)
plt.ylabel('Proportion of set', fontsize=12)

Das Ausführungsergebnis ist wie folgt

__results___4_1.png

Das Verhältnis der Anzahl der im Display enthaltenen Anzeigen wurde visualisiert. Schauen wir uns als nächstes das Histogramm an, um zu sehen, wie oft die gleiche Anzahl von Anzeigen insgesamt erscheint.

ad_usage_train = df_train.groupby('ad_id')['ad_id'].count()

for i in [2, 10, 50, 100, 1000]:
    print('Ads that appear less than {} times: {}%'.format(i, round((ad_usage_train < i).mean() * 100, 2)))

plt.figure(figsize=(12, 6))
plt.hist(ad_usage_train.values, bins=50, log=True)
plt.xlabel('Number of times ad appeared', fontsize=12)
plt.ylabel('log(Count of displays with ad)', fontsize=12)
plt.show()
Ads that appear less than 2 times: 22.69%
Ads that appear less than 10 times: 61.74%
Ads that appear less than 50 times: 86.93%
Ads that appear less than 100 times: 91.04%
Ads that appear less than 1000 times: 97.45%

__results___6_1.png

Es wurde festgestellt, dass die Mehrheit der Anzeigen nur wenige Male angezeigt wurde und die Anzahl der Anzeigen, die viele Male angezeigt wurden, relativ gering war. Dies bedeutet, dass wir das Benutzerverhalten anhand beispielloser Daten darüber abschätzen müssen, ob der Benutzer geklickt hat.

Überprüfen Sie abschließend das Verhältnis doppelter Anzeigen in Test und Zug.

ad_prop = len(set(df_test.ad_id.unique()).intersection(df_train.ad_id.unique())) / len(df_test.ad_id.unique())
print('Proportion of test ads in test that are in training: {}%'.format(round(ad_prop * 100, 2)))
Proportion of test ads in test that are in training: 82.87%

Es stellte sich heraus, dass 82% der Anzeigen auch im Test angezeigt werden. Es kann sinnvoll sein, ein Vorhersagemodell basierend auf diesen Werbeinformationen zu erstellen.

Events

Die Analyse von Zeitstempeln und geografischen Informationen wird in der später beschriebenen Analyse detailliert zusammengefasst. Hier werden wir Ereignisse analysieren.

try:del df_train,df_test # Being nice to Azure
except:pass;gc.collect()

events = pd.read_csv('../input/events.csv')
print('Shape:', events.shape)
print('Columns', events.columns.tolist())
events.head()
display_id	uuid	document_id	timestamp	platform	geo_location
0	1	cb8c55702adb93	379743	61	3	US>SC>519
1	2	79a85fa78311b9	1794259	81	2	US>CA>807
2	3	822932ce3d8757	1179111	182	2	US>MI>505
3	4	85281d0a49f7ac	1777797	234	2	US>WV>564
4	5	8d0daef4bf5b56	252458	338	2	SG>00

Ich verstehe den Inhalt der Daten. Als nächstes schauen wir uns die Plattform an.

plat = events.platform.value_counts()

print(plat)
print('\nUnique values of platform:', events.platform.unique())
2     10684579
1      8747280
3      3032907
2       291699
1       279988
3        83668
\N           5
Name: platform, dtype: int64

Unique values of platform: [3 2 1 '2' '1' '3' '\\N']

Aus den Ergebnissen ist ersichtlich, dass 1, 2 und 3 Plattformen sowohl für float als auch für string viele Male wiederholt werden. Schauen wir uns die Plattform weiter an.

events.platform = events.platform.astype(str)
plat = events.platform.value_counts()

plt.figure(figsize=(12,4))
sns.barplot(plat.index, plat.values, alpha=0.8, color=p[2])
plt.xlabel('Platform', fontsize=12)
plt.ylabel('Occurence count', fontsize=12)

__results___13_1.png

Es ist nicht klar, was die Plattformen 1, 2 und 3 anzeigen, aber es kann vorausgesagt werden, dass es wahrscheinlich drei Typen gibt: PC, Telefon und Tablet. Ist die \ N- oder Zeichenfolgentypnummer ein abnormaler Wert, der durch einen Fehler verursacht wurde? Hier scheint es schwierig, weitere Vorhersagen zu treffen.

Als nächstes werden wir uns eingehender mit UUID befassen.

uuid_counts = events.groupby('uuid')['uuid'].count().sort_values()

print(uuid_counts.tail())

for i in [2, 5, 10]:
    print('Users that appear less than {} times: {}%'.format(i, round((uuid_counts < i).mean() * 100, 2)))
    
plt.figure(figsize=(12, 4))
plt.hist(uuid_counts.values, bins=50, log=True)
plt.xlabel('Number of times user appeared in set', fontsize=12)
plt.ylabel('log(Count of users)', fontsize=12)
plt.show()
uuid
ef7761dd22277c    38
45d23867dbe3b3    38
c0bd502c7a479f    42
2759b057797f02    46
b88553e3a2aa29    49
Name: uuid, dtype: int64
Users that appear less than 2 times: 88.42%
Users that appear less than 5 times: 99.51%
Users that appear less than 10 times: 99.96%

__results___15_1.png

Es scheint, dass derselbe Benutzer mehrere zehn Mal erscheint. Da die meisten von ihnen mehrmals auftreten, scheint es schwierig zu sein, ein benutzerbasiertes Vorhersagemodell zu erstellen.

Darüber hinaus scheint es, dass eine große Menge an Speicher verbraucht wird, um die dem Benutzer zugeordnete Analyse in allen Kombinationen auszuführen, wie beispielsweise der kooperativen Filterung.

Categories Outbrain liefert die Ergebnisse des Pre-Clustering. Wir werden die Häufigkeit des Auftretens von Themendaten und Kategoriedaten visualisieren.

try:del events
except:pass;gc.collect()

topics = pd.read_csv('../input/documents_topics.csv')
print('Columns:',topics.columns.tolist())
print('Number of unique topics:', len(topics.topic_id.unique()))

topics.head()
document_id	topic_id	confidence_level
0	1595802	140	0.073113
1	1595802	16	0.059416
2	1595802	143	0.045421
3	1595802	170	0.038867
4	1524246	113	0.196450

Als nächstes streben wir das Vertrauensniveau an.

topic_ids = topics.groupby('topic_id')['confidence_level'].count().sort_values()

for i in [10000, 50000, 100000, 200000]:
    print('Number of topics that appear more than {} times: {}'
          .format(i, (topic_ids > i).sum()))

plt.figure(figsize=(12, 4))
sns.barplot(topic_ids.index, topic_ids.values, order=topic_ids.index, alpha=1, color=p[5])
plt.xlabel('Document Topics', fontsize=12)
plt.ylabel('Total occurences', fontsize=12)
plt.show()
Number of topics that appear more than 10000 times: 201
Number of topics that appear more than 50000 times: 86
Number of topics that appear more than 100000 times: 22
Number of topics that appear more than 200000 times: 3

__results___18_1.png

Sie können sehen, dass es von nahe Null bis 300.000 weit offen ist.

cat = pd.read_csv('../input/documents_categories.csv')
print('Columns:', cat.columns.tolist())
print('Number of unique categories:', len(cat.category_id.unique()))

cat_ids = cat.groupby('category_id')['confidence_level'].count().sort_values()

for i in [1000, 10000, 50000, 100000]:
    print('Number of categories that appear more than {} times: {}'
          .format(i, (cat_ids > i).sum()))

plt.figure(figsize=(12, 4))
sns.barplot(cat_ids.index, cat_ids.values, order=cat_ids.index, alpha=1, color=p[3])
plt.xlabel('Document Categories', fontsize=12)
plt.ylabel('Total occurences', fontsize=12)
plt.show()
Columns: ['document_id', 'category_id', 'confidence_level']
Number of unique categories: 97
Number of categories that appear more than 1000 times: 88
Number of categories that appear more than 10000 times: 65
Number of categories that appear more than 50000 times: 35
Number of categories that appear more than 100000 times: 15

__results___19_1.png

Ich konnte auch die Kategoriedaten visualisieren.

4.2. Analyse geografischer Daten

Wir werden jedes Land analysieren und uns auf die Vereinigten Staaten konzentrieren. Lesen Sie die Daten.

import pandas as pd
import warnings
warnings.filterwarnings('ignore')

page_views_sample_df = pd.read_csv("../input/page_views_sample.csv", usecols=['uuid', 'geo_location'])
# Drop NAs
page_views_sample_df.dropna(inplace=True)
# Drop EU code
page_views_sample_df = page_views_sample_df.loc[~page_views_sample_df.geo_location.isin(['EU', '--']), :]
# Drop duplicates
page_views_sample_df = page_views_sample_df.drop_duplicates('uuid', keep='first')

Als nächstes zählen Sie nach Land.

country = page_views_sample_df.copy()
country.columns = ['uuid', 'Country']
country.Country = country.Country.str[:2]
country.loc[:, 'UserCount'] = country.groupby('Country')['Country'].transform('count')
country = country.loc[:, ['Country', 'UserCount']].drop_duplicates('Country', keep='first')
country.sort_values('UserCount', ascending=False, inplace=True)
country.head(10)

Geben Sie den Ländernamen manuell ein, um ihn auf den Kartendaten zu zeichnen.

countryCode2Name = {u'BD': u'Bangladesh', u'BE': u'Belgium', u'BF': u'Burkina Faso', u'BG': u'Bulgaria', u'BA': u'Bosnia and Herzegovina', u'BB': u'Barbados', u'WF': u'Wallis and Futuna', u'BL': u'Saint Barth\xe9lemy', u'BM': u'Bermuda', u'BN': u'Brunei Darussalam', u'BO': u'Bolivia, Plurinational State of', u'BH': u'Bahrain', u'BI': u'Burundi', u'BJ': u'Benin', u'BT': u'Bhutan', u'JM': u'Jamaica', u'BV': u'Bouvet Island', u'BW': u'Botswana', u'WS': u'Samoa', u'BQ': u'Bonaire, Sint Eustatius and Saba', u'BR': u'Brazil', u'BS': u'Bahamas', u'JE': u'Jersey', u'BY': u'Belarus', u'BZ': u'Belize', u'RU': u'Russian Federation', u'RW': u'Rwanda', u'RS': u'Serbia', u'TL': u'Timor-Leste', u'RE': u'R\xe9union', u'TM': u'Turkmenistan', u'TJ': u'Tajikistan', u'RO': u'Romania', u'TK': u'Tokelau', u'GW': u'Guinea-Bissau', u'GU': u'Guam', u'GT': u'Guatemala', u'GS': u'South Georgia and the South Sandwich Islands', u'GR': u'Greece', u'GQ': u'Equatorial Guinea', u'GP': u'Guadeloupe', u'JP': u'Japan', u'GY': u'Guyana', u'GG': u'Guernsey', u'GF': u'French Guiana', u'GE': u'Georgia', u'GD': u'Grenada', u'GB': u'United Kingdom', u'GA': u'Gabon', u'GN': u'Guinea', u'GM': u'Gambia', u'GL': u'Greenland', u'GI': u'Gibraltar', u'GH': u'Ghana', u'OM': u'Oman', u'TN': u'Tunisia', u'JO': u'Jordan', u'HR': u'Croatia', u'HT': u'Haiti', u'HU': u'Hungary', u'HK': u'Hong Kong', u'HN': u'Honduras', u'HM': u'Heard Island and McDonald Islands', u'VE': u'Venezuela, Bolivarian Republic of', u'PR': u'Puerto Rico', u'PS': u'Palestine, State of', u'PW': u'Palau', u'PT': u'Portugal', u'KN': u'Saint Kitts and Nevis', u'PY': u'Paraguay', u'IQ': u'Iraq', u'PA': u'Panama', u'PF': u'French Polynesia', u'PG': u'Papua New Guinea', u'PE': u'Peru', u'PK': u'Pakistan', u'PH': u'Philippines', u'PN': u'Pitcairn', u'PL': u'Poland', u'PM': u'Saint Pierre and Miquelon', u'ZM': u'Zambia', u'EH': u'Western Sahara', u'EE': u'Estonia', u'EG': u'Egypt', u'ZA': u'South Africa', u'EC': u'Ecuador', u'IT': u'Italy', u'VN': u'Viet Nam', u'SB': u'Solomon Islands', u'ET': u'Ethiopia', u'SO': u'Somalia', u'ZW': u'Zimbabwe', u'SA': u'Saudi Arabia', u'ES': u'Spain', u'ER': u'Eritrea', u'ME': u'Montenegro', u'MD': u'Moldova, Republic of', u'MG': u'Madagascar', u'MF': u'Saint Martin (French part)', u'MA': u'Morocco', u'MC': u'Monaco', u'UZ': u'Uzbekistan', u'MM': u'Myanmar', u'ML': u'Mali', u'MO': u'Macao', u'MN': u'Mongolia', u'MH': u'Marshall Islands', u'MK': u'Macedonia, Republic of', u'MU': u'Mauritius', u'MT': u'Malta', u'MW': u'Malawi', u'MV': u'Maldives', u'MQ': u'Martinique', u'MP': u'Northern Mariana Islands', u'MS': u'Montserrat', u'MR': u'Mauritania', u'IM': u'Isle of Man', u'UG': u'Uganda', u'TZ': u'Tanzania, United Republic of', u'MY': u'Malaysia', u'MX': u'Mexico', u'IL': u'Israel', u'FR': u'France', u'AW': u'Aruba', u'SH': u'Saint Helena, Ascension and Tristan da Cunha', u'SJ': u'Svalbard and Jan Mayen', u'FI': u'Finland', u'FJ': u'Fiji', u'FK': u'Falkland Islands (Malvinas)', u'FM': u'Micronesia, Federated States of', u'FO': u'Faroe Islands', u'NI': u'Nicaragua', u'NL': u'Netherlands', u'NO': u'Norway', u'NA': u'Namibia', u'VU': u'Vanuatu', u'NC': u'New Caledonia', u'NE': u'Niger', u'NF': u'Norfolk Island', u'NG': u'Nigeria', u'NZ': u'New Zealand', u'NP': u'Nepal', u'NR': u'Nauru', u'NU': u'Niue', u'CK': u'Cook Islands', u'CI': u"C\xf4te d'Ivoire", u'CH': u'Switzerland', u'CO': u'Colombia', u'CN': u'China', u'CM': u'Cameroon', u'CL': u'Chile', u'CC': u'Cocos (Keeling) Islands', u'CA': u'Canada', u'CG': u'Congo', u'CF': u'Central African Republic', u'CD': u'Congo, The Democratic Republic of the', u'CZ': u'Czech Republic', u'CY': u'Cyprus', u'CX': u'Christmas Island', u'CR': u'Costa Rica', u'CW': u'Cura\xe7ao', u'CV': u'Cape Verde', u'CU': u'Cuba', u'SZ': u'Swaziland', u'SY': u'Syrian Arab Republic', u'SX': u'Sint Maarten (Dutch part)', u'KG': u'Kyrgyzstan', u'KE': u'Kenya', u'SS': u'South Sudan', u'SR': u'Suriname', u'KI': u'Kiribati', u'KH': u'Cambodia', u'SV': u'El Salvador', u'KM': u'Comoros', u'ST': u'Sao Tome and Principe', u'SK': u'Slovakia', u'KR': u'Korea, Republic of', u'SI': u'Slovenia', u'KP': u"Korea, Democratic People's Republic of", u'KW': u'Kuwait', u'SN': u'Senegal', u'SM': u'San Marino', u'SL': u'Sierra Leone', u'SC': u'Seychelles', u'KZ': u'Kazakhstan', u'KY': u'Cayman Islands', u'SG': u'Singapore', u'SE': u'Sweden', u'SD': u'Sudan', u'DO': u'Dominican Republic', u'DM': u'Dominica', u'DJ': u'Djibouti', u'DK': u'Denmark', u'DE': u'Germany', u'YE': u'Yemen', u'DZ': u'Algeria', u'US': u'United States', u'UY': u'Uruguay', u'YT': u'Mayotte', u'UM': u'United States Minor Outlying Islands', u'LB': u'Lebanon', u'LC': u'Saint Lucia', u'LA': u"Lao People's Democratic Republic", u'TV': u'Tuvalu', u'TW': u'Taiwan, Province of China', u'TT': u'Trinidad and Tobago', u'TR': u'Turkey', u'LK': u'Sri Lanka', u'LI': u'Liechtenstein', u'LV': u'Latvia', u'TO': u'Tonga', u'LT': u'Lithuania', u'LU': u'Luxembourg', u'LR': u'Liberia', u'LS': u'Lesotho', u'TH': u'Thailand', u'TF': u'French Southern Territories', u'TG': u'Togo', u'TD': u'Chad', u'TC': u'Turks and Caicos Islands', u'LY': u'Libya', u'VA': u'Holy See (Vatican City State)', u'VC': u'Saint Vincent and the Grenadines', u'AE': u'United Arab Emirates', u'AD': u'Andorra', u'AG': u'Antigua and Barbuda', u'AF': u'Afghanistan', u'AI': u'Anguilla', u'IS': u'Iceland', u'IR': u'Iran, Islamic Republic of', u'AM': u'Armenia', u'AL': u'Albania', u'AO': u'Angola', u'AQ': u'Antarctica', u'AS': u'American Samoa', u'AR': u'Argentina', u'AU': u'Australia', u'AT': u'Austria', u'IO': u'British Indian Ocean Territory', u'IN': u'India', u'AX': u'\xc5land Islands', u'AZ': u'Azerbaijan', u'IE': u'Ireland', u'ID': u'Indonesia', u'UA': u'Ukraine', u'QA': u'Qatar', u'MZ': u'Mozambique', u'FX': u'France, Metropolitan', u'AN': u'Netherlands Antilles', u'A1': u'Anguilla'}
country['CountryName'] = country['Country'].map(countryCode2Name)

# Drop NAs
country.dropna(inplace=True)

country['CumulativePercentage'] = 100 * country.UserCount.cumsum()/country.UserCount.sum()
country.reset_index(drop=True, inplace=True)
country[['CountryName', 'UserCount', 'CumulativePercentage']].head(10)

Der Name wurde eingegeben.

CountryName	UserCount	CumulativePercentage
0	United States	7503199	81.582245
1	Canada	372772	85.635393
2	United Kingdom	280972	88.690400
3	Australia	133158	90.138226
4	India	90453	91.121721
5	Philippines	55822	91.728674
6	Germany	46026	92.229114
7	South Africa	34046	92.599296
8	France	29169	92.916450
9	Singapore	29037	93.232170

Wir werden dynamisch auf die Weltkarte schauen.

import plotly.offline as py
py.offline.init_notebook_mode()

data = [ dict(
        type = 'choropleth',
        locations = country['CountryName'],
        z = country['UserCount'],
        locationmode = 'country names',
        text = country['CountryName'],
        colorscale = [[0,"rgb(153, 241, 243)"],[0.005,"rgb(16, 64, 143)"],[1,"rgb(0, 0, 0)"]],
        autocolorscale = False,
        marker = dict(
            line = dict(color = 'rgb(58,100,69)', width = 0.6)),
            colorbar = dict(autotick = True, tickprefix = '', title = '# of Users')
            )
       ]

layout = dict(
    title = 'Total number of users by country',
    geo = dict(
        showframe = False,
        showcoastlines = True,
        projection = dict(
        type = 'equirectangular'
        ),
    margin = dict(b = 0, t = 0, l = 0, r = 0)
            )
    )

fig = dict(data=data, layout=layout)
py.iplot(fig, validate=False, filename='worldmap')

newplot.png

Wenn Sie es mit einem Notebook ausführen, können Sie die Anzahl der Länder überprüfen, indem Sie den Cursor bedienen.

Achten Sie auf die USA

Organisieren Sie zunächst die Daten.

usa = page_views_sample_df.loc[page_views_sample_df.geo_location.str[:2] == 'US', :]
usa.columns = ['uuid', 'State']

usa.State = usa.State.str[3:5]

# Drop Data with missing state info
usa = usa.loc[usa.State != '', :]

usa.loc[:, 'UserCount'] = usa.groupby('State')['State'].transform('count')
usa.loc[:, ['State', 'UserCount']] = usa.loc[:, ['State', 'UserCount']].drop_duplicates('State', keep='first')
usa.sort_values('UserCount', ascending=False, inplace=True)

Geben Sie den Namen des Staates ein.

stateCode2Name = {'AK': 'Alaska', 'AL': 'Alabama', 'AR': 'Arkansas', 'AS': 'American Samoa', 'AZ': 'Arizona', 'CA': 'California', 'CO': 'Colorado', 'CT': 'Connecticut', 'DC': 'District of Columbia', 'DE': 'Delaware', 'FL': 'Florida', 'GA': 'Georgia', 'GU': 'Guam', 'HI': 'Hawaii', 'IA': 'Iowa', 'ID': 'Idaho', 'IL': 'Illinois', 'IN': 'Indiana', 'KS': 'Kansas', 'KY': 'Kentucky', 'LA': 'Louisiana', 'MA': 'Massachusetts', 'MD': 'Maryland', 'ME': 'Maine', 'MI': 'Michigan', 'MN':'Minnesota', 'MO': 'Missouri', 'MP': 'Northern Mariana Islands', 'MS': 'Mississippi', 'MT': 'Montana', 'NA': 'National', 'NC': 'North Carolina', 'ND': 'North Dakota', 'NE':'Nebraska', 'NH': 'New Hampshire', 'NJ': 'New Jersey', 'NM': 'New Mexico', 'NV': 'Nevada', 'NY': 'New York', 'OH': 'Ohio', 'OK': 'Oklahoma', 'OR': 'Oregon', 'PA': 'Pennsylvania', 'PR': 'Puerto Rico', 'RI': 'Rhode Island', 'SC': 'South Carolina', 'SD': 'South Dakota', 'TN': 'Tennessee', 'TX': 'Texas', 'UT': 'Utah', 'VA': 'Virginia', 'VI': 'Virgin Islands', 'VT': 'Vermont', 'WA': 'Washington', 'WI': 'Wisconsin', 'WV': 'West Virginia', 'WY': 'Wyoming'}
usa['StateName'] = usa['State'].map(stateCode2Name)
# Drop NAs
usa.dropna(inplace=True)

usa['CumulativePercentage'] = 100 * usa.UserCount.cumsum()/usa.UserCount.sum()
usa.reset_index(drop=True, inplace=True)
usa[['StateName', 'UserCount', 'CumulativePercentage']].head(50)

Visualisieren Sie die Zählung in den USA.

import plotly.offline as py
py.offline.init_notebook_mode()

data = [ dict(
        type = 'choropleth',
        locations = usa['State'],
        z = usa['UserCount'],
        locationmode = 'USA-states',
        text = usa['StateName'],
        colorscale = [[0,"rgb(153, 241, 243)"],[0.33,"rgb(16, 64, 143)"],[1,"rgb(0, 0, 0)"]],
        autocolorscale = False,
        marker = dict(
            line = dict(color = 'rgb(58,100,69)', width = 0.6)),
            colorbar = dict(autotick = True, tickprefix = '', title = '# of Users')
            )
       ]

layout = dict(
    title = 'Total number of users by state',
    geo = dict(
        scope='usa',
        projection=dict( type='albers usa' ),
        showlakes = True,
        lakecolor = 'rgb(255, 255, 255)'),
    )

fig = dict(data=data, layout=layout)
py.iplot(fig, validate=False, filename='USmap')

newplot (1).png

4.3 Zeitstempelanalyse

Zeitstempel analysieren.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

events = pd.read_csv("../input/events.csv", dtype=np.int32, index_col=0, usecols=[0,3])
events.head()
      timestamp 
display_id	
1	61
2	81
3	182
4	234
5	338

Für jede display_id gibt es einen Zeitstempel. Es ist ein Zeitstempel von Millisekunden und beginnt am 01.01.1970, wie in der Einführung der Daten erläutert. Mit anderen Worten, die Zeit Null entspricht 04:00 UTC, 14. Juni 2016.

train = pd.merge(pd.read_csv("../input/clicks_train.csv", dtype=np.int32, index_col=0).sample(frac=0.1),
                 events, left_index=True, right_index=True)
test = pd.merge(pd.read_csv("../input/clicks_test.csv", dtype=np.int32, index_col=0).sample(frac=0.1),
                events, left_index=True, right_index=True)

Lesen Sie die Daten aus der Klickdatei

test["hour"] = (test.timestamp // (3600 * 1000)) % 24
test["day"] = test.timestamp // (3600 * 24 * 1000)

train["hour"] = (train.timestamp // (3600 * 1000)) % 24
train["day"] = train.timestamp // (3600 * 24 * 1000)

plt.figure(figsize=(12,4))
train.hour.hist(bins=np.linspace(-0.5, 23.5, 25), label="train", alpha=0.7, normed=True)
test.hour.hist(bins=np.linspace(-0.5, 23.5, 25), label="test", alpha=0.7, normed=True)
plt.xlim(-0.5, 23.5)
plt.legend(loc="best")
plt.xlabel("Hour of Day")
plt.ylabel("Fraction of Events")

Zeichnen Sie die Zeit.

__results___4_1 (1).png

Die Verteilung der Zeitstempel scheint konsistent zu sein. Es gibt einen kleinen Unterschied zwischen Zug und Test.

plt.figure(figsize=(12,4))
train.day.hist(bins=np.linspace(-.5, 14.5, 16), label="train", alpha=0.7, normed=True)
test.day.hist(bins=np.linspace(-.5, 14.5, 16), label="test", alpha=0.7, normed=True)
plt.xlim(-0.5, 14.5)
plt.legend(loc="best")
plt.xlabel("Days since June 14")
plt.ylabel("Fraction of Events")

__results___6_1.png

Sie können sehen, dass Zug und Test je nach Datum unterschiedlich sind. Sie können sehen, dass mehr als die Hälfte der Testdaten am 13. und 14. abgetastet wurde. Und Sie können sehen, dass die andere Hälfte am selben Tag wie die Zugdaten abgetastet wird.

Um das Verständnis zu vertiefen, werden wir die Zugdaten mit einer Heatmap nach Datum und Uhrzeit visualisieren.

plt.figure(figsize=(12,6))
hour_day_counts = train.groupby(["hour", "day"]).count().ad_id.values.reshape(24,-1)
# plot 2d hist in days and hours, with each day normalised to 1 
plt.imshow((hour_day_counts / hour_day_counts.sum(axis=0)).T,
           interpolation="none", cmap="rainbow")
plt.xlabel("Hour of Day")
plt.ylabel("Days since June 14")

__results___8_1.png

Die vertikale Achse ist das Datum und die horizontale Achse ist die Uhrzeit. Visualisieren Sie es auf ähnliche Weise mit Test.

# for completeness, the test set too:
plt.figure(figsize=(12,6))
hour_day_counts = test.groupby(["hour", "day"]).count().ad_id.values.reshape(24,-1)
# plot 2d hist in days and hours, with each day normalised to 1 
plt.imshow((hour_day_counts / hour_day_counts.sum(axis=0)).T,
           interpolation="none", cmap="rainbow")
plt.xlabel("Hour of Day")
plt.ylabel("Days since June 14")

__results___10_1.png

Recommended Posts

Kaggle Zusammenfassung: Outbrain # 2
Kaggle Zusammenfassung: Outbrain # 1
Kaggle verwandte Zusammenfassung
Kaggle Zusammenfassung: Redhat (Teil 1)
Kaggle Zusammenfassung: BOSCH (Kernel)
Kaggle Zusammenfassung: Redhat (Teil 2)
Zusammenfassung der Kaggle-Kernel-Methode [Bild]
Kaggle Zusammenfassung: Instacart Market Basket Analyse
Kaggle Zusammenfassung: BOSCH (Intro + Forumsdiskussion)
[Umfrage] Kaggle --Quora 3. Platz Lösungszusammenfassung
Python-Zusammenfassung
[Umfrage] Kaggle --Quora 5. Platz Lösungszusammenfassung
Django Zusammenfassung
python-pptx Zusammenfassung
[Umfrage] Kaggle --Quora 4. Platz Lösungszusammenfassung
Linux Zusammenfassung
Python-Zusammenfassung
Django Zusammenfassung
pyenv Zusammenfassung
Zusammenfassung der Zeichenketten 1
pytest Zusammenfassung
matplotlib Zusammenfassung
[Umfrage] Kaggle --Quora 2. Platz Lösungszusammenfassung