ChatGPT: Code Interpreter
これもデータ分析の進化。。。
このファイルを分析して。
titanic.csv
ChatGPT
アップロードされたファイルの内容を確認しましょう。データの先頭部分を表示してみます。
import pandas as pd
# Load the data
data = pd.read_csv('/mnt/data/titanic.csv')
# Display the first few rows of the data
data.head()
RESULT
PassengerId Survived Pclass \
0 1 0 3
1 2 1 1
2 3 1 3
3 4 1 1
4 5 0 3
Name Sex Age SibSp \
0 Braund, Mr. Owen Harris male 22.0 1
1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1
2 Heikkinen, Miss. Laina female 26.0 0
3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1
4 Allen, Mr. William Henry male 35.0 0
Parch Ticket Fare Cabin Embarked
0 0 A/5 21171 7.2500 NaN S
1 0 PC 17599 71.2833 C85 C
2 0 STON/O2. 3101282 7.9250 NaN S
3 0 113803 53.1000 C123 S
4 0 373450 8.0500 NaN S
これはタイタニック号の乗客データのようです。各列の意味は以下の通りです:
PassengerId: 乗客のID
Survived: 生存したかどうか(0 = 死亡、1 = 生存)
Pclass: 乗客のクラス(1 = 第一クラス、2 = 第二クラス、3 = 第三クラス)
Name: 乗客の名前
Sex: 性別
Age: 年齢
SibSp: 同乗している兄弟姉妹/配偶者の数
Parch: 同乗している親/子供の数
Ticket: チケット番号
Fare: 運賃
Cabin: 客室番号
Embarked: 乗船した港(C = Cherbourg、Q = Queenstown、S = Southampton)
次にデータの基本的な統計を確認します。その後、どのような分析を行うかを決定しましょう。
# Get the basic statistics of the data
data.describe(include='all')
RESULT
PassengerId Survived Pclass Name Sex \
count 891.000000 891.000000 891.000000 891 891
unique NaN NaN NaN 891 2
top NaN NaN NaN Braund, Mr. Owen Harris male
freq NaN NaN NaN 1 577
mean 446.000000 0.383838 2.308642 NaN NaN
std 257.353842 0.486592 0.836071 NaN NaN
min 1.000000 0.000000 1.000000 NaN NaN
25% 223.500000 0.000000 2.000000 NaN NaN
50% 446.000000 0.000000 3.000000 NaN NaN
75% 668.500000 1.000000 3.000000 NaN NaN
max 891.000000 1.000000 3.000000 NaN NaN
Age SibSp Parch Ticket Fare Cabin \
count 714.000000 891.000000 891.000000 891 891.000000 204
unique NaN NaN NaN 681 NaN 147
top NaN NaN NaN 347082 NaN B96 B98
freq NaN NaN NaN 7 NaN 4
mean 29.699118 0.523008 0.381594 NaN 32.204208 NaN
std 14.526497 1.102743 0.806057 NaN 49.693429 NaN
min 0.420000 0.000000 0.000000 NaN 0.000000 NaN
25% 20.125000 0.000000 0.000000 NaN 7.910400 NaN
50% 28.000000 0.000000 0.000000 NaN 14.454200 NaN
75% 38.000000 1.000000 0.000000 NaN 31.000000 NaN
max 80.000000 8.000000 6.000000 NaN 512.329200 NaN
Embarked
count 889
unique 3
top S
freq 644
mean NaN
std NaN
min NaN
25% NaN
50% NaN
75% NaN
max NaN
データの基本的な統計を以下にまとめます:
このデータセットには891人の乗客の情報が含まれています。
生存率は約38.4%です。
乗客の平均年齢は約29.7歳ですが、一部の乗客(177人)の年齢情報が欠落しています。
乗客は主に3等クラス(Pclass = 3)に乗船しており、平均的なPclassは2.3です。
乗客は平均して約0.52人の兄弟姉妹/配偶者と0.38人の親/子供と一緒に乗船しています。
平均運賃は約32.20ポンドです。
乗客の大半は男性(577人)です。
乗船した港の情報が2人分欠落していますが、大部分の乗客(644人)はSouthampton(S)から乗船しています。
このデータをもとに、いくつかの分析を行うことができます。例えば、以下のような質問に答えることが可能です:
性別やクラスによって生存率は異なるのか?
年齢は生存率に影響を与えるのか?
家族と一緒に乗船した人々は単独で乗船した人々と比べて生存率が異なるのか?
分析を進める前に、どの質問に焦点を当てるかを決めてください。
分析は1から3全てお願いします。まずは1からお願いいます。
# Analyzing survival rates by Sex and Pclass
# Group by Sex and Pclass, then calculate the mean of Survived
survival_by_sex_pclass = data.groupby(['Sex', 'Pclass'])['Survived'].mean()
survival_by_sex_pclass
RESULT
Sex Pclass
female 1 0.968085
2 0.921053
3 0.500000
male 1 0.368852
2 0.157407
3 0.135447
Name: Survived, dtype: float64
性別とクラス別の生存率は以下の通りです:
女性、一等クラス:96.8%
女性、二等クラス:92.1%
女性、三等クラス:50.0%
男性、一等クラス:36.9%
男性、二等クラス:15.7%
男性、三等クラス:13.5%
この結果から、女性の生存率が男性よりも高いこと、また、より高いクラスに乗船している乗客の方が生存率が高いことがわかります。
次に、年齢が生存率にどのように影響するかを分析しましょう(質問2)。
import matplotlib.pyplot as plt
import seaborn as sns
# Drop rows with missing Age
data_age_cleaned = data.dropna(subset=['Age'])
# Plot
plt.figure(figsize=(10,6))
sns.histplot(data=data_age_cleaned, x="Age", hue="Survived", element="step", stat="density", common_norm=False)
plt.title('Survival Rates by Age')
plt.xlabel('Age')
plt.ylabel('Density')
plt.show()
年齢による生存率の分布を示す上記のヒストグラムから、以下のことが観察できます:
若い乗客(特に0-5歳の乗客)は他の年齢層に比べて生存率が高いようです。これはおそらく、子供を優先的に救助した結果でしょう。
15歳から30歳までの乗客は比較的高い死亡率を示しています。
それ以上の年齢層では、生存率と死亡率の差はそれほど顕著ではありません。
次に、家族と一緒に乗船した人々が単独で乗船した人々と比べて生存率が異なるかどうかを分析しましょう(質問3)。
# Create a new feature FamilySize which combines SibSp and Parch
data['FamilySize'] = data['SibSp'] + data['Parch'] + 1 # +1 for the passenger themself
# Group by FamilySize and calculate the mean of Survived
survival_by_familysize = data.groupby('FamilySize')['Survived'].mean()
survival_by_familysize
RESULT
FamilySize
1 0.303538
2 0.552795
3 0.578431
4 0.724138
5 0.200000
6 0.136364
7 0.333333
8 0.000000
11 0.000000
Name: Survived, dtype: float64
家族と一緒に乗船した人々と単独で乗船した人々の生存率は以下の通りです:
家族なし(1人): 30.4%
家族2人: 55.3%
家族3人: 57.8%
家族4人: 72.4%
家族5人: 20.0%
家族6人: 13.6%
家族7人: 33.3%
家族8人: 0%
家族11人: 0%
この結果から、一人で乗船した乗客よりも小さな家族(2-4人)で乗船した乗客の方が生存率が高いことがわかります。しかし、大家族(5人以上)の生存率は一人の乗客や小さな家族よりも低い傾向にあります。
以上の結果を総合すると、女性であること、一等クラスに乗船していること、若年または小さな家族と一緒に乗船していることが、生存率を高める要素であることが示唆されます。