[PYTHON] Résumé de Kaggle: Outbrain # 1

introduction

Nous mettrons à jour les informations de Kaggle qui a participé dans le passé. Ici, nous allons reprendre l'introduction des données de Outbrain Click Prediction et la discussion de premier plan dans le forum. Le code du gagnant du concours est résumé dans Kaggle Summary: Outbrain (Part 2), qui est un résumé et un résumé de chaque analyse de données. (Actuellement en construction)

Cet article utilise Python 2.7, numpy 1.11, scipy 0.17, scikit-learn 0.18, matplotlib 1.5, seaborn 0.7, pandas 0.17. Il a été confirmé qu'il fonctionne sur le notebook jupyter. (Veuillez modifier correctement% matplotlib inline) Si vous trouvez des erreurs lors de l'exécution de l'exemple de script, il serait utile que vous puissiez commenter.

table des matières

  1. Vue d'ensemble
  2. Indice d'évaluation
  3. Présentation des données
  4. kernels

Contexte

front_page.png

Sur Internet, de nombreux utilisateurs agissent en fonction de leurs communautés et de leurs expériences, découvrent de nouveaux articles et visent la prochaine destination en fonction des articles découverts. Outbrain fournit aux utilisateurs une plate-forme de diffusion de contenu qui les guide vers un emplacement qui correspond à leurs préférences. Outbrain fait chaque mois 250 milliards de recommandations personnelles à des milliers de sites. Cette fois, nous demandons à kaggler de prédire le comportement de l'utilisateur à partir de l'historique des clics de l'utilisateur. Et nous visons à être un algorithme de recommandation qui fournit des histoires qui satisfont plus que jamais les utilisateurs.

Les points caractéristiques de cette époque sont les suivants.

2. Indice d'évaluation

L'indice d'évaluation cette fois-ci est Mean Average Precision @ 12.

Screen Shot 2017-01-12 at 7.42.08.png

Les détails sont écrits dans le lien, mais il s'agit d'un système dérivé de MAP (taux de précision moyen). Le taux de précision est la précision en termes de valeur F et de ROC. Les explications en japonais et les explications connexes étant substantielles, les explications ici sont omises.

De plus, le format du fichier soumis exprime la correspondance entre display_id et ad_id en CSV, et ad_id est une liste délimitée par des espaces.

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. Présentation des données

Ces données sont des séries chronologiques et des données de catégories divisées en un grand nombre de fichiers. La navigation sur la page de l'utilisateur et l'historique des clics couvrent environ deux semaines du 14 au 28 juin sur plusieurs sites aux États-Unis. Les détails sont les suivants.

Les données contiennent des recommandations pour chaque utilisateur dans un contexte particulier. Le contexte ici est un ensemble de recommandations pour l'utilisateur. Chaque contexte est représenté par display_id. Il contient également des recommandations sur lesquelles au moins un utilisateur a cliqué pour chaque display_id. Dans cette compétition, l'objectif est de déterminer le classement des recommandations en organisant les prédictions de clics par ordre décroissant.

Il est à noter que ces données sont des données relationnelles très volumineuses. Si vous regardez une partie du tableau, elle est suffisamment petite pour tenir dans la mémoire, mais la longueur des données de la page vue est supérieure à 200 millions de lignes et 100 Go de données non compressées.

Champ de données

Dans les données, l'utilisateur est représenté par un uuid unique. Les sites que les utilisateurs peuvent voir sont représentés par document_id. Chaque document a une publicité indiquée par ad_id. Chaque publicité a un campaign_id fourni par l'annonceur indiqué par advertiser_id. Il existe également des métadonnées document_id. Quels produits ont attiré l'attention, classification des catégories, des sujets d'intérêt et des fournisseurs de document_id.

Détails du fichier

Ensuite, chaque fichier sera expliqué. Il existe 6 types de fichiers cette fois. Naturellement, chaque donnée est anonymisée et traitée afin que l'utilisateur individuel ne soit pas identifié.

1. page_views.csv Ce sont les données des articles visités par l'utilisateur. Pour économiser de l'espace, les horodatages de chaque jeu de données sont répertoriés uniquement pour la première visite. Si vous souhaitez restaurer l'heure actuelle, ajoutez 1465876799998 à l'horodatage.

2. clicks_train.csv Il s'agit de l'historique des clics sur les publicités.

De même, clicks_test.csv est également fourni, mais il est cliqué, c'est-à-dire que les données de réponse correctes ne sont pas jointes. Le but de cette fois est de créer un modèle qui prédit les clics à partir de ce fichier. Chaque display_id est cliqué une seule fois. Le display_id des données de test contient la période de l'ensemble de données.

3. events.csv Fournit le contexte de display_id. Ce contenu est commun à former et à tester.

4. promoted_content.csv Fournit des détails publicitaires.

  1. documents_meta.csv Informations détaillées sur le document.
  1. documents_topics.csv, documents_entities.csv, documents_categories.csv Inclut les relations entre les documents. Les informations détaillées sont les suivantes.

page_view.png

  1. Forum

4.1. Analyse des données principales (cliquez sur les informations)

Analysez les principales données. Tout d'abord, vérifiez le fichier

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

Vous pouvez voir qu'il existe de nombreux fichiers CSV. Ensuite, nous nous concentrerons sur clicks_train et clicks_test pour l'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)

Le résultat de l'exécution est le suivant

__results___4_1.png

Le rapport du nombre de publicités incluses dans l'affichage a été visualisé. Ensuite, regardons l'histogramme pour voir combien de fois le même nombre de publicités apparaît au total.

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

On a constaté que la majorité des publicités étaient affichées un petit nombre de fois et que le nombre de publicités qui étaient affichées plusieurs fois était relativement faible. Cela signifie que nous devons estimer le comportement de l'utilisateur à partir de données sans précédent indiquant si l'utilisateur a cliqué ou non.

Enfin, vérifiez le taux d'annonces en double lors du test et de la formation.

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%

Il s'est avéré que 82% des publicités sont également affichées dans le test. Il peut être bon de créer un modèle de prédiction basé sur ces informations publicitaires.

Events

L'analyse des horodatages et des informations géographiques est résumée en détail dans l'analyse décrite plus loin. Ici, nous analyserons les événements.

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

Je comprends le contenu des données. Ensuite, regardons la plate-forme.

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']

D'après les résultats, nous pouvons voir que les plates-formes 1, 2 et 3 sont répétées plusieurs fois à la fois pour float et string. Regardons la plate-forme plus loin.

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

On ne sait pas ce qu'indiquent les plates-formes 1, 2 et 3, mais on peut prédire qu'il existe probablement trois types: PC, téléphone et tablette. Le numéro de type \ N ou chaîne est-il une valeur anormale créée par une erreur? Il semble difficile de prédire davantage ici.

Ensuite, nous approfondirons l'UUID.

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

Il semble que le même utilisateur apparaisse plusieurs dizaines de fois. Comme la plupart d'entre eux apparaissent plusieurs fois, il semble difficile de créer un modèle de prédiction basé sur l'utilisateur.

De plus, comme le co-filtrage, il est susceptible de consommer beaucoup de mémoire afin d'exécuter une analyse liée à l'utilisateur dans toutes les combinaisons.

Categories Outbrain fournit les résultats du pré-clustering. Nous visualiserons la fréquence d'apparition des données de sujet et des données de catégorie.

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

Ensuite, nous viserons le niveau de confiance.

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

Vous pouvez voir qu'il est grand ouvert de près de zéro à 300 000.

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

J'ai également pu visualiser les données de la catégorie.

4.2. Analyse des données géographiques

Nous analyserons chaque pays et nous concentrerons sur les États-Unis. Lisez les données.

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')

Ensuite, comptez par pays.

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)

Entrez le nom du pays à la main pour le tracer sur les données de la carte.

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)

Le nom a été saisi.

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

Nous regarderons dynamiquement la carte du monde.

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

Si vous l'exécutez avec notebook, vous pouvez vérifier le décompte des pays en utilisant le curseur.

Faites attention aux USA

Commencez par organiser les données.

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)

Entrez le nom de l'état.

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)

Visualisez le décompte aux États-Unis.

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. Analyse d'horodatage

Analysez l'horodatage.

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

Il existe un horodatage pour chaque display_id. Il s'agit d'un horodatage en millisecondes et commence à partir du 01/01/1970 comme expliqué dans l'introduction des données. En d'autres termes, l'heure zéro correspond à 04h00 UTC, le 14 juin 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)

Lire les données du fichier de clics

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")

Tracez le temps.

__results___4_1 (1).png

Il semble y avoir une certaine cohérence dans la distribution des horodatages. Il y a une légère différence entre le train et le 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

Vous pouvez voir que le train et le test sont différents selon la date. Vous pouvez voir que plus de la moitié des données de test ont été échantillonnées les 13 et 14. Et vous pouvez voir que l'autre moitié est échantillonnée le même jour que les données du train.

Afin d'approfondir la compréhension, nous allons visualiser les données du train avec une carte thermique par date et heure.

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

L'axe vertical est la date et l'axe horizontal est l'heure. De même, visualisez-le avec 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

Résumé de Kaggle: Outbrain # 2
Résumé de Kaggle: Outbrain # 1
Résumé lié à Kaggle
Résumé de Kaggle: Redhat (Partie 1)
Résumé de Kaggle: BOSCH (noyaux)
Résumé de Kaggle: Redhat (partie 2)
Résumé de la méthode du noyau de Kaggle [Image]
Résumé de Kaggle: Analyse du panier de marché Instacart
Résumé de Kaggle: BOSCH (intro + discussion du forum)
[Enquête] Kaggle - Résumé de la solution Quora 3e place
Résumé Python
[Enquête] Kaggle - Résumé de la solution Quora 5e place
Résumé de Django
Résumé de python-pptx
[Enquête] Kaggle - Résumé de la solution Quora 4e place
Résumé Linux
Résumé Python
Résumé de Django
résumé pyenv
Résumé de la chaîne de caractères 1
résumé pytest
Résumé matplotlib
[Enquête] Kaggle - Récapitulatif de la solution Quora 2nd place