python-for-data-analysis

2024. 1. 20. 20:12python/intermediate

데이터 분석을 위한 Python 사용

데이터 분석은 원시 데이터 내에 존재할 수 있는 통찰력과 관계를 밝힐 수 있는 광범위한 기술을 포괄하는 광범위한 용어입니다. 예상할 수 있듯이 Python은 데이터 분석에 가장 쉽게 적합한 언어입니다. Python이 데이터를 분석하고 나면 결과를 사용하여 올바른 비즈니스 결정을 내리고, 절차를 개선하고, 발견한 내용을 바탕으로 정보에 입각한 예측을 내릴 수도 있습니다.
시작하기 전에 널리 사용되는 데이터 분석 도구인 Jupyter Notebook에 대해 숙지해야 합니다. 또는 JupyterLab에서 향상된 노트북 환경을 제공할 것입니다. pandas DataFrame이 데이터를 저장하는 방법을 배우고 싶을 수도 있습니다. DataFrame과 pandas Series의 차이점을 아는 것도 유용할 것입니다. .

여기에서는 jamesbond.csv이라는 파일을 사용합니다. 이는 무료 James Bond 영화 데이터세트의 수정된 버전입니다. jamesbond.csv 파일에는 이 튜토리얼에 적합하도록 변경된 일부 레코드와 함께 원본 데이터의 하위 집합이 포함되어 있습니다. 다운받는 곳 : https://www.kaggle.com/datasets/dreb87/jamesbond/data

데이터 분석 워크플로우의 필요성 이해

데이터 분석은 매우 인기 있는 분야이며 다양한 복잡성을 지닌 다양한 작업을 수행하는 데 포함될 수 있습니다. 수행하는 특정 분석 단계는 분석 중인 데이터세트와 수집하려는 정보에 따라 달라집니다. 이러한 범위 및 복잡성 문제를 극복하려면 분석을 수행할 때 전략적 접근 방식을 취해야 합니다. 여기에서 데이터 분석 워크플로가 도움이 될 수 있습니다.

데이터 분석 워크플로우는 분석 팀이 데이터를 분석할 때 따라야 할 일련의 단계를 제공하는 프로세스입니다. 이러한 각 단계의 구현은 분석의 성격에 따라 다르지만, 합의된 워크플로를 따르면 관련된 모든 사람이 무슨 일이 발생해야 하는지 알 수 있고 프로젝트가 어떻게 진행되고 있는지 확인할 수 있습니다.

워크플로를 사용하면 분석 방법론의 미래를 보장하는 데도 도움이 됩니다. 정의된 일련의 단계를 따르면 노력이 체계화되어 실수를 하거나 무언가를 놓칠 가능성이 최소화됩니다. 또한 작업 내용을 주의 깊게 문서화하면 향후 데이터가 제공될 때 해당 절차를 다시 적용할 수 있습니다. 따라서 데이터 분석 워크플로우는 반복성과 확장성을 제공합니다.

모든 분석에 적합한 단일 데이터 워크플로우 프로세스는 없으며, 그 안에서 사용되는 절차에 대한 보편적인 용어도 없습니다.

 

 

실선 화살표는 각 단계에서 어떤 일이 일어나는지 알아보기 위해 수행하게 될 표준 데이터 분석 워크플로우를 보여줍니다. 점선 화살표는 분석의 성공 여부에 따라 일부 개별 단계를 여러 번 수행해야 할 수 있는 위치를 나타냅니다. 실제로 첫 번째 분석에서 더 많은 주의가 필요한 흥미로운 내용이 밝혀지면 전체 프로세스를 반복해야 할 수도 있습니다.

이제 데이터 분석 워크플로의 필요성을 이해했으므로 해당 단계를 진행하고 영화 데이터 분석을 수행해 보겠습니다.

목표 설정

데이터 분석의 첫 번째 워크플로 단계는 목표를 신중하면서도 명확하게 정의하는 것입니다. 귀하와 귀하의 분석 팀이 정확히 무엇을 달성하려고 하는지 명확하게 파악하는 것이 매우 중요합니다. 이 단계에는 프로그래밍이 포함되지 않지만 어디로 가고 싶은지 이해하지 못하면 거기에 도달할 가능성이 없기 때문에 모든 면에서 중요합니다.

데이터 분석의 목표는 분석 대상에 따라 달라집니다. 팀 리더는 신제품이 판매되지 않은 이유를 알고 싶어할 수도 있고, 정부가 신약의 임상 테스트에 대한 정보를 원할 수도 있습니다. 특정 금융 상품의 과거 결과를 바탕으로 투자 추천을 요청받을 수도 있습니다. 그럼에도 불구하고, 당신은 여전히 ​​목표를 분명히 해야 합니다. 이는 범위를 정의합니다.

이 튜토리얼에서는 앞서 언급한 제임스 본드 영화 데이터 세트를 재미있게 활용하여 데이터 분석 경험을 쌓을 수 있습니다.

  • Rotten Tomatoes 등급과 IMDb 등급 사이에 어떤 관계가 있나요?
  • 영화의 길이를 분석하여 얻을 수 있는 통찰력이 있습니까?
  • 제임스 본드가 죽인 적의 수와 그들이 죽인 영화의 사용자 평가 사이에 관계가 있습니까?

데이터 수집

목표를 설정한 후 다음 단계는 목표 달성을 위해 어떤 데이터가 필요한지 생각해 보는 것입니다. 이 데이터를 쉽게 사용할 수 있기를 바라지만, 이를 얻으려면 열심히 노력해야 할 수도 있습니다. 조직 내의 데이터 저장 시스템에서 데이터를 추출하거나 설문조사 데이터를 수집해야 할 수도 있습니다. 어쨌든 어떻게든 데이터를 가져와야 합니다.

표제의미
Release 영화 개봉일
Movie 영화 제목
Bond 타이틀롤을 맡은 배우
Bond_Car_MFG 제임스 본드의 자동차 제조사
US_Gross 영화의 미국 총 수입
World_Gross 영화의 전 세계 총 수익
Budget ($ 000s) 영화 예산(단위: 수천 달러)
Film_Length 영화의 러닝타임
Avg_User_IMDB IMDb의 평균 사용자 평점
Avg_User_Rtn_Tom Rotten Tomatoes의 평균 사용자 평점
Martinis 영화에서 본드가 마신 마티니의 양

나중에 필요할 경우를 대비해 원본 파일을 보관하는 것이 모범 사례로 간주된다는 점도 기억하세요. 따라서 정리된 버전의 데이터를 사용하여 두 번째 데이터 파일을 만들기로 결정했습니다. 이는 또한 임무의 결과로 발생할 수 있는 향후 분석을 단순화할 것입니다.

CSV 파일에서 데이터 읽기

다양한 파일 형식으로 데이터를 얻을 수 있습니다. 가장 일반적인 파일 중 하나는 쉼표로 구분된 값(CSV) 파일입니다. 이는 각 데이터를 쉼표로 구분하는 텍스트 파일입니다. 첫 번째 행은 일반적으로 파일의 내용을 정의하는 헤더 행이며, 후속 행에는 실제 데이터가 포함됩니다. CSV 파일은 수년 동안 사용되어 왔으며 여러 데이터 저장 프로그램에서 사용되기 때문에 여전히 널리 사용되고 있습니다.

CSV 파일은 읽기에 좋지 않습니다. 다행히도 원본 형식으로 읽을 필요는 거의 없습니다.

데이터를 분석해야 할 때 Python의 pandas 라이브러리가 널리 사용되는 옵션입니다. Jupyter Notebook에 Pandas를 설치하려면 새 코드 셀을 추가하고 !python -m pip install pandas을 입력하세요. 셀을 실행하면 라이브러리가 설치됩니다. 명령줄에서 작업하는 경우 느낌표(!) 없이 동일한 명령을 사용합니다.

pandas가 설치되면 이제 이를 사용하여 데이터 파일을 pandas DataFrame으로 읽을 수 있습니다. 아래 코드는 이 작업을 수행합니다.

In [ ]:
 !python -m pip install pandas
In [ ]:
import pandas as pd
   
james_bond_data = pd.read_csv("jamesbond.csv").convert_dtypes()

먼저 라이브러리를 프로그램으로 가져옵니다. 다음으로 함수를 사용하여 데이터 파일을 read_csv()이라는 DataFrame으로 읽어옵니다. 이렇게 하면 파일을 읽을 수 있을 뿐만 아니라 데이터에서 제목을 정렬하고 각 레코드의 색인을 생성하는 작업도 처리됩니다.

pd.read_csv()만 사용해도 괜찮지만 .convert_dtypes()도 사용할 수 있습니다. 이 모범 사례를 통해 팬더는 DataFrame에서 사용하는 데이터 유형을 최적화할 수 있습니다.

CSV 파일에 누락된 값이 있는 정수 열이 포함되어 있다고 가정해 보겠습니다. 기본적으로 여기에는 numpy.NaN 부동 소수점 상수가 할당됩니다. 이렇게 하면 팬더가 열에 float64 데이터 유형을 할당하게 됩니다. 그런 다음 열의 모든 정수는 일관성을 위해 부동 소수점으로 변환됩니다.

이러한 부동 소수점 값으로 인해 후속 계산 결과에 다른 바람직하지 않은 부동 소수점이 나타날 수 있습니다. 마찬가지로, 예를 들어 원래 숫자가 나이였다면 이를 부동 소수점으로 변환하는 것은 아마도 원하는 것이 아닐 것입니다.

.convert_dtypes()을 사용하면 열에 확장 데이터 유형 중 하나가 할당됩니다. int 유형이었던 모든 정수 열은 이제 새로운 Int64 유형이 됩니다. 이는 pandas.NA이 원래 누락된 값을 나타내고 Int64로 읽을 수 있기 때문에 발생합니다. 마찬가지로 텍스트 열은 보다 일반적인 유형이 아닌 string 유형이 됩니다. 덧붙여서, 부동 소수점은 대문자 F를 사용하는 새로운 확장 유형이 됩니다.

DataFrame을 생성한 후, 읽기가 예상한 대로 작동했는지 확인하기 위해 이를 빠르게 살펴보기로 결정합니다. 이를 수행하는 빠른 방법은 .head()을 사용하는 것입니다. 이 함수는 기본적으로 처음 5개의 레코드를 표시하지만 정수를 전달하여 원하는 숫자를 표시하도록 .head()를 사용자 정의할 수 있습니다. 여기에서는 기본 5개 레코드를 보기로 결정합니다.

In [ ]:
james_bond_data.head()

이제 왼쪽에 제목과 숫자 인덱스와 함께 레코드가 포함된 pandas DataFrame이 생겼습니다.

다른 소스에서 데이터 읽기

CSV는 널리 사용되는 데이터 파일 형식이지만 특별히 좋지는 않습니다. 형식 표준화가 부족하다는 것은 일부 CSV 파일에 여러 머리글 및 바닥글 행이 포함되어 있고 다른 파일에는 둘 다 포함되어 있지 않음을 의미합니다. 또한 정의된 날짜 형식이 부족하고 데이터 내 및 데이터 간에 서로 다른 구분 기호 및 구분 기호 문자를 사용하면 읽을 때 문제가 발생할 수 있습니다.

다행히도 pandas를 사용하면 JSON 및 Excel 같은 화일들을 읽을 수 있습니다. 또한 웹사이트에서 테이블을 읽을 수 있는 열 기반 웹 스크래핑 제공합니다. 특히 흥미롭고 비교적 새로운 형식 중 하나는 대량 데이터를 처리하는 데 사용되는 Apache Parquet 파일 형식 기능도 제공합니다. Parquet 파일은 압축 기능 덕분에 클라우드 스토리지 시스템으로 작업할 때 비용 효율적이기도 합니다. .

이 분석에는 기본 CSV 파일을 읽는 기능만으로도 충분하지만 다운로드 섹션에서는 james_bond_data.csv과 동일한 데이터가 포함된 몇 가지 대체 파일 형식을 제공합니다. 각 파일의 이름은 파일별 확장자를 사용하여 james_bond_data로 지정됩니다. CSV 파일에서와 동일한 방식으로 각 항목을 DataFrame으로 읽는 방법을 파악할 수 있는지 확인해 보세요.

o JSON 파일을 읽는 방법 JSON 파일을 읽으려면 pd.read_json():을 사용하세요. 파이썬 In [1]: import pandas as pd ...: ...: james_bond_data = pd.read_json("james_bond_data.json").convert_dtypes() 보시다시피 읽으려는 JSON 파일만 지정하면 됩니다. 필요한 경우 몇 가지 흥미로운 형식 지정 및 데이터 변환 옵션을 지정할 수도 있습니다. 자세한 내용은 문서 페이지를 참조하세요. o Excel 파일을 읽는 방법 이 작업을 수행하려면 먼저 openpyxl 라이브러리를 설치해야 합니다. Jupyter Notebook 내에서 !python -m pip install openpyxl 명령을 사용하거나 터미널에서 python -m pip install openpyxl 명령을 사용합니다. Excel 파일을 읽으려면 .read_excel():를 사용하세요. 파이썬 In [1]: import pandas as pd ...: ...: james_bond_data = pd.read_excel("james_bond_data.xlsx").convert_dtypes() 이전과 마찬가지로 파일 이름만 지정하면 됩니다. 여러 워크시트 중 하나에서 읽는 경우 sheet_name 인수를 사용하여 워크시트 이름도 지정해야 합니다. 자세한 내용은 문서 페이지를 참조하세요. o parquet 파일을 읽는 방법 이 기능이 작동하려면 pyarrow과 같은 직렬화 엔진을 설치해야 합니다. 이렇게 하려면 Jupyter Notebook 내에서 !python -m pip install pyarrow 명령을 사용하거나 터미널에서 python -m pip install pyarrow 명령을 사용하세요. 쪽모이 세공 파일을 읽으려면 .read_parquet():를 사용하세요. 파이썬 In [1]: import pandas as pd ...: ...: james_bond_data = pd.read_parquet( ...: "james_bond_data.parquet" ...: ).convert_dtypes() 이전과 마찬가지로 파일 이름만 지정하면 됩니다. 문서 페이지에서 대체 직렬화 엔진을 사용하는 방법을 포함하여 자세한 내용을 확인할 수 있습니다. o HTML 테이블을 웹에서 스크랩하는 방법 이 작업을 수행하려면 HTML 파일을 읽을 수 있도록 lxml 라이브러리를 설치해야 합니다. 이렇게 하려면 Jupyter Notebook 내에서 !python -m pip install lxml 명령을 사용하거나 터미널에서 python -m pip install lxml 명령을 사용하세요. HTML 테이블을 읽거나 스크래핑하려면 다음을 사용하세요 read_html(): 파이썬 In [1]: import pandas as pd ...: ...: james_bond_tables = pd.read_html( ...: "https://en.wikipedia.org/wiki/List_of_James_Bond_novels_and_short_stories" ...: ) ...: james_bond_data = james_bond_tables[1].convert_dtypes() 이번에는 스크래핑하려는 웹사이트의 URL을 전달합니다. read_html() 함수는 웹페이지의 테이블 목록을 반환합니다. 이 예에서 관심 있는 항목은 목록 색인 1에 있지만 원하는 항목을 찾으려면 어느 정도 시행착오가 필요할 수 있습니다. 자세한 내용은 문서 페이지를 참조하세요.

Python으로 데이터 정리

데이터 분석 워크플로의 데이터 정리 단계는 특히 분석할 데이터의 양이 많을 때 가장 오래 걸리는 단계인 경우가 많습니다. 이 단계에서는 데이터에 형식이 잘못되었거나, 잘못되었거나, 중복되거나, 불완전한 데이터가 없는지 확인해야 합니다. 분석할 품질 데이터가 좋지 않으면 Python 데이터 분석 코드가 품질 결과를 반환할 가능성이 거의 없습니다.

분석 전에 가능한 한 많은 문제를 해결하기 위해 데이터를 확인하고 다시 확인해야 하지만, 분석 중에 추가 문제가 나타날 수도 있다는 점도 인정해야 합니다. 그렇기 때문에 이전에서 본 다이어그램의 데이터 정리 단계와 분석 단계 사이에 반복이 있을 수 있습니다.

데이터를 정리하는 전통적인 방법은 데이터가 정리될 때까지 Pandas 메서드를 별도로 적용하는 것입니다. 이것이 작동하는 동안 각각 별도의 수정 사항이 적용된 중간 DataFrame 버전 세트를 생성한다는 의미입니다. 그러나 각 수정 사항을 엄격한 순서에 따라 다시 적용해야 하기 때문에 향후 정리 시 재현성 문제가 발생합니다.

더 나은 접근 방식은 단일 코드를 사용하여 메모리에서 동일한 DataFrame을 반복적으로 업데이트하여 데이터를 정리하는 것입니다. 데이터 정리 코드를 작성할 때는 증분 단위로 빌드하고 각 증분을 작성한 후 테스트해야 합니다. 그런 다음 데이터를 완전히 정리할 만큼 충분히 작성하고 나면 향후 분석해야 할 데이터를 정리하기 위한 재사용성이 뛰어난 스크립트를 갖게 됩니다. 이것이 여기서 채택할 접근 방식입니다.

의미 있는 열 이름 만들기

일부 시스템에서 데이터를 추출할 때 열 이름이 원하는 만큼 의미가 없을 수 있습니다. DataFrame의 열 이름을 적절하게 지정하는 것이 좋습니다. 코드 내에서 읽을 수 있도록 하려면 여러 단어를 밑줄로 구분하여 모두 소문자를 사용하는 Python 변수 명명 규칙을 채택해야 합니다. 이렇게 하면 분석 코드에서 이러한 이름을 사용하게 되어 결과적으로 더 읽기 쉬워집니다.

DataFrame의 열 이름을 바꾸려면 .rename()을 사용하세요. 키가 원래 열 이름이고 값이 대체 이름인 Python 사전을 전달합니다.

In [ ]:
new_column_names = {
    "Release": "release_date",
    "Movie": "movie_title",
    "Bond": "bond_actor",
    "Bond_Car_MFG": "car_manufacturer",
    "US_Gross": "income_usa",
    "World_Gross": "income_world",
    "Budget ($ 000s)": "movie_budget",
    "Film_Length": "film_length",
    "Avg_User_IMDB": "imdb",
    "Avg_User_Rtn_Tom": "rotten_tomatoes",
    "Martinis": "martinis_consumed",
    "Kills_Bond": "bond_kills",
}

data = james_bond_data.rename(columns=new_column_names)

이는 james_bond_datadata에서 참조하는 원래 DataFrame이 아니라 data 변수를 사용하여 참조되는 새로운 DataFrame을 반환합니다.

참고: 데이터를 분석할 때 원시 데이터를 원래 형식으로 유지하는 것이 좋습니다. 이는 다른 사람들이 귀하의 분석을 재현하여 타당성을 확인할 수 있도록 하기 위해 필요합니다. 결론에 대한 실제 증거를 제공하는 것은 정제된 버전이 아닌 원시 데이터라는 점을 기억하세요.

데이터 정리의 모든 단계와 마찬가지로 코드가 예상대로 작동하는지 테스트하는 것이 중요합니다.

In [ ]:
data.columns

누락된 데이터 처리

먼저 데이터에 누락된 것이 있는지 빠르게 확인해야 합니다. DataFrame의 .info() 메소드를 사용하면 다음 작업을 빠르게 수행할 수 있습니다.

In [ ]:
data.info()

이 메소드가 실행되면 DataFrame에 대한 매우 간결한 요약이 표시됩니다. .info() 메소드를 통해 누락된 데이터가 있음이 밝혀졌습니다. 출력 상단 근처의 RangeIndex 줄은 DataFrame으로 읽혀진 27개의 데이터 행이 있음을 나타냅니다. 그러나 imdb 및 rotten_tomatoes 열에는 각각 Null이 아닌 값이 26개만 포함되어 있습니다. 각 열에는 누락된 데이터가 하나씩 있습니다.

또한 일부 데이터 열의 데이터 유형이 잘못되었음을 알 수 있습니다. 우선 누락된 데이터를 수정하는 데 집중하겠습니다. 데이터 유형 문제는 나중에 다루게 됩니다.

이러한 열을 수정하려면 먼저 해당 열을 확인해야 합니다. 아래 코드를 통해 이를 확인할 수 있습니다.

In [ ]:
data.loc[data.isna().any(axis="columns")]

누락된 데이터가 있는 행을 찾으려면 DataFrame의 .isna() 메소드를 사용할 수 있습니다. 이는 data DataFrame을 분석하고 부울 DataFrame을 반환합니다. 또는 값은 DataFrame의 해당 값에 포함 여부에 따라 달라집니다.

두 번째 부울 DataFrame이 있으면 해당 .any(axis="columns") 메소드를 사용하여 두 번째 DataFrame의 행이 포함된 True pandas 시리즈를 반환합니다. True 값이 있고, 그렇지 않은 경우 이 시리즈의 True 값은 누락된 데이터가 포함된 행을 나타내고, False 값은 누락된 데이터가 없는 행을 나타냅니다.

이 오류를 수정하려면 data DataFrame을 업데이트해야 합니다. 앞서 배운 것처럼 data 변수가 참조하는 DataFrame에 모든 변경 사항을 임시로 작성한 다음 모두 완료되면 디스크에 씁니다. 이제 발견한 값을 수정하기 위한 몇 가지 코드를 추가하겠습니다.

In [ ]:
data = james_bond_data.rename(columns=new_column_names).combine_first(
     pd.DataFrame({"imdb": {10: 7.1}, "rotten_tomatoes": {10: 6.8}})
)

여기서는 Python 사전을 사용하여 DataFrame을 정의하기로 선택했습니다. 사전의 키는 열 제목을 정의하고 해당 값은 데이터를 정의합니다. 각 값은 중첩된 사전으로 구성됩니다. 이 중첩된 사전의 키는 행 인덱스를 제공하고 값은 업데이트를 제공합니다.

In [ ]:
pd.DataFrame({"imdb": {10: 7.1}, "rotten_tomatoes": {10: 6.8}})

그런 다음 .combine_first()을 호출하여 이 DataFrame을 전달하면 imdb 및 rotten_tomatoes 열에 있는 두 개의 누락된 값이 행의 10는 각각 7.1 및 6.8으로 대체됩니다. 원본 james_bond_data DataFrame을 업데이트하

'python > intermediate' 카테고리의 다른 글

상속과 구성 Python OOP 가이드  (1) 2024.01.22
python-for-data-analysis-II  (0) 2024.01.21
Python에서 JSON 데이터 작업  (1) 2024.01.07
Python으로 데이터 직렬화2  (1) 2024.01.06
Python으로 데이터 직렬화1  (2) 2024.01.05