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.
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.
L'indice d'évaluation cette fois-ci est Mean Average Precision @ 12.
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.
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.
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.
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.
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
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%
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)
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%
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
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
J'ai également pu visualiser les données de la catégorie.
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')
Si vous l'exécutez avec notebook, vous pouvez vérifier le décompte des pays en utilisant le curseur.
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')
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.
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")
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")
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")
Recommended Posts