☕️ coffee lab

[python] 브루잉일지 01. 좋은 커피는 어떻게 만들어질까: 질문부터 내리기

Floaty 2026. 7. 28. 12:00

가설

번호 질문 가설
H1 고도가 높을수록 산미가 높아질까? 원두의 평균 고도(`altitude_mean_meters`)가 높아질수록 산미 점수(`Acidity`)도 높아질 것이다.
H2 생산국이나 품종도 영향을 미칠까? 생산국(`Country of Origin`)과 품종(`Variety`)에 따라 품질점수(`Total Cup Points`)에 유의한 차이가 있을 것이다.
H3 로스팅 정도에 따라 원두 가격은 달라질까? 로스팅 정도(`roast`)에 따라 원두 가격(100g당 가격)에 유의한 치아기 있을 것이다.
H3' 가공 방식(워시드, 네추럴, 허니 등)에 따라 원두 가격은 달라질까? 리뷰 텍스트에서 추출한 가공 방식(washed, natural, honey 등)에 따라 원두 가격(100g당 가격)에 유의한 차이가 있을 것이다.
H4 로스팅 정도에 따라 품질 평가도 달라질까? 로스팅 정도(`roast`)에 따라 평점(`rating`)에 유의한 차이가 있을 것이다.
H4' 가공 방식(워시드, 네추럴, 허니 등)에 따라 품질 평가도 달라질까? 리뷰 텍스트에서 추출한 가공 방식에 따라 평점(`rating`)에 유의한 차이가 있을 것이다.
H5 소비자는 산미가 높은 커피를 선호할까? 산미가 적정 수준(JAR 척도상 ‘딱 알맞음’)에 가까울수록 소비자의 전반적 만족도(`Liking`)가 높아질 것이다.
H6 전문가의 품질 평가와 소비자의 취향은 일치할까? 전문가의 품질 평가(산미/향미 점수)와 소비자의 만족도/구매 의향 사이에 뚜렷한 상관관계가 없을 것이다.

 

 

 

데이터 소개

가설을 검증하려면 생산(H1, H2), 가공(H3, H4), 소비(H5, H6) 세 단계를 각각 판단할 수 있는? {커버 말고 다른 단어} 데이터가 필요했다.

 

 

`생산 단계` - [kaggle] Coffee Quality database from CQI

H1, H2를 검증하려면 고도와 산미, 원산지, 품종, 품질 점수가 한 테이블에 있어야 하고, 이 데이터셋에는 존재하기 때문에 이 데이터를 선택했다.

  • `arabica_data_cleaned.csv` (아라비카 데이터셋)
  • `merged_data_cleaned.csv` (통합 데이터셋)
  • `robusta_data_cleaned.csv` (로부스타 데이터셋)

이 중 아라비카 데이터셋을 최종적으로 선택했는데 소거법을 통해 골랐다. 로부스타 데이터셋은 28행뿐이라 통계적으로 의미 있는 분석이 어렵고, 아라비카와 컬럼 체계 자체가 다르다. 통합 데이터셋은 아라비카와 로부스타를 합쳐놓은 파일인데 로부스타 쪽 컬럼 체계가 아라비카와 다르다 보니 로부스타 행 입장에서는 아라비카 관련 컬럼들이 비어버린다. 반대로 아라비카 입장에서 봐도 통합 데이터셋은 "아라비카 데이터에 로부스타라는 노이즈만 얹은 것"에 가깝다. 

 

결국 표본 수가 충분하고 노이즈가 적은 쪽은 아라비카 데이터셋이라는 결론이 나와서, 이 데이터셋 하나로 분석을 진행하기로 했다.

 

 

`가공 단계` - [kaggle] Coffee Reviews Dataset

H3, H4를 검증하기 위한 커피 리뷰 데이터셋이다. 이 데이터셋에는 2개의 파일이 있는데 이 중 `coffee_analysis.csv`를 선택했다.

  • `coffee_analysis.csv`: 향미 서술이 `desc_1`, `desc_2`, `desc_3` 세 필드로 세분화되어 있어서 텍스트 분석에 유리
  • `simplified_coffee.csv`: 이 서술이 `review` 필드 하나로 합쳐져 있어서 세분화된 정보가 뭉개질 가능성이 있다.

정보 손실이 적은 쪽을 골랐다.

 

 

소비 단계 - [DRYAD] Consumer preference data for black coffee

H5, H6를 검증하기 위한 소비자 선호 데이터셋인데 이 데이터셋은 `cotter_dataset.csv` 하나뿐이라 별도로 고를 필요가 없다.

 

 

 

전체 컬럼과 각 컬럼의 뜻

세 데이터셋의 컬럼을 정리했다. 컬럼 이름만으로 뜻이 분명하지 않은 항목 특히 커핑 점수 항목들은 깃허브 레포지토리의 설명만으로는 부족해서 SCA(Specialty Coffee Association)의 커핑 프로토콜을 참고해서 뜻을 보충했고, 이렇게 보충한 설명 끝에는 표시(with SCA)를 해두었다.

 

 

생산 단계 - [kaggle] Coffee Quality database from CQI > arabica_data_cleaned.csv

이 데이터는 R로 전처리된 파일이라 컬럼명에 공백 대신 점(.)이 들어가 있어서 점을 띄어쓰기로 읽으면 된다. 컬럼 구성은 여기에서 큰 틀만 확인했고, 개별 컬럼 뜻은 저장소에 별도로 없었기에 SCA 커핑 폼을 참고했다.

 

더보기
  • 품질 지표(Quality Measures)
    컬럼명 설명
    Aroma 향 점수, 0~10 (with SCA)
    Flavor 맛 점수, 0~10 (with SCA)
    Aftertaste 뒷맛 점수, 0~10 (with SCA)
    Acidity 산미 점수, 0~10 (with SCA)
    Body 바디감(질감) 점수, 0~10 (with SCA)
    Balance 균형감 점수, 0~10 (with SCA)
    Uniformity 균일성 점수 — 여러 컵 간 맛 편차가 적을수록 높음, 0~10 (with SCA)
    Clean.Cup 클린컵 점수 — 잡미·결점 없이 깔끔한 정도, 0~10 (with SCA)
    Sweetness 단맛 점수, 0~10 (with SCA)
    Cupper.Points 커퍼(평가자)의 종합 주관 점수, 0~10 (with SCA)
    Total.Cup.Points 위 항목을 합산한 총점, 보통 0~100
    Moisture 생두 수분 함량(%)
    Category.One.Defects 1군 결점두 개수(품질에 큰 영향)
    Category.Two.Defects 2군 결점두 개수(상대적으로 영향 작음)
    Quakers 덜 익은 콩 개수(로스팅 후 색이 다르게 나오는 콩)
  • 원두 정보 (Bean Metadata)
    컬럼명 설명
    Species Arabica / Robusta 종 구분
    Variety 품종 (Bourbon, Caturra, Typica 등)
    Processing.Method 가공 방식 (Washed/Wet, Natural/Dry, Honey 등)
    Color 생두 색상
  • 농장/생산 정보 (Farm & Origin Metadata)
    컬럼명 설명
    Owner / Owner.1 원두 소유자(농장주) 이름
    두 컬럼은 값이 거의 동일한 중복 컬럼으로, 스크래핑 과정에서 생긴 것으로 추정  
    Country.of.Origin 생산국
    Farm.Name 농장 이름
    Lot.Number 생산 로트(배치) 번호
    Mill 가공(정제)한 공장 이름
    ICO.Number 국제커피기구(ICO) 등록번호
    Company 유통·수출 회사명
    Producer 생산자(농장주와 다를 수 있음)
    Region 생산 지역(국가보다 세분화된 단위)
    Number.of.Bags 포대 수
    Bag.Weight 포대당 무게
    In.Country.Partner 현지 품질 평가 협력기관
    Harvest.Year 수확 연도
    Altitude 고도 원본값(텍스트로 "1950-2200"처럼 뒤섞여 있어 계산엔 부적합)
    unit_of_measurement 고도 단위(m 또는 ft)
    altitude_low_meters 고도 최저값(미터로 정제)
    altitude_high_meters 고도 최고값(미터로 정제)
    altitude_mean_meters 고도 평균값(미터로 정제) — 분석에 사용할 컬럼
  • 평가/인증 정보 (Grading & Certification Metadata)
    컬럼명 설명
    Grading.Date 커핑(품질 평가) 진행 날짜
    Expiration 평가 유효기간 만료일
    Certification.Body 인증기관명
    Certification.Address 인증기관 주소
    Certification.Contact 인증기관 연락처
    Unnamed: 0 행 번호(인덱스), 분석에는 의미 없음

이 데이터에서는 `Altitude`(고도), `Species`(품종 대분류), `Country.of.Origin`, `Variety`, `Aroma`, `Flavor`, `Aftertaste`, `Acidity`, `Total.Cup.Points`를 중심으로 볼 예정이며, 나머지 컬럼은 필요할 때만 보조적으로 참고할 생각이다.

 

 

가공 단계 - [kaggle] Coffee Reviews Dataset > coffee_analysis.csv

kaggle 데이터셋 페이지의 소개를 참고해서 정리했다.

 

더보기

컬럼명 설명
name 원두·블렌드 이름
roaster 로스터리(판매 업체) 이름
roast 로스팅 정도 (Light, Medium-Light, Medium, Medium-Dark, Dark 등)
loc_country 로스터리가 위치한 국가(원두 생산국이 아님)
origin_1 원두의 주 원산지 국가
origin_2 원두의 보조(2차) 원산지 국가 — 블렌드일 때 존재
100g_USD 원두 100g당 가격(미국 달러)
rating 평점(대체로 80~100점대)
review_date 리뷰 작성 시점(연·월)
desc_1 리뷰 텍스트 1 — 주로 향미 프로파일 묘사
desc_2 리뷰 텍스트 2 — 원두·블렌드 소개
desc_3 리뷰 텍스트 3 — 한 줄 요약

이 데이터셋에서는 크게 두 가지를 보려고 한다. 하나는 `roast`(로스팅 정도), 다른 하나는 가공 방식 관련 향미 정보인데, 이는 별도의 컬럼으로 존재하지 않고, `desc_1~3` 리뷰 텍스트 안에서 ‘washed’, ‘natural’, ‘honey’ 같은 표현으로 섞여 있어서 텍스트를 추출하는 방식으로 접근할 예정이다.

 

 

소비 단계 - [DRYAD] Consumer preference data for black coffee > cotter_dataset.csv

이 데이터셋의 컬럼 설명은 Drayd 페이지 자체에서 README.txt 파일을 다운로드 받아서 열어보면 컬럼에 대한설명이 있는데 영어이기 때문에 한국어로 바꾸는 작업을 했다.

 

더보기
  • 실험 설계 정보
    컬럼명  설명
    Judge 평가자(소비자) ID, 1~118
    Cluster 소비자 선호 세그먼트 군집 번호(1 또는 2)
    Week 실험 진행 주차(1, 2, 3주차)
    Session Number 18개 테이스팅 세션 중 번호
    Position 한 세션 내 시음 순서(1~10번째)
  • 목표 브루잉 조건
    컬럼명 설명
    Brew 목표 브루잉 조건(온도-TDS-추출률), 예: 87-1.0-16
    Temp.x 목표 브루 온도 수준(low=87℃, medium=90℃, high=93℃)
    TDS.x 목표 농도(TDS) 수준(low=1%, medium=1.25%, high=1.5%)
    PE.x 목표 추출률 수준(low=16%, medium=20%, high=24%)
    Dose 사용한 원두 양(g)
    Setting 브루어(Curtis) 장비 설정 코드
    Grind 그라인더(Mahlkönig) 분쇄도 설정값
  • 실측 추출값
    컬럼명 설명
    Empty Carafe 빈 서버(카라페) 무게(g)
    Full Carafe 커피가 담긴 후 서버 무게(g)
    Brew Mass 추출된 커피 액체의 질량(g)
    TDS__1 실제 측정된 총용존고형물(TDS, %) — 굴절계로 측정
    Percent Extraction 실제 추출률(%) — TDS와 브루 질량으로 계산
  • 화학적 측정값
    컬럼명 설명
    pH 추출된 커피의 pH
    Initial NaOH 적정 전 0.1M NaOH 부피(mL)
    Final NaOH 적정 후 0.1M NaOH 부피(mL)
    Titration pH NaOH 첨가 후 최종 pH
    Volume pH 8.2에 도달할 때까지 사용된 NaOH 부피(mL) — 적정 산도 지표
  • 온도 측정
    컬럼명 설명
    Brew Temperature 브루잉 완료 직후 서버 내 온도(℃)
    Pour Temp 종이컵에 따른 직후 온도(℃)
    90Sec Temp 따른 후 90초 뒤 온도(℃)
  • 소비자 평가 - 전반 만족도
    컬럼명 설명
    Liking 소비자의 전반적 만족도(9점 척도)
    Temp 온도 적정성 평가(JAR 척도: 1=너무 차가움 ~ 5=너무 뜨거움)
    Flavor.intensity 풍미 강도 적정성 평가(JAR 척도: 1=너무 약함 ~ 5=너무 강함)
    Acidity 산미 적정성 평가(JAR 척도: 1=너무 약함 ~ 5=너무 강함)
    Mouthfeel 마우스필(질감) 적정성 평가(JAR 척도: 1=너무 묽음 ~ 5=너무 진함)
    Purchase.intent $3 가격대 구매 의향(5점 척도: 1=전혀 안 살 것 ~ 5=꼭 살 것)
  • 소비자 평가 - 향미 노트 감지 여부 (0/1)
    컬럼명 설명
    Tea.floral 차·꽃 향 감지 여부
    Fruit 과일 향 감지 여부
    Citrus 시트러스 향 감지 여부
    Green.veg 풋내·채소 향 감지 여부
    Paper.wood 종이·나무 향 감지 여부
    Burnt 탄내 감지 여부
    Cereal 곡물 향 감지 여부
    Nutty 견과류 향 감지 여부
    Dark.chocolate 다크초콜릿 향 감지 여부
    Caramel 카라멜 향 감지 여부
    Bitter 쓴맛 감지 여부
    Astringent 떫은맛 감지 여부
    Roasted 로스팅(탄) 향 감지 여부
    Sour 신맛 감지 여부
    Thick.viscous 걸쭉함 감지 여부
    Sweet 단맛 감지 여부
    Rubber 고무 냄새 감지 여부(결점 향)

 

 

 

분석방향

  1. 비교하는 두 대상이 어떤 성격의 데이터인지 - 숫자형(연속형) vs. 범주형
  2. 그 성격에 맞는 통계 검정 방법이 무엇인지
    숫자 ↔ 숫자(상관분석): 하나가 커지면 다른 것도 같이 커지는 가에 대해서 -1 ~ 1 사이의 숫자로 확인
    범주 ↔ 숫자(t검정/ANOVA): 그룹별로 평균이 다른가에 대해서 그룹이 2개면 t-검정, 3개 이상이면 ANOVA
    범주 ↔ 범주(카이제곱검정): 두 범주가 서로 관련이 있는가에 대해서 확인
  3. 결과를 어떤 그래프로 보여줄지
    숫자 ↔ 숫자(산점도): (목적) 관계의 방향과 강도를 보는 것 점들이 우상향/우하향으로 몰려있는지만 봐도 관계가 있는지 바로 확인 가능
    범주 ↔ 숫자(박스플롯/막대그래프): (목적) 그룹별 평균 차이를 보는 것 박스플롯으로 평균, 그룹 내 값이 얼마나 퍼져 있는지까지 볼 수 있어서 얼마나 다른지 판단 가능
    범주 ↔ 범주(누적 막대그래프/히트맵): (목적) 두 범주의 조합이 얼마나 자주 나타나는지를 보는 것 비율을 쌓아 보여주는 막대그래프나 색 농도로 표현한 히트맵이 조합 빈도 차이 확인 가능

 

 

가설 비교컬럼 성격 방법
H1: 고도 ↔ 산미 `altitude_mean_meters`↔ `Acidity` 숫자 ↔ 숫자 상관분석 + 산점도
H2: 생산국/품종 ↔ 품질 `Country` / `Variety`↔ `Total.Cup.Points` 범주 ↔ 숫자 ANOVA + 박스플롯
H3: 로스팅 ↔ 가격 `roast`↔ `100g_USD` 범주 ↔ 숫자 ANOVA + 박스플롯
H3’: 가공 공정 ↔ 가격 `desc_1~3`↔ `100g_USD` 범주 ↔ 숫자 ANOVA/t-검정 + 박스플롯
H4: 로스팅 ↔ 품질 `roast`↔ `rating` 범주 ↔ 숫자 ANOVA + 박스플롯
H4’: 가공 공정 ↔ 품질 `desc_1~3`↔ `rating` 범주 ↔ 숫자 ANOVA/t-검정 + 박스플롯
H5: 산미 ↔ 소비자 선호 `Acidity`↔ `Liking` 범주(JAR: 1~5등급) ↔ 숫자 상관분석 or ANOVA + 산점도/박스플롯
H6: 전문가 vs. 소비자 두 데이터셋 비교 직접 비교 불가 각자 분포 비교 후 탐색적 서술

 

H6은 두 데이터셋이 애초에 같은 표본을 대상으로 한 게 아니라서 통계적으로 딱 떨어지게 검정하기는 어렵지만 전문가 점수 분포와 소비자 만족도 분포를 나란히 놓고 경향이 비슷한지 살펴보는 탐색적 비교로 접근할 생각이다.