묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
모델링 및 평가(분류) 질문! 왜 수치형 데이터만 활용하는가?
모델링 및 평가(분류) 강의에서 X_train 데이터의 15개의 칼럼 데이터 중 일부 수치 데이터만 활용하여 머신러닝에 사용하는데, 모든 데이터를 다 활용하지 않는 이유가 있을까요?만약 모든 데이터를 다 활용한다면 roc_auc_score의 변화는 어떻게 되나요?
-
미해결실무자를 위한 구글애널리틱스(GA4+GTM) 활용법(25년 Update)
측정항목 비활성화
GA-탐색-유입경로 탐색 분석 시 측정항목이 비활성화되어있습니다.항목들을 활성화하려면 어떻게 해야 하나요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
한 엔티티에 같은 JoinColumn name이 있을경우 어떻게 처리하는지 궁금합니다.
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User createUser; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User lastModifyUser;DB 한 테이블에 글 등록 유저 정보와 마지막 수정 유저 정보를 넣도록 설계했는데 아래와 같이 안되면 이럴때는 보통 설계를 어떻게 하나요??Caused by: org.hibernate.MappingException: Column 'user_id' is duplicated in mapping for entity 'study.factory.domain.Order' (use '@Column(insertable=false, updatable=false)' when mapping multiple properties to the same column)
-
미해결홍정모의 따라하며 배우는 C언어
mingw-w64 수동설치
mingw-w64설치가 안되서 sourceforge 에서 다시다운받았는데 파일이 .zip으로 되어있습니다. 어떻게 하면될까요?
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
원핫인코딩 데이터 합치기
피처 엔지니어링 강의 중 분리한 데이터 다시 합침 부분에서 강의영상과 출력값이 달라서 질문드립니다. 강의화면에서는 107 컬럼, 103컬럼인데요, 같은 코드 결과인데 컬럼수가 15개로 나온이유가 궁금합니다.
-
미해결쉬운 용어로 배우는 Git & Github 첫걸음 - 협업까지 마스터하기
브랜치는 한 파일 당 하나만 가능한가요?
안녕하세요 수업 잘 듣고있습니다응용 실습을 하는데 오류가 나서 질문드려요 main에서 두 브랜치를 생성해봤어요하나 먼저 pull request했을 땐 정상적으로 merge pull request가 떴어요그리고 이후에 같은 파일을 수정한 새로운 브랜드를 push하고 pull request 하려고 했는데 This branch has conflicts that must be resolved라는 문구와 함께 merge에 실패했어요한 파일 당 하나의 브랜치만 관여가 가능한걸까요?
-
미해결RAG를 활용한 LLM Application 개발 (feat. LangChain)
두가지 이상 문서를 넣고 싶을때는 어떻게 하나요?
안녕하세요~ 지난번에 gemini로 한다고 고전한다고 질문글을 남겼던 학생입니다. 그냥 openai로 다시 시작하니 실크로드마냥 뻥 뚫리더라고요.....기억나실지는 모르겠지만 지지난번에 남겼던 .env 문제도 해결했습니다. vscode에서도 그냥.env로 파일명 만들면 만들어지더라고요. 전엔 해당 확장자로 안 됐는데 어느순간 되는것이 이유를 모르겠습니다만... 아무튼 네 됐습니다. 그런데 (어쩌면 수업 외적인) 질문이 있는데요.만약에 제가 chatbot에 2개 이상의 문서를 넣고 싶으면 어떻게 해야되나요? 가령 소비자 보호법과 세법을 넣는다고하면 소비자보호법 관련 문서에는 이게 소비자 보호법이라는게 명시가 안 되어 있고, 세법 문서에는 해당 내용이 세법이라는 것에 대해 명시가 되어 있지 않아 1) 단순히 두 word파일을 하나의 파일로 합치면 혼란이 올 것 같은데, 2) 안 합치고 따로 하자니 일단 그 방법도 모르거니와 각각 넣는 게 파일명 말고는 1번과 무슨 차이인지도 모르겠어서 선생님께 질문을 드립니다. 비슷한 상황으로 다른 예시를 들어드리자면 , 가령 대출 관련 챗봇을 만드려고 할 때, 신용 대출에 대한 문서가 신용 대출 << 언급이 안되어 있는 아래와 같은 상황이고 [직장인 대출]금리 10%조건 : 1년이상 재직자대출한도: 만원[직장인 대출2]금리 9%조건 : 3년이상 재직자대출한도: 2만원[CSS 대출] 금리 11%조건 : 20세이상 30세 미만 대출한도: 3만원 그리고 주택 담보 대출은 아래와 같을 때, (= 대출 내용은 다르지만 대출을 받을 수 있는 컨디션은 똑같을 때)[a아파트 대출]금리 10%조건 : 1년이상 재직자대출한도: 50만원[주택 대출]금리 9%조건 : 3년이상 재직자대출한도: 60만원[버팀목 대출] 금리 11%조건 : 20세이상 30세 미만 대출한도: 70만원 이 상황에서 만약에 주택담보대출을 알아보고 있으면 굳이 신용대출까지 조회를 안 해도 되잖아요. 이런 상황은 어떻게 거르죠? 참고로 직장인 대출 <- 신용이라는 키워드로 거를수가 없습니다. 강의에서 알려주신 대로 데이터 사전이나 프롬포트를 이용해 처리하는 방법밖엔 없을까요? (생각나는 상황이 이런거인데 사실 대출을 잘몰라서 ;; 제 질문이 잘 전달됐는지 모르겠네요..) 아무튼 긴 글 읽어주셔서 다시 한 번 감사합니다.
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
피처 엔지니어링 원핫인코딩 Train/Test 컬럼 불일치
범주형 변수에 get.dummies를 이용하여 원핫인코딩 하는 작업 중 질문이 있습니다.train 데이터셋과 test 데이터셋의 컬럼수가99개와 95개로 다릅니다.(다른 이유는 train 데이터셋과 test 데이터셋의 컬럼 중에 관측치가 다른 항목이 있기 때문이라고 하셨는데요,그런 이유라면 다른 것이 정상인가요?) 그런데 영상에서는 100개로 나옵니다,,강의 100개 vs 99개 컬럼 갯수가 다른 이유는 무엇일까요? 아래는 코드와 출력값 첨부드립니다.# 원핫 인코딩 n_train, n_test, c_train, c_test = get_nc_data() # 데이터 새로 불러오기 c_train = pd.get_dummies(c_train[cols]) c_test = pd.get_dummies(c_test[cols]) display(c_train.head()) display(c_test.head()) print(c_train.shape) print(c_test.shape)
-
미해결이득우의 언리얼 프로그래밍 Part1 - 언리얼 C++의 이해
init()에서 LoadStudentObject() 이 함수가 런타임 정적로딩이라고 보면 되나요?
void UMyGameInstance::LoadStudentObject() const 이 함수가 에셋의 로딩전략중2번째에 해당하는 런타임 로직에서 정적로딩을 하는게맞나요?21:54 로딩전략의 각각의 차이점이 잘 감이 오질않는데요 런타임로직에서 정적로딩을 한다는것은 에셋 크기가 클수록 부하가 엄청 커지겟지만작은에셋들을 바로 로딩할때 간편하게 쓰기위함이고 생성자 코드에서 미리 로딩을한다면프로젝트가 켜지는 속도는 느리겠지만에셋을 사용할땐 빠르겠고 관리자를 사용해 비동기로딩이라는것은게임이 진행되는 와중에 당장은 에셋을 쓰진않지만언젠간 쓸 에셋들을 계속해서 꾸준히 싱글턴클래스에서로딩을 한다는건가요?
-
미해결홍정모의 따라하며 배우는 C++
예외 클래스 상속 관련 다른 예제 코드 확인 부탁 드립니다.
교수님의 강의를 보고 선 정리를 하는 과정에서 chat gpt를 이용해서 새로운 예제를 같이 공부하고 있습니다. 교수님의 코드에서는 ArrayException 객체를 throw하는 과정에서 메모리 문제가 발생하지 않고 부모 객체로 catch하여ObjectSilce 문제를 확인을 할 수 있었는데요.chat gpt가 알려준 예제(예제 클래스 상속으로 인한 Object Slice 문제)#include <iostream> #include <string> // 사용자 정의 예외의 기본 클래스 class Exception { public: explicit Exception(const std::string& message) : message_(message) {} // 가상 소멸자 추가 virtual ~Exception() {} // 예외 메시지를 반환하는 가상 함수 virtual const char* what() const noexcept { return message_.c_str(); } private: std::string message_; }; // Exception을 상속받은 커스텀 예외 클래스 class CustomException : public Exception { public: explicit CustomException(const std::string& message, int errorCode) : Exception(message), errorCode_(errorCode) {} // CustomException에만 있는 멤버 함수 int getErrorCode() const { return errorCode_; } private: int errorCode_; }; void throwException() { // CustomException 객체를 값으로 던짐 (복사본이 던져짐) CustomException ex("CustomException occurred", 404); throw ex; // 함수 종료 시 스택에서 삭제될 객체의 복사본이 던져짐 } int main() { try { throwException(); } catch (Exception& e) { // Exception을 값으로 잡음 -> 객체 잘림 발생 std::cout << e.what() << std::endl; // 파생 클래스의 멤버 접근 시도 try { CustomException& ce = dynamic_cast<CustomException&>(e); std::cout << "Error code: " << ce.getErrorCode() << std::endl; } catch (std::bad_cast&) { // 객체 잘림으로 인해 CustomException으로 캐스팅 실패 std::cout << "Caught bad_cast: Object slicing occurred, cannot cast to CustomException." << std::endl; } } return 0; }위 코드를 실행 시켰을때 예외 클래스를 throw 해줄 때 '메모리 문제'가 발생 하더라구요. 그리고 부모 클래스로 catch를 하지 못했습니다.그래서 저는 교수님 코드와 다른게 뭘까 하고 생각해 보다가 예외클래스 객체의 생성주기의 문제라고 생각해서 gpt와 대화(?)를 해보았고 생성주기 부분을 수정해 주니 정상적으로 작동하였습니다.아래의 예제 코드처럼 동적 할당으로 예외 클래스를 만들어주는게 무겁지 않을까 생각이 듭니다.혹시 저 위 코드에서 메모리 문제를 해결하는 방법이 동적 할당 밖에 없는지 궁금합니다.예외 클래스를 동적 할당으로 생성하여 throw해준 예제 코드#include <iostream> #include <string> // 사용자 정의 예외의 기본 클래스 class Exception { public: explicit Exception(const std::string& message) : message_(message) {} // 가상 소멸자를 추가해 다형성 지원 virtual ~Exception() {} // 예외 메시지를 반환하는 가상 함수 virtual const char* what() const noexcept { return message_.c_str(); } private: std::string message_; }; // Exception을 상속받은 커스텀 예외 클래스 class CustomException : public Exception { public: explicit CustomException(const std::string& message, int errorCode) : Exception(message), errorCode_(errorCode) {} // CustomException에만 있는 멤버 함수 int getErrorCode() const { return errorCode_; } private: int errorCode_; }; void throwException() { // 예외 객체를 동적으로 생성하여 포인터로 던짐 (메모리 관리 필요) throw new CustomException("CustomException occurred", 404); } int main2() { try { throwException(); } // 포인터로 던진 예외를 잡음 catch (Exception* e) { std::cout << e->what() << std::endl; // 파생 클래스로 dynamic_cast하여 멤버 접근 시도 if (CustomException* ce = dynamic_cast<CustomException*>(e)) { std::cout << "Error code: " << ce->getErrorCode() << std::endl; } else { std::cout << "Caught base Exception, cannot cast to CustomException." << std::endl; } // 동적으로 할당한 예외 객체 해제 delete e; } return 0; }
-
미해결스프링부트 시큐리티 & JWT 강의
password 비교를 하지 않았는데 어떻게 인증이 통과된 건가요?
안녕하세요!스프링 시큐리티 다양한 분들 강의를 봤는데 이렇게 핵심만 요약해서 알려주시는 강의는 없었던 것 같습니다. attemptAuthentication 에서 authRequestToken으로 loadUserByUsername 를 호출 후 password 를 비교하는 로직이 없는데 어떻게 successfulAuthentication 으로 넘어가는지 이해가 안됩니다. 어느 시점에 password 를 비교하는지 궁금합니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
frontcontroller 질문 있습니다.
안녕하세요서블릿은 멀티스레드 환경에서 동작하기 때문에 멤버 변수를 사용하면 동시성 문제가 생길 수 있다고 알고 있습니다.frontcontroller도 서블릿인데 멤버 변수를 사용한 것은 handlerMappingMap과 handlerAdapters가 서블릿 생성 시 한 번 초기화되고 이후에는 put과 같이 값을 쓰는 동작은 없고 get처럼 매핑 정보를 읽어오는 동작만 하기 때문인건가요??
-
미해결그림으로 배우는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
8.6 강의 중 sysnet4admin/chk-info 이미지 bash 이슈
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요]3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요](https://www.inflearn.com/blogs/1719)4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. (https://www.inflearn.com/questions/992407/comment/281901)[질문 하기]안녕하세요. 어제 tardy-nginx 이미지와 같은 이슈인것 같은데요.sysnet4admin/chk-info 이미지도 bash가 없습니다.$ k exec deploy-podselector-int-only-78f84d76f6-mdks5 -it -- /bin/bash error: Internal error occurred: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "87fc9a16c37309940a9369f3128784a6beaba14bf2781064500b8876ad3653ca": OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown *일단은 /bin/sh 로 접속해 nc 명령어로 통신 확인만 했습니다.
-
미해결스프링 핵심 원리 - 기본편
스프링관련 로그가 뜨지않습니다
강의에서는 스프링관련 로그 (Bean)들이 뜨던데저는 뜨지않습니다 뭐가 잘못된 걸까요?? 물론 코드는 오류없이 동작합니다
-
미해결[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
train과 test의 카테고리가 동일하지않은경우에도 똑같이 통용되는 코드인가요?
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요먼저 유사한 질문이 있었는지 검색해보세요
-
미해결
three.js에 json파일의 데이터를 보이게 하려면
let imageInfo = {}; fetch('/img.json') .then(response => response.json()) .then(data => { imageInfo = data.images.reduce((acc, img) => { acc[img.id] = img; return acc; }, {}); fetchAndBuildInfo(); console.log(imageInfo); }) .catch(error => console.error('Error loading img.json:', error)); const fetchAndBuildInfo = async () => { await fetch('/uploaded-images', { method: 'GET' }) .then(response => { if (!response.ok) { throw new Error('Failed to fetch images'); } return response.json(); }) .then(data => { const { fileUrls } = data; if (!Array.isArray(fileUrls)) { throw new Error('Response does not contain an array of image URLs'); } fileUrls.forEach((fileUrl, i) => { const frame = new MeshObject({ scene, cannonWorld, cannonMaterial: defaultCannonMaterial, mass: 0, // 중력 영향을 받지 않음 loader: textureLoader, name: `frame_${i}`, width: frameWidth, height: frameHeight, depth: frameDepth, x: i * frameSpacing - ((fileUrls.length - 1) * frameSpacing) / 2, y: 1.5, z: -9.9, mapSrc: fileUrl }); if (frame.cannonBody) { frame.cannonBody.type = CANNON.Body.STATIC; // 고정 } const id = fileUrl.split('/').pop(); const info = imageInfo[id]; console.log(`${imageInfo} : ${id} : ${info}`) if (info) { createInfoBox(info, frame); } else console.log("no info"); cannonObjects.push(frame); }); }) .catch(error => { console.error('Error fetching images:', error); }); } three.js를 이용해서 전시회 공간을 만들어보고 있습니다. 앞선 페이지에서 img에 대한 정보를 img.json파일에 저장하면 이를 three.js캔버스 공간에 불러와서 보이게 하고 싶은데 어떤 방법을 써야할까요? 현재 업로드된 파일 개수만큼 액자가 자동생성되게 해놓았는데 이 프레임을 클릭하거나 커서를 갖다대면 그림에 대한 information이 뜨게 하고 싶어요...ㅠㅠㅠ 계속 여기서 헤매고 있습니다.
-
미해결BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[인프런 빅쿼리 빠짝스터디 3주차] 리텐션 분석
✅ 연습문제 (1) weekly retention--1) weekly retention WITH base AS ( -- 날짜 데이터 전처리 -- DATE도 실제 날짜와 일치하지 않을 수 있으니, 다시 확인하기 -- DATETIME(TIMESTAMP_MICROS(timestamp데이터),'대륙/국가') 기억하고 사용하기 SELECT DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date, event_name, user_pseudo_id FROM `bigquery-432401.avdanced.app_logs_temp` ) -- 일자 간 차이 구하기 , cal_week AS ( SELECT DISTINCT user_pseudo_id, -- 최초일(week 단위로) 구하기 DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, -- 원본 날짜 데이터에서 주차 데이터로 구하기 DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ), cal_diff AS ( -- 주차데이터간 차이 구하기 SELECT *, DATE_DIFF(event_week, first_week,WEEK) AS diff_week FROM cal_week ), user_count AS ( -- 주차별 user 수 구하기 SELECT diff_week, COUNT(distinct user_pseudo_id) as user_cnt FROM cal_diff GROUP BY diff_week ) -- 출력 SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt),2) AS retention_rate FROM ( SELECT diff_week, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_week) AS first_week_user_cnt FROM user_count ) 아직 익숙하지 않아서 중간중간 다시 코드 보고 작성했다. 점점 더 익숙해지길! (2) Retain UserWITH base AS ( -- 날짜 데이터 전처리 -- DATE도 실제 날짜와 일치하지 않을 수 있으니, 다시 확인하기 -- DATETIME(TIMESTAMP_MICROS(timestamp데이터),'대륙/국가') 기억하고 사용하기 SELECT DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date, event_name, user_pseudo_id FROM `bigquery-432401.avdanced.app_logs_temp` WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ) , cal_diff AS ( -- 날짜데이터 간 차이 구하기 SELECT *, DATE_DIFF("2022-11-03", event_date,DAY) AS diff_date FROM base ), user_type AS ( -- user type 구하기 -- 0. 해당없음 -- 1. new : 첫번째 접속 --2. current : 최근 30일내에 접속 -- 3. resurrected : 30일 이상 활동이 없고, 최근 7일 이내 다시 접속한 사용자 -- 4. dormant : 최근 60일 간 접속기록 없음 SELECT *, CASE -- 첫 번째 접속 => 'new' WHEN diff_date = FIRST_VALUE(diff_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date) THEN 'new' -- 최근 30일 내에 접속한 사용자 => 'current' WHEN diff_date <= 30 THEN 'current' -- 30일 이상 활동이 없고, 최근 7일 이내 다시 접속한 사용자 => 'resurrected' WHEN diff_date > 30 AND diff_date <= 37 THEN 'resurrected' -- 60일 이상 접속하지 않은 사용자 => 'dormant' WHEN diff_date > 60 THEN 'dormant' ELSE 'none' END AS type FROM cal_diff GROUP BY all ORDER BY user_pseudo_id,diff_date ) SELECT * FROM user_type나름 user를 나눈다고 나눴는데, 잘 못 나눠진 느낌이 든다! 현업에는 어떻게 나눌지 궁금하다(3) 어떤 user가 많은가?WITH base AS ( -- 날짜 데이터 전처리 SELECT DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date, event_name, user_pseudo_id FROM `bigquery-432401.avdanced.app_logs_temp` WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), cal_diff AS ( -- 날짜데이터 간 차이 구하기 SELECT *, DATE_DIFF("2022-11-03", event_date, DAY) AS diff_date FROM base ), user_type AS ( -- user type 구하기 SELECT distinct user_pseudo_id, CASE WHEN diff_date = FIRST_VALUE(diff_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date) THEN 'new' WHEN diff_date <= 30 THEN 'current' WHEN diff_date > 30 AND diff_date <= 37 THEN 'resurrected' WHEN diff_date > 60 THEN 'dormant' ELSE 'none' END AS type FROM cal_diff ), cal_cnt AS ( -- 각 type별 사용자 수 계산 SELECT type, COUNT(user_pseudo_id) AS user_cnt FROM user_type GROUP BY type ) SELECT type, user_cnt, ROUND(user_cnt * 100.0 / (SELECT COUNT(*) FROM user_type), 2) AS ratio FROM cal_cnt ORDER BY ratio DESC new인 사용자가 69.87 %로 전체의 대다수를 차지한다. 그다음이 최근에 7일 내에 접속한 유저가 21.83%, resurrected : 30일 이상 활동이 없고, 최근 7일 이내 다시 접속한 사용자가 2.59%, 최근 60일 간 접속기록 없는 사용자가 1.25%를 차지하였다.2022-11-03일 기준 "2022-08-01" 에서 "2022-11-03" 기간 동안 서비스를 이용하는 대다수의 사람들은 신규 가입자들이 많다는 것을 알 수 있다.또한, current User가 많은 것으로 보아, 최근 7일이내에 서비스를 사용한 사람들의 비율이 두번째로 높다.현재 신규이용자의 수가 대다수를 차지함으로 이 신규 사용자를 current user로 전환하기 위한 전략을 고안해야 할 것으로 보인다.none이 resurrected, dormant보다 많은데, type을 나누는 기준을 수정하면 더 효율적이게 나눌 수 있지 않을까 생각된다.(4) core event를 click_payment로 놓았을 때 Weekly retentionWITH base AS ( SELECT event_name, user_pseudo_id, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_time FROM `bigquery-432401.avdanced.app_logs_temp` WHERE event_name = "click_payment" ), week_diff AS ( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), user_counts AS ( SELECT diff, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM week_diff GROUP BY diff ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt), 2) AS retention_rate FROM ( SELECT diff, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff ASC) AS first_week_user_cnt FROM user_counts )1주차 이후로 사용자의 수가 급감. 2주차 부터는 계속 0.01을 유지. 15주차부터 24주차까지는 0 retention rate를 유지.사용자가 1주차 이후로 대거 이탈함을 볼 수 있음. 15주차부터 0.01에서 0.0으로 감소. 1주차에 이벤트 혹은 서비스 런칭으로 사용자수가 급격히 증가하였으나, 서비스 경험이 사용자에게 매력적으로 다가오지 못하여 바로 그 다음주부터 급격하게 감소하는 것을 볼 수 있음.따라서, core_event에 대한 근본적인 개선이 필요할 것으로 보임. ✅ 배운점 및 느낀점 리텐션 분석에 대한 전반적인 지식을 얻을 수 있었다. 아직, 데이터에서 리텐션 분석을 하는 것이 익숙치 않아 학습을 더 해야 할 것 같다. user type을 나누는 부분에서 더 짜임새 있는? 기준이 뭔지, 현업에서는 어떤 기준으로 사용자를 나누는지 궁금하다!고객을 분석하기 위해서는 어떤 부분을 더 봐야하는 지 아직 크게 감이 없는데, 다른 레퍼런스를 보는 것이 필요할 것 같다는 생각이 들었다
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
엑셀의 2행에서 7행의 데이터를 다루는데 for row in range(2, 8): 으로 해야하는 이유는?
2-4. [응용] 엑셀문서 값을 필드에 입력하기 관련입니다. 강의 내용 중 for문 안에 ws.Range를 넣어, 엑셀문서의 모든 행을 출력해보는 내용이 있습니다.여기서 다루는 엑셀의 데이터는 아래와 같습니다. 여기서 다루는 범위는 2행(마크, 남 ...)부터 7행(슬아, 여, ...)이므로,for row in range(2,7):이라고 해야 맞는 게 아닌가 싶은데,for row in range(2,7):로 해보면 아래와 같이 원하는 결과가 아닙니다.실제 7행인 ['리사', '여', '1969년 11월 7일', '게임'] 가 빠진 결과가 나옵니다.for row in range(2,7): data = list( ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0] ) data[2] = data[2].strftime("%Y년 %#m월 %#d일") print(data) ['마크', '남', '1984년 5월 14일', 'VR'] ['빌', '남', '1955년 10월 28일', '기부'] ['일론', '남', '1971년 6월 28일', '트위터'] ['제프', '남', '1964년 1월 12일', '독서'] ['리사', '여', '1969년 11월 7일', '게임'] 반면에,for row in range(2,8):이라고 해야만 아래와 같이 엑셀의 2행부터 7행의 데이터가 원하는대로 출력이 됩니다.for row in range(2,8): data = list( ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0] ) data[2] = data[2].strftime("%Y년 %#m월 %#d일") print(data) ['마크', '남', '1984년 5월 14일', 'VR'] ['빌', '남', '1955년 10월 28일', '기부'] ['일론', '남', '1971년 6월 28일', '트위터'] ['제프', '남', '1964년 1월 12일', '독서'] ['리사', '여', '1969년 11월 7일', '게임'] ['슬아', '여', '1983년 6월 16일', '쇼핑'] 2행부터 7행의 데이터를 출력하는데 왜for row in range(2,8): 로 하는 것이 맞는 것인지 궁금합니다.
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
12.11 invalid Date 오류
따라서 하고 있었는데 다음 그림과 같이 invalid Date 라는 값이 떠서 관련 질문 드립니다. 강의 몇번 돌려보면서 오타가 있나 봤는데 도저히 모르겠어서 질문 드립니다...// App.jsx import "./App.css"; import { Routes, Route, Link, useNavigate } from "react-router-dom"; import Home from "./pages/Home"; import Diary from "./pages/Diary"; import New from "./pages/New"; import Edit from "./pages/Edit"; import Notfound from "./pages/Notfound"; import { useReducer, useRef, createContext } from "react"; const mockData = [ { id: 1, createdDate: new Date("2024-11-13").getTime(), emotionId: 1, content: "1번 일기 내용", }, { id: 2, createdDate: new Date("2024-11-10").getTime(), emotionId: 2, content: "2번 일기 내용", }, { id: 3, createdDate: new Date("2024-10-11").getTime(), emotionId: 3, content: "3번 일기 내용", }, ]; function reducer(state, action) { switch (action.type) { case "CREATE": return [action.data, ...state]; case "UPDATE": return state.map((item) => String(item.id) === String(action.data.id) ? action.date : item ); case "DELETE": return state.filter((item) => String(item.id) !== String(action.id)); default: return state; } } export const DiaryStateContext = createContext(); export const DiaryDispatchContext = createContext(); function App() { const [data, dispatch] = useReducer(reducer, mockData); const idRef = useRef(3); const onCreate = (createdDate, emotionId, content) => { dispatch({ type: "CREATE", data: { id: idRef.current++, createdDate, emotionId, content, }, }); }; const onUpdate = (id, createdDate, emotionId, content) => { dispatch({ type: "UPDATE", data: { id, createdDate, emotionId, content, }, }); }; const onDelete = (id) => { dispatch({ type: "DELETE", id, }); }; return ( <> <DiaryStateContext.Provider value={data}> <DiaryDispatchContext.Provider value={{ onCreate, onDelete, onUpdate }}> <Routes> <Route path="/" element={<Home />} /> <Route path="/new" element={<New />} /> <Route path="/diary/:id" element={<Diary />} /> <Route path="/edit/:id" element={<Edit />} /> <Route path="*" element={<Notfound />} /> </Routes> </DiaryDispatchContext.Provider> </DiaryStateContext.Provider> </> ); } export default App; //Home.jsx import { useState, useContext } from "react"; import { DiaryStateContext } from "../App"; import DiaryList from "../components/DiaryList"; import Header from "../components/Header"; import Button from "../components/button"; const getMonthlyData = (pivotDate, data) => { const beginTime = new Date( pivotDate.getFullYear(), pivotDate.getMonth(), 1, 0, 0, 0 ).getTime(); const endTime = new Date( pivotDate.getFullYear(), pivotDate.getMonth() + 1, 0, 23, 59, 59 ).getTime(); return data.filter( (item) => beginTime <= item.createdDate && item.createdDate <= endTime ); }; const Home = () => { const data = useContext(DiaryStateContext); const [pivotDate, setPivotDate] = useState(new Date()); const monthlyData = getMonthlyData(pivotDate, data); console.log(monthlyData); const onIncreaseMonth = () => { setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() + 1)); }; const onDecreaseMonth = () => { setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() - 1)); }; return ( <div> <Header title={`${pivotDate.getFullYear()}년 ${pivotDate.getMonth() + 1}월`} leftChild={<Button onClick={onDecreaseMonth} text={"<"} />} rightChild={<Button onClick={onIncreaseMonth} text={">"} />} /> <DiaryList data={monthlyData} /> </div> ); }; export default Home; //diaryList.jsx import Button from "./button"; import "./DiaryList.css"; import DiaryItem from "./DiaryItem"; const DiaryList = ({ data }) => { return ( <div className="DiaryList"> <div className="menu_bar"> <select> <option value={"latest"}>최신순</option> <option value={"oldest"}>오래된 순</option> </select> <Button text={"새 일기 쓰기"} type={"POSITIVE"} /> </div> <div className="list_wrapper"> {data.map((item) => ( <DiaryItem key={item.id} {...item} /> ))} </div> </div> ); }; export default DiaryList; //DiaryItem.jsx import { getEmotionImage } from "../util/get-emotion-image"; import Button from "./button"; import "./DiaryItem.css"; const DiaryItem = (id, emotionId, createdDate, content) => { return ( <div className="DiaryItem"> <div className={`img_section img_section_${emotionId}`}> <img src={getEmotionImage(1)} /> </div> <div className="info_seciton"> <div className="created_date"> {new Date(createdDate).toLocaleDateString()} </div> <div className="content">{content}</div> </div> <div className="button_section"> <Button text={"수정하기"} /> </div> </div> ); }; export default DiaryItem;
-
미해결
견적서 문의
안녕하세요수강을 희망하는 학생입니다. 제가 연구실 소속이라 강의를 결제하려면 견적서가 필요한데"문의하기"란이 안보여 글 남깁니다."한국에서 제일 쉬운 리눅스 커널 강의"강의 견적서를 받을 수 있을까요?강의 주소남깁니다.https://www.inflearn.com/course/%ED%95%9C%EA%B5%AD%EC%97%90%EC%84%9C-%EC%A0%9C%EC%9D%BC%EC%89%AC%EC%9A%B4-%EB%A6%AC%EB%88%85%EC%8A%A4%EC%BB%A4%EB%84%90-%EA%B0%95%EC%9D%98