#!/usr/bin/env python # coding: utf-8 # # ubuntu.lt forumo naudotojų analizė # In[1]: get_ipython().run_line_magic('matplotlib', 'inline') # In[2]: import pandas as pd import matplotlib as mpl # In[3]: mpl.rc('font', family='Ubuntu', size=14) mpl.rc('figure', figsize=(16, 10)) # In[4]: data = pd.read_csv('ubuntultusers.csv', sep='\t', names=['user', 'date'], parse_dates=[1]) # `ubuntultusers.csv` failas sugeneruotas naudojant tokią užklausą: # # ```mysql # SELECT users.username, FROM_UNIXTIME(posts.post_time) # FROM phpbb_posts AS posts, phpbb_users AS users # WHERE posts.poster_id = users.user_id # INTO OUTFILE '/tmp/ubuntultusers.csv'; # ``` # In[6]: data.shape # Viso yra 67,573 postai parašyti per visą ubuntu.lt forumo istoriją. # ## Daugiausiai postų parašę žmonės # In[18]: posts = data.user.value_counts().to_frame().rename(columns={'user': 'posts'}) frame = posts.head(50).sort_values('posts', ascending=True) ax = frame.plot.barh(grid=True, figsize=(15, 20), colormap='Set3') ax.set_xlabel('posts') for i, (x, y) in enumerate(frame.posts.items()): ax.annotate(str(y), (y + 10, i), va='center') # ## Postų rašymo aktyvumas ketvičiais (lyginami visi parašę daugiau kaip 600 postų) # In[102]: n_posts = 600 frame = data.merge(posts, left_on='user', right_index=True).sort_values('posts', ascending=False) frame = frame[frame.posts > n_posts] frame = frame.groupby([frame.date.dt.to_period('Q'), 'user']).posts.count().unstack() frame = frame[posts[posts.posts > n_posts].index.tolist()] ax = frame.plot.bar(stacked=True, colormap='Set3') ax.set_ylabel('posts') # ## Postų rašymo aktyvumas ketvičiais (lyginami visi parašę daugiau kaip 900 postų) # In[103]: n_posts = 900 frame = data.merge(posts, left_on='user', right_index=True).sort_values('posts', ascending=False) frame = frame[frame.posts > n_posts] frame = frame.groupby([frame.date.dt.to_period('Q'), 'user']).posts.count().unstack() frame = frame[posts[posts.posts > n_posts].index.tolist()] ax = frame.plot.bar(stacked=True, colormap='Set3') ax.set_ylabel('posts') # ## Postų rašymo aktyvumas ketvičiais (lyginami visi parašę daugiau kaip 100 postų) # In[68]: n_posts = 100 frame = data.merge(posts, left_on='user', right_index=True).sort_values('posts', ascending=False) frame = frame[frame.posts > n_posts] frame = frame.groupby([frame.date.dt.to_period('Q'), 'user']).posts.count().unstack() frame = frame[posts[posts.posts > n_posts].index.tolist()] ax = frame.plot.bar(stacked=True, legend=False, colormap='Set3') ax.set_ylabel('posts') # ## Viso parašyta postų ketvirčiais # In[131]: frame = data.groupby(data.date.dt.to_period('Q')).date.count() ax = frame.plot.bar(colormap='Set3') ax.set_ylabel('posts') # ## Aktyvių naudotojų skaičius ketvirčiais # In[62]: frame = data.groupby([data.date.dt.to_period('Q'), 'user']).user.count() frame = frame.to_frame()[[]].reset_index().groupby('date') frame.user.count().plot.bar(colormap='Set3') # ## Naujų naudotojų skaičius ketvirčiais # In[64]: frame = data.groupby('user').date.first().reset_index().sort_values('date')[['date']] frame['n_users'] = 1 frame.groupby(frame.date.dt.to_period('Q')).n_users.sum().plot.bar(colormap='Set3', grid=True) # ## Naudotojų augimas ketvirčiais # In[63]: frame = data.groupby('user').date.first().reset_index().sort_values('date')[['date']] frame['n_users'] = 1 frame.groupby(frame.date.dt.to_period('Q')).n_users.sum().cumsum().plot.bar(colormap='Set3', grid=True) # ## Daugiausiai postų parašiusių naudotojų aktyvumo palyginimas laike # In[67]: n_posts = 250 frame = data.merge(posts, left_on='user', right_index=True).sort_values('posts', ascending=False) frame = frame[frame.posts > n_posts] frame = frame.groupby([frame.date.dt.to_period('Q'), 'user']).posts.count().unstack() frame = frame[posts[posts.posts > n_posts].index.tolist()] for ax in frame.plot.bar(subplots=True, colormap='Set3', figsize=(15, 150)): ax.set_ylabel('posts') # In[ ]: