

# Redditの1つのスレッドに調査結果が左右されていないか確認する方法

1つのテーマを、コメント、アカウント、スレッド、コミュニティの単位で数えます。次に、最大のスレッドを除外して数え直します。それぞれの集計単位は、顧客について知りたいことに合わせて選びます。コメントの件数は、顧客に占める割合ではありません。製品の順位でもありません。

テーマとは、集計前に名前を付けておく、顧客の考えを表す1つの項目です。コメントとは、投稿に付いた1件の公開返信です。アカウントとは、データの行に記録された公開名です。アカウントだけでは、特定の人物、購入者、または個人の集団だと確認されたわけではありません。スレッドとは、取得元となる1件の投稿です。コミュニティとは、その投稿が属するRedditのグループです。コミュニティは、把握している投稿のアドレスから自分で追加します。収集プログラムはコミュニティを返しません。

1つの長いスレッドのために、あるテーマが広く見られるように感じられることがあります。テーマに該当するコメントの大半を、少数のアカウントが書いている場合もあります。4つの単位で数えると、その違いが分かります。最大のスレッドを除外すると、別のスレッドにもそのテーマがあるかどうかを確認できます。

公開の場で、顧客調査の方法を尋ねる人がいます。[プロダクトマーケティングのスレッド](https://www.reddit.com/r/ProductMarketing/comments/1liklfb/best_tactics_for_customer_research/)では、調査の方法を尋ねています。[SaaSのスレッド](https://www.reddit.com/r/SaaS/comments/1tb26ri/customer_research_on_reddit/)からは、Redditでの調査が難しいことが分かります。これらのスレッドは、調査方法を求める声があることを示しています。ただし、ここで使う集計単位には言及していません。この確認方法の妥当性を証明するものでも、市場を測定するものでもありません。

## 集計前にデータの各行を読む

Actorとは、ホスティング環境で動作するデータ収集プログラムです。この方法では、[Reddit Comments Actor](https://apify.com/chronometrica/reddit-comments-scraper)の公開ビルド1.0.7を使います。Taskとは、保存済みの入力設定です。[顧客の言葉を調べるTask](https://apify.com/chronometrica/reddit-comments-scraper/examples/reddit-customer-language-research)は、あくまで出発点です。集計が自動で行われる証拠ではありません。Actorが保存するのは、取得元のデータ行です。この方法の集計は、すべて自分で行います。

Actorには、把握している公開スレッドを`postUrls`で指定します。投稿URLは1〜50件指定できます。`maxCommentsPerPost`は、1件の投稿から保存するコメント数の上限です。上限とは、その投稿からActorに保存を求めるコメント数の最大値です。1〜500に設定できます。既定の上限は100です。保存済みのTaskでは250を使っています。最初の確認では、投稿を1件だけ指定し、上限を3にします。投稿を増やすのは、その後にしてください。どの上限も同じ範囲内に収めます。

保存済みのTaskには、サンプルのスレッドが1件指定されています。このサンプルを、自分が把握している公開URLに置き換えてください。

```json
{
  "postUrls": [
    "https://www.reddit.com/r/LocalLLaMA/comments/1ui241x/the_number_1_public_enemy_of_opensource/"
  ],
  "maxCommentsPerPost": 250
}
```

集計前にデータの各行を読む

保存された1行は、取得元の投稿に付いた1件の公開コメントです。必要な項目は、`postId`、`canonicalPostUrl`、`commentId`、`authorName`、`body`、`status`、`observedAt`です。`canonicalPostUrl`は、取得元の投稿の標準的な公開アドレスです。bodyはコメントの本文です。`observedAt`は、その行を確認した時刻です。データセット内のコメントの状態は、ok、deleted、removedのいずれかだけです。実行結果のpartialやfailedは、コメントの状態ではありません。

本文や`authorName`は、空欄だったり、代替表記だったりすることがあります。[deleted]という文字列は代替表記です。名前が欠けているすべての行に共通する、1つのアカウントではありません。`authorName`をアカウントの識別キーとして使うのは、空欄でも[deleted]でもない場合だけにしてください。

今回、既知のAskMarketingスレッドを1件だけ使った対照確認では、取得元の投稿と一致する、異なる3件のコメントIDが返されました。その3件すべてに本文がありました。別途データを読んだところ、空欄ではない、異なる3つの公開著者名が確認されました。これらの名前はここには保存していません。3行すべてで、`parentId`とdepthはnullでした。`hiddenBranchesRemaining`もnullでした。この方法に返信ツリーは必要ありません。親コメントがnullであっても、返信先とのつながりを示すものにはなりません。つながりを推測して作らないでください。親コメントの情報が欠けていても、その人が誰なのかは分かりません。

OUTPUTブロックには、`commentsSaved`、`duplicatesSkipped`、`hiddenBranchesRemaining`、`completionReason`、`status`、`isComplete`、`inputResults`が含まれる場合があります。各入力についても、`commentsFound`、`commentsSaved`、`status`、`reason`が表示されることがあります。今回の3行の実行では、`isComplete`はtrueでしたが、statusはpartialでした。`isComplete`は、保存処理が完了したことを意味します。partialは、Actorがスレッド全体を保存していないことを意味します。実行が終了しても、その投稿の全コメントが取得できたわけではありません。今回の実行には上限を設定していました。多数のスレッドを測定したものではありません。テーマを測定したものでもありません。出力には、重複を除いた著者数のカウンターはありません。アカウント数は自分で数えます。

このActorは、`requestedSubreddit`や`matchedSubreddit`を返しません。これらのフィールドを返すのは、別のActorです。コミュニティの列を追加する場合は、把握している`canonicalPostUrl`、または自分で確認した取得元のフィールドから転記してください。どこから転記したかも記録します。その列は、自分で加えた注記です。Actorはテーマのラベルを追加しません。製品の順位付けもしません。偏りのないサンプルを作ってくれるわけでもありません。

## 次の8つの手順を実行する

1. テーマを1つ決め、使用するスレッドを指定します。そのテーマに含める文章と、含めない文章の基準を書きます。これは集計前に行ってください。保存された1行は、記録された1件のコメントです。同じアカウントが何件もコメントを書くことがあります。1つのスレッドに多数のコメントが集まることもあります。

返信が多いスレッドは、大きな顧客集団のように見えることがあります。しかし、1つの長い会話にすぎないかもしれません。含める基準と除外する基準を定めておけば、最大のスレッドを見た後でテーマの範囲を変えることを防げます。

1. 最初に、把握しているスレッドを1件だけ収集します。各コメントID、本文、状態、著者フィールド、OUTPUTブロックを読みます。分類可能なコメントとは、本文を読んで判断できるコメントです。削除済みの本文、運営側などにより除去された本文、欠損した本文は、テーマの集計から除外します。ただし、それぞれ何行あったかは報告してください。本文が欠けていても、テーマがないとは限りません。その行を分類できないという意味です。上限は固定します。取得元が示す終了理由は、すべて保持してください。上限は自分で選んだ制限です。会話の全体を表すものではありません。

最初はURLを1件だけ指定し、`maxCommentsPerPost`を3にします。OUTPUTのstatusがpartialなら、そのことを明記してください。終了した実行を、母集団全体の取得と呼ばないでください。ここでいう母集団とは、その投稿に付いた全コメントです。後で投稿を追加する場合も、`postUrls`は50件以下にします。各上限は1〜500に収めてください。

1. 各コメントIDは、取得元の投稿と`observedAt`の時刻を一緒に保存します。2行の文章が同じでも、IDが異なるなら統合しないでください。同じIDの行で内容が食い違う場合は、両方の行を確認します。文章だけを基準に片方を選ばないでください。IDが欠けていて解決できない行は、別のグループで数えます。既知のアカウントを識別するキーには、空欄でも[deleted]でもない`authorName`を使う必要があります。名前が不明な行や代替表記の行は、既知のアカウント集合から除外します。それらすべてに共通のアカウントを1つ割り当てないでください。
2. 分類可能な文章を対象に、[テーマを手作業で分類します](/ja/articles/reddit%E3%82%B3%E3%83%A1%E3%83%B3%E3%83%88-%E3%82%B3%E3%83%BC%E3%83%80%E3%83%BC%E9%96%93%E3%81%AE%E4%B8%80%E8%87%B4%E5%BA%A6%E3%81%AE%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95/)。分類コード、分類者の名前、バージョン、文脈についての短いメモを保存します。分類可能な各コメントにyesまたはnoを付けます。yesはテーマがあることを意味します。noは、文章を読めたうえで、テーマがないことを意味します。この方法では、positiveはyes、つまりテーマに該当するという意味です。書き手が喜んでいるという意味ではありません。negativeはno、つまりテーマに該当しないという意味です。書き手が怒っているという意味ではありません。自動感情分析ツールは使わないでください。ここでいう感情分析とは、ツールが感情を推測することです。Actorはテーマを分類しません。返信の文脈が必要なら、公開スレッドを開いて読んでください。`parentId`がnullでも、文脈の情報にはなりません。
3. yesの行から4つの集合を作ります。コメント集合には、テーマに該当する各コメントIDを1回ずつ含めます。アカウント集合には、yesのコメントが1件以上ある既知のアカウントを含めます。スレッド集合には、yesのコメントが1件以上あるスレッドを含めます。コミュニティ集合には、yesのスレッドが1件以上あるコミュニティを含めます。同じ値は、その集合内で1回だけ数えます。1つのアカウントによる3件のコメントは、アカウントとしては1つです。この方法では、1つのスレッドは1つのコミュニティに属します。この4つの集合は、それぞれ異なる4つの問いに答えます。購入者数を推定するものではありません。読むだけの人を数えるものでもありません。
4. 各集合の分子と分母を書きます。分子は、そのテーマがある単位の数です。分母は、割り算の基準となる集団です。コメントの分母は、選択したサンプル内の分類可能なコメントです。アカウントの分母は、自分の基準で分類可能なコメントがある、既知のアカウントです。登録ユーザー全員ではありません。その分数と併せて、アカウント不明の行数を報告します。使用した上限も報告します。スレッドの分母は、選択した既知のスレッドです。コミュニティの分母は、選択した既知のコミュニティです。どちらの分母もReddit全体ではありません。予定していた取得元の数と、実際に観測できて利用可能だった数を、単位ごとに分けて記録します。予定数とは、読む対象に選んだスレッドやコミュニティの数です。利用可能な観測数とは、そのうち実際に取得でき、分類できた数です。これらを分けて記録しない場合は、選択した各分母を使った割合に「観測範囲でのテーマ該当率」と明記し、不明な対象をすべて示してください。観測範囲でのテーマ該当率で数えるのは、読んで分類できた単位だけです。取得に失敗したスレッドは、確認できたかどうかが未解決の対象です。アクセスできなかったスレッドも、全体が分類不能だったスレッドも同様です。取得に失敗したコミュニティも、アクセスできなかったコミュニティも、全体が分類不能だったコミュニティも、確認できたかどうかが未解決の対象です。未解決の対象は、テーマがないと確認できた対象ではありません。テーマがないと確認できた対象とは、その単位を実際に確認し、テーマがなかったものを指します。一部だけ取得したスレッドでは、文章が抜け落ちることがあります。取得した文章にテーマがなければ、取得したサンプルではテーマを観測しなかったということです。その結果は、テーマが存在しないことを示しません。

コメントの該当率が高くても、1つのアカウントが何度も投稿した結果かもしれません。アカウント単位ではその名前を1回しか数えないため、該当率が低く見えることがあります。スレッドの該当率が高くても、それらが1つのコミュニティに集中している場合があります。4つの割合を併せて読み取ってください。

1. 選択したスレッドを、yesのコメント数が多い順に並べます。最上位のスレッドだけを除外し、4つの単位すべてで数え直します。これは、スレッドを1つ除外する確認です。その1つのスレッドに結論が依存しているかどうかを示します。有意性検定ではありません。有意性検定とは、その差が偶然だけで生じ得るかどうかを調べるものです。この確認では、それを調べません。除外したスレッドが質の悪いデータだという意味でもありません。最終的な収集データには、そのスレッドを戻します。何が変わったかを示す短い影響メモを追加してください。

各単位について、除外前後を比較します。yesの行の大半が1つのスレッドにあった場合、コメントの該当率は大きく下がることがあります。アカウント単位では、繰り返し投稿をすでに1つのアカウントとして数えているため、変化の仕方が異なる場合があります。スレッドの該当率では、そのスレッドが分子と分母の両方から減ります。コミュニティの該当率は、同じコミュニティ内の別の選択済みスレッドにもテーマがあれば、変わらないことがあります。

1. 根拠の広がりを示す表と、短い結論を公開します。根拠の広がりを示す表とは、4つの割合を並べたものです。そのテーマが、何件のコメント、いくつのアカウント、いくつのスレッド、いくつのコミュニティにあるかを示します。最上位のスレッドを除外した後に何が残るかも示します。テーマが1つのスレッドにしかなくても、文章から学べることはあります。それは質的な根拠です。ただし、根拠の広がりは乏しいといえます。広がりとは、独立したいくつの情報源が同じ内容を示しているかということです。結果は、追加調査の計画に使ってください。市場規模を示すと主張してはいけません。顧客の過半数を示すと主張してもいけません。[これらの割合から機能を順位付けしないでください](/ja/articles/facebook%E3%81%AE%E6%A9%9F%E8%83%BD%E8%A6%81%E6%9C%9B-%E8%A3%BD%E5%93%81%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D/)。

## 架空の9件のコメント集計表

以下の表は、説明のために独自に作った架空の例です。計算方法を学ぶためのものです。Actorの実行結果ではありません。先ほどの3行のサンプルでもありません。そのサンプルには、テーマの分類コードを付けていません。ここで使うコメントIDは架空のラベルです。この集計表には、Actorの上限は示していません。実際の実行では、設定した上限と、一部だけ取得して終了した場合はそのことを報告してください。

この架空の例には、分類可能なコメントが9件あります。取得元は、既知の3つのスレッド、T1、T2、T3です。T1とT2はコミュニティQ1に属します。T3はコミュニティQ2に属します。該当は、テーマがあることを意味します。非該当は、文章を読めたうえで、テーマがないことを意味します。

| 行 | コメントID | スレッド | コミュニティ | アカウント | 本文の状態 | テーマ |
| --- | --- | --- | --- | --- | --- | --- |
| 1 | C1 | T1 | Q1 | A | 分類可能 | 該当 |
| 2 | C2 | T1 | Q1 | A | 分類可能 | 該当 |
| 3 | C3 | T1 | Q1 | A | 分類可能 | 該当 |
| 4 | C4 | T1 | Q1 | B | 分類可能 | 該当 |
| 5 | C5 | T1 | Q1 | C | 分類可能 | 該当 |
| 6 | C6 | T2 | Q1 | A | 分類可能 | 該当 |
| 7 | C7 | T2 | Q1 | D | 分類可能 | 非該当 |
| 8 | C8 | T3 | Q2 | E | 分類可能 | 非該当 |
| 9 | C9 | T3 | Q2 | F | 分類可能 | 非該当 |

もう1行は、データの利用可否だけを記録したものです。分類可能な9件のコメントには含まれません。

| 行 | コメントID | スレッド | コミュニティ | アカウント | 本文の状態 | テーマ |
| --- | --- | --- | --- | --- | --- | --- |
| 10 | R1 | 集合に含めない | 集合に含めない | 不明 | removed | 未分類 |

R1は、分類可能な10件目のコメントではありません。非該当でもありません。不明の著者は、既知の7つ目のアカウントではありません。[deleted]を共通の識別キーとして扱わないでください。この架空の例では、R1をT1、T2、T3のいずれにも割り当てていません。本文が欠けていても、テーマがないとは限りません。アカウント不明で、本文が除去された行が1件あったと報告します。これは、データの利用可否の集計だけに残してください。

既知のアカウントの名前空間は、A、B、C、D、E、Fだけです。ここでいう名前空間とは、アカウント数の集計に含めてよい名前の集合です。Aが繰り返し出てきても、名前は1つです。R1によって名前が増えることはありません。

除外前のコメント集合：C1、C2、C3、C4、C5、C6。コメントの分母はC1〜C9です。

9件中6件 = 66.7%。分類可能なコメントの66.7%がテーマに該当します。

除外前のアカウント集合：A、B、C。Aは分類可能なコメントを4件書いています。3件はT1、1件はT2にあります。それでも、Aは1つのアカウントです。アカウントの分母はA、B、C、D、E、Fです。

6アカウント中3アカウント = 50%。分類可能なコメントを持つ既知のアカウントの50%がテーマに該当します。

R1は引き続き、この分母に含めません。

除外前のスレッド集合：T1、T2。スレッドの分母はT1、T2、T3です。

3スレッド中2スレッド = 66.7%。選択したスレッドの66.7%がテーマに該当します。

除外前のコミュニティ集合：Q1。T3はQ2に属し、Q2のコメントは2件とも非該当です。コミュニティの分母はQ1とQ2です。

2コミュニティ中1コミュニティ = 50%。選択したコミュニティの50%がテーマに該当します。

この4つの割合が表すのは、選択したサンプルだけです。母集団全体でテーマがどの程度見られるかを示す割合ではありません。その割合とは、顧客全体に占める割合を意味します。今回は、すべての顧客を選んだわけではありません。

テーマに該当する6件のコメントのうち、5件がT1にあります。その5件は、C1、C2、C3、C4、C5です。

6件中5件 = 83.3%。

T1が支配的なスレッドです。ここで支配的とは、yesのコメントを最も多く含むという意味です。

次にT1を除外し、数え直します。残る分類可能なコメントは、C6、C7、C8、C9です。テーマに該当するコメントはC6だけが残ります。アカウントAがT2に書いたコメントです。

除外後のコメント集合：C6。分母はC6、C7、C8、C9です。

4件中1件 = 25%。残った分類可能なコメントの25%がテーマに該当します。

残る既知のアカウントは、A、D、E、Fです。BとCはこの分母から外れます。分類可能なコメントがT1にしかなかったためです。この確認では、BやCを残さないでください。R1の不明の著者も加えないでください。テーマに該当するアカウントとして残るのはAだけです。Aは引き続き1回だけ数えます。

除外後のアカウント集合：A。分母はA、D、E、Fです。

4アカウント中1アカウント = 25%。残った既知のアカウントの25%がテーマに該当します。

残るスレッドはT2とT3です。T2は引き続きテーマに該当します。T3は該当しません。

除外後のスレッド集合：T2。分母はT2とT3です。

2スレッド中1スレッド = 50%。残ったスレッドの50%がテーマに該当します。

残るコミュニティは、変わらずQ1とQ2です。T2がQ1に属するため、Q1は引き続きテーマに該当します。Q2は引き続き非該当です。

除外後のコミュニティ集合：Q1。分母はQ1とQ2です。

2コミュニティ中1コミュニティ = 50%。残ったコミュニティの50%がテーマに該当します。

| 集計単位 | サンプル全体 | T1を除外 |
| --- | --- | --- |
| テーマに該当するコメント | 9件中6件 = 66.7% | 4件中1件 = 25% |
| テーマに該当する既知のアカウント | 6アカウント中3アカウント = 50% | 4アカウント中1アカウント = 25% |
| テーマに該当するスレッド | 3スレッド中2スレッド = 66.7% | 2スレッド中1スレッド = 50% |
| テーマに該当するコミュニティ | 2コミュニティ中1コミュニティ = 50% | 2コミュニティ中1コミュニティ = 50% |

単位ごとに、変化する理由が異なります。コメントの該当率は66.7%から25%に下がります。T1にはyesのコメントが5件ありました。T2にはyesのコメントが1件残ります。アカウントの該当率は50%から25%に下がります。T1を除外するとBとCも外れます。Aは1アカウントとして残ります。AがT1に書いた3件の投稿は、3つのアカウントではありません。スレッドの該当率は66.7%から50%に下がります。T1を分子と分母の両方から除くためです。T2は引き続き該当します。コミュニティの該当率は50%のままです。Q1にはT2が残っています。T1を除外しても、Q1は除外されません。

別のスレッドにも、そのテーマは残っています。ただし、コメント内でのテーマの出現頻度は、T1に大きく左右されていました。最終的な収集データにはT1を残します。影響メモには、2つの事実を書いてください。テーマに該当する6件のコメントのうち5件がT1にあったこと。そして、T2にもテーマが1件残っていることです。

R1は、どちらの集計でもデータの利用可否についての注記のままです。noの票として数えることはありません。アカウントとして数えることもありません。

この架空の例から導ける結論の範囲は限られています。選択したこれらのスレッドでは、主にT1のために、コメントの該当率が高く見えます。テーマは、既知の6アカウント中3アカウントにあります。3スレッド中2スレッドにあります。2コミュニティ中1コミュニティにあります。T1を除外した後も、1アカウント、1スレッド、1コミュニティに残ります。これは、追加調査の手掛かりです。顧客の過半数を示すものではありません。機能の順位を示すものでもありません。

## 次に行うこと

自分が把握している公開スレッドで、1つのテーマを数えます。4つの単位の集合を作ります。顧客について主張する前に、支配的なスレッドについてのメモを保存します。[Reddit Comments Actor](https://apify.com/chronometrica/reddit-comments-scraper)でデータの行を収集してください。[顧客の言葉を調べるTask](https://apify.com/chronometrica/reddit-comments-scraper/examples/reddit-customer-language-research)から始め、サンプルURLを置き換えて、最初の上限を3に設定します。

## 出典と参考資料

- [Reddit Comments Actor](https://apify.com/chronometrica/reddit-comments-scraper)
- [顧客の言葉を調べるTask](https://apify.com/chronometrica/reddit-comments-scraper/examples/reddit-customer-language-research)
- [顧客調査に最適な方法](https://www.reddit.com/r/ProductMarketing/comments/1liklfb/best_tactics_for_customer_research/)
- [Redditでの顧客調査](https://www.reddit.com/r/SaaS/comments/1tb26ri/customer_research_on_reddit/)