让我们进行必要的导入:
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
然后让我们生成数千个随机长度(0 到 101)字符串的列表以用作示例推文。
from random import choice, randrange
from string import ascii_lowercase, digits
chars = ascii_lowercase + digits
lst = [''.join(choice(chars) for _ in range(randrange(0, 101, 1))) for _ in range(1000)]
让我们创建计数图来可视化推文长度的频率:
tweet_lengths = list(map(len, lst))
sns.countplot(tweet_lengths)
plt.title('Tweet lengths')
plt.xlabel('Tweet lengths')
plt.ylabel('# of tweets')
所以这不遵循正态分布,显然是因为它是随机生成的。令人惊讶的是,在经过一些预处理(删除 URL、提及等)的实际推文中,它不是正态分布。 (附带问题:为什么会这样?它不应该是正常的吗?或者随机大小的网址,而我的预处理破坏了正态分布?)
实际上,最初我尝试想象这样的事情:
df_tweets_lengths = pd.DataFrame(tweet_lengths)
fig, ax = plt.subplots()
# df_1000.text.str.lenvalue_counts().plot(ax=ax, kind='bar')
df_tweets_lengths.plot(ax=ax, kind='bar')
输出:
但是,我无法解释上图想表达的意思?它只是简单地绘制所有数千条推文中每条推文的长度吗?如果是,那么为什么会有这些带(四个空格,没有蓝色条)?
最佳答案
您遇到了两个问题,一个是概念性的,一个是程序性的。
randrange
生成均匀分布,而不是正态分布。这意味着您应该期望输出条具有相似的高度。countplot
是histplot
的分类版本,这意味着它将绘制所有值的计数,即,如果您有一个包含[1, 1, 1, 2, 2, 3]
它将绘制三个条形,{1:3, 2:2, 3:1}
。
您实际上没有看到样本中的均匀分布的原因是您的 x 值范围很大(101 个值),但您的样本很小(1000)。如果将样本数量增加到 1,000,000,您会使用 countplot 看到均匀的形状。
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
from string import ascii_lowercase, digits
from random import choice, randrange
chars = ascii_lowercase + digits
lst = [''.join(choice(chars) for _ in range(randrange(0, 101, 1))) for _ in range(1000000)]
tweet_lengths = list(map(len, lst))
sns.countplot(tweet_lengths)
plt.title('Tweet lengths')
plt.xlabel('Tweet lengths')
plt.ylabel('# of tweets')
关于python - 在 python 中可视化推文长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71983310/