Skip to main content 홈 크리에이터 tools-only x-skills research-qualitative-methods
research-qualitative-methods Master qualitative research methods including interviews, ethnography, case studies, grounded theory, and thematic analysis
설치로 이동 Skills Marketplace 커뮤니티가 만든 AI 스킬을 발견하고 탐색하세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tools-only/X-Skills --skill research-qualitative-methods명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
Zip 다운로드 다운로드 중... name research-qualitative-methods description Master qualitative research methods including interviews, ethnography, case studies, grounded theory, and thematic analysis
Qualitative Research Methods Skill
When to Use This Skill
Use this skill when you need to:
Explore phenomena in depth
Understand lived experiences and meanings
Generate theory from data
Study context and complexity
Investigate "how" and "why" questions
Capture participant perspectives
Analyze textual or visual data
Conduct case studies or ethnographic research
Core Qualitative Approaches
1. In-Depth Interviews
Purpose : Explore individual perspectives and experiences
Interview Protocol Template :
from dataclasses import dataclass
from typing import List , Optional
from datetime import datetime
@dataclass
class InterviewProtocol :
"""Structure for interview guide"""
research_question: str
introduction: str
opening_questions: List [str ]
main_questions: List [str ]
probes: dict
closing_questions: List [str ]
estimated_duration: int
def generate_guide (self ):
"""Generate formatted interview guide"""
guide = f"""
# Interview Guide
## Research Question
{self.research_question}
## Introduction ({estimated_duration} minutes)
{self.introduction}
## Opening Questions (5-10 minutes)
"""
for i, q in enumerate (self .opening_questions, 1 ):
guide += f"{i} . {q} \n"
guide += "\n## Main Questions (30-40 minutes)\n"
for i, q in enumerate (self .main_questions, 1 ):
guide += f"{i} . {q} \n"
if q in self .probes:
for probe in self .probes[q]:
guide += f" - Probe: {probe} \n"
guide += "\n## Closing Questions (5-10 minutes)\n"
for i, q in enumerate (self .closing_questions, 1 ):
guide += f"{i} . {q} \n"
return guide
protocol = InterviewProtocol(
research_question="How do remote workers maintain work-life balance?" ,
introduction="""
Thank you for participating. This interview will take about 60 minutes.
I'm interested in understanding your experiences with remote work.
There are no right or wrong answers. Everything you share will be kept
confidential. Do you have any questions before we begin?
""" ,
opening_questions=[
"Can you tell me about your current remote work situation?" ,
"How long have you been working remotely?"
],
main_questions=[
"Walk me through a typical workday. What does it look like?" ,
"How do you separate work time from personal time?" ,
"What challenges have you faced with work-life balance?" ,
"What strategies have you found helpful?"
],
probes={
"Walk me through a typical workday. What does it look like?" : [
"What time do you typically start?" ,
"How do you structure your day?" ,
"Where do you work from?"
],
"What challenges have you faced with work-life balance?" : [
"Can you give me a specific example?" ,
"How did that make you feel?" ,
"What did you do about it?"
]
},
closing_questions=[
"Is there anything else you'd like to share?" ,
"What advice would you give to new remote workers?"
],
estimated_duration=60
)
print (protocol.generate_guide())
2. Thematic Analysis
Purpose : Identify patterns and themes in qualitative data
Six-Phase Process :
import pandas as pd
from collections import defaultdict
from typing import List , Dict , Set
class ThematicAnalysis :
"""Conduct rigorous thematic analysis"""
def __init__ (self ):
self .transcripts = {}
self .codes = defaultdict(list )
self .themes = {}
self .codebook = {}
def add_transcript (self, participant_id: str , text: str ):
"""Add transcript and initial notes"""
self .transcripts[participant_id] = {
'text' : text,
'initial_notes' : []
}
def add_initial_note (self, participant_id: str , note: str ):
"""Record initial observations"""
self .transcripts[participant_id]['initial_notes' ].append(note)
def code_segment (self, participant_id: str , segment: str ,
code: str , line_numbers: tuple ):
.codes[code].append({
: participant_id,
: segment,
: line_numbers
})
( ):
{code: (instances)
code, instances .codes.items()}
( ):
.themes[theme_name] = {
: codes,
: description,
: []
}
( ):
.themes[theme_name][ ].append({
: subtheme_name,
: codes
})
( ):
excerpts = []
theme = .themes[theme_name]
code theme[ ]:
code .codes:
excerpts.extend( .codes[code])
excerpts
( ):
excerpts = .get_theme_excerpts(theme_name)
report = {
: theme_name,
: (excerpts),
: ( (e[ ] e excerpts)),
: .themes[theme_name][ ],
: excerpts[: ]
}
report
( ):
.themes[theme_name][ ] = definition
.themes[theme_name][ ] = essence
( ):
codebook = []
theme_name, theme_data .themes.items():
entry = {
: theme_name,
: theme_data.get( , ),
: .join(theme_data[ ]),
: ( .get_theme_excerpts(theme_name))
}
codebook.append(entry)
pd.DataFrame(codebook)
( ):
report =
report +=
report +=
report +=
theme_name, theme_data .themes.items():
report +=
report +=
report +=
report +=
excerpts = .get_theme_excerpts(theme_name)
report +=
report +=
report +=
i, excerpt (excerpts[: ], ):
report +=
report +=
theme_data.get( ):
report +=
subtheme theme_data[ ]:
report +=
report +=
report +=
report
analysis = ThematicAnalysis()
analysis.add_transcript( , )
analysis.add_initial_note( , )
analysis.code_segment( ,
,
,
( , ))
analysis.code_segment( ,
,
,
( , ))
analysis.create_theme(
,
codes=[ , , ],
description=
)
analysis.define_theme(
,
definition= ,
essence=
)
(analysis.generate_theme_report())
3. Grounded Theory
Purpose : Generate theory from data inductively
Coding Approach :
from dataclasses import dataclass
from typing import List , Optional , Dict
from enum import Enum
class CodingLevel (Enum ):
OPEN = "open"
AXIAL = "axial"
SELECTIVE = "selective"
@dataclass
class GroundedTheoryCode :
"""Represent a grounded theory code"""
code: str
level: CodingLevel
definition: str
properties: List [str ]
dimensions: Dict [str , tuple ]
memos: List [str ]
examples: List [str ]
class GroundedTheoryAnalysis :
"""Conduct grounded theory analysis"""
def __init__ (self ):
self .codes = {}
self .categories = {}
self .core_category = None
self .theoretical_memos = []
def open_coding (self, code_name: str , definition: str ):
"""Initial open coding"""
.codes[code_name] = GroundedTheoryCode(
code=code_name,
level=CodingLevel.OPEN,
definition=definition,
properties=[],
dimensions={},
memos=[],
examples=[]
)
( ):
.categories[category_name] = {
: codes,
: conditions,
: actions,
: consequences,
: CodingLevel.AXIAL
}
( ):
.core_category = {
: core_category,
: storyline,
: CodingLevel.SELECTIVE
}
( ):
code code .codes:
.codes[code].memos.append(memo)
:
.theoretical_memos.append(memo)
( ):
c1 = .codes.get(code1)
c2 = .codes.get(code2)
c1 c2:
comparison =
comparison +=
comparison +=
comparison +=
comparison +=
comparison +=
comparison
( ):
guide =
guide +=
.core_category:
guide +=
guide +=
guide +=
guide +=
guide +=
guide +=
guide +=
guide +=
guide +=
guide +=
guide
gt = GroundedTheoryAnalysis()
gt.open_coding( ,
)
gt.open_coding( ,
)
gt.axial_coding(
category_name= ,
codes=[ , , ],
conditions=[ , , ],
actions=[ , , ],
consequences=[ , , ]
)
gt.selective_coding(
core_category= ,
storyline=
)
gt.add_memo(
,
code= )
4. Case Study Research
Purpose : In-depth examination of bounded system
Case Study Protocol :
from dataclasses import dataclass
from typing import List , Dict
from enum import Enum
class CaseType (Enum ):
SINGLE = "single"
MULTIPLE = "multiple"
EMBEDDED = "embedded"
class DataSource (Enum ):
INTERVIEW = "interview"
OBSERVATION = "observation"
DOCUMENT = "document"
ARTIFACT = "artifact"
ARCHIVAL = "archival"
@dataclass
class CaseStudyDesign :
"""Define case study parameters"""
case_type: CaseType
research_questions: List [str ]
propositions: List [str ]
units_of_analysis: str
case_selection_logic: str
data_sources: List [DataSource]
def generate_protocol (self ):
"""Generate case study protocol"""
protocol = f"""
# Case Study Protocol
## Overview
Type: {self.case_type.value}
Unit of Analysis: {self.units_of_analysis}
## Research Questions
"""
for i, q in enumerate (self .research_questions, 1 ):
protocol += f" . \n"
protocol +=
i, p ( .propositions, ):
protocol +=
protocol +=
protocol +=
source .data_sources:
protocol +=
protocol
:
( ):
.evidence = defaultdict( )
.chain_of_evidence = []
( ):
evidence_id =
.evidence[source].append({
: evidence_id,
: content,
: date,
: related_rq
})
evidence_id
( ):
.chain_of_evidence.append({
: finding,
: evidence_ids
})
( ):
rows = []
source, items .evidence.items():
item items:
rows.append({
: item[ ],
: source.value,
: item[ ],
: item[ ]
})
pd.DataFrame(rows)
design = CaseStudyDesign(
case_type=CaseType.SINGLE,
research_questions=[
,
],
propositions=[
,
],
units_of_analysis= ,
case_selection_logic= ,
data_sources=[DataSource.INTERVIEW, DataSource.DOCUMENT, DataSource.OBSERVATION]
)
(design.generate_protocol())
Qualitative Patterns
Rigorous Qualitative Research
✓ Reflexivity acknowledged
✓ Thick description provided
✓ Triangulation of data sources
✓ Member checking conducted
✓ Negative cases sought
✓ Audit trail maintained
✓ Saturation documented
✓ Context richly described
Weak Qualitative Research
✗ Researcher bias unacknowledged
✗ Thin description (anecdotes only)
✗ Single data source
✗ Cherry-picking quotes
✗ Ignoring disconfirming evidence
✗ Unclear analysis process
✗ Sample too small for claims
✗ Decontextualized findings
Best Practices
1. Data Collection
Build rapport before deep questions
Use open-ended questions
Practice active listening
Follow up on interesting points
Record with permission
Take field notes immediately after
Continue until saturation
2. Analysis
Start analysis during collection
Code systematically
Write analytic memos frequently
Check codes with second coder
Seek negative cases
Connect to existing theory
Ground findings in data
3. Quality Criteria
Credibility : Prolonged engagement, triangulation, member checks
Transferability : Thick description, context detail
Dependability : Audit trail, clear methods
Confirmability : Reflexivity, raw data available
Related Skills
research-design : Planning qualitative studies
data-collection : Interview and observation protocols
data-analysis : Qualitative data analysis software
research-synthesis : Synthesizing qualitative findings
research-writing : Writing qualitative reports
Quick Reference
Sample Sizes
Interviews: 5-25 for phenomenology
20-30 for grounded theory
1-3 for case study
Focus Groups: 3-5 groups of 6-10 participants
Ethnography: Extended engagement (months to years)
When to Stop Collecting Data
✓ Theoretical saturation reached
✓ No new themes emerging
✓ Negative cases explored
✓ All research questions addressed
✓ Rich description achieved
"""Apply code to text segment"""
self
'participant'
'segment'
'lines'
def
get_code_frequency
self
"""Count code applications"""
return
len
for
in
self
def
create_theme
self, theme_name: str , codes: List [str ],
description: str
"""Group codes into themes"""
self
'codes'
'description'
'subthemes'
def
add_subtheme
self, theme_name: str , subtheme_name: str ,
codes: List [str ]
"""Add subtheme to existing theme"""
self
'subthemes'
'name'
'codes'
def
get_theme_excerpts
self, theme_name: str
"""Extract all coded excerpts for a theme"""
self
for
in
'codes'
if
in
self
self
return
def
check_theme_coherence
self, theme_name: str
"""Assess internal homogeneity of theme"""
self
'theme'
'n_excerpts'
len
'n_participants'
len
set
'participant'
for
in
'codes'
self
'codes'
'excerpts_sample'
5
return
def
define_theme
self, theme_name: str , definition: str ,
essence: str
"""Provide clear theme definition"""
self
'definition'
self
'essence'
def
generate_codebook
self
"""Create detailed codebook"""
for
in
self
'Theme'
'Definition'
'definition'
''
'Codes'
', '
'codes'
'N_Excerpts'
len
self
return
def
generate_theme_report
self
"""Generate thematic analysis report"""
"# Thematic Analysis Report\n\n"
f"Total Participants: {len (self.transcripts)} \n"
f"Total Codes: {len (self.codes)} \n"
f"Total Themes: {len (self.themes)} \n\n"
for
in
self
f"## Theme: {theme_name} \n\n"
f"**Definition**: {theme_data.get('definition' , 'N/A' )} \n\n"
f"**Essence**: {theme_data.get('essence' , 'N/A' )} \n\n"
f"**Codes**: {', ' .join(theme_data['codes' ])} \n\n"
self
f"**Prevalence**: {len (excerpts)} coded segments "
f"across {len (set (e['participant' ] for e in excerpts))} participants\n\n"
"**Representative Excerpts**:\n\n"
for
in
enumerate
3
1
f"{i} . *{excerpt['participant' ]} *: "
f'"{excerpt["segment" ]} "\n\n'
if
'subthemes'
"**Subthemes**:\n\n"
for
in
'subthemes'
f"- *{subtheme['name' ]} *: "
f"{', ' .join(subtheme['codes' ])} \n"
"\n"
return
'P001'
"I find it hard to stop working..."
'P001'
"Struggles with boundaries"
'P001'
"I find it hard to stop working at 5pm"
'boundary_difficulty'
23
25
'P001'
"My laptop is always open on the kitchen table"
'physical_workspace_integration'
45
47
'Blurred Boundaries'
'boundary_difficulty'
'work_intrusion'
'always_on'
'Difficulty maintaining clear work-life boundaries'
'Blurred Boundaries'
'The challenge of creating and maintaining separation between work and personal life in remote settings'
'Work and life become entangled'
print
self
def
axial_coding
self, category_name: str , codes: List [str ],
conditions: List [str ], actions: List [str ],
consequences: List [str ]
"""Relate categories to subcategories (paradigm model)"""
self
'codes'
'conditions'
'actions_interactions'
'consequences'
'level'
def
selective_coding
self, core_category: str , storyline: str
"""Identify core category and integrate theory"""
self
'category'
'storyline'
'level'
def
add_memo
self, memo: str , code: Optional [str ] = None
"""Write theoretical memo"""
if
and
in
self
self
else
self
def
constant_comparison
self, code1: str , code2: str
"""Compare two codes"""
self
self
if
not
or
not
return
"Code(s) not found"
f"## Constant Comparison: {code1} vs {code2} \n\n"
f"**{code1} **: {c1.definition} \n"
f"**{code2} **: {c2.definition} \n\n"
"**Similarities**:\n- [Identify similarities]\n\n"
"**Differences**:\n- [Identify differences]\n\n"
"**Theoretical Insight**:\n[What does this tell us?]\n"
return
def
theoretical_sampling_guide
self
"""Generate guide for next theoretical sampling"""
"# Theoretical Sampling Guide\n\n"
"## Current Theory State\n"
if
self
f"Core Category: {self.core_category['category' ]} \n"
f"Storyline: {self.core_category['storyline' ]} \n\n"
"## Gaps to Address\n"
"1. [Identify underdeveloped categories]\n"
"2. [Identify missing relationships]\n"
"3. [Identify negative cases needed]\n\n"
"## Next Sampling Criteria\n"
"- Participants who... [specific characteristics]\n"
"- Settings that... [specific conditions]\n"
"- Events that... [specific situations]\n"
return
'seeking_flexibility'
'Actions to gain control over work schedule and location'
'managing_expectations'
'Negotiating others\' expectations about availability'
'Boundary Work'
'seeking_flexibility'
'managing_expectations'
'creating_rituals'
'Work from home'
'High autonomy'
'Family present'
'Set physical boundaries'
'Communicate availability'
'Use transitional rituals'
'Reduced conflict'
'Better focus'
'Improved wellbeing'
'Continuous Boundary Negotiation'
'Remote workers engage in ongoing negotiation of boundaries '
'between work and life, using spatial, temporal, and communicative '
'strategies to manage competing demands and maintain wellbeing.'
'Flexibility appears to be double-edged sword - enables control '
'but also creates expectation of constant availability'
'seeking_flexibility'
{i}
{q}
"\n## Propositions\n"
for
in
enumerate
self
1
f"{i} . {p} \n"
f"\n## Case Selection\n{self.case_selection_logic} \n"
"\n## Data Collection\n"
for
in
self
f"- {source.value} \n"
return
class
CaseStudyDatabase
"""Organize case study evidence"""
def
__init__
self
self
list
self
def
add_evidence
self, source: DataSource, content: str ,
date: str , related_rq: str
"""Add piece of evidence"""
f"{source.value} _{len (self.evidence[source])} "
self
'id'
'content'
'date'
'research_question'
return
def
link_evidence
self, evidence_ids: List [str ], finding: str
"""Create chain of evidence"""
self
'finding'
'evidence'
def
generate_evidence_table
self
"""Create evidence summary table"""
for
in
self
for
in
'ID'
'id'
'Source'
'Date'
'date'
'Research Question'
'research_question'
return
'How does the organization implement remote work policy?'
'What challenges emerge in the transition?'
'Remote work adoption requires cultural change'
'Technology alone is insufficient'
'Organization-level remote work transition'
'Selected for being early adopter with documented transition'
print