ubuntu.lt forumo naudotojų analizė

In [1]:
%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ą:

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
Out[6]:
(67573, 2)

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')
Out[102]:
<matplotlib.text.Text at 0x7f257a3145f8>

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')
Out[103]:
<matplotlib.text.Text at 0x7f257a0ca780>

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')
Out[68]:
<matplotlib.text.Text at 0x7fe3afe0a898>

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')
Out[131]:
<matplotlib.text.Text at 0x7f2560827278>

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')
Out[62]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe3b0f07f28>

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)
Out[64]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe3bf663e48>

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)
Out[63]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fe3c413df98>

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