22、社交数据参与度分析:深入洞察用户行为与内容生成

社交数据参与度分析:深入洞察用户行为与内容生成

在社交平台上,了解用户的参与模式和内容生成方式对于优化平台体验、提高用户参与度至关重要。本文将通过对社交平台上用户的提问、回答行为进行分析,探讨用户参与的规律,并尝试预测优质答案。

1. 80/20 规则匹配

在社交网络中,80/20 规则是一个常见的现象,即 80% 的内容由 20% 的用户创建。为了验证这一规则,我们可以按照以下步骤进行分析:
1. 按感兴趣的计数对用户进行降序排序。
2. 将用户划分为五个等份,即五个大小相等的桶。
3. 计算每个桶的计数总和。

以下是实现这些步骤的代码:

(defn quantile-on [n key-fn coll]
  (let [len (count coll)
        part-size (+ (quot len n)
                     (if (zero? (mod len n)) 0 1))]
    (partition-all part-size (sort-by key-fn coll))))

(defn sum-count
  ([key-fn] (partial sum-count key-fn))
  ([key-fn coll]
   (->> coll
     (map #(:count (key-fn %)))
     (remove nil?)
     (reduce + 0))))

使用这些函数,我们可以计算每个五分位数中用户的百分比:

user=> (def p-counts
            (map (d/sum-count :post)
                 (d/quantile-on 5 #(:rank (:post %)) users)))
user=> p-counts
(15587701 1282402 507654 318890 318828)
user=> (def total (reduce + 0 p-counts))
user=> (map #(float (/ % total)) p-counts)
(0.8652395 0.07118336 0.028178774 0.017700894 0.017697452)

结果显示,前 20% 的用户实际上产生了超过 85% 的内容,五分位数从那里开始迅速下降。

2. 寻找 20% 的提问者

在寻找提问者时,我们可以关注最活跃的提问者。以下是排名前十的提问者及其提问次数:
| Rank | User | Question Posts |
|------|------|----------------|
| 0 | 39677 | 1858 |
| 1 | 4653 | 1605 |
| 2 | 34537 | 1604 |
| 3 | 179736 | 1327 |
| 4 | 117700 | 1327 |
| 5 | 149080 | 1261 |
| 6 | 84201 | 1177 |
| 7 | 434051 | 1107 |
| 8 | 325418 | 1074 |
| 9 | 146780 | 1055 |

通过使用 quantile-on sum-count 函数,我们可以得到提问者的分布情况:

user=> (def q-counts (map (d/sum-count :q)
                          (d/quantile-on 5 #(:rank (:q %)) users)))
user=> (def total (reduce + 0 q-counts))
user=> q-counts
(5182709 711037 318890 262051 0)
user=> (map #(float (/ % total)) q-counts)
(0.80045706 0.109817974 0.049251802 0.040473152 0.0)

有趣的是,最低的五分位数没有贡献任何内容,推测这些用户是回答问题的人。总体而言,提问者的分布符合 80/20 规则。

3. 寻找 20% 的回答者

由于大多数帖子是回答,我们可以预期回答者的频率更接近总体频率。以下是排名前十的回答者及其回答次数:
| Rank | User | Answer Posts |
|------|------|--------------|
| 0 | 22656 | 28137 |
| 1 | 29407 | 20310 |
| 2 | 157882 | 15431 |
| 3 | 17034 | 13285 |
| 4 | 34397 | 13157 |
| 5 | 23354 | 12270 |
| 6 | 115145 | 11784 |
| 7 | 20862 | 10447 |
| 8 | 57695 | 9711 |
| 9 | 19068 | 9557 |

同样地,使用 quantile-on sum-count 函数,我们可以得到回答者的分布情况:

user=> (def a-counts (map (d/sum-count :a)
                          (d/quantile-on 5 #(:rank (:a %)) users)))
user=> (def total (reduce + 0 a-counts))
user=> a-counts
(10950972 413668 176148 0 0)
user=> (map #(float (/ % total)) a-counts)
(0.9488929 0.035844 0.015263082 0.0 0.0)

结果显示,几乎一半的用户从未发布过回答,而前 20% 的用户发布了 95% 的回答。这表明回答问题似乎由少数用户主导,而提问则相对更广泛。

4. 综合排名分析

通过比较排名,我们可以发现更多的相似性。以下是所有类别中排名前十的用户在每个类别中的排名:
| User ID | All Post Rank | Question Post Rank | Answer Post Rank |
|---------|---------------|--------------------|------------------|
| 4653 | 423 | 1 | 21342 |
| 17034 | 3 | 602037 | 3 |
| 19068 | 9 | 420772 | 9 |
| 20862 | 7 | 169469 | 7 |
| 22656 | 0 | 37889 | 0 |
| 23354 | 5 | 22760 | 5 |
| 29407 | 1 | 33177 | 1 |
| 34397 | 4 | 16478 | 4 |
| 34537 | 358 | 2 | 8024 |
| 39677 | 345 | 0 | 151684 |
| 57695 | 8 | 65071 | 8 |
| 84201 | 631 | 6 | 10521 |
| 115145 | 6 | 54339 | 6 |
| 117700 | 595 | 4 | 29654 |
| 146780 | 923 | 9 | 123737 |
| 149080 | 682 | 5 | 56862 |
| 157882 | 2 | 101282 | 2 |
| 179736 | 605 | 3 | 36463 |
| 325418 | 523 | 8 | 3502 |
| 434051 | 858 | 7 | 164416 |

从这些数据中可以看出:
- 排名靠前的提问者和回答者是不同的用户群体。
- 除了排名靠前的用户,各个子群体与所有帖子的总体排名相关性不强。

这些观察结果证实了我们在五分位数和图表中所看到的情况,即提问者和回答者的群体差异很大,且与两者的总体情况也不同。

5. 用户群体细分

为了更深入地了解用户的参与类型,我们可以将用户分为只提问、只回答和既提问又回答三类。

5.1 只提问的用户

通过过滤出不发布回答的用户,我们可以得到只提问的用户群体。以下是该群体的分析代码和结果:

user=> (def qs (filter #(zero? (:count (:a %))) users))
user=> (def q-counts
            (map (d/sum-count :q)
                 (d/quantile-on 5 #(:rank (:q %)) qs)))
user=> (def total (reduce + 0 q-counts))
user=> (count qs)
780460
user=> q-counts
(969148 272085 156092 156092 156092)
user=> (map #(float (/ % total)) q-counts)
(0.566916 0.15915973 0.09130809 0.09130809 0.09130809)

结果显示,只提问的用户占总用户数的 49%,且他们的分布更为均匀,最活跃的五分位数发布的问题不到三分之二。这是因为很多来到平台的用户只发布一个问题,然后就不再参与。

5.2 只回答的用户

类似地,我们可以过滤出不发布问题的用户,得到只回答的用户群体。以下是该群体的分析代码和结果:

user=> (def as (filter #(zero? (:count (:q %))) users))
user=> (def a-counts (map (d/sum-count :a)
                          (d/quantile-on 5 #(:rank (:a %)) as)))
user=> (def total (reduce + 0 a-counts))
user=> (count as)
375667
user=> (float (/ (count as) (count users)))
0.23561831
user=> a-counts
(1413820 116198 75134 75134 75131)
user=> (map #(float (/ % total)) a-counts)
(0.80540407 0.06619396 0.042801227 0.042801227 0.042799518)

只回答的用户群体约为只提问用户群体的一半,占总用户数的四分之一。该群体的分布更接近 80/20 规则,且最后几个五分位数的用户似乎只发布了一个回答。

5.3 既提问又回答的用户

通过过滤出既发布问题又发布回答的用户,我们可以得到该群体。以下是该群体的分析代码和结果:

user=> (def both (remove #(or (zero? (:count (:q %)))
                              (zero? (:count (:a %))))
                         users))
user=> (count both)
438261

user=> (def bq-counts
            (map (d/sum-count :q)
                 (d/quantile-on 5 #(:rank (:q %)) both)))
user=> (def total (reduce + 0 bq-counts))
user=> bq-counts
(3450712 730467 335892 160458 87649)
user=> (map #(float (/ % total)) bq-counts)
(0.72415173 0.1532927 0.07048887 0.033673033 0.018393647)

user=> (def ba-counts
            (map (d/sum-count :a)
                 (d/quantile-on 5 #(:rank (:a %)) both)))
user=> (def total (reduce + 0 ba-counts))
user=> ba-counts
(8564601 740590 270367 122164 87649)
user=> (map #(float (/ % total)) ba-counts)
(0.8752454 0.075683385 0.027629714 0.01248435 0.008957147)

既提问又回答的用户群体似乎更加平衡,与网站的互动也更典型。他们在提问和回答方面的分布都大致遵循 80/20 规则。

通过对不同用户群体的分析,我们可以更深入地了解用户的参与模式,为平台的优化和推广提供有价值的参考。例如,对于只提问或只回答的用户群体,可以针对性地设计激励机制,提高他们的参与度;对于既提问又回答的用户群体,可以提供更多的互动功能,增强他们的粘性。

6. 优质答案的寻找与预测

在社交平台上,优质答案对于解决用户问题、提升平台价值至关重要。为了寻找和预测优质答案,我们可以从以下几个方面入手。

6.1 数据处理

目前平台上有超过 1800 万个帖子,为了便于分析,我们可以先抽取一个样本数据。可以从以下链接下载一个包含 100000 个答案的随机样本: http://www.ericrochester.com/mastering-clj-data/data/post-sample-100000.json.gz

使用以下命令下载并解压数据:

$ curl -O http://www.ericrochester.com/mastering-clj-data/data/post-sample-100000.json.gz
$ gunzip post-sample-100000.json.gz

将处理代码放在 src/social_so/post.clj 文件中,并添加以下命名空间声明:

(ns social-so.post
  (:require [clojure.java.io :as io]
            [clojure.data.json :as json]
            [social-so.data :as d]
            [social-so.utils :as u]
            [social-so.xml :as x]))

使用 PostInfo 记录类型来表示数据:

(defrecord PostInfo
  [id post-type body-text score accepted-for])

其中, body-text 包含去除 HTML 标签后的答案文本, accepted-for 表示该答案是否被接受,如果被接受则包含问题的 ID,否则为 nil

以下是加载数据的代码:

(defn load-post-infos [filename]
  (with-open [r (io/reader filename)]
    (doall
      (->> (json/read r :key-fn keyword)
        (map map->PostInfo)
        (map #(assoc % :post-type (keyword (:post-type %))))))))

在 REPL 中读取数据:

user=> (def s (p/load-post-infos "post-sample-100000.json"))
user=> (count s)
100000
user=> (count (filter :accepted-for s))
21250
user=> (count (remove :accepted-for s))
78750
user=> (pprint (first s))
{:id 1146880,
 :post-type :a,
 :body-text
 "But while processing i cancelled the transaction.  WP - Basically, 
  if it was a transaction, and you canceled it before it finished, 
  then whatever had started would have been undone. What your 
  database looks like now should be the same as it looked before the 
  UPDATE.",
 :score 0,
 :accepted-for nil}

从这些数据可以看出,样本中略超过 20% 的帖子被接受。

6.2 预测接受的答案

为了预测哪些答案会被接受,我们可以使用 MALLET 库进行分类。MALLET 是一个用于机器学习和自然语言处理的库,它提供了多种分类算法。

首先,创建一个新的命名空间 src/social_so/nlp.clj ,并添加以下命名空间声明:

(ns social-so.nlp
  (:import [cc.mallet.types Instance InstanceList]
           [cc.mallet.pipe
            Input2CharSequence TokenSequenceLowercase
            CharSequence2TokenSequence SerialPipes
            Target2Label FeatureSequence2FeatureVector
            TokenSequenceRemoveStopwords
            TokenSequence2FeatureSequence]
           [cc.mallet.pipe.iterator ArrayDataAndTargetIterator]
           [cc.mallet.classify NaiveBayes NaiveBayesTrainer Trial]
           [cc.mallet.classify.evaluate ConfusionMatrix]))

在 REPL 中引入该命名空间:

user=> (require '[social-so.nlp :as n])

接下来,创建 InstanceList 对象。MALLET 将每个输入表示为一个 Instance 对象,多个 Instance 对象组成一个 InstanceList 。以下是创建管道的函数:

(defn make-pipe []
  (SerialPipes.
    [(Target2Label.)
     (Input2CharSequence. "UTF-8")
     (CharSequence2TokenSequence. #"\p{L}[\p{L}\p{P}]+\p{L}")
     (TokenSequenceLowercase.)
     (TokenSequenceRemoveStopwords. false false)
     (TokenSequence2FeatureSequence.)
     (FeatureSequence2FeatureVector.)]))

这个管道的步骤如下:
1. Target2Label :为 Instance 对象的目标属性构建字母表。
2. Input2CharSequence :从数据属性中指定的字符串、文件或 URL 读取输入,并将其替换为资源的内容。
3. CharSequence2TokenSequence :对数据属性中的字符串进行分词。
4. TokenSequenceLowercase :将数据属性中的分词转换为小写。
5. TokenSequenceRemoveStopwords :过滤掉数据中的停用词。
6. TokenSequence2FeatureSequence :创建分词的字母表,并将分词序列转换为特征索引序列。
7. FeatureSequence2FeatureVector :将特征索引序列转换为向量,用于词袋模型。

最后,我们需要将 PostInfo 对象转换为 Instance 对象。使用 ArrayDataAndTargetIterator 来实现这一点,并使用 accepted-tag 函数来标记答案是否被接受:

(defn accepted-tag [post-info]
  (if (:accepted-for post-info) "accepted" "not"))

(defn post-info-iterator [post-infos]
  ;; 此处代码未完整给出,后续可继续完善

通过以上步骤,我们可以对答案进行分类,预测哪些答案会被接受。虽然预测可接受答案可能面临挑战,因为可接受答案可能没有共同的语言特征可供算法识别,但通过尝试,我们可以了解这种方法的有效性。

综上所述,通过对社交平台上用户的提问、回答行为进行分析,我们可以深入了解用户的参与模式和内容生成方式。同时,尝试预测优质答案可以为平台提供有价值的信息,帮助用户更快地找到解决问题的方法。未来,我们可以进一步优化分析方法,提高预测的准确性,为社交平台的发展做出贡献。

社交数据参与度分析:深入洞察用户行为与内容生成

7. 深入分析 MALLET 分类流程

在上一部分,我们介绍了使用 MALLET 库来预测答案是否会被接受的基本步骤。接下来,我们将更深入地分析这个分类流程,包括如何创建 InstanceList 对象、训练分类器以及评估分类结果。

7.1 创建 InstanceList 对象

为了将 PostInfo 对象转换为 Instance 对象并构建 InstanceList ,我们需要完成 post-info-iterator 函数。以下是完整的代码:

(defn post-info-iterator [post-infos]
  (let [data (map :body-text post-infos)
        targets (map accepted-tag post-infos)]
    (ArrayDataAndTargetIterator. (into-array String data) (into-array String targets))))

这个函数将 PostInfo 对象的 body-text 作为输入数据,使用 accepted-tag 函数生成对应的目标标签,然后使用 ArrayDataAndTargetIterator 创建迭代器。

接下来,我们可以使用 make-pipe 函数创建的管道来处理这些实例:

(defn create-instance-list [post-infos]
  (let [pipe (make-pipe)
        iterator (post-info-iterator post-infos)
        instance-list (InstanceList. pipe)]
    (.addThruPipe instance-list iterator)
    instance-list))

create-instance-list 函数接受 PostInfo 对象列表,创建管道和迭代器,然后将迭代器中的实例通过管道处理后添加到 InstanceList 中。

7.2 训练分类器

我们将使用朴素贝叶斯分类器进行训练。以下是训练分类器的代码:

(defn train-classifier [instance-list]
  (let [trainer (NaiveBayesTrainer.)
        classifier (.train trainer instance-list)]
    classifier))

train-classifier 函数接受 InstanceList 对象,创建朴素贝叶斯训练器,然后使用训练器对 InstanceList 进行训练,返回训练好的分类器。

7.3 评估分类结果

为了评估分类器的性能,我们可以使用混淆矩阵。以下是评估分类结果的代码:

(defn evaluate-classifier [classifier instance-list]
  (let [trial (Trial. classifier instance-list)
        confusion-matrix (ConfusionMatrix. trial)]
    confusion-matrix))

evaluate-classifier 函数接受训练好的分类器和 InstanceList 对象,创建 Trial 对象,然后使用 ConfusionMatrix 评估分类结果。

以下是一个完整的示例,展示如何使用这些函数进行分类和评估:

(def s (p/load-post-infos "post-sample-100000.json"))
(def instance-list (create-instance-list s))
(def classifier (train-classifier instance-list))
(def confusion-matrix (evaluate-classifier classifier instance-list))
(println confusion-matrix)

这个示例加载数据,创建 InstanceList ,训练分类器,然后评估分类结果,并打印混淆矩阵。

8. 用户参与模式的可视化分析

除了使用数据和代码进行分析,可视化也是理解用户参与模式的重要手段。我们可以使用图表来展示不同用户群体的分布情况,以及提问和回答之间的关系。

8.1 五分位数分布可视化

我们可以使用柱状图来展示不同用户群体(只提问、只回答、既提问又回答)的五分位数分布情况。以下是一个简单的 mermaid 流程图,展示如何生成这些图表:

graph LR
    A[数据准备] --> B[计算五分位数]
    B --> C[生成柱状图数据]
    C --> D[绘制柱状图]

在代码实现方面,我们可以使用 Python 的 matplotlib 库来绘制柱状图。以下是一个示例代码:

import matplotlib.pyplot as plt

# 只提问用户的五分位数分布
q_counts = [969148, 272085, 156092, 156092, 156092]
labels = ['Q1', 'Q2', 'Q3', 'Q4', 'Q5']

plt.bar(labels, q_counts)
plt.title('只提问用户的五分位数分布')
plt.xlabel('五分位数')
plt.ylabel('问题数量')
plt.show()

这个代码使用 matplotlib 库绘制了只提问用户的五分位数分布柱状图。

8.2 提问与回答关系可视化

我们可以使用散点图来展示每个用户的提问数量和回答数量之间的关系。以下是一个简单的 mermaid 流程图,展示如何生成这个散点图:

graph LR
    A[数据准备] --> B[提取提问和回答数量]
    B --> C[生成散点图数据]
    C --> D[绘制散点图]

以下是一个使用 Python 的 matplotlib 库绘制散点图的示例代码:

import matplotlib.pyplot as plt

# 假设我们有一个包含用户提问和回答数量的列表
question_counts = [10, 20, 30, 40, 50]
answer_counts = [20, 30, 40, 50, 60]

plt.scatter(question_counts, answer_counts)
plt.title('提问与回答数量关系')
plt.xlabel('提问数量')
plt.ylabel('回答数量')
plt.show()

这个代码使用 matplotlib 库绘制了提问与回答数量关系的散点图。

9. 总结与展望

通过对社交平台上用户的提问、回答行为进行全面分析,我们得到了以下重要结论:
- 用户参与模式 :80/20 规则在用户内容生成中表现明显,少数用户贡献了大部分内容。不同用户群体(只提问、只回答、既提问又回答)的参与模式存在差异,其中回答问题更倾向于由少数用户主导。
- 优质答案预测 :使用 MALLET 库可以尝试对答案是否会被接受进行分类预测,但由于可接受答案可能缺乏共同的语言特征,预测面临一定挑战。
- 可视化分析 :通过柱状图和散点图等可视化手段,可以更直观地理解用户参与模式和提问与回答之间的关系。

展望未来,我们可以从以下几个方面进一步优化分析和预测:
- 数据层面 :可以收集更多的数据,包括用户的个人信息、历史行为等,以丰富特征,提高预测的准确性。
- 算法层面 :尝试使用更复杂的机器学习算法,如深度学习算法,来替代朴素贝叶斯分类器,可能会获得更好的分类效果。
- 应用层面 :将分析结果应用到实际的平台优化中,例如根据用户的参与模式提供个性化的推荐和激励机制,提高用户的参与度和平台的活跃度。

通过不断地探索和改进,我们可以更好地理解用户行为,为社交平台的发展提供有力的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值