smooth-app
전 세계 식품의 성분·영양·정보를 자유롭게 협업하고 공개하는 데이터베이스
짧고 솔직한 빅 파이브 성격 검사
A short, honest Big Five personality test. 20–50 public-domain questions, a model trained on hundreds of thousands of real responses, and five percentiles with their margins of error. Runs entirely in
건강TypeScript · PythonGitHub @haaj-1온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Big Five personality test that shows its work: short-form IPIP model trained on 597k responses, per-trait percentiles with error bands, runs entirely in the browser.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Fivefold: a Big Five personality test that shows its work
A short Big Five (OCEAN) personality test that runs entirely in your browser. You answer 20, 30 or all 50 public-domain IPIP statements. For each of the five traits you get a percentile against hundreds of thousands of real respondents, an honest error band, and the answers that moved each score.
Built with Next.js (static export), TypeScript and Tailwind. The model is trained in Python (ml/) and shipped as a JSON file of about 200 KB (about 65 KB gzipped).README 전문 보기 ↗A short Big Five (OCEAN) personality test that runs entirely in your browser. You answer 20, 30 or all 50 public-domain IPIP statements. For each of the five traits you get a percentile against hundreds of thousands of real respondents, an honest error band, and the answers that moved each score.
Live: https://personality-trait-predictor.vercel.app
Built with Next.js (static export), TypeScript and Tailwind. The model is trained in Python (ml/) and shipped as a JSON file of about 200 KB (about 65 KB gzipped).
The model is trained on the Open Psychometrics IPIP-FFM dataset: about 1M anonymous online responses (2016-2018) to the 50-item IPIP Big Five markers. Cleaning steps:
| Step | Removed | Remaining |
|---|---|---|
| Raw | 1,015,341 | |
One submission per IP (IPC == 1) | 318,496 | 696,845 |
| No missing answers | 93,523 | 603,322 |
| Not a straight-liner (all 50 identical) | 731 | 602,591 |
| Completion time 50 s to 1 h | 5,491 | 597,100 |
The clean rows are split at random: 477,680 for training and 119,420 held out for testing.
Standard IPIP scoring. Each trait is the mean of its 10 keyed items on a 1-5 scale, and a reverse-keyed item counts as 6 - x. Traits are reported in this order: Extraversion, Neuroticism, Agreeableness, Conscientiousness, Openness.
The model predicts your full 50-item scores from fewer answers.
stages[k-1].traits[t].band). A single pooled ±1 RMSE band was the wrong width near the ends of the scale: scores cannot exceed 5, and on skewed traits a fixed score band spans far more percentiles at the top than at the bottom. On the test split the conditional band covers 68% of people for every trait and length (target 68%).ml/reports/evaluation.md → "Result wording" has the table.model.json → . Results also need at least 10 answers; shorter links ask the person to continue the test.Each trait is reported on its own scale, as a percentile against the training split's full-scale scores (1,001 stored quantiles, linear interpolation). The trait shown as "most distinctive" is the one furthest from the 50th percentile, not the one with the largest raw number.
Mean R² across the five traits, predicting the full 50-item score:
| Model | k=10 | k=20 | k=25 | k=30 | k=40 |
|---|---|---|---|---|---|
| Linear (shipped) | 0.754 | 0.883 | 0.917 | 0.942 | 0.978 |
| LightGBM | 0.758 | 0.886 | 0.919 | 0.943 | 0.977 |
| Small MLP | 0.757 | 0.885 | 0.918 | 0.942 | 0.978 |
| Prorated baseline (score only answered items) | 0.506 | 0.800 | 0.863 | 0.895 | 0.967 |
The full report, with per-trait R², RMSE, MAE and Pearson r, the confusion matrix and plots, is in ml/reports/evaluation.md. The same numbers appear on the site's /method page, generated from the shipped model.json.
The first version (a Streamlit app with five CatBoost models) told nearly everyone they had the same "dominant" trait. The original bug report named Agreeableness. A faithful replay of the committed code on 5,000 held-out respondents gave Openness for 88.9% and Agreeableness for 9.5%. Its top trait matched the person's real top trait only 12% of the time, worse than chance (20%). Several bugs combined to cause this:
v2 replaces all of this: correct scoring, one linear model per test length, a separate percentile for each trait, and the bias check above.
Requires Node 20.9+ (developed on Node 24).
npm install
npm run dev # http://localhost:3000
npm run build # static export to out/
npm start # serve out/ locally
| Command | What it does |
|---|---|
npm run lint | ESLint |
npm run typecheck | tsc --noEmit |
npm test | Vitest unit tests: inference, parity with Python, share links, export |
npm run test:e2e | Playwright end-to-end tests against the static build (desktop 1440 px and mobile 375 px) |
npm run sync-model | Validate ml/artifacts/model.json, copy it to src/data/model.json and regenerate src/data/model.runtime.json (also regenerated before every build) |
npm run og-image | Regenerate the Open Graph image and touch icon |
Layout:
src/lib/model.ts pure inference (predict, percentiles, contributions)
src/data/model.json the trained model (copied from ml/artifacts)
src/data/model.runtime.json slim slice of it for /test (order, statements, per-k error); generated
src/data/content.ts trait descriptions and citations
src/app/ /, /test, /results, /method
ml/ training pipeline, tests and reports (not deployed)
ml/)python -m venv .venv && . .venv/bin/activate
pip install -r ml/requirements.txt
python ml/pipeline.py --data path/to/data-final.csv --out ml/artifacts --reports ml/reports --seed 42
npm run sync-model
If --data doesn't exist, the pipeline downloads the dataset. The dataset is never committed. A full run takes about 7-8 minutes on a laptop and is deterministic for a given seed. Use --sample 50000 for a quick run. The pipeline writes ml/artifacts/model.json, ml/artifacts/parity_cases.json (30 reference predictions, with their bands and wording, that the TypeScript code must reproduce) and ml/reports/evaluation.md.
model.json follows the contract in SPEC.md, plus optional extras the web app reads when present: per-stage conditional bands, responseStyle, and in evaluation the per-length byK and strength tables, traitCorrelation and shrinkage.
python -m pytest -q ml/tests # scoring, cleaning, model contract, sanity profiles, parity cases
PTP_DATA=path/to/data-final.csv python -m pytest -q ml/tests/test_heldout.py # re-checks wording and band coverage on the held-out split
npx vitest run # TS inference + parity with Python (scores within 1e-6, percentiles within 1e-4)
npx playwright test # full test flow, results, share links, /method, no horizontal scroll at 375 px
Everything runs in your browser. Answers are never sent anywhere. There is no server, no analytics and no cookies. A share link carries your answers in the URL fragment (#…), which browsers do not send to the server.
This is a self-report personality description, not a clinical or hiring tool.
responseStylecoef × (answer − population mean answer).