文章目錄
- 前言:
- 關于數據集
- 列
- 導入模塊
- 導入數據
- 數據預處理
- 探索性數據分析
- 按性別劃分的自殺率 [箱線圖]
- 相關矩陣熱圖
- 自殺率最高的 15 個國家
- 變化百分比最高的 15 個國家/地區
- 2023 年世界地圖上自殺率的國家
- 結尾:
前言:
隨著社會的不斷發展和變遷,人們對于各種社會問題的關注也在不斷擴大。在這個信息爆炸的時代,數據分析成為了深入理解和解決社會問題的有力工具之一。在這篇博客中,我們將聚焦于一個備受關注的話題——suicide rate,并通過對 2023 年全球各國的suicide rate進行探索性數據分析(Exploratory Data Analysis, EDA),來了解這一問題在不同國家的表現。
suicide rate不僅是一個深刻的社會問題,也反映了一個國家在心理健康、社會福祉等方面的表現。通過對suicide rate進行綜合分析,我們有望更全面地認識到這個問題的復雜性,為制定相應的預防和支持措施提供更科學、更精準的依據。
關于數據集
按性別和國家劃分的suicide rate(年齡標準化,每 10 萬人,世界衛生組織,2023 年)
列
- Country - 地區;
- All - 男 + 女;
- Male - 僅限男性;
- Female - 僅限女性;
- M/F - 女性與男性的比例;
- 2000 - 全部在 2000 年;
- Change% - 從 2000 年到 2023 年的百分比變化。
導入模塊
-
import numpy as np: 引入NumPy庫,通常用于進行數值計算和數組操作。
-
import pandas as pd: 引入Pandas庫,用于數據操作和分析。常用的數據結構是DataFrame。
-
import matplotlib.pyplot as plt: 引入Matplotlib庫,用于繪制靜態圖表。
-
%matplotlib inline: 這是一個Jupyter Notebook的魔術命令,用于在Notebook中直接顯示Matplotlib圖表。
-
import seaborn as sns: 引入Seaborn庫,用于創建更美觀的統計圖表。
-
sns.set_theme(style=‘whitegrid’, palette=‘viridis’): 設置Seaborn的主題樣式和調色板。
-
import plotly.express as px: 引入Plotly Express庫,用于創建交互式圖表。
-
import warnings 和 warnings.filterwarnings(‘ignore’): 用于忽略警告信息,可以使輸出更整潔。
-
import os 和 for dirname, _, filenames in os.walk(‘/kaggle/input’): 用于遍歷指定路徑下的文件。
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
sns.set_theme(style='whitegrid', palette='viridis')
import plotly.express as pximport warnings
warnings.filterwarnings('ignore')import os
for dirname, _, filenames in os.walk('/kaggle/input'):for filename in filenames:print(os.path.join(dirname, filename))
導入數據
df = pd.read_csv('/kaggle/input/world-countries-rankings-by-suicide-rate-2023/world_suicide_rate_2023.csv')
iso_map = pd.read_csv('/kaggle/input/country-mapping-iso-continent-region/continents2.csv')
df.head(10)
數據預處理
df.describe().T.style.background_gradient(cmap='Reds')
使用Pandas中DataFrame的describe()方法來獲取數據集的基本統計信息,接著使用了.T進行轉置,最后應用了樣式,通過style.background_gradient(cmap=‘Reds’)實現了基于漸變色的背景。
這段代碼的作用是創建一個漸變色的表格,以更直觀地展示數據集的統計信息。顏色深淺表示數值的大小,通常在數據集較大時,這樣的可視化方式有助于快速識別數據分布和趨勢。
def summary(df):summary_df = pd.DataFrame(df.dtypes, columns=['dtypes'])summary_df['count'] = df.count().values summary_df['unique'] = df.nunique().valuessummary_df['missing#'] = df.isna().sum()summary_df['missing%'] = df.isna().sum() / len(df)return summary_df
summary(df).style.background_gradient(cmap='Reds')
生成了一個數據框,包含了數據框中每個列的一些摘要統計信息。具體來說:
- summary_df[‘dtypes’]: 列出每列的數據類型。
- summary_df[‘count’]: 計算每列的非缺失值數量。
- summary_df[‘unique’]: 計算每列的唯一值數量。
- summary_df[‘missing#’]: 計算每列的缺失值數量。
- summary_df[‘missing%’]: 計算每列缺失值在總數中的百分比。
通過.style.background_gradient(cmap=‘Reds’)為生成的摘要數據框應用了漸變色的樣式,以提供更直觀的可視化。
從返回結果可以得出,該數據中沒有缺失值。
探索性數據分析
按性別劃分的自殺率 [箱線圖]
plt.figure(figsize=(8,6))
sns.boxplot(data=df[['Female', 'Male']])
plt.title('Box Plot: Suicide Rates by Gender')
plt.ylabel('Suicide Rate')
plt.tight_layout()
plt.show()
-
plt.figure(figsize=(8,6)): 設置圖表的大小為8x6英寸。
-
sns.boxplot(data=df[[‘Female’, ‘Male’]]): 使用Seaborn的boxplot函數繪制箱線圖,展示了"Female"和"Male"兩列的數據分布情況。
-
plt.title(‘Box Plot: Suicide Rates by Gender’): 設置圖表的標題。
-
plt.ylabel(‘Suicide Rate’): 設置y軸的標簽。
-
plt.tight_layout(): 調整布局,確保圖表不會被截斷。
-
plt.show(): 顯示圖表。
男性自殺比例高
相關矩陣熱圖
num_cols = df.select_dtypes(include=['float64', 'int64']).columns.to_list()
ndf = df[num_cols].corr()plt.figure(figsize=(8,6))
mask = np.triu(np.ones_like(ndf, dtype=bool))
sns.heatmap(ndf, annot=True, cmap='viridis', linewidths=.5, mask=mask)
plt.title('Heatmap of Correlation Matrix')
plt.tight_layout()
plt.show()
-
num_cols = df.select_dtypes(include=[‘float64’, ‘int64’]).columns.to_list(): 選擇數據集中的數值型列,將列名存儲在num_cols列表中。
-
ndf = df[num_cols].corr(): 創建一個包含數值型列之間相關系數的相關性矩陣。
-
plt.figure(figsize=(8,6)): 設置圖表的大小為8x6英寸。
-
mask = np.triu(np.ones_like(ndf, dtype=bool)): 創建一個上三角形掩碼,以隱藏相關性矩陣的下半部分,避免重復顯示。
-
sns.heatmap(ndf, annot=True, cmap=‘viridis’, linewidths=.5, mask=mask): 使用Seaborn的heatmap函數創建熱力圖,顏色深淺表示相關性的強弱,同時在方格中顯示相關系數的數值。
-
plt.title(‘Heatmap of Correlation Matrix’): 設置圖表標題。
-
plt.tight_layout(): 調整布局,確保圖表不會被截斷。
-
plt.show(): 顯示圖表。
自殺率最高的 15 個國家
df[1:].head(15).style.background_gradient(cmap='Reds')
自殺率最高的是Lithuania.
變化百分比最高的 15 個國家/地區
top15_by_change = df[1:16].sort_values(by='Change%', ascending=False)
top15_by_change.head(15).style.background_gradient(cmap='Reds')
2023 年世界地圖上自殺率的國家
df = df[1:]
iso_map = iso_map[['name', 'alpha-3']]
iso_map.rename(columns = {'name': 'Country', 'alpha-3': 'ISO_alpha'}, inplace=True)
iso_map['Country'] = iso_map['Country'].str.lower()
df['Country'] = df['Country'].str.lower()
-
iso_map = iso_map[[‘name’, ‘alpha-3’]]: 選擇了iso_map數據框中的’name’和’alpha-3’兩列。
-
iso_map.rename(columns={‘name’: ‘Country’, ‘alpha-3’: ‘ISO_alpha’}, inplace=True): 重命名了’iso_map’數據框的兩列,將’name’列重命名為’Country’,將’alpha-3’列重命名為’ISO_alpha’。inplace=True表示直接在原始數據框上進行修改。
-
iso_map[‘Country’] = iso_map[‘Country’].str.lower(): 將’Country’列中的所有字符轉換為小寫字母,這樣可以確保不同數據框中的國家名字的大小寫一致。
-
df[‘Country’] = df[‘Country’].str.lower(): 同樣,將’df’數據框中的’Country’列中的所有字符轉換為小寫字母。
df.head()
df = pd.merge(df, iso_map, on='Country', how='left')
-
pd.merge(df, iso_map, on=‘Country’, how=‘left’): 這行代碼將df和iso_map兩個數據框按照’Country’列進行左連接,即保留df中所有的行,并將iso_map中匹配的行合并進來。連接的方式由how參數指定,這里使用的是左連接(how=‘left’),表示以df為主表,按照’Country’列將兩個數據框合并。
-
結果會生成一個新的數據框,包含了df中的所有列以及iso_map中的’ISO_alpha’列。on='Country’表示連接的鍵是’Country’列。
df.head(10)
xmap = px.choropleth(df, locations='ISO_alpha', color='All', scope='world', title='World Countries by Suicide Rates 2023',color_continuous_scale='viridis', hover_name='Country')
xmap.show()
這里使用了Plotly Express庫中的choropleth函數,創建了一個世界地圖,用顏色表示不同國家的自殺率。讓我為你解釋一下:
- df: 指定要使用的數據框。
- locations=‘ISO_alpha’: 指定地理位置的列,這里是ISO_alpha,用于與地圖上的國家/地區相匹配。
- color=‘All’: 指定用于著色的列,這里是’Suicide Rates’的總和(假設 ‘All’ 列在數據框中)。
- scope=‘world’: 指定地圖的范圍,這里是全球。
- title=‘World Countries by Suicide Rates 2023’: 設置地圖的標題。
- color_continuous_scale=‘viridis’: 設置顏色的漸變色帶。
- hover_name=‘Country’: 當鼠標懸停在地圖上的特定國家時,顯示國家名稱。
- xmap.show(): 顯示生成的地圖。
結尾:
通過對 2023 年世界各國suicide rate的深入分析,我們不僅僅是在觀察數字背后的故事,更是在尋找解決問題的線索。suicide rate問題是一個多維度的挑戰,需要社會各界的共同努力來制定有效的預防和干預策略。通過數據分析,我們能夠更清晰地看到suicide rate背后的社會、經濟、文化等方面的影響因素,這為我們提供了更有針對性的解決方案的可能性。
希望這次的數據分析能夠引起更多人對suicide 問題的重視,激發社會對心理健康的更深層關注。只有通過共同的關心和努力,我們才能夠建設一個更加健康、關愛的社會。